From 7100f90e3296b39769f0ca9c6959f1e666e78665 Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Mon, 11 Mar 2024 13:14:29 +0100 Subject: [PATCH 001/280] document blueprints workspace --- .../src/assets/lang/en-us.ts | 6 +-- ...cument-blueprint-root-workspace.element.ts | 50 ++++++++++++++++++- 2 files changed, 51 insertions(+), 5 deletions(-) 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 b292ea7099..06fbdd808a 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 @@ -2467,13 +2467,13 @@ export default { contentTemplatesDashboard: { whatHeadline: 'What are Content Blueprints?', whatDescription: - 'Content Blueprinta are pre-defined content that can be selected when creating a new\n content node.\n ', + 'Content Blueprints are pre-defined content that can be selected when creating a new content node.', createHeadline: 'How do I create a Content Blueprint?', createDescription: - '\n

There are two ways to create a Content Blueprint:

\n \n

Once given a name, editors can start using the Content Blueprint as a foundation for their new page.

\n ', + '

There are two ways to create a Content Blueprint:

Once given a name, editors can start using the Content Blueprint as a foundation for their new page.

', manageHeadline: 'How do I manage Content Blueprints?', manageDescription: - 'You can edit and delete Content Blueprints from the "Content Blueprints" tree in the\n Settings section. Expand the Document Type which the Content Blueprint is based on and click it to edit or delete\n it.\n ', + 'You can edit and delete Content Blueprints from the "Content Blueprints" tree in the Settings section. Expand the Document Type which the Content Blueprint is based on and click it to edit or delete it.', }, preview: { endLabel: 'End', diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-root-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-root-workspace.element.ts index 327dde4e40..283e3422f8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-root-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-root-workspace.element.ts @@ -1,11 +1,57 @@ -import { html, customElement } from '@umbraco-cms/backoffice/external/lit'; +import { html, customElement, css } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; @customElement('umb-document-blueprint-root-workspace') export class UmbDocumentBlueprintRootWorkspaceElement extends UmbLitElement { render() { - return html`
Document Blueprint Root Workspace
`; + return html` +
+ +

+ What are Content Blueprints? +

+ + Content Blueprints are pre-defined content that can be selected when creating a new content node. + +

+ + How do I create a Content Blueprint? + +

+ +

There are two ways to create a Content Blueprint:

+
    +
  • + Right-click a content node and select "Create Content Blueprint" to create a new Content Blueprint. +
  • +
  • + Right-click the Content Blueprints tree in the Settings section and select the Document Type you want to + create a Content Blueprint for. +
  • +
+

Once given a name, editors can start using the Content Blueprint as a foundation for their new page.

+
+

+ + How do I manage Content Blueprints? + +

+ + You can edit and delete Content Blueprints from the "Content Blueprints" tree in the Settings section. + Expand the Document Type which the Content Blueprint is based on and click it to edit or delete it. + +
+
+
`; } + + static styles = [ + css` + #wrapper { + margin: var(--uui-size-layout-1); + } + `, + ]; } export default UmbDocumentBlueprintRootWorkspaceElement; From 05bffeb4986d233b05ae85a2bae7b7dffbd0ebb5 Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Mon, 11 Mar 2024 14:16:50 +0100 Subject: [PATCH 002/280] manifests, types, etc --- .../entity-actions/create/create.action.ts | 17 ++++++ .../entity-actions/manifests.ts | 52 +++++++++++++++++++ .../documents/document-blueprints/entity.ts | 9 ++++ .../documents/document-blueprints/index.ts | 1 + .../document-blueprints/manifests.ts | 3 +- .../menu-item/manifests.ts | 6 ++- .../document-blueprints/tree/index.ts | 10 ++++ .../document-blueprints/tree/types.ts | 18 +++++++ .../workspace/manifests.ts | 7 ++- .../src/packages/documents/index.ts | 1 + 10 files changed, 119 insertions(+), 5 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/create.action.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/types.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/create.action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/create.action.ts new file mode 100644 index 0000000000..0b13db78b3 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/create.action.ts @@ -0,0 +1,17 @@ +import type { UmbEntityActionArgs } from '@umbraco-cms/backoffice/entity-action'; +import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; + +export class UmbCreateEntityAction extends UmbEntityActionBase { + constructor(host: UmbControllerHost, args: UmbEntityActionArgs) { + super(host, args); + } + + async execute() { + const url = `section/settings/workspace/document-blueprint/create/parent/${this.args.entityType}/${ + this.args.unique || 'null' + }`; + // TODO: how do we handle this with a href? + history.pushState(null, '', url); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/manifests.ts new file mode 100644 index 0000000000..2580b43adf --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/manifests.ts @@ -0,0 +1,52 @@ +/*import { + UMB_DOCUMENT_BLUEPRINT_DETAIL_REPOSITORY_ALIAS, + UMB_DOCUMENT_BLUEPRINT_ITEM_REPOSITORY_ALIAS, +} from '../repository/index.js';*/ +import { + UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, + UMB_DOCUMENT_BLUEPRINT_ROOT_ENTITY_TYPE, + UMB_DOCUMENT_BLUEPRINT_ITEM_ENTITY_TYPE, +} from '../entity.js'; +import { UmbCreateEntityAction } from './create/create.action.js'; +import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; + +const entityActions: Array = [ + { + type: 'entityAction', + kind: 'default', + alias: 'Umb.EntityAction.DocumentBlueprint.Create', + name: 'Create Document Blueprint Entity Action', + api: UmbCreateEntityAction, + forEntityTypes: [UMB_DOCUMENT_BLUEPRINT_ROOT_ENTITY_TYPE], + meta: { + icon: 'icon-add', + label: 'Create', + }, + }, + { + type: 'entityAction', + kind: 'default', + alias: 'Umb.EntityAction.DocumentBlueprintItem.Create', + name: 'Create Document Blueprint Item Entity Action', + api: UmbCreateEntityAction, + forEntityTypes: [UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE], + meta: { + icon: 'icon-add', + label: 'Create', + }, + } /* + { + type: 'entityAction', + kind: 'delete', + alias: 'Umb.EntityAction.DocumentBlueprintItem.Delete', + name: 'Delete Document Blueprint Item Entity Action', + forEntityTypes: [UMB_DOCUMENT_BLUEPRINT_ITEM_ENTITY_TYPE], + meta: { + detailRepositoryAlias: UMB_DOCUMENT_BLUEPRINT_DETAIL_REPOSITORY_ALIAS, + itemRepositoryAlias: UMB_DOCUMENT_BLUEPRINT_ITEM_REPOSITORY_ALIAS, + }, + }, + */, +]; + +export const manifests = [...entityActions]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity.ts new file mode 100644 index 0000000000..3513e0fa94 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity.ts @@ -0,0 +1,9 @@ +export const UMB_DOCUMENT_BLUEPRINT_ROOT_ENTITY_TYPE = 'document-blueprint-root'; +export const UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE = 'document-blueprint'; + +export const UMB_DOCUMENT_BLUEPRINT_ITEM_ENTITY_TYPE = 'document-blueprint-item'; + +export type UmbDocumentBlueprintRootEntityType = typeof UMB_DOCUMENT_BLUEPRINT_ROOT_ENTITY_TYPE; +export type UmbDocumentBlueprintEntityType = typeof UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE; + +export type UmbDocumentBlueprintItemEntityType = typeof UMB_DOCUMENT_BLUEPRINT_ITEM_ENTITY_TYPE; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/index.ts index e69de29bb2..dab908bbad 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/index.ts @@ -0,0 +1 @@ +export * from './entity.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/manifests.ts index ea4e6d7613..de4d9342c5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/manifests.ts @@ -1,4 +1,5 @@ import { manifests as menuItemManifests } from './menu-item/manifests.js'; import { manifests as workspaceManifests } from './workspace/manifests.js'; +import { manifests as entityActionManifests } from './entity-actions/manifests.js'; -export const manifests = [...menuItemManifests, ...workspaceManifests]; +export const manifests = [...menuItemManifests, ...workspaceManifests, ...entityActionManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/menu-item/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/menu-item/manifests.ts index 6c936aa77c..d02216abf6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/menu-item/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/menu-item/manifests.ts @@ -1,11 +1,13 @@ -import type { ManifestMenuItem } from '@umbraco-cms/backoffice/extension-registry'; +import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; -const menuItem: ManifestMenuItem = { +const menuItem: ManifestTypes = { type: 'menuItem', + //kind: 'tree', alias: 'Umb.MenuItem.DocumentBlueprints', name: 'Document Blueprints Menu Item', weight: 100, meta: { + //treeAlias: [UMB_DOCUMENT_BLUEPRINT_TREE_ALIAS] label: 'Document Blueprints', icon: 'icon-blueprint', entityType: 'document-blueprint-root', diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/index.ts new file mode 100644 index 0000000000..b4743acd7a --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/index.ts @@ -0,0 +1,10 @@ +/*export { UmbTemplateTreeRepository } from './template-tree.repository.js'; +export { + UMB_TEMPLATE_TREE_REPOSITORY_ALIAS, + UMB_TEMPLATE_TREE_STORE_ALIAS, + UMB_TEMPLATE_TREE_ALIAS, +} from './manifests.js'; +export { UMB_TEMPLATE_TREE_STORE_CONTEXT } from './template-tree.store.js'; +export { type UmbTemplateTreeStore } from './template-tree.store.js'; +export * from './types.js'; +*/ diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/types.ts new file mode 100644 index 0000000000..ac8ca29477 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/types.ts @@ -0,0 +1,18 @@ +import type { + UmbDocumentBlueprintEntityType, + UmbDocumentBlueprintRootEntityType, + UmbDocumentBlueprintItemEntityType, +} from '../entity.js'; +import type { UmbUniqueTreeItemModel, UmbUniqueTreeRootModel } from '@umbraco-cms/backoffice/tree'; + +export interface UmbDocumentBlueprintTreeItemModel extends UmbUniqueTreeItemModel { + entityType: UmbDocumentBlueprintEntityType; +} + +export interface UmbDocumentBlueprintItemTreeItemModel extends UmbUniqueTreeItemModel { + entityType: UmbDocumentBlueprintItemEntityType; +} + +export interface UmbDocumentBlueprintTreeRootModel extends UmbUniqueTreeRootModel { + entityType: UmbDocumentBlueprintRootEntityType; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/manifests.ts index 7983bf294f..08702a94e8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/manifests.ts @@ -1,12 +1,15 @@ +import { UMB_DOCUMENT_BLUEPRINT_ROOT_ENTITY_TYPE } from '../entity.js'; import type { ManifestWorkspace } from '@umbraco-cms/backoffice/extension-registry'; +export const UMB_DOCUMENT_BLUEPRINT_ROOT_WORKSPACE_ALIAS = 'Umb.Workspace.DocumentBlueprint.Root'; + const workspace: ManifestWorkspace = { type: 'workspace', - alias: 'Umb.Workspace.DocumentBlueprint.Root', + alias: UMB_DOCUMENT_BLUEPRINT_ROOT_WORKSPACE_ALIAS, name: 'Document Blueprint Root Workspace', element: () => import('./document-blueprint-root-workspace.element.js'), meta: { - entityType: 'document-blueprint-root', + entityType: UMB_DOCUMENT_BLUEPRINT_ROOT_ENTITY_TYPE, }, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/index.ts index b9cc5c0340..e0f90f8c40 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/index.ts @@ -1,4 +1,5 @@ import './document-types/index.js'; import './documents/index.js'; +import './document-blueprints/index.js'; export * from './manifests.js'; From e8967bb9349984a01aae5babae2d007b0eac8bc0 Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Tue, 12 Mar 2024 10:24:29 +0100 Subject: [PATCH 003/280] mock data --- .../src/mocks/browser-handlers.ts | 2 + .../document-blueprint.data.ts | 45 +++++++ .../document-blueprint.db.ts | 110 ++++++++++++++++++ .../document-blueprint/detail.handlers.ts | 48 ++++++++ .../handlers/document-blueprint/index.ts | 5 + .../document-blueprint/item.handlers.ts | 13 +++ .../mocks/handlers/document-blueprint/slug.ts | 1 + .../document-blueprint/tree.handlers.ts | 22 ++++ 8 files changed, 246 insertions(+) create mode 100644 src/Umbraco.Web.UI.Client/src/mocks/data/document-blueprint/document-blueprint.data.ts create mode 100644 src/Umbraco.Web.UI.Client/src/mocks/data/document-blueprint/document-blueprint.db.ts create mode 100644 src/Umbraco.Web.UI.Client/src/mocks/handlers/document-blueprint/detail.handlers.ts create mode 100644 src/Umbraco.Web.UI.Client/src/mocks/handlers/document-blueprint/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/mocks/handlers/document-blueprint/item.handlers.ts create mode 100644 src/Umbraco.Web.UI.Client/src/mocks/handlers/document-blueprint/slug.ts create mode 100644 src/Umbraco.Web.UI.Client/src/mocks/handlers/document-blueprint/tree.handlers.ts 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 161d6e9823..aeb362ecb4 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/browser-handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/browser-handlers.ts @@ -38,6 +38,7 @@ import { handlers as userHandlers } from './handlers/user/index.js'; import { relationHandlers, relationTypeHandlers } from './handlers/relations/index.js'; import * as manifestsHandlers from './handlers/manifests.handlers.js'; import * as serverHandlers from './handlers/server.handlers.js'; +import { handlers as documentBlueprintHandlers } from './handlers/document-blueprint/index.js'; const handlers = [ ...auditLogHandlers, @@ -79,6 +80,7 @@ const handlers = [ ...upgradeHandlers, ...userGroupsHandlers, ...userHandlers, + ...documentBlueprintHandlers, serverHandlers.serverInformationHandler, ]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/document-blueprint/document-blueprint.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/document-blueprint/document-blueprint.data.ts new file mode 100644 index 0000000000..6b362e7995 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/document-blueprint/document-blueprint.data.ts @@ -0,0 +1,45 @@ +import type { UmbMockDocumentModel } from '../document/document.data.js'; +import { DocumentVariantStateModel } from '@umbraco-cms/backoffice/external/backend-api'; + +export interface UmbMockDocumentBlueprintModel extends UmbMockDocumentModel {} + +export const data: Array = [ + { + urls: [ + { + culture: 'en-US', + url: '/', + }, + ], + template: null, + id: 'the-simplest-document-id', + parent: null, + documentType: { + id: 'the-simplest-document-type-id', + icon: 'icon-document', + }, + hasChildren: false, + noAccess: false, + isProtected: false, + isTrashed: false, + variants: [ + { + state: DocumentVariantStateModel.DRAFT, + publishDate: '2023-02-06T15:32:24.957009', + culture: 'en-us', + segment: null, + name: 'The Simplest Document', + createDate: '2023-02-06T15:32:05.350038', + updateDate: '2023-02-06T15:32:24.957009', + }, + ], + values: [ + { + alias: 'prop1', + culture: null, + segment: null, + value: 'my blueprint value', + }, + ], + }, +]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/document-blueprint/document-blueprint.db.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/document-blueprint/document-blueprint.db.ts new file mode 100644 index 0000000000..9166a603dc --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/document-blueprint/document-blueprint.db.ts @@ -0,0 +1,110 @@ +import { UmbMockEntityTreeManager } from '../utils/entity/entity-tree.manager.js'; +import { UmbMockEntityItemManager } from '../utils/entity/entity-item.manager.js'; +import { UmbMockEntityDetailManager } from '../utils/entity/entity-detail.manager.js'; +import { umbDocumentTypeMockDb } from '../document-type/document-type.db.js'; +import { UmbEntityMockDbBase } from '../utils/entity/entity-base.js'; +import { data } from './document-blueprint.data.js'; +import type { UmbMockDocumentBlueprintModel } from './document-blueprint.data.js'; +import { DocumentVariantStateModel } from '@umbraco-cms/backoffice/external/backend-api'; +import { UmbId } from '@umbraco-cms/backoffice/id'; +import type { + CreateDocumentRequestModel, + DocumentItemResponseModel, + DocumentResponseModel, + DocumentTreeItemResponseModel, +} from '@umbraco-cms/backoffice/external/backend-api'; + +export class UmbDocumentBlueprintMockDB extends UmbEntityMockDbBase { + tree = new UmbMockEntityTreeManager(this, treeItemMapper); + item = new UmbMockEntityItemManager(this, itemMapper); + detail = new UmbMockEntityDetailManager( + this, + createMockDocumentBlueprintMapper, + detailResponseMapper, + ); + + constructor(data: Array) { + super(data); + } +} + +const treeItemMapper = (model: UmbMockDocumentBlueprintModel): Omit => { + const documentType = umbDocumentTypeMockDb.read(model.documentType.id); + if (!documentType) throw new Error(`Document type with id ${model.documentType.id} not found`); + + return { + documentType: { + 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 createMockDocumentBlueprintMapper = (request: CreateDocumentRequestModel): UmbMockDocumentBlueprintModel => { + 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, + collection: undefined, // 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: DocumentVariantStateModel.DRAFT, + publishDate: null, + }; + }), + urls: [], + }; +}; + +const detailResponseMapper = (model: UmbMockDocumentBlueprintModel): 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: UmbMockDocumentBlueprintModel): DocumentItemResponseModel => { + return { + documentType: { + collection: model.documentType.collection, + icon: model.documentType.icon, + id: model.documentType.id, + }, + id: model.id, + isProtected: model.isProtected, + isTrashed: model.isTrashed, + variants: model.variants, + }; +}; + +export const umbDocumentBlueprintMockDb = new UmbDocumentBlueprintMockDB(data); diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-blueprint/detail.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-blueprint/detail.handlers.ts new file mode 100644 index 0000000000..80722ba2a8 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-blueprint/detail.handlers.ts @@ -0,0 +1,48 @@ +const { rest } = window.MockServiceWorker; +import { umbDocumentBlueprintMockDb } from '../../data/document-blueprint/document-blueprint.db.js'; +import { UMB_SLUG } from './slug.js'; +import type { + CreateDocumentRequestModel, + UpdateDocumentRequestModel, +} from '@umbraco-cms/backoffice/external/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 = umbDocumentBlueprintMockDb.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 = umbDocumentBlueprintMockDb.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')); + umbDocumentBlueprintMockDb.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)); + umbDocumentBlueprintMockDb.detail.delete(id); + return res(ctx.status(200)); + }), +]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-blueprint/index.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-blueprint/index.ts new file mode 100644 index 0000000000..236354678a --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-blueprint/index.ts @@ -0,0 +1,5 @@ +import { treeHandlers } from './tree.handlers.js'; +import { itemHandlers } from './item.handlers.js'; +import { detailHandlers } from './detail.handlers.js'; + +export const handlers = [...treeHandlers, ...itemHandlers, ...detailHandlers]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-blueprint/item.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-blueprint/item.handlers.ts new file mode 100644 index 0000000000..377e4343d8 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-blueprint/item.handlers.ts @@ -0,0 +1,13 @@ +const { rest } = window.MockServiceWorker; +import { umbDocumentBlueprintMockDb } from '../../data/document-blueprint/document-blueprint.db.js'; +import { UMB_SLUG } from './slug.js'; +import { umbracoPath } from '@umbraco-cms/backoffice/utils'; + +export const itemHandlers = [ + rest.get(umbracoPath(`/item${UMB_SLUG}`), (req, res, ctx) => { + const ids = req.url.searchParams.getAll('id'); + if (!ids) return; + const items = umbDocumentBlueprintMockDb.item.getItems(ids); + return res(ctx.status(200), ctx.json(items)); + }), +]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-blueprint/slug.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-blueprint/slug.ts new file mode 100644 index 0000000000..f877ec0b7a --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-blueprint/slug.ts @@ -0,0 +1 @@ +export const UMB_SLUG = '/document-blueprint'; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-blueprint/tree.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-blueprint/tree.handlers.ts new file mode 100644 index 0000000000..fda1cfb47f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/document-blueprint/tree.handlers.ts @@ -0,0 +1,22 @@ +const { rest } = window.MockServiceWorker; +import { umbDocumentBlueprintMockDb } from '../../data/document-blueprint/document-blueprint.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 skip = Number(req.url.searchParams.get('skip')); + const take = Number(req.url.searchParams.get('take')); + const response = umbDocumentBlueprintMockDb.tree.getRoot({ skip, take }); + 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 skip = Number(req.url.searchParams.get('skip')); + const take = Number(req.url.searchParams.get('take')); + const response = umbDocumentBlueprintMockDb.tree.getChildrenOf({ parentId, skip, take }); + return res(ctx.status(200), ctx.json(response)); + }), +]; From c2e8dc11a59c6793b830ceaf89e666d25d7b1192 Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Tue, 12 Mar 2024 10:50:30 +0100 Subject: [PATCH 004/280] tree --- .../documents/document-blueprints/entity.ts | 6 +- .../document-blueprint-tree.repository.ts | 28 ++++ ...ument-blueprint-tree.server.data-source.ts | 57 ++++++++ .../tree/document-blueprint-tree.store.ts | 40 ++++++ .../document-blueprint-folder.repository.ts | 9 ++ ...ent-blueprint-folder.server.data-source.ts | 122 ++++++++++++++++++ .../document-blueprints/tree/folder/index.ts | 2 + .../tree/folder/manifests.ts | 37 ++++++ .../document-blueprints/tree/folder/types.ts | 6 + .../document-blueprints/tree/index.ts | 12 +- .../document-blueprints/tree/manifests.ts | 56 ++++++++ .../reload-tree-item-children/manifests.ts | 21 +++ .../document-blueprints/tree/types.ts | 8 +- 13 files changed, 384 insertions(+), 20 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/document-blueprint-tree.repository.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/document-blueprint-tree.server.data-source.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/document-blueprint-tree.store.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/document-blueprint-folder.repository.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/document-blueprint-folder.server.data-source.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/types.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/reload-tree-item-children/manifests.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity.ts index 3513e0fa94..8aa8201389 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity.ts @@ -1,9 +1,7 @@ export const UMB_DOCUMENT_BLUEPRINT_ROOT_ENTITY_TYPE = 'document-blueprint-root'; export const UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE = 'document-blueprint'; - -export const UMB_DOCUMENT_BLUEPRINT_ITEM_ENTITY_TYPE = 'document-blueprint-item'; +export const UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE = 'document-blueprint-folder'; export type UmbDocumentBlueprintRootEntityType = typeof UMB_DOCUMENT_BLUEPRINT_ROOT_ENTITY_TYPE; export type UmbDocumentBlueprintEntityType = typeof UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE; - -export type UmbDocumentBlueprintItemEntityType = typeof UMB_DOCUMENT_BLUEPRINT_ITEM_ENTITY_TYPE; +export type UmbDocumentBlueprintFolderEntityType = typeof UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/document-blueprint-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/document-blueprint-tree.repository.ts new file mode 100644 index 0000000000..31dd948145 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/document-blueprint-tree.repository.ts @@ -0,0 +1,28 @@ +import { UMB_DOCUMENT_BLUEPRINT_ROOT_ENTITY_TYPE } from '../entity.js'; +import { UmbDocumentBlueprintTreeServerDataSource } from './document-blueprint-tree.server.data-source.js'; +import { UMB_DOCUMENT_BLUEPRINT_TREE_STORE_CONTEXT } from './document-blueprint-tree.store.js'; +import type { UmbDocumentBlueprintTreeItemModel, UmbDocumentBlueprintTreeRootModel } from './types.js'; +import { UmbTreeRepositoryBase } from '@umbraco-cms/backoffice/tree'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; + +export class UmbDocumentBlueprintTreeRepository + extends UmbTreeRepositoryBase + implements UmbApi +{ + constructor(host: UmbControllerHost) { + super(host, UmbDocumentBlueprintTreeServerDataSource, UMB_DOCUMENT_BLUEPRINT_TREE_STORE_CONTEXT); + } + + async requestTreeRoot() { + const data: UmbDocumentBlueprintTreeRootModel = { + unique: null, + entityType: UMB_DOCUMENT_BLUEPRINT_ROOT_ENTITY_TYPE, + name: 'Document Blueprints', + hasChildren: true, + isFolder: true, + }; + + return { data }; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/document-blueprint-tree.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/document-blueprint-tree.server.data-source.ts new file mode 100644 index 0000000000..9c69239988 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/document-blueprint-tree.server.data-source.ts @@ -0,0 +1,57 @@ +import { UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE } from '../entity.js'; +import type { UmbDocumentBlueprintTreeItemModel } from './types.js'; +import type { UmbTreeChildrenOfRequestArgs, UmbTreeRootItemsRequestArgs } from '@umbraco-cms/backoffice/tree'; +import { UmbTreeServerDataSourceBase } from '@umbraco-cms/backoffice/tree'; +import type { DocumentBlueprintTreeItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; +import { DocumentBlueprintResource } from '@umbraco-cms/backoffice/external/backend-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; + +/** + * A data source for a data type tree that fetches data from the server + * @export + * @class UmbDocumentBlueprintTreeServerDataSource + * @implements {DocumentTreeDataSource} + */ +export class UmbDocumentBlueprintTreeServerDataSource extends UmbTreeServerDataSourceBase< + DocumentBlueprintTreeItemResponseModel, + UmbDocumentBlueprintTreeItemModel +> { + /** + * Creates an instance of UmbDocumentBlueprintTreeServerDataSource. + * @param {UmbControllerHost} host + * @memberof UmbDocumentBlueprintTreeServerDataSource + */ + constructor(host: UmbControllerHost) { + super(host, { + getRootItems, + getChildrenOf, + mapper, + }); + } +} + +const getRootItems = (args: UmbTreeRootItemsRequestArgs) => + // eslint-disable-next-line local-rules/no-direct-api-import + DocumentBlueprintResource.getTreeDocumentBlueprintRoot({ skip: args.skip, take: args.take }); + +const getChildrenOf = (args: UmbTreeChildrenOfRequestArgs) => { + if (args.parentUnique === null) { + return getRootItems(args); + } else { + // eslint-disable-next-line local-rules/no-direct-api-import + return DocumentBlueprintResource.getTreeDocumentBlueprintChildren({ + parentId: args.parentUnique, + }); + } +}; + +const mapper = (item: DocumentBlueprintTreeItemResponseModel): UmbDocumentBlueprintTreeItemModel => { + return { + unique: item.id, + parentUnique: item.parent?.id || null, + name: item.name, + entityType: item.isFolder ? UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE : UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, + isFolder: item.isFolder, + hasChildren: item.hasChildren, + }; +}; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/document-blueprint-tree.store.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/document-blueprint-tree.store.ts new file mode 100644 index 0000000000..543f5fa479 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/document-blueprint-tree.store.ts @@ -0,0 +1,40 @@ +import { UMB_DOCUMENT_BLUEPRINT_DETAIL_STORE_CONTEXT } from '../repository/index.js'; +import type { UmbDocumentBlueprintDetailModel } from '../types.js'; +import type { UmbDocumentBlueprintTreeItemModel } from './types.js'; +import { UmbUniqueTreeStore } from '@umbraco-cms/backoffice/tree'; +import { UmbStoreConnector } from '@umbraco-cms/backoffice/store'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; + +/** + * @export + * @class UmbDocumentBlueprintTreeStore + * @extends {UmbStoreBase} + * @description - Tree Data Store for Document Blueprints + */ +export class UmbDocumentBlueprintTreeStore extends UmbUniqueTreeStore { + /** + * Creates an instance of UmbDocumentBlueprintTreeStore. + * @param {UmbControllerHost} host + * @memberof UmbDocumentBlueprintTreeStore + */ + constructor(host: UmbControllerHost) { + super(host, UMB_DOCUMENT_BLUEPRINT_TREE_STORE_CONTEXT.toString()); + + new UmbStoreConnector(host, { + store: this, + connectToStoreAlias: UMB_DOCUMENT_BLUEPRINT_DETAIL_STORE_CONTEXT, + updateStoreItemMapper: (item) => this.#updateTreeItemMapper(item), + }); + } + + #updateTreeItemMapper = (item: UmbDocumentBlueprintDetailModel) => { + return { + name: item.name, + }; + }; +} + +export const UMB_DOCUMENT_BLUEPRINT_TREE_STORE_CONTEXT = new UmbContextToken( + 'UmbDocumentBlueprintTreeStore', +); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/document-blueprint-folder.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/document-blueprint-folder.repository.ts new file mode 100644 index 0000000000..4510666a59 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/document-blueprint-folder.repository.ts @@ -0,0 +1,9 @@ +import { UmbDocumentBlueprintFolderServerDataSource } from './document-blueprint-folder.server.data-source.js'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { UmbFolderRepositoryBase } from '@umbraco-cms/backoffice/tree'; + +export class UmbDocumentBlueprintFolderRepository extends UmbFolderRepositoryBase { + constructor(host: UmbControllerHost) { + super(host, UmbDocumentBlueprintFolderServerDataSource); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/document-blueprint-folder.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/document-blueprint-folder.server.data-source.ts new file mode 100644 index 0000000000..a3dd268887 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/document-blueprint-folder.server.data-source.ts @@ -0,0 +1,122 @@ +import type { UmbCreateFolderModel, UmbFolderDataSource, UmbUpdateFolderModel } from '@umbraco-cms/backoffice/tree'; +import { DocumentBlueprintResource } from '@umbraco-cms/backoffice/external/backend-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; + +/** + * A data source for a Document Blueprint folder that fetches data from the server + * @export + * @class UmbDocumentBlueprintFolderServerDataSource + * @implements {RepositoryDetailDataSource} + */ +export class UmbDocumentBlueprintFolderServerDataSource implements UmbFolderDataSource { + #host: UmbControllerHost; + + /** + * Creates an instance of UmbDocumentBlueprintFolderServerDataSource. + * @param {UmbControllerHost} host + * @memberof UmbDocumentBlueprintFolderServerDataSource + */ + constructor(host: UmbControllerHost) { + this.#host = host; + } + + /** + * Fetches a Document Blueprint folder from the server + * @param {string} unique + * @return {*} + * @memberof UmbDocumentBlueprintFolderServerDataSource + */ + async read(unique: string) { + if (!unique) throw new Error('Unique is missing'); + + const { data, error } = await tryExecuteAndNotify( + this.#host, + DocumentBlueprintResource.getDocumentBlueprintFolderById({ + id: unique, + }), + ); + + if (data) { + const mappedData = { + unique: data.id, + name: data.name, + }; + + return { data: mappedData }; + } + + return { error }; + } + + /** + * Creates a Document Blueprint folder on the server + * @param {UmbCreateFolderModel} args + * @return {*} + * @memberof UmbDocumentBlueprintFolderServerDataSource + */ + async create(args: UmbCreateFolderModel) { + if (args.parentUnique === undefined) throw new Error('Parent unique is missing'); + if (!args.name) throw new Error('Name is missing'); + + const requestBody = { + id: args.unique, + parent: args.parentUnique ? { id: args.parentUnique } : null, + name: args.name, + }; + + const { error } = await tryExecuteAndNotify( + this.#host, + DocumentBlueprintResource.postDocumentBlueprintFolder({ + requestBody, + }), + ); + + if (!error) { + return this.read(args.unique); + } + + return { error }; + } + + /** + * Updates a Document Blueprint folder on the server + * @param {UmbUpdateFolderModel} args + * @return {*} + * @memberof UmbDocumentBlueprintFolderServerDataSource + */ + async update(args: UmbUpdateFolderModel) { + if (!args.unique) throw new Error('Unique is missing'); + if (!args.name) throw new Error('Folder name is missing'); + + const { error } = await tryExecuteAndNotify( + this.#host, + DocumentBlueprintResource.putDocumentBlueprintFolderById({ + id: args.unique, + requestBody: { name: args.name }, + }), + ); + + if (!error) { + return this.read(args.unique); + } + + return { error }; + } + + /** + * Deletes a Document Blueprint folder on the server + * @param {string} unique + * @return {*} + * @memberof UmbDocumentBlueprintServerDataSource + */ + async delete(unique: string) { + if (!unique) throw new Error('Unique is missing'); + return tryExecuteAndNotify( + this.#host, + DocumentBlueprintResource.deleteDocumentBlueprintFolderById({ + id: unique, + }), + ); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/index.ts new file mode 100644 index 0000000000..29904de469 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/index.ts @@ -0,0 +1,2 @@ +export { UmbDocumentBlueprintFolderRepository } from './document-blueprint-folder.repository.js'; +export { UMB_DOCUMENT_BLUEPRINT_FOLDER_REPOSITORY_ALIAS } from './manifests.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/manifests.ts new file mode 100644 index 0000000000..9eef583220 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/manifests.ts @@ -0,0 +1,37 @@ +import { UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE } from '../../entity.js'; +import { UmbDocumentBlueprintFolderRepository } from './document-blueprint-folder.repository.js'; +import type { ManifestRepository, ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; + +export const UMB_DOCUMENT_BLUEPRINT_FOLDER_REPOSITORY_ALIAS = 'Umb.Repository.DocumentBlueprint.Folder'; + +const folderRepository: ManifestRepository = { + type: 'repository', + alias: UMB_DOCUMENT_BLUEPRINT_FOLDER_REPOSITORY_ALIAS, + name: 'Document Blueprint Folder Repository', + api: UmbDocumentBlueprintFolderRepository, +}; + +const entityActions: Array = [ + { + type: 'entityAction', + kind: 'folderUpdate', + alias: 'Umb.EntityAction.DocumentBlueprint.Folder.Rename', + name: 'Rename Document Blueprint Folder Entity Action', + forEntityTypes: [UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE], + meta: { + folderRepositoryAlias: UMB_DOCUMENT_BLUEPRINT_FOLDER_REPOSITORY_ALIAS, + }, + }, + { + type: 'entityAction', + kind: 'folderDelete', + alias: 'Umb.EntityAction.DocumentBlueprint.Folder.Delete', + name: 'Delete Document Blueprint Folder Entity Action', + forEntityTypes: [UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE], + meta: { + folderRepositoryAlias: UMB_DOCUMENT_BLUEPRINT_FOLDER_REPOSITORY_ALIAS, + }, + }, +]; + +export const manifests = [folderRepository, ...entityActions]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/types.ts new file mode 100644 index 0000000000..dd70703d94 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/types.ts @@ -0,0 +1,6 @@ +import type { UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE } from '../../entity.js'; +import type { UmbDocumentBlueprintTreeItemModel } from '../types.js'; + +export interface UmbDocumentBlueprintFolderTreeItemModel extends UmbDocumentBlueprintTreeItemModel { + entityType: typeof UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/index.ts index b4743acd7a..f098c0956c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/index.ts @@ -1,10 +1,2 @@ -/*export { UmbTemplateTreeRepository } from './template-tree.repository.js'; -export { - UMB_TEMPLATE_TREE_REPOSITORY_ALIAS, - UMB_TEMPLATE_TREE_STORE_ALIAS, - UMB_TEMPLATE_TREE_ALIAS, -} from './manifests.js'; -export { UMB_TEMPLATE_TREE_STORE_CONTEXT } from './template-tree.store.js'; -export { type UmbTemplateTreeStore } from './template-tree.store.js'; -export * from './types.js'; -*/ +export { UMB_DOCUMENT_BLUEPRINT_TREE_STORE_CONTEXT } from './document-blueprint-tree.store.js'; +export * from './folder/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/manifests.ts new file mode 100644 index 0000000000..f69949127f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/manifests.ts @@ -0,0 +1,56 @@ +import { + UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, + UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE, + UMB_DOCUMENT_BLUEPRINT_ROOT_ENTITY_TYPE, +} from '../entity.js'; +import { manifests as folderManifests } from './folder/manifests.js'; +import { manifests as reloadManifests } from './reload-tree-item-children/manifests.js'; +import { UmbDocumentBlueprintTreeRepository } from './document-blueprint-tree.repository.js'; +import { UmbDocumentBlueprintTreeStore } from './document-blueprint-tree.store.js'; +import type { + ManifestRepository, + ManifestTree, + ManifestTreeItem, + ManifestTreeStore, +} from '@umbraco-cms/backoffice/extension-registry'; + +export const UMB_DOCUMENT_BLUEPRINT_TREE_REPOSITORY_ALIAS = 'Umb.Repository.DocumentBlueprint.Tree'; +export const UMB_DOCUMENT_BLUEPRINT_TREE_STORE_ALIAS = 'Umb.Store.DocumentBlueprint.Tree'; + +const treeRepository: ManifestRepository = { + type: 'repository', + alias: UMB_DOCUMENT_BLUEPRINT_TREE_REPOSITORY_ALIAS, + name: 'Document Blueprint Tree Repository', + api: UmbDocumentBlueprintTreeRepository, +}; + +const treeStore: ManifestTreeStore = { + type: 'treeStore', + alias: UMB_DOCUMENT_BLUEPRINT_TREE_STORE_ALIAS, + name: 'Document Blueprint Tree Store', + api: UmbDocumentBlueprintTreeStore, +}; + +const tree: ManifestTree = { + type: 'tree', + kind: 'default', + alias: 'Umb.Tree.DocumentBlueprint', + name: 'Document Blueprints Tree', + meta: { + repositoryAlias: UMB_DOCUMENT_BLUEPRINT_TREE_REPOSITORY_ALIAS, + }, +}; + +const treeItem: ManifestTreeItem = { + type: 'treeItem', + kind: 'default', + alias: 'Umb.TreeItem.DocumentBlueprint', + name: 'Document Blueprint Tree Item', + forEntityTypes: [ + UMB_DOCUMENT_BLUEPRINT_ROOT_ENTITY_TYPE, + UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, + UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE, + ], +}; + +export const manifests = [treeRepository, treeStore, tree, treeItem, ...folderManifests, ...reloadManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/reload-tree-item-children/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/reload-tree-item-children/manifests.ts new file mode 100644 index 0000000000..d2071f88c7 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/reload-tree-item-children/manifests.ts @@ -0,0 +1,21 @@ +import { + UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, + UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE, + UMB_DOCUMENT_BLUEPRINT_ROOT_ENTITY_TYPE, +} from '../../entity.js'; +import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; + +export const manifests: Array = [ + { + type: 'entityAction', + kind: 'reloadTreeItemChildren', + alias: 'Umb.EntityAction.DocumentBlueprint.Tree.ReloadChildrenOf', + name: 'Reload Document Blueprint Tree Item Children Entity Action', + forEntityTypes: [ + UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, + UMB_DOCUMENT_BLUEPRINT_ROOT_ENTITY_TYPE, + UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE, + ], + meta: {}, + }, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/types.ts index ac8ca29477..3d58af58a2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/types.ts @@ -1,16 +1,12 @@ import type { UmbDocumentBlueprintEntityType, + UmbDocumentBlueprintFolderEntityType, UmbDocumentBlueprintRootEntityType, - UmbDocumentBlueprintItemEntityType, } from '../entity.js'; import type { UmbUniqueTreeItemModel, UmbUniqueTreeRootModel } from '@umbraco-cms/backoffice/tree'; export interface UmbDocumentBlueprintTreeItemModel extends UmbUniqueTreeItemModel { - entityType: UmbDocumentBlueprintEntityType; -} - -export interface UmbDocumentBlueprintItemTreeItemModel extends UmbUniqueTreeItemModel { - entityType: UmbDocumentBlueprintItemEntityType; + entityType: UmbDocumentBlueprintEntityType | UmbDocumentBlueprintFolderEntityType; } export interface UmbDocumentBlueprintTreeRootModel extends UmbUniqueTreeRootModel { From 671335cdbe4decff28c53f4e59e59701c79fcd2d Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Tue, 12 Mar 2024 12:45:10 +0100 Subject: [PATCH 005/280] blueprint repo --- .../document-blueprints/manifests.ts | 3 +- .../menu-item/manifests.ts | 4 +- .../document-blueprint-detail.repository.ts | 11 + ...ent-blueprint-detail.server.data-source.ts | 206 ++++++++++++++++++ .../detail/document-blueprint-detail.store.ts | 25 +++ .../repository/detail/index.ts | 3 + .../repository/detail/manifests.ts | 23 ++ .../document-blueprints/repository/index.ts | 7 + .../document-blueprint-item.repository.ts | 11 + ...ument-blueprint-item.server.data-source.ts | 54 +++++ .../item/document-blueprint-item.store.ts | 26 +++ .../repository/item/index.ts | 2 + .../repository/item/manifests.ts | 22 ++ .../repository/item/types.ts | 23 ++ .../repository/manifests.ts | 4 + ...ument-blueprint-tree.server.data-source.ts | 4 +- .../tree/document-blueprint-tree.store.ts | 6 +- .../documents/document-blueprints/types.ts | 39 ++++ .../workspace/manifests.ts | 27 ++- 19 files changed, 489 insertions(+), 11 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/detail/document-blueprint-detail.repository.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/detail/document-blueprint-detail.server.data-source.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/detail/document-blueprint-detail.store.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/detail/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/detail/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/item/document-blueprint-item.repository.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/item/document-blueprint-item.server.data-source.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/item/document-blueprint-item.store.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/item/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/item/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/item/types.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/types.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/manifests.ts index de4d9342c5..74655fc3d7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/manifests.ts @@ -1,5 +1,6 @@ import { manifests as menuItemManifests } from './menu-item/manifests.js'; import { manifests as workspaceManifests } from './workspace/manifests.js'; import { manifests as entityActionManifests } from './entity-actions/manifests.js'; +import { manifests as treeManifests } from './tree/manifests.js'; -export const manifests = [...menuItemManifests, ...workspaceManifests, ...entityActionManifests]; +export const manifests = [...menuItemManifests, ...workspaceManifests, ...entityActionManifests, ...treeManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/menu-item/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/menu-item/manifests.ts index d02216abf6..a7547172ba 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/menu-item/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/menu-item/manifests.ts @@ -2,12 +2,12 @@ import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; const menuItem: ManifestTypes = { type: 'menuItem', - //kind: 'tree', + kind: 'tree', alias: 'Umb.MenuItem.DocumentBlueprints', name: 'Document Blueprints Menu Item', weight: 100, meta: { - //treeAlias: [UMB_DOCUMENT_BLUEPRINT_TREE_ALIAS] + treeAlias: 'Umb.Tree.DocumentBlueprint', label: 'Document Blueprints', icon: 'icon-blueprint', entityType: 'document-blueprint-root', diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/detail/document-blueprint-detail.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/detail/document-blueprint-detail.repository.ts new file mode 100644 index 0000000000..0ba747f00b --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/detail/document-blueprint-detail.repository.ts @@ -0,0 +1,11 @@ +import type { UmbDocumentBlueprintDetailModel } from '../../types.js'; +import { UmbDocumentBlueprintServerDataSource } from './document-blueprint-detail.server.data-source.js'; +import { UMB_DOCUMENT_BLUEPRINT_DETAIL_STORE_CONTEXT } from './document-blueprint-detail.store.js'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { UmbDetailRepositoryBase } from '@umbraco-cms/backoffice/repository'; + +export class UmbDocumentBlueprintDetailRepository extends UmbDetailRepositoryBase { + constructor(host: UmbControllerHost) { + super(host, UmbDocumentBlueprintServerDataSource, UMB_DOCUMENT_BLUEPRINT_DETAIL_STORE_CONTEXT); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/detail/document-blueprint-detail.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/detail/document-blueprint-detail.server.data-source.ts new file mode 100644 index 0000000000..3cfc56e569 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/detail/document-blueprint-detail.server.data-source.ts @@ -0,0 +1,206 @@ +import type { UmbDocumentBlueprintDetailModel, UmbDocumentBlueprintVariantModel } from '../../types.js'; +import { UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE } from '../../entity.js'; +import { UmbId } from '@umbraco-cms/backoffice/id'; +import type { UmbDetailDataSource } from '@umbraco-cms/backoffice/repository'; +import type { + CreateDocumentRequestModel, + UpdateDocumentRequestModel, +} from '@umbraco-cms/backoffice/external/backend-api'; +import { DocumentResource } from '@umbraco-cms/backoffice/external/backend-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; + +/** + * A data source for the Document that fetches data from the server + * @export + * @class UmbDocumentBlueprintServerDataSource + * @implements {RepositoryDetailDataSource} + */ +export class UmbDocumentBlueprintServerDataSource implements UmbDetailDataSource { + #host: UmbControllerHost; + + /** + * Creates an instance of UmbDocumentBlueprintServerDataSource. + * @param {UmbControllerHost} host + * @memberof UmbDocumentBlueprintServerDataSource + */ + constructor(host: UmbControllerHost) { + this.#host = host; + } + + /** + * Creates a new Document scaffold + * @return { UmbDocumentBlueprintDetailModel } + * @memberof UmbDocumentBlueprintServerDataSource + */ + async createScaffold(preset: Partial = {}) { + const data: UmbDocumentBlueprintDetailModel = { + entityType: UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, + unique: UmbId.new(), + urls: [], + template: null, + documentType: { + unique: '', + collection: null, + }, + isTrashed: false, + values: [], + variants: [], + ...preset, + }; + + return { data }; + } + + /** + * Creates a new variant scaffold. + * @returns A new variant scaffold. + */ + /* + // TDOD: remove if not used + createVariantScaffold(): UmbDocumentBlueprintVariantModel { + return { + state: null, + culture: null, + segment: null, + name: '', + publishDate: null, + createDate: null, + updateDate: null, + }; + } + */ + + /** + * Fetches a Document with the given id from the server + * @param {string} unique + * @return {*} + * @memberof UmbDocumentBlueprintServerDataSource + */ + async read(unique: string) { + if (!unique) throw new Error('Unique is missing'); + + const { data, error } = await tryExecuteAndNotify(this.#host, DocumentResource.getDocumentById({ id: unique })); + + if (error || !data) { + return { error }; + } + + // TODO: make data mapper to prevent errors + const document: UmbDocumentBlueprintDetailModel = { + entityType: UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, + unique: data.id, + values: data.values.map((value) => { + return { + alias: value.alias, + culture: value.culture || null, + segment: value.segment || null, + value: value.value, + }; + }), + variants: data.variants.map((variant) => { + return { + state: variant.state, + culture: variant.culture || null, + segment: variant.segment || null, + name: variant.name, + publishDate: variant.publishDate || null, + createDate: variant.createDate, + updateDate: variant.updateDate, + }; + }), + urls: data.urls.map((url) => { + return { + culture: url.culture || null, + url: url.url, + }; + }), + template: data.template ? { unique: data.template.id } : null, + documentType: { + unique: data.documentType.id, + collection: data.documentType.collection ? { unique: data.documentType.collection.id } : null, + }, + isTrashed: data.isTrashed, + }; + + return { data: document }; + } + + /** + * Inserts a new Document on the server + * @param {UmbDocumentBlueprintDetailModel} model + * @return {*} + * @memberof UmbDocumentBlueprintServerDataSource + */ + async create(model: UmbDocumentBlueprintDetailModel, parentUnique: string | null = null) { + if (!model) throw new Error('Document is missing'); + if (!model.unique) throw new Error('Document unique is missing'); + + // TODO: make data mapper to prevent errors + const requestBody: CreateDocumentRequestModel = { + id: model.unique, + parent: parentUnique ? { id: parentUnique } : null, + documentType: { id: model.documentType.unique }, + template: model.template ? { id: model.template.unique } : null, + values: model.values, + variants: model.variants, + }; + + const { data, error } = await tryExecuteAndNotify( + this.#host, + DocumentResource.postDocument({ + requestBody, + }), + ); + + if (data) { + return this.read(data); + } + + return { error }; + } + + /** + * Updates a Document on the server + * @param {UmbDocumentBlueprintDetailModel} Document + * @return {*} + * @memberof UmbDocumentBlueprintServerDataSource + */ + async update(model: UmbDocumentBlueprintDetailModel) { + if (!model.unique) throw new Error('Unique is missing'); + + // TODO: make data mapper to prevent errors + const requestBody: UpdateDocumentRequestModel = { + template: model.template ? { id: model.template.unique } : null, + values: model.values, + variants: model.variants, + }; + + const { error } = await tryExecuteAndNotify( + this.#host, + DocumentResource.putDocumentById({ + id: model.unique, + requestBody, + }), + ); + + if (!error) { + return this.read(model.unique); + } + + return { error }; + } + + /** + * Deletes a Document on the server + * @param {string} unique + * @return {*} + * @memberof UmbDocumentBlueprintServerDataSource + */ + async delete(unique: string) { + if (!unique) throw new Error('Unique is missing'); + + // TODO: update to delete when implemented + return tryExecuteAndNotify(this.#host, DocumentResource.putDocumentByIdMoveToRecycleBin({ id: unique })); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/detail/document-blueprint-detail.store.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/detail/document-blueprint-detail.store.ts new file mode 100644 index 0000000000..844ad7543e --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/detail/document-blueprint-detail.store.ts @@ -0,0 +1,25 @@ +import type { UmbDocumentBlueprintDetailModel } from '../../types.js'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; +import { UmbDetailStoreBase } from '@umbraco-cms/backoffice/store'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; + +/** + * @export + * @class UmbDocumentBlueprintDetailStore + * @extends {UmbStoreBase} + * @description - Data Store for Document Blueprint Details + */ +export class UmbDocumentBlueprintDetailStore extends UmbDetailStoreBase { + /** + * Creates an instance of UmbDocumentBlueprintDetailStore. + * @param {UmbControllerHost} host + * @memberof UmbDocumentBlueprintDetailStore + */ + constructor(host: UmbControllerHost) { + super(host, UMB_DOCUMENT_BLUEPRINT_DETAIL_STORE_CONTEXT.toString()); + } +} + +export const UMB_DOCUMENT_BLUEPRINT_DETAIL_STORE_CONTEXT = new UmbContextToken( + 'UmbDocumentBlueprintDetailStore', +); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/detail/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/detail/index.ts new file mode 100644 index 0000000000..8f95154dd2 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/detail/index.ts @@ -0,0 +1,3 @@ +export { UmbDocumentBlueprintDetailRepository } from './document-blueprint-detail.repository.js'; +export { UMB_DOCUMENT_BLUEPRINT_DETAIL_REPOSITORY_ALIAS } from './manifests.js'; +export { UMB_DOCUMENT_BLUEPRINT_DETAIL_STORE_CONTEXT } from './document-blueprint-detail.store.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/detail/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/detail/manifests.ts new file mode 100644 index 0000000000..923eb105ae --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/detail/manifests.ts @@ -0,0 +1,23 @@ +import { UmbDocumentBlueprintDetailRepository } from './document-blueprint-detail.repository.js'; +import { UmbDocumentBlueprintDetailStore } from './document-blueprint-detail.store.js'; +import type { ManifestRepository, ManifestStore } from '@umbraco-cms/backoffice/extension-registry'; + +export const UMB_DOCUMENT_BLUEPRINT_DETAIL_REPOSITORY_ALIAS = 'Umb.Repository.DocumentBlueprint.Detail'; + +const repository: ManifestRepository = { + type: 'repository', + alias: UMB_DOCUMENT_BLUEPRINT_DETAIL_REPOSITORY_ALIAS, + name: 'Document Blueprint Detail Repository', + api: UmbDocumentBlueprintDetailRepository, +}; + +export const UMB_DOCUMENT_BLUEPRINT_DETAIL_STORE_ALIAS = 'Umb.Store.DocumentBlueprint.Detail'; + +const store: ManifestStore = { + type: 'store', + alias: UMB_DOCUMENT_BLUEPRINT_DETAIL_STORE_ALIAS, + name: 'Document Blueprint Detail Store', + api: UmbDocumentBlueprintDetailStore, +}; + +export const manifests = [repository, store]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/index.ts new file mode 100644 index 0000000000..45e331149c --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/index.ts @@ -0,0 +1,7 @@ +export { + UmbDocumentBlueprintDetailRepository, + UMB_DOCUMENT_BLUEPRINT_DETAIL_REPOSITORY_ALIAS, +} from './detail/index.js'; +export { UmbDocumentBlueprintItemRepository, UMB_DOCUMENT_BLUEPRINT_ITEM_REPOSITORY_ALIAS } from './item/index.js'; + +export type { UmbDocumentBlueprintItemModel } from './item/types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/item/document-blueprint-item.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/item/document-blueprint-item.repository.ts new file mode 100644 index 0000000000..36d29289ff --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/item/document-blueprint-item.repository.ts @@ -0,0 +1,11 @@ +import { UmbDocumentBlueprintItemServerDataSource } from './document-blueprint-item.server.data-source.js'; +import { UMB_DOCUMENT_BLUEPRINT_ITEM_STORE_CONTEXT } from './document-blueprint-item.store.js'; +import type { UmbDocumentBlueprintItemModel } from './types.js'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { UmbItemRepositoryBase } from '@umbraco-cms/backoffice/repository'; + +export class UmbDocumentBlueprintItemRepository extends UmbItemRepositoryBase { + constructor(host: UmbControllerHost) { + super(host, UmbDocumentBlueprintItemServerDataSource, UMB_DOCUMENT_BLUEPRINT_ITEM_STORE_CONTEXT); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/item/document-blueprint-item.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/item/document-blueprint-item.server.data-source.ts new file mode 100644 index 0000000000..1e8df1b933 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/item/document-blueprint-item.server.data-source.ts @@ -0,0 +1,54 @@ +import { UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE } from '../../entity.js'; +import type { UmbDocumentBlueprintItemModel } from './types.js'; +import type { DocumentItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; +import { DocumentResource } from '@umbraco-cms/backoffice/external/backend-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { UmbItemServerDataSourceBase } from '@umbraco-cms/backoffice/repository'; + +/** + * A data source for Document Blueprint items that fetches data from the server + * @export + * @class UmbDocumentBlueprintItemServerDataSource + * @implements {DocumentTreeDataSource} + */ +export class UmbDocumentBlueprintItemServerDataSource extends UmbItemServerDataSourceBase< + DocumentItemResponseModel, + UmbDocumentBlueprintItemModel +> { + /** + * Creates an instance of UmbDocumentBlueprintItemServerDataSource. + * @param {UmbControllerHost} host + * @memberof UmbDocumentBlueprintItemServerDataSource + */ + constructor(host: UmbControllerHost) { + super(host, { + getItems, + mapper, + }); + } +} + +/* eslint-disable local-rules/no-direct-api-import */ +const getItems = (uniques: Array) => DocumentResource.getItemDocument({ id: uniques }); + +const mapper = (item: DocumentItemResponseModel): UmbDocumentBlueprintItemModel => { + return { + entityType: UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, + unique: item.id, + isTrashed: item.isTrashed, + isProtected: item.isProtected, + documentType: { + unique: item.documentType.id, + icon: item.documentType.icon, + collection: item.documentType.collection ? { unique: item.documentType.collection.id } : null, + }, + variants: item.variants.map((variant) => { + return { + culture: variant.culture || null, + name: variant.name, + state: variant.state, + }; + }), + name: item.variants[0]?.name, // TODO: this is not correct. We need to get it from the variants. This is a temp solution. + }; +}; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/item/document-blueprint-item.store.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/item/document-blueprint-item.store.ts new file mode 100644 index 0000000000..188f50afca --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/item/document-blueprint-item.store.ts @@ -0,0 +1,26 @@ +import type { UmbDocumentBlueprintDetailModel } from '../../types.js'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { UmbItemStoreBase } from '@umbraco-cms/backoffice/store'; + +/** + * @export + * @class UmbDocumentBlueprintItemStore + * @extends {UmbStoreBase} + * @description - Data Store for Document items + */ + +export class UmbDocumentBlueprintItemStore extends UmbItemStoreBase { + /** + * Creates an instance of UmbDocumentBlueprintItemStore. + * @param {UmbControllerHost} host + * @memberof UmbDocumentBlueprintItemStore + */ + constructor(host: UmbControllerHost) { + super(host, UMB_DOCUMENT_BLUEPRINT_ITEM_STORE_CONTEXT.toString()); + } +} + +export const UMB_DOCUMENT_BLUEPRINT_ITEM_STORE_CONTEXT = new UmbContextToken( + 'UmbDocumentBlueprintItemStore', +); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/item/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/item/index.ts new file mode 100644 index 0000000000..6b47360768 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/item/index.ts @@ -0,0 +1,2 @@ +export { UmbDocumentBlueprintItemRepository } from './document-blueprint-item.repository.js'; +export { UMB_DOCUMENT_BLUEPRINT_ITEM_REPOSITORY_ALIAS } from './manifests.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/item/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/item/manifests.ts new file mode 100644 index 0000000000..5674ac938e --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/item/manifests.ts @@ -0,0 +1,22 @@ +import { UmbDocumentBlueprintItemStore } from './document-blueprint-item.store.js'; +import { UmbDocumentBlueprintItemRepository } from './document-blueprint-item.repository.js'; +import type { ManifestRepository, ManifestItemStore } from '@umbraco-cms/backoffice/extension-registry'; + +export const UMB_DOCUMENT_BLUEPRINT_ITEM_REPOSITORY_ALIAS = 'Umb.Repository.DocumentBlueprint.Item'; +export const UMB_DOCUMENT_BLUEPRINT_STORE_ALIAS = 'Umb.Store.DocumentBlueprint.Item'; + +const itemRepository: ManifestRepository = { + type: 'repository', + alias: UMB_DOCUMENT_BLUEPRINT_ITEM_REPOSITORY_ALIAS, + name: 'Document Blueprint Item Repository', + api: UmbDocumentBlueprintItemRepository, +}; + +const itemStore: ManifestItemStore = { + type: 'itemStore', + alias: UMB_DOCUMENT_BLUEPRINT_STORE_ALIAS, + name: 'Document Blueprint Item Store', + api: UmbDocumentBlueprintItemStore, +}; + +export const manifests = [itemRepository, itemStore]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/item/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/item/types.ts new file mode 100644 index 0000000000..e054aac1d5 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/item/types.ts @@ -0,0 +1,23 @@ +import type { UmbDocumentBlueprintEntityType } from '../../entity.js'; +import type { DocumentVariantStateModel } from '@umbraco-cms/backoffice/external/backend-api'; +import type { UmbReferenceByUnique } from '@umbraco-cms/backoffice/models'; + +export interface UmbDocumentBlueprintItemModel { + entityType: UmbDocumentBlueprintEntityType; + name: string; // TODO: this is not correct. We need to get it from the variants. This is a temp solution. + unique: string; + isTrashed: boolean; + isProtected: boolean; + documentType: { + unique: string; + icon: string; + collection: UmbReferenceByUnique | null; + }; + variants: Array; +} + +export interface UmbDocumentBlueprintItemVariantModel { + name: string; + culture: string | null; + state: DocumentVariantStateModel | null; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/manifests.ts new file mode 100644 index 0000000000..bb35952020 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/manifests.ts @@ -0,0 +1,4 @@ +import { manifests as detailManifests } from './detail/manifests.js'; +import { manifests as itemManifests } from './item/manifests.js'; + +export const manifests = [...detailManifests, ...itemManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/document-blueprint-tree.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/document-blueprint-tree.server.data-source.ts index 9c69239988..17943b9a89 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/document-blueprint-tree.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/document-blueprint-tree.server.data-source.ts @@ -50,8 +50,8 @@ const mapper = (item: DocumentBlueprintTreeItemResponseModel): UmbDocumentBluepr unique: item.id, parentUnique: item.parent?.id || null, name: item.name, - entityType: item.isFolder ? UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE : UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, - isFolder: item.isFolder, + entityType: UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, + isFolder: false, hasChildren: item.hasChildren, }; }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/document-blueprint-tree.store.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/document-blueprint-tree.store.ts index 543f5fa479..5a2d338793 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/document-blueprint-tree.store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/document-blueprint-tree.store.ts @@ -1,4 +1,4 @@ -import { UMB_DOCUMENT_BLUEPRINT_DETAIL_STORE_CONTEXT } from '../repository/index.js'; +import { UMB_DOCUMENT_BLUEPRINT_DETAIL_STORE_CONTEXT } from '../repository/detail/index.js'; import type { UmbDocumentBlueprintDetailModel } from '../types.js'; import type { UmbDocumentBlueprintTreeItemModel } from './types.js'; import { UmbUniqueTreeStore } from '@umbraco-cms/backoffice/tree'; @@ -29,9 +29,7 @@ export class UmbDocumentBlueprintTreeStore extends UmbUniqueTreeStore { } #updateTreeItemMapper = (item: UmbDocumentBlueprintDetailModel) => { - return { - name: item.name, - }; + return { ...item, name: item.variants.map((variant) => variant.name)[0] }; }; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/types.ts new file mode 100644 index 0000000000..6cbcb6199b --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/types.ts @@ -0,0 +1,39 @@ +import type { UmbDocumentBlueprintEntityType } from './entity.js'; +import type { UmbVariantModel, UmbVariantOptionModel } from '@umbraco-cms/backoffice/variant'; +import type { UmbReferenceByUnique } from '@umbraco-cms/backoffice/models'; +import { DocumentVariantStateModel as UmbDocumentBlueprintVariantState } from '@umbraco-cms/backoffice/external/backend-api'; +export { UmbDocumentBlueprintVariantState }; + +export interface UmbDocumentBlueprintDetailModel { + documentType: { + unique: string; + collection: UmbReferenceByUnique | null; + }; + entityType: UmbDocumentBlueprintEntityType; + isTrashed: boolean; + template: { unique: string } | null; + unique: string; + urls: Array; + values: Array; + variants: Array; +} + +export interface UmbDocumentBlueprintVariantModel extends UmbVariantModel { + state: UmbDocumentBlueprintVariantState | null; + publishDate: string | null; +} + +export interface UmbDocumentBlueprintUrlInfoModel { + culture: string | null; + url: string; +} + +export interface UmbDocumentBlueprintValueModel { + culture: string | null; + segment: string | null; + alias: string; + value: ValueType; +} + +export interface UmbDocumentBlueprintVariantOptionModel + extends UmbVariantOptionModel {} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/manifests.ts index 08702a94e8..9d79e676fe 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/manifests.ts @@ -1,5 +1,6 @@ import { UMB_DOCUMENT_BLUEPRINT_ROOT_ENTITY_TYPE } from '../entity.js'; -import type { ManifestWorkspace } from '@umbraco-cms/backoffice/extension-registry'; +import { UmbSaveWorkspaceAction } from '@umbraco-cms/backoffice/workspace'; +import type { ManifestWorkspace, ManifestWorkspaceActions } from '@umbraco-cms/backoffice/extension-registry'; export const UMB_DOCUMENT_BLUEPRINT_ROOT_WORKSPACE_ALIAS = 'Umb.Workspace.DocumentBlueprint.Root'; @@ -13,4 +14,26 @@ const workspace: ManifestWorkspace = { }, }; -export const manifests = [workspace]; +const workspaceActions: Array = [ + { + type: 'workspaceAction', + kind: 'default', + alias: 'Umb.WorkspaceAction.DocumentBlueprint.Save', + name: 'Save Document Workspace Action', + weight: 80, + api: UmbSaveWorkspaceAction, + meta: { + label: 'Save', + look: 'secondary', + color: 'positive', + }, + conditions: [ + { + alias: 'Umb.Condition.WorkspaceAlias', + match: workspace.alias, + }, + ], + }, +]; + +export const manifests = [workspace, ...workspaceActions]; From d0e6ed5adb2bc7735da7ac5327ae0ed0c0bcb677 Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Wed, 13 Mar 2024 12:37:43 +0100 Subject: [PATCH 006/280] hack --- .../document-blueprint-tree.server.data-source.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/document-blueprint-tree.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/document-blueprint-tree.server.data-source.ts index 17943b9a89..d7b30c8318 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/document-blueprint-tree.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/document-blueprint-tree.server.data-source.ts @@ -2,7 +2,10 @@ import { UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTIT import type { UmbDocumentBlueprintTreeItemModel } from './types.js'; import type { UmbTreeChildrenOfRequestArgs, UmbTreeRootItemsRequestArgs } from '@umbraco-cms/backoffice/tree'; import { UmbTreeServerDataSourceBase } from '@umbraco-cms/backoffice/tree'; -import type { DocumentBlueprintTreeItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; +import type { + DocumentBlueprintTreeItemResponseModel, + DocumentTreeItemResponseModel, +} from '@umbraco-cms/backoffice/external/backend-api'; import { DocumentBlueprintResource } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; @@ -38,18 +41,23 @@ const getChildrenOf = (args: UmbTreeChildrenOfRequestArgs) => { if (args.parentUnique === null) { return getRootItems(args); } else { + throw new Error('Not implemented'); + /* // eslint-disable-next-line local-rules/no-direct-api-import return DocumentBlueprintResource.getTreeDocumentBlueprintChildren({ parentId: args.parentUnique, }); + */ } }; const mapper = (item: DocumentBlueprintTreeItemResponseModel): UmbDocumentBlueprintTreeItemModel => { + //TODO remove temp hack when api endpoints are fixed + const hack = item as Partial; return { unique: item.id, parentUnique: item.parent?.id || null, - name: item.name, + name: hack?.variants?.[0].name ?? '', entityType: UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, isFolder: false, hasChildren: item.hasChildren, From 11148ebe394cb3dfe71399b58aaba3ff60d29bf6 Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Wed, 13 Mar 2024 15:22:18 +0100 Subject: [PATCH 007/280] workspaces --- .../documents/document-blueprints/index.ts | 6 + .../document-blueprints/manifests.ts | 16 +- .../menu-item/manifests.ts | 3 +- ...ment-blueprint-workspace-editor.element.ts | 130 +++++ ...-blueprint-workspace-split-view.element.ts | 87 +++ ...ument-blueprint-workspace.context-token.ts | 14 + .../document-blueprint-workspace.context.ts | 503 ++++++++++++++++++ .../document-blueprint-workspace.element.ts | 87 +++ .../document-blueprints/workspace/index.ts | 1 + .../workspace/manifests.ts | 2 +- 10 files changed, 843 insertions(+), 6 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace-editor.element.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace-split-view.element.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.context-token.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.context.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.element.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/index.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/index.ts index dab908bbad..188be00f10 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/index.ts @@ -1 +1,7 @@ export * from './entity.js'; + +export * from './workspace/index.js'; + +export * from './repository/index.js'; +export * from './tree/types.js'; +export * from './types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/manifests.ts index 74655fc3d7..7cfe9c73e2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/manifests.ts @@ -1,6 +1,14 @@ -import { manifests as menuItemManifests } from './menu-item/manifests.js'; -import { manifests as workspaceManifests } from './workspace/manifests.js'; import { manifests as entityActionManifests } from './entity-actions/manifests.js'; -import { manifests as treeManifests } from './tree/manifests.js'; +import { manifests as menuItemManifests } from './menu-item/manifests.js'; -export const manifests = [...menuItemManifests, ...workspaceManifests, ...entityActionManifests, ...treeManifests]; +import { manifests as repositoryManifests } from './repository/manifests.js'; +import { manifests as treeManifests } from './tree/manifests.js'; +import { manifests as workspaceManifests } from './workspace/manifests.js'; + +export const manifests = [ + ...entityActionManifests, + ...menuItemManifests, + ...repositoryManifests, + ...treeManifests, + ...workspaceManifests, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/menu-item/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/menu-item/manifests.ts index a7547172ba..cbddb145af 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/menu-item/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/menu-item/manifests.ts @@ -1,3 +1,4 @@ +import { UMB_DOCUMENT_BLUEPRINT_ROOT_ENTITY_TYPE } from '../entity.js'; import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; const menuItem: ManifestTypes = { @@ -10,7 +11,7 @@ const menuItem: ManifestTypes = { treeAlias: 'Umb.Tree.DocumentBlueprint', label: 'Document Blueprints', icon: 'icon-blueprint', - entityType: 'document-blueprint-root', + entityType: UMB_DOCUMENT_BLUEPRINT_ROOT_ENTITY_TYPE, menus: ['Umb.Menu.Settings'], }, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace-editor.element.ts new file mode 100644 index 0000000000..7b17e80df5 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace-editor.element.ts @@ -0,0 +1,130 @@ +import type { UmbDocumentBlueprintVariantOptionModel } from '../types.js'; +import { UmbDocumentBlueprintWorkspaceSplitViewElement } from './document-blueprint-workspace-split-view.element.js'; +import { UMB_DOCUMENT_BLUEPRINT_WORKSPACE_CONTEXT } from './document-blueprint-workspace.context-token.js'; +import { customElement, state, css, html } from '@umbraco-cms/backoffice/external/lit'; +import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; +import type { UmbRoute, UmbRouterSlotInitEvent } from '@umbraco-cms/backoffice/router'; + +// TODO: This seem fully identical with Media Workspace Editor, so we can refactor this to a generic component. [NL] +@customElement('umb-document-blueprint-workspace-editor') +export class UmbDocumentBlueprintWorkspaceEditorElement extends UmbLitElement { + // + // TODO: Refactor: when having a split view/variants context token, we can rename the split view/variants component to a generic and make this component generic as well. [NL] + private splitViewElement = new UmbDocumentBlueprintWorkspaceSplitViewElement(); + + #workspaceContext?: typeof UMB_DOCUMENT_BLUEPRINT_WORKSPACE_CONTEXT.TYPE; + + @state() + _routes?: Array; + + constructor() { + super(); + + this.consumeContext(UMB_DOCUMENT_BLUEPRINT_WORKSPACE_CONTEXT, (instance) => { + this.#workspaceContext = instance; + this.#observeVariants(); + }); + } + + #observeVariants() { + if (!this.#workspaceContext) return; + // TODO: the variantOptions observable is like too broad as this will be triggered then there is any change in the variant options, we need to only update routes when there is a relevant change to them. [NL] + this.observe(this.#workspaceContext.variantOptions, (options) => this._generateRoutes(options), '_observeVariants'); + } + + private _handleVariantFolderPart(index: number, folderPart: string) { + const variantSplit = folderPart.split('_'); + const culture = variantSplit[0]; + const segment = variantSplit[1]; + this.#workspaceContext?.splitView.setActiveVariant(index, culture, segment); + } + + private async _generateRoutes(options: Array) { + if (!options || options.length === 0) return; + + // Generate split view routes for all available routes + const routes: Array = []; + + // Split view routes: + options.forEach((variantA) => { + options.forEach((variantB) => { + routes.push({ + // TODO: When implementing Segments, be aware if using the unique is URL Safe... [NL] + path: variantA.unique + '_&_' + variantB.unique, + component: this.splitViewElement, + setup: (_component, info) => { + // Set split view/active info.. + const variantSplit = info.match.fragments.consumed.split('_&_'); + variantSplit.forEach((part, index) => { + this._handleVariantFolderPart(index, part); + }); + }, + }); + }); + }); + + // Single view: + options.forEach((variant) => { + routes.push({ + // TODO: When implementing Segments, be aware if using the unique is URL Safe... [NL] + path: variant.unique, + component: this.splitViewElement, + setup: (_component, info) => { + // cause we might come from a split-view, we need to reset index 1. + this.#workspaceContext?.splitView.removeActiveVariant(1); + this._handleVariantFolderPart(0, info.match.fragments.consumed); + }, + }); + }); + + if (routes.length !== 0) { + // Using first single view as the default route for now (hence the math below): + routes.push({ + path: '', + redirectTo: routes[options.length * options.length]?.path, + }); + } + + const oldValue = this._routes; + + // is there any differences in the amount ot the paths? [NL] + // TODO: if we make a memorization function as the observer, we can avoid this check and avoid the whole build of routes. [NL] + if (oldValue && oldValue.length === routes.length) { + // is there any differences in the paths? [NL] + const hasDifferences = oldValue.some((route, index) => route.path !== routes[index].path); + if (!hasDifferences) return; + } + this._routes = routes; + this.requestUpdate('_routes', oldValue); + } + + private _gotWorkspaceRoute = (e: UmbRouterSlotInitEvent) => { + this.#workspaceContext?.splitView.setWorkspaceRoute(e.target.absoluteRouterPath); + }; + + render() { + return this._routes && this._routes.length > 0 + ? html`` + : ''; + } + + static styles = [ + UmbTextStyles, + css` + :host { + display: block; + width: 100%; + height: 100%; + } + `, + ]; +} + +export default UmbDocumentBlueprintWorkspaceEditorElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-document-blueprint-workspace-editor': UmbDocumentBlueprintWorkspaceEditorElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace-split-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace-split-view.element.ts new file mode 100644 index 0000000000..533e7c36ed --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace-split-view.element.ts @@ -0,0 +1,87 @@ +import { UMB_DOCUMENT_BLUEPRINT_WORKSPACE_CONTEXT } from './document-blueprint-workspace.context-token.js'; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; +import { css, html, nothing, customElement, state, repeat } from '@umbraco-cms/backoffice/external/lit'; +import type { ActiveVariant } from '@umbraco-cms/backoffice/workspace'; +import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; + +@customElement('umb-document-blueprint-workspace-split-view') +export class UmbDocumentBlueprintWorkspaceSplitViewElement extends UmbLitElement { + // TODO: Refactor: use the split view context token: + private _workspaceContext?: typeof UMB_DOCUMENT_BLUEPRINT_WORKSPACE_CONTEXT.TYPE; + + @state() + _variants?: Array; + + constructor() { + super(); + + // TODO: Refactor: use a split view workspace context token: + this.consumeContext(UMB_DOCUMENT_BLUEPRINT_WORKSPACE_CONTEXT, (context) => { + this._workspaceContext = context; + this._observeActiveVariantInfo(); + }); + } + + private _observeActiveVariantInfo() { + if (!this._workspaceContext) return; + this.observe( + this._workspaceContext.splitView.activeVariantsInfo, + (variants) => { + this._variants = variants; + }, + '_observeActiveVariantsInfo', + ); + } + + render() { + return this._variants + ? html`
+ ${repeat( + this._variants, + (view) => + view.index + '_' + (view.culture ?? '') + '_' + (view.segment ?? '') + '_' + this._variants!.length, + (view) => html` + + `, + )} +
+ + ` + : nothing; + } + + static styles = [ + UmbTextStyles, + css` + :host { + width: 100%; + height: 100%; + + display: flex; + flex: 1; + flex-direction: column; + } + + #splitViews { + display: flex; + width: 100%; + height: calc(100% - var(--umb-footer-layout-height)); + } + + #breadcrumbs { + margin: 0 var(--uui-size-layout-1); + } + `, + ]; +} + +export default UmbDocumentBlueprintWorkspaceSplitViewElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-document-blueprint-workspace-split-view': UmbDocumentBlueprintWorkspaceSplitViewElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.context-token.ts new file mode 100644 index 0000000000..0bf889c505 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.context-token.ts @@ -0,0 +1,14 @@ +import { UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE } from '../entity.js'; +import type { UmbDocumentBlueprintWorkspaceContext } from './document-blueprint-workspace.context.js'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; +import type { UmbSaveableWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; + +export const UMB_DOCUMENT_BLUEPRINT_WORKSPACE_CONTEXT = new UmbContextToken< + UmbSaveableWorkspaceContextInterface, + UmbDocumentBlueprintWorkspaceContext +>( + 'UmbWorkspaceBlueprintContext', + undefined, + (context): context is UmbDocumentBlueprintWorkspaceContext => + context.getEntityType?.() === UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, +); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.context.ts new file mode 100644 index 0000000000..a0279b8906 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.context.ts @@ -0,0 +1,503 @@ +import { UmbDocumentPropertyDataContext } from '../../documents/property-dataset-context/document-property-dataset-context.js'; +import { UmbDocumentTypeDetailRepository } from '../../document-types/repository/detail/document-type-detail.repository.js'; +import { UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE } from '../entity.js'; +import { UmbDocumentBlueprintDetailRepository } from '../repository/index.js'; +import type { + UmbDocumentBlueprintDetailModel, + UmbDocumentBlueprintValueModel, + UmbDocumentBlueprintVariantModel, + UmbDocumentBlueprintVariantOptionModel, +} from '../types.js'; +//import { umbPickDocumentVariantModal, type UmbDocumentBlueprintVariantPickerModalType } from '../modals/index.js'; +import { UMB_DOCUMENT_BLUEPRINT_ROOT_WORKSPACE_ALIAS } from './manifests.js'; +import { UMB_INVARIANT_CULTURE, UmbVariantId } from '@umbraco-cms/backoffice/variant'; +import { UmbContentTypePropertyStructureManager } from '@umbraco-cms/backoffice/content-type'; +import { + UmbEditableWorkspaceContextBase, + UmbWorkspaceSplitViewManager, + type UmbVariantableWorkspaceContextInterface, +} from '@umbraco-cms/backoffice/workspace'; +import { + appendToFrozenArray, + mergeObservables, + jsonStringComparison, + UmbArrayState, + UmbObjectState, +} from '@umbraco-cms/backoffice/observable-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { UmbLanguageCollectionRepository, type UmbLanguageDetailModel } from '@umbraco-cms/backoffice/language'; +import { type Observable, firstValueFrom } from '@umbraco-cms/backoffice/external/rxjs'; +import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; +import { UmbReloadTreeItemChildrenRequestEntityActionEvent } from '@umbraco-cms/backoffice/tree'; +import { UmbRequestReloadStructureForEntityEvent } from '@umbraco-cms/backoffice/event'; + +type EntityType = UmbDocumentBlueprintDetailModel; +export class UmbDocumentBlueprintWorkspaceContext + extends UmbEditableWorkspaceContextBase + implements UmbVariantableWorkspaceContextInterface +{ + // + public readonly repository = new UmbDocumentBlueprintDetailRepository(this); + + #parent?: { entityType: string; unique: string | null }; + + /** + * The document is the current state/draft version of the document. + */ + #persistedData = new UmbObjectState(undefined); + #currentData = new UmbObjectState(undefined); + #getDataPromise?: Promise; + // TODo: Optimize this so it uses either a App Language Context? [NL] + #languageRepository = new UmbLanguageCollectionRepository(this); + #languages = new UmbArrayState([], (x) => x.unique); + public readonly languages = this.#languages.asObservable(); + + public isLoaded() { + return this.#getDataPromise; + } + + readonly unique = this.#currentData.asObservablePart((data) => data?.unique); + + readonly contentTypeUnique = this.#currentData.asObservablePart((data) => data?.documentType.unique); + readonly contentTypeHasCollection = this.#currentData.asObservablePart((data) => !!data?.documentType.collection); + readonly variants = this.#currentData.asObservablePart((data) => data?.variants ?? []); + + readonly urls = this.#currentData.asObservablePart((data) => data?.urls || []); + readonly templateId = this.#currentData.asObservablePart((data) => data?.template?.unique || null); + + readonly structure = new UmbContentTypePropertyStructureManager(this, new UmbDocumentTypeDetailRepository(this)); + readonly variesByCulture = this.structure.ownerContentTypePart((x) => x?.variesByCulture); + //#variesByCulture?: boolean; + readonly variesBySegment = this.structure.ownerContentTypePart((x) => x?.variesBySegment); + //#variesBySegment?: boolean; + readonly varies = this.structure.ownerContentTypePart((x) => + x ? x.variesByCulture || x.variesBySegment : undefined, + ); + #varies?: boolean; + + readonly splitView = new UmbWorkspaceSplitViewManager(); + + readonly variantOptions = mergeObservables( + [this.varies, this.variants, this.languages], + ([varies, variants, languages]) => { + // TODO: When including segments, when be aware about the case of segment varying when not culture varying. [NL] + if (varies === true) { + return languages.map((language) => { + return { + variant: variants.find((x) => x.culture === language.unique), + language, + // TODO: When including segments, this object should be updated to include a object for the segment. [NL] + // TODO: When including segments, the unique should be updated to include the segment as well. [NL] + unique: language.unique, // This must be a variantId string! + culture: language.unique, + segment: null, + } as UmbDocumentBlueprintVariantOptionModel; + }); + } else if (varies === false) { + return [ + { + variant: variants.find((x) => x.culture === null), + language: languages.find((x) => x.isDefault), + culture: null, + segment: null, + unique: UMB_INVARIANT_CULTURE, // This must be a variantId string! + } as UmbDocumentBlueprintVariantOptionModel, + ]; + } + return [] as Array; + }, + ); + + constructor(host: UmbControllerHost) { + super(host, UMB_DOCUMENT_BLUEPRINT_ROOT_WORKSPACE_ALIAS); + + this.observe(this.contentTypeUnique, (unique) => this.structure.loadType(unique)); + this.observe(this.varies, (varies) => (this.#varies = varies)); + + this.loadLanguages(); + } + + resetState() { + super.resetState(); + this.#persistedData.setValue(undefined); + this.#currentData.setValue(undefined); + } + + async loadLanguages() { + // TODO: If we don't end up having a Global Context for languages, then we should at least change this into using a asObservable which should be returned from the repository. [Nl] + const { data } = await this.#languageRepository.requestCollection({}); + this.#languages.setValue(data?.items ?? []); + } + + async load(unique: string) { + console.log('load'); + this.resetState(); + this.#getDataPromise = this.repository.requestByUnique(unique); + const { data } = await this.#getDataPromise; + if (!data) return undefined; + + this.setIsNew(false); + this.#persistedData.setValue(data); + this.#currentData.setValue(data); + return data || undefined; + } + + async create(parent: { entityType: string; unique: string | null }, documentTypeUnique: string) { + this.resetState(); + this.#parent = parent; + this.#getDataPromise = this.repository.createScaffold({ + documentType: { + unique: documentTypeUnique, + collection: null, + }, + }); + const { data } = await this.#getDataPromise; + if (!data) return undefined; + + this.setIsNew(true); + this.#persistedData.setValue(undefined); + this.#currentData.setValue(data); + return data; + } + + getData() { + return this.#currentData.getValue(); + } + + getUnique() { + return this.getData()?.unique; + } + + getEntityType() { + return UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE; + } + + getContentTypeId() { + return this.getData()?.documentType.unique; + } + + // TODO: Check if this is used: + getVaries() { + return this.#varies; + } + /* + getVariesByCulture() { + return this.#variesByCulture; + } + getVariesBySegment() { + return this.#variesBySegment; + }*/ + + variantById(variantId: UmbVariantId) { + return this.#currentData.asObservablePart((data) => data?.variants?.find((x) => variantId.compare(x))); + } + + getVariant(variantId: UmbVariantId) { + return this.#currentData.getValue()?.variants?.find((x) => variantId.compare(x)); + } + + getName(variantId?: UmbVariantId) { + const variants = this.#currentData.getValue()?.variants; + if (!variants) return; + if (variantId) { + return variants.find((x) => variantId.compare(x))?.name; + } else { + return variants[0]?.name; + } + } + + setName(name: string, variantId?: UmbVariantId) { + /* + const oldVariants = this.#currentData.getValue()?.variants || []; + const variants = partialUpdateFrozenArray( + oldVariants, + { name }, + variantId ? (x) => variantId.compare(x) : () => true, + ); + this.#currentData.update({ variants }); + */ + // TODO: We should move this type of logic to the act of saving [NL] + this.#updateVariantData(variantId ?? UmbVariantId.CreateInvariant(), { name }); + } + + setTemplate(templateUnique: string) { + this.#currentData.update({ template: { unique: templateUnique } }); + } + + async propertyStructureById(propertyId: string) { + return this.structure.propertyStructureById(propertyId); + } + + async propertyValueByAlias( + propertyAlias: string, + variantId?: UmbVariantId, + ): Promise | undefined> { + return this.#currentData.asObservablePart( + (data) => + data?.values?.find((x) => x?.alias === propertyAlias && (variantId ? variantId.compare(x) : true)) + ?.value as PropertyValueType, + ); + } + + /** + * Get the current value of the property with the given alias and variantId. + * @param alias + * @param variantId + * @returns The value or undefined if not set or found. + */ + getPropertyValue(alias: string, variantId?: UmbVariantId) { + const currentData = this.getData(); + if (currentData) { + const newDataSet = currentData.values?.find( + (x) => x.alias === alias && (variantId ? variantId.compare(x) : true), + ); + return newDataSet?.value as ReturnType; + } + return undefined; + } + async setPropertyValue(alias: string, value: ValueType, variantId?: UmbVariantId) { + variantId ??= UmbVariantId.CreateInvariant(); + + const entry = { ...variantId.toObject(), alias, value } as UmbDocumentBlueprintValueModel; + const currentData = this.getData(); + if (currentData) { + const values = appendToFrozenArray( + currentData.values ?? [], + entry, + (x) => x.alias === alias && variantId!.compare(x), + ); + this.#currentData.update({ values }); + + // TODO: We should move this type of logic to the act of saving [NL] + this.#updateVariantData(variantId); + } + } + + #calculateChangedVariants() { + const persisted = this.#persistedData.getValue(); + const current = this.#currentData.getValue(); + if (!current) throw new Error('Current data is missing'); + + const changedVariants = current?.variants.map((variant) => { + const persistedVariant = persisted?.variants.find((x) => UmbVariantId.Create(variant).compare(x)); + return { + culture: variant.culture, + segment: variant.segment, + equal: persistedVariant ? jsonStringComparison(variant, persistedVariant) : false, + }; + }); + + const changedProperties = current?.values.map((value) => { + const persistedValues = persisted?.values.find((x) => UmbVariantId.Create(value).compare(x)); + return { + culture: value.culture, + segment: value.segment, + equal: persistedValues ? jsonStringComparison(value, persistedValues) : false, + }; + }); + + // calculate the variantIds of those who either have a change in properties or in variants: + return ( + changedVariants + ?.concat(changedProperties ?? []) + .filter((x) => x.equal === false) + .map((x) => new UmbVariantId(x.culture, x.segment)) ?? [] + ); + } + + #updateVariantData(variantId: UmbVariantId, update?: Partial) { + const currentData = this.getData(); + if (!currentData) throw new Error('Data is missing'); + if (this.#varies === true) { + // If variant Id is invariant, we don't to have the variant appended to our data. + if (variantId.isInvariant()) return; + const variant = currentData.variants.find((x) => variantId.compare(x)); + const newVariants = appendToFrozenArray( + currentData.variants, + { + state: null, + name: '', + publishDate: null, + createDate: null, + updateDate: null, + ...variantId.toObject(), + ...variant, + ...update, + }, + (x) => variantId.compare(x), + ); + this.#currentData.update({ variants: newVariants }); + } else if (this.#varies === false) { + // TODO: Beware about segments, in this case we need to also consider segments, if its allowed to vary by segments. + const invariantVariantId = UmbVariantId.CreateInvariant(); + const variant = currentData.variants.find((x) => invariantVariantId.compare(x)); + // Cause we are invariant, we will just overwrite all variants with this one: + const newVariants = [ + { + state: null, + name: '', + publishDate: null, + createDate: null, + updateDate: null, + ...invariantVariantId.toObject(), + ...variant, + ...update, + }, + ]; + this.#currentData.update({ variants: newVariants }); + } else { + throw new Error('Varies by culture is missing'); + } + } + /* + async #runUserFlorFor(type: UmbDocumentBlueprintVariantPickerModalType): Promise { + const activeVariants = this.splitView.getActiveVariants(); + + const activeVariantIds = activeVariants.map((activeVariant) => UmbVariantId.Create(activeVariant)); + // TODO: We need to filter the selected array, so it only contains one of each variantId. [NL] + const changedVariantIds = this.#calculateChangedVariants(); + const selected = activeVariantIds.concat(changedVariantIds); + // Selected can contain entries that are not part of the options, therefor the modal filters selection based on options. + + const options = await firstValueFrom(this.variantOptions); + + // If there is only one variant, we don't need to open the modal. + if (options.length === 0) { + throw new Error('No variants are available'); + } else if (options.length === 1) { + // If only one option we will skip ahead and save the document with the only variant available: + const firstVariant = UmbVariantId.Create(options[0]); + return this.#performSaveOrCreate([firstVariant]); + } + + const selectedVariants = await umbPickDocumentVariantModal(this, { type, options, selected }); + + // If no variants are selected, we don't save anything. + if (!selectedVariants.length) return []; + + return this.#performSaveOrCreate(selectedVariants); + } + */ + + #buildSaveData(selectedVariants: Array): UmbDocumentBlueprintDetailModel { + const data = this.getData(); + if (!data) throw new Error('Data is missing'); + if (!data.unique) throw new Error('Unique is missing'); + const invariantVariantId = UmbVariantId.CreateInvariant(); + if (this.#varies === false) { + // If we do not vary, we wil just do this for the invariant variant id. + selectedVariants = [invariantVariantId]; + } + + const persistedData = this.#persistedData.getValue(); + + const variantIdsToParseForValues = [...selectedVariants]; + if (this.#varies === true) { + // If we vary then We need to include the invariant variant id for invariant values to be saved, as we always want to save the invariant values. + variantIdsToParseForValues.push(invariantVariantId); + } + + // Combine data and persisted data depending on the selectedVariants. Always use the invariant values from the data. + // loops over each entry in values, determine wether the value should be from the data or the persisted data, depending on wether its a selectedVariant or an invariant value. + // loops over each entry in variants, determine wether the variant should be from the data or the persisted data, depending on the selectedVariants. + return { + ...data, + values: data.values + .map((value) => { + // Should this value be saved? + if (variantIdsToParseForValues.some((x) => x.compare(value))) { + return value; + } else { + // If not we will find the value in the persisted data and use that instead. + return persistedData?.values.find( + (x) => x.alias === value.alias && x.culture === value.culture && x.segment === value.segment, + ); + } + }) + .filter((x) => x !== undefined) as Array>, + variants: data.variants + .map((variant) => { + // Should this value be saved? + if (selectedVariants.some((x) => x.compare(variant))) { + return variant; + } else { + // If not we will find the value in the persisted data and use that instead. + return persistedData?.variants.find((x) => x.culture === variant.culture && x.segment === variant.segment); + } + }) + .filter((x) => x !== undefined) as Array, + }; + } + + async #performSaveOrCreate(selectedVariants: Array) { + const saveData = this.#buildSaveData(selectedVariants); + + if (this.getIsNew()) { + if (!this.#parent) throw new Error('Parent is not set'); + + const { data: create, error } = await this.repository.create(saveData, this.#parent.unique); + if (!create || error) { + console.error('Error creating document', error); + throw new Error('Error creating document'); + } + + this.setIsNew(false); + + // TODO: this might not be the right place to alert the tree, but it works for now + const eventContext = await this.getContext(UMB_ACTION_EVENT_CONTEXT); + const event = new UmbReloadTreeItemChildrenRequestEntityActionEvent({ + entityType: this.#parent.entityType, + unique: this.#parent.unique, + }); + eventContext.dispatchEvent(event); + } else { + const { data: save, error } = await this.repository.save(saveData); + if (!save || error) { + console.error('Error saving document', error); + throw new Error('Error saving document'); + } + + const actionEventContext = await this.getContext(UMB_ACTION_EVENT_CONTEXT); + const event = new UmbRequestReloadStructureForEntityEvent({ + unique: this.getUnique()!, + entityType: this.getEntityType(), + }); + + actionEventContext.dispatchEvent(event); + } + + return selectedVariants; + } + + async save() { + //await this.#runUserFlorFor('save'); + const data = this.getData(); + if (!data) throw new Error('Data is missing'); + + this.#persistedData.setValue(data); + this.#currentData.setValue(data); + + this.workspaceComplete(data); + } + + async delete() { + const id = this.getUnique(); + if (id) { + await this.repository.delete(id); + } + } + + public createPropertyDatasetContext(host: UmbControllerHost, variantId: UmbVariantId) { + return new UmbDocumentPropertyDataContext(host, this as any, variantId); + } + + public destroy(): void { + this.#persistedData.destroy(); + this.#currentData.destroy(); + this.structure.destroy(); + this.#languageRepository.destroy(); + super.destroy(); + } +} + +export default UmbDocumentBlueprintWorkspaceContext; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.element.ts new file mode 100644 index 0000000000..495489dfe9 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.element.ts @@ -0,0 +1,87 @@ +import type { UmbDocumentBlueprintWorkspaceContext } from './document-blueprint-workspace.context.js'; +import { UmbDocumentBlueprintWorkspaceEditorElement } from './document-blueprint-workspace-editor.element.js'; +import { UmbDocumentBlueprintRootWorkspaceElement } from './document-blueprint-root-workspace.element.js'; +import { html, customElement, css, state } from '@umbraco-cms/backoffice/external/lit'; +import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; +import { type UmbApi, createExtensionApi, UmbExtensionsApiInitializer } from '@umbraco-cms/backoffice/extension-api'; +import { umbExtensionsRegistry, type ManifestWorkspace } from '@umbraco-cms/backoffice/extension-registry'; + +import type { UmbRoute } from '@umbraco-cms/backoffice/router'; +import { UmbWorkspaceIsNewRedirectController } from '@umbraco-cms/backoffice/workspace'; + +@customElement('umb-document-blueprint-workspace') +export class UmbDocumentBlueprintWorkspaceElement extends UmbLitElement { + #workspaceContext?: UmbDocumentBlueprintWorkspaceContext; + #editorElement = () => new UmbDocumentBlueprintWorkspaceEditorElement(); + #rootElement = () => new UmbDocumentBlueprintRootWorkspaceElement(); + + @state() + _routes: UmbRoute[] = []; + + public set manifest(manifest: ManifestWorkspace) { + createExtensionApi(this, manifest).then((context) => { + if (context) { + this.#gotWorkspaceContext(context); + } + }); + } + + #gotWorkspaceContext(context: UmbApi) { + this.#workspaceContext = context as UmbDocumentBlueprintWorkspaceContext; + + this._routes = [ + { + path: 'create/parent/:entityType/:parentUnique/:documentTypeUnique', + component: this.#editorElement, + setup: async (_component, info) => { + // TODO: Remember the perspective of permissions here, we need to check if the user has access to create a document of this type under this parent? + const parentEntityType = info.match.params.entityType; + const parentUnique = info.match.params.parentUnique === 'null' ? null : info.match.params.parentUnique; + const documentTypeUnique = info.match.params.documentTypeUnique; + this.#workspaceContext!.create({ entityType: parentEntityType, unique: parentUnique }, documentTypeUnique); + + new UmbWorkspaceIsNewRedirectController( + this, + this.#workspaceContext!, + this.shadowRoot!.querySelector('umb-router-slot')!, + ); + }, + }, + { + path: 'edit/null', + component: this.#rootElement, + }, + { + path: 'edit/:unique', + component: this.#editorElement, + setup: (_component, info) => { + const unique = info.match.params.unique; + this.#workspaceContext!.load(unique); + }, + }, + ]; + + // TODO: We need to recreate when ID changed? + new UmbExtensionsApiInitializer(this, umbExtensionsRegistry, 'workspaceContext', [this, this.#workspaceContext]); + } + + render() { + return html``; + } + + static styles = [ + css` + #wrapper { + margin: var(--uui-size-layout-1); + } + `, + ]; +} + +export default UmbDocumentBlueprintWorkspaceElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-document-blueprint-workspace': UmbDocumentBlueprintWorkspaceElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/index.ts new file mode 100644 index 0000000000..22a5c8eeab --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/index.ts @@ -0,0 +1 @@ +export * from './document-blueprint-workspace.context-token.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/manifests.ts index 9d79e676fe..a93f324175 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/manifests.ts @@ -8,7 +8,7 @@ const workspace: ManifestWorkspace = { type: 'workspace', alias: UMB_DOCUMENT_BLUEPRINT_ROOT_WORKSPACE_ALIAS, name: 'Document Blueprint Root Workspace', - element: () => import('./document-blueprint-root-workspace.element.js'), + js: () => import('./document-blueprint-workspace.element.js'), meta: { entityType: UMB_DOCUMENT_BLUEPRINT_ROOT_ENTITY_TYPE, }, From f5287d499702ed48712ee9d2efcc65e20aea9238 Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Mon, 18 Mar 2024 11:21:18 +0100 Subject: [PATCH 008/280] comment-out folder repos for now --- .../entity-actions/manifests.ts | 15 +- .../menu-item/manifests.ts | 6 +- .../document-blueprint-folder.repository.ts | 16 +- ...ent-blueprint-folder.server.data-source.ts | 210 +++++++++--------- .../document-blueprints/tree/folder/index.ts | 4 +- .../tree/folder/manifests.ts | 66 +++--- .../document-blueprints/tree/folder/types.ts | 10 +- .../document-blueprints/tree/index.ts | 2 +- .../document-blueprints/tree/manifests.ts | 8 +- .../document-blueprint-workspace.element.ts | 2 + 10 files changed, 168 insertions(+), 171 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/manifests.ts index 2580b43adf..c2a0771aa1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/manifests.ts @@ -1,12 +1,8 @@ -/*import { +import { UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, UMB_DOCUMENT_BLUEPRINT_ROOT_ENTITY_TYPE } from '../entity.js'; +import { UMB_DOCUMENT_BLUEPRINT_DETAIL_REPOSITORY_ALIAS, UMB_DOCUMENT_BLUEPRINT_ITEM_REPOSITORY_ALIAS, -} from '../repository/index.js';*/ -import { - UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, - UMB_DOCUMENT_BLUEPRINT_ROOT_ENTITY_TYPE, - UMB_DOCUMENT_BLUEPRINT_ITEM_ENTITY_TYPE, -} from '../entity.js'; +} from '../index.js'; import { UmbCreateEntityAction } from './create/create.action.js'; import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; @@ -34,19 +30,18 @@ const entityActions: Array = [ icon: 'icon-add', label: 'Create', }, - } /* + }, { type: 'entityAction', kind: 'delete', alias: 'Umb.EntityAction.DocumentBlueprintItem.Delete', name: 'Delete Document Blueprint Item Entity Action', - forEntityTypes: [UMB_DOCUMENT_BLUEPRINT_ITEM_ENTITY_TYPE], + forEntityTypes: [UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE], meta: { detailRepositoryAlias: UMB_DOCUMENT_BLUEPRINT_DETAIL_REPOSITORY_ALIAS, itemRepositoryAlias: UMB_DOCUMENT_BLUEPRINT_ITEM_REPOSITORY_ALIAS, }, }, - */, ]; export const manifests = [...entityActions]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/menu-item/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/menu-item/manifests.ts index cbddb145af..18e64cab86 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/menu-item/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/menu-item/manifests.ts @@ -1,4 +1,4 @@ -import { UMB_DOCUMENT_BLUEPRINT_ROOT_ENTITY_TYPE } from '../entity.js'; +import { UMB_DOCUMENT_BLUEPRINT_TREE_ALIAS } from '../tree/manifests.js'; import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; const menuItem: ManifestTypes = { @@ -8,10 +8,8 @@ const menuItem: ManifestTypes = { name: 'Document Blueprints Menu Item', weight: 100, meta: { - treeAlias: 'Umb.Tree.DocumentBlueprint', + treeAlias: UMB_DOCUMENT_BLUEPRINT_TREE_ALIAS, label: 'Document Blueprints', - icon: 'icon-blueprint', - entityType: UMB_DOCUMENT_BLUEPRINT_ROOT_ENTITY_TYPE, menus: ['Umb.Menu.Settings'], }, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/document-blueprint-folder.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/document-blueprint-folder.repository.ts index 4510666a59..1031ebc6ed 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/document-blueprint-folder.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/document-blueprint-folder.repository.ts @@ -1,9 +1,9 @@ -import { UmbDocumentBlueprintFolderServerDataSource } from './document-blueprint-folder.server.data-source.js'; -import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import { UmbFolderRepositoryBase } from '@umbraco-cms/backoffice/tree'; +// import { UmbDocumentBlueprintFolderServerDataSource } from './document-blueprint-folder.server.data-source.js'; +// import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +// import { UmbFolderRepositoryBase } from '@umbraco-cms/backoffice/tree'; -export class UmbDocumentBlueprintFolderRepository extends UmbFolderRepositoryBase { - constructor(host: UmbControllerHost) { - super(host, UmbDocumentBlueprintFolderServerDataSource); - } -} +// export class UmbDocumentBlueprintFolderRepository extends UmbFolderRepositoryBase { +// constructor(host: UmbControllerHost) { +// super(host, UmbDocumentBlueprintFolderServerDataSource); +// } +// } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/document-blueprint-folder.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/document-blueprint-folder.server.data-source.ts index a3dd268887..993af8fcea 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/document-blueprint-folder.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/document-blueprint-folder.server.data-source.ts @@ -1,122 +1,122 @@ -import type { UmbCreateFolderModel, UmbFolderDataSource, UmbUpdateFolderModel } from '@umbraco-cms/backoffice/tree'; -import { DocumentBlueprintResource } from '@umbraco-cms/backoffice/external/backend-api'; -import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; +// import type { UmbCreateFolderModel, UmbFolderDataSource, UmbUpdateFolderModel } from '@umbraco-cms/backoffice/tree'; +// import { DocumentBlueprintResource } from '@umbraco-cms/backoffice/external/backend-api'; +// import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +// import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; -/** - * A data source for a Document Blueprint folder that fetches data from the server - * @export - * @class UmbDocumentBlueprintFolderServerDataSource - * @implements {RepositoryDetailDataSource} - */ -export class UmbDocumentBlueprintFolderServerDataSource implements UmbFolderDataSource { - #host: UmbControllerHost; +// /** +// * A data source for a Document Blueprint folder that fetches data from the server +// * @export +// * @class UmbDocumentBlueprintFolderServerDataSource +// * @implements {RepositoryDetailDataSource} +// */ +// export class UmbDocumentBlueprintFolderServerDataSource implements UmbFolderDataSource { +// #host: UmbControllerHost; - /** - * Creates an instance of UmbDocumentBlueprintFolderServerDataSource. - * @param {UmbControllerHost} host - * @memberof UmbDocumentBlueprintFolderServerDataSource - */ - constructor(host: UmbControllerHost) { - this.#host = host; - } +// /** +// * Creates an instance of UmbDocumentBlueprintFolderServerDataSource. +// * @param {UmbControllerHost} host +// * @memberof UmbDocumentBlueprintFolderServerDataSource +// */ +// constructor(host: UmbControllerHost) { +// this.#host = host; +// } - /** - * Fetches a Document Blueprint folder from the server - * @param {string} unique - * @return {*} - * @memberof UmbDocumentBlueprintFolderServerDataSource - */ - async read(unique: string) { - if (!unique) throw new Error('Unique is missing'); +// /** +// * Fetches a Document Blueprint folder from the server +// * @param {string} unique +// * @return {*} +// * @memberof UmbDocumentBlueprintFolderServerDataSource +// */ +// async read(unique: string) { +// if (!unique) throw new Error('Unique is missing'); - const { data, error } = await tryExecuteAndNotify( - this.#host, - DocumentBlueprintResource.getDocumentBlueprintFolderById({ - id: unique, - }), - ); +// const { data, error } = await tryExecuteAndNotify( +// this.#host, +// DocumentBlueprintResource.getDocumentBlueprintFolderById({ +// id: unique, +// }), +// ); - if (data) { - const mappedData = { - unique: data.id, - name: data.name, - }; +// if (data) { +// const mappedData = { +// unique: data.id, +// name: data.name, +// }; - return { data: mappedData }; - } +// return { data: mappedData }; +// } - return { error }; - } +// return { error }; +// } - /** - * Creates a Document Blueprint folder on the server - * @param {UmbCreateFolderModel} args - * @return {*} - * @memberof UmbDocumentBlueprintFolderServerDataSource - */ - async create(args: UmbCreateFolderModel) { - if (args.parentUnique === undefined) throw new Error('Parent unique is missing'); - if (!args.name) throw new Error('Name is missing'); +// /** +// * Creates a Document Blueprint folder on the server +// * @param {UmbCreateFolderModel} args +// * @return {*} +// * @memberof UmbDocumentBlueprintFolderServerDataSource +// */ +// async create(args: UmbCreateFolderModel) { +// if (args.parentUnique === undefined) throw new Error('Parent unique is missing'); +// if (!args.name) throw new Error('Name is missing'); - const requestBody = { - id: args.unique, - parent: args.parentUnique ? { id: args.parentUnique } : null, - name: args.name, - }; +// const requestBody = { +// id: args.unique, +// parent: args.parentUnique ? { id: args.parentUnique } : null, +// name: args.name, +// }; - const { error } = await tryExecuteAndNotify( - this.#host, - DocumentBlueprintResource.postDocumentBlueprintFolder({ - requestBody, - }), - ); +// const { error } = await tryExecuteAndNotify( +// this.#host, +// DocumentBlueprintResource.postDocumentBlueprintFolder({ +// requestBody, +// }), +// ); - if (!error) { - return this.read(args.unique); - } +// if (!error) { +// return this.read(args.unique); +// } - return { error }; - } +// return { error }; +// } - /** - * Updates a Document Blueprint folder on the server - * @param {UmbUpdateFolderModel} args - * @return {*} - * @memberof UmbDocumentBlueprintFolderServerDataSource - */ - async update(args: UmbUpdateFolderModel) { - if (!args.unique) throw new Error('Unique is missing'); - if (!args.name) throw new Error('Folder name is missing'); +// /** +// * Updates a Document Blueprint folder on the server +// * @param {UmbUpdateFolderModel} args +// * @return {*} +// * @memberof UmbDocumentBlueprintFolderServerDataSource +// */ +// async update(args: UmbUpdateFolderModel) { +// if (!args.unique) throw new Error('Unique is missing'); +// if (!args.name) throw new Error('Folder name is missing'); - const { error } = await tryExecuteAndNotify( - this.#host, - DocumentBlueprintResource.putDocumentBlueprintFolderById({ - id: args.unique, - requestBody: { name: args.name }, - }), - ); +// const { error } = await tryExecuteAndNotify( +// this.#host, +// DocumentBlueprintResource.putDocumentBlueprintFolderById({ +// id: args.unique, +// requestBody: { name: args.name }, +// }), +// ); - if (!error) { - return this.read(args.unique); - } +// if (!error) { +// return this.read(args.unique); +// } - return { error }; - } +// return { error }; +// } - /** - * Deletes a Document Blueprint folder on the server - * @param {string} unique - * @return {*} - * @memberof UmbDocumentBlueprintServerDataSource - */ - async delete(unique: string) { - if (!unique) throw new Error('Unique is missing'); - return tryExecuteAndNotify( - this.#host, - DocumentBlueprintResource.deleteDocumentBlueprintFolderById({ - id: unique, - }), - ); - } -} +// /** +// * Deletes a Document Blueprint folder on the server +// * @param {string} unique +// * @return {*} +// * @memberof UmbDocumentBlueprintServerDataSource +// */ +// async delete(unique: string) { +// if (!unique) throw new Error('Unique is missing'); +// return tryExecuteAndNotify( +// this.#host, +// DocumentBlueprintResource.deleteDocumentBlueprintFolderById({ +// id: unique, +// }), +// ); +// } +// } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/index.ts index 29904de469..c0cde243d3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/index.ts @@ -1,2 +1,2 @@ -export { UmbDocumentBlueprintFolderRepository } from './document-blueprint-folder.repository.js'; -export { UMB_DOCUMENT_BLUEPRINT_FOLDER_REPOSITORY_ALIAS } from './manifests.js'; +// export { UmbDocumentBlueprintFolderRepository } from './document-blueprint-folder.repository.js'; +// export { UMB_DOCUMENT_BLUEPRINT_FOLDER_REPOSITORY_ALIAS } from './manifests.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/manifests.ts index 9eef583220..90635572ee 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/manifests.ts @@ -1,37 +1,37 @@ -import { UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE } from '../../entity.js'; -import { UmbDocumentBlueprintFolderRepository } from './document-blueprint-folder.repository.js'; -import type { ManifestRepository, ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; +// import { UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE } from '../../entity.js'; +// import { UmbDocumentBlueprintFolderRepository } from './document-blueprint-folder.repository.js'; +// import type { ManifestRepository, ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; -export const UMB_DOCUMENT_BLUEPRINT_FOLDER_REPOSITORY_ALIAS = 'Umb.Repository.DocumentBlueprint.Folder'; +// export const UMB_DOCUMENT_BLUEPRINT_FOLDER_REPOSITORY_ALIAS = 'Umb.Repository.DocumentBlueprint.Folder'; -const folderRepository: ManifestRepository = { - type: 'repository', - alias: UMB_DOCUMENT_BLUEPRINT_FOLDER_REPOSITORY_ALIAS, - name: 'Document Blueprint Folder Repository', - api: UmbDocumentBlueprintFolderRepository, -}; +// const folderRepository: ManifestRepository = { +// type: 'repository', +// alias: UMB_DOCUMENT_BLUEPRINT_FOLDER_REPOSITORY_ALIAS, +// name: 'Document Blueprint Folder Repository', +// api: UmbDocumentBlueprintFolderRepository, +// }; -const entityActions: Array = [ - { - type: 'entityAction', - kind: 'folderUpdate', - alias: 'Umb.EntityAction.DocumentBlueprint.Folder.Rename', - name: 'Rename Document Blueprint Folder Entity Action', - forEntityTypes: [UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE], - meta: { - folderRepositoryAlias: UMB_DOCUMENT_BLUEPRINT_FOLDER_REPOSITORY_ALIAS, - }, - }, - { - type: 'entityAction', - kind: 'folderDelete', - alias: 'Umb.EntityAction.DocumentBlueprint.Folder.Delete', - name: 'Delete Document Blueprint Folder Entity Action', - forEntityTypes: [UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE], - meta: { - folderRepositoryAlias: UMB_DOCUMENT_BLUEPRINT_FOLDER_REPOSITORY_ALIAS, - }, - }, -]; +// const entityActions: Array = [ +// { +// type: 'entityAction', +// kind: 'folderUpdate', +// alias: 'Umb.EntityAction.DocumentBlueprint.Folder.Rename', +// name: 'Rename Document Blueprint Folder Entity Action', +// forEntityTypes: [UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE], +// meta: { +// folderRepositoryAlias: UMB_DOCUMENT_BLUEPRINT_FOLDER_REPOSITORY_ALIAS, +// }, +// }, +// { +// type: 'entityAction', +// kind: 'folderDelete', +// alias: 'Umb.EntityAction.DocumentBlueprint.Folder.Delete', +// name: 'Delete Document Blueprint Folder Entity Action', +// forEntityTypes: [UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE], +// meta: { +// folderRepositoryAlias: UMB_DOCUMENT_BLUEPRINT_FOLDER_REPOSITORY_ALIAS, +// }, +// }, +// ]; -export const manifests = [folderRepository, ...entityActions]; +// export const manifests = [folderRepository, ...entityActions]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/types.ts index dd70703d94..e29ea4ff3b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/folder/types.ts @@ -1,6 +1,6 @@ -import type { UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE } from '../../entity.js'; -import type { UmbDocumentBlueprintTreeItemModel } from '../types.js'; +// import type { UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE } from '../../entity.js'; +// import type { UmbDocumentBlueprintTreeItemModel } from '../types.js'; -export interface UmbDocumentBlueprintFolderTreeItemModel extends UmbDocumentBlueprintTreeItemModel { - entityType: typeof UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE; -} +// export interface UmbDocumentBlueprintFolderTreeItemModel extends UmbDocumentBlueprintTreeItemModel { +// entityType: typeof UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE; +// } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/index.ts index f098c0956c..9f2a67da2f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/index.ts @@ -1,2 +1,2 @@ export { UMB_DOCUMENT_BLUEPRINT_TREE_STORE_CONTEXT } from './document-blueprint-tree.store.js'; -export * from './folder/index.js'; +//export * from './folder/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/manifests.ts index f69949127f..6a413d7177 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/manifests.ts @@ -3,7 +3,7 @@ import { UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE, UMB_DOCUMENT_BLUEPRINT_ROOT_ENTITY_TYPE, } from '../entity.js'; -import { manifests as folderManifests } from './folder/manifests.js'; +//import { manifests as folderManifests } from './folder/manifests.js'; import { manifests as reloadManifests } from './reload-tree-item-children/manifests.js'; import { UmbDocumentBlueprintTreeRepository } from './document-blueprint-tree.repository.js'; import { UmbDocumentBlueprintTreeStore } from './document-blueprint-tree.store.js'; @@ -16,6 +16,7 @@ import type { export const UMB_DOCUMENT_BLUEPRINT_TREE_REPOSITORY_ALIAS = 'Umb.Repository.DocumentBlueprint.Tree'; export const UMB_DOCUMENT_BLUEPRINT_TREE_STORE_ALIAS = 'Umb.Store.DocumentBlueprint.Tree'; +export const UMB_DOCUMENT_BLUEPRINT_TREE_ALIAS = 'Umb.Tree.DocumentBlueprint'; const treeRepository: ManifestRepository = { type: 'repository', @@ -34,7 +35,7 @@ const treeStore: ManifestTreeStore = { const tree: ManifestTree = { type: 'tree', kind: 'default', - alias: 'Umb.Tree.DocumentBlueprint', + alias: UMB_DOCUMENT_BLUEPRINT_TREE_ALIAS, name: 'Document Blueprints Tree', meta: { repositoryAlias: UMB_DOCUMENT_BLUEPRINT_TREE_REPOSITORY_ALIAS, @@ -53,4 +54,5 @@ const treeItem: ManifestTreeItem = { ], }; -export const manifests = [treeRepository, treeStore, tree, treeItem, ...folderManifests, ...reloadManifests]; +export const manifests = [treeRepository, treeStore, tree, treeItem, ...reloadManifests]; +//...folderManifests, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.element.ts index 495489dfe9..ce5f7060a0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.element.ts @@ -48,6 +48,7 @@ export class UmbDocumentBlueprintWorkspaceElement extends UmbLitElement { }, }, { + /** TODO: Any way to setup the root without edit/null appearing? */ path: 'edit/null', component: this.#rootElement, }, @@ -55,6 +56,7 @@ export class UmbDocumentBlueprintWorkspaceElement extends UmbLitElement { path: 'edit/:unique', component: this.#editorElement, setup: (_component, info) => { + console.log('edit unique'); const unique = info.match.params.unique; this.#workspaceContext!.load(unique); }, From 8ab192131236dd4c8977bfbf16739ef034abf897 Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Mon, 18 Mar 2024 12:26:26 +0100 Subject: [PATCH 009/280] fix tree --- .../document-blueprint.data.ts | 2 +- ...ument-blueprint-item.server.data-source.ts | 9 ++- ...ument-blueprint-tree.server.data-source.ts | 2 +- ...ment-blueprint-workspace-editor.element.ts | 1 + .../document-blueprint-workspace.context.ts | 1 - .../document-blueprint-workspace.element.ts | 75 +++++++------------ .../workspace/manifests.ts | 4 +- 7 files changed, 37 insertions(+), 57 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/document-blueprint/document-blueprint.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/document-blueprint/document-blueprint.data.ts index 6b362e7995..084f715a9a 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/document-blueprint/document-blueprint.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/document-blueprint/document-blueprint.data.ts @@ -28,7 +28,7 @@ export const data: Array = [ publishDate: '2023-02-06T15:32:24.957009', culture: 'en-us', segment: null, - name: 'The Simplest Document', + name: 'The Simplest Document Blueprint', createDate: '2023-02-06T15:32:05.350038', updateDate: '2023-02-06T15:32:24.957009', }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/item/document-blueprint-item.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/item/document-blueprint-item.server.data-source.ts index 1e8df1b933..c971e13bcf 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/item/document-blueprint-item.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/item/document-blueprint-item.server.data-source.ts @@ -1,7 +1,7 @@ import { UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE } from '../../entity.js'; import type { UmbDocumentBlueprintItemModel } from './types.js'; -import type { DocumentItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; -import { DocumentResource } from '@umbraco-cms/backoffice/external/backend-api'; +import type { CancelablePromise, DocumentItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; +import { DocumentBlueprintResource, DocumentResource } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbItemServerDataSourceBase } from '@umbraco-cms/backoffice/repository'; @@ -29,7 +29,10 @@ export class UmbDocumentBlueprintItemServerDataSource extends UmbItemServerDataS } /* eslint-disable local-rules/no-direct-api-import */ -const getItems = (uniques: Array) => DocumentResource.getItemDocument({ id: uniques }); +const getItems = (uniques: Array) => + DocumentBlueprintResource.getItemDocumentBlueprint({ id: uniques }) as unknown as CancelablePromise< + DocumentItemResponseModel[] + >; const mapper = (item: DocumentItemResponseModel): UmbDocumentBlueprintItemModel => { return { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/document-blueprint-tree.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/document-blueprint-tree.server.data-source.ts index d7b30c8318..da3f6f406e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/document-blueprint-tree.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/document-blueprint-tree.server.data-source.ts @@ -1,4 +1,4 @@ -import { UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE } from '../entity.js'; +import { UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE } from '../entity.js'; import type { UmbDocumentBlueprintTreeItemModel } from './types.js'; import type { UmbTreeChildrenOfRequestArgs, UmbTreeRootItemsRequestArgs } from '@umbraco-cms/backoffice/tree'; import { UmbTreeServerDataSourceBase } from '@umbraco-cms/backoffice/tree'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace-editor.element.ts index 7b17e80df5..0b4d12d646 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace-editor.element.ts @@ -20,6 +20,7 @@ export class UmbDocumentBlueprintWorkspaceEditorElement extends UmbLitElement { constructor() { super(); + console.log('editor'); this.consumeContext(UMB_DOCUMENT_BLUEPRINT_WORKSPACE_CONTEXT, (instance) => { this.#workspaceContext = instance; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.context.ts index a0279b8906..1260990680 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.context.ts @@ -130,7 +130,6 @@ export class UmbDocumentBlueprintWorkspaceContext } async load(unique: string) { - console.log('load'); this.resetState(); this.#getDataPromise = this.repository.requestByUnique(unique); const { data } = await this.#getDataPromise; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.element.ts index ce5f7060a0..abf3533d08 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.element.ts @@ -1,4 +1,4 @@ -import type { UmbDocumentBlueprintWorkspaceContext } from './document-blueprint-workspace.context.js'; +import { UmbDocumentBlueprintWorkspaceContext } from './document-blueprint-workspace.context.js'; import { UmbDocumentBlueprintWorkspaceEditorElement } from './document-blueprint-workspace-editor.element.js'; import { UmbDocumentBlueprintRootWorkspaceElement } from './document-blueprint-root-workspace.element.js'; import { html, customElement, css, state } from '@umbraco-cms/backoffice/external/lit'; @@ -11,61 +11,38 @@ import { UmbWorkspaceIsNewRedirectController } from '@umbraco-cms/backoffice/wor @customElement('umb-document-blueprint-workspace') export class UmbDocumentBlueprintWorkspaceElement extends UmbLitElement { - #workspaceContext?: UmbDocumentBlueprintWorkspaceContext; + #workspaceContext = new UmbDocumentBlueprintWorkspaceContext(this); #editorElement = () => new UmbDocumentBlueprintWorkspaceEditorElement(); #rootElement = () => new UmbDocumentBlueprintRootWorkspaceElement(); @state() - _routes: UmbRoute[] = []; + _routes: UmbRoute[] = [ + { + path: 'create/parent/:entityType/:parentUnique/:documentTypeUnique', + component: this.#editorElement, + setup: (_component, info) => { + const parentEntityType = info.match.params.entityType; + const parentUnique = info.match.params.parentUnique === 'null' ? null : info.match.params.parentUnique; + const documentTypeUnique = info.match.params.documentTypeUnique; + this.#workspaceContext.create({ entityType: parentEntityType, unique: parentUnique }, documentTypeUnique); - public set manifest(manifest: ManifestWorkspace) { - createExtensionApi(this, manifest).then((context) => { - if (context) { - this.#gotWorkspaceContext(context); - } - }); - } - - #gotWorkspaceContext(context: UmbApi) { - this.#workspaceContext = context as UmbDocumentBlueprintWorkspaceContext; - - this._routes = [ - { - path: 'create/parent/:entityType/:parentUnique/:documentTypeUnique', - component: this.#editorElement, - setup: async (_component, info) => { - // TODO: Remember the perspective of permissions here, we need to check if the user has access to create a document of this type under this parent? - const parentEntityType = info.match.params.entityType; - const parentUnique = info.match.params.parentUnique === 'null' ? null : info.match.params.parentUnique; - const documentTypeUnique = info.match.params.documentTypeUnique; - this.#workspaceContext!.create({ entityType: parentEntityType, unique: parentUnique }, documentTypeUnique); - - new UmbWorkspaceIsNewRedirectController( - this, - this.#workspaceContext!, - this.shadowRoot!.querySelector('umb-router-slot')!, - ); - }, + new UmbWorkspaceIsNewRedirectController( + this, + this.#workspaceContext, + this.shadowRoot!.querySelector('umb-router-slot')!, + ); }, - { - /** TODO: Any way to setup the root without edit/null appearing? */ - path: 'edit/null', - component: this.#rootElement, + }, + { + path: 'edit/:unique', + component: this.#editorElement, + setup: (_component, info) => { + this.removeControllerByAlias('isNewRedirectController'); + const unique = info.match.params.unique; + this.#workspaceContext.load(unique); }, - { - path: 'edit/:unique', - component: this.#editorElement, - setup: (_component, info) => { - console.log('edit unique'); - const unique = info.match.params.unique; - this.#workspaceContext!.load(unique); - }, - }, - ]; - - // TODO: We need to recreate when ID changed? - new UmbExtensionsApiInitializer(this, umbExtensionsRegistry, 'workspaceContext', [this, this.#workspaceContext]); - } + }, + ]; render() { return html``; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/manifests.ts index a93f324175..6e9d8a47d5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/manifests.ts @@ -1,4 +1,4 @@ -import { UMB_DOCUMENT_BLUEPRINT_ROOT_ENTITY_TYPE } from '../entity.js'; +import { UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, UMB_DOCUMENT_BLUEPRINT_ROOT_ENTITY_TYPE } from '../entity.js'; import { UmbSaveWorkspaceAction } from '@umbraco-cms/backoffice/workspace'; import type { ManifestWorkspace, ManifestWorkspaceActions } from '@umbraco-cms/backoffice/extension-registry'; @@ -10,7 +10,7 @@ const workspace: ManifestWorkspace = { name: 'Document Blueprint Root Workspace', js: () => import('./document-blueprint-workspace.element.js'), meta: { - entityType: UMB_DOCUMENT_BLUEPRINT_ROOT_ENTITY_TYPE, + entityType: UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, }, }; From df9cb2ebaa3830de1d43e9b9a248eb327fe90389 Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Tue, 19 Mar 2024 10:34:56 +0100 Subject: [PATCH 010/280] modal create --- .../entity-actions/create/create.action.ts | 22 ++++- .../entity-actions/create/manifests.ts | 12 +++ ...-blueprint-create-options-modal.element.ts | 80 +++++++++++++++++++ .../entity-actions/create/modal/index.ts | 22 +++++ .../entity-actions/manifests.ts | 3 +- .../document-blueprint-workspace.context.ts | 6 +- 6 files changed, 138 insertions(+), 7 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/modal/document-blueprint-create-options-modal.element.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/modal/index.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/create.action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/create.action.ts index 0b13db78b3..d5034e8d25 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/create.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/create.action.ts @@ -1,6 +1,9 @@ +import { UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE } from '../../entity.js'; +import { UMB_DOCUMENT_BLUEPRINT_CREATE_OPTIONS_MODAL } from './modal/index.js'; import type { UmbEntityActionArgs } from '@umbraco-cms/backoffice/entity-action'; import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; export class UmbCreateEntityAction extends UmbEntityActionBase { constructor(host: UmbControllerHost, args: UmbEntityActionArgs) { @@ -8,10 +11,23 @@ export class UmbCreateEntityAction extends UmbEntityActionBase { } async execute() { - const url = `section/settings/workspace/document-blueprint/create/parent/${this.args.entityType}/${ - this.args.unique || 'null' + const modalManager = await this.getContext(UMB_MODAL_MANAGER_CONTEXT); + const modalContext = modalManager.open(this, UMB_DOCUMENT_BLUEPRINT_CREATE_OPTIONS_MODAL, { + data: { + parent: { + unique: this.args.unique, + entityType: this.args.entityType, + }, + }, + }); + + await modalContext.onSubmit().catch(() => undefined); + + const documentTypeUnique = modalContext.getValue().documentTypeUnique; + + const url = `section/settings/workspace/${UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE}/create/parent/${this.args.entityType}/${ + documentTypeUnique || 'null' }`; - // TODO: how do we handle this with a href? history.pushState(null, '', url); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/manifests.ts new file mode 100644 index 0000000000..1c1c7a408d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/manifests.ts @@ -0,0 +1,12 @@ +import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; + +const entityActions: Array = [ + { + type: 'modal', + alias: 'Umb.Modal.DocumentBlueprintCreateOptions', + name: 'Document Blueprint Create Options Modal', + js: () => import('./modal/document-blueprint-create-options-modal.element.js'), + }, +]; + +export const manifests = [...entityActions]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/modal/document-blueprint-create-options-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/modal/document-blueprint-create-options-modal.element.ts new file mode 100644 index 0000000000..ef7e3ac473 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/modal/document-blueprint-create-options-modal.element.ts @@ -0,0 +1,80 @@ +import type { + UmbDocumentBlueprintCreateOptionsModalData, + UmbDocumentBlueprintCreateOptionsModalValue, +} from './index.js'; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; +import { html, customElement, css, state } from '@umbraco-cms/backoffice/external/lit'; +import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; +import type { DocumentTypeResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; +import { UmbDocumentTypeStructureRepository } from '@umbraco-cms/backoffice/document-type'; +import { type UmbSelectedEvent, UmbSelectionChangeEvent } from '@umbraco-cms/backoffice/event'; +import type { UmbTreeElement } from '@umbraco-cms/backoffice/tree'; + +@customElement('umb-document-blueprint-create-options-modal') +export class UmbDocumentBlueprintCreateOptionsModalElement extends UmbModalBaseElement< + UmbDocumentBlueprintCreateOptionsModalData, + UmbDocumentBlueprintCreateOptionsModalValue +> { + @state() + private _documentTypes?: Array; + + #documentTypeRepository = new UmbDocumentTypeStructureRepository(this); + + connectedCallback(): void { + super.connectedCallback(); + } + + async #fetchTypes() { + //const something = await this.#documentTypeRepository. + } + + #onNavigate() { + this._submitModal(); + } + + #onSelected(event: UmbSelectedEvent) { + event.stopPropagation(); + const element = event.target as UmbTreeElement; + this.value = { documentTypeUnique: element.getSelection()[0] }; + this.modalContext?.dispatchEvent(new UmbSelectionChangeEvent()); + this.#onNavigate(); + } + + render() { + return html` + + + Create an item under Content Templates + + Select the Document Type you want to make a content blueprint for + + item.isElement == false, + }} + @selected=${this.#onSelected}> + + + + `; + } + + static styles = [ + UmbTextStyles, + css` + strong { + display: block; + } + `, + ]; +} + +export default UmbDocumentBlueprintCreateOptionsModalElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-document-blueprint-create-options-modal': UmbDocumentBlueprintCreateOptionsModalElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/modal/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/modal/index.ts new file mode 100644 index 0000000000..98a89164ec --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/modal/index.ts @@ -0,0 +1,22 @@ +import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; + +export interface UmbDocumentBlueprintCreateOptionsModalData { + parent: { + unique: string | null; + entityType: string; + }; +} + +export interface UmbDocumentBlueprintCreateOptionsModalValue { + documentTypeUnique: string; +} + +export const UMB_DOCUMENT_BLUEPRINT_CREATE_OPTIONS_MODAL = new UmbModalToken< + UmbDocumentBlueprintCreateOptionsModalData, + UmbDocumentBlueprintCreateOptionsModalValue +>('Umb.Modal.DocumentBlueprintCreateOptions', { + modal: { + type: 'sidebar', + size: 'small', + }, +}); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/manifests.ts index c2a0771aa1..192700d16e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/manifests.ts @@ -3,6 +3,7 @@ import { UMB_DOCUMENT_BLUEPRINT_DETAIL_REPOSITORY_ALIAS, UMB_DOCUMENT_BLUEPRINT_ITEM_REPOSITORY_ALIAS, } from '../index.js'; +import { manifests as createManifests } from './create/manifests.js'; import { UmbCreateEntityAction } from './create/create.action.js'; import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; @@ -44,4 +45,4 @@ const entityActions: Array = [ }, ]; -export const manifests = [...entityActions]; +export const manifests = [...entityActions, ...createManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.context.ts index 1260990680..8df0383b97 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.context.ts @@ -8,10 +8,9 @@ import type { UmbDocumentBlueprintVariantModel, UmbDocumentBlueprintVariantOptionModel, } from '../types.js'; -//import { umbPickDocumentVariantModal, type UmbDocumentBlueprintVariantPickerModalType } from '../modals/index.js'; +/* import { umbPickDocumentVariantModal, type UmbDocumentBlueprintVariantPickerModalType } from '../modals/index.js';*/ import { UMB_DOCUMENT_BLUEPRINT_ROOT_WORKSPACE_ALIAS } from './manifests.js'; import { UMB_INVARIANT_CULTURE, UmbVariantId } from '@umbraco-cms/backoffice/variant'; -import { UmbContentTypePropertyStructureManager } from '@umbraco-cms/backoffice/content-type'; import { UmbEditableWorkspaceContextBase, UmbWorkspaceSplitViewManager, @@ -26,10 +25,11 @@ import { } from '@umbraco-cms/backoffice/observable-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbLanguageCollectionRepository, type UmbLanguageDetailModel } from '@umbraco-cms/backoffice/language'; -import { type Observable, firstValueFrom } from '@umbraco-cms/backoffice/external/rxjs'; import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; import { UmbReloadTreeItemChildrenRequestEntityActionEvent } from '@umbraco-cms/backoffice/tree'; import { UmbRequestReloadStructureForEntityEvent } from '@umbraco-cms/backoffice/event'; +import { UmbContentTypePropertyStructureManager } from '@umbraco-cms/backoffice/content-type'; +import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; type EntityType = UmbDocumentBlueprintDetailModel; export class UmbDocumentBlueprintWorkspaceContext From 5439668c8657cbb5b2e29a40db7ace168f2f73ad Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Tue, 19 Mar 2024 10:46:50 +0100 Subject: [PATCH 011/280] structure manager --- .../workspace/document-blueprint-workspace.context.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.context.ts index 8df0383b97..9017a990fa 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.context.ts @@ -28,7 +28,7 @@ import { UmbLanguageCollectionRepository, type UmbLanguageDetailModel } from '@u import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; import { UmbReloadTreeItemChildrenRequestEntityActionEvent } from '@umbraco-cms/backoffice/tree'; import { UmbRequestReloadStructureForEntityEvent } from '@umbraco-cms/backoffice/event'; -import { UmbContentTypePropertyStructureManager } from '@umbraco-cms/backoffice/content-type'; +import { UmbContentTypeStructureManager } from '@umbraco-cms/backoffice/content-type'; import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; type EntityType = UmbDocumentBlueprintDetailModel; @@ -65,7 +65,7 @@ export class UmbDocumentBlueprintWorkspaceContext readonly urls = this.#currentData.asObservablePart((data) => data?.urls || []); readonly templateId = this.#currentData.asObservablePart((data) => data?.template?.unique || null); - readonly structure = new UmbContentTypePropertyStructureManager(this, new UmbDocumentTypeDetailRepository(this)); + readonly structure = new UmbContentTypeStructureManager(this, new UmbDocumentTypeDetailRepository(this)); readonly variesByCulture = this.structure.ownerContentTypePart((x) => x?.variesByCulture); //#variesByCulture?: boolean; readonly variesBySegment = this.structure.ownerContentTypePart((x) => x?.variesBySegment); From b6bc2a531c36a539018d43f21fcc140fd11ba7c4 Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Tue, 19 Mar 2024 14:05:06 +0100 Subject: [PATCH 012/280] action --- .../entity-actions/manifests.ts | 20 ++++++------------- 1 file changed, 6 insertions(+), 14 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/manifests.ts index 192700d16e..ff487efb7f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/manifests.ts @@ -1,4 +1,8 @@ -import { UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, UMB_DOCUMENT_BLUEPRINT_ROOT_ENTITY_TYPE } from '../entity.js'; +import { + UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, + UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE, + UMB_DOCUMENT_BLUEPRINT_ROOT_ENTITY_TYPE, +} from '../entity.js'; import { UMB_DOCUMENT_BLUEPRINT_DETAIL_REPOSITORY_ALIAS, UMB_DOCUMENT_BLUEPRINT_ITEM_REPOSITORY_ALIAS, @@ -14,19 +18,7 @@ const entityActions: Array = [ alias: 'Umb.EntityAction.DocumentBlueprint.Create', name: 'Create Document Blueprint Entity Action', api: UmbCreateEntityAction, - forEntityTypes: [UMB_DOCUMENT_BLUEPRINT_ROOT_ENTITY_TYPE], - meta: { - icon: 'icon-add', - label: 'Create', - }, - }, - { - type: 'entityAction', - kind: 'default', - alias: 'Umb.EntityAction.DocumentBlueprintItem.Create', - name: 'Create Document Blueprint Item Entity Action', - api: UmbCreateEntityAction, - forEntityTypes: [UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE], + forEntityTypes: [UMB_DOCUMENT_BLUEPRINT_ROOT_ENTITY_TYPE, UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE], meta: { icon: 'icon-add', label: 'Create', From f9284cf36f66045cbf90cc7a448faf46a225795c Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 2 Apr 2024 14:55:09 +0200 Subject: [PATCH 013/280] remove document delete action --- .../documents/documents/entity-actions/manifests.ts | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts index 36d9a0cf3e..7455fc7762 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts @@ -7,19 +7,6 @@ import { manifests as cultureAndHostnamesManifests } from './culture-and-hostnam import type { ManifestEntityAction } from '@umbraco-cms/backoffice/extension-registry'; const entityActions: Array = [ - { - type: 'entityAction', - kind: 'delete', - alias: 'Umb.EntityAction.Document.Delete', - name: 'Delete Document Entity Action', - weight: 1100, - forEntityTypes: [UMB_DOCUMENT_ENTITY_TYPE], - meta: { - deleteRepositoryAlias: UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS, - itemRepositoryAlias: UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS, - pickerModalAlias: UMB_DOCUMENT_PICKER_MODAL, - }, - }, { type: 'entityAction', kind: 'default', From 69d0bc0618dd116a2c75db3c7ffeb567d079d4b1 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 2 Apr 2024 14:55:21 +0200 Subject: [PATCH 014/280] rename property --- .../core/extension-registry/models/entity-action.model.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/entity-action.model.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/entity-action.model.ts index c5ddd408fa..ae8066a9ab 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/entity-action.model.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/entity-action.model.ts @@ -63,7 +63,7 @@ export interface ManifestEntityActionTrashKind extends ManifestEntityAction Date: Tue, 2 Apr 2024 14:55:37 +0200 Subject: [PATCH 015/280] remove user permission condition --- .../documents/recycle-bin/entity-action/manifests.ts | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts index 2c654126d5..dec1ebb439 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts @@ -12,11 +12,5 @@ export const manifests = [ itemRepositoryAlias: UMB_DOCUMENT_ITEM_REPOSITORY_ALIAS, trashRepositoryAlias: UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS, }, - conditions: [ - { - alias: 'Umb.Condition.UserPermission', - match: 'Umb.UserPermission.Document.Delete', - }, - ], }, ]; From ff317d67792279344e7a70bea46e7d266157e470 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 2 Apr 2024 16:03:05 +0200 Subject: [PATCH 016/280] update trash action --- .../common/trash/trash.action.kind.ts | 6 +- .../common/trash/trash.action.ts | 59 +++++++++++-------- 2 files changed, 38 insertions(+), 27 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/trash/trash.action.kind.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/trash/trash.action.kind.ts index beb3103a7b..53a7273139 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/trash/trash.action.kind.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/trash/trash.action.kind.ts @@ -11,13 +11,13 @@ export const manifest: UmbBackofficeManifestKind = { type: 'entityAction', kind: 'trash', api: () => import('./trash.action.js'), - weight: 900, + weight: 1100, forEntityTypes: [], meta: { icon: 'icon-trash', - label: 'Trash', + label: 'Trash...', itemRepositoryAlias: '', - trashRepositoryAlias: '', + recycleBinRepositoryAlias: '', }, }, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/trash/trash.action.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/trash/trash.action.ts index 3c4fc550c3..14ab66edb3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/trash/trash.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/trash/trash.action.ts @@ -1,34 +1,45 @@ import { UmbEntityActionBase } from '../../entity-action-base.js'; -import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -//import { umbConfirmModal } from '@umbraco-cms/backoffice/modal'; +import { UmbRequestReloadStructureForEntityEvent } from '../../request-reload-structure-for-entity.event.js'; +import { createExtensionApiByAlias, type MetaEntityActionDeleteKind } from '@umbraco-cms/backoffice/extension-registry'; +import { umbConfirmModal } from '@umbraco-cms/backoffice/modal'; +import type { UmbItemRepository } from '@umbraco-cms/backoffice/repository'; +import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; -export class UmbTrashEntityAction extends UmbEntityActionBase { - constructor(host: UmbControllerHost, args: any) { - super(host, args); - } +export class UmbDeleteEntityAction extends UmbEntityActionBase { + // TODO: make base type for item and detail models async execute() { - console.log(`execute trash for: ${this.args.unique}`); - /* - if (!this.unique) throw new Error('Unique is not available'); - if (!this.repository) return; + if (!this.args.unique) throw new Error('Cannot trash an item without a unique identifier.'); - const { data } = await this.repository.requestItems([this.unique]); + const itemRepository = await createExtensionApiByAlias>( + this, + this.args.meta.itemRepositoryAlias, + ); - if (data) { - const item = data[0]; + const { data } = await itemRepository.requestItems([this.args.unique]); + const item = data?.[0]; + if (!item) throw new Error('Item not found.'); - await umbConfirmModal(this._host, { - headline: `Trash ${item.name}`, - content: 'Are you sure you want to move this item to the recycle bin?', - color: 'danger', - confirmLabel: 'Trash', - }); + // TODO: handle items with variants + await umbConfirmModal(this._host, { + headline: `Trash`, + content: `Are you sure you want to move ${item.name} to the recycle bin?`, + color: 'danger', + confirmLabel: 'Trash', + }); - this.repository?.trash(this.unique); - } - */ + const recycleBinRepository = await createExtensionApiByAlias(this, this.args.meta.recycleBinRepositoryAlias); + await recycleBinRepository.trash(this.args.unique); + + const actionEventContext = await this.getContext(UMB_ACTION_EVENT_CONTEXT); + const event = new UmbRequestReloadStructureForEntityEvent({ + unique: this.args.unique, + entityType: this.args.entityType, + }); + + actionEventContext.dispatchEvent(event); + + // TODO: reload destination } } - -export default UmbTrashEntityAction; +export default UmbDeleteEntityAction; From ddb0b704e4ea1499c7f50eb38aa0517096ba7d2d Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 2 Apr 2024 16:03:30 +0200 Subject: [PATCH 017/280] work in progress repository --- .../recycle-bin/entity-action/manifests.ts | 5 ++- .../documents/recycle-bin/manifests.ts | 7 ++-- .../recycle-bin/repository/constants.ts | 1 + .../document-recycle-bin.repository.ts | 30 ++++++++++++++ ...document-recycle-bin.server.data-source.ts | 39 +++++++++++++++++++ .../documents/recycle-bin/repository/index.ts | 1 + .../recycle-bin/repository/manifests.ts | 11 ++++++ .../documents/recycle-bin/repository/types.ts | 0 8 files changed, 89 insertions(+), 5 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/constants.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle-bin.repository.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle-bin.server.data-source.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/types.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts index dec1ebb439..4c6a590d4c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts @@ -1,5 +1,6 @@ import { UMB_DOCUMENT_ENTITY_TYPE } from '../../entity.js'; -import { UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS, UMB_DOCUMENT_ITEM_REPOSITORY_ALIAS } from '../../repository/index.js'; +import { UMB_DOCUMENT_ITEM_REPOSITORY_ALIAS } from '../../repository/index.js'; +import { UMB_DOCUMENT_RECYCLE_BIN_REPOSITORY_ALIAS } from '../repository/index.js'; export const manifests = [ { @@ -10,7 +11,7 @@ export const manifests = [ forEntityTypes: [UMB_DOCUMENT_ENTITY_TYPE], meta: { itemRepositoryAlias: UMB_DOCUMENT_ITEM_REPOSITORY_ALIAS, - trashRepositoryAlias: UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS, + recycleBinRepositoryAlias: UMB_DOCUMENT_RECYCLE_BIN_REPOSITORY_ALIAS, }, }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/manifests.ts index 38ee0700be..1277abe4c1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/manifests.ts @@ -1,5 +1,6 @@ -import { manifests as treeManifests } from './tree/manifests.js'; -import { manifests as menuItemManifests } from './menu-item/manifests.js'; import { manifests as entityActionManifests } from './entity-action/manifests.js'; +import { manifests as menuItemManifests } from './menu-item/manifests.js'; +import { manifests as repositoryManifests } from './repository/manifests.js'; +import { manifests as treeManifests } from './tree/manifests.js'; -export const manifests = [...treeManifests, ...menuItemManifests, ...entityActionManifests]; +export const manifests = [...treeManifests, ...menuItemManifests, ...entityActionManifests, ...repositoryManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/constants.ts new file mode 100644 index 0000000000..f350dc5e9d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/constants.ts @@ -0,0 +1 @@ +export const UMB_DOCUMENT_RECYCLE_BIN_REPOSITORY_ALIAS = 'Umb.Repository.Document.RecycleBin'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle-bin.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle-bin.repository.ts new file mode 100644 index 0000000000..44a4f60478 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle-bin.repository.ts @@ -0,0 +1,30 @@ +import { UmbDocumentRecycleBinServerDataSource } from './document-recycle-bin.server.data-source.js'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { UmbRepositoryBase } from '@umbraco-cms/backoffice/repository'; + +export class UmbDocumentRecycleBinRepository extends UmbRepositoryBase { + #recycleBinSource: UmbDocumentRecycleBinServerDataSource; + + constructor(host: UmbControllerHost) { + super(host); + this.#recycleBinSource = new UmbDocumentRecycleBinServerDataSource(this); + } + + async requestTrash(args) { + return this.#recycleBinSource.trash(args); + } + + async requestRestore(args) { + return this.#recycleBinSource.restore(args); + } + + async requestEmptyBin() { + return this.#recycleBinSource.emptyBin(); + } + + async requestOriginalParent(args) { + return this.#recycleBinSource.getOriginalParent(args); + } +} + +export { UmbDocumentRecycleBinRepository as api }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle-bin.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle-bin.server.data-source.ts new file mode 100644 index 0000000000..3a4d74b20d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle-bin.server.data-source.ts @@ -0,0 +1,39 @@ +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; + +export class UmbDocumentRecycleBinServerDataSource { + #host: UmbControllerHost; + + constructor(host: UmbControllerHost) { + this.#host = host; + } + + trash(args: { unique: string }) { + return tryExecuteAndNotify(this.#host, DocumentResource.putDocumentByIdMoveToRecycleBin({ id: args.unique })); + } + + async restore(args: { unique: string; target: { unique: string | null } }) { + return tryExecuteAndNotify(this.#host, DocumentResource.putRecycleBinDocumentByIdRestore({ id: args.unique })); + } + + emptyBin() { + return tryExecuteAndNotify(this.#host, DocumentResource); + } + + async getOriginalParent(args: { unique: string }) { + const { data, error } = await tryExecuteAndNotify( + this.#host, + DocumentResource.getRecycleBinDocumentByIdOriginalParent({ id: args.unique }), + ); + + if (data) { + const mappedData = { + unique: data.id, + }; + + return { data: mappedData }; + } + + return { error }; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/index.ts new file mode 100644 index 0000000000..50bcc134af --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/index.ts @@ -0,0 +1 @@ +export { UMB_DOCUMENT_RECYCLE_BIN_REPOSITORY_ALIAS } from './constants.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/manifests.ts new file mode 100644 index 0000000000..b2b0b2ac63 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/manifests.ts @@ -0,0 +1,11 @@ +import { UMB_DOCUMENT_RECYCLE_BIN_REPOSITORY_ALIAS } from './constants.js'; +import type { ManifestRepository } from '@umbraco-cms/backoffice/extension-registry'; + +const queryRepository: ManifestRepository = { + type: 'repository', + alias: UMB_DOCUMENT_RECYCLE_BIN_REPOSITORY_ALIAS, + name: 'Document Recycle Bin Repository', + api: () => import('./document-recycle-bin.repository.js'), +}; + +export const manifests = [queryRepository]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/types.ts new file mode 100644 index 0000000000..e69de29bb2 From 81ee95a7185cabf709af9a9873395087525aba5a Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 2 Apr 2024 16:15:17 +0200 Subject: [PATCH 018/280] use correct method --- .../repository/document-recycle-bin.server.data-source.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle-bin.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle-bin.server.data-source.ts index 3a4d74b20d..3e00d33711 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle-bin.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle-bin.server.data-source.ts @@ -1,4 +1,5 @@ import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { DocumentResource } from '@umbraco-cms/backoffice/external/backend-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; export class UmbDocumentRecycleBinServerDataSource { @@ -17,7 +18,7 @@ export class UmbDocumentRecycleBinServerDataSource { } emptyBin() { - return tryExecuteAndNotify(this.#host, DocumentResource); + return tryExecuteAndNotify(this.#host, DocumentResource.deleteRecycleBinDocument()); } async getOriginalParent(args: { unique: string }) { From 0ae27a683380d14a4914154d23778fd35ce276a9 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 2 Apr 2024 16:15:35 +0200 Subject: [PATCH 019/280] move import --- .../documents/documents/recycle-bin/entity-action/manifests.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts index 4c6a590d4c..d665404052 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts @@ -1,6 +1,6 @@ +import { UMB_DOCUMENT_RECYCLE_BIN_REPOSITORY_ALIAS } from '../repository/index.js'; import { UMB_DOCUMENT_ENTITY_TYPE } from '../../entity.js'; import { UMB_DOCUMENT_ITEM_REPOSITORY_ALIAS } from '../../repository/index.js'; -import { UMB_DOCUMENT_RECYCLE_BIN_REPOSITORY_ALIAS } from '../repository/index.js'; export const manifests = [ { From c722eb48edef7d913a14400c967b5a80f1a4bbe1 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 2 Apr 2024 16:15:56 +0200 Subject: [PATCH 020/280] use correct method name on repo --- .../core/entity-action/common/trash/trash.action.ts | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/trash/trash.action.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/trash/trash.action.ts index 14ab66edb3..94e2da1304 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/trash/trash.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/trash/trash.action.ts @@ -1,11 +1,12 @@ import { UmbEntityActionBase } from '../../entity-action-base.js'; import { UmbRequestReloadStructureForEntityEvent } from '../../request-reload-structure-for-entity.event.js'; -import { createExtensionApiByAlias, type MetaEntityActionDeleteKind } from '@umbraco-cms/backoffice/extension-registry'; +import type { MetaEntityActionTrashKind } from '@umbraco-cms/backoffice/extension-registry'; +import { createExtensionApiByAlias } from '@umbraco-cms/backoffice/extension-registry'; import { umbConfirmModal } from '@umbraco-cms/backoffice/modal'; import type { UmbItemRepository } from '@umbraco-cms/backoffice/repository'; import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; -export class UmbDeleteEntityAction extends UmbEntityActionBase { +export class UmbTrashEntityAction extends UmbEntityActionBase { // TODO: make base type for item and detail models async execute() { @@ -28,8 +29,8 @@ export class UmbDeleteEntityAction extends UmbEntityActionBase(this, this.args.meta.recycleBinRepositoryAlias); + await recycleBinRepository.requestTrash({ unique: this.args.unique }); const actionEventContext = await this.getContext(UMB_ACTION_EVENT_CONTEXT); const event = new UmbRequestReloadStructureForEntityEvent({ @@ -42,4 +43,4 @@ export class UmbDeleteEntityAction extends UmbEntityActionBase Date: Tue, 2 Apr 2024 16:46:57 +0200 Subject: [PATCH 021/280] register workspace for documents in recycle bin --- .../documents/recycle-bin/manifests.ts | 9 +++- .../recycle-bin/workspace/constants.ts | 1 + ...nt-recycle-bin-workspace-editor.element.ts | 45 +++++++++++++++++++ ...ent-recycle-bin-workspace.context-token.ts | 12 +++++ .../document-recycle-bin-workspace.context.ts | 34 ++++++++++++++ .../documents/recycle-bin/workspace/index.ts | 1 + .../recycle-bin/workspace/manifests.ts | 14 ++++++ 7 files changed, 115 insertions(+), 1 deletion(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/workspace/constants.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/workspace/document-recycle-bin-workspace-editor.element.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/workspace/document-recycle-bin-workspace.context-token.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/workspace/document-recycle-bin-workspace.context.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/workspace/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/workspace/manifests.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/manifests.ts index 1277abe4c1..96b9d4b78a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/manifests.ts @@ -2,5 +2,12 @@ import { manifests as entityActionManifests } from './entity-action/manifests.js import { manifests as menuItemManifests } from './menu-item/manifests.js'; import { manifests as repositoryManifests } from './repository/manifests.js'; import { manifests as treeManifests } from './tree/manifests.js'; +import { manifests as workspaceManifests } from './workspace/manifests.js'; -export const manifests = [...treeManifests, ...menuItemManifests, ...entityActionManifests, ...repositoryManifests]; +export const manifests = [ + ...entityActionManifests, + ...menuItemManifests, + ...repositoryManifests, + ...treeManifests, + ...workspaceManifests, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/workspace/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/workspace/constants.ts new file mode 100644 index 0000000000..61e0e19e34 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/workspace/constants.ts @@ -0,0 +1 @@ +export const UMB_DOCUMENT_RECYCLE_BIN_WORKSPACE_ALIAS = 'Umb.Workspace.Document.RecycleBin'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/workspace/document-recycle-bin-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/workspace/document-recycle-bin-workspace-editor.element.ts new file mode 100644 index 0000000000..7477cf00d0 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/workspace/document-recycle-bin-workspace-editor.element.ts @@ -0,0 +1,45 @@ +import { UMB_DOCUMENT_RECYCLE_BIN_WORKSPACE_CONTEXT } from './document-recycle-bin-workspace.context-token.js'; +import { css, html, customElement, property } from '@umbraco-cms/backoffice/external/lit'; +import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; +import type { ManifestWorkspace } from '@umbraco-cms/backoffice/extension-registry'; + +const elementName = 'umb-document-recycle-bin-editor'; + +@customElement(elementName) +export class UmbDocumentRecycleBinWorkspaceEditorElement extends UmbLitElement { + @property({ attribute: false }) + manifest?: ManifestWorkspace; + + #workspaceContext?: typeof UMB_DOCUMENT_RECYCLE_BIN_WORKSPACE_CONTEXT.TYPE; + + constructor() { + super(); + + this.consumeContext(UMB_DOCUMENT_RECYCLE_BIN_WORKSPACE_CONTEXT, (workspaceContext) => { + this.#workspaceContext = workspaceContext; + debugger; + }); + } + + render() { + return html`
Document Recycle Bin
`; + } + + static styles = [ + css` + :host { + display: block; + width: 100%; + height: 100%; + } + `, + ]; +} + +export { UmbDocumentRecycleBinWorkspaceEditorElement as element }; + +declare global { + interface HTMLElementTagNameMap { + [elementName]: UmbDocumentRecycleBinWorkspaceEditorElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/workspace/document-recycle-bin-workspace.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/workspace/document-recycle-bin-workspace.context-token.ts new file mode 100644 index 0000000000..51b8c272eb --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/workspace/document-recycle-bin-workspace.context-token.ts @@ -0,0 +1,12 @@ +import type { UmbDocumentRecycleBinWorkspaceContext } from './document-recycle-bin-workspace.context.js'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; +import type { UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; + +export const UMB_DOCUMENT_RECYCLE_BIN_WORKSPACE_CONTEXT = new UmbContextToken< + UmbWorkspaceContext, + UmbDocumentRecycleBinWorkspaceContext +>( + 'UmbWorkspaceContext', + undefined, + (context): context is UmbDocumentRecycleBinWorkspaceContext => context.getEntityType?.() === 'document-recycle-bin', +); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/workspace/document-recycle-bin-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/workspace/document-recycle-bin-workspace.context.ts new file mode 100644 index 0000000000..65163ed83f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/workspace/document-recycle-bin-workspace.context.ts @@ -0,0 +1,34 @@ +import { UMB_DOCUMENT_RECYCLE_BIN_WORKSPACE_ALIAS } from './constants.js'; +import { UmbDocumentRecycleBinWorkspaceEditorElement } from './document-recycle-bin-workspace-editor.element.js'; +import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbRoutableWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; +import { UmbWorkspaceRouteManager } from '@umbraco-cms/backoffice/workspace'; + +export class UmbDocumentRecycleBinWorkspaceContext extends UmbControllerBase implements UmbRoutableWorkspaceContext { + public readonly workspaceAlias = UMB_DOCUMENT_RECYCLE_BIN_WORKSPACE_ALIAS; + public readonly routes = new UmbWorkspaceRouteManager(this); + + constructor(host: UmbControllerHost) { + super(host, 'Umb.Workspace.Document.RecycleBin'); + + this.routes.setRoutes([ + { + path: 'edit/:unique', + component: UmbDocumentRecycleBinWorkspaceEditorElement, + setup: (_component, info) => { + const unique = info.match.params.unique; + console.log('unique', unique); + }, + }, + ]); + } + + getEntityType() { + return 'document-recycle-bin'; + } + + destroy(): void {} +} + +export { UmbDocumentRecycleBinWorkspaceContext as api }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/workspace/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/workspace/index.ts new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/workspace/index.ts @@ -0,0 +1 @@ + diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/workspace/manifests.ts new file mode 100644 index 0000000000..cd04c18b64 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/workspace/manifests.ts @@ -0,0 +1,14 @@ +import type { ManifestWorkspaces } from '@umbraco-cms/backoffice/extension-registry'; + +const workspace: ManifestWorkspaces = { + type: 'workspace', + kind: 'routable', + alias: 'Umb.Workspace.Document.RecycleBin', + name: 'Document Recycle Bin Workspace', + api: () => import('./document-recycle-bin-workspace.context.js'), + meta: { + entityType: 'document-recycle-bin', + }, +}; + +export const manifests = [workspace]; From d485ac05e94033175dbca5e3c893aee1ef83a54a Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 2 Apr 2024 19:09:27 +0200 Subject: [PATCH 022/280] call delete document end point when deleting a document --- .../repository/detail/document-detail.server.data-source.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/detail/document-detail.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/detail/document-detail.server.data-source.ts index e8fb1638a3..aa8516e2b5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/detail/document-detail.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/detail/document-detail.server.data-source.ts @@ -199,8 +199,6 @@ export class UmbDocumentServerDataSource implements UmbDetailDataSource Date: Tue, 2 Apr 2024 19:09:45 +0200 Subject: [PATCH 023/280] add delete entity action for documents in recycle bin --- .../documents/entity-actions/manifests.ts | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts index 7455fc7762..b6d153fe5c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts @@ -1,12 +1,24 @@ -import { UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS } from '../repository/index.js'; +import { UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS, UMB_DOCUMENT_ITEM_REPOSITORY_ALIAS } from '../repository/index.js'; import { UMB_DOCUMENT_ENTITY_TYPE } from '../entity.js'; import { UMB_DOCUMENT_PICKER_MODAL } from '../modals/index.js'; +import { UMB_DOCUMENT_RECYCLE_BIN_ENTITY_TYPE } from '../recycle-bin/index.js'; import { manifests as createManifests } from './create/manifests.js'; import { manifests as publicAccessManifests } from './public-access/manifests.js'; import { manifests as cultureAndHostnamesManifests } from './culture-and-hostnames/manifests.js'; import type { ManifestEntityAction } from '@umbraco-cms/backoffice/extension-registry'; const entityActions: Array = [ + { + type: 'entityAction', + kind: 'delete', + alias: 'Umb.EntityAction.Document.Delete', + name: 'Delete Document Entity Action', + forEntityTypes: [UMB_DOCUMENT_RECYCLE_BIN_ENTITY_TYPE], + meta: { + detailRepositoryAlias: UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS, + itemRepositoryAlias: UMB_DOCUMENT_ITEM_REPOSITORY_ALIAS, + }, + }, { type: 'entityAction', kind: 'default', From ad843fb1b2045b562f8d691ff3e51e5187b0e946 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 2 Apr 2024 19:11:54 +0200 Subject: [PATCH 024/280] move registration to recycle bin --- .../documents/entity-actions/manifests.ts | 14 +------------- .../recycle-bin/entity-action/manifests.ts | 14 +++++++++++++- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts index b6d153fe5c..7455fc7762 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts @@ -1,24 +1,12 @@ -import { UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS, UMB_DOCUMENT_ITEM_REPOSITORY_ALIAS } from '../repository/index.js'; +import { UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS } from '../repository/index.js'; import { UMB_DOCUMENT_ENTITY_TYPE } from '../entity.js'; import { UMB_DOCUMENT_PICKER_MODAL } from '../modals/index.js'; -import { UMB_DOCUMENT_RECYCLE_BIN_ENTITY_TYPE } from '../recycle-bin/index.js'; import { manifests as createManifests } from './create/manifests.js'; import { manifests as publicAccessManifests } from './public-access/manifests.js'; import { manifests as cultureAndHostnamesManifests } from './culture-and-hostnames/manifests.js'; import type { ManifestEntityAction } from '@umbraco-cms/backoffice/extension-registry'; const entityActions: Array = [ - { - type: 'entityAction', - kind: 'delete', - alias: 'Umb.EntityAction.Document.Delete', - name: 'Delete Document Entity Action', - forEntityTypes: [UMB_DOCUMENT_RECYCLE_BIN_ENTITY_TYPE], - meta: { - detailRepositoryAlias: UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS, - itemRepositoryAlias: UMB_DOCUMENT_ITEM_REPOSITORY_ALIAS, - }, - }, { type: 'entityAction', kind: 'default', diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts index d665404052..4dad984bbc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts @@ -1,6 +1,7 @@ import { UMB_DOCUMENT_RECYCLE_BIN_REPOSITORY_ALIAS } from '../repository/index.js'; import { UMB_DOCUMENT_ENTITY_TYPE } from '../../entity.js'; -import { UMB_DOCUMENT_ITEM_REPOSITORY_ALIAS } from '../../repository/index.js'; +import { UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS, UMB_DOCUMENT_ITEM_REPOSITORY_ALIAS } from '../../repository/index.js'; +import { UMB_DOCUMENT_RECYCLE_BIN_ENTITY_TYPE } from '../entity.js'; export const manifests = [ { @@ -14,4 +15,15 @@ export const manifests = [ recycleBinRepositoryAlias: UMB_DOCUMENT_RECYCLE_BIN_REPOSITORY_ALIAS, }, }, + { + type: 'entityAction', + kind: 'delete', + alias: 'Umb.EntityAction.Document.Delete', + name: 'Delete Document Entity Action', + forEntityTypes: [UMB_DOCUMENT_RECYCLE_BIN_ENTITY_TYPE], + meta: { + itemRepositoryAlias: UMB_DOCUMENT_ITEM_REPOSITORY_ALIAS, + detailRepositoryAlias: UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS, + }, + }, ]; From 19fdafa852a83329e4b93fd3b384574bc458232c Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 2 Apr 2024 19:14:38 +0200 Subject: [PATCH 025/280] explicit naming --- .../recycle-bin/entity-action/manifests.ts | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts index 4dad984bbc..5ff1a0ed33 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts @@ -7,7 +7,7 @@ export const manifests = [ { type: 'entityAction', kind: 'trash', - alias: 'Umb.EntityAction.Document.Trash', + alias: 'Umb.EntityAction.Document.RecycleBin.Trash', name: 'Trash Document Entity Action', forEntityTypes: [UMB_DOCUMENT_ENTITY_TYPE], meta: { @@ -18,8 +18,19 @@ export const manifests = [ { type: 'entityAction', kind: 'delete', - alias: 'Umb.EntityAction.Document.Delete', - name: 'Delete Document Entity Action', + alias: 'Umb.EntityAction.Document.RecycleBin.Delete', + name: 'Delete Document From Recycle Bin Entity Action', + forEntityTypes: [UMB_DOCUMENT_RECYCLE_BIN_ENTITY_TYPE], + meta: { + itemRepositoryAlias: UMB_DOCUMENT_ITEM_REPOSITORY_ALIAS, + detailRepositoryAlias: UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS, + }, + }, + { + type: 'entityAction', + kind: 'restoreFromRecycleBin', + alias: 'Umb.EntityAction.Document.RecycleBin.Restore', + name: 'Restore Document From Recycle Bin Entity Action', forEntityTypes: [UMB_DOCUMENT_RECYCLE_BIN_ENTITY_TYPE], meta: { itemRepositoryAlias: UMB_DOCUMENT_ITEM_REPOSITORY_ALIAS, From 86462af1145b76837710a006b7942018ade3ee87 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 2 Apr 2024 20:54:28 +0200 Subject: [PATCH 026/280] add type --- .../documents/documents/recycle-bin/entity-action/manifests.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts index 5ff1a0ed33..03ba4b98dc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts @@ -2,8 +2,9 @@ import { UMB_DOCUMENT_RECYCLE_BIN_REPOSITORY_ALIAS } from '../repository/index.j import { UMB_DOCUMENT_ENTITY_TYPE } from '../../entity.js'; import { UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS, UMB_DOCUMENT_ITEM_REPOSITORY_ALIAS } from '../../repository/index.js'; import { UMB_DOCUMENT_RECYCLE_BIN_ENTITY_TYPE } from '../entity.js'; +import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; -export const manifests = [ +export const manifests: Array = [ { type: 'entityAction', kind: 'trash', From 7b7c3e2d2e417675601489088ddddc76114e5aa4 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 2 Apr 2024 21:03:57 +0200 Subject: [PATCH 027/280] register restore from recycle bin kind --- .../restore-from-recycle-bin/manifests.ts | 3 +++ .../restore-from-recycle-bin.action.kind.ts | 21 +++++++++++++++++++ .../restore-from-recycle-bin.action.ts | 11 ++++++++++ .../packages/core/entity-action/manifests.ts | 2 ++ .../models/entity-action.model.ts | 13 ++++++++++++ .../core/extension-registry/models/index.ts | 14 +++++++------ 6 files changed, 58 insertions(+), 6 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/restore-from-recycle-bin/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/restore-from-recycle-bin/restore-from-recycle-bin.action.kind.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/restore-from-recycle-bin/restore-from-recycle-bin.action.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/restore-from-recycle-bin/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/restore-from-recycle-bin/manifests.ts new file mode 100644 index 0000000000..6a25de540f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/restore-from-recycle-bin/manifests.ts @@ -0,0 +1,3 @@ +import { manifest as restoreFromRecycleBinKindManifest } from './restore-from-recycle-bin.action.kind.js'; + +export const manifests = [restoreFromRecycleBinKindManifest]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/restore-from-recycle-bin/restore-from-recycle-bin.action.kind.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/restore-from-recycle-bin/restore-from-recycle-bin.action.kind.ts new file mode 100644 index 0000000000..2ac61e4679 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/restore-from-recycle-bin/restore-from-recycle-bin.action.kind.ts @@ -0,0 +1,21 @@ +import { UMB_ENTITY_ACTION_DEFAULT_KIND_MANIFEST } from '../../default/default.action.kind.js'; +import type { UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry'; + +export const manifest: UmbBackofficeManifestKind = { + type: 'kind', + alias: 'Umb.Kind.EntityAction.RecycleBin.Restore', + matchKind: 'restoreFromRecycleBin', + matchType: 'entityAction', + manifest: { + ...UMB_ENTITY_ACTION_DEFAULT_KIND_MANIFEST.manifest, + type: 'entityAction', + kind: 'restoreFromRecycleBin', + api: () => import('./restore-from-recycle-bin.action.js'), + weight: 100, + forEntityTypes: [], + meta: { + icon: 'icon-undo', + label: 'Restore...', + }, + }, +}; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/restore-from-recycle-bin/restore-from-recycle-bin.action.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/restore-from-recycle-bin/restore-from-recycle-bin.action.ts new file mode 100644 index 0000000000..5c791ea562 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/restore-from-recycle-bin/restore-from-recycle-bin.action.ts @@ -0,0 +1,11 @@ +import { UmbEntityActionBase } from '../../entity-action-base.js'; +import type { MetaEntityActionRestoreFromRecycleBinKind } from '@umbraco-cms/backoffice/extension-registry'; + +export class UmbRestoreFromRecycleBinEntityAction extends UmbEntityActionBase { + async execute() { + debugger; + console.log(`execute sort for: ${this.args.unique}`); + } +} + +export { UmbRestoreFromRecycleBinEntityAction as api }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/manifests.ts index dcdfb2d4b3..8d36e21f1a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/manifests.ts @@ -4,6 +4,7 @@ import { manifests as duplicateEntityActionManifests } from './common/duplicate/ import { manifests as moveEntityActionManifests } from './common/move/manifests.js'; import { manifests as trashEntityActionManifests } from './common/trash/manifests.js'; import { manifests as sortChildrenOfEntityActionManifests } from './common/sort-children-of/manifests.js'; +import { manifests as restoreFromRecycleBinEntityActionManifests } from './common/restore-from-recycle-bin/manifests.js'; export const manifests = [ ...defaultEntityActionManifests, @@ -12,4 +13,5 @@ export const manifests = [ ...moveEntityActionManifests, ...trashEntityActionManifests, ...sortChildrenOfEntityActionManifests, + ...restoreFromRecycleBinEntityActionManifests, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/entity-action.model.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/entity-action.model.ts index ae8066a9ab..7930417432 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/entity-action.model.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/entity-action.model.ts @@ -67,6 +67,19 @@ export interface MetaEntityActionTrashKind extends MetaEntityActionDefaultKind { itemRepositoryAlias: string; } +// RESTORE FROM RECYCLE BIN + +export interface ManifestEntityActionRestoreFromRecycleBinKind + extends ManifestEntityAction { + type: 'entityAction'; + kind: 'restoreFromRecycleBin'; +} + +export interface MetaEntityActionRestoreFromRecycleBinKind extends MetaEntityActionDefaultKind { + recycleBinRepositoryAlias: string; + itemRepositoryAlias: string; +} + // RENAME export interface ManifestEntityActionRenameServerFileKind extends ManifestEntityAction { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/index.ts index df4635f601..2c31df1873 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/index.ts @@ -15,6 +15,7 @@ import type { ManifestEntityActionDeleteFolderKind, ManifestEntityActionDefaultKind, ManifestEntityActionTrashKind, + ManifestEntityActionRestoreFromRecycleBinKind, } from './entity-action.model.js'; import type { ManifestDynamicRootOrigin, ManifestDynamicRootQueryStep } from './dynamic-root.model.js'; import type { ManifestEntityBulkAction } from './entity-bulk-action.model.js'; @@ -105,16 +106,17 @@ export type * from './workspace.model.js'; export type ManifestEntityActions = | ManifestEntityAction + | ManifestEntityActionCreateFolderKind | ManifestEntityActionDefaultKind + | ManifestEntityActionDeleteFolderKind | ManifestEntityActionDeleteKind - | ManifestEntityActionRenameServerFileKind - | ManifestEntityActionReloadTreeItemChildrenKind | ManifestEntityActionDuplicateKind | ManifestEntityActionMoveKind - | ManifestEntityActionCreateFolderKind - | ManifestEntityActionUpdateFolderKind - | ManifestEntityActionDeleteFolderKind - | ManifestEntityActionTrashKind; + | ManifestEntityActionReloadTreeItemChildrenKind + | ManifestEntityActionRenameServerFileKind + | ManifestEntityActionRestoreFromRecycleBinKind + | ManifestEntityActionTrashKind + | ManifestEntityActionUpdateFolderKind; export type ManifestWorkspaceFooterApps = | ManifestWorkspaceFooterApp From eef66e29148920277efbbdd7c5aae622a4763121 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 2 Apr 2024 21:25:17 +0200 Subject: [PATCH 028/280] register entity action for empty recycle bin --- .../empty-recycle-bin.action.kind.ts | 21 +++++++++++++++++++ .../empty-recycle-bin.action.ts | 11 ++++++++++ .../common/empty-recycle-bin/manifests.ts | 3 +++ .../core/entity-action/common/index.ts | 3 +++ .../packages/core/entity-action/manifests.ts | 2 ++ .../models/entity-action.model.ts | 11 ++++++++++ .../core/extension-registry/models/index.ts | 2 ++ .../recycle-bin/entity-action/manifests.ts | 16 +++++++++++--- 8 files changed, 66 insertions(+), 3 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/empty-recycle-bin/empty-recycle-bin.action.kind.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/empty-recycle-bin/empty-recycle-bin.action.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/empty-recycle-bin/manifests.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/empty-recycle-bin/empty-recycle-bin.action.kind.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/empty-recycle-bin/empty-recycle-bin.action.kind.ts new file mode 100644 index 0000000000..afa76d64e2 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/empty-recycle-bin/empty-recycle-bin.action.kind.ts @@ -0,0 +1,21 @@ +import { UMB_ENTITY_ACTION_DEFAULT_KIND_MANIFEST } from '../../default/default.action.kind.js'; +import type { UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry'; + +export const manifest: UmbBackofficeManifestKind = { + type: 'kind', + alias: 'Umb.Kind.EntityAction.RecycleBin.Empty', + matchKind: 'emptyRecycleBin', + matchType: 'entityAction', + manifest: { + ...UMB_ENTITY_ACTION_DEFAULT_KIND_MANIFEST.manifest, + type: 'entityAction', + kind: 'emptyRecycleBin', + api: () => import('./empty-recycle-bin.action.js'), + weight: 100, + forEntityTypes: [], + meta: { + icon: 'icon-trash', + label: 'Empty...', + }, + }, +}; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/empty-recycle-bin/empty-recycle-bin.action.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/empty-recycle-bin/empty-recycle-bin.action.ts new file mode 100644 index 0000000000..7e711e2cfc --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/empty-recycle-bin/empty-recycle-bin.action.ts @@ -0,0 +1,11 @@ +import { UmbEntityActionBase } from '../../entity-action-base.js'; +import type { MetaEntityActionEmptyRecycleBinKind } from '@umbraco-cms/backoffice/extension-registry'; + +export class UmbEmptyRecycleBinEntityAction extends UmbEntityActionBase { + async execute() { + debugger; + console.log(`execute empty for: ${this.args.unique}`); + } +} + +export { UmbEmptyRecycleBinEntityAction as api }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/empty-recycle-bin/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/empty-recycle-bin/manifests.ts new file mode 100644 index 0000000000..89241384bb --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/empty-recycle-bin/manifests.ts @@ -0,0 +1,3 @@ +import { manifest as emptyRecycleBinKindManifest } from './empty-recycle-bin.action.kind.js'; + +export const manifests = [emptyRecycleBinKindManifest]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/index.ts index b597275cdd..7a060051a3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/index.ts @@ -3,3 +3,6 @@ export * from './delete/delete.action.js'; export * from './move/move.action.js'; export * from './sort-children-of/sort-children-of.action.js'; export * from './trash/trash.action.js'; + +export { UmbRestoreFromRecycleBinEntityAction } from './restore-from-recycle-bin/restore-from-recycle-bin.action.js'; +export { UmbEmptyRecycleBinEntityAction } from './empty-recycle-bin/empty-recycle-bin.action.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/manifests.ts index 8d36e21f1a..1d4111b74e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/manifests.ts @@ -5,6 +5,7 @@ import { manifests as moveEntityActionManifests } from './common/move/manifests. import { manifests as trashEntityActionManifests } from './common/trash/manifests.js'; import { manifests as sortChildrenOfEntityActionManifests } from './common/sort-children-of/manifests.js'; import { manifests as restoreFromRecycleBinEntityActionManifests } from './common/restore-from-recycle-bin/manifests.js'; +import { manifests as emptyRecycleBinEntityActionManifests } from './common/empty-recycle-bin/manifests.js'; export const manifests = [ ...defaultEntityActionManifests, @@ -14,4 +15,5 @@ export const manifests = [ ...trashEntityActionManifests, ...sortChildrenOfEntityActionManifests, ...restoreFromRecycleBinEntityActionManifests, + ...emptyRecycleBinEntityActionManifests, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/entity-action.model.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/entity-action.model.ts index 7930417432..6a17e1e326 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/entity-action.model.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/entity-action.model.ts @@ -80,6 +80,17 @@ export interface MetaEntityActionRestoreFromRecycleBinKind extends MetaEntityAct itemRepositoryAlias: string; } +// EMPTY RECYCLE BIN +export interface ManifestEntityActionEmptyRecycleBinKind + extends ManifestEntityAction { + type: 'entityAction'; + kind: 'emptyRecycleBin'; +} + +export interface MetaEntityActionEmptyRecycleBinKind extends MetaEntityActionDefaultKind { + recycleBinRepositoryAlias: string; +} + // RENAME export interface ManifestEntityActionRenameServerFileKind extends ManifestEntityAction { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/index.ts index 2c31df1873..2517521319 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/index.ts @@ -16,6 +16,7 @@ import type { ManifestEntityActionDefaultKind, ManifestEntityActionTrashKind, ManifestEntityActionRestoreFromRecycleBinKind, + ManifestEntityActionEmptyRecycleBinKind, } from './entity-action.model.js'; import type { ManifestDynamicRootOrigin, ManifestDynamicRootQueryStep } from './dynamic-root.model.js'; import type { ManifestEntityBulkAction } from './entity-bulk-action.model.js'; @@ -111,6 +112,7 @@ export type ManifestEntityActions = | ManifestEntityActionDeleteFolderKind | ManifestEntityActionDeleteKind | ManifestEntityActionDuplicateKind + | ManifestEntityActionEmptyRecycleBinKind | ManifestEntityActionMoveKind | ManifestEntityActionReloadTreeItemChildrenKind | ManifestEntityActionRenameServerFileKind diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts index 03ba4b98dc..e5da085471 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts @@ -1,7 +1,7 @@ import { UMB_DOCUMENT_RECYCLE_BIN_REPOSITORY_ALIAS } from '../repository/index.js'; import { UMB_DOCUMENT_ENTITY_TYPE } from '../../entity.js'; import { UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS, UMB_DOCUMENT_ITEM_REPOSITORY_ALIAS } from '../../repository/index.js'; -import { UMB_DOCUMENT_RECYCLE_BIN_ENTITY_TYPE } from '../entity.js'; +import { UMB_DOCUMENT_RECYCLE_BIN_ENTITY_TYPE, UMB_DOCUMENT_RECYCLE_BIN_ROOT_ENTITY_TYPE } from '../entity.js'; import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; export const manifests: Array = [ @@ -24,7 +24,7 @@ export const manifests: Array = [ forEntityTypes: [UMB_DOCUMENT_RECYCLE_BIN_ENTITY_TYPE], meta: { itemRepositoryAlias: UMB_DOCUMENT_ITEM_REPOSITORY_ALIAS, - detailRepositoryAlias: UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS, + recycleBinRepositoryAlias: UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS, }, }, { @@ -35,7 +35,17 @@ export const manifests: Array = [ forEntityTypes: [UMB_DOCUMENT_RECYCLE_BIN_ENTITY_TYPE], meta: { itemRepositoryAlias: UMB_DOCUMENT_ITEM_REPOSITORY_ALIAS, - detailRepositoryAlias: UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS, + recycleBinRepositoryAlias: UMB_DOCUMENT_RECYCLE_BIN_REPOSITORY_ALIAS, + }, + }, + { + type: 'entityAction', + kind: 'emptyRecycleBin', + alias: 'Umb.EntityAction.Document.RecycleBin.Empty', + name: 'Empty Document Recycle Bin Entity Action', + forEntityTypes: [UMB_DOCUMENT_RECYCLE_BIN_ROOT_ENTITY_TYPE], + meta: { + recycleBinRepositoryAlias: UMB_DOCUMENT_RECYCLE_BIN_REPOSITORY_ALIAS, }, }, ]; From 02140ce0c650d1033ad617172227418bc787f3ee Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 2 Apr 2024 21:34:47 +0200 Subject: [PATCH 029/280] simplify method names --- .../empty-recycle-bin.action.kind.ts | 2 +- .../empty-recycle-bin.action.ts | 27 ++++++++++++++++--- .../document-recycle-bin.repository.ts | 10 +++---- ...document-recycle-bin.server.data-source.ts | 4 +-- 4 files changed, 32 insertions(+), 11 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/empty-recycle-bin/empty-recycle-bin.action.kind.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/empty-recycle-bin/empty-recycle-bin.action.kind.ts index afa76d64e2..bfba1de2a0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/empty-recycle-bin/empty-recycle-bin.action.kind.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/empty-recycle-bin/empty-recycle-bin.action.kind.ts @@ -15,7 +15,7 @@ export const manifest: UmbBackofficeManifestKind = { forEntityTypes: [], meta: { icon: 'icon-trash', - label: 'Empty...', + label: 'Empty Recycle Bin...', }, }, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/empty-recycle-bin/empty-recycle-bin.action.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/empty-recycle-bin/empty-recycle-bin.action.ts index 7e711e2cfc..f095c0fbe8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/empty-recycle-bin/empty-recycle-bin.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/empty-recycle-bin/empty-recycle-bin.action.ts @@ -1,10 +1,31 @@ import { UmbEntityActionBase } from '../../entity-action-base.js'; -import type { MetaEntityActionEmptyRecycleBinKind } from '@umbraco-cms/backoffice/extension-registry'; +import { UmbRequestReloadStructureForEntityEvent } from '../../request-reload-structure-for-entity.event.js'; +import { umbConfirmModal } from '@umbraco-cms/backoffice/modal'; +import { + createExtensionApiByAlias, + type MetaEntityActionEmptyRecycleBinKind, +} from '@umbraco-cms/backoffice/extension-registry'; +import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; export class UmbEmptyRecycleBinEntityAction extends UmbEntityActionBase { async execute() { - debugger; - console.log(`execute empty for: ${this.args.unique}`); + await umbConfirmModal(this._host, { + headline: `Empty Recycle Bin`, + content: `When items are deleted from the recycle bin, they will be gone forever.`, + color: 'danger', + confirmLabel: 'Empty Recycle Bin', + }); + + const recycleBinRepository = await createExtensionApiByAlias(this, this.args.meta.recycleBinRepositoryAlias); + await recycleBinRepository.requestEmpty(); + + const actionEventContext = await this.getContext(UMB_ACTION_EVENT_CONTEXT); + const event = new UmbRequestReloadStructureForEntityEvent({ + unique: this.args.unique, + entityType: this.args.entityType, + }); + + actionEventContext.dispatchEvent(event); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle-bin.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle-bin.repository.ts index 44a4f60478..44759d1e75 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle-bin.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle-bin.repository.ts @@ -10,19 +10,19 @@ export class UmbDocumentRecycleBinRepository extends UmbRepositoryBase { this.#recycleBinSource = new UmbDocumentRecycleBinServerDataSource(this); } - async requestTrash(args) { + async requestTrash(args: any) { return this.#recycleBinSource.trash(args); } - async requestRestore(args) { + async requestRestore(args: any) { return this.#recycleBinSource.restore(args); } - async requestEmptyBin() { - return this.#recycleBinSource.emptyBin(); + async requestEmpty() { + return this.#recycleBinSource.empty(); } - async requestOriginalParent(args) { + async requestOriginalParent(args: any) { return this.#recycleBinSource.getOriginalParent(args); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle-bin.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle-bin.server.data-source.ts index 3e00d33711..2b67253d6c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle-bin.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle-bin.server.data-source.ts @@ -13,11 +13,11 @@ export class UmbDocumentRecycleBinServerDataSource { return tryExecuteAndNotify(this.#host, DocumentResource.putDocumentByIdMoveToRecycleBin({ id: args.unique })); } - async restore(args: { unique: string; target: { unique: string | null } }) { + restore(args: { unique: string; target: { unique: string | null } }) { return tryExecuteAndNotify(this.#host, DocumentResource.putRecycleBinDocumentByIdRestore({ id: args.unique })); } - emptyBin() { + empty() { return tryExecuteAndNotify(this.#host, DocumentResource.deleteRecycleBinDocument()); } From 755028866bd876b6a3b88cb4304efbd4e3fe405c Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 2 Apr 2024 21:42:22 +0200 Subject: [PATCH 030/280] export repository response types --- src/Umbraco.Web.UI.Client/src/packages/core/repository/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/index.ts index 0002dac5a9..7557680428 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/repository/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repository/index.ts @@ -7,4 +7,4 @@ export * from './detail/index.js'; export type { UmbDataSourceResponse, UmbDataSourceErrorResponse } from './data-source-response.interface.js'; export type { UmbMoveDataSource, UmbMoveRepository } from './move/index.js'; export type { UmbDuplicateDataSource, UmbDuplicateRepository } from './duplicate/index.js'; -export type { UmbPagedModel } from './types.js'; +export type { UmbPagedModel, UmbRepositoryResponse, UmbRepositoryErrorResponse } from './types.js'; From 89c8bf7a5a053d38c063a6748f26e7aa001b7480 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 3 Apr 2024 08:53:39 +0200 Subject: [PATCH 031/280] add recycle bin core module --- src/Umbraco.Web.UI.Client/package.json | 1 + src/Umbraco.Web.UI.Client/tsconfig.json | 1 + 2 files changed, 2 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/package.json b/src/Umbraco.Web.UI.Client/package.json index b8c968c82c..ce6aa21b9a 100644 --- a/src/Umbraco.Web.UI.Client/package.json +++ b/src/Umbraco.Web.UI.Client/package.json @@ -61,6 +61,7 @@ "./property-action": "./dist-cms/packages/core/property-action/index.js", "./property-editor": "./dist-cms/packages/core/property-editor/index.js", "./property": "./dist-cms/packages/core/property/index.js", + "./recycle-bin": "./dist-cms/packages/core/recycle-bin/index.js", "./relation-type": "./dist-cms/packages/relations/relation-types/index.js", "./relations": "./dist-cms/packages/relations/relations/index.js", "./repository": "./dist-cms/packages/core/repository/index.js", diff --git a/src/Umbraco.Web.UI.Client/tsconfig.json b/src/Umbraco.Web.UI.Client/tsconfig.json index 33bf53145e..1ef7e39c5b 100644 --- a/src/Umbraco.Web.UI.Client/tsconfig.json +++ b/src/Umbraco.Web.UI.Client/tsconfig.json @@ -79,6 +79,7 @@ "@umbraco-cms/backoffice/property-action": ["./src/packages/core/property-action/index.ts"], "@umbraco-cms/backoffice/property-editor": ["./src/packages/core/property-editor/index.ts"], "@umbraco-cms/backoffice/property": ["./src/packages/core/property/index.ts"], + "@umbraco-cms/backoffice/recycle-bin": ["./src/packages/core/recycle-bin/index.ts"], "@umbraco-cms/backoffice/relation-type": ["./src/packages/relations/relation-types/index.ts"], "@umbraco-cms/backoffice/relations": ["./src/packages/relations/relations/index.ts"], "@umbraco-cms/backoffice/repository": ["./src/packages/core/repository/index.ts"], From 95bd7beedfdcbc2ad023b8a5fc25b5e4b5962861 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 3 Apr 2024 08:54:00 +0200 Subject: [PATCH 032/280] add interface + repo base --- .../src/packages/core/recycle-bin/index.ts | 4 ++ .../recycle-bin-data-source.interface.ts | 12 +++++ .../recycle-bin-repository-base.ts | 53 +++++++++++++++++++ .../recycle-bin-repository.interface.ts | 9 ++++ 4 files changed, 78 insertions(+) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/recycle-bin-data-source.interface.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/recycle-bin-repository-base.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/recycle-bin-repository.interface.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/index.ts new file mode 100644 index 0000000000..bae80c5872 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/index.ts @@ -0,0 +1,4 @@ +export { UmbRecycleBinRepositoryBase } from './recycle-bin-repository-base.js'; + +export type { UmbRecycleBinDataSource } from './recycle-bin-data-source.interface.js'; +export type { UmbRecycleBinRepository } from './recycle-bin-repository.interface.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/recycle-bin-data-source.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/recycle-bin-data-source.interface.ts new file mode 100644 index 0000000000..1781308748 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/recycle-bin-data-source.interface.ts @@ -0,0 +1,12 @@ +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbDataSourceResponse } from '@umbraco-cms/backoffice/repository'; + +export interface UmbRecycleBinDataSourceConstructor { + new (host: UmbControllerHost): UmbRecycleBinDataSource; +} + +export interface UmbRecycleBinDataSource { + trash(args: any): Promise; + restore(args: any): Promise; + empty(): Promise; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/recycle-bin-repository-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/recycle-bin-repository-base.ts new file mode 100644 index 0000000000..01483486e9 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/recycle-bin-repository-base.ts @@ -0,0 +1,53 @@ +import type { UmbRecycleBinRepository } from './recycle-bin-repository.interface.js'; +import type { + UmbRecycleBinDataSource, + UmbRecycleBinDataSourceConstructor, +} from './recycle-bin-data-source.interface.js'; +import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { UmbRepositoryBase } from '@umbraco-cms/backoffice/repository'; + +export abstract class UmbRecycleBinRepositoryBase extends UmbRepositoryBase implements UmbRecycleBinRepository { + #recycleBinSource: UmbRecycleBinDataSource; + + constructor(host: UmbControllerHost, recycleBinSource: UmbRecycleBinDataSourceConstructor) { + super(host); + this.#recycleBinSource = new recycleBinSource(this); + } + + async requestTrash(args: any) { + const { error } = await this.#recycleBinSource.trash(args); + + if (!error) { + const notificationContext = await this.getContext(UMB_NOTIFICATION_CONTEXT); + const notification = { data: { message: `Trashed` } }; + notificationContext.peek('positive', notification); + } + + return { error }; + } + + async requestRestore(args: any) { + const { error } = await this.#recycleBinSource.restore(args); + + if (!error) { + const notificationContext = await this.getContext(UMB_NOTIFICATION_CONTEXT); + const notification = { data: { message: `Restored` } }; + notificationContext.peek('positive', notification); + } + + return { error }; + } + + async requestEmpty() { + const { error } = await this.#recycleBinSource.empty(); + + if (!error) { + const notificationContext = await this.getContext(UMB_NOTIFICATION_CONTEXT); + const notification = { data: { message: `Recycle Bin Emptied` } }; + notificationContext.peek('positive', notification); + } + + return this.#recycleBinSource.empty(); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/recycle-bin-repository.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/recycle-bin-repository.interface.ts new file mode 100644 index 0000000000..bda95673f6 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/recycle-bin-repository.interface.ts @@ -0,0 +1,9 @@ +import type { UmbRepositoryBase } from '../repository/repository-base.js'; +import type { UmbRepositoryErrorResponse } from '@umbraco-cms/backoffice/repository'; +import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; + +export interface UmbRecycleBinRepository extends UmbRepositoryBase, UmbApi { + requestTrash(args: any): Promise; + requestRestore(args: any): Promise; + requestEmpty(): Promise; +} From d8e10b055b38b9156e8a53e66b5aaf4f68ecb101 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 3 Apr 2024 08:55:21 +0200 Subject: [PATCH 033/280] extend recycle bin repo base --- .../document-recycle-bin.repository.ts | 25 +++---------------- 1 file changed, 3 insertions(+), 22 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle-bin.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle-bin.repository.ts index 44759d1e75..2a33cafed8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle-bin.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle-bin.repository.ts @@ -1,29 +1,10 @@ +import { UmbRecycleBinRepositoryBase } from '@umbraco-cms/backoffice/recycle-bin'; import { UmbDocumentRecycleBinServerDataSource } from './document-recycle-bin.server.data-source.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import { UmbRepositoryBase } from '@umbraco-cms/backoffice/repository'; - -export class UmbDocumentRecycleBinRepository extends UmbRepositoryBase { - #recycleBinSource: UmbDocumentRecycleBinServerDataSource; +export class UmbDocumentRecycleBinRepository extends UmbRecycleBinRepositoryBase { constructor(host: UmbControllerHost) { - super(host); - this.#recycleBinSource = new UmbDocumentRecycleBinServerDataSource(this); - } - - async requestTrash(args: any) { - return this.#recycleBinSource.trash(args); - } - - async requestRestore(args: any) { - return this.#recycleBinSource.restore(args); - } - - async requestEmpty() { - return this.#recycleBinSource.empty(); - } - - async requestOriginalParent(args: any) { - return this.#recycleBinSource.getOriginalParent(args); + super(host, UmbDocumentRecycleBinServerDataSource); } } From 66bb43438b562c77259cb19508d35473ab58d248 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 3 Apr 2024 08:55:47 +0200 Subject: [PATCH 034/280] remove method from source --- ...document-recycle-bin.server.data-source.ts | 20 ++----------------- 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle-bin.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle-bin.server.data-source.ts index 2b67253d6c..2b4585adff 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle-bin.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle-bin.server.data-source.ts @@ -1,8 +1,9 @@ +import type { UmbRecycleBinDataSource } from '@umbraco-cms/backoffice/recycle-bin'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { DocumentResource } from '@umbraco-cms/backoffice/external/backend-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; -export class UmbDocumentRecycleBinServerDataSource { +export class UmbDocumentRecycleBinServerDataSource implements UmbRecycleBinDataSource { #host: UmbControllerHost; constructor(host: UmbControllerHost) { @@ -20,21 +21,4 @@ export class UmbDocumentRecycleBinServerDataSource { empty() { return tryExecuteAndNotify(this.#host, DocumentResource.deleteRecycleBinDocument()); } - - async getOriginalParent(args: { unique: string }) { - const { data, error } = await tryExecuteAndNotify( - this.#host, - DocumentResource.getRecycleBinDocumentByIdOriginalParent({ id: args.unique }), - ); - - if (data) { - const mappedData = { - unique: data.id, - }; - - return { data: mappedData }; - } - - return { error }; - } } From 38883fd18009b12ee781a24705f605f6f443fcec Mon Sep 17 00:00:00 2001 From: JesmoDev <26099018+JesmoDev@users.noreply.github.com> Date: Wed, 3 Apr 2024 09:16:21 +0200 Subject: [PATCH 035/280] init --- .../core/modal/component/modal.element.ts | 1 + .../core/modal/context/modal.context.ts | 4 + .../documents/documents/modals/manifests.ts | 7 ++ .../documents/modals/rollback/index.ts | 1 + .../modals/rollback/rollback-modal.element.ts | 86 +++++++++++++++++++ .../modals/rollback/rollback-modal.token.ts | 15 ++++ ...ent-workspace-view-info-history.element.ts | 22 ++++- 7 files changed, 135 insertions(+), 1 deletion(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.token.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/component/modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/component/modal.element.ts index b5a431d7cc..296061dbee 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/modal/component/modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/component/modal.element.ts @@ -102,6 +102,7 @@ export class UmbModalElement extends UmbLitElement { } #createContainerElement() { + console.log('Creating modal element', this.#modalContext); return this.#modalContext!.type === 'sidebar' ? this.#createSidebarElement() : this.#createDialogElement(); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/context/modal.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/context/modal.context.ts index a22c2dd674..386cfb7a77 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/modal/context/modal.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/context/modal.context.ts @@ -48,9 +48,13 @@ export class UmbModalContext = [ + { + type: 'modal', + alias: UMB_ROLLBACK_MODAL_ALIAS, + name: 'Rollback Modal', + js: () => import('./rollback/rollback-modal.element.js'), + }, { type: 'modal', alias: UMB_DOCUMENT_SAVE_MODAL_ALIAS, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/index.ts new file mode 100644 index 0000000000..fd0f63b2c3 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/index.ts @@ -0,0 +1 @@ +export * from './rollback-modal.token.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts new file mode 100644 index 0000000000..9f707a7fb4 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts @@ -0,0 +1,86 @@ +import type { UmbRollbackModalData, UmbRollbackModalValue } from './rollback-modal.token.js'; +import { css, customElement, html, state } from '@umbraco-cms/backoffice/external/lit'; +import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; + +import '../shared/document-variant-language-picker.element.js'; + +@customElement('umb-rollback-modal') +export class UmbRollbackModalElement extends UmbModalBaseElement { + #onRollback() { + console.log('Rollback'); + return; + this.modalContext?.submit(); + } + + #onCancel() { + this.modalContext?.reject(); + } + + #renderRollbackItem() { + return html` +
+ +
+

April 2, 2024 6:05 PM

+

Jesper

+

Current published version

+
+ Prevent cleanup +
+
+ `; + } + + render() { + return html` + +
+ ${this.#renderRollbackItem()} + +
+
+ `; + } + + static styles = [ + UmbTextStyles, + css` + .rollback-item { + display: flex; + justify-content: space-between; + align-items: center; + padding: var(--uui-size-space-5); + } + .rollback-item p { + margin: 0; + opacity: 0.5; + } + .rollback-item-date { + opacity: 1; + } + #main { + display: flex; + gap: var(--uui-size-space-4); + width: 100%; + } + + #box-left { + max-width: 500px; + flex: 1; + } + + #box-right { + flex: 1; + } + `, + ]; +} + +export default UmbRollbackModalElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-rollback-modal': UmbRollbackModalElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.token.ts new file mode 100644 index 0000000000..a6174f17e7 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.token.ts @@ -0,0 +1,15 @@ +import { UMB_ROLLBACK_MODAL_ALIAS } from '../manifests.js'; +import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; + +export interface UmbRollbackModalData {} +export interface UmbRollbackModalValue {} + +export const UMB_ROLLBACK_MODAL = new UmbModalToken( + UMB_ROLLBACK_MODAL_ALIAS, + { + modal: { + type: 'sidebar', + size: 'full', + }, + }, +); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info-history.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info-history.element.ts index 600d06260f..99adb3e5f6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info-history.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info-history.element.ts @@ -15,11 +15,15 @@ import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import type { AuditLogWithUsernameResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; import { DirectionModel } from '@umbraco-cms/backoffice/external/backend-api'; +import { UMB_MODAL_MANAGER_CONTEXT, type UmbModalManagerContext } from '@umbraco-cms/backoffice/modal'; +import { UMB_ROLLBACK_MODAL_ALIAS } from '../../../modals/manifests.js'; +import { UMB_ROLLBACK_MODAL } from '../../../modals/rollback/index.js'; @customElement('umb-document-workspace-view-info-history') export class UmbDocumentWorkspaceViewInfoHistoryElement extends UmbLitElement { #logRepository: UmbAuditLogRepository; #itemsPerPage = 10; + #modalContext?: UmbModalManagerContext; @property() documentUnique = ''; @@ -36,10 +40,16 @@ export class UmbDocumentWorkspaceViewInfoHistoryElement extends UmbLitElement { constructor() { super(); this.#logRepository = new UmbAuditLogRepository(this); + this.consumeContext(UMB_MODAL_MANAGER_CONTEXT, (instance) => { + this.#modalContext = instance; + }); } protected firstUpdated(): void { this.#getLogs(); + + //TODO: REMOVE THIS + this.#onRollbackModalOpen(); } async #getLogs() { @@ -88,6 +98,16 @@ export class UmbDocumentWorkspaceViewInfoHistoryElement extends UmbLitElement { this.#getLogs(); } + #onRollbackModalOpen = () => { + const modalContext = this.#modalContext?.open(this, UMB_ROLLBACK_MODAL, {}); + + if (!modalContext) return; + + modalContext.onSubmit().then(() => { + console.log('Rollback modal submitted'); + }); + }; + render() { return html`
@@ -96,7 +116,7 @@ export class UmbDocumentWorkspaceViewInfoHistoryElement extends UmbLitElement { label=${this.localize.term('actions_rollback')} look="secondary" slot="actions" - @click=${() => alert('TODO: Rollback Modal')}> + @click=${this.#onRollbackModalOpen}> From 6a2aa103fa530e62de30673c80ca13b1ec404a85 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 3 Apr 2024 11:03:39 +0200 Subject: [PATCH 036/280] use document entity type for recycle bin items --- .../documents/entity-actions/manifests.ts | 13 +++++- .../recycle-bin/entity-action/manifests.ts | 15 +------ .../documents/documents/recycle-bin/entity.ts | 1 - .../documents/recycle-bin/manifests.ts | 9 +--- .../recycle-bin/menu-item/manifests.ts | 5 ++- .../documents/recycle-bin/tree/constants.ts | 3 ++ ...ent-recycle-bin-tree.server.data-source.ts | 21 ++++++++- .../documents/recycle-bin/tree/index.ts | 2 +- .../documents/recycle-bin/tree/manifests.ts | 17 +++---- .../reload-tree-item-children/manifests.ts | 4 +- .../documents/recycle-bin/tree/types.ts | 5 ++- .../recycle-bin/workspace/constants.ts | 1 - ...nt-recycle-bin-workspace-editor.element.ts | 45 ------------------- ...ent-recycle-bin-workspace.context-token.ts | 12 ----- .../document-recycle-bin-workspace.context.ts | 34 -------------- .../documents/recycle-bin/workspace/index.ts | 1 - .../recycle-bin/workspace/manifests.ts | 14 ------ 17 files changed, 55 insertions(+), 147 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/constants.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/workspace/constants.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/workspace/document-recycle-bin-workspace-editor.element.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/workspace/document-recycle-bin-workspace.context-token.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/workspace/document-recycle-bin-workspace.context.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/workspace/index.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/workspace/manifests.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts index 7455fc7762..a2f1beea81 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts @@ -1,4 +1,4 @@ -import { UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS } from '../repository/index.js'; +import { UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS, UMB_DOCUMENT_ITEM_REPOSITORY_ALIAS } from '../repository/index.js'; import { UMB_DOCUMENT_ENTITY_TYPE } from '../entity.js'; import { UMB_DOCUMENT_PICKER_MODAL } from '../modals/index.js'; import { manifests as createManifests } from './create/manifests.js'; @@ -7,6 +7,17 @@ import { manifests as cultureAndHostnamesManifests } from './culture-and-hostnam import type { ManifestEntityAction } from '@umbraco-cms/backoffice/extension-registry'; const entityActions: Array = [ + { + type: 'entityAction', + kind: 'delete', + alias: 'Umb.EntityAction.Document.Delete', + name: 'Delete Document Entity Action', + forEntityTypes: [UMB_DOCUMENT_ENTITY_TYPE], + meta: { + itemRepositoryAlias: UMB_DOCUMENT_ITEM_REPOSITORY_ALIAS, + detailRepositoryAlias: UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS, + }, + }, { type: 'entityAction', kind: 'default', diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts index e5da085471..41af2a423c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts @@ -1,7 +1,7 @@ import { UMB_DOCUMENT_RECYCLE_BIN_REPOSITORY_ALIAS } from '../repository/index.js'; import { UMB_DOCUMENT_ENTITY_TYPE } from '../../entity.js'; import { UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS, UMB_DOCUMENT_ITEM_REPOSITORY_ALIAS } from '../../repository/index.js'; -import { UMB_DOCUMENT_RECYCLE_BIN_ENTITY_TYPE, UMB_DOCUMENT_RECYCLE_BIN_ROOT_ENTITY_TYPE } from '../entity.js'; +import { UMB_DOCUMENT_RECYCLE_BIN_ROOT_ENTITY_TYPE } from '../entity.js'; import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; export const manifests: Array = [ @@ -16,23 +16,12 @@ export const manifests: Array = [ recycleBinRepositoryAlias: UMB_DOCUMENT_RECYCLE_BIN_REPOSITORY_ALIAS, }, }, - { - type: 'entityAction', - kind: 'delete', - alias: 'Umb.EntityAction.Document.RecycleBin.Delete', - name: 'Delete Document From Recycle Bin Entity Action', - forEntityTypes: [UMB_DOCUMENT_RECYCLE_BIN_ENTITY_TYPE], - meta: { - itemRepositoryAlias: UMB_DOCUMENT_ITEM_REPOSITORY_ALIAS, - recycleBinRepositoryAlias: UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS, - }, - }, { type: 'entityAction', kind: 'restoreFromRecycleBin', alias: 'Umb.EntityAction.Document.RecycleBin.Restore', name: 'Restore Document From Recycle Bin Entity Action', - forEntityTypes: [UMB_DOCUMENT_RECYCLE_BIN_ENTITY_TYPE], + forEntityTypes: [UMB_DOCUMENT_ENTITY_TYPE], meta: { itemRepositoryAlias: UMB_DOCUMENT_ITEM_REPOSITORY_ALIAS, recycleBinRepositoryAlias: UMB_DOCUMENT_RECYCLE_BIN_REPOSITORY_ALIAS, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity.ts index 5751458ba0..1e39a86afa 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity.ts @@ -1,2 +1 @@ export const UMB_DOCUMENT_RECYCLE_BIN_ROOT_ENTITY_TYPE = 'document-recycle-bin-root'; -export const UMB_DOCUMENT_RECYCLE_BIN_ENTITY_TYPE = 'document-recycle-bin'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/manifests.ts index 96b9d4b78a..423a1afcc2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/manifests.ts @@ -2,12 +2,5 @@ import { manifests as entityActionManifests } from './entity-action/manifests.js import { manifests as menuItemManifests } from './menu-item/manifests.js'; import { manifests as repositoryManifests } from './repository/manifests.js'; import { manifests as treeManifests } from './tree/manifests.js'; -import { manifests as workspaceManifests } from './workspace/manifests.js'; -export const manifests = [ - ...entityActionManifests, - ...menuItemManifests, - ...repositoryManifests, - ...treeManifests, - ...workspaceManifests, -]; +export const manifests = [...entityActionManifests, ...menuItemManifests, ...repositoryManifests, ...treeManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/menu-item/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/menu-item/manifests.ts index 60699a97fa..418ed9c109 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/menu-item/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/menu-item/manifests.ts @@ -1,14 +1,15 @@ import { UMB_CONTENT_MENU_ALIAS } from '../../menu/manifests.js'; +import { UMB_DOCUMENT_RECYCLE_BIN_TREE_ALIAS } from '../tree/index.js'; import type { ManifestMenuItemTreeKind } from '@umbraco-cms/backoffice/extension-registry'; const menuItem: ManifestMenuItemTreeKind = { type: 'menuItem', kind: 'tree', - alias: 'Umb.MenuItem.DocumentRecycleBin', + alias: 'Umb.MenuItem.Document.RecycleBin', name: 'Document Recycle Bin Menu Item', weight: 100, meta: { - treeAlias: 'Umb.Tree.DocumentRecycleBin', + treeAlias: UMB_DOCUMENT_RECYCLE_BIN_TREE_ALIAS, label: 'Recycle Bin', icon: 'icon-trash', menus: [UMB_CONTENT_MENU_ALIAS], diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/constants.ts new file mode 100644 index 0000000000..492e6f36ed --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/constants.ts @@ -0,0 +1,3 @@ +export const UMB_DOCUMENT_RECYCLE_BIN_TREE_REPOSITORY_ALIAS = 'Umb.Repository.Document.RecycleBin.Tree'; +export const UMB_DOCUMENT_RECYCLE_BIN_TREE_STORE_ALIAS = 'Umb.Store.Document.RecycleBin.Tree'; +export const UMB_DOCUMENT_RECYCLE_BIN_TREE_ALIAS = 'Umb.Tree.Document.RecycleBin'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/document-recycle-bin-tree.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/document-recycle-bin-tree.server.data-source.ts index d5a1ee2f36..4fa19adbd0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/document-recycle-bin-tree.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/document-recycle-bin-tree.server.data-source.ts @@ -1,3 +1,4 @@ +import { UMB_DOCUMENT_ENTITY_TYPE } from '../../entity.js'; import type { UmbDocumentRecycleBinTreeItemModel } from './types.js'; import type { DocumentRecycleBinItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; import { DocumentResource } from '@umbraco-cms/backoffice/external/backend-api'; @@ -61,9 +62,25 @@ const mapper = (item: DocumentRecycleBinItemResponseModel): UmbDocumentRecycleBi return { unique: item.id, parentUnique: item.parent ? item.parent.id : null, - entityType: 'document-recycle-bin', + entityType: UMB_DOCUMENT_ENTITY_TYPE, + noAccess: false, + isTrashed: true, hasChildren: item.hasChildren, - isFolder: false, + isProtected: false, + documentType: { + unique: item.documentType.id, + icon: item.documentType.icon, + collection: item.documentType.collection ? { unique: item.documentType.collection.id } : null, + }, + variants: item.variants.map((variant) => { + return { + name: variant.name, + culture: variant.culture || null, + segment: null, // TODO: add segment to the backend API? + state: variant.state, + }; + }), name: item.variants[0]?.name, // TODO: this is not correct. We need to get it from the variants. This is a temp solution. + isFolder: false, }; }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/index.ts index 995f0b5ebf..1c6d9bc43c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/index.ts @@ -3,7 +3,7 @@ export { UMB_DOCUMENT_RECYCLE_BIN_TREE_REPOSITORY_ALIAS, UMB_DOCUMENT_RECYCLE_BIN_TREE_STORE_ALIAS, UMB_DOCUMENT_RECYCLE_BIN_TREE_ALIAS, -} from './manifests.js'; +} from './constants.js'; export { UMB_DOCUMENT_RECYCLE_BIN_TREE_STORE_CONTEXT } from './document-recycle-bin-tree.store.js'; export { type UmbDocumentRecycleBinTreeStore } from './document-recycle-bin-tree.store.js'; export * from './types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/manifests.ts index 0b7795f149..69c76b9235 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/manifests.ts @@ -1,4 +1,9 @@ -import { UMB_DOCUMENT_RECYCLE_BIN_ENTITY_TYPE, UMB_DOCUMENT_RECYCLE_BIN_ROOT_ENTITY_TYPE } from '../entity.js'; +import { UMB_DOCUMENT_RECYCLE_BIN_ROOT_ENTITY_TYPE } from '../entity.js'; +import { + UMB_DOCUMENT_RECYCLE_BIN_TREE_ALIAS, + UMB_DOCUMENT_RECYCLE_BIN_TREE_REPOSITORY_ALIAS, + UMB_DOCUMENT_RECYCLE_BIN_TREE_STORE_ALIAS, +} from './constants.js'; import { UmbDocumentRecycleBinTreeRepository } from './document-recycle-bin-tree.repository.js'; import { UmbDocumentRecycleBinTreeStore } from './document-recycle-bin-tree.store.js'; import { manifests as reloadTreeItemChildrenManifests } from './reload-tree-item-children/manifests.js'; @@ -9,10 +14,6 @@ import type { ManifestTreeStore, } from '@umbraco-cms/backoffice/extension-registry'; -export const UMB_DOCUMENT_RECYCLE_BIN_TREE_REPOSITORY_ALIAS = 'Umb.Repository.DocumentRecycleBin.Tree'; -export const UMB_DOCUMENT_RECYCLE_BIN_TREE_STORE_ALIAS = 'Umb.Store.DocumentRecycleBin.Tree'; -export const UMB_DOCUMENT_RECYCLE_BIN_TREE_ALIAS = 'Umb.Tree.DocumentRecycleBin'; - const treeRepository: ManifestRepository = { type: 'repository', alias: UMB_DOCUMENT_RECYCLE_BIN_TREE_REPOSITORY_ALIAS, @@ -40,9 +41,9 @@ const tree: ManifestTree = { const treeItem: ManifestTreeItem = { type: 'treeItem', kind: 'default', - alias: 'Umb.TreeItem.DocumentRecycleBin', - name: 'DocumentRecycleBin Tree Item', - forEntityTypes: [UMB_DOCUMENT_RECYCLE_BIN_ROOT_ENTITY_TYPE, UMB_DOCUMENT_RECYCLE_BIN_ENTITY_TYPE], + alias: 'Umb.TreeItem.Document.RecycleBin', + name: 'Document Recycle Bin Tree Item', + forEntityTypes: [UMB_DOCUMENT_RECYCLE_BIN_ROOT_ENTITY_TYPE], }; export const manifests = [treeRepository, treeStore, tree, treeItem, ...reloadTreeItemChildrenManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/reload-tree-item-children/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/reload-tree-item-children/manifests.ts index 9b90625f81..35463faee4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/reload-tree-item-children/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/reload-tree-item-children/manifests.ts @@ -1,4 +1,4 @@ -import { UMB_DOCUMENT_RECYCLE_BIN_ENTITY_TYPE, UMB_DOCUMENT_RECYCLE_BIN_ROOT_ENTITY_TYPE } from '../../entity.js'; +import { UMB_DOCUMENT_RECYCLE_BIN_ROOT_ENTITY_TYPE } from '../../entity.js'; import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; export const manifests: Array = [ @@ -7,6 +7,6 @@ export const manifests: Array = [ kind: 'reloadTreeItemChildren', alias: 'Umb.EntityAction.DocumentRecycleBin.Tree.ReloadChildrenOf', name: 'Reload Document Recycle Bin Tree Item Children Entity Action', - forEntityTypes: [UMB_DOCUMENT_RECYCLE_BIN_ENTITY_TYPE, UMB_DOCUMENT_RECYCLE_BIN_ROOT_ENTITY_TYPE], + forEntityTypes: [UMB_DOCUMENT_RECYCLE_BIN_ROOT_ENTITY_TYPE], }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/types.ts index 5c67491e8e..d84c7821f1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/types.ts @@ -1,5 +1,6 @@ -import type { UmbUniqueTreeItemModel, UmbUniqueTreeRootModel } from '@umbraco-cms/backoffice/tree'; +import type { UmbDocumentTreeItemModel } from '../../tree/index.js'; +import type { UmbUniqueTreeRootModel } from '@umbraco-cms/backoffice/tree'; -export interface UmbDocumentRecycleBinTreeItemModel extends UmbUniqueTreeItemModel {} +export interface UmbDocumentRecycleBinTreeItemModel extends UmbDocumentTreeItemModel {} export interface UmbDocumentRecycleBinTreeRootModel extends UmbUniqueTreeRootModel {} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/workspace/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/workspace/constants.ts deleted file mode 100644 index 61e0e19e34..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/workspace/constants.ts +++ /dev/null @@ -1 +0,0 @@ -export const UMB_DOCUMENT_RECYCLE_BIN_WORKSPACE_ALIAS = 'Umb.Workspace.Document.RecycleBin'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/workspace/document-recycle-bin-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/workspace/document-recycle-bin-workspace-editor.element.ts deleted file mode 100644 index 7477cf00d0..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/workspace/document-recycle-bin-workspace-editor.element.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { UMB_DOCUMENT_RECYCLE_BIN_WORKSPACE_CONTEXT } from './document-recycle-bin-workspace.context-token.js'; -import { css, html, customElement, property } from '@umbraco-cms/backoffice/external/lit'; -import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import type { ManifestWorkspace } from '@umbraco-cms/backoffice/extension-registry'; - -const elementName = 'umb-document-recycle-bin-editor'; - -@customElement(elementName) -export class UmbDocumentRecycleBinWorkspaceEditorElement extends UmbLitElement { - @property({ attribute: false }) - manifest?: ManifestWorkspace; - - #workspaceContext?: typeof UMB_DOCUMENT_RECYCLE_BIN_WORKSPACE_CONTEXT.TYPE; - - constructor() { - super(); - - this.consumeContext(UMB_DOCUMENT_RECYCLE_BIN_WORKSPACE_CONTEXT, (workspaceContext) => { - this.#workspaceContext = workspaceContext; - debugger; - }); - } - - render() { - return html`
Document Recycle Bin
`; - } - - static styles = [ - css` - :host { - display: block; - width: 100%; - height: 100%; - } - `, - ]; -} - -export { UmbDocumentRecycleBinWorkspaceEditorElement as element }; - -declare global { - interface HTMLElementTagNameMap { - [elementName]: UmbDocumentRecycleBinWorkspaceEditorElement; - } -} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/workspace/document-recycle-bin-workspace.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/workspace/document-recycle-bin-workspace.context-token.ts deleted file mode 100644 index 51b8c272eb..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/workspace/document-recycle-bin-workspace.context-token.ts +++ /dev/null @@ -1,12 +0,0 @@ -import type { UmbDocumentRecycleBinWorkspaceContext } from './document-recycle-bin-workspace.context.js'; -import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import type { UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; - -export const UMB_DOCUMENT_RECYCLE_BIN_WORKSPACE_CONTEXT = new UmbContextToken< - UmbWorkspaceContext, - UmbDocumentRecycleBinWorkspaceContext ->( - 'UmbWorkspaceContext', - undefined, - (context): context is UmbDocumentRecycleBinWorkspaceContext => context.getEntityType?.() === 'document-recycle-bin', -); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/workspace/document-recycle-bin-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/workspace/document-recycle-bin-workspace.context.ts deleted file mode 100644 index 65163ed83f..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/workspace/document-recycle-bin-workspace.context.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { UMB_DOCUMENT_RECYCLE_BIN_WORKSPACE_ALIAS } from './constants.js'; -import { UmbDocumentRecycleBinWorkspaceEditorElement } from './document-recycle-bin-workspace-editor.element.js'; -import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; -import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import type { UmbRoutableWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; -import { UmbWorkspaceRouteManager } from '@umbraco-cms/backoffice/workspace'; - -export class UmbDocumentRecycleBinWorkspaceContext extends UmbControllerBase implements UmbRoutableWorkspaceContext { - public readonly workspaceAlias = UMB_DOCUMENT_RECYCLE_BIN_WORKSPACE_ALIAS; - public readonly routes = new UmbWorkspaceRouteManager(this); - - constructor(host: UmbControllerHost) { - super(host, 'Umb.Workspace.Document.RecycleBin'); - - this.routes.setRoutes([ - { - path: 'edit/:unique', - component: UmbDocumentRecycleBinWorkspaceEditorElement, - setup: (_component, info) => { - const unique = info.match.params.unique; - console.log('unique', unique); - }, - }, - ]); - } - - getEntityType() { - return 'document-recycle-bin'; - } - - destroy(): void {} -} - -export { UmbDocumentRecycleBinWorkspaceContext as api }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/workspace/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/workspace/index.ts deleted file mode 100644 index 8b13789179..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/workspace/index.ts +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/workspace/manifests.ts deleted file mode 100644 index cd04c18b64..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/workspace/manifests.ts +++ /dev/null @@ -1,14 +0,0 @@ -import type { ManifestWorkspaces } from '@umbraco-cms/backoffice/extension-registry'; - -const workspace: ManifestWorkspaces = { - type: 'workspace', - kind: 'routable', - alias: 'Umb.Workspace.Document.RecycleBin', - name: 'Document Recycle Bin Workspace', - api: () => import('./document-recycle-bin-workspace.context.js'), - meta: { - entityType: 'document-recycle-bin', - }, -}; - -export const manifests = [workspace]; From fcad6f6cb1bc7ee0a5ac2145c62ceb012d96c19b Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 3 Apr 2024 11:05:43 +0200 Subject: [PATCH 037/280] align delete and trash weights --- .../core/entity-action/common/delete/delete.action.kind.ts | 2 +- .../core/entity-action/common/trash/trash.action.kind.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/delete/delete.action.kind.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/delete/delete.action.kind.ts index bf2f0136f6..12e5b0c6c1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/delete/delete.action.kind.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/delete/delete.action.kind.ts @@ -11,7 +11,7 @@ export const manifest: UmbBackofficeManifestKind = { type: 'entityAction', kind: 'delete', api: () => import('./delete.action.js'), - weight: 900, + weight: 1100, forEntityTypes: [], meta: { icon: 'icon-trash', diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/trash/trash.action.kind.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/trash/trash.action.kind.ts index 53a7273139..317632b65b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/trash/trash.action.kind.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/trash/trash.action.kind.ts @@ -11,7 +11,7 @@ export const manifest: UmbBackofficeManifestKind = { type: 'entityAction', kind: 'trash', api: () => import('./trash.action.js'), - weight: 1100, + weight: 1050, forEntityTypes: [], meta: { icon: 'icon-trash', From 1cf7b495eb81a9f1fa901cd6908d8490f4db644e Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 3 Apr 2024 12:09:36 +0200 Subject: [PATCH 038/280] move entity actions to recycle bin module --- .../src/packages/core/entity-action/common/index.ts | 4 ---- .../src/packages/core/entity-action/manifests.ts | 6 ------ .../empty-recycle-bin/empty-recycle-bin.action.kind.ts | 2 +- .../empty-recycle-bin/empty-recycle-bin.action.ts | 4 ++-- .../entity-action}/empty-recycle-bin/manifests.ts | 0 .../src/packages/core/recycle-bin/entity-action/index.ts | 3 +++ .../entity-action}/restore-from-recycle-bin/manifests.ts | 0 .../restore-from-recycle-bin.action.kind.ts | 2 +- .../restore-from-recycle-bin.action.ts | 2 +- .../entity-action}/trash/manifests.ts | 0 .../entity-action}/trash/trash.action.kind.ts | 2 +- .../entity-action}/trash/trash.action.ts | 4 ++-- .../src/packages/core/recycle-bin/index.ts | 5 +++++ .../src/packages/core/recycle-bin/manifests.ts | 9 +++++++++ 14 files changed, 25 insertions(+), 18 deletions(-) rename src/Umbraco.Web.UI.Client/src/packages/core/{entity-action/common => recycle-bin/entity-action}/empty-recycle-bin/empty-recycle-bin.action.kind.ts (83%) rename src/Umbraco.Web.UI.Client/src/packages/core/{entity-action/common => recycle-bin/entity-action}/empty-recycle-bin/empty-recycle-bin.action.ts (83%) rename src/Umbraco.Web.UI.Client/src/packages/core/{entity-action/common => recycle-bin/entity-action}/empty-recycle-bin/manifests.ts (100%) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/index.ts rename src/Umbraco.Web.UI.Client/src/packages/core/{entity-action/common => recycle-bin/entity-action}/restore-from-recycle-bin/manifests.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/core/{entity-action/common => recycle-bin/entity-action}/restore-from-recycle-bin/restore-from-recycle-bin.action.kind.ts (83%) rename src/Umbraco.Web.UI.Client/src/packages/core/{entity-action/common => recycle-bin/entity-action}/restore-from-recycle-bin/restore-from-recycle-bin.action.ts (81%) rename src/Umbraco.Web.UI.Client/src/packages/core/{entity-action/common => recycle-bin/entity-action}/trash/manifests.ts (100%) rename src/Umbraco.Web.UI.Client/src/packages/core/{entity-action/common => recycle-bin/entity-action}/trash/trash.action.kind.ts (83%) rename src/Umbraco.Web.UI.Client/src/packages/core/{entity-action/common => recycle-bin/entity-action}/trash/trash.action.ts (88%) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/manifests.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/index.ts index 7a060051a3..005791ff7b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/index.ts @@ -2,7 +2,3 @@ export * from './duplicate/duplicate.action.js'; export * from './delete/delete.action.js'; export * from './move/move.action.js'; export * from './sort-children-of/sort-children-of.action.js'; -export * from './trash/trash.action.js'; - -export { UmbRestoreFromRecycleBinEntityAction } from './restore-from-recycle-bin/restore-from-recycle-bin.action.js'; -export { UmbEmptyRecycleBinEntityAction } from './empty-recycle-bin/empty-recycle-bin.action.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/manifests.ts index 1d4111b74e..bbe018524f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/manifests.ts @@ -2,18 +2,12 @@ import { manifests as defaultEntityActionManifests } from './default/manifests.j import { manifests as deleteEntityActionManifests } from './common/delete/manifests.js'; import { manifests as duplicateEntityActionManifests } from './common/duplicate/manifests.js'; import { manifests as moveEntityActionManifests } from './common/move/manifests.js'; -import { manifests as trashEntityActionManifests } from './common/trash/manifests.js'; import { manifests as sortChildrenOfEntityActionManifests } from './common/sort-children-of/manifests.js'; -import { manifests as restoreFromRecycleBinEntityActionManifests } from './common/restore-from-recycle-bin/manifests.js'; -import { manifests as emptyRecycleBinEntityActionManifests } from './common/empty-recycle-bin/manifests.js'; export const manifests = [ ...defaultEntityActionManifests, ...deleteEntityActionManifests, ...duplicateEntityActionManifests, ...moveEntityActionManifests, - ...trashEntityActionManifests, ...sortChildrenOfEntityActionManifests, - ...restoreFromRecycleBinEntityActionManifests, - ...emptyRecycleBinEntityActionManifests, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/empty-recycle-bin/empty-recycle-bin.action.kind.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/empty-recycle-bin/empty-recycle-bin.action.kind.ts similarity index 83% rename from src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/empty-recycle-bin/empty-recycle-bin.action.kind.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/empty-recycle-bin/empty-recycle-bin.action.kind.ts index bfba1de2a0..de15a8826a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/empty-recycle-bin/empty-recycle-bin.action.kind.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/empty-recycle-bin/empty-recycle-bin.action.kind.ts @@ -1,4 +1,4 @@ -import { UMB_ENTITY_ACTION_DEFAULT_KIND_MANIFEST } from '../../default/default.action.kind.js'; +import { UMB_ENTITY_ACTION_DEFAULT_KIND_MANIFEST } from '../../../entity-action/default/default.action.kind.js'; import type { UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry'; export const manifest: UmbBackofficeManifestKind = { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/empty-recycle-bin/empty-recycle-bin.action.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/empty-recycle-bin/empty-recycle-bin.action.ts similarity index 83% rename from src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/empty-recycle-bin/empty-recycle-bin.action.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/empty-recycle-bin/empty-recycle-bin.action.ts index f095c0fbe8..c718739f1b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/empty-recycle-bin/empty-recycle-bin.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/empty-recycle-bin/empty-recycle-bin.action.ts @@ -1,5 +1,5 @@ -import { UmbEntityActionBase } from '../../entity-action-base.js'; -import { UmbRequestReloadStructureForEntityEvent } from '../../request-reload-structure-for-entity.event.js'; +import { UmbEntityActionBase } from '../../../entity-action/entity-action-base.js'; +import { UmbRequestReloadStructureForEntityEvent } from '../../../entity-action/request-reload-structure-for-entity.event.js'; import { umbConfirmModal } from '@umbraco-cms/backoffice/modal'; import { createExtensionApiByAlias, diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/empty-recycle-bin/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/empty-recycle-bin/manifests.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/empty-recycle-bin/manifests.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/empty-recycle-bin/manifests.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/index.ts new file mode 100644 index 0000000000..df73603f45 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/index.ts @@ -0,0 +1,3 @@ +export { UmbTrashEntityAction } from './trash/trash.action.js'; +export { UmbRestoreFromRecycleBinEntityAction } from './restore-from-recycle-bin/restore-from-recycle-bin.action.js'; +export { UmbEmptyRecycleBinEntityAction } from './empty-recycle-bin/empty-recycle-bin.action.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/restore-from-recycle-bin/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/manifests.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/restore-from-recycle-bin/manifests.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/manifests.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/restore-from-recycle-bin/restore-from-recycle-bin.action.kind.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/restore-from-recycle-bin.action.kind.ts similarity index 83% rename from src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/restore-from-recycle-bin/restore-from-recycle-bin.action.kind.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/restore-from-recycle-bin.action.kind.ts index 2ac61e4679..3be8eeefcc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/restore-from-recycle-bin/restore-from-recycle-bin.action.kind.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/restore-from-recycle-bin.action.kind.ts @@ -1,4 +1,4 @@ -import { UMB_ENTITY_ACTION_DEFAULT_KIND_MANIFEST } from '../../default/default.action.kind.js'; +import { UMB_ENTITY_ACTION_DEFAULT_KIND_MANIFEST } from '../../../entity-action/default/default.action.kind.js'; import type { UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry'; export const manifest: UmbBackofficeManifestKind = { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/restore-from-recycle-bin/restore-from-recycle-bin.action.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/restore-from-recycle-bin.action.ts similarity index 81% rename from src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/restore-from-recycle-bin/restore-from-recycle-bin.action.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/restore-from-recycle-bin.action.ts index 5c791ea562..c15e204383 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/restore-from-recycle-bin/restore-from-recycle-bin.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/restore-from-recycle-bin.action.ts @@ -1,4 +1,4 @@ -import { UmbEntityActionBase } from '../../entity-action-base.js'; +import { UmbEntityActionBase } from '../../../entity-action/entity-action-base.js'; import type { MetaEntityActionRestoreFromRecycleBinKind } from '@umbraco-cms/backoffice/extension-registry'; export class UmbRestoreFromRecycleBinEntityAction extends UmbEntityActionBase { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/trash/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/trash/manifests.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/trash/manifests.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/trash/manifests.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/trash/trash.action.kind.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/trash/trash.action.kind.ts similarity index 83% rename from src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/trash/trash.action.kind.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/trash/trash.action.kind.ts index 317632b65b..fa78c1185b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/trash/trash.action.kind.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/trash/trash.action.kind.ts @@ -1,4 +1,4 @@ -import { UMB_ENTITY_ACTION_DEFAULT_KIND_MANIFEST } from '../../default/default.action.kind.js'; +import { UMB_ENTITY_ACTION_DEFAULT_KIND_MANIFEST } from '../../../entity-action/default/default.action.kind.js'; import type { UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry'; export const manifest: UmbBackofficeManifestKind = { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/trash/trash.action.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/trash/trash.action.ts similarity index 88% rename from src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/trash/trash.action.ts rename to src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/trash/trash.action.ts index 94e2da1304..09d8f6c08a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/trash/trash.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/trash/trash.action.ts @@ -1,5 +1,5 @@ -import { UmbEntityActionBase } from '../../entity-action-base.js'; -import { UmbRequestReloadStructureForEntityEvent } from '../../request-reload-structure-for-entity.event.js'; +import { UmbEntityActionBase } from '../../../entity-action/entity-action-base.js'; +import { UmbRequestReloadStructureForEntityEvent } from '../../../entity-action/request-reload-structure-for-entity.event.js'; import type { MetaEntityActionTrashKind } from '@umbraco-cms/backoffice/extension-registry'; import { createExtensionApiByAlias } from '@umbraco-cms/backoffice/extension-registry'; import { umbConfirmModal } from '@umbraco-cms/backoffice/modal'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/index.ts index bae80c5872..49cec0d017 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/index.ts @@ -1,4 +1,9 @@ export { UmbRecycleBinRepositoryBase } from './recycle-bin-repository-base.js'; +export { + UmbTrashEntityAction, + UmbRestoreFromRecycleBinEntityAction, + UmbEmptyRecycleBinEntityAction, +} from './entity-action/index.js'; export type { UmbRecycleBinDataSource } from './recycle-bin-data-source.interface.js'; export type { UmbRecycleBinRepository } from './recycle-bin-repository.interface.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/manifests.ts new file mode 100644 index 0000000000..49e2d1fd73 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/manifests.ts @@ -0,0 +1,9 @@ +import { manifests as trashEntityActionManifests } from '../recycle-bin/entity-action/trash/manifests.js'; +import { manifests as restoreFromRecycleBinEntityActionManifests } from '../recycle-bin/entity-action/restore-from-recycle-bin/manifests.js'; +import { manifests as emptyRecycleBinEntityActionManifests } from '../recycle-bin/entity-action/empty-recycle-bin/manifests.js'; + +export const manifests = [ + ...trashEntityActionManifests, + ...restoreFromRecycleBinEntityActionManifests, + ...emptyRecycleBinEntityActionManifests, +]; From ec2befe77b3db8a9e55ff6e850e8fdd8d622509f Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 3 Apr 2024 12:11:58 +0200 Subject: [PATCH 039/280] register recycle bin manifests --- src/Umbraco.Web.UI.Client/src/packages/core/manifests.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/manifests.ts index 66d11f9961..620b0e6c1c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/manifests.ts @@ -8,6 +8,7 @@ import { manifests as localizationManifests } from './localization/manifests.js' import { manifests as modalManifests } from './modal/common/manifests.js'; import { manifests as propertyActionManifests } from './property-action/manifests.js'; import { manifests as propertyEditorManifests } from './property-editor/manifests.js'; +import { manifests as recycleBinManifests } from './recycle-bin/manifests.js'; import { manifests as sectionManifests } from './section/manifests.js'; import { manifests as serverFileSystemManifests } from './server-file-system/manifests.js'; import { manifests as settingsManifests } from './settings/manifests.js'; @@ -28,6 +29,7 @@ export const manifests: Array = [ ...modalManifests, ...propertyActionManifests, ...propertyEditorManifests, + ...recycleBinManifests, ...sectionManifests, ...serverFileSystemManifests, ...settingsManifests, From 43f91defd7eac67be9293bfef784ca9801c1af6c Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 3 Apr 2024 12:24:36 +0200 Subject: [PATCH 040/280] reload children when recycle bin is emptied --- .../empty-recycle-bin/empty-recycle-bin.action.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/empty-recycle-bin/empty-recycle-bin.action.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/empty-recycle-bin/empty-recycle-bin.action.ts index c718739f1b..9c1868b53e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/empty-recycle-bin/empty-recycle-bin.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/empty-recycle-bin/empty-recycle-bin.action.ts @@ -6,6 +6,7 @@ import { type MetaEntityActionEmptyRecycleBinKind, } from '@umbraco-cms/backoffice/extension-registry'; import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; +import { UmbReloadTreeItemChildrenRequestEntityActionEvent } from '@umbraco-cms/backoffice/tree'; export class UmbEmptyRecycleBinEntityAction extends UmbEntityActionBase { async execute() { @@ -20,7 +21,7 @@ export class UmbEmptyRecycleBinEntityAction extends UmbEntityActionBase Date: Wed, 3 Apr 2024 12:27:30 +0200 Subject: [PATCH 041/280] set children flag based on server result --- .../core/tree/tree-item/tree-item-base/tree-item-context-base.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-context-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-context-base.ts index 05ff0d5a58..ac71003504 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-context-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-context-base.ts @@ -171,6 +171,7 @@ export abstract class UmbTreeItemContextBase 0); this.pagination.setTotalItems(data.total); } From c9b117665e355bb715734b3bdb02b14ee89b4460 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 3 Apr 2024 12:28:01 +0200 Subject: [PATCH 042/280] don't observe store for children --- .../tree-item-base/tree-item-context-base.ts | 27 ------------------- 1 file changed, 27 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-context-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-context-base.ts index ac71003504..09e8ce9c90 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-context-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-context-base.ts @@ -41,7 +41,6 @@ export abstract class UmbTreeItemContextBase { @@ -300,28 +295,6 @@ export abstract class UmbTreeItemContextBase children.length > 0), - ); - - // observe if any children will be added runtime to a tree item. Nested items/folders etc. - this.observe(hasChildrenObservable, (hasChildren) => { - /* we need to skip the first value, because it will also return false until a child is in the store - we therefor rely on the value from the tree item itself */ - if (this.#hasChildrenInitValueFlag === true) { - this.#hasChildren.setValue(hasChildren); - } - this.#hasChildrenInitValueFlag = true; - }); - } - #onReloadRequest = (event: UmbEntityActionEvent) => { if (event.getUnique() !== this.unique) return; if (event.getEntityType() !== this.entityType) return; From bdf591ac9c660fd372df10f9d22f3d17e5c5682f Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 3 Apr 2024 12:43:14 +0200 Subject: [PATCH 043/280] remove unused --- .../documents/documents/recycle-bin/entity-action/manifests.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts index 41af2a423c..1fc4073ffd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts @@ -1,6 +1,6 @@ import { UMB_DOCUMENT_RECYCLE_BIN_REPOSITORY_ALIAS } from '../repository/index.js'; import { UMB_DOCUMENT_ENTITY_TYPE } from '../../entity.js'; -import { UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS, UMB_DOCUMENT_ITEM_REPOSITORY_ALIAS } from '../../repository/index.js'; +import { UMB_DOCUMENT_ITEM_REPOSITORY_ALIAS } from '../../repository/index.js'; import { UMB_DOCUMENT_RECYCLE_BIN_ROOT_ENTITY_TYPE } from '../entity.js'; import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; From 55168364291d7cff654426dda100aefaee7d6227 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 3 Apr 2024 15:29:46 +0200 Subject: [PATCH 044/280] register tree item for document root --- .../packages/documents/documents/tree/manifests.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/manifests.ts index 281c0d85a7..5b964c6b94 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/manifests.ts @@ -42,7 +42,15 @@ const treeItem: ManifestTreeItem = { name: 'Document Tree Item', element: () => import('./tree-item/document-tree-item.element.js'), api: UmbDocumentTreeItemContext, - forEntityTypes: [UMB_DOCUMENT_ROOT_ENTITY_TYPE, UMB_DOCUMENT_ENTITY_TYPE], + forEntityTypes: [UMB_DOCUMENT_ENTITY_TYPE], }; -export const manifests = [...reloadTreeItemChildrenManifests, tree, treeItem, treeRepository, treeStore]; +const rootTreeItem: ManifestTreeItem = { + type: 'treeItem', + kind: 'default', + alias: 'Umb.TreeItem.Document.Root', + name: 'Document Tree Item', + forEntityTypes: [UMB_DOCUMENT_ROOT_ENTITY_TYPE], +}; + +export const manifests = [...reloadTreeItemChildrenManifests, tree, treeItem, rootTreeItem, treeRepository, treeStore]; From 83d7e55ce779d46e600f22a964964d26762219e0 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 3 Apr 2024 16:12:30 +0200 Subject: [PATCH 045/280] add method to get original parent to repo + data source --- .../recycle-bin-data-source.interface.ts | 1 + .../recycle-bin/recycle-bin-repository-base.ts | 4 ++++ .../recycle-bin-repository.interface.ts | 3 ++- .../document-recycle-bin.server.data-source.ts | 17 +++++++++++++++++ 4 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/recycle-bin-data-source.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/recycle-bin-data-source.interface.ts index 1781308748..b0de7b0ab9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/recycle-bin-data-source.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/recycle-bin-data-source.interface.ts @@ -9,4 +9,5 @@ export interface UmbRecycleBinDataSource { trash(args: any): Promise; restore(args: any): Promise; empty(): Promise; + getOriginalParent(args: any): Promise; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/recycle-bin-repository-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/recycle-bin-repository-base.ts index 01483486e9..ac12e66d1c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/recycle-bin-repository-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/recycle-bin-repository-base.ts @@ -50,4 +50,8 @@ export abstract class UmbRecycleBinRepositoryBase extends UmbRepositoryBase impl return this.#recycleBinSource.empty(); } + + async requestOriginalParent(args: any) { + return this.#recycleBinSource.getOriginalParent(args); + } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/recycle-bin-repository.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/recycle-bin-repository.interface.ts index bda95673f6..cda0a2448a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/recycle-bin-repository.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/recycle-bin-repository.interface.ts @@ -1,9 +1,10 @@ import type { UmbRepositoryBase } from '../repository/repository-base.js'; -import type { UmbRepositoryErrorResponse } from '@umbraco-cms/backoffice/repository'; +import type { UmbRepositoryErrorResponse, UmbRepositoryResponse } from '@umbraco-cms/backoffice/repository'; import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; export interface UmbRecycleBinRepository extends UmbRepositoryBase, UmbApi { requestTrash(args: any): Promise; requestRestore(args: any): Promise; requestEmpty(): Promise; + requestOriginalParent(args: any): Promise>; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle-bin.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle-bin.server.data-source.ts index 2b4585adff..7d59389943 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle-bin.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle-bin.server.data-source.ts @@ -21,4 +21,21 @@ export class UmbDocumentRecycleBinServerDataSource implements UmbRecycleBinDataS empty() { return tryExecuteAndNotify(this.#host, DocumentResource.deleteRecycleBinDocument()); } + + async getOriginalParent(args: { unique: string }) { + const { data, error } = await tryExecuteAndNotify( + this.#host, + DocumentResource.getRecycleBinDocumentByIdOriginalParent({ id: args.unique }), + ); + + if (data) { + const mappedData = { + unique: data.id, + }; + + return { data: mappedData }; + } + + return { error }; + } } From 63dcfa5955482429eb2c3b8f5fcbd3eda9a6f7e3 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 3 Apr 2024 16:12:55 +0200 Subject: [PATCH 046/280] wip restore modal --- .../models/entity-action.model.ts | 1 + .../empty-recycle-bin.action.ts | 6 +- .../restore-from-recycle-bin/manifests.ts | 12 +- .../restore-from-recycle-bin/modal/index.ts | 2 + .../restore-from-recycle-bin-modal.element.ts | 123 ++++++++++++++++++ .../restore-from-recycle-bin-modal.token.ts | 25 ++++ .../restore-from-recycle-bin.action.kind.ts | 1 + .../restore-from-recycle-bin.action.ts | 29 ++++- .../entity-action/trash/trash.action.ts | 5 +- .../recycle-bin/entity-action/manifests.ts | 2 + 10 files changed, 200 insertions(+), 6 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/restore-from-recycle-bin-modal.element.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/restore-from-recycle-bin-modal.token.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/entity-action.model.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/entity-action.model.ts index 6a17e1e326..3be5173679 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/entity-action.model.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/entity-action.model.ts @@ -78,6 +78,7 @@ export interface ManifestEntityActionRestoreFromRecycleBinKind export interface MetaEntityActionRestoreFromRecycleBinKind extends MetaEntityActionDefaultKind { recycleBinRepositoryAlias: string; itemRepositoryAlias: string; + pickerModal: UmbModalToken | string; } // EMPTY RECYCLE BIN diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/empty-recycle-bin/empty-recycle-bin.action.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/empty-recycle-bin/empty-recycle-bin.action.ts index 9c1868b53e..d2059161be 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/empty-recycle-bin/empty-recycle-bin.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/empty-recycle-bin/empty-recycle-bin.action.ts @@ -1,5 +1,6 @@ import { UmbEntityActionBase } from '../../../entity-action/entity-action-base.js'; import { UmbRequestReloadStructureForEntityEvent } from '../../../entity-action/request-reload-structure-for-entity.event.js'; +import type { UmbRecycleBinRepository } from '../../recycle-bin-repository.interface.js'; import { umbConfirmModal } from '@umbraco-cms/backoffice/modal'; import { createExtensionApiByAlias, @@ -17,7 +18,10 @@ export class UmbEmptyRecycleBinEntityAction extends UmbEntityActionBase(this, this.args.meta.recycleBinRepositoryAlias); + const recycleBinRepository = await createExtensionApiByAlias( + this, + this.args.meta.recycleBinRepositoryAlias, + ); await recycleBinRepository.requestEmpty(); const actionEventContext = await this.getContext(UMB_ACTION_EVENT_CONTEXT); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/manifests.ts index 6a25de540f..09766fef9c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/manifests.ts @@ -1,3 +1,11 @@ -import { manifest as restoreFromRecycleBinKindManifest } from './restore-from-recycle-bin.action.kind.js'; +import { manifest as kindManifest } from './restore-from-recycle-bin.action.kind.js'; -export const manifests = [restoreFromRecycleBinKindManifest]; +export const manifests = [ + kindManifest, + { + type: 'modal', + alias: 'Umb.Modal.RecycleBin.Restore', + name: 'Restore From Recycle Bin Modal', + js: () => import('./modal/restore-from-recycle-bin-modal.element.js'), + }, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/index.ts new file mode 100644 index 0000000000..b4d1511566 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/index.ts @@ -0,0 +1,2 @@ +export * from './restore-from-recycle-bin-modal.token.js'; +export * from './restore-from-recycle-bin-modal.element.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/restore-from-recycle-bin-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/restore-from-recycle-bin-modal.element.ts new file mode 100644 index 0000000000..85d45dee42 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/restore-from-recycle-bin-modal.element.ts @@ -0,0 +1,123 @@ +import type { UmbRecycleBinRepository } from '../../../recycle-bin-repository.interface.js'; +import type { + UmbRestoreFromRecycleBinModalData, + UmbRestoreFromRecycleBinModalValue, +} from './restore-from-recycle-bin-modal.token.js'; +import type { PropertyValueMap } from '@umbraco-cms/backoffice/external/lit'; +import { html, customElement, state, nothing, css } from '@umbraco-cms/backoffice/external/lit'; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; +import { UMB_MODAL_MANAGER_CONTEXT, UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; +import { createExtensionApiByAlias } from '@umbraco-cms/backoffice/extension-registry'; +import { UMB_DOCUMENT_PICKER_MODAL } from '@umbraco-cms/backoffice/document'; +import type { UmbItemRepository } from '@umbraco-cms/backoffice/repository'; + +const elementName = 'umb-restore-from-recycle-bin-modal'; + +@customElement(elementName) +export class UmbRestoreFromRecycleBinModalElement extends UmbModalBaseElement< + UmbRestoreFromRecycleBinModalData, + UmbRestoreFromRecycleBinModalValue +> { + @state() + _customSelectDestination = false; + + @state() + _destinationItem: any; + + constructor() { + super(); + } + + protected async firstUpdated(_changedProperties: PropertyValueMap | Map): Promise { + super.firstUpdated(_changedProperties); + + const restoreDestination = await this.#requestRestoreDestination(); + + if (!restoreDestination) { + this._customSelectDestination = true; + this.requestUpdate(); + return; + } + } + + async #requestRestoreDestination(): Promise { + if (!this.data?.unique) throw new Error('Cannot restore an item without a unique identifier.'); + if (!this.data?.recycleBinRepositoryAlias) + throw new Error('Cannot restore an item without a recycle bin repository alias.'); + + const recycleBinRepository = await createExtensionApiByAlias( + this, + this.data.recycleBinRepositoryAlias, + ); + + const { data } = await recycleBinRepository.requestOriginalParent({ + unique: this.data.unique, + }); + + // The original parent is still available. We will restore to that + if (data) { + return data.unique; + } + + return undefined; + } + + async #onSelectCustomDestination() { + const modalManager = await this.getContext(UMB_MODAL_MANAGER_CONTEXT); + const modal = modalManager.open(this, UMB_DOCUMENT_PICKER_MODAL, { + data: { + multiple: false, + }, + }); + + const { selection } = await modal.onSubmit(); + + if (selection.length > 0) { + const destinationUnique = selection[0]; + + console.log(data); + debugger; + } + } + + async requestDestinationItem(unique: string | null) { + if (!this.data?.itemRepositoryAlias) throw new Error('Cannot restore an item without an item repository alias.'); + + const itemRepository = await createExtensionApiByAlias>(this, this.data.itemRepositoryAlias); + const { data } = await itemRepository.requestItems([unique]); + } + + render() { + return html` + + + ${this._customSelectDestination + ? html` +

Cannot automatically restore this item.

+

+ There is no location where this item can be automatically restored. You can select a new location + below. +

+ + Select location + ` + : nothing} +
+
+ `; + } + + #renderDestination() {} + + #renderCustomSelection() {} + + static styles = [UmbTextStyles, css``]; +} + +export default UmbRestoreFromRecycleBinModalElement; + +declare global { + interface HTMLElementTagNameMap { + [elementName]: UmbRestoreFromRecycleBinModalElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/restore-from-recycle-bin-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/restore-from-recycle-bin-modal.token.ts new file mode 100644 index 0000000000..0ef015f444 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/restore-from-recycle-bin-modal.token.ts @@ -0,0 +1,25 @@ +import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; + +export interface UmbRestoreFromRecycleBinModalData { + unique: string; + entityType: string; + recycleBinRepositoryAlias: string; + itemRepositoryAlias: string; +} + +export interface UmbRestoreFromRecycleBinModalValue { + destination: { + unique: string; + entityType: string; + }; +} + +export const UMB_RESTORE_FROM_RECYCLE_BIN_MODAL = new UmbModalToken< + UmbRestoreFromRecycleBinModalData, + UmbRestoreFromRecycleBinModalValue +>('Umb.Modal.RecycleBin.Restore', { + modal: { + type: 'sidebar', + size: 'small', + }, +}); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/restore-from-recycle-bin.action.kind.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/restore-from-recycle-bin.action.kind.ts index 3be8eeefcc..18edd68da0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/restore-from-recycle-bin.action.kind.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/restore-from-recycle-bin.action.kind.ts @@ -16,6 +16,7 @@ export const manifest: UmbBackofficeManifestKind = { meta: { icon: 'icon-undo', label: 'Restore...', + pickerModal: '', }, }, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/restore-from-recycle-bin.action.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/restore-from-recycle-bin.action.ts index c15e204383..2aac69acc9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/restore-from-recycle-bin.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/restore-from-recycle-bin.action.ts @@ -1,10 +1,35 @@ import { UmbEntityActionBase } from '../../../entity-action/entity-action-base.js'; +import { UMB_RESTORE_FROM_RECYCLE_BIN_MODAL } from './modal/restore-from-recycle-bin-modal.token.js'; +import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; +import { UmbRequestReloadStructureForEntityEvent } from '@umbraco-cms/backoffice/entity-action'; +import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; import type { MetaEntityActionRestoreFromRecycleBinKind } from '@umbraco-cms/backoffice/extension-registry'; export class UmbRestoreFromRecycleBinEntityAction extends UmbEntityActionBase { async execute() { - debugger; - console.log(`execute sort for: ${this.args.unique}`); + if (!this.args.unique) throw new Error('Cannot restore an item without a unique identifier.'); + + const modalManager = await this.getContext(UMB_MODAL_MANAGER_CONTEXT); + const modal = modalManager.open(this, UMB_RESTORE_FROM_RECYCLE_BIN_MODAL, { + data: { + unique: this.args.unique, + entityType: this.args.entityType, + recycleBinRepositoryAlias: this.args.meta.recycleBinRepositoryAlias, + }, + }); + + const { destination } = await modal.onSubmit(); + + const actionEventContext = await this.getContext(UMB_ACTION_EVENT_CONTEXT); + const event = new UmbRequestReloadStructureForEntityEvent({ + unique: this.args.unique, + entityType: this.args.entityType, + }); + + actionEventContext.dispatchEvent(event); + + // TODO: reload destination + console.log(destination.unique, destination.entityType); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/trash/trash.action.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/trash/trash.action.ts index 09d8f6c08a..7983bb697f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/trash/trash.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/trash/trash.action.ts @@ -29,7 +29,10 @@ export class UmbTrashEntityAction extends UmbEntityActionBase(this, this.args.meta.recycleBinRepositoryAlias); + const recycleBinRepository = await createExtensionApiByAlias( + this, + this.args.meta.recycleBinRepositoryAlias, + ); await recycleBinRepository.requestTrash({ unique: this.args.unique }); const actionEventContext = await this.getContext(UMB_ACTION_EVENT_CONTEXT); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts index 1fc4073ffd..0ac0cd09be 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/entity-action/manifests.ts @@ -2,6 +2,7 @@ import { UMB_DOCUMENT_RECYCLE_BIN_REPOSITORY_ALIAS } from '../repository/index.j import { UMB_DOCUMENT_ENTITY_TYPE } from '../../entity.js'; import { UMB_DOCUMENT_ITEM_REPOSITORY_ALIAS } from '../../repository/index.js'; import { UMB_DOCUMENT_RECYCLE_BIN_ROOT_ENTITY_TYPE } from '../entity.js'; +import { UMB_DOCUMENT_PICKER_MODAL } from '../../modals/document-picker-modal.token.js'; import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; export const manifests: Array = [ @@ -25,6 +26,7 @@ export const manifests: Array = [ meta: { itemRepositoryAlias: UMB_DOCUMENT_ITEM_REPOSITORY_ALIAS, recycleBinRepositoryAlias: UMB_DOCUMENT_RECYCLE_BIN_REPOSITORY_ALIAS, + pickerModal: UMB_DOCUMENT_PICKER_MODAL, }, }, { From 2cbb6aad955e0e5f2b6c9192ee3e101d65e37daa Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 3 Apr 2024 19:33:24 +0200 Subject: [PATCH 047/280] pass item repo to modal --- .../restore-from-recycle-bin/restore-from-recycle-bin.action.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/restore-from-recycle-bin.action.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/restore-from-recycle-bin.action.ts index 2aac69acc9..71f04de803 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/restore-from-recycle-bin.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/restore-from-recycle-bin.action.ts @@ -15,6 +15,7 @@ export class UmbRestoreFromRecycleBinEntityAction extends UmbEntityActionBase Date: Wed, 3 Apr 2024 20:06:45 +0200 Subject: [PATCH 048/280] add arg types --- .../recycle-bin-data-source.interface.ts | 11 ++++++++--- .../recycle-bin-repository.interface.ts | 11 ++++++++--- .../src/packages/core/recycle-bin/types.ts | 14 ++++++++++++++ 3 files changed, 30 insertions(+), 6 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/types.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/recycle-bin-data-source.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/recycle-bin-data-source.interface.ts index b0de7b0ab9..8d381a83c9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/recycle-bin-data-source.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/recycle-bin-data-source.interface.ts @@ -1,3 +1,8 @@ +import type { + UmbRecycleBinOriginalParentRequestArgs, + UmbRecycleBinRestoreRequestArgs, + UmbRecycleBinTrashRequestArgs, +} from './types.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import type { UmbDataSourceResponse } from '@umbraco-cms/backoffice/repository'; @@ -6,8 +11,8 @@ export interface UmbRecycleBinDataSourceConstructor { } export interface UmbRecycleBinDataSource { - trash(args: any): Promise; - restore(args: any): Promise; + trash(args: UmbRecycleBinTrashRequestArgs): Promise; + restore(args: UmbRecycleBinRestoreRequestArgs): Promise; empty(): Promise; - getOriginalParent(args: any): Promise; + getOriginalParent(args: UmbRecycleBinOriginalParentRequestArgs): Promise; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/recycle-bin-repository.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/recycle-bin-repository.interface.ts index cda0a2448a..92a6d2ba9a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/recycle-bin-repository.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/recycle-bin-repository.interface.ts @@ -1,10 +1,15 @@ import type { UmbRepositoryBase } from '../repository/repository-base.js'; +import type { + UmbRecycleBinOriginalParentRequestArgs, + UmbRecycleBinRestoreRequestArgs, + UmbRecycleBinTrashRequestArgs, +} from './types.js'; import type { UmbRepositoryErrorResponse, UmbRepositoryResponse } from '@umbraco-cms/backoffice/repository'; import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; export interface UmbRecycleBinRepository extends UmbRepositoryBase, UmbApi { - requestTrash(args: any): Promise; - requestRestore(args: any): Promise; + requestTrash(args: UmbRecycleBinTrashRequestArgs): Promise; + requestRestore(args: UmbRecycleBinRestoreRequestArgs): Promise; requestEmpty(): Promise; - requestOriginalParent(args: any): Promise>; + requestOriginalParent(args: UmbRecycleBinOriginalParentRequestArgs): Promise>; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/types.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/types.ts new file mode 100644 index 0000000000..3a74c7c86f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/types.ts @@ -0,0 +1,14 @@ +export interface UmbRecycleBinRestoreRequestArgs { + unique: string; + destination: { + unique: string | null; + }; +} + +export interface UmbRecycleBinTrashRequestArgs { + unique: string; +} + +export interface UmbRecycleBinOriginalParentRequestArgs { + unique: string; +} From 8c287e8757a77695fb7ae62709b1865a93387b89 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 3 Apr 2024 21:04:36 +0200 Subject: [PATCH 049/280] export types --- .../src/packages/core/recycle-bin/index.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/index.ts index 49cec0d017..4cb027b622 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/index.ts @@ -7,3 +7,8 @@ export { export type { UmbRecycleBinDataSource } from './recycle-bin-data-source.interface.js'; export type { UmbRecycleBinRepository } from './recycle-bin-repository.interface.js'; +export type { + UmbRecycleBinRestoreRequestArgs, + UmbRecycleBinTrashRequestArgs, + UmbRecycleBinOriginalParentRequestArgs, +} from './types.js'; From cedeede9cd6036895562a2c4da416488597fbdcb Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 3 Apr 2024 21:04:49 +0200 Subject: [PATCH 050/280] Update document-recycle-bin.repository.ts --- .../recycle-bin/repository/document-recycle-bin.repository.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle-bin.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle-bin.repository.ts index 2a33cafed8..89422926fc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle-bin.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle-bin.repository.ts @@ -1,5 +1,5 @@ -import { UmbRecycleBinRepositoryBase } from '@umbraco-cms/backoffice/recycle-bin'; import { UmbDocumentRecycleBinServerDataSource } from './document-recycle-bin.server.data-source.js'; +import { UmbRecycleBinRepositoryBase } from '@umbraco-cms/backoffice/recycle-bin'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; export class UmbDocumentRecycleBinRepository extends UmbRecycleBinRepositoryBase { From d2d6043ad1f9681eb065d41de9023a4474dbb613 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 3 Apr 2024 21:05:00 +0200 Subject: [PATCH 051/280] value can be undefined --- .../modal/restore-from-recycle-bin-modal.token.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/restore-from-recycle-bin-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/restore-from-recycle-bin-modal.token.ts index 0ef015f444..c3af787444 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/restore-from-recycle-bin-modal.token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/restore-from-recycle-bin-modal.token.ts @@ -8,10 +8,12 @@ export interface UmbRestoreFromRecycleBinModalData { } export interface UmbRestoreFromRecycleBinModalValue { - destination: { - unique: string; - entityType: string; - }; + destination: + | { + unique: string; + entityType: string; + } + | undefined; } export const UMB_RESTORE_FROM_RECYCLE_BIN_MODAL = new UmbModalToken< From 4ba5ab19d5c8ca1563cbfc895bbf01d84cb01aad Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 3 Apr 2024 21:05:23 +0200 Subject: [PATCH 052/280] automatic restore + custom selection --- .../restore-from-recycle-bin-modal.element.ts | 116 +++++++++++++----- 1 file changed, 87 insertions(+), 29 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/restore-from-recycle-bin-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/restore-from-recycle-bin-modal.element.ts index 85d45dee42..4922c183ab 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/restore-from-recycle-bin-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/restore-from-recycle-bin-modal.element.ts @@ -18,25 +18,32 @@ export class UmbRestoreFromRecycleBinModalElement extends UmbModalBaseElement< UmbRestoreFromRecycleBinModalData, UmbRestoreFromRecycleBinModalValue > { + @state() + _isAutomaticRestore = false; + @state() _customSelectDestination = false; @state() - _destinationItem: any; + _destinationItem?: any; - constructor() { - super(); - } + #recycleBinRepository?: UmbRecycleBinRepository; protected async firstUpdated(_changedProperties: PropertyValueMap | Map): Promise { super.firstUpdated(_changedProperties); - const restoreDestination = await this.#requestRestoreDestination(); + const restoreDestinationUnique = await this.#requestRestoreDestination(); - if (!restoreDestination) { - this._customSelectDestination = true; - this.requestUpdate(); - return; + if (restoreDestinationUnique) { + this._destinationItem = await this.#requestDestinationItem(restoreDestinationUnique); + if (!this._destinationItem) throw new Error('Cant find destination item.'); + + this.#setDestinationValue({ + unique: this._destinationItem.unique, + entityType: this._destinationItem.entityType, + }); + + this._isAutomaticRestore = true; } } @@ -45,16 +52,15 @@ export class UmbRestoreFromRecycleBinModalElement extends UmbModalBaseElement< if (!this.data?.recycleBinRepositoryAlias) throw new Error('Cannot restore an item without a recycle bin repository alias.'); - const recycleBinRepository = await createExtensionApiByAlias( + this.#recycleBinRepository = await createExtensionApiByAlias( this, this.data.recycleBinRepositoryAlias, ); - const { data } = await recycleBinRepository.requestOriginalParent({ + const { data } = await this.#recycleBinRepository.requestOriginalParent({ unique: this.data.unique, }); - // The original parent is still available. We will restore to that if (data) { return data.unique; } @@ -74,44 +80,96 @@ export class UmbRestoreFromRecycleBinModalElement extends UmbModalBaseElement< if (selection.length > 0) { const destinationUnique = selection[0]; + this._destinationItem = await this.#requestDestinationItem(destinationUnique); + if (!this._destinationItem) throw new Error('Cant find destination item.'); - console.log(data); - debugger; + this.#setDestinationValue({ + unique: this._destinationItem.unique, + entityType: this._destinationItem.entityType, + }); } } - async requestDestinationItem(unique: string | null) { + async #requestDestinationItem(unique: string | null) { + if (unique === null) { + console.log('ROOT IS SELECTED, HANDLE THIS CASE'); + return; + } + if (!this.data?.itemRepositoryAlias) throw new Error('Cannot restore an item without an item repository alias.'); const itemRepository = await createExtensionApiByAlias>(this, this.data.itemRepositoryAlias); const { data } = await itemRepository.requestItems([unique]); + + return data?.[0]; + } + + async #onSubmit() { + if (!this.value.destination) throw new Error('Cannot restore an item without a destination.'); + if (!this.#recycleBinRepository) throw new Error('Cannot restore an item without a destination.'); + if (!this.data?.unique) throw new Error('Cannot restore an item without a unique identifier.'); + + const { error } = await this.#recycleBinRepository.requestRestore({ + unique: this.data.unique, + destination: { unique: this.value.destination.unique }, + }); + + if (!error) { + this._submitModal(); + } + } + + #setDestinationValue(destination: { unique: string; entityType: string }) { + this.updateValue({ destination }); } render() { return html` - ${this._customSelectDestination - ? html` -

Cannot automatically restore this item.

-

- There is no location where this item can be automatically restored. You can select a new location - below. -

- - Select location - ` - : nothing} + ${this._isAutomaticRestore + ? html` Restore (ITEM NAME HERE) to ${this._destinationItem.name}` + : this.#renderCustomSelectDestination()}
+ ${this.#renderActions()}
`; } - #renderDestination() {} + #renderCustomSelectDestination() { + return html` +

Cannot automatically restore this item.

+

There is no location where this item can be automatically restored. You can select a new location below.

- #renderCustomSelection() {} + ${this._destinationItem + ? html` + + (this._destinationItem = undefined)} label="Remove" + >${this.localize.term('general_remove')} + + ` + : html` Select location`} + `; + } - static styles = [UmbTextStyles, css``]; + #renderActions() { + return html` + + + `; + } + + static styles = [ + UmbTextStyles, + css` + #placeholder { + width: 100%; + } + `, + ]; } export default UmbRestoreFromRecycleBinModalElement; From a206a8ae06461e72cabe48002b6f06681ceb38f2 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 3 Apr 2024 21:05:43 +0200 Subject: [PATCH 053/280] throw error if there is no destination returned --- .../restore-from-recycle-bin/restore-from-recycle-bin.action.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/restore-from-recycle-bin.action.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/restore-from-recycle-bin.action.ts index 71f04de803..acc07f4adb 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/restore-from-recycle-bin.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/restore-from-recycle-bin.action.ts @@ -20,6 +20,7 @@ export class UmbRestoreFromRecycleBinEntityAction extends UmbEntityActionBase Date: Wed, 3 Apr 2024 21:06:28 +0200 Subject: [PATCH 054/280] add types --- ...document-recycle-bin.server.data-source.ts | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle-bin.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle-bin.server.data-source.ts index 7d59389943..85b33ab073 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle-bin.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle-bin.server.data-source.ts @@ -1,4 +1,9 @@ -import type { UmbRecycleBinDataSource } from '@umbraco-cms/backoffice/recycle-bin'; +import type { + UmbRecycleBinDataSource, + UmbRecycleBinRestoreRequestArgs, + UmbRecycleBinTrashRequestArgs, + UmbRecycleBinOriginalParentRequestArgs, +} from '@umbraco-cms/backoffice/recycle-bin'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { DocumentResource } from '@umbraco-cms/backoffice/external/backend-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -10,19 +15,27 @@ export class UmbDocumentRecycleBinServerDataSource implements UmbRecycleBinDataS this.#host = host; } - trash(args: { unique: string }) { + trash(args: UmbRecycleBinTrashRequestArgs) { return tryExecuteAndNotify(this.#host, DocumentResource.putDocumentByIdMoveToRecycleBin({ id: args.unique })); } - restore(args: { unique: string; target: { unique: string | null } }) { - return tryExecuteAndNotify(this.#host, DocumentResource.putRecycleBinDocumentByIdRestore({ id: args.unique })); + restore(args: UmbRecycleBinRestoreRequestArgs) { + return tryExecuteAndNotify( + this.#host, + DocumentResource.putRecycleBinDocumentByIdRestore({ + id: args.unique, + requestBody: { + target: args.destination.unique ? { id: args.destination.unique } : null, + }, + }), + ); } empty() { return tryExecuteAndNotify(this.#host, DocumentResource.deleteRecycleBinDocument()); } - async getOriginalParent(args: { unique: string }) { + async getOriginalParent(args: UmbRecycleBinOriginalParentRequestArgs) { const { data, error } = await tryExecuteAndNotify( this.#host, DocumentResource.getRecycleBinDocumentByIdOriginalParent({ id: args.unique }), From db54fdb75517b54fce2588b76a9cad8ac963e778 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 3 Apr 2024 21:07:36 +0200 Subject: [PATCH 055/280] import type --- .../core/recycle-bin/entity-action/trash/trash.action.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/trash/trash.action.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/trash/trash.action.ts index 7983bb697f..f1c9bbee35 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/trash/trash.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/trash/trash.action.ts @@ -1,5 +1,6 @@ import { UmbEntityActionBase } from '../../../entity-action/entity-action-base.js'; import { UmbRequestReloadStructureForEntityEvent } from '../../../entity-action/request-reload-structure-for-entity.event.js'; +import type { UmbRecycleBinRepository } from '../../recycle-bin-repository.interface.js'; import type { MetaEntityActionTrashKind } from '@umbraco-cms/backoffice/extension-registry'; import { createExtensionApiByAlias } from '@umbraco-cms/backoffice/extension-registry'; import { umbConfirmModal } from '@umbraco-cms/backoffice/modal'; From 5fce1f8c005afe5af522d4ba49d39b319780056d Mon Sep 17 00:00:00 2001 From: JesmoDev <26099018+JesmoDev@users.noreply.github.com> Date: Wed, 3 Apr 2024 23:46:24 +0200 Subject: [PATCH 056/280] add repo --- .../modals/rollback/repository/index.ts | 2 + .../modals/rollback/repository/manifests.ts | 12 ++++++ .../repository/rollback.repository.ts | 26 ++++++++++++ .../repository/rollback.server.data-source.ts | 40 +++++++++++++++++++ 4 files changed, 80 insertions(+) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/repository/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/repository/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/repository/rollback.repository.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/repository/rollback.server.data-source.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/repository/index.ts new file mode 100644 index 0000000000..ead77c2bd7 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/repository/index.ts @@ -0,0 +1,2 @@ +export { UmbMemberDetailRepository } from './rollback.repository.js'; +export { UMB_ROLLBACK_REPOSITORY_ALIAS } from './manifests.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/repository/manifests.ts new file mode 100644 index 0000000000..1e0c52fc4f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/repository/manifests.ts @@ -0,0 +1,12 @@ +import type { ManifestRepository } from '@umbraco-cms/backoffice/extension-registry'; + +export const UMB_ROLLBACK_REPOSITORY_ALIAS = 'Umb.Repository.Rollback'; + +const repository: ManifestRepository = { + type: 'repository', + alias: UMB_ROLLBACK_REPOSITORY_ALIAS, + name: 'Rollback Repository', + api: () => import('./rollback.repository.js'), +}; + +export const manifests = [repository]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/repository/rollback.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/repository/rollback.repository.ts new file mode 100644 index 0000000000..1e46aec1fc --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/repository/rollback.repository.ts @@ -0,0 +1,26 @@ +import { UmbRollbackServerDataSource } from './rollback.server.data-source.js'; +import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; + +export class UmbRollbackRepository extends UmbControllerBase implements UmbApi { + #dataSource: UmbRollbackServerDataSource; + + constructor(host: UmbControllerHost) { + super(host); + + this.#dataSource = new UmbRollbackServerDataSource(this); + } + + async requestVersionsByDocumentId(id: string, culture: string) { + const { data, error } = await this.#dataSource.getVersionsByDocumentId(id, culture); + return { data, error }; + } + + async requestVersionById(id: string) { + const { data, error } = await this.#dataSource.getVersionById(id); + return { data, error }; + } +} + +export default UmbRollbackRepository; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/repository/rollback.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/repository/rollback.server.data-source.ts new file mode 100644 index 0000000000..be767ffd45 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/repository/rollback.server.data-source.ts @@ -0,0 +1,40 @@ +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { DocumentVersionResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; + +/** + * A data source for the Rollback that fetches data from the server + * @export + * @class UmbRollbackServerDataSource + * @implements {RepositoryDetailDataSource} + */ +export class UmbRollbackServerDataSource { + #host: UmbControllerHost; + + /** + * Creates an instance of UmbRollbackServerDataSource. + * @param {UmbControllerHost} host + * @memberof UmbRollbackServerDataSource + */ + constructor(host: UmbControllerHost) { + this.#host = host; + } + + /** + * Get a list of versions for a document + * @return {*} + * @memberof UmbRollbackServerDataSource + */ + getVersionsByDocumentId(id: string, culture: string) { + return tryExecuteAndNotify(this.#host, DocumentVersionResource.getDocumentVersion({ documentId: id, culture })); + } + + /** + * Get a specific version by id + * @return {*} + * @memberof UmbRollbackServerDataSource + */ + getVersionById(id: string) { + return tryExecuteAndNotify(this.#host, DocumentVersionResource.getDocumentVersionById({ id })); + } +} From f018c6d1a78866a27e0ef673e2f631a3f067e138 Mon Sep 17 00:00:00 2001 From: JesmoDev <26099018+JesmoDev@users.noreply.github.com> Date: Wed, 3 Apr 2024 23:46:33 +0200 Subject: [PATCH 057/280] load data --- .../modals/rollback/rollback-modal.element.ts | 149 ++++++++++++++++-- 1 file changed, 137 insertions(+), 12 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts index 9f707a7fb4..adf0088166 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts @@ -1,12 +1,88 @@ import type { UmbRollbackModalData, UmbRollbackModalValue } from './rollback-modal.token.js'; -import { css, customElement, html, state } from '@umbraco-cms/backoffice/external/lit'; +import { css, customElement, html, repeat, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import '../shared/document-variant-language-picker.element.js'; +import UmbRollbackRepository from './repository/rollback.repository.js'; +import { UmbUserRepository } from '@umbraco-cms/backoffice/user'; +import { UmbLocalizeDateElement } from 'src/packages/core/localization/localize-date.element.js'; @customElement('umb-rollback-modal') export class UmbRollbackModalElement extends UmbModalBaseElement { + @state() + versions: { date: string; user: string; isCurrentlyPublishedVersion: boolean; id: string }[] = []; + + @state() + currentVersion?: { + date: string; + name: string; + user: string; + id: string; + properties: { + alias: string; + value: string; + }[]; + }; + + #rollbackRepository = new UmbRollbackRepository(this); + + #userRepository = new UmbUserRepository(this); + + constructor() { + super(); + + this.#requestVersions(); + } + + async #requestVersions() { + const { data } = await this.#rollbackRepository.requestVersionsByDocumentId( + 'bf327b58-9036-498b-9904-9b01b697b830', + 'en-us', + ); + + const tempItems: { date: string; user: string; isCurrentlyPublishedVersion: boolean; id: string }[] = []; + + data?.items.forEach((item: any) => { + tempItems.push({ + date: item.versionDate, + user: item.user.id, + isCurrentlyPublishedVersion: item.isCurrentPublishedVersion, + id: item.id, + }); + }); + + this.versions = tempItems; + const id = tempItems.find((item) => item.isCurrentlyPublishedVersion)?.id; + + if (id) { + this.#setCurrentVersion(id); + } + } + + async #setCurrentVersion(id: string) { + const version = this.versions.find((item) => item.id === id); + if (!version) return; + + const { data } = await this.#rollbackRepository.requestVersionById(id); + if (!data) return; + + console.log('data', data); + + this.currentVersion = { + date: version.date || '', + user: version.user, + name: data.variants[0].name, + id: data.id, + properties: data.values.map((value: any) => { + return { + alias: value.alias, + value: value.value, + }; + }), + }; + } + #onRollback() { console.log('Rollback'); return; @@ -17,27 +93,68 @@ export class UmbRollbackModalElement extends UmbModalBaseElement item.id, + (item) => { + return html` +
this.#onVersionClicked(item.id)} + @keydown=${() => {}} + class="rollback-item ${this.currentVersion?.id === item.id ? 'active' : ''}"> +
+

+ +

+

${item.user}

+

${item.isCurrentlyPublishedVersion ? 'Current published version' : ''}

+
+ Prevent cleanup +
+ `; + }, + ); + } + + #renderCurrentVersion() { + if (!this.currentVersion) return; + return html`
- -
-

April 2, 2024 6:05 PM

-

Jesper

-

Current published version

-
- Prevent cleanup -
+

${this.currentVersion.name}

+ ${repeat( + this.currentVersion.properties, + (item) => item.alias, + (item) => { + return html`

${item.alias}: ${JSON.stringify(item.value)}

`; + }, + )}
`; } + get currentVersionHeader() { + return this.localize.date(this.currentVersion?.date || '') + ' - ' + this.currentVersion?.user; + } + render() { return html`
- ${this.#renderRollbackItem()} - + +
${this.#renderVersions()}
+
+ ${this.#renderCurrentVersion()}
`; @@ -46,7 +163,11 @@ export class UmbRollbackModalElement extends UmbModalBaseElement Date: Wed, 3 Apr 2024 23:59:25 +0200 Subject: [PATCH 058/280] add actions --- .../modals/rollback/rollback-modal.element.ts | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts index adf0088166..1678d10893 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts @@ -1,12 +1,11 @@ import type { UmbRollbackModalData, UmbRollbackModalValue } from './rollback-modal.token.js'; +import { UmbRollbackRepository } from './repository/rollback.repository.js'; import { css, customElement, html, repeat, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import '../shared/document-variant-language-picker.element.js'; -import UmbRollbackRepository from './repository/rollback.repository.js'; import { UmbUserRepository } from '@umbraco-cms/backoffice/user'; -import { UmbLocalizeDateElement } from 'src/packages/core/localization/localize-date.element.js'; @customElement('umb-rollback-modal') export class UmbRollbackModalElement extends UmbModalBaseElement { @@ -131,7 +130,7 @@ export class UmbRollbackModalElement extends UmbModalBaseElement -

${this.currentVersion.name}

+

name: ${this.currentVersion.name}

${repeat( this.currentVersion.properties, (item) => item.alias, @@ -156,6 +155,10 @@ export class UmbRollbackModalElement extends UmbModalBaseElement ${this.#renderCurrentVersion()}
+ + Cancel + Rollback + `; } @@ -187,16 +190,21 @@ export class UmbRollbackModalElement extends UmbModalBaseElement Date: Thu, 4 Apr 2024 09:41:44 +0200 Subject: [PATCH 059/280] add rollback --- .../repository/rollback.repository.ts | 10 +++++++ .../repository/rollback.server.data-source.ts | 18 ++++++++++-- .../modals/rollback/rollback-modal.element.ts | 29 +++++++++++++------ 3 files changed, 46 insertions(+), 11 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/repository/rollback.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/repository/rollback.repository.ts index 1e46aec1fc..26d4a01b74 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/repository/rollback.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/repository/rollback.repository.ts @@ -21,6 +21,16 @@ export class UmbRollbackRepository extends UmbControllerBase implements UmbApi { const { data, error } = await this.#dataSource.getVersionById(id); return { data, error }; } + + async setPreventCleanup(versionId: string, preventCleanup: boolean) { + const { error } = await this.#dataSource.setPreventCleanup(versionId, preventCleanup); + return { error }; + } + + async rollback(versionId: string, culture?: string) { + const { error } = await this.#dataSource.rollback(versionId, culture); + return { error }; + } } export default UmbRollbackRepository; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/repository/rollback.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/repository/rollback.server.data-source.ts index be767ffd45..9dccdb8466 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/repository/rollback.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/repository/rollback.server.data-source.ts @@ -34,7 +34,21 @@ export class UmbRollbackServerDataSource { * @return {*} * @memberof UmbRollbackServerDataSource */ - getVersionById(id: string) { - return tryExecuteAndNotify(this.#host, DocumentVersionResource.getDocumentVersionById({ id })); + getVersionById(versionId: string) { + return tryExecuteAndNotify(this.#host, DocumentVersionResource.getDocumentVersionById({ id: versionId })); + } + + setPreventCleanup(versionId: string, preventCleanup: boolean) { + return tryExecuteAndNotify( + this.#host, + DocumentVersionResource.putDocumentVersionByIdPreventCleanup({ id: versionId, preventCleanup }), + ); + } + + rollback(versionId: string, culture?: string) { + return tryExecuteAndNotify( + this.#host, + DocumentVersionResource.postDocumentVersionByIdRollback({ id: versionId, culture }), + ); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts index 1678d10893..9ba0f98fbf 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts @@ -66,8 +66,6 @@ export class UmbRollbackModalElement extends UmbModalBaseElement Date: Thu, 4 Apr 2024 09:45:00 +0200 Subject: [PATCH 060/280] temp solution to restore to root --- .../restore-from-recycle-bin-modal.element.ts | 24 +++++++++++++++---- .../restore-from-recycle-bin-modal.token.ts | 2 +- ...document-recycle-bin.server.data-source.ts | 8 +++---- 3 files changed, 24 insertions(+), 10 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/restore-from-recycle-bin-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/restore-from-recycle-bin-modal.element.ts index 4922c183ab..2aad24f339 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/restore-from-recycle-bin-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/restore-from-recycle-bin-modal.element.ts @@ -34,6 +34,21 @@ export class UmbRestoreFromRecycleBinModalElement extends UmbModalBaseElement< const restoreDestinationUnique = await this.#requestRestoreDestination(); + // TODO: handle ROOT lookup. Currently, we can't look up the root in the item repository. + // This is a temp solution to show something in the UI. + if (restoreDestinationUnique === null) { + this._destinationItem = { + name: 'ROOT', + }; + + this.#setDestinationValue({ + unique: null, + entityType: 'unknown', + }); + + this._isAutomaticRestore = true; + } + if (restoreDestinationUnique) { this._destinationItem = await this.#requestDestinationItem(restoreDestinationUnique); if (!this._destinationItem) throw new Error('Cant find destination item.'); @@ -47,7 +62,7 @@ export class UmbRestoreFromRecycleBinModalElement extends UmbModalBaseElement< } } - async #requestRestoreDestination(): Promise { + async #requestRestoreDestination(): Promise { if (!this.data?.unique) throw new Error('Cannot restore an item without a unique identifier.'); if (!this.data?.recycleBinRepositoryAlias) throw new Error('Cannot restore an item without a recycle bin repository alias.'); @@ -61,8 +76,9 @@ export class UmbRestoreFromRecycleBinModalElement extends UmbModalBaseElement< unique: this.data.unique, }); - if (data) { - return data.unique; + // only check for undefined because data can be null if the parent is the root + if (data !== undefined) { + return data ? data.unique : null; } return undefined; @@ -119,7 +135,7 @@ export class UmbRestoreFromRecycleBinModalElement extends UmbModalBaseElement< } } - #setDestinationValue(destination: { unique: string; entityType: string }) { + #setDestinationValue(destination: UmbRestoreFromRecycleBinModalValue['destination']) { this.updateValue({ destination }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/restore-from-recycle-bin-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/restore-from-recycle-bin-modal.token.ts index c3af787444..ed2befadee 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/restore-from-recycle-bin-modal.token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/restore-from-recycle-bin-modal.token.ts @@ -10,7 +10,7 @@ export interface UmbRestoreFromRecycleBinModalData { export interface UmbRestoreFromRecycleBinModalValue { destination: | { - unique: string; + unique: string | null; entityType: string; } | undefined; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle-bin.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle-bin.server.data-source.ts index 85b33ab073..7c8dda0721 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle-bin.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle-bin.server.data-source.ts @@ -41,11 +41,9 @@ export class UmbDocumentRecycleBinServerDataSource implements UmbRecycleBinDataS DocumentResource.getRecycleBinDocumentByIdOriginalParent({ id: args.unique }), ); - if (data) { - const mappedData = { - unique: data.id, - }; - + // only check for undefined because data can be null if the parent is the root + if (data !== undefined) { + const mappedData = data ? { unique: data.id } : null; return { data: mappedData }; } From 6ab18169dda77635db0ad1f84eb74c548a0e7a8d Mon Sep 17 00:00:00 2001 From: JesmoDev <26099018+JesmoDev@users.noreply.github.com> Date: Thu, 4 Apr 2024 09:53:30 +0200 Subject: [PATCH 061/280] get user name --- .../modals/rollback/rollback-modal.element.ts | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts index 9ba0f98fbf..b34ddda614 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts @@ -5,7 +5,7 @@ import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import '../shared/document-variant-language-picker.element.js'; -import { UmbUserRepository } from '@umbraco-cms/backoffice/user'; +import { UmbUserItemRepository, UmbUserRepository } from '@umbraco-cms/backoffice/user'; @customElement('umb-rollback-modal') export class UmbRollbackModalElement extends UmbModalBaseElement { @@ -26,7 +26,7 @@ export class UmbRollbackModalElement extends UmbModalBaseElement item.user.id))]; + + const { data: userItems } = await this.#userItemRepository.requestItems(uniqueUserIds); + data?.items.forEach((item: any) => { tempItems.push({ date: item.versionDate, - user: item.user.id, + user: userItems?.find((user) => user.unique === item.user.id)?.name || '', isCurrentlyPublishedVersion: item.isCurrentPublishedVersion, id: item.id, }); @@ -85,19 +89,16 @@ export class UmbRollbackModalElement extends UmbModalBaseElement Date: Thu, 4 Apr 2024 10:02:43 +0200 Subject: [PATCH 062/280] prevent cleanup --- .../modals/rollback/repository/index.ts | 2 +- .../modals/rollback/rollback-modal.element.ts | 34 ++++++++++++++++--- 2 files changed, 31 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/repository/index.ts index ead77c2bd7..ccf1fc6c85 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/repository/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/repository/index.ts @@ -1,2 +1,2 @@ -export { UmbMemberDetailRepository } from './rollback.repository.js'; +export { UmbRollbackRepository } from './rollback.repository.js'; export { UMB_ROLLBACK_REPOSITORY_ALIAS } from './manifests.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts index b34ddda614..65d4c53877 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts @@ -5,12 +5,20 @@ import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import '../shared/document-variant-language-picker.element.js'; -import { UmbUserItemRepository, UmbUserRepository } from '@umbraco-cms/backoffice/user'; +import { UmbUserItemRepository } from '@umbraco-cms/backoffice/user'; + +type DocumentVersion = { + id: string; + date: string; + user: string; + isCurrentlyPublishedVersion: boolean; + preventCleanup: boolean; +}; @customElement('umb-rollback-modal') export class UmbRollbackModalElement extends UmbModalBaseElement { @state() - versions: { date: string; user: string; isCurrentlyPublishedVersion: boolean; id: string }[] = []; + versions: DocumentVersion[] = []; @state() currentVersion?: { @@ -40,7 +48,7 @@ export class UmbRollbackModalElement extends UmbModalBaseElement item.user.id))]; @@ -52,6 +60,7 @@ export class UmbRollbackModalElement extends UmbModalBaseElement user.unique === item.user.id)?.name || '', isCurrentlyPublishedVersion: item.isCurrentPublishedVersion, id: item.id, + preventCleanup: item.preventCleanup, }); }); @@ -101,6 +110,18 @@ export class UmbRollbackModalElement extends UmbModalBaseElement item.id === id); + if (!version) return; + + version.preventCleanup = preventCleanup; + this.requestUpdate('versions'); + } + #renderVersions() { return repeat( this.versions, @@ -118,7 +139,11 @@ export class UmbRollbackModalElement extends UmbModalBaseElement${item.user}

${item.isCurrentlyPublishedVersion ? 'Current published version' : ''}

- Prevent cleanup + this.#onPreventCleanup(event, item.id, !item.preventCleanup)}> + ${item.preventCleanup ? 'Enable cleanup' : 'Prevent cleanup'} + `; }, @@ -180,6 +205,7 @@ export class UmbRollbackModalElement extends UmbModalBaseElement Date: Thu, 4 Apr 2024 10:07:37 +0200 Subject: [PATCH 063/280] cleanup --- .../views/info/document-workspace-view-info-history.element.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info-history.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info-history.element.ts index 99adb3e5f6..0c73f5cf84 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info-history.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info-history.element.ts @@ -47,9 +47,6 @@ export class UmbDocumentWorkspaceViewInfoHistoryElement extends UmbLitElement { protected firstUpdated(): void { this.#getLogs(); - - //TODO: REMOVE THIS - this.#onRollbackModalOpen(); } async #getLogs() { From c1ab82c5170d91cd21eda45257e5d153bb8358c0 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 4 Apr 2024 10:11:47 +0200 Subject: [PATCH 064/280] clean up --- .../restore-from-recycle-bin-modal.element.ts | 43 +++++++------------ 1 file changed, 16 insertions(+), 27 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/restore-from-recycle-bin-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/restore-from-recycle-bin-modal.element.ts index 2aad24f339..60f7bc070c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/restore-from-recycle-bin-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/restore-from-recycle-bin-modal.element.ts @@ -21,9 +21,6 @@ export class UmbRestoreFromRecycleBinModalElement extends UmbModalBaseElement< @state() _isAutomaticRestore = false; - @state() - _customSelectDestination = false; - @state() _destinationItem?: any; @@ -32,11 +29,18 @@ export class UmbRestoreFromRecycleBinModalElement extends UmbModalBaseElement< protected async firstUpdated(_changedProperties: PropertyValueMap | Map): Promise { super.firstUpdated(_changedProperties); - const restoreDestinationUnique = await this.#requestRestoreDestination(); + const unique = await this.#requestAutomaticRestoreDestination(); + if (unique !== undefined) { + this._isAutomaticRestore = true; + this.something(unique); + } + } + + async something(unique: string | null) { // TODO: handle ROOT lookup. Currently, we can't look up the root in the item repository. // This is a temp solution to show something in the UI. - if (restoreDestinationUnique === null) { + if (unique === null) { this._destinationItem = { name: 'ROOT', }; @@ -45,24 +49,20 @@ export class UmbRestoreFromRecycleBinModalElement extends UmbModalBaseElement< unique: null, entityType: 'unknown', }); - - this._isAutomaticRestore = true; } - if (restoreDestinationUnique) { - this._destinationItem = await this.#requestDestinationItem(restoreDestinationUnique); + if (unique) { + this._destinationItem = await this.#requestItem(unique); if (!this._destinationItem) throw new Error('Cant find destination item.'); this.#setDestinationValue({ unique: this._destinationItem.unique, entityType: this._destinationItem.entityType, }); - - this._isAutomaticRestore = true; } } - async #requestRestoreDestination(): Promise { + async #requestAutomaticRestoreDestination(): Promise { if (!this.data?.unique) throw new Error('Cannot restore an item without a unique identifier.'); if (!this.data?.recycleBinRepositoryAlias) throw new Error('Cannot restore an item without a recycle bin repository alias.'); @@ -95,23 +95,12 @@ export class UmbRestoreFromRecycleBinModalElement extends UmbModalBaseElement< const { selection } = await modal.onSubmit(); if (selection.length > 0) { - const destinationUnique = selection[0]; - this._destinationItem = await this.#requestDestinationItem(destinationUnique); - if (!this._destinationItem) throw new Error('Cant find destination item.'); - - this.#setDestinationValue({ - unique: this._destinationItem.unique, - entityType: this._destinationItem.entityType, - }); + const unique = selection[0]; + this.something(unique); } } - async #requestDestinationItem(unique: string | null) { - if (unique === null) { - console.log('ROOT IS SELECTED, HANDLE THIS CASE'); - return; - } - + async #requestItem(unique: string) { if (!this.data?.itemRepositoryAlias) throw new Error('Cannot restore an item without an item repository alias.'); const itemRepository = await createExtensionApiByAlias>(this, this.data.itemRepositoryAlias); @@ -156,7 +145,7 @@ export class UmbRestoreFromRecycleBinModalElement extends UmbModalBaseElement< return html`

Cannot automatically restore this item.

There is no location where this item can be automatically restored. You can select a new location below.

- +
Restore to:
${this._destinationItem ? html` From 5ae79a75e80b0767076c114e32501452cc442d70 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 4 Apr 2024 10:14:20 +0200 Subject: [PATCH 065/280] rename method to something useful --- .../modal/restore-from-recycle-bin-modal.element.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/restore-from-recycle-bin-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/restore-from-recycle-bin-modal.element.ts index 60f7bc070c..8d11163c50 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/restore-from-recycle-bin-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/restore-from-recycle-bin-modal.element.ts @@ -33,11 +33,11 @@ export class UmbRestoreFromRecycleBinModalElement extends UmbModalBaseElement< if (unique !== undefined) { this._isAutomaticRestore = true; - this.something(unique); + this.setDestination(unique); } } - async something(unique: string | null) { + async setDestination(unique: string | null) { // TODO: handle ROOT lookup. Currently, we can't look up the root in the item repository. // This is a temp solution to show something in the UI. if (unique === null) { @@ -96,7 +96,7 @@ export class UmbRestoreFromRecycleBinModalElement extends UmbModalBaseElement< if (selection.length > 0) { const unique = selection[0]; - this.something(unique); + this.setDestination(unique); } } From 9cf2c4b5e08c8c5d1decf924520cd1ec60203b93 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 4 Apr 2024 10:21:32 +0200 Subject: [PATCH 066/280] get the name of the restore item --- .../restore-from-recycle-bin-modal.element.ts | 27 +++++++++++-------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/restore-from-recycle-bin-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/restore-from-recycle-bin-modal.element.ts index 8d11163c50..4efab40b7a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/restore-from-recycle-bin-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/restore-from-recycle-bin-modal.element.ts @@ -21,6 +21,9 @@ export class UmbRestoreFromRecycleBinModalElement extends UmbModalBaseElement< @state() _isAutomaticRestore = false; + @state() + _restoreItem?: any; + @state() _destinationItem?: any; @@ -28,12 +31,14 @@ export class UmbRestoreFromRecycleBinModalElement extends UmbModalBaseElement< protected async firstUpdated(_changedProperties: PropertyValueMap | Map): Promise { super.firstUpdated(_changedProperties); + if (!this.data?.unique) throw new Error('Cannot restore an item without a unique identifier.'); + this._restoreItem = await this.#requestItem(this.data.unique); const unique = await this.#requestAutomaticRestoreDestination(); if (unique !== undefined) { - this._isAutomaticRestore = true; this.setDestination(unique); + this._isAutomaticRestore = true; } } @@ -84,6 +89,15 @@ export class UmbRestoreFromRecycleBinModalElement extends UmbModalBaseElement< return undefined; } + async #requestItem(unique: string) { + if (!this.data?.itemRepositoryAlias) throw new Error('Cannot restore an item without an item repository alias.'); + + const itemRepository = await createExtensionApiByAlias>(this, this.data.itemRepositoryAlias); + const { data } = await itemRepository.requestItems([unique]); + + return data?.[0]; + } + async #onSelectCustomDestination() { const modalManager = await this.getContext(UMB_MODAL_MANAGER_CONTEXT); const modal = modalManager.open(this, UMB_DOCUMENT_PICKER_MODAL, { @@ -100,15 +114,6 @@ export class UmbRestoreFromRecycleBinModalElement extends UmbModalBaseElement< } } - async #requestItem(unique: string) { - if (!this.data?.itemRepositoryAlias) throw new Error('Cannot restore an item without an item repository alias.'); - - const itemRepository = await createExtensionApiByAlias>(this, this.data.itemRepositoryAlias); - const { data } = await itemRepository.requestItems([unique]); - - return data?.[0]; - } - async #onSubmit() { if (!this.value.destination) throw new Error('Cannot restore an item without a destination.'); if (!this.#recycleBinRepository) throw new Error('Cannot restore an item without a destination.'); @@ -133,7 +138,7 @@ export class UmbRestoreFromRecycleBinModalElement extends UmbModalBaseElement< ${this._isAutomaticRestore - ? html` Restore (ITEM NAME HERE) to ${this._destinationItem.name}` + ? html` Restore ${this._restoreItem?.name} to ${this._destinationItem?.name}` : this.#renderCustomSelectDestination()} ${this.#renderActions()} From 8465bb1dafe60b06bc6b6266d4ebc4f23d9b7b98 Mon Sep 17 00:00:00 2001 From: JesmoDev <26099018+JesmoDev@users.noreply.github.com> Date: Thu, 4 Apr 2024 10:43:27 +0200 Subject: [PATCH 067/280] cleanup --- .../src/packages/core/modal/component/modal.element.ts | 1 - .../src/packages/core/modal/context/modal.context.ts | 4 ---- 2 files changed, 5 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/component/modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/component/modal.element.ts index 296061dbee..b5a431d7cc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/modal/component/modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/component/modal.element.ts @@ -102,7 +102,6 @@ export class UmbModalElement extends UmbLitElement { } #createContainerElement() { - console.log('Creating modal element', this.#modalContext); return this.#modalContext!.type === 'sidebar' ? this.#createSidebarElement() : this.#createDialogElement(); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/context/modal.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/context/modal.context.ts index 386cfb7a77..a22c2dd674 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/modal/context/modal.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/context/modal.context.ts @@ -48,13 +48,9 @@ export class UmbModalContext Date: Thu, 4 Apr 2024 10:43:40 +0200 Subject: [PATCH 068/280] correct name --- .../document-property-dataset-context.token.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/property-dataset-context/document-property-dataset-context.token.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/property-dataset-context/document-property-dataset-context.token.ts index 62cd946c83..96efd8d3e6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/property-dataset-context/document-property-dataset-context.token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/property-dataset-context/document-property-dataset-context.token.ts @@ -10,4 +10,4 @@ export const IsDocumentPropertyDatasetContext = ( export const UMB_DOCUMENT_PROPERTY_DATASET_CONTEXT = new UmbContextToken< UmbPropertyDatasetContext, UmbDocumentPropertyDataContext ->('UmbVariantContext', undefined, IsDocumentPropertyDatasetContext); +>('UmbPropertyDatasetContext', undefined, IsDocumentPropertyDatasetContext); From 92c8873de7efd11081e0b43ebdfd23c76224f1c4 Mon Sep 17 00:00:00 2001 From: JesmoDev <26099018+JesmoDev@users.noreply.github.com> Date: Thu, 4 Apr 2024 10:43:51 +0200 Subject: [PATCH 069/280] get id and culture --- .../repository/rollback.repository.ts | 2 +- .../repository/rollback.server.data-source.ts | 2 +- .../modals/rollback/rollback-modal.element.ts | 26 ++++++++++++++----- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/repository/rollback.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/repository/rollback.repository.ts index 26d4a01b74..e4ba53c696 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/repository/rollback.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/repository/rollback.repository.ts @@ -12,7 +12,7 @@ export class UmbRollbackRepository extends UmbControllerBase implements UmbApi { this.#dataSource = new UmbRollbackServerDataSource(this); } - async requestVersionsByDocumentId(id: string, culture: string) { + async requestVersionsByDocumentId(id: string, culture?: string) { const { data, error } = await this.#dataSource.getVersionsByDocumentId(id, culture); return { data, error }; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/repository/rollback.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/repository/rollback.server.data-source.ts index 9dccdb8466..2344bdf802 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/repository/rollback.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/repository/rollback.server.data-source.ts @@ -25,7 +25,7 @@ export class UmbRollbackServerDataSource { * @return {*} * @memberof UmbRollbackServerDataSource */ - getVersionsByDocumentId(id: string, culture: string) { + getVersionsByDocumentId(id: string, culture?: string) { return tryExecuteAndNotify(this.#host, DocumentVersionResource.getDocumentVersion({ documentId: id, culture })); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts index 65d4c53877..2d6684cf5d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts @@ -6,6 +6,9 @@ import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import '../shared/document-variant-language-picker.element.js'; import { UmbUserItemRepository } from '@umbraco-cms/backoffice/user'; +import { UMB_DOCUMENT_WORKSPACE_CONTEXT } from '../../workspace/index.js'; +import { UMB_DOCUMENT_PROPERTY_DATASET_CONTEXT } from '../../property-dataset-context/document-property-dataset-context.token.js'; +import { UMB_PROPERTY_DATASET_CONTEXT } from '@umbraco-cms/backoffice/property'; type DocumentVersion = { id: string; @@ -33,20 +36,31 @@ export class UmbRollbackModalElement extends UmbModalBaseElement { + this.#propertyDatasetContext = instance; + this.#requestVersions(); + }); } async #requestVersions() { - const { data } = await this.#rollbackRepository.requestVersionsByDocumentId( - 'bf327b58-9036-498b-9904-9b01b697b830', - 'en-us', - ); + if (!this.#propertyDatasetContext) return; + + const documentId = this.#propertyDatasetContext.getUnique(); + const documentCulture = this.#propertyDatasetContext.getVariantId().culture; + + if (!documentId || !documentCulture) return; + + const { data } = await this.#rollbackRepository.requestVersionsByDocumentId(documentId, documentCulture); const tempItems: DocumentVersion[] = []; From e737fcab579d80c71e45d3ed76f5170376517ec1 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 4 Apr 2024 10:59:42 +0200 Subject: [PATCH 070/280] make source protected instead of private --- .../packages/core/tree/data/tree-repository-base.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-repository-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-repository-base.ts index 2409617d42..7e2ca2ccdb 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-repository-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-repository-base.ts @@ -28,7 +28,7 @@ export abstract class UmbTreeRepositoryBase< { protected _init: Promise; protected _treeStore?: UmbTreeStore; - #treeSource: UmbTreeDataSource; + protected _treeSource: UmbTreeDataSource; /** * Creates an instance of UmbTreeRepositoryBase. @@ -43,7 +43,7 @@ export abstract class UmbTreeRepositoryBase< treeStoreContextAlias: string | UmbContextToken, ) { super(host); - this.#treeSource = new treeSourceConstructor(this); + this._treeSource = new treeSourceConstructor(this); this._init = this.consumeContext(treeStoreContextAlias, (instance) => { this._treeStore = instance; @@ -65,7 +65,7 @@ export abstract class UmbTreeRepositoryBase< async requestRootTreeItems(args: any) { await this._init; - const { data, error } = await this.#treeSource.getRootItems(args); + const { data, error } = await this._treeSource.getRootItems(args); if (data) { this._treeStore!.appendItems(data.items); @@ -84,7 +84,7 @@ export abstract class UmbTreeRepositoryBase< if (args.parentUnique === undefined) throw new Error('Parent unique is missing'); await this._init; - const { data, error } = await this.#treeSource.getChildrenOf(args); + const { data, error } = await this._treeSource.getChildrenOf(args); if (data) { this._treeStore!.appendItems(data.items); @@ -103,7 +103,7 @@ export abstract class UmbTreeRepositoryBase< if (args.descendantUnique === undefined) throw new Error('Descendant unique is missing'); await this._init; - const { data, error } = await this.#treeSource.getAncestorsOf(args); + const { data, error } = await this._treeSource.getAncestorsOf(args); // TODO: implement observable for ancestor items in the store return { data, error }; From 435ef26cbc3b4e3aa5a433d6c49b7cb931d24f93 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 4 Apr 2024 11:00:22 +0200 Subject: [PATCH 071/280] check if recycle bin has children on load --- .../recycle-bin/tree/document-recycle-bin-tree.repository.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/document-recycle-bin-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/document-recycle-bin-tree.repository.ts index 37ff658fb9..23ed6a2004 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/document-recycle-bin-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/document-recycle-bin-tree.repository.ts @@ -15,12 +15,15 @@ export class UmbDocumentRecycleBinTreeRepository } async requestTreeRoot() { + const { data: treeRootData } = await this._treeSource.getRootItems({ skip: 0, take: 1 }); + const hasChildren = treeRootData?.total > 0; + const data = { unique: null, entityType: UMB_DOCUMENT_RECYCLE_BIN_ROOT_ENTITY_TYPE, name: 'Recycle Bin', icon: 'icon-trash', - hasChildren: true, + hasChildren, isContainer: false, isFolder: true, }; From 9ca24c3c22f1483f719013f36882eaf5a8955e66 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Thu, 4 Apr 2024 11:30:52 +0200 Subject: [PATCH 072/280] add manifest model for external auth provider --- .../models/auth-provider.model.ts | 64 +++++++++++++++++++ .../core/extension-registry/models/index.ts | 5 +- 2 files changed, 68 insertions(+), 1 deletion(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/auth-provider.model.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/auth-provider.model.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/auth-provider.model.ts new file mode 100644 index 0000000000..e212a5208e --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/auth-provider.model.ts @@ -0,0 +1,64 @@ +import type { ManifestElement } from '@umbraco-cms/backoffice/extension-api'; +import type { UUIInterfaceColor, UUIInterfaceLook } from '@umbraco-cms/backoffice/external/uui'; + +/** + * Represents an authentication provider that can be used to authenticate users. + * The provider needs to be registered in the API that the authorization request is sent to in order to be used. + * + * @see {forProviderName} for the provider name that this provider is for. + */ +export interface ManifestAuthProvider extends ManifestElement { + type: 'authProvider'; + + /** + * The provider name that this provider is for. + * @examples 'Umbraco.Github' + */ + forProviderName: string; + + meta?: MetaAuthProvider; +} + +export interface MetaAuthProvider { + /** + * The label of the provider that is shown to the user. + */ + label?: string; + + /** + * The default view of the provider that is shown to the user. + * If no element is provided, then the button will be rendered as a @see {UUIButtonElement} using these options. + */ + defaultView: { + /** + * The icon of the provider that is shown to the user. + * @examples ['icon-cloud', 'icon-github', 'icon-google', 'icon-facebook', 'icon-twitter', 'icon-x', 'icon-microsoft'] + * @default 'icon-cloud' + */ + icon?: string; + + /** + * The color of the provider that is shown to the user. + * @default 'secondary' + */ + color?: UUIInterfaceLook; + + /** + * The look of the provider that is shown to the user. + * @default 'default' + */ + look?: UUIInterfaceColor; + }; + + /** + * If true, the Umbraco backoffice login will be disabled. + * @default false + */ + denyLocalLogin?: boolean; + + /** + * If true, the user will be redirected to the provider's login page immediately. + * @default false + */ + autoRedirect?: boolean; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/index.ts index bd329b9276..c6d951bd27 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/index.ts @@ -1,3 +1,4 @@ +import type { ManifestAuthProvider } from './auth-provider.model.js'; import type { ManifestBlockEditorCustomView } from './block-editor-custom-view.model.js'; import type { ManifestCollection } from './collection.models.js'; import type { ManifestCollectionView } from './collection-view.model.js'; @@ -64,6 +65,7 @@ import type { ManifestEntryPoint, } from '@umbraco-cms/backoffice/extension-api'; +export type * from './auth-provider.model.js'; export type * from './block-editor-custom-view.model.js'; export type * from './collection.models.js'; export type * from './collection-action.model.js'; @@ -131,12 +133,13 @@ export type ManifestWorkspaces = ManifestWorkspace | ManifestWorkspaceRoutableKi export type ManifestWorkspaceViews = ManifestWorkspaceView | ManifestWorkspaceViewContentTypeDesignEditorKind; export type ManifestTypes = + | ManifestAuthProvider | ManifestBundle - | ManifestCondition | ManifestBlockEditorCustomView | ManifestCollection | ManifestCollectionView | ManifestCollectionAction + | ManifestCondition | ManifestDashboard | ManifestDashboardCollection | ManifestDynamicRootOrigin From 090247d79078e290159f5c89372288c2722e5e91 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Thu, 4 Apr 2024 11:45:06 +0200 Subject: [PATCH 073/280] add authProvider's to test it out --- .../src/mocks/handlers/manifests.handlers.ts | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/manifests.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/manifests.handlers.ts index e84f191d7f..3a37e7aec5 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/manifests.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/manifests.handlers.ts @@ -90,6 +90,32 @@ export const manifestDevelopmentHandler = rest.get(umbracoPath('/package/manifes }, ], }, + { + name: 'My Auth Package', + extensions: [ + { + type: 'authProvider', + alias: 'My.AuthProvider.Google', + name: 'My Custom Auth Provider', + forProviderName: 'Umbraco.Google', + meta: { + label: 'Sign in with Google', + }, + }, + { + type: 'authProvider', + alias: 'My.AUthProvider.Github', + name: 'My Github Auth Provider', + forProviderName: 'Umbraco.Github', + meta: { + label: 'Use Github!', + look: 'primary', + icon: 'icon-github', + color: 'success', + }, + }, + ], + }, ]), ); }); From 22e7742d47d500be5cc5f4a08cfc5dcc20761175 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Thu, 4 Apr 2024 11:55:03 +0200 Subject: [PATCH 074/280] add support to supply an identity provider to the authorization request --- .../src/packages/core/auth/auth-flow.ts | 18 +++++++++++++----- .../src/packages/core/auth/auth.context.ts | 6 ++++-- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/auth/auth-flow.ts b/src/Umbraco.Web.UI.Client/src/packages/core/auth/auth-flow.ts index 4ced20b66d..01b20582f9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/auth/auth-flow.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/auth/auth-flow.ts @@ -187,15 +187,23 @@ export class UmbAuthFlow { } /** - * This method will make an authorization request to the server. + * Make an authorization request to the server using the specified identity provider. + * This method will redirect the user to the authorization endpoint of the server. * - * @param username The username to use for the authorization request. It will be provided to the OpenID server as a hint. + * @param identityProvider The identity provider to use for the authorization request. + * @param usernameHint (Optional) The username to use for the authorization request. It will be provided to the OpenID server as a hint. */ - makeAuthorizationRequest(username?: string): void { + makeAuthorizationRequest(identityProvider: string, usernameHint?: string): void { const extras: StringMap = { prompt: 'consent', access_type: 'offline' }; - if (username) { - extras['login_hint'] = username; + // If the identity provider is not 'Umbraco', we will add it to the extras. + if (identityProvider !== 'Umbraco') { + extras['identity_provider'] = identityProvider; + } + + // If there is a username hint, we will add it to the extras. + if (usernameHint) { + extras['login_hint'] = usernameHint; } // create a request diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/auth/auth.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/auth/auth.context.ts index f457655b18..f5a64ff438 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/auth/auth.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/auth/auth.context.ts @@ -26,9 +26,11 @@ export class UmbAuthContext extends UmbContextBase { /** * Initiates the login flow. + * @param identityProvider The provider to use for login. Default is 'Umbraco'. + * @param usernameHint The username hint to use for login. */ - makeAuthorizationRequest() { - return this.#authFlow.makeAuthorizationRequest(); + makeAuthorizationRequest(identityProvider = 'Umbraco', usernameHint?: string) { + return this.#authFlow.makeAuthorizationRequest(identityProvider, usernameHint); } /** From 762368c3a6a5f5c62ba44569eb976b9009ad18c1 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Thu, 4 Apr 2024 12:03:15 +0200 Subject: [PATCH 075/280] move auth request logic to an auth controller to split up the logic --- .../src/apps/app/app-auth.controller.ts | 9 +++++++++ src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts | 6 ++++-- 2 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts diff --git a/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts b/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts new file mode 100644 index 0000000000..fdc4c6cb35 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts @@ -0,0 +1,9 @@ +import { UMB_AUTH_CONTEXT } from '@umbraco-cms/backoffice/auth'; +import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; + +export class UmbAppAuthController extends UmbControllerBase { + async makeAuthorizationRequest() { + const authContext = await this.getContext(UMB_AUTH_CONTEXT); + return authContext.makeAuthorizationRequest(); + } +} 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 d104ccab6c..89ab404a0f 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,6 +1,7 @@ import type { UmbAppErrorElement } from './app-error.element.js'; import { UmbAppContext } from './app.context.js'; import { UmbServerConnection } from './server-connection.js'; +import { UmbAppAuthController } from './app-auth.controller.js'; 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'; @@ -59,6 +60,7 @@ export class UmbAppElement extends UmbLitElement { #umbIconRegistry = new UmbIconRegistry(); #uuiIconRegistry = new UUIIconRegistryEssential(); #serverConnection?: UmbServerConnection; + #authController = new UmbAppAuthController(this); constructor() { super(); @@ -184,7 +186,7 @@ export class UmbAppElement extends UmbLitElement { } #isAuthorizedGuard(): Guard { - return () => { + return async () => { if (!this.#authContext) { throw new Error('[Fatal] AuthContext requested before it was initialized'); } @@ -197,7 +199,7 @@ export class UmbAppElement extends UmbLitElement { window.sessionStorage.setItem(UMB_STORAGE_REDIRECT_URL, location.href); // Make a request to the auth server to start the auth flow - this.#authContext.makeAuthorizationRequest(); + await this.#authController.makeAuthorizationRequest(); // Return false to prevent the route from being rendered return false; From 600cc1192fd25dadf2b4e73576bdcaf9ec0fdce6 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 4 Apr 2024 12:22:10 +0200 Subject: [PATCH 076/280] add recycle bin for media --- .../src/packages/media/media/manifests.ts | 2 + .../recycle-bin/entity-action/manifests.ts | 42 ++++++++++ .../media/media/recycle-bin/entity.ts | 1 + .../packages/media/media/recycle-bin/index.ts | 2 + .../media/media/recycle-bin/manifests.ts | 6 ++ .../media/recycle-bin/menu-item/manifests.ts | 19 +++++ .../media/recycle-bin/repository/constants.ts | 1 + .../media/recycle-bin/repository/index.ts | 1 + .../media/recycle-bin/repository/manifests.ts | 11 +++ .../media-recycle-bin.repository.ts | 11 +++ .../media-recycle-bin.server.data-source.ts | 52 ++++++++++++ .../media/media/recycle-bin/tree/constants.ts | 3 + .../media/media/recycle-bin/tree/index.ts | 9 ++ .../media/media/recycle-bin/tree/manifests.ts | 49 +++++++++++ .../tree/media-recycle-bin-tree.repository.ts | 33 ++++++++ ...dia-recycle-bin-tree.server.data-source.ts | 84 +++++++++++++++++++ .../tree/media-recycle-bin-tree.store.ts | 24 ++++++ .../reload-tree-item-children/manifests.ts | 12 +++ .../media/media/recycle-bin/tree/types.ts | 6 ++ 19 files changed, 368 insertions(+) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/entity-action/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/entity.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/menu-item/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/repository/constants.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/repository/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/repository/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/repository/media-recycle-bin.repository.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/repository/media-recycle-bin.server.data-source.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/tree/constants.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/tree/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/tree/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/tree/media-recycle-bin-tree.repository.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/tree/media-recycle-bin-tree.server.data-source.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/tree/media-recycle-bin-tree.store.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/tree/reload-tree-item-children/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/tree/types.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/manifests.ts index dba85d8ce2..cbdd5167a5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/manifests.ts @@ -3,6 +3,7 @@ import { manifests as entityActionsManifests } from './entity-actions/manifests. import { manifests as entityBulkActionsManifests } from './entity-bulk-actions/manifests.js'; import { manifests as menuManifests } from './menu/manifests.js'; import { manifests as propertyEditorsManifests } from './property-editors/manifests.js'; +import { manifests as recycleBinManifests } from './recycle-bin/manifests.js'; import { manifests as repositoryManifests } from './repository/manifests.js'; import { manifests as sectionViewManifests } from './section-view/manifests.js'; import { manifests as treeManifests } from './tree/manifests.js'; @@ -14,6 +15,7 @@ export const manifests = [ ...entityBulkActionsManifests, ...menuManifests, ...propertyEditorsManifests, + ...recycleBinManifests, ...repositoryManifests, ...sectionViewManifests, ...treeManifests, diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/entity-action/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/entity-action/manifests.ts new file mode 100644 index 0000000000..d3631a29c6 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/entity-action/manifests.ts @@ -0,0 +1,42 @@ +import { UMB_MEDIA_RECYCLE_BIN_REPOSITORY_ALIAS } from '../repository/index.js'; +import { UMB_MEDIA_ENTITY_TYPE } from '../../entity.js'; +import { UMB_MEDIA_ITEM_REPOSITORY_ALIAS } from '../../repository/index.js'; +import { UMB_MEDIA_RECYCLE_BIN_ROOT_ENTITY_TYPE } from '../entity.js'; +import { UMB_MEDIA_TREE_PICKER_MODAL } from '@umbraco-cms/backoffice/modal'; +import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; + +export const manifests: Array = [ + { + type: 'entityAction', + kind: 'trash', + alias: 'Umb.EntityAction.Media.RecycleBin.Trash', + name: 'Trash Media Entity Action', + forEntityTypes: [UMB_MEDIA_ENTITY_TYPE], + meta: { + itemRepositoryAlias: UMB_MEDIA_ITEM_REPOSITORY_ALIAS, + recycleBinRepositoryAlias: UMB_MEDIA_RECYCLE_BIN_REPOSITORY_ALIAS, + }, + }, + { + type: 'entityAction', + kind: 'restoreFromRecycleBin', + alias: 'Umb.EntityAction.Media.RecycleBin.Restore', + name: 'Restore Media From Recycle Bin Entity Action', + forEntityTypes: [UMB_MEDIA_ENTITY_TYPE], + meta: { + itemRepositoryAlias: UMB_MEDIA_ITEM_REPOSITORY_ALIAS, + recycleBinRepositoryAlias: UMB_MEDIA_RECYCLE_BIN_REPOSITORY_ALIAS, + pickerModal: UMB_MEDIA_TREE_PICKER_MODAL, + }, + }, + { + type: 'entityAction', + kind: 'emptyRecycleBin', + alias: 'Umb.EntityAction.Media.RecycleBin.Empty', + name: 'Empty Media Recycle Bin Entity Action', + forEntityTypes: [UMB_MEDIA_RECYCLE_BIN_ROOT_ENTITY_TYPE], + meta: { + recycleBinRepositoryAlias: UMB_MEDIA_RECYCLE_BIN_REPOSITORY_ALIAS, + }, + }, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/entity.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/entity.ts new file mode 100644 index 0000000000..6237cb94c2 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/entity.ts @@ -0,0 +1 @@ +export const UMB_MEDIA_RECYCLE_BIN_ROOT_ENTITY_TYPE = 'media-recycle-bin-root'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/index.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/index.ts new file mode 100644 index 0000000000..f04892ceea --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/index.ts @@ -0,0 +1,2 @@ +export * from './tree/index.js'; +export * from './entity.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/manifests.ts new file mode 100644 index 0000000000..423a1afcc2 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/manifests.ts @@ -0,0 +1,6 @@ +import { manifests as entityActionManifests } from './entity-action/manifests.js'; +import { manifests as menuItemManifests } from './menu-item/manifests.js'; +import { manifests as repositoryManifests } from './repository/manifests.js'; +import { manifests as treeManifests } from './tree/manifests.js'; + +export const manifests = [...entityActionManifests, ...menuItemManifests, ...repositoryManifests, ...treeManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/menu-item/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/menu-item/manifests.ts new file mode 100644 index 0000000000..3c6b76f1eb --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/menu-item/manifests.ts @@ -0,0 +1,19 @@ +import { UMB_MEDIA_MENU_ALIAS } from '../../menu/manifests.js'; +import { UMB_MEDIA_RECYCLE_BIN_TREE_ALIAS } from '../tree/index.js'; +import type { ManifestMenuItemTreeKind } from '@umbraco-cms/backoffice/extension-registry'; + +const menuItem: ManifestMenuItemTreeKind = { + type: 'menuItem', + kind: 'tree', + alias: 'Umb.MenuItem.Media.RecycleBin', + name: 'Media Recycle Bin Menu Item', + weight: 100, + meta: { + treeAlias: UMB_MEDIA_RECYCLE_BIN_TREE_ALIAS, + label: 'Recycle Bin', + icon: 'icon-trash', + menus: [UMB_MEDIA_MENU_ALIAS], + }, +}; + +export const manifests = [menuItem]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/repository/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/repository/constants.ts new file mode 100644 index 0000000000..e71d4eb514 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/repository/constants.ts @@ -0,0 +1 @@ +export const UMB_MEDIA_RECYCLE_BIN_REPOSITORY_ALIAS = 'Umb.Repository.Media.RecycleBin'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/repository/index.ts new file mode 100644 index 0000000000..b62f9e3b1d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/repository/index.ts @@ -0,0 +1 @@ +export { UMB_MEDIA_RECYCLE_BIN_REPOSITORY_ALIAS } from './constants.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/repository/manifests.ts new file mode 100644 index 0000000000..d645ed6c0e --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/repository/manifests.ts @@ -0,0 +1,11 @@ +import { UMB_MEDIA_RECYCLE_BIN_REPOSITORY_ALIAS } from './constants.js'; +import type { ManifestRepository } from '@umbraco-cms/backoffice/extension-registry'; + +const repository: ManifestRepository = { + type: 'repository', + alias: UMB_MEDIA_RECYCLE_BIN_REPOSITORY_ALIAS, + name: 'Media Recycle Bin Repository', + api: () => import('./media-recycle-bin.repository.js'), +}; + +export const manifests = [repository]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/repository/media-recycle-bin.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/repository/media-recycle-bin.repository.ts new file mode 100644 index 0000000000..867693f2c9 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/repository/media-recycle-bin.repository.ts @@ -0,0 +1,11 @@ +import { UmbMediaRecycleBinServerDataSource } from './media-recycle-bin.server.data-source.js'; +import { UmbRecycleBinRepositoryBase } from '@umbraco-cms/backoffice/recycle-bin'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; + +export class UmbMediaRecycleBinRepository extends UmbRecycleBinRepositoryBase { + constructor(host: UmbControllerHost) { + super(host, UmbMediaRecycleBinServerDataSource); + } +} + +export { UmbMediaRecycleBinRepository as api }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/repository/media-recycle-bin.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/repository/media-recycle-bin.server.data-source.ts new file mode 100644 index 0000000000..91eedae21f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/repository/media-recycle-bin.server.data-source.ts @@ -0,0 +1,52 @@ +import type { + UmbRecycleBinDataSource, + UmbRecycleBinRestoreRequestArgs, + UmbRecycleBinTrashRequestArgs, + UmbRecycleBinOriginalParentRequestArgs, +} from '@umbraco-cms/backoffice/recycle-bin'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { MediaResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; + +export class UmbMediaRecycleBinServerDataSource implements UmbRecycleBinDataSource { + #host: UmbControllerHost; + + constructor(host: UmbControllerHost) { + this.#host = host; + } + + trash(args: UmbRecycleBinTrashRequestArgs) { + return tryExecuteAndNotify(this.#host, MediaResource.putMediaByIdMoveToRecycleBin({ id: args.unique })); + } + + restore(args: UmbRecycleBinRestoreRequestArgs) { + return tryExecuteAndNotify( + this.#host, + MediaResource.putRecycleBinMediaByIdRestore({ + id: args.unique, + requestBody: { + target: args.destination.unique ? { id: args.destination.unique } : null, + }, + }), + ); + } + + empty() { + return tryExecuteAndNotify(this.#host, MediaResource.deleteRecycleBinMedia()); + } + + async getOriginalParent(args: UmbRecycleBinOriginalParentRequestArgs) { + const { data, error } = await tryExecuteAndNotify( + this.#host, + MediaResource.getRecycleBinMediaByIdOriginalParent({ id: args.unique }), + ); + + // only check for undefined because data can be null if the parent is the root + if (data !== undefined) { + const mappedData = data ? { unique: data.id } : null; + return { data: mappedData }; + } + + return { error }; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/tree/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/tree/constants.ts new file mode 100644 index 0000000000..161a713575 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/tree/constants.ts @@ -0,0 +1,3 @@ +export const UMB_MEDIA_RECYCLE_BIN_TREE_REPOSITORY_ALIAS = 'Umb.Repository.Media.RecycleBin.Tree'; +export const UMB_MEDIA_RECYCLE_BIN_TREE_STORE_ALIAS = 'Umb.Store.Media.RecycleBin.Tree'; +export const UMB_MEDIA_RECYCLE_BIN_TREE_ALIAS = 'Umb.Tree.Media.RecycleBin'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/tree/index.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/tree/index.ts new file mode 100644 index 0000000000..2a6044c805 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/tree/index.ts @@ -0,0 +1,9 @@ +export { UmbMediaRecycleBinTreeRepository } from './media-recycle-bin-tree.repository.js'; +export { + UMB_MEDIA_RECYCLE_BIN_TREE_REPOSITORY_ALIAS, + UMB_MEDIA_RECYCLE_BIN_TREE_STORE_ALIAS, + UMB_MEDIA_RECYCLE_BIN_TREE_ALIAS, +} from './constants.js'; +export { UMB_MEDIA_RECYCLE_BIN_TREE_STORE_CONTEXT } from './media-recycle-bin-tree.store.js'; +export { type UmbMediaRecycleBinTreeStore } from './media-recycle-bin-tree.store.js'; +export * from './types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/tree/manifests.ts new file mode 100644 index 0000000000..d3557a6293 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/tree/manifests.ts @@ -0,0 +1,49 @@ +import { UMB_MEDIA_RECYCLE_BIN_ROOT_ENTITY_TYPE } from '../entity.js'; +import { + UMB_MEDIA_RECYCLE_BIN_TREE_ALIAS, + UMB_MEDIA_RECYCLE_BIN_TREE_REPOSITORY_ALIAS, + UMB_MEDIA_RECYCLE_BIN_TREE_STORE_ALIAS, +} from './constants.js'; +import { UmbMediaRecycleBinTreeRepository } from './media-recycle-bin-tree.repository.js'; +import { UmbMediaRecycleBinTreeStore } from './media-recycle-bin-tree.store.js'; +import { manifests as reloadTreeItemChildrenManifests } from './reload-tree-item-children/manifests.js'; +import type { + ManifestRepository, + ManifestTree, + ManifestTreeItem, + ManifestTreeStore, +} from '@umbraco-cms/backoffice/extension-registry'; + +const treeRepository: ManifestRepository = { + type: 'repository', + alias: UMB_MEDIA_RECYCLE_BIN_TREE_REPOSITORY_ALIAS, + name: 'Media Recycle Bin Tree Repository', + api: UmbMediaRecycleBinTreeRepository, +}; + +const treeStore: ManifestTreeStore = { + type: 'treeStore', + alias: UMB_MEDIA_RECYCLE_BIN_TREE_STORE_ALIAS, + name: 'Media Recycle Bin Tree Store', + api: UmbMediaRecycleBinTreeStore, +}; + +const tree: ManifestTree = { + type: 'tree', + kind: 'default', + alias: UMB_MEDIA_RECYCLE_BIN_TREE_ALIAS, + name: 'Media Recycle Bin Tree', + meta: { + repositoryAlias: UMB_MEDIA_RECYCLE_BIN_TREE_REPOSITORY_ALIAS, + }, +}; + +const treeItem: ManifestTreeItem = { + type: 'treeItem', + kind: 'default', + alias: 'Umb.TreeItem.Media.RecycleBin', + name: 'Media Recycle Bin Tree Item', + forEntityTypes: [UMB_MEDIA_RECYCLE_BIN_ROOT_ENTITY_TYPE], +}; + +export const manifests = [treeRepository, treeStore, tree, treeItem, ...reloadTreeItemChildrenManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/tree/media-recycle-bin-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/tree/media-recycle-bin-tree.repository.ts new file mode 100644 index 0000000000..f027339993 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/tree/media-recycle-bin-tree.repository.ts @@ -0,0 +1,33 @@ +import { UMB_MEDIA_RECYCLE_BIN_ROOT_ENTITY_TYPE } from '../entity.js'; +import { UmbMediaRecycleBinTreeServerDataSource } from './media-recycle-bin-tree.server.data-source.js'; +import type { UmbMediaRecycleBinTreeItemModel, UmbMediaRecycleBinTreeRootModel } from './types.js'; +import { UMB_MEDIA_RECYCLE_BIN_TREE_STORE_CONTEXT } from './media-recycle-bin-tree.store.js'; +import { UmbTreeRepositoryBase } from '@umbraco-cms/backoffice/tree'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; + +export class UmbMediaRecycleBinTreeRepository + extends UmbTreeRepositoryBase + implements UmbApi +{ + constructor(host: UmbControllerHost) { + super(host, UmbMediaRecycleBinTreeServerDataSource, UMB_MEDIA_RECYCLE_BIN_TREE_STORE_CONTEXT); + } + + async requestTreeRoot() { + const { data: treeRootData } = await this._treeSource.getRootItems({ skip: 0, take: 1 }); + const hasChildren = treeRootData?.total > 0; + + const data = { + unique: null, + entityType: UMB_MEDIA_RECYCLE_BIN_ROOT_ENTITY_TYPE, + name: 'Recycle Bin', + icon: 'icon-trash', + hasChildren, + isContainer: false, + isFolder: true, + }; + + return { data }; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/tree/media-recycle-bin-tree.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/tree/media-recycle-bin-tree.server.data-source.ts new file mode 100644 index 0000000000..a9fa6bdf6c --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/tree/media-recycle-bin-tree.server.data-source.ts @@ -0,0 +1,84 @@ +import { UMB_MEDIA_ENTITY_TYPE } from '../../entity.js'; +import type { UmbMediaRecycleBinTreeItemModel } from './types.js'; +import type { MediaRecycleBinItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; +import { MediaResource } from '@umbraco-cms/backoffice/external/backend-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import type { + UmbTreeAncestorsOfRequestArgs, + UmbTreeChildrenOfRequestArgs, + UmbTreeRootItemsRequestArgs, +} from '@umbraco-cms/backoffice/tree'; +import { UmbTreeServerDataSourceBase } from '@umbraco-cms/backoffice/tree'; + +/** + * A data source for the Media Recycle Bin tree that fetches data from the server + * @export + * @class UmbMediaRecycleBinTreeServerDataSource + * @implements {UmbTreeDataSource} + */ +export class UmbMediaRecycleBinTreeServerDataSource extends UmbTreeServerDataSourceBase< + MediaRecycleBinItemResponseModel, + UmbMediaRecycleBinTreeItemModel +> { + /** + * Creates an instance of UmbMediaRecycleBinTreeServerDataSource. + * @param {UmbControllerHost} host + * @memberof UmbMediaRecycleBinTreeServerDataSource + */ + constructor(host: UmbControllerHost) { + super(host, { + getRootItems, + getChildrenOf, + getAncestorsOf, + mapper, + }); + } +} + +const getRootItems = (args: UmbTreeRootItemsRequestArgs) => + // eslint-disable-next-line local-rules/no-direct-api-import + MediaResource.getRecycleBinMediaRoot({ skip: args.skip, take: args.take }); + +const getChildrenOf = (args: UmbTreeChildrenOfRequestArgs) => { + if (args.parentUnique === null) { + return getRootItems(args); + } else { + // eslint-disable-next-line local-rules/no-direct-api-import + return MediaResource.getRecycleBinMediaChildren({ + parentId: args.parentUnique, + skip: args.skip, + take: args.take, + }); + } +}; + +const getAncestorsOf = (args: UmbTreeAncestorsOfRequestArgs) => + // eslint-disable-next-line local-rules/no-direct-api-import + MediaResource.getTreeMediaAncestors({ + descendantId: args.descendantUnique, + }); + +const mapper = (item: MediaRecycleBinItemResponseModel): UmbMediaRecycleBinTreeItemModel => { + return { + unique: item.id, + parentUnique: item.parent ? item.parent.id : null, + entityType: UMB_MEDIA_ENTITY_TYPE, + noAccess: false, + isTrashed: true, + hasChildren: item.hasChildren, + mediaType: { + unique: item.mediaType.id, + icon: item.mediaType.icon, + collection: item.mediaType.collection ? { unique: item.mediaType.collection.id } : null, + }, + variants: item.variants.map((variant) => { + return { + name: variant.name, + culture: variant.culture || null, + segment: null, // TODO: add segment to the backend API? + }; + }), + name: item.variants[0]?.name, // TODO: this is not correct. We need to get it from the variants. This is a temp solution. + isFolder: false, + }; +}; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/tree/media-recycle-bin-tree.store.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/tree/media-recycle-bin-tree.store.ts new file mode 100644 index 0000000000..6ccf7e34dd --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/tree/media-recycle-bin-tree.store.ts @@ -0,0 +1,24 @@ +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { UmbUniqueTreeStore } from '@umbraco-cms/backoffice/tree'; + +/** + * @export + * @class UmbMediaRecycleBinTreeStore + * @extends {UmbStoreBase} + * @description - Tree Data Store for Media Recycle Bin Tree Items + */ +export class UmbMediaRecycleBinTreeStore extends UmbUniqueTreeStore { + /** + * Creates an instance of UmbMediaRecycleBinTreeStore. + * @param {UmbControllerHost} host + * @memberof UmbMediaRecycleBinTreeStore + */ + constructor(host: UmbControllerHost) { + super(host, UMB_MEDIA_RECYCLE_BIN_TREE_STORE_CONTEXT.toString()); + } +} + +export const UMB_MEDIA_RECYCLE_BIN_TREE_STORE_CONTEXT = new UmbContextToken( + 'UmbMediaRecycleBinTreeStore', +); diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/tree/reload-tree-item-children/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/tree/reload-tree-item-children/manifests.ts new file mode 100644 index 0000000000..e4977c9214 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/tree/reload-tree-item-children/manifests.ts @@ -0,0 +1,12 @@ +import { UMB_MEDIA_RECYCLE_BIN_ROOT_ENTITY_TYPE } from '../../entity.js'; +import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; + +export const manifests: Array = [ + { + type: 'entityAction', + kind: 'reloadTreeItemChildren', + alias: 'Umb.EntityAction.MediaRecycleBin.Tree.ReloadChildrenOf', + name: 'Reload Media Recycle Bin Tree Item Children Entity Action', + forEntityTypes: [UMB_MEDIA_RECYCLE_BIN_ROOT_ENTITY_TYPE], + }, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/tree/types.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/tree/types.ts new file mode 100644 index 0000000000..b09498103f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/tree/types.ts @@ -0,0 +1,6 @@ +import type { UmbMediaTreeItemModel } from '../../tree/index.js'; +import type { UmbUniqueTreeRootModel } from '@umbraco-cms/backoffice/tree'; + +export interface UmbMediaRecycleBinTreeItemModel extends UmbMediaTreeItemModel {} + +export interface UmbMediaRecycleBinTreeRootModel extends UmbUniqueTreeRootModel {} From 1b30cf2bdd50c3131b6a4bde9bfd823db613a301 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 4 Apr 2024 13:01:53 +0200 Subject: [PATCH 077/280] picker modal from manifest --- .../modal/restore-from-recycle-bin-modal.element.ts | 7 ++++--- .../modal/restore-from-recycle-bin-modal.token.ts | 3 +++ .../restore-from-recycle-bin.action.ts | 1 + 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/restore-from-recycle-bin-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/restore-from-recycle-bin-modal.element.ts index 4efab40b7a..6bcb071416 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/restore-from-recycle-bin-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/restore-from-recycle-bin-modal.element.ts @@ -4,11 +4,10 @@ import type { UmbRestoreFromRecycleBinModalValue, } from './restore-from-recycle-bin-modal.token.js'; import type { PropertyValueMap } from '@umbraco-cms/backoffice/external/lit'; -import { html, customElement, state, nothing, css } from '@umbraco-cms/backoffice/external/lit'; +import { html, customElement, state, css } from '@umbraco-cms/backoffice/external/lit'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UMB_MODAL_MANAGER_CONTEXT, UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; import { createExtensionApiByAlias } from '@umbraco-cms/backoffice/extension-registry'; -import { UMB_DOCUMENT_PICKER_MODAL } from '@umbraco-cms/backoffice/document'; import type { UmbItemRepository } from '@umbraco-cms/backoffice/repository'; const elementName = 'umb-restore-from-recycle-bin-modal'; @@ -99,8 +98,10 @@ export class UmbRestoreFromRecycleBinModalElement extends UmbModalBaseElement< } async #onSelectCustomDestination() { + if (!this.data?.pickerModal) throw new Error('Cannot select a destination without a picker modal.'); + const modalManager = await this.getContext(UMB_MODAL_MANAGER_CONTEXT); - const modal = modalManager.open(this, UMB_DOCUMENT_PICKER_MODAL, { + const modal = modalManager.open(this, this.data.pickerModal, { data: { multiple: false, }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/restore-from-recycle-bin-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/restore-from-recycle-bin-modal.token.ts index ed2befadee..abab77f3f3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/restore-from-recycle-bin-modal.token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/restore-from-recycle-bin-modal.token.ts @@ -1,10 +1,13 @@ +import type { UmbTreePickerModalData } from '@umbraco-cms/backoffice/modal'; import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; +import type { UmbUniqueTreeItemModel, UmbUniqueTreeRootModel } from '@umbraco-cms/backoffice/tree'; export interface UmbRestoreFromRecycleBinModalData { unique: string; entityType: string; recycleBinRepositoryAlias: string; itemRepositoryAlias: string; + pickerModal: UmbModalToken> | string; } export interface UmbRestoreFromRecycleBinModalValue { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/restore-from-recycle-bin.action.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/restore-from-recycle-bin.action.ts index acc07f4adb..5910d4df6a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/restore-from-recycle-bin.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/restore-from-recycle-bin.action.ts @@ -16,6 +16,7 @@ export class UmbRestoreFromRecycleBinEntityAction extends UmbEntityActionBase Date: Thu, 4 Apr 2024 13:27:54 +0200 Subject: [PATCH 078/280] add specific interface to tree picker value --- src/Umbraco.Web.UI.Client/src/packages/core/modal/types.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/types.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/types.ts index f6b81a7e1e..4d64ac0e63 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/modal/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/types.ts @@ -11,3 +11,5 @@ export interface UmbPickerModalValue { export interface UmbTreePickerModalData extends UmbPickerModalData { treeAlias?: string; } + +export interface UmbTreePickerModalValue extends UmbPickerModalValue {} From 1db28d07daf9feb0be8748a3cb2c28328ff7038e Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 4 Apr 2024 13:28:04 +0200 Subject: [PATCH 079/280] add todo --- .../src/packages/core/modal/types.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/types.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/types.ts index 4d64ac0e63..8f42e65ee0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/modal/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/types.ts @@ -1,8 +1,8 @@ -export interface UmbPickerModalData { +export interface UmbPickerModalData { multiple?: boolean; - hideTreeRoot?: boolean; - filter?: (item: TreeItemType) => boolean; - pickableFilter?: (item: TreeItemType) => boolean; + hideTreeRoot?: boolean; // TODO: this should be moved to a tree picker modal data interface + filter?: (item: ItemType) => boolean; + pickableFilter?: (item: ItemType) => boolean; } export interface UmbPickerModalValue { selection: Array; From 2039e6a052f6729dc05d37b025257b3870f6bbed Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 4 Apr 2024 13:28:53 +0200 Subject: [PATCH 080/280] add picker interfaces --- .../core/extension-registry/models/entity-action.model.ts | 4 ++-- .../modal/restore-from-recycle-bin-modal.token.ts | 5 ++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/entity-action.model.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/entity-action.model.ts index c0b7805c07..68ed28918a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/entity-action.model.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/entity-action.model.ts @@ -2,7 +2,7 @@ import type { ConditionTypes } from '../conditions/types.js'; import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import type { UmbEntityAction } from '@umbraco-cms/backoffice/entity-action'; import type { ManifestElementAndApi, ManifestWithDynamicConditions } from '@umbraco-cms/backoffice/extension-api'; -import type { UmbModalToken } from '@umbraco-cms/backoffice/modal'; +import type { UmbModalToken, UmbPickerModalData, UmbPickerModalValue } from '@umbraco-cms/backoffice/modal'; /** * An action to perform on an entity @@ -78,7 +78,7 @@ export interface ManifestEntityActionRestoreFromRecycleBinKind export interface MetaEntityActionRestoreFromRecycleBinKind extends MetaEntityActionDefaultKind { recycleBinRepositoryAlias: string; itemRepositoryAlias: string; - pickerModal: UmbModalToken | string; + pickerModal: UmbModalToken, UmbPickerModalValue> | string; } // EMPTY RECYCLE BIN diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/restore-from-recycle-bin-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/restore-from-recycle-bin-modal.token.ts index abab77f3f3..63b94f4451 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/restore-from-recycle-bin-modal.token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/modal/restore-from-recycle-bin-modal.token.ts @@ -1,13 +1,12 @@ -import type { UmbTreePickerModalData } from '@umbraco-cms/backoffice/modal'; +import type { UmbPickerModalData, UmbPickerModalValue } from '@umbraco-cms/backoffice/modal'; import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; -import type { UmbUniqueTreeItemModel, UmbUniqueTreeRootModel } from '@umbraco-cms/backoffice/tree'; export interface UmbRestoreFromRecycleBinModalData { unique: string; entityType: string; recycleBinRepositoryAlias: string; itemRepositoryAlias: string; - pickerModal: UmbModalToken> | string; + pickerModal: UmbModalToken, UmbPickerModalValue> | string; } export interface UmbRestoreFromRecycleBinModalValue { From 46c52153bca1ce88560eec1b834899edad04a9e8 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 4 Apr 2024 13:30:39 +0200 Subject: [PATCH 081/280] null check --- .../recycle-bin/tree/document-recycle-bin-tree.repository.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/document-recycle-bin-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/document-recycle-bin-tree.repository.ts index 23ed6a2004..c451dbb466 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/document-recycle-bin-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/document-recycle-bin-tree.repository.ts @@ -16,7 +16,7 @@ export class UmbDocumentRecycleBinTreeRepository async requestTreeRoot() { const { data: treeRootData } = await this._treeSource.getRootItems({ skip: 0, take: 1 }); - const hasChildren = treeRootData?.total > 0; + const hasChildren = treeRootData ? treeRootData.total > 0 : false; const data = { unique: null, From ad3301d21953ec9175c71e3e52bf13d8125a9a71 Mon Sep 17 00:00:00 2001 From: JesmoDev <26099018+JesmoDev@users.noreply.github.com> Date: Thu, 4 Apr 2024 13:52:36 +0200 Subject: [PATCH 082/280] multiple variants --- .../modals/rollback/rollback-modal.element.ts | 38 +++++++++++++++---- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts index 2d6684cf5d..275e7e90cd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts @@ -9,6 +9,7 @@ import { UmbUserItemRepository } from '@umbraco-cms/backoffice/user'; import { UMB_DOCUMENT_WORKSPACE_CONTEXT } from '../../workspace/index.js'; import { UMB_DOCUMENT_PROPERTY_DATASET_CONTEXT } from '../../property-dataset-context/document-property-dataset-context.token.js'; import { UMB_PROPERTY_DATASET_CONTEXT } from '@umbraco-cms/backoffice/property'; +import { UUISelectEvent } from '@umbraco-ui/uui'; type DocumentVersion = { id: string; @@ -35,19 +36,26 @@ export class UmbRollbackModalElement extends UmbModalBaseElement { this.#propertyDatasetContext = instance; + this.currentCulture = this.#propertyDatasetContext.getVariantId().culture ?? undefined; this.#requestVersions(); }); } @@ -56,11 +64,10 @@ export class UmbRollbackModalElement extends UmbModalBaseElementLanguage + + `; + } + #renderVersions() { - return repeat( + return html` ${this.#renderCultureSelect()} + ${repeat( this.versions, (item) => item.id, (item) => { @@ -161,7 +183,7 @@ export class UmbRollbackModalElement extends UmbModalBaseElement `; }, - ); + )}`; } #renderCurrentVersion() { From 7fd8d70064e8ade7c95afbf0c1fa9cdf45b3f83f Mon Sep 17 00:00:00 2001 From: JesmoDev <26099018+JesmoDev@users.noreply.github.com> Date: Thu, 4 Apr 2024 14:03:23 +0200 Subject: [PATCH 083/280] variant select --- .../modals/rollback/rollback-modal.element.ts | 29 ++++++++++--------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts index 275e7e90cd..773503e57e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts @@ -6,10 +6,8 @@ import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import '../shared/document-variant-language-picker.element.js'; import { UmbUserItemRepository } from '@umbraco-cms/backoffice/user'; -import { UMB_DOCUMENT_WORKSPACE_CONTEXT } from '../../workspace/index.js'; -import { UMB_DOCUMENT_PROPERTY_DATASET_CONTEXT } from '../../property-dataset-context/document-property-dataset-context.token.js'; import { UMB_PROPERTY_DATASET_CONTEXT } from '@umbraco-cms/backoffice/property'; -import { UUISelectEvent } from '@umbraco-ui/uui'; +import type { UUISelectEvent } from '@umbraco-cms/backoffice/external/uui'; type DocumentVersion = { id: string; @@ -41,7 +39,7 @@ export class UmbRollbackModalElement extends UmbModalBaseElement { tempItems.push({ date: item.versionDate, - user: userItems?.find((user) => user.unique === item.user.id)?.name || '', + user: userItems?.find((user) => user.unique === item.user.id)?.name || 'Unknown user', isCurrentlyPublishedVersion: item.isCurrentPublishedVersion, id: item.id, preventCleanup: item.preventCleanup, @@ -103,14 +101,16 @@ export class UmbRollbackModalElement extends UmbModalBaseElement x.culture === this.currentCulture)?.name || data.variants[0].name, id: data.id, - properties: data.values.map((value: any) => { - return { - alias: value.alias, - value: value.value, - }; - }), + properties: data.values + .filter((x) => x.culture === this.currentCulture) + .map((value: any) => { + return { + alias: value.alias, + value: value.value, + }; + }), }; } @@ -118,7 +118,8 @@ export class UmbRollbackModalElement extends UmbModalBaseElement 1 ? this.currentCulture : undefined; + this.#rollbackRepository.rollback(id, culture); this.modalContext?.reject(); } From 3382dd5a9a4d5d6f0b5e0b6d10d451b09bbe82ef Mon Sep 17 00:00:00 2001 From: JesmoDev <26099018+JesmoDev@users.noreply.github.com> Date: Thu, 4 Apr 2024 14:13:22 +0200 Subject: [PATCH 084/280] correct date format --- .../modals/rollback/rollback-modal.element.ts | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts index 773503e57e..570c51d3a7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts @@ -48,6 +48,13 @@ export class UmbRollbackModalElement extends UmbModalBaseElement

- +

${item.user}

${item.isCurrentlyPublishedVersion ? 'Current published version' : ''}

@@ -205,7 +212,9 @@ export class UmbRollbackModalElement extends UmbModalBaseElement Date: Thu, 4 Apr 2024 14:25:48 +0200 Subject: [PATCH 085/280] get real languages --- .../modals/rollback/rollback-modal.element.ts | 27 ++++++++++++++++--- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts index 570c51d3a7..f1abfaa2eb 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts @@ -8,6 +8,7 @@ import '../shared/document-variant-language-picker.element.js'; import { UmbUserItemRepository } from '@umbraco-cms/backoffice/user'; import { UMB_PROPERTY_DATASET_CONTEXT } from '@umbraco-cms/backoffice/property'; import type { UUISelectEvent } from '@umbraco-cms/backoffice/external/uui'; +import { UMB_VARIANT_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; type DocumentVersion = { id: string; @@ -39,14 +40,15 @@ export class UmbRollbackModalElement extends UmbModalBaseElement { this.#propertyDatasetContext = instance; - this.currentCulture = this.#propertyDatasetContext.getVariantId().culture ?? undefined; + this.currentCulture = instance.getVariantId().culture ?? undefined; this.#requestVersions(); }); + + this.consumeContext(UMB_VARIANT_WORKSPACE_CONTEXT, (instance) => { + this.#variantWorkspaceContext = instance; + + // TODO: For some reason TS cant find languages on the context + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + instance.languages.subscribe((languages) => { + this.availableVariants = languages.map((language: any) => { + return { + name: language.name, + value: language.unique, + selected: language.unique === this.currentCulture, + }; + }); + }); + }); } async #requestVersions() { @@ -106,7 +125,7 @@ export class UmbRollbackModalElement extends UmbModalBaseElement x.culture === this.currentCulture)?.name || data.variants[0].name, id: data.id, From 951d8831cd3509e11534391330ae38de28c5e501 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Thu, 4 Apr 2024 14:51:18 +0200 Subject: [PATCH 086/280] move isAuthorized logic into the auth controller --- .../src/apps/app/app-auth.controller.ts | 49 +++++++++++++++++-- .../src/apps/app/app.element.ts | 19 +------ 2 files changed, 46 insertions(+), 22 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts b/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts index fdc4c6cb35..73c31479d9 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts @@ -1,9 +1,50 @@ -import { UMB_AUTH_CONTEXT } from '@umbraco-cms/backoffice/auth'; +import { UMB_AUTH_CONTEXT, UMB_STORAGE_REDIRECT_URL } from '@umbraco-cms/backoffice/auth'; import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; export class UmbAppAuthController extends UmbControllerBase { - async makeAuthorizationRequest() { - const authContext = await this.getContext(UMB_AUTH_CONTEXT); - return authContext.makeAuthorizationRequest(); + #authContext?: typeof UMB_AUTH_CONTEXT.TYPE; + + constructor(host: UmbControllerHost) { + super(host); + + this.consumeContext(UMB_AUTH_CONTEXT, (context) => { + this.#authContext = context; + }); + } + + /** + * Checks if the user is authorized. + * If not, the authorization flow is started. + */ + async isAuthorized(): Promise { + if (!this.#authContext) { + throw new Error('[Fatal] Auth context is not available'); + } + + const isAuthorized = this.#authContext.getIsAuthorized(); + + if (isAuthorized) { + return true; + } + + // Save location.href so we can redirect to it after login + window.sessionStorage.setItem(UMB_STORAGE_REDIRECT_URL, location.href); + + // Make a request to the auth server to start the auth flow + return this.makeAuthorizationRequest(); + } + + async makeAuthorizationRequest(): Promise { + if (!this.#authContext) { + throw new Error('[Fatal] Auth context is not available'); + } + + this.#authContext.makeAuthorizationRequest(); + + // Reinitialize the auth flow (load the state from local storage) + this.#authContext.setInitialState(); + + return true; } } 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 89ab404a0f..3ccb67046a 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 @@ -186,24 +186,7 @@ export class UmbAppElement extends UmbLitElement { } #isAuthorizedGuard(): Guard { - return async () => { - if (!this.#authContext) { - throw new Error('[Fatal] AuthContext requested before it was initialized'); - } - - if (this.#authContext.getIsAuthorized()) { - return true; - } - - // Save location.href so we can redirect to it after login - window.sessionStorage.setItem(UMB_STORAGE_REDIRECT_URL, location.href); - - // Make a request to the auth server to start the auth flow - await this.#authController.makeAuthorizationRequest(); - - // Return false to prevent the route from being rendered - return false; - }; + return () => this.#authController.isAuthorized(); } #errorPage(errorMsg: string, error?: unknown) { From 6f5b49886f15ef49e75f18111270e1d0f144e7e4 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Thu, 4 Apr 2024 15:30:09 +0200 Subject: [PATCH 087/280] register public extensions in the app element --- .../src/apps/app/app-auth.controller.ts | 12 ++++++++++++ .../src/apps/app/app.element.ts | 3 +++ .../src/apps/backoffice/backoffice.element.ts | 8 +------- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts b/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts index 73c31479d9..9d0c7983c9 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts @@ -1,9 +1,13 @@ import { UMB_AUTH_CONTEXT, UMB_STORAGE_REDIRECT_URL } from '@umbraco-cms/backoffice/auth'; import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { UmbServerExtensionRegistrator } from '@umbraco-cms/backoffice/extension-api'; +import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; export class UmbAppAuthController extends UmbControllerBase { #authContext?: typeof UMB_AUTH_CONTEXT.TYPE; + #serverExtensionRegistrator = new UmbServerExtensionRegistrator(this, umbExtensionsRegistry); + #init; constructor(host: UmbControllerHost) { super(host); @@ -11,6 +15,8 @@ export class UmbAppAuthController extends UmbControllerBase { this.consumeContext(UMB_AUTH_CONTEXT, (context) => { this.#authContext = context; }); + + this.#init = Promise.all([this.#serverExtensionRegistrator.registerPublicExtensions()]); } /** @@ -35,11 +41,17 @@ export class UmbAppAuthController extends UmbControllerBase { return this.makeAuthorizationRequest(); } + /** + * Starts the authorization flow. + * It will check which providers are available and either redirect directly to the provider or show a provider selection screen. + */ async makeAuthorizationRequest(): Promise { if (!this.#authContext) { throw new Error('[Fatal] Auth context is not available'); } + await this.#init; + this.#authContext.makeAuthorizationRequest(); // Reinitialize the auth flow (load the state from local storage) 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 3ccb67046a..94cf02eed0 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 @@ -67,6 +67,9 @@ export class UmbAppElement extends UmbLitElement { new UmbContextDebugController(this); + new UmbBundleExtensionInitializer(this, umbExtensionsRegistry); + new UmbEntryPointExtensionInitializer(this, umbExtensionsRegistry); + this.#umbIconRegistry.attach(this); this.#uuiIconRegistry.attach(this); } 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 4d77370af7..407e04a759 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 @@ -1,11 +1,7 @@ import { UmbBackofficeContext } from './backoffice.context.js'; import { css, html, customElement } from '@umbraco-cms/backoffice/external/lit'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; -import { - UmbBundleExtensionInitializer, - UmbEntryPointExtensionInitializer, - UmbServerExtensionRegistrator, -} from '@umbraco-cms/backoffice/extension-api'; +import { UmbServerExtensionRegistrator } from '@umbraco-cms/backoffice/extension-api'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import './components/index.js'; @@ -53,8 +49,6 @@ export class UmbBackofficeElement extends UmbLitElement { super(); new UmbBackofficeContext(this); - new UmbBundleExtensionInitializer(this, umbExtensionsRegistry); - new UmbEntryPointExtensionInitializer(this, umbExtensionsRegistry); new UmbServerExtensionRegistrator(this, umbExtensionsRegistry).registerAllExtensions(); // So far local packages are this simple to registerer, so no need for a manager to do that: From 6b57cf02edc4db03c662c4a239a80fbf62dc73dc Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Thu, 4 Apr 2024 15:30:29 +0200 Subject: [PATCH 088/280] add imports --- src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts b/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts index 94cf02eed0..b11e26695d 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 @@ -12,6 +12,11 @@ import type { Guard, UmbRoute } from '@umbraco-cms/backoffice/router'; import { pathWithoutBasePath } from '@umbraco-cms/backoffice/router'; import { OpenAPI, RuntimeLevelModel } from '@umbraco-cms/backoffice/external/backend-api'; import { UmbContextDebugController } from '@umbraco-cms/backoffice/debug'; +import { + UmbBundleExtensionInitializer, + UmbEntryPointExtensionInitializer, +} from '@umbraco-cms/backoffice/extension-api'; +import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; @customElement('umb-app') export class UmbAppElement extends UmbLitElement { From 01fd7e02e9f42dc6600a9bd07be34cc995e85aa6 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Thu, 4 Apr 2024 15:30:43 +0200 Subject: [PATCH 089/280] remove unused import --- src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 b11e26695d..f4a9bb8239 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 @@ -3,7 +3,7 @@ import { UmbAppContext } from './app.context.js'; import { UmbServerConnection } from './server-connection.js'; import { UmbAppAuthController } from './app-auth.controller.js'; import type { UMB_AUTH_CONTEXT } from '@umbraco-cms/backoffice/auth'; -import { UMB_STORAGE_REDIRECT_URL, UmbAuthContext } from '@umbraco-cms/backoffice/auth'; +import { 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'; From 1b3d704b432228ebdfc2c8a298b12014cd081492 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Thu, 4 Apr 2024 15:31:03 +0200 Subject: [PATCH 090/280] update the baseURL whenever it changes --- .../src/apps/app/app.element.ts | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) 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 f4a9bb8239..6d3070339e 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 @@ -27,7 +27,12 @@ export class UmbAppElement extends UmbLitElement { * @remarks This is the base URL of the Umbraco server, not the base URL of the backoffice. */ @property({ type: String }) - serverUrl = window.location.origin; + set serverUrl(url: string) { + OpenAPI.BASE = url; + } + get serverUrl() { + return OpenAPI.BASE; + } /** * The base path of the backoffice. @@ -70,6 +75,8 @@ export class UmbAppElement extends UmbLitElement { constructor() { super(); + OpenAPI.BASE = window.location.origin; + new UmbContextDebugController(this); new UmbBundleExtensionInitializer(this, umbExtensionsRegistry); @@ -85,14 +92,6 @@ 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. - TODO: find the right place to set this - */ - OpenAPI.BASE = this.serverUrl; - this.#serverConnection = await new UmbServerConnection(this.serverUrl).connect(); this.#authContext = new UmbAuthContext(this, this.serverUrl, this.backofficePath, this.bypassAuth); From a25ec074c1c1838a393bc34aa3a4addaa103dc2c Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Thu, 4 Apr 2024 15:31:13 +0200 Subject: [PATCH 091/280] add public manifest handlers --- .../src/mocks/browser-handlers.ts | 4 +- .../src/mocks/handlers/manifests.handlers.ts | 244 +++++++++--------- 2 files changed, 129 insertions(+), 119 deletions(-) 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 6a3c44ce04..a5751325f3 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/browser-handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/browser-handlers.ts @@ -90,11 +90,11 @@ switch (import.meta.env.VITE_UMBRACO_INSTALL_STATUS) { switch (import.meta.env.VITE_UMBRACO_EXTENSION_MOCKS) { case 'on': - handlers.push(manifestsHandlers.manifestDevelopmentHandler); + handlers.push(...manifestsHandlers.manifestDevelopmentHandlers); break; default: - handlers.push(manifestsHandlers.manifestEmptyHandler); + handlers.push(...manifestsHandlers.manifestEmptyHandlers); } export { handlers }; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/manifests.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/manifests.handlers.ts index 3a37e7aec5..df03f8cffd 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/manifests.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/manifests.handlers.ts @@ -3,127 +3,137 @@ const { rest } = window.MockServiceWorker; import type { PackageManifestResponse } from '../../packages/packages/types.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; -export const manifestDevelopmentHandler = rest.get(umbracoPath('/package/manifest'), (_req, res, ctx) => { - return res( - // Respond with a 200 status code - ctx.status(200), - ctx.json([ - { - name: 'My Package Name', - version: '1.0.0', - extensions: [ - { - type: 'bundle', - alias: 'My.Package.Bundle', - name: 'My Package Bundle', - js: '/App_Plugins/custom-bundle-package/index.js', - }, - ], - }, - { - name: 'Named Package', - version: '1.0.0', - extensions: [ - { - type: 'section', - alias: 'My.Section.Custom', - name: 'Custom Section', - js: '/App_Plugins/section.js', - elementName: 'my-section-custom', - weight: 1, - meta: { - label: 'Custom', - pathname: 'my-custom', +export const manifestDevelopmentHandlers = [ + rest.get(umbracoPath('/package/manifest'), (_req, res, ctx) => { + return res( + // Respond with a 200 status code + ctx.status(200), + ctx.json([ + { + name: 'My Package Name', + version: '1.0.0', + extensions: [ + { + type: 'bundle', + alias: 'My.Package.Bundle', + name: 'My Package Bundle', + js: '/App_Plugins/custom-bundle-package/index.js', }, - }, - { - type: 'propertyEditorUi', - alias: 'My.PropertyEditorUI.Custom', - name: 'My Custom Property Editor UI', - js: '/App_Plugins/property-editor.js', - elementName: 'my-property-editor-ui-custom', - meta: { - label: 'My Custom Property', - icon: 'document', - group: 'Common', - propertyEditorSchema: 'Umbraco.TextBox', + ], + }, + { + name: 'Named Package', + version: '1.0.0', + extensions: [ + { + type: 'section', + alias: 'My.Section.Custom', + name: 'Custom Section', + js: '/App_Plugins/section.js', + elementName: 'my-section-custom', + weight: 1, + meta: { + label: 'Custom', + pathname: 'my-custom', + }, }, - }, - ], - }, - { - name: 'Package with an entry point', - extensions: [ - { - type: 'entryPoint', - name: 'My Custom Entry Point', - alias: 'My.Entrypoint.Custom', - js: '/App_Plugins/custom-entrypoint.js', - }, - ], - }, - { - name: 'Package with a view', - extensions: [ - { - type: 'packageView', - alias: 'My.PackageView.Custom', - name: 'My Custom Package View', - js: '/App_Plugins/package-view.js', - meta: { - packageName: 'Package with a view', + { + type: 'propertyEditorUi', + alias: 'My.PropertyEditorUI.Custom', + name: 'My Custom Property Editor UI', + js: '/App_Plugins/property-editor.js', + elementName: 'my-property-editor-ui-custom', + meta: { + label: 'My Custom Property', + icon: 'document', + group: 'Common', + propertyEditorSchema: 'Umbraco.TextBox', + }, }, - }, - ], - }, - { - name: 'My MFA Package', - extensions: [ - { - type: 'mfaLoginProvider', - alias: 'My.MfaLoginProvider.Custom', - name: 'My Custom MFA Provider', - forProviderName: 'sms', - meta: { - label: 'Setup SMS Verification', + ], + }, + { + name: 'Package with an entry point', + extensions: [ + { + type: 'entryPoint', + name: 'My Custom Entry Point', + alias: 'My.Entrypoint.Custom', + js: '/App_Plugins/custom-entrypoint.js', }, - }, - ], - }, - { - name: 'My Auth Package', - extensions: [ - { - type: 'authProvider', - alias: 'My.AuthProvider.Google', - name: 'My Custom Auth Provider', - forProviderName: 'Umbraco.Google', - meta: { - label: 'Sign in with Google', + ], + }, + { + name: 'Package with a view', + extensions: [ + { + type: 'packageView', + alias: 'My.PackageView.Custom', + name: 'My Custom Package View', + js: '/App_Plugins/package-view.js', + meta: { + packageName: 'Package with a view', + }, }, - }, - { - type: 'authProvider', - alias: 'My.AUthProvider.Github', - name: 'My Github Auth Provider', - forProviderName: 'Umbraco.Github', - meta: { - label: 'Use Github!', - look: 'primary', - icon: 'icon-github', - color: 'success', + ], + }, + { + name: 'My MFA Package', + extensions: [ + { + type: 'mfaLoginProvider', + alias: 'My.MfaLoginProvider.Custom', + name: 'My Custom MFA Provider', + forProviderName: 'sms', + meta: { + label: 'Setup SMS Verification', + }, }, - }, - ], - }, - ]), - ); -}); + ], + }, + ]), + ); + }), + rest.get(umbracoPath('/package/manifest/public'), (_req, res, ctx) => { + return res( + ctx.status(200), + ctx.json([ + { + name: 'My Auth Package', + extensions: [ + { + type: 'authProvider', + alias: 'My.AuthProvider.Google', + name: 'My Custom Auth Provider', + forProviderName: 'Umbraco.Google', + meta: { + label: 'Sign in with Google', + }, + }, + { + type: 'authProvider', + alias: 'My.AUthProvider.Github', + name: 'My Github Auth Provider', + forProviderName: 'Umbraco.Github', + meta: { + label: 'Use Github!', + look: 'primary', + icon: 'icon-github', + color: 'success', + }, + }, + ], + }, + ]), + ); + }), +]; -export const manifestEmptyHandler = rest.get(umbracoPath('/package/manifest'), (_req, res, ctx) => { - return res( - // Respond with a 200 status code - ctx.status(200), - ctx.json([]), - ); -}); +export const manifestEmptyHandlers = [ + rest.get(umbracoPath('/package/manifest'), (_req, res, ctx) => { + return res(ctx.status(200), ctx.json([])); + }), + rest.get(umbracoPath('/package/manifest/public'), (_req, res, ctx) => { + return res(ctx.status(200), ctx.json([])); + }), +]; From cc1bb06379061961c602896c17529df70ead318a Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Thu, 4 Apr 2024 15:32:32 +0200 Subject: [PATCH 092/280] dont send cookies to the backend --- src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts | 1 - 1 file changed, 1 deletion(-) 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 6d3070339e..95f3a81072 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 @@ -145,7 +145,6 @@ 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() { From 2fe52cd500a2ad096f617800cdef5870697f51be Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Thu, 4 Apr 2024 15:40:14 +0200 Subject: [PATCH 093/280] remove todo --- src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts | 1 - 1 file changed, 1 deletion(-) 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 95f3a81072..36c88357c3 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 @@ -40,7 +40,6 @@ export class UmbAppElement extends UmbLitElement { * @attr */ @property({ type: String }) - // TODO: get from base element or maybe move to UmbAuthContext.#getRedirectUrl since it is only used there backofficePath = '/umbraco'; /** From 184e498bc2fe07e0908c42b675673930de52ba50 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Thu, 4 Apr 2024 16:02:35 +0200 Subject: [PATCH 094/280] initialize controllers only when it makes sense --- .../src/apps/app/app.element.ts | 12 ++++++++++-- .../src/apps/backoffice/backoffice.element.ts | 7 ------- 2 files changed, 10 insertions(+), 9 deletions(-) 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 36c88357c3..91fff747cd 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 @@ -20,6 +20,13 @@ import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registr @customElement('umb-app') export class UmbAppElement extends UmbLitElement { + /** + * Backoffice extension registry. + * This enables to register and unregister extensions via DevTools, or just via querying this element via the DOM. + * @type {UmbExtensionsRegistry} + */ + public extensionRegistry = umbExtensionsRegistry; + /** * The base URL of the configured Umbraco server. * @@ -69,7 +76,7 @@ export class UmbAppElement extends UmbLitElement { #umbIconRegistry = new UmbIconRegistry(); #uuiIconRegistry = new UUIIconRegistryEssential(); #serverConnection?: UmbServerConnection; - #authController = new UmbAppAuthController(this); + #authController?: UmbAppAuthController; constructor() { super(); @@ -91,6 +98,7 @@ export class UmbAppElement extends UmbLitElement { } async #setup() { + this.#authController = new UmbAppAuthController(this); this.#serverConnection = await new UmbServerConnection(this.serverUrl).connect(); this.#authContext = new UmbAuthContext(this, this.serverUrl, this.backofficePath, this.bypassAuth); @@ -191,7 +199,7 @@ export class UmbAppElement extends UmbLitElement { } #isAuthorizedGuard(): Guard { - return () => this.#authController.isAuthorized(); + return () => this.#authController?.isAuthorized() ?? false; } #errorPage(errorMsg: string, error?: unknown) { 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 407e04a759..5e42145a82 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 @@ -38,13 +38,6 @@ const CORE_PACKAGES = [ @customElement('umb-backoffice') export class UmbBackofficeElement extends UmbLitElement { - /** - * Backoffice extension registry. - * This enables to register and unregister extensions via DevTools, or just via querying this element via the DOM. - * @type {UmbExtensionsRegistry} - */ - public extensionRegistry = umbExtensionsRegistry; - constructor() { super(); From 39cdeb261f1deb45e4681e02ab72caab60405cca Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 4 Apr 2024 16:41:03 +0200 Subject: [PATCH 095/280] add types and js docs --- .../recycle-bin-repository-base.ts | 48 +++++++++++++++++-- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/recycle-bin-repository-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/recycle-bin-repository-base.ts index ac12e66d1c..1dd19e0809 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/recycle-bin-repository-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/recycle-bin-repository-base.ts @@ -3,19 +3,44 @@ import type { UmbRecycleBinDataSource, UmbRecycleBinDataSourceConstructor, } from './recycle-bin-data-source.interface.js'; +import type { + UmbRecycleBinOriginalParentRequestArgs, + UmbRecycleBinRestoreRequestArgs, + UmbRecycleBinTrashRequestArgs, +} from './types.js'; import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbRepositoryBase } from '@umbraco-cms/backoffice/repository'; +/** + * Base class for recycle bin repositories. + * @export + * @abstract + * @class UmbRecycleBinRepositoryBase + * @extends {UmbRepositoryBase} + * @implements {UmbRecycleBinRepository} + */ export abstract class UmbRecycleBinRepositoryBase extends UmbRepositoryBase implements UmbRecycleBinRepository { #recycleBinSource: UmbRecycleBinDataSource; + /** + * Creates an instance of UmbRecycleBinRepositoryBase. + * @param {UmbControllerHost} host + * @param {UmbRecycleBinDataSourceConstructor} recycleBinSource + * @memberof UmbRecycleBinRepositoryBase + */ constructor(host: UmbControllerHost, recycleBinSource: UmbRecycleBinDataSourceConstructor) { super(host); this.#recycleBinSource = new recycleBinSource(this); } - async requestTrash(args: any) { + /** + * Requests to trash an item. + * @param {UmbRecycleBinTrashRequestArgs} args + * @return {*} + * @memberof UmbRecycleBinRepositoryBase + */ + async requestTrash(args: UmbRecycleBinTrashRequestArgs) { const { error } = await this.#recycleBinSource.trash(args); if (!error) { @@ -27,7 +52,13 @@ export abstract class UmbRecycleBinRepositoryBase extends UmbRepositoryBase impl return { error }; } - async requestRestore(args: any) { + /** + * Requests to restore an item. + * @param {UmbRecycleBinRestoreRequestArgs} args + * @return {*} + * @memberof UmbRecycleBinRepositoryBase + */ + async requestRestore(args: UmbRecycleBinRestoreRequestArgs) { const { error } = await this.#recycleBinSource.restore(args); if (!error) { @@ -39,6 +70,11 @@ export abstract class UmbRecycleBinRepositoryBase extends UmbRepositoryBase impl return { error }; } + /** + * Requests to empty the recycle bin. + * @return {*} + * @memberof UmbRecycleBinRepositoryBase + */ async requestEmpty() { const { error } = await this.#recycleBinSource.empty(); @@ -51,7 +87,13 @@ export abstract class UmbRecycleBinRepositoryBase extends UmbRepositoryBase impl return this.#recycleBinSource.empty(); } - async requestOriginalParent(args: any) { + /** + * Requests the original parent of an item. + * @param {UmbRecycleBinOriginalParentRequestArgs} args + * @return {*} + * @memberof UmbRecycleBinRepositoryBase + */ + async requestOriginalParent(args: UmbRecycleBinOriginalParentRequestArgs) { return this.#recycleBinSource.getOriginalParent(args); } } From 651751d390bbdbcb5db478ecf2ddeabc9518c974 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 4 Apr 2024 16:44:13 +0200 Subject: [PATCH 096/280] add js docs --- .../empty-recycle-bin/empty-recycle-bin.action.ts | 11 ++++++++++- .../restore-from-recycle-bin.action.ts | 10 ++++++++++ .../entity-action/trash/trash.action.ts | 15 ++++++++++++--- 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/empty-recycle-bin/empty-recycle-bin.action.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/empty-recycle-bin/empty-recycle-bin.action.ts index d2059161be..acc0562252 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/empty-recycle-bin/empty-recycle-bin.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/empty-recycle-bin/empty-recycle-bin.action.ts @@ -1,5 +1,4 @@ import { UmbEntityActionBase } from '../../../entity-action/entity-action-base.js'; -import { UmbRequestReloadStructureForEntityEvent } from '../../../entity-action/request-reload-structure-for-entity.event.js'; import type { UmbRecycleBinRepository } from '../../recycle-bin-repository.interface.js'; import { umbConfirmModal } from '@umbraco-cms/backoffice/modal'; import { @@ -9,7 +8,17 @@ import { import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; import { UmbReloadTreeItemChildrenRequestEntityActionEvent } from '@umbraco-cms/backoffice/tree'; +/** + * Entity action for emptying the recycle bin. + * @export + * @class UmbEmptyRecycleBinEntityAction + * @extends {UmbEntityActionBase} + */ export class UmbEmptyRecycleBinEntityAction extends UmbEntityActionBase { + /** + * Executes the action. + * @memberof UmbEmptyRecycleBinEntityAction + */ async execute() { await umbConfirmModal(this._host, { headline: `Empty Recycle Bin`, diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/restore-from-recycle-bin.action.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/restore-from-recycle-bin.action.ts index 5910d4df6a..699c4ce03e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/restore-from-recycle-bin.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/restore-from-recycle-bin.action.ts @@ -5,7 +5,17 @@ import { UmbRequestReloadStructureForEntityEvent } from '@umbraco-cms/backoffice import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; import type { MetaEntityActionRestoreFromRecycleBinKind } from '@umbraco-cms/backoffice/extension-registry'; +/** + * Entity action for restoring an item from the recycle bin. + * @export + * @class UmbRestoreFromRecycleBinEntityAction + * @extends {UmbEntityActionBase} + */ export class UmbRestoreFromRecycleBinEntityAction extends UmbEntityActionBase { + /** + * Executes the action. + * @memberof UmbRestoreFromRecycleBinEntityAction + */ async execute() { if (!this.args.unique) throw new Error('Cannot restore an item without a unique identifier.'); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/trash/trash.action.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/trash/trash.action.ts index f1c9bbee35..14e29f7f11 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/trash/trash.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/trash/trash.action.ts @@ -7,9 +7,17 @@ import { umbConfirmModal } from '@umbraco-cms/backoffice/modal'; import type { UmbItemRepository } from '@umbraco-cms/backoffice/repository'; import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; +/** + * Entity action for trashing an item. + * @export + * @class UmbTrashEntityAction + * @extends {UmbEntityActionBase} + */ export class UmbTrashEntityAction extends UmbEntityActionBase { - // TODO: make base type for item and detail models - + /** + * Executes the action. + * @memberof UmbTrashEntityAction + */ async execute() { if (!this.args.unique) throw new Error('Cannot trash an item without a unique identifier.'); @@ -47,4 +55,5 @@ export class UmbTrashEntityAction extends UmbEntityActionBase Date: Thu, 4 Apr 2024 16:50:02 +0200 Subject: [PATCH 097/280] create modal to show auth providers --- .../src/packages/core/auth/index.ts | 1 + .../src/packages/core/auth/manifests.ts | 4 ++++ .../src/packages/core/auth/modals/index.ts | 1 + .../src/packages/core/auth/modals/manifests.ts | 10 ++++++++++ .../auth/modals/umb-app-auth-modal.element.ts | 17 +++++++++++++++++ .../auth/modals/umb-app-auth-modal.token.ts | 8 ++++++++ .../src/packages/core/manifests.ts | 2 ++ 7 files changed, 43 insertions(+) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/auth/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.element.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.token.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/auth/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/auth/index.ts index e6dc7d478d..e99e9b0dcf 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/auth/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/auth/index.ts @@ -1,3 +1,4 @@ export * from './auth.context.js'; export * from './auth.context.token.js'; +export * from './modals/index.js'; export * from './models/openApiConfiguration.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/auth/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/auth/manifests.ts new file mode 100644 index 0000000000..8ba79428c9 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/auth/manifests.ts @@ -0,0 +1,4 @@ +import type { ManifestTypes } from '../extension-registry/models/index.js'; +import { manifests as modalManifests } from './modals/manifests.js'; + +export const manifests: Array = [...modalManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/index.ts new file mode 100644 index 0000000000..c574cd0af1 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/index.ts @@ -0,0 +1 @@ +export * from './umb-app-auth-modal.token.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/manifests.ts new file mode 100644 index 0000000000..315736dd1f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/manifests.ts @@ -0,0 +1,10 @@ +import type { ManifestModal } from '@umbraco-cms/backoffice/extension-registry'; + +export const manifests: Array = [ + { + type: 'modal', + alias: 'Umb.Modal.AppAuth', + name: 'Umb App Auth Modal', + js: () => import('./umb-app-auth-modal.element.js'), + }, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.element.ts new file mode 100644 index 0000000000..1f8418e3ca --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.element.ts @@ -0,0 +1,17 @@ +import { customElement, html } from '@umbraco-cms/backoffice/external/lit'; +import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; + +@customElement('umb-app-auth-modal') +export class UmbAppAuthModalElement extends UmbLitElement { + render() { + return html`

Umb App Auth Modal

`; + } +} + +export default UmbAppAuthModalElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-app-auth-modal': UmbAppAuthModalElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.token.ts new file mode 100644 index 0000000000..4b4e39656b --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.token.ts @@ -0,0 +1,8 @@ +import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; + +export const UMB_MODAL_APP_AUTH = new UmbModalToken('Umb.Modal.AppAuth', { + modal: { + size: 'small', + type: 'dialog', + }, +}); diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/manifests.ts index 66d11f9961..d80662cc2c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/manifests.ts @@ -1,3 +1,4 @@ +import { manifests as authManifests } from './auth/manifests.js'; import { manifests as collectionManifests } from './collection/manifests.js'; import { manifests as contentTypeManifests } from './content-type/manifests.js'; import { manifests as cultureManifests } from './culture/manifests.js'; @@ -18,6 +19,7 @@ import { manifests as workspaceManifests } from './workspace/manifests.js'; import type { ManifestTypes, UmbBackofficeManifestKind } from './extension-registry/index.js'; export const manifests: Array = [ + ...authManifests, ...collectionManifests, ...contentTypeManifests, ...cultureManifests, From 5c8c0dd15eeee9aec22006a90c0d6cb0e6b7d266 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Thu, 4 Apr 2024 16:50:23 +0200 Subject: [PATCH 098/280] load core extensions in app element --- src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts | 3 +++ .../src/apps/backoffice/backoffice.element.ts | 1 - 2 files changed, 3 insertions(+), 1 deletion(-) 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 91fff747cd..3e3dea0b60 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,3 +1,4 @@ +import { extensions as coreExtensions } from '../../packages/core/umbraco-package.js'; import type { UmbAppErrorElement } from './app-error.element.js'; import { UmbAppContext } from './app.context.js'; import { UmbServerConnection } from './server-connection.js'; @@ -90,6 +91,8 @@ export class UmbAppElement extends UmbLitElement { this.#umbIconRegistry.attach(this); this.#uuiIconRegistry.attach(this); + + umbExtensionsRegistry.registerMany(coreExtensions); } connectedCallback(): void { 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 5e42145a82..ae2d293e3e 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 @@ -10,7 +10,6 @@ import './components/index.js'; const CORE_PACKAGES = [ import('../../packages/audit-log/umbraco-package.js'), import('../../packages/block/umbraco-package.js'), - import('../../packages/core/umbraco-package.js'), import('../../packages/data-type/umbraco-package.js'), import('../../packages/dictionary/umbraco-package.js'), import('../../packages/documents/umbraco-package.js'), From 94c3d5fca8983074087382adaff9da2143dbcb84 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Thu, 4 Apr 2024 16:50:38 +0200 Subject: [PATCH 099/280] add check to see if any auth providers are registered --- .../src/apps/app/app-auth.controller.ts | 29 +++++++++++++++++-- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts b/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts index 9d0c7983c9..dba8a08626 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts @@ -1,8 +1,10 @@ -import { UMB_AUTH_CONTEXT, UMB_STORAGE_REDIRECT_URL } from '@umbraco-cms/backoffice/auth'; +import { UMB_AUTH_CONTEXT, UMB_MODAL_APP_AUTH, UMB_STORAGE_REDIRECT_URL } from '@umbraco-cms/backoffice/auth'; import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbServerExtensionRegistrator } from '@umbraco-cms/backoffice/extension-api'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; +import { firstValueFrom } from '@umbraco-cms/backoffice/external/rxjs'; +import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; export class UmbAppAuthController extends UmbControllerBase { #authContext?: typeof UMB_AUTH_CONTEXT.TYPE; @@ -52,11 +54,32 @@ export class UmbAppAuthController extends UmbControllerBase { await this.#init; - this.#authContext.makeAuthorizationRequest(); + // Figure out which providers are available + const availableProviders = await firstValueFrom(umbExtensionsRegistry.byType('authProvider')); + if (availableProviders.length === 0) { + // No providers available, initiate the authorization request to the default provider + this.#authContext.makeAuthorizationRequest(); + } else { + // Check if any provider is redirecting directly to the provider, and if so, redirect to that provider + const redirectProvider = availableProviders.find((provider) => provider.meta?.autoRedirect); + if (redirectProvider) { + this.#authContext.makeAuthorizationRequest(redirectProvider.forProviderName); + return true; + } + + // Show the provider selection screen + console.log('show modal for', availableProviders); + const modalContext = await this.getContext(UMB_MODAL_MANAGER_CONTEXT); + await modalContext + .open(this._host, UMB_MODAL_APP_AUTH) + .onSubmit() + .catch(() => undefined); + } // Reinitialize the auth flow (load the state from local storage) this.#authContext.setInitialState(); - return true; + // The authorization flow is finished, so let the caller know if the user is authorized + return this.#authContext.getIsAuthorized(); } } From aca4f640bd4ec6c6cacceb12c63710ba80d3ab15 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Thu, 4 Apr 2024 16:53:14 +0200 Subject: [PATCH 100/280] bump trash action weight --- .../core/recycle-bin/entity-action/trash/trash.action.kind.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/trash/trash.action.kind.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/trash/trash.action.kind.ts index fa78c1185b..1b2b310a40 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/trash/trash.action.kind.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/trash/trash.action.kind.ts @@ -11,7 +11,7 @@ export const manifest: UmbBackofficeManifestKind = { type: 'entityAction', kind: 'trash', api: () => import('./trash.action.js'), - weight: 1050, + weight: 1150, forEntityTypes: [], meta: { icon: 'icon-trash', From 9c4bbed87c4581e075b21c1772cb9a11f2f70a13 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Fri, 5 Apr 2024 08:59:30 +0200 Subject: [PATCH 101/280] extend the auth provider model --- .../models/auth-provider.model.ts | 30 ++++++++++++++----- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/auth-provider.model.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/auth-provider.model.ts index e212a5208e..1abff595fd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/auth-provider.model.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/auth-provider.model.ts @@ -29,7 +29,7 @@ export interface MetaAuthProvider { * The default view of the provider that is shown to the user. * If no element is provided, then the button will be rendered as a @see {UUIButtonElement} using these options. */ - defaultView: { + defaultView?: { /** * The icon of the provider that is shown to the user. * @examples ['icon-cloud', 'icon-github', 'icon-google', 'icon-facebook', 'icon-twitter', 'icon-x', 'icon-microsoft'] @@ -51,14 +51,30 @@ export interface MetaAuthProvider { }; /** - * If true, the Umbraco backoffice login will be disabled. - * @default false + * The behavior of the provider when it is used. */ - denyLocalLogin?: boolean; + behavior?: { + /** + * If true, the Umbraco backoffice login will be disabled. + * @default false + */ + denyLocalLogin?: boolean; + + /** + * If true, the user will be redirected to the provider's login page immediately. + * @default false + */ + autoRedirect?: boolean; + }; /** - * If true, the user will be redirected to the provider's login page immediately. - * @default false + * The linking options of the provider when it is used. */ - autoRedirect?: boolean; + linking?: { + /** + * If true, the user will be able to link the provider to an existing account. + * @default false + */ + allowManualLinking?: boolean; + }; } From 307c9b37e6b94b41cb5192ebfe6fd6fb1813113e Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Fri, 5 Apr 2024 09:50:50 +0200 Subject: [PATCH 102/280] register Umbraco as a provider --- .../src/packages/core/auth/manifests.ts | 3 ++- .../src/packages/core/auth/providers/manifests.ts | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/auth/providers/manifests.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/auth/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/auth/manifests.ts index 8ba79428c9..f0f6228203 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/auth/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/auth/manifests.ts @@ -1,4 +1,5 @@ import type { ManifestTypes } from '../extension-registry/models/index.js'; import { manifests as modalManifests } from './modals/manifests.js'; +import { manifests as providerManifests } from './providers/manifests.js'; -export const manifests: Array = [...modalManifests]; +export const manifests: Array = [...modalManifests, ...providerManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/auth/providers/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/auth/providers/manifests.ts new file mode 100644 index 0000000000..29f9ca30f6 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/auth/providers/manifests.ts @@ -0,0 +1,14 @@ +import type { ManifestAuthProvider } from '@umbraco-cms/backoffice/extension-registry'; + +export const manifests: Array = [ + { + type: 'authProvider', + alias: 'Umb.AuthProviders.Umbraco', + name: 'Umbraco login provider', + forProviderName: 'Umbraco', + weight: 1000, + meta: { + label: 'Umbraco', + }, + }, +]; From 9c4bb5ba7773d048c834e6b9fba902d87042b83a Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Fri, 5 Apr 2024 09:51:30 +0200 Subject: [PATCH 103/280] let the auth context know when exactly its container extension has been loaded and use it to return the providers --- .../src/packages/core/auth/auth.context.ts | 13 +++++++++++++ .../src/packages/core/index.ts | 6 ++++++ 2 files changed, 19 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/auth/auth.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/auth/auth.context.ts index f5a64ff438..a46deed70d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/auth/auth.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/auth/auth.context.ts @@ -1,3 +1,4 @@ +import { umbExtensionsRegistry } from '../extension-registry/index.js'; import { UmbAuthFlow } from './auth-flow.js'; import { UMB_AUTH_CONTEXT } from './auth.context.token.js'; import type { UmbOpenApiConfiguration } from './models/openApiConfiguration.js'; @@ -5,11 +6,15 @@ import { OpenAPI } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbContextBase } from '@umbraco-cms/backoffice/class-api'; import { UmbBooleanState } from '@umbraco-cms/backoffice/observable-api'; +import { ReplaySubject, filter, switchMap } from '@umbraco-cms/backoffice/external/rxjs'; export class UmbAuthContext extends UmbContextBase { #isAuthorized = new UmbBooleanState(false); readonly isAuthorized = this.#isAuthorized.asObservable(); + #isInitialized = new ReplaySubject(1); + readonly isInitialized = this.#isInitialized.asObservable().pipe(filter((isInitialized) => isInitialized)); + #isBypassed = false; #serverUrl; #backofficePath; @@ -143,6 +148,14 @@ export class UmbAuthContext extends UmbContextBase { }; } + setInitialized() { + this.#isInitialized.next(true); + } + + getAuthProviders() { + return this.isInitialized.pipe(switchMap(() => umbExtensionsRegistry.byType('authProvider'))); + } + #getRedirectUrl() { return `${window.location.origin}${this.#backofficePath}`; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/index.ts index 1896412056..7db1162c20 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/index.ts @@ -1,3 +1,4 @@ +import { UMB_AUTH_CONTEXT } from './auth/auth.context.token.js'; import { UmbBackofficeNotificationContainerElement, UmbBackofficeModalContainerElement } from './components/index.js'; import { UmbActionEventContext } from './action/action-event.context.js'; import { manifests as coreManifests } from './manifests.js'; @@ -46,4 +47,9 @@ export const onInit: UmbEntryPointOnInit = (host, extensionRegistry) => { new UmbNotificationContext(host); new UmbModalManagerContext(host); new UmbActionEventContext(host); + + host.consumeContext(UMB_AUTH_CONTEXT, (authContext) => { + // Initialize the auth context to let the app context know that the core module is ready + authContext.setInitialized(); + }); }; From ced4abd1c2905a81034268b32fd8c54388ec6e0b Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Fri, 5 Apr 2024 09:51:59 +0200 Subject: [PATCH 104/280] let the app element initiate the public server extensions and wait to new up the auth controller until auth is required (i.e. not in install mode) --- src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) 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 3e3dea0b60..80be3c84e1 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 @@ -16,6 +16,7 @@ import { UmbContextDebugController } from '@umbraco-cms/backoffice/debug'; import { UmbBundleExtensionInitializer, UmbEntryPointExtensionInitializer, + UmbServerExtensionRegistrator, } from '@umbraco-cms/backoffice/extension-api'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; @@ -101,12 +102,13 @@ export class UmbAppElement extends UmbLitElement { } async #setup() { - this.#authController = new UmbAppAuthController(this); this.#serverConnection = await new UmbServerConnection(this.serverUrl).connect(); this.#authContext = new UmbAuthContext(this, this.serverUrl, this.backofficePath, this.bypassAuth); new UmbAppContext(this, { backofficePath: this.backofficePath, serverUrl: this.serverUrl }); + await new UmbServerExtensionRegistrator(this, umbExtensionsRegistry).registerPublicExtensions(); + // Try to initialise the auth flow and get the runtime status try { // If the runtime level is "install" we should clear any cached tokens @@ -114,6 +116,7 @@ export class UmbAppElement extends UmbLitElement { if (this.#serverConnection.getStatus() === RuntimeLevelModel.INSTALL) { await this.#authContext.clearTokenStorage(); } else { + this.#authController = new UmbAppAuthController(this); await this.#setAuthStatus(); } From 5e0916bb11bee7cc71930d167a87c6df6142efb8 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Fri, 5 Apr 2024 09:52:15 +0200 Subject: [PATCH 105/280] let the auth controller use the auth context to fetch the providers --- .../src/apps/app/app-auth.controller.ts | 52 +++++++++++-------- 1 file changed, 29 insertions(+), 23 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts b/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts index dba8a08626..290508e72a 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts @@ -1,15 +1,11 @@ import { UMB_AUTH_CONTEXT, UMB_MODAL_APP_AUTH, UMB_STORAGE_REDIRECT_URL } from '@umbraco-cms/backoffice/auth'; import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import { UmbServerExtensionRegistrator } from '@umbraco-cms/backoffice/extension-api'; -import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; import { firstValueFrom } from '@umbraco-cms/backoffice/external/rxjs'; import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; export class UmbAppAuthController extends UmbControllerBase { #authContext?: typeof UMB_AUTH_CONTEXT.TYPE; - #serverExtensionRegistrator = new UmbServerExtensionRegistrator(this, umbExtensionsRegistry); - #init; constructor(host: UmbControllerHost) { super(host); @@ -17,8 +13,6 @@ export class UmbAppAuthController extends UmbControllerBase { this.consumeContext(UMB_AUTH_CONTEXT, (context) => { this.#authContext = context; }); - - this.#init = Promise.all([this.#serverExtensionRegistrator.registerPublicExtensions()]); } /** @@ -52,28 +46,40 @@ export class UmbAppAuthController extends UmbControllerBase { throw new Error('[Fatal] Auth context is not available'); } - await this.#init; - // Figure out which providers are available - const availableProviders = await firstValueFrom(umbExtensionsRegistry.byType('authProvider')); + const availableProviders = await firstValueFrom(this.#authContext.getAuthProviders()); + if (availableProviders.length === 0) { - // No providers available, initiate the authorization request to the default provider + throw new Error('[Fatal] No auth providers available'); + } + + if (availableProviders.length === 1) { + // One provider available (most likely the Umbraco provider), so initiate the authorization request to the default provider this.#authContext.makeAuthorizationRequest(); } else { - // Check if any provider is redirecting directly to the provider, and if so, redirect to that provider - const redirectProvider = availableProviders.find((provider) => provider.meta?.autoRedirect); - if (redirectProvider) { - this.#authContext.makeAuthorizationRequest(redirectProvider.forProviderName); - return true; - } + // Check if any provider is redirecting directly to the provider + const redirectProvider = availableProviders.find((provider) => provider.meta?.behavior?.autoRedirect); - // Show the provider selection screen - console.log('show modal for', availableProviders); - const modalContext = await this.getContext(UMB_MODAL_MANAGER_CONTEXT); - await modalContext - .open(this._host, UMB_MODAL_APP_AUTH) - .onSubmit() - .catch(() => undefined); + if (redirectProvider) { + // Redirect directly to the provider + this.#authContext.makeAuthorizationRequest(redirectProvider.forProviderName); + } else { + // Show the provider selection screen + console.log('show modal for', availableProviders); + const modalManager = await this.getContext(UMB_MODAL_MANAGER_CONTEXT); + await modalManager + .open(this._host, UMB_MODAL_APP_AUTH) + .onSubmit() + .catch(() => undefined); + } + } + + return this.#updateState(); + } + + #updateState() { + if (!this.#authContext) { + throw new Error('[Fatal] Auth context is not available'); } // Reinitialize the auth flow (load the state from local storage) From c0bb2d3d9795d75593cd01be44268df9d597a51d Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Fri, 5 Apr 2024 10:17:43 +0200 Subject: [PATCH 106/280] append to shadowRoot --- src/Umbraco.Web.UI.Client/src/packages/core/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/index.ts index 7db1162c20..3e424e1398 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/index.ts @@ -39,10 +39,10 @@ export const onInit: UmbEntryPointOnInit = (host, extensionRegistry) => { extensionRegistry.registerMany(coreManifests); const notificationContainerElement = new UmbBackofficeNotificationContainerElement(); - host.appendChild(notificationContainerElement); + host.shadowRoot?.appendChild(notificationContainerElement); const modalContainerElement = new UmbBackofficeModalContainerElement(); - host.appendChild(modalContainerElement); + host.shadowRoot?.appendChild(modalContainerElement); new UmbNotificationContext(host); new UmbModalManagerContext(host); From abc1a9f32ec997b7e187681ee10e7f3db42cfaf0 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Fri, 5 Apr 2024 12:08:42 +0200 Subject: [PATCH 107/280] add more to default provider --- .../src/apps/app/app-auth.controller.ts | 9 +++++++-- .../src/packages/core/auth/providers/manifests.ts | 5 ++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts b/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts index 290508e72a..0c2eac7678 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts @@ -65,12 +65,17 @@ export class UmbAppAuthController extends UmbControllerBase { this.#authContext.makeAuthorizationRequest(redirectProvider.forProviderName); } else { // Show the provider selection screen - console.log('show modal for', availableProviders); const modalManager = await this.getContext(UMB_MODAL_MANAGER_CONTEXT); - await modalManager + const selected = await modalManager .open(this._host, UMB_MODAL_APP_AUTH) .onSubmit() .catch(() => undefined); + + if (!selected?.providerName) { + return false; + } + + this.#authContext.makeAuthorizationRequest(selected.providerName); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/auth/providers/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/auth/providers/manifests.ts index 29f9ca30f6..f1f2f89b41 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/auth/providers/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/auth/providers/manifests.ts @@ -8,7 +8,10 @@ export const manifests: Array = [ forProviderName: 'Umbraco', weight: 1000, meta: { - label: 'Umbraco', + label: 'Sign in with Umbraco', + defaultView: { + look: 'primary', + }, }, }, ]; From 59d372249098ce1708e1722881e830eeaa23bac9 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Fri, 5 Apr 2024 12:08:50 +0200 Subject: [PATCH 108/280] fix typo for typings --- .../core/extension-registry/models/auth-provider.model.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/auth-provider.model.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/auth-provider.model.ts index 1abff595fd..116be49a73 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/auth-provider.model.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/auth-provider.model.ts @@ -41,13 +41,13 @@ export interface MetaAuthProvider { * The color of the provider that is shown to the user. * @default 'secondary' */ - color?: UUIInterfaceLook; + color?: UUIInterfaceColor; /** * The look of the provider that is shown to the user. * @default 'default' */ - look?: UUIInterfaceColor; + look?: UUIInterfaceLook; }; /** From fe40efdf1da993467b25f4eb6c6ef95ebb049587 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Fri, 5 Apr 2024 12:09:12 +0200 Subject: [PATCH 109/280] show a modal when more than 1 provider and add a default element if nothing is provided --- .../auth-provider-default.element.ts | 50 +++++++++++++++++++ .../packages/core/auth/components/index.ts | 1 + .../src/packages/core/auth/index.ts | 3 ++ .../auth/modals/umb-app-auth-modal.element.ts | 40 +++++++++++++-- .../auth/modals/umb-app-auth-modal.token.ts | 7 ++- 5 files changed, 94 insertions(+), 7 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/auth/components/auth-provider-default.element.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/auth/components/index.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/auth/components/auth-provider-default.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/auth/components/auth-provider-default.element.ts new file mode 100644 index 0000000000..58e04c5797 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/auth/components/auth-provider-default.element.ts @@ -0,0 +1,50 @@ +import type { ManifestAuthProvider } from '../../index.js'; +import { UmbLitElement } from '../../lit-element/lit-element.element.js'; +import { UmbTextStyles } from '../../style/index.js'; +import { css, customElement, html, nothing, property } from '@umbraco-cms/backoffice/external/lit'; + +@customElement('umb-auth-provider-default') +export class UmbAuthProviderDefaultElement extends UmbLitElement { + @property({ attribute: false }) + manifest!: ManifestAuthProvider; + + @property({ attribute: false }) + onSubmit!: (providerName: string) => void; + + render() { + return html` + this.onSubmit(this.manifest.forProviderName)} + id="auth-provider-button" + .label=${this.manifest.meta?.label ?? this.manifest.forProviderName} + .look=${this.manifest.meta?.defaultView?.look ?? 'outline'} + .color=${this.manifest.meta?.defaultView?.color ?? 'default'}> + ${this.manifest.meta?.defaultView?.icon + ? html`` + : nothing} + ${this.manifest.meta?.label ?? this.manifest.forProviderName} + + `; + } + + static styles = [ + UmbTextStyles, + css` + :host { + display: block; + padding: 20px; + } + + #auth-provider-button { + width: 100%; + } + `, + ]; +} + +declare global { + interface HTMLElementTagNameMap { + 'umb-auth-provider-default': UmbAuthProviderDefaultElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/auth/components/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/auth/components/index.ts new file mode 100644 index 0000000000..e5fdd6f189 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/auth/components/index.ts @@ -0,0 +1 @@ +export * from './auth-provider-default.element.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/auth/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/auth/index.ts index e99e9b0dcf..e05fbbb7ed 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/auth/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/auth/index.ts @@ -1,4 +1,7 @@ +import './components/index.js'; + export * from './auth.context.js'; export * from './auth.context.token.js'; export * from './modals/index.js'; export * from './models/openApiConfiguration.js'; +export * from './components/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.element.ts index 1f8418e3ca..69b3b8b8ef 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.element.ts @@ -1,11 +1,41 @@ -import { customElement, html } from '@umbraco-cms/backoffice/external/lit'; -import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; +import { UmbModalBaseElement } from '../../modal/index.js'; +import type { UmbModalAppAuthValue } from './umb-app-auth-modal.token.js'; +import { css, customElement, html } from '@umbraco-cms/backoffice/external/lit'; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; @customElement('umb-app-auth-modal') -export class UmbAppAuthModalElement extends UmbLitElement { - render() { - return html`

Umb App Auth Modal

`; +export class UmbAppAuthModalElement extends UmbModalBaseElement { + get props() { + return { + onSubmit: this.onSubmit, + }; } + + render() { + return html` + + + + `; + } + + private onSubmit = (providerName: string) => { + this.value = { providerName }; + this._submitModal(); + }; + + static styles = [ + UmbTextStyles, + css` + :host { + display: block; + padding: 20px; + } + `, + ]; } export default UmbAppAuthModalElement; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.token.ts index 4b4e39656b..20ce925dd9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.token.ts @@ -1,8 +1,11 @@ import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; -export const UMB_MODAL_APP_AUTH = new UmbModalToken('Umb.Modal.AppAuth', { +export type UmbModalAppAuthValue = { + providerName?: string; +}; + +export const UMB_MODAL_APP_AUTH = new UmbModalToken('Umb.Modal.AppAuth', { modal: { - size: 'small', type: 'dialog', }, }); From f46f7bb459e5ce07daea7cca3762be2080bd0ed4 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Fri, 5 Apr 2024 13:24:40 +0200 Subject: [PATCH 110/280] adjust size and color --- .../core/auth/modals/umb-app-auth-modal.element.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.element.ts index 69b3b8b8ef..5acc1ebe77 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.element.ts @@ -13,8 +13,9 @@ export class UmbAppAuthModalElement extends UmbModalBaseElement + @@ -33,6 +34,12 @@ export class UmbAppAuthModalElement extends UmbModalBaseElement Date: Fri, 5 Apr 2024 13:24:48 +0200 Subject: [PATCH 111/280] add fallback variable for color to body layout --- .../packages/core/components/body-layout/body-layout.element.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/body-layout/body-layout.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/body-layout/body-layout.element.ts index 1d589df449..22be2b754a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/body-layout/body-layout.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/body-layout/body-layout.element.ts @@ -134,7 +134,7 @@ export class UmbBodyLayoutElement extends LitElement { css` :host { display: flex; - background-color: var(--uui-color-background); + background-color: var(--umb-body-layout-color-background, var(--uui-color-background)); width: 100%; height: 100%; flex-direction: column; From 02a08e5d5f3a68b95f35b965b679e8ff06a39e0e Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Fri, 5 Apr 2024 13:25:40 +0200 Subject: [PATCH 112/280] add language keys --- src/Umbraco.Web.UI.Client/src/assets/lang/da-dk.ts | 4 ++++ src/Umbraco.Web.UI.Client/src/assets/lang/en-us.ts | 4 ++++ 2 files changed, 8 insertions(+) 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 d802dcc5cd..c038966225 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 @@ -1013,6 +1013,10 @@ export default { lockoutWillOccur: 'Du har været inaktiv, og du vil blive logget ud om', renewSession: 'Forny for at gemme dine ændringer', }, + login: { + instruction: 'Log ind på Umbraco', + signInWith: 'Log ind med {0}', + }, main: { dashboard: 'Skrivebord', sections: 'Sektioner', 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 3d2682e341..682a1bbb9a 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 @@ -1010,6 +1010,10 @@ export default { lockoutWillOccur: "You've been idle and logout will automatically occur in", renewSession: 'Renew now to save your work', }, + login: { + instruction: 'Sign in to Umbraco', + signInWith: 'Sign in with {0}', + }, main: { dashboard: 'Dashboard', sections: 'Sections', From bcc99cd16355a8f70e4cef5ff35f9f92fc6c9fde Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Fri, 5 Apr 2024 13:25:47 +0200 Subject: [PATCH 113/280] remove padding --- .../core/auth/components/auth-provider-default.element.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/auth/components/auth-provider-default.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/auth/components/auth-provider-default.element.ts index 58e04c5797..b7e523adfc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/auth/components/auth-provider-default.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/auth/components/auth-provider-default.element.ts @@ -33,7 +33,6 @@ export class UmbAuthProviderDefaultElement extends UmbLitElement { css` :host { display: block; - padding: 20px; } #auth-provider-button { From 0494e514c18d4e6c703c721faf0b2d9ba5244e13 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Fri, 5 Apr 2024 13:29:16 +0200 Subject: [PATCH 114/280] add margin and icon --- .../core/auth/components/auth-provider-default.element.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/auth/components/auth-provider-default.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/auth/components/auth-provider-default.element.ts index b7e523adfc..8c30b32f48 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/auth/components/auth-provider-default.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/auth/components/auth-provider-default.element.ts @@ -21,7 +21,7 @@ export class UmbAuthProviderDefaultElement extends UmbLitElement { .look=${this.manifest.meta?.defaultView?.look ?? 'outline'} .color=${this.manifest.meta?.defaultView?.color ?? 'default'}> ${this.manifest.meta?.defaultView?.icon - ? html`` + ? html`` : nothing} ${this.manifest.meta?.label ?? this.manifest.forProviderName} @@ -33,6 +33,7 @@ export class UmbAuthProviderDefaultElement extends UmbLitElement { css` :host { display: block; + margin-bottom: var(--uui-size-space-5); } #auth-provider-button { From 0f55f62be06642b25ea13c9fb942a30a60ba48dd Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Fri, 5 Apr 2024 13:42:10 +0200 Subject: [PATCH 115/280] map up the onSubmit, state and provider --- .../src/apps/app/app-auth.controller.ts | 17 +++++++++++---- .../src/packages/core/auth/index.ts | 2 ++ .../auth/modals/umb-app-auth-modal.element.ts | 5 +++-- .../auth/modals/umb-app-auth-modal.token.ts | 21 ++++++++++++++++--- .../src/packages/core/auth/types.ts | 5 +++++ 5 files changed, 41 insertions(+), 9 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/auth/types.ts diff --git a/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts b/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts index 0c2eac7678..d0335524f1 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts @@ -1,4 +1,9 @@ -import { UMB_AUTH_CONTEXT, UMB_MODAL_APP_AUTH, UMB_STORAGE_REDIRECT_URL } from '@umbraco-cms/backoffice/auth'; +import { + UMB_AUTH_CONTEXT, + UMB_MODAL_APP_AUTH, + UMB_STORAGE_REDIRECT_URL, + type UmbUserLoginState, +} from '@umbraco-cms/backoffice/auth'; import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { firstValueFrom } from '@umbraco-cms/backoffice/external/rxjs'; @@ -41,7 +46,7 @@ export class UmbAppAuthController extends UmbControllerBase { * Starts the authorization flow. * It will check which providers are available and either redirect directly to the provider or show a provider selection screen. */ - async makeAuthorizationRequest(): Promise { + async makeAuthorizationRequest(userLoginState: UmbUserLoginState = 'loggingIn'): Promise { if (!this.#authContext) { throw new Error('[Fatal] Auth context is not available'); } @@ -67,7 +72,11 @@ export class UmbAppAuthController extends UmbControllerBase { // Show the provider selection screen const modalManager = await this.getContext(UMB_MODAL_MANAGER_CONTEXT); const selected = await modalManager - .open(this._host, UMB_MODAL_APP_AUTH) + .open(this._host, UMB_MODAL_APP_AUTH, { + data: { + userLoginState, + }, + }) .onSubmit() .catch(() => undefined); @@ -75,7 +84,7 @@ export class UmbAppAuthController extends UmbControllerBase { return false; } - this.#authContext.makeAuthorizationRequest(selected.providerName); + this.#authContext.makeAuthorizationRequest(selected.providerName, selected.loginHint); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/auth/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/auth/index.ts index e05fbbb7ed..2f5cf6b67d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/auth/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/auth/index.ts @@ -5,3 +5,5 @@ export * from './auth.context.token.js'; export * from './modals/index.js'; export * from './models/openApiConfiguration.js'; export * from './components/index.js'; + +export type * from './types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.element.ts index 5acc1ebe77..7cba576d77 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.element.ts @@ -1,12 +1,13 @@ import { UmbModalBaseElement } from '../../modal/index.js'; -import type { UmbModalAppAuthValue } from './umb-app-auth-modal.token.js'; +import type { UmbModalAppAuthConfig, UmbModalAppAuthValue } from './umb-app-auth-modal.token.js'; import { css, customElement, html } from '@umbraco-cms/backoffice/external/lit'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; @customElement('umb-app-auth-modal') -export class UmbAppAuthModalElement extends UmbModalBaseElement { +export class UmbAppAuthModalElement extends UmbModalBaseElement { get props() { return { + userLoginState: this.data?.userLoginState ?? 'loggingIn', onSubmit: this.onSubmit, }; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.token.ts index 20ce925dd9..9b763e4c36 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.token.ts @@ -1,10 +1,25 @@ +import type { UmbUserLoginState } from '../types.js'; import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; -export type UmbModalAppAuthValue = { - providerName?: string; +export type UmbModalAppAuthConfig = { + userLoginState: UmbUserLoginState; }; -export const UMB_MODAL_APP_AUTH = new UmbModalToken('Umb.Modal.AppAuth', { +export type UmbModalAppAuthValue = { + /** + * The name of the provider that the user has selected to authenticate with. + * @required + */ + providerName?: string; + + /** + * The login hint that the user has provided to the provider. + * @optional + */ + loginHint?: string; +}; + +export const UMB_MODAL_APP_AUTH = new UmbModalToken('Umb.Modal.AppAuth', { modal: { type: 'dialog', }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/auth/types.ts b/src/Umbraco.Web.UI.Client/src/packages/core/auth/types.ts new file mode 100644 index 0000000000..d1933d0607 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/auth/types.ts @@ -0,0 +1,5 @@ +/** + * User login state that can be used to determine the current state of the user. + * @example 'loggedIn' + */ +export type UmbUserLoginState = 'loggingIn' | 'loggedOut' | 'timedOut'; From 0755d4d410b5db5e941f2e135c5d45381e79723a Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Fri, 5 Apr 2024 13:51:09 +0200 Subject: [PATCH 116/280] add state to logout button --- .../modals/current-user/current-user-modal.element.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) 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 9ad8bd483b..1e89d04f19 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,12 +1,12 @@ import { UMB_CURRENT_USER_CONTEXT } from '../../current-user.context.js'; import type { UmbCurrentUserModel } 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 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/backoffice/lit-element'; +import type { UUIButtonState } from '@umbraco-cms/backoffice/external/uui'; @customElement('umb-current-user-modal') export class UmbCurrentUserModalElement extends UmbLitElement { @@ -16,6 +16,9 @@ export class UmbCurrentUserModalElement extends UmbLitElement { @state() private _currentUser?: UmbCurrentUserModel; + @state() + private _logOutButtonState?: UUIButtonState; + #authContext?: typeof UMB_AUTH_CONTEXT.TYPE; #currentUserContext?: typeof UMB_CURRENT_USER_CONTEXT.TYPE; @@ -50,7 +53,9 @@ export class UmbCurrentUserModalElement extends UmbLitElement { private async _logout() { if (!this.#authContext) return; - this.#authContext.signOut(); + this._logOutButtonState = 'waiting'; + await this.#authContext.signOut(); + this._logOutButtonState = 'success'; } render() { @@ -65,6 +70,7 @@ export class UmbCurrentUserModalElement extends UmbLitElement { From e838c0ea1b721f0f4d22aac760f6942e9a0166cb Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Fri, 5 Apr 2024 14:23:42 +0200 Subject: [PATCH 117/280] let the auth context know if a 401 is encountered, which most likely means the user is timed out --- .../src/packages/core/auth/auth.context.ts | 10 ++++++ .../core/resources/resource.controller.ts | 35 +++++++++++-------- 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/auth/auth.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/auth/auth.context.ts index a46deed70d..cf99b23c35 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/auth/auth.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/auth/auth.context.ts @@ -95,6 +95,16 @@ export class UmbAuthContext extends UmbContextBase { return this.#authFlow.clearTokenStorage(); } + /** + * Handles the case where the user has timed out, i.e. the token has expired. + * This will clear the token storage and set the user as unauthorized. + * @memberof UmbAuthContext + */ + timeOut() { + this.clearTokenStorage(); + this.#isAuthorized.setValue(false); + } + /** * Signs the user out by removing any tokens from the browser. * @memberof UmbAuthContext diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/resources/resource.controller.ts b/src/Umbraco.Web.UI.Client/src/packages/core/resources/resource.controller.ts index b7dc4e9992..edbefc578b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/resources/resource.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/resources/resource.controller.ts @@ -1,4 +1,5 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ +import { UMB_AUTH_CONTEXT } from '../auth/index.js'; import { isApiError, isCancelError, isCancelablePromise } from './apiTypeValidators.function.js'; import { UMB_NOTIFICATION_CONTEXT, type UmbNotificationOptions } from '@umbraco-cms/backoffice/notification'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; @@ -11,6 +12,8 @@ export class UmbResourceController extends UmbControllerBase { #notificationContext?: typeof UMB_NOTIFICATION_CONTEXT.TYPE; + #authContext?: typeof UMB_AUTH_CONTEXT.TYPE; + constructor(host: UmbControllerHost, promise: Promise, alias?: string) { super(host, alias); @@ -19,6 +22,10 @@ export class UmbResourceController extends UmbControllerBase { new UmbContextConsumerController(host, UMB_NOTIFICATION_CONTEXT, (_instance) => { this.#notificationContext = _instance; }); + + new UmbContextConsumerController(host, UMB_AUTH_CONTEXT, (_instance) => { + this.#authContext = _instance; + }); } hostConnected(): void { @@ -78,21 +85,21 @@ export class UmbResourceController extends UmbControllerBase { // Go through the error status codes and act accordingly switch (error.status ?? 0) { - case 401: - // Unauthorized - console.log('Unauthorized'); - - // TODO: Do not remove the token here but instead let whatever is listening to the event decide what to do - localStorage.removeItem('umb:userAuthTokenResponse'); - - // TODO: Show a modal dialog to login either by bubbling an event to UmbAppElement or by showing a modal directly - this.#notificationContext?.peek('warning', { - data: { - headline: 'Session Expired', - message: 'Your session has expired. Please refresh the page.', - }, - }); + case 401: { + // See if we can get the UmbAuthContext and let it know the user is timed out + if (this.#authContext) { + this.#authContext.timeOut(); + } else { + // If we can't get the auth context, show a notification + this.#notificationContext?.peek('warning', { + data: { + headline: 'Session Expired', + message: 'Your session has expired. Please refresh the page.', + }, + }); + } break; + } case 500: // Server Error From 362c3188be3e32f21aa7931bd69d4bcb09165752 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Fri, 5 Apr 2024 14:23:59 +0200 Subject: [PATCH 118/280] listen to changes for timeout but only if the value changed --- .../src/apps/app/app-auth.controller.ts | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts b/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts index d0335524f1..dfeb8455c1 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts @@ -6,7 +6,7 @@ import { } from '@umbraco-cms/backoffice/auth'; import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import { firstValueFrom } from '@umbraco-cms/backoffice/external/rxjs'; +import { distinctUntilChanged, filter, firstValueFrom, skip } from '@umbraco-cms/backoffice/external/rxjs'; import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; export class UmbAppAuthController extends UmbControllerBase { @@ -17,6 +17,22 @@ export class UmbAppAuthController extends UmbControllerBase { this.consumeContext(UMB_AUTH_CONTEXT, (context) => { this.#authContext = context; + + // Observe the user's authorization state and start the authorization flow if the user is not authorized + this.observe( + context.isAuthorized.pipe( + // Only continue if the value has changed + distinctUntilChanged(), + // Skip the first since it is always false + skip(1), + // Only continue if the value is false + filter((x) => !x), + ), + () => { + this.makeAuthorizationRequest('timedOut'); + }, + '_authState', + ); }); } From c5d25e4b7a0ee9371b5b99fbdb85144ba91e4906 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Fri, 5 Apr 2024 14:24:05 +0200 Subject: [PATCH 119/280] add skip --- src/Umbraco.Web.UI.Client/src/external/rxjs/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Umbraco.Web.UI.Client/src/external/rxjs/index.ts b/src/Umbraco.Web.UI.Client/src/external/rxjs/index.ts index f7d17284b7..cc5b1fcd73 100644 --- a/src/Umbraco.Web.UI.Client/src/external/rxjs/index.ts +++ b/src/Umbraco.Web.UI.Client/src/external/rxjs/index.ts @@ -17,4 +17,5 @@ export { switchMap, filter, startWith, + skip, } from 'rxjs'; From 78497b3032ebd7426747985dbb810ec40e88a684 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Fri, 5 Apr 2024 15:27:17 +0200 Subject: [PATCH 120/280] add support to set a backdrop for a modal --- .../backoffice-modal-container.element.ts | 24 ++++++++++++++++--- .../modal/context/modal-manager.context.ts | 5 ++++ .../core/modal/context/modal.context.ts | 3 +++ 3 files changed, 29 insertions(+), 3 deletions(-) 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 48d0068860..ee8be1c38b 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,6 +1,6 @@ import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import type { CSSResultGroup } from '@umbraco-cms/backoffice/external/lit'; -import { css, html, repeat, customElement, state, nothing } from '@umbraco-cms/backoffice/external/lit'; +import { css, html, repeat, customElement, state, nothing, property } from '@umbraco-cms/backoffice/external/lit'; import type { UmbModalManagerContext, UmbModalContext } from '@umbraco-cms/backoffice/modal'; import { UMB_MODAL_MANAGER_CONTEXT, UmbModalElement } from '@umbraco-cms/backoffice/modal'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; @@ -13,6 +13,9 @@ export class UmbBackofficeModalContainerElement extends UmbLitElement { @state() _modals: Array = []; + @property({ reflect: true, attribute: 'fill-background' }) + fillBackground = false; + private _modalManager?: UmbModalManagerContext; constructor() { @@ -35,6 +38,7 @@ export class UmbBackofficeModalContainerElement extends UmbLitElement { /** We cannot render the umb-modal element directly in the uui-modal-container because it wont get recognized by UUI. * We therefore have a helper class which creates the uui-modal element and returns it. */ #createModalElements(modals: Array) { + this.fillBackground = false; const oldValue = this._modals; this._modals = modals; @@ -61,6 +65,15 @@ export class UmbBackofficeModalContainerElement extends UmbLitElement { modal.addEventListener('umb:destroy', this.#onCloseEnd.bind(this, modal.key)); this._modalElementMap.set(modal.key, modalElement); + + // If any of the modals are fillBackground, set the fillBackground property to true + if (modal.backdropBackground) { + this.fillBackground = true; + this.shadowRoot + ?.getElementById('container') + ?.style.setProperty('--backdrop-background', modal.backdropBackground); + } + this.requestUpdate(); }); } @@ -78,13 +91,13 @@ export class UmbBackofficeModalContainerElement extends UmbLitElement { render() { return html` - + ${this._modals.length > 0 ? repeat( this._modals, (modal) => modal.key, (modal) => this.#renderModal(modal.key), - ) + ) : ''} `; @@ -97,6 +110,11 @@ export class UmbBackofficeModalContainerElement extends UmbLitElement { position: absolute; z-index: 1000; } + + :host([fill-background]) #container::after { + background: var(--backdrop-background); + opacity: 0.75; + } `, ]; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/context/modal-manager.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/context/modal-manager.context.ts index d923e06b0b..eb74e7deca 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/modal/context/modal-manager.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/context/modal-manager.context.ts @@ -12,6 +12,11 @@ export interface UmbModalConfig { key?: string; type?: UmbModalType; size?: UUIModalSidebarSize; + + /** + * Set the background property of the modal backdrop + */ + backdropBackground?: string; } export class UmbModalManagerContext extends UmbContextBase { diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/context/modal.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/context/modal.context.ts index a22c2dd674..05d6220b7a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/modal/context/modal.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/context/modal.context.ts @@ -32,6 +32,7 @@ export class UmbModalContext; @@ -51,10 +52,12 @@ export class UmbModalContext Date: Fri, 5 Apr 2024 15:27:34 +0200 Subject: [PATCH 121/280] track if it's the first time logging in and set a backdrop corresponding to that --- .../src/apps/app/app-auth.controller.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts b/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts index dfeb8455c1..518f62d1ff 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts @@ -11,6 +11,7 @@ import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; export class UmbAppAuthController extends UmbControllerBase { #authContext?: typeof UMB_AUTH_CONTEXT.TYPE; + #firstTimeLoggingIn = true; constructor(host: UmbControllerHost) { super(host); @@ -29,6 +30,7 @@ export class UmbAppAuthController extends UmbControllerBase { filter((x) => !x), ), () => { + this.#firstTimeLoggingIn = false; this.makeAuthorizationRequest('timedOut'); }, '_authState', @@ -92,6 +94,11 @@ export class UmbAppAuthController extends UmbControllerBase { data: { userLoginState, }, + modal: { + backdropBackground: this.#firstTimeLoggingIn + ? "url('https://picsum.photos/1440') center center / cover no-repeat" + : 'rgb(0, 0, 0)', + }, }) .onSubmit() .catch(() => undefined); From 9a5fe32c613e80d7ea8fe3e349250e623275af5f Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Fri, 5 Apr 2024 15:28:39 +0200 Subject: [PATCH 122/280] remove temp login screen --- .../apps/auth/e2e/login.spec.ts | 19 --- .../apps/auth/index.html | 15 -- .../apps/auth/package.json | 20 --- .../apps/auth/playwright.config.ts | 108 ------------- .../apps/auth/public/favicon.svg | 17 -- .../apps/auth/public/login.jpeg | Bin 30678 -> 0 bytes .../apps/auth/public/umbraco_logo_white.svg | 1 - .../auth/public/umbraco_logomark_white.svg | 1 - .../apps/auth/src/auth-layout.element.ts | 72 --------- .../apps/auth/src/auth-legacy.context.ts | 10 -- .../apps/auth/src/auth.context.ts | 13 -- .../apps/auth/src/auth.repository.ts | 44 ------ .../external-login-provider-test.element.ts | 40 ----- .../external-login-provider-test2.element.ts | 53 ------- .../src/external-login-providers/manifests.ts | 29 ---- .../apps/auth/src/index.ts | 7 - .../apps/auth/src/login.element.ts | 148 ------------------ .../apps/auth/src/login.test.ts | 21 --- .../apps/auth/src/types.ts | 16 -- .../apps/auth/src/vite-env.d.ts | 6 - .../apps/auth/tsconfig.json | 12 -- .../apps/auth/tsconfig.node.json | 9 -- .../apps/auth/vite.config.ts | 32 ---- src/Umbraco.Web.UI.Client/package.json | 3 +- 24 files changed, 1 insertion(+), 695 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/apps/auth/e2e/login.spec.ts delete mode 100644 src/Umbraco.Web.UI.Client/apps/auth/index.html delete mode 100644 src/Umbraco.Web.UI.Client/apps/auth/package.json delete mode 100644 src/Umbraco.Web.UI.Client/apps/auth/playwright.config.ts delete mode 100644 src/Umbraco.Web.UI.Client/apps/auth/public/favicon.svg delete mode 100644 src/Umbraco.Web.UI.Client/apps/auth/public/login.jpeg delete mode 100644 src/Umbraco.Web.UI.Client/apps/auth/public/umbraco_logo_white.svg delete mode 100644 src/Umbraco.Web.UI.Client/apps/auth/public/umbraco_logomark_white.svg delete mode 100644 src/Umbraco.Web.UI.Client/apps/auth/src/auth-layout.element.ts delete mode 100644 src/Umbraco.Web.UI.Client/apps/auth/src/auth-legacy.context.ts delete mode 100644 src/Umbraco.Web.UI.Client/apps/auth/src/auth.context.ts delete mode 100644 src/Umbraco.Web.UI.Client/apps/auth/src/auth.repository.ts delete mode 100644 src/Umbraco.Web.UI.Client/apps/auth/src/external-login-providers/external-login-provider-test.element.ts delete mode 100644 src/Umbraco.Web.UI.Client/apps/auth/src/external-login-providers/external-login-provider-test2.element.ts delete mode 100644 src/Umbraco.Web.UI.Client/apps/auth/src/external-login-providers/manifests.ts delete mode 100644 src/Umbraco.Web.UI.Client/apps/auth/src/index.ts delete mode 100644 src/Umbraco.Web.UI.Client/apps/auth/src/login.element.ts delete mode 100644 src/Umbraco.Web.UI.Client/apps/auth/src/login.test.ts delete mode 100644 src/Umbraco.Web.UI.Client/apps/auth/src/types.ts delete mode 100644 src/Umbraco.Web.UI.Client/apps/auth/src/vite-env.d.ts delete mode 100644 src/Umbraco.Web.UI.Client/apps/auth/tsconfig.json delete mode 100644 src/Umbraco.Web.UI.Client/apps/auth/tsconfig.node.json delete mode 100644 src/Umbraco.Web.UI.Client/apps/auth/vite.config.ts diff --git a/src/Umbraco.Web.UI.Client/apps/auth/e2e/login.spec.ts b/src/Umbraco.Web.UI.Client/apps/auth/e2e/login.spec.ts deleted file mode 100644 index d34e280a56..0000000000 --- a/src/Umbraco.Web.UI.Client/apps/auth/e2e/login.spec.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { expect, test } from '@playwright/test'; - -test('login', async ({ page }) => { - await page.goto('/'); - - // Fill input[name="email"] - await page.locator('input[name="email"]').fill('test@umbraco.com'); - - // Fill input[name="password"] - await page.locator('input[name="password"]').fill('test123456'); - - // Wait for console.log to be called - page.on('console', (message) => { - expect(message.text()).toBe('login'); - }); - - // Click [aria-label="Login"] - await page.locator('[aria-label="Login"]').click(); -}); diff --git a/src/Umbraco.Web.UI.Client/apps/auth/index.html b/src/Umbraco.Web.UI.Client/apps/auth/index.html deleted file mode 100644 index 75922ccae2..0000000000 --- a/src/Umbraco.Web.UI.Client/apps/auth/index.html +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - Umbraco Auth - - - - - - - - diff --git a/src/Umbraco.Web.UI.Client/apps/auth/package.json b/src/Umbraco.Web.UI.Client/apps/auth/package.json deleted file mode 100644 index addf6d7ebf..0000000000 --- a/src/Umbraco.Web.UI.Client/apps/auth/package.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "name": "@umbraco-cms/login", - "version": "0.0.0", - "license": "MIT", - "author": { - "name": "Umbraco HQ", - "email": "backoffice@umbraco.com" - }, - "type": "module", - "module": "dist/main.js", - "files": [ - "dist" - ], - "scripts": { - "dev": "vite", - "build": "tsc && vite build", - "build:watch": "vite build --watch", - "preview": "vite preview" - } -} diff --git a/src/Umbraco.Web.UI.Client/apps/auth/playwright.config.ts b/src/Umbraco.Web.UI.Client/apps/auth/playwright.config.ts deleted file mode 100644 index f7bf259530..0000000000 --- a/src/Umbraco.Web.UI.Client/apps/auth/playwright.config.ts +++ /dev/null @@ -1,108 +0,0 @@ -import type { PlaywrightTestConfig } from '@playwright/test'; -import { devices } from '@playwright/test'; - -/** - * Read environment variables from file. - * https://github.com/motdotla/dotenv - */ -// require('dotenv').config(); - -/** - * See https://playwright.dev/docs/test-configuration. - */ -const config: PlaywrightTestConfig = { - testDir: './e2e', - /* Maximum time one test can run for. */ - timeout: 30 * 1000, - expect: { - /** - * Maximum time expect() should wait for the condition to be met. - * For example in `await expect(locator).toHaveText();` - */ - timeout: 5000, - }, - /* Run tests in files in parallel */ - fullyParallel: true, - /* Fail the build on CI if you accidentally left test.only in the source code. */ - forbidOnly: !!process.env.CI, - /* Retry on CI only */ - retries: process.env.CI ? 2 : 0, - /* Opt out of parallel tests on CI. */ - workers: process.env.CI ? 1 : undefined, - /* Reporter to use. See https://playwright.dev/docs/test-reporters */ - reporter: 'html', - /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */ - use: { - /* Maximum time each action such as `click()` can take. Defaults to 0 (no limit). */ - actionTimeout: 0, - /* Base URL to use in actions like `await page.goto('/')`. */ - // baseURL: 'http://localhost:3000', - - /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ - trace: 'on-first-retry', - }, - - /* Configure projects for major browsers */ - projects: [ - { - name: 'chromium', - use: { - ...devices['Desktop Chrome'], - }, - }, - - { - name: 'firefox', - use: { - ...devices['Desktop Firefox'], - }, - }, - - { - name: 'webkit', - use: { - ...devices['Desktop Safari'], - }, - }, - - /* Test against mobile viewports. */ - // { - // name: 'Mobile Chrome', - // use: { - // ...devices['Pixel 5'], - // }, - // }, - // { - // name: 'Mobile Safari', - // use: { - // ...devices['iPhone 12'], - // }, - // }, - - /* Test against branded browsers. */ - // { - // name: 'Microsoft Edge', - // use: { - // channel: 'msedge', - // }, - // }, - // { - // name: 'Google Chrome', - // use: { - // channel: 'chrome', - // }, - // }, - ], - - /* Folder for test artifacts such as screenshots, videos, traces, etc. */ - // outputDir: 'test-results/', - - /* Run your local dev server before starting the tests */ - webServer: { - command: 'npm run dev', - port: 5173, - reuseExistingServer: !process.env.CI, - }, -}; - -export default config; diff --git a/src/Umbraco.Web.UI.Client/apps/auth/public/favicon.svg b/src/Umbraco.Web.UI.Client/apps/auth/public/favicon.svg deleted file mode 100644 index 19acb4bc1e..0000000000 --- a/src/Umbraco.Web.UI.Client/apps/auth/public/favicon.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - diff --git a/src/Umbraco.Web.UI.Client/apps/auth/public/login.jpeg b/src/Umbraco.Web.UI.Client/apps/auth/public/login.jpeg deleted file mode 100644 index 412cd17865c1b847affa4f0c2abc74645f678187..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30678 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 diff --git a/src/Umbraco.Web.UI.Client/apps/auth/public/umbraco_logo_white.svg b/src/Umbraco.Web.UI.Client/apps/auth/public/umbraco_logo_white.svg deleted file mode 100644 index 3de8e82ed3..0000000000 --- a/src/Umbraco.Web.UI.Client/apps/auth/public/umbraco_logo_white.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/apps/auth/public/umbraco_logomark_white.svg b/src/Umbraco.Web.UI.Client/apps/auth/public/umbraco_logomark_white.svg deleted file mode 100644 index 9372e25d3e..0000000000 --- a/src/Umbraco.Web.UI.Client/apps/auth/public/umbraco_logomark_white.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/apps/auth/src/auth-layout.element.ts b/src/Umbraco.Web.UI.Client/apps/auth/src/auth-layout.element.ts deleted file mode 100644 index 163ece1736..0000000000 --- a/src/Umbraco.Web.UI.Client/apps/auth/src/auth-layout.element.ts +++ /dev/null @@ -1,72 +0,0 @@ -import { css, CSSResultGroup, html, LitElement } from 'lit'; -import { customElement } from 'lit/decorators.js'; - -@customElement('umb-auth-layout') -export class UmbAuthLayoutElement extends LitElement { - render() { - return html` -
- - - -
- - - -
- `; - } - - static styles: CSSResultGroup = [ - css` - #background { - position: fixed; - overflow: hidden; - background-position: 50%; - background-repeat: no-repeat; - background-size: cover; - background-image: url('login.jpeg'); - width: 100vw; - height: 100vh; - } - - #logo { - position: fixed; - top: var(--uui-size-space-5); - left: var(--uui-size-space-5); - height: 30px; - } - - #logo img { - height: 100%; - } - - #container { - position: relative; - display: flex; - align-items: center; - justify-content: center; - width: 100vw; - height: 100vh; - } - - #box { - width: 500px; - padding: var(--uui-size-space-6) var(--uui-size-space-5) var(--uui-size-space-5) var(--uui-size-space-5); - } - - #email, - #password { - width: 100%; - } - `, - ]; -} - -declare global { - interface HTMLElementTagNameMap { - 'umb-auth-layout': UmbAuthLayoutElement; - } -} diff --git a/src/Umbraco.Web.UI.Client/apps/auth/src/auth-legacy.context.ts b/src/Umbraco.Web.UI.Client/apps/auth/src/auth-legacy.context.ts deleted file mode 100644 index 42b0679aab..0000000000 --- a/src/Umbraco.Web.UI.Client/apps/auth/src/auth-legacy.context.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { LoginRequestModel, IUmbAuthContext, LoginResponse } from './types.js'; - -export class UmbAuthLegacyContext implements IUmbAuthContext { - readonly #AUTH_URL = '/umbraco/backoffice/umbracoapi/authentication/postlogin'; - readonly supportsPersistLogin = true; - - login(data: LoginRequestModel): Promise { - throw new Error('Method not implemented.'); - } -} diff --git a/src/Umbraco.Web.UI.Client/apps/auth/src/auth.context.ts b/src/Umbraco.Web.UI.Client/apps/auth/src/auth.context.ts deleted file mode 100644 index c38afcb618..0000000000 --- a/src/Umbraco.Web.UI.Client/apps/auth/src/auth.context.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { UmbAuthRepository } from './auth.repository.js'; -import { LoginRequestModel, IUmbAuthContext } from './types.js'; - -export class UmbAuthContext implements IUmbAuthContext { - readonly #AUTH_URL = '/umbraco/management/api/v1/security/back-office'; - readonly supportsPersistLogin = false; - - #authRepository = new UmbAuthRepository(this.#AUTH_URL); - - public async login(data: LoginRequestModel) { - return this.#authRepository.login(data); - } -} diff --git a/src/Umbraco.Web.UI.Client/apps/auth/src/auth.repository.ts b/src/Umbraco.Web.UI.Client/apps/auth/src/auth.repository.ts deleted file mode 100644 index f615a915c1..0000000000 --- a/src/Umbraco.Web.UI.Client/apps/auth/src/auth.repository.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { LoginRequestModel } from './types.js'; - -export class UmbAuthRepository { - #authURL = ''; - - constructor(authUrl: string) { - this.#authURL = authUrl; - } - - public async login(data: LoginRequestModel) { - const request = new Request(this.#authURL + '/login', { - method: 'POST', - body: JSON.stringify({ - username: data.username, - password: data.password, - }), - headers: { - 'Content-Type': 'application/json', - }, - }); - const response = await fetch(request); - - //TODO: What kind of data does the old backoffice expect? - //NOTE: this conditionally adds error and data to the response object - return { - status: response.status, - ...(!response.ok && { error: this.#getErrorText(response) }), - ...(response.ok && { data: 'WHAT DATA SHOULD BE RETURNED?' }), - }; - } - - #getErrorText(response: Response) { - switch (response.status) { - case 401: - return 'Oops! It seems like your login credentials are invalid or expired. Please double-check your username and password and try again.'; - - case 500: - return "We're sorry, but the server encountered an unexpected error. Please refresh the page or try again later.."; - - default: - return response.statusText; - } - } -} diff --git a/src/Umbraco.Web.UI.Client/apps/auth/src/external-login-providers/external-login-provider-test.element.ts b/src/Umbraco.Web.UI.Client/apps/auth/src/external-login-providers/external-login-provider-test.element.ts deleted file mode 100644 index 7dda2a047e..0000000000 --- a/src/Umbraco.Web.UI.Client/apps/auth/src/external-login-providers/external-login-provider-test.element.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { css, html, LitElement } from 'lit'; -import { UUITextStyles } from '@umbraco-cms/backoffice/external/uui'; -import { customElement } from 'lit/decorators.js'; - -@customElement('umb-external-login-provider-test') -export class UmbExternalLoginProviderTestElement extends LitElement { - render() { - return html` - Custom External Login Provider -

This is an example of a custom external login provider using the external login provider extension point

- - `; - } - - static styles = [ - UUITextStyles, - css` - :host { - display: flex; - flex-direction: column; - gap: var(--uui-size-space-4); - padding: var(--uui-size-space-5); - border: 1px solid var(--uui-color-border); - background: var(--uui-color-surface-alt); - border-radius: var(--uui-border-radius); - } - p { - margin: 0; - } - `, - ]; -} - -export default UmbExternalLoginProviderTestElement; - -declare global { - interface HTMLElementTagNameMap { - 'umb-external-login-provider-test': UmbExternalLoginProviderTestElement; - } -} diff --git a/src/Umbraco.Web.UI.Client/apps/auth/src/external-login-providers/external-login-provider-test2.element.ts b/src/Umbraco.Web.UI.Client/apps/auth/src/external-login-providers/external-login-provider-test2.element.ts deleted file mode 100644 index 652293ad27..0000000000 --- a/src/Umbraco.Web.UI.Client/apps/auth/src/external-login-providers/external-login-provider-test2.element.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { css, html, LitElement } from 'lit'; -import { UUITextStyles } from '@umbraco-ui/uui-css'; -import { customElement } from 'lit/decorators.js'; - -@customElement('umb-external-login-provider-test2') -export class UmbExternalLoginProviderTest2Element extends LitElement { - render() { - return html` - Another Custom External Login Provider -

This is an example of another custom external login provider

- - Email - - - - `; - } - - static styles = [ - UUITextStyles, - css` - :host { - display: flex; - flex-direction: column; - gap: var(--uui-size-space-4); - padding: var(--uui-size-space-5); - border: 1px solid var(--uui-color-border); - background: var(--uui-color-surface-alt); - border-radius: var(--uui-border-radius); - } - p { - margin: 0; - } - uui-input { - width: 100%; - } - `, - ]; -} - -export default UmbExternalLoginProviderTest2Element; - -declare global { - interface HTMLElementTagNameMap { - 'umb-external-login-provider-test2': UmbExternalLoginProviderTest2Element; - } -} diff --git a/src/Umbraco.Web.UI.Client/apps/auth/src/external-login-providers/manifests.ts b/src/Umbraco.Web.UI.Client/apps/auth/src/external-login-providers/manifests.ts deleted file mode 100644 index 534b6a9cc2..0000000000 --- a/src/Umbraco.Web.UI.Client/apps/auth/src/external-login-providers/manifests.ts +++ /dev/null @@ -1,29 +0,0 @@ -// TODO: could these be renamed as login providers? -import type { ManifestExternalLoginProvider } from '@umbraco-cms/backoffice/extension-registry'; - -export const manifests: Array = [ - { - type: 'externalLoginProvider', - alias: 'Umb.ExternalLoginProvider.Test', - name: 'Test External Login Provider', - elementName: 'umb-external-login-provider-test', - element: () => import('./external-login-provider-test.element.js'), - weight: 2, - meta: { - label: 'Test External Login Provider', - pathname: 'test/test/test', - }, - }, - { - type: 'externalLoginProvider', - alias: 'Umb.ExternalLoginProvider.Test2', - name: 'Test External Login Provider 2', - elementName: 'umb-external-login-provider-test2', - element: () => import('./external-login-provider-test2.element.js'), - weight: 1, - meta: { - label: 'Test External Login Provider 2', - pathname: 'test/test/test', - }, - }, -]; diff --git a/src/Umbraco.Web.UI.Client/apps/auth/src/index.ts b/src/Umbraco.Web.UI.Client/apps/auth/src/index.ts deleted file mode 100644 index 43ef4da338..0000000000 --- a/src/Umbraco.Web.UI.Client/apps/auth/src/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -import 'element-internals-polyfill'; - -import '@umbraco-ui/uui-css/dist/uui-css.css'; -import '../../../src/css/umb-css.css'; -import '@umbraco-ui/uui'; - -import './login.element.js'; diff --git a/src/Umbraco.Web.UI.Client/apps/auth/src/login.element.ts b/src/Umbraco.Web.UI.Client/apps/auth/src/login.element.ts deleted file mode 100644 index d55dd07276..0000000000 --- a/src/Umbraco.Web.UI.Client/apps/auth/src/login.element.ts +++ /dev/null @@ -1,148 +0,0 @@ -import { UUITextStyles } from '@umbraco-ui/uui-css'; -import { css, CSSResultGroup, html, LitElement, nothing } from 'lit'; -import { customElement, property, state } from 'lit/decorators.js'; - -import type { UUIButtonState } from '@umbraco-ui/uui'; -import type { IUmbAuthContext } from './types.js'; -import { UmbAuthLegacyContext } from './auth-legacy.context.js'; -import { UmbAuthContext } from './auth.context.js'; - -import './auth-layout.element.js'; - -@customElement('umb-login') -export default class UmbLoginElement extends LitElement { - #authContext: IUmbAuthContext; - - @property({ type: String, attribute: 'return-url' }) - returnUrl = ''; - - @property({ type: Boolean }) - isLegacy = false; - - @state() - private _loginState: UUIButtonState = undefined; - - @state() - private _loginError = ''; - - constructor() { - super(); - if (this.isLegacy) { - this.#authContext = new UmbAuthLegacyContext(); - } else { - this.#authContext = new UmbAuthContext(); - } - } - - #handleSubmit = async (e: SubmitEvent) => { - e.preventDefault(); - - const form = e.target as HTMLFormElement; - if (!form) return; - - if (!form.checkValidity()) return; - - const formData = new FormData(form); - - const username = formData.get('email') as string; - const password = formData.get('password') as string; - const persist = formData.has('persist'); - - this._loginState = 'waiting'; - - const response = await this.#authContext.login({ username, password, persist }); - - this._loginError = response.error || ''; - this._loginState = response.error ? 'failed' : 'success'; - - if (response.error) return; - - location.href = this.returnUrl; - }; - - get #greeting() { - return [ - 'Happy super Sunday', - 'Happy marvelous Monday', - 'Happy tubular Tuesday', - 'Happy wonderful Wednesday', - 'Happy thunderous Thursday', - 'Happy funky Friday', - 'Happy Saturday', - ][new Date().getDay()]; - } - - render() { - return html` - -
-

${this.#greeting}

- -
- - Email - - - - - Password - - - - ${this.#authContext.supportsPersistLogin - ? html` - Remember me - ` - : nothing} - - ${this.#renderErrorMessage()} - - -
-
-
-
- `; - } - - #renderErrorMessage() { - if (!this._loginError || this._loginState !== 'failed') return nothing; - - return html`

${this._loginError}

`; - } - - static styles: CSSResultGroup = [ - UUITextStyles, - css` - #email, - #password { - width: 100%; - } - .text-danger { - color: var(--uui-color-danger-standalone); - } - `, - ]; -} - -declare global { - interface HTMLElementTagNameMap { - 'umb-login': UmbLoginElement; - } -} diff --git a/src/Umbraco.Web.UI.Client/apps/auth/src/login.test.ts b/src/Umbraco.Web.UI.Client/apps/auth/src/login.test.ts deleted file mode 100644 index 3bdfaccdd0..0000000000 --- a/src/Umbraco.Web.UI.Client/apps/auth/src/login.test.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { expect, fixture, html } from '@open-wc/testing'; -import { type UmbTestRunnerWindow, defaultA11yConfig } from '@umbraco-cms/internal/test-utils'; -import UmbLoginElement from './login.element.js'; - -describe('UmbLogin', () => { - let element: UmbLoginElement; - - beforeEach(async () => { - element = await fixture(html``); - }); - - it('is defined with its own instance', () => { - expect(element).to.be.instanceOf(UmbLoginElement); - }); - - if ((window as UmbTestRunnerWindow).__UMBRACO_TEST_RUN_A11Y_TEST) { - it('passes the a11y audit', async () => { - await expect(element).to.be.accessible(defaultA11yConfig); - }); - } -}); diff --git a/src/Umbraco.Web.UI.Client/apps/auth/src/types.ts b/src/Umbraco.Web.UI.Client/apps/auth/src/types.ts deleted file mode 100644 index 114c515c5d..0000000000 --- a/src/Umbraco.Web.UI.Client/apps/auth/src/types.ts +++ /dev/null @@ -1,16 +0,0 @@ -export type LoginRequestModel = { - username: string; - password: string; - persist: boolean; -}; - -export interface IUmbAuthContext { - login(data: LoginRequestModel): Promise; - supportsPersistLogin: boolean; -} - -export type LoginResponse = { - data?: string; - error?: string; - status: number; -}; diff --git a/src/Umbraco.Web.UI.Client/apps/auth/src/vite-env.d.ts b/src/Umbraco.Web.UI.Client/apps/auth/src/vite-env.d.ts deleted file mode 100644 index b0fda2b4ce..0000000000 --- a/src/Umbraco.Web.UI.Client/apps/auth/src/vite-env.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -/// - -/* -interface ImportMetaEnv { -} -*/ diff --git a/src/Umbraco.Web.UI.Client/apps/auth/tsconfig.json b/src/Umbraco.Web.UI.Client/apps/auth/tsconfig.json deleted file mode 100644 index 3f90319d83..0000000000 --- a/src/Umbraco.Web.UI.Client/apps/auth/tsconfig.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "../../tsconfig.json", - "compilerOptions": { - "declaration": false - }, - "include": ["src/**/*.ts"], - "references": [ - { - "path": "./tsconfig.node.json" - } - ] -} diff --git a/src/Umbraco.Web.UI.Client/apps/auth/tsconfig.node.json b/src/Umbraco.Web.UI.Client/apps/auth/tsconfig.node.json deleted file mode 100644 index b8b8971494..0000000000 --- a/src/Umbraco.Web.UI.Client/apps/auth/tsconfig.node.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "compilerOptions": { - "composite": true, - "module": "esnext", - "moduleResolution": "node", - "allowSyntheticDefaultImports": true - }, - "include": ["vite.config.ts"] -} diff --git a/src/Umbraco.Web.UI.Client/apps/auth/vite.config.ts b/src/Umbraco.Web.UI.Client/apps/auth/vite.config.ts deleted file mode 100644 index 74cb265ca6..0000000000 --- a/src/Umbraco.Web.UI.Client/apps/auth/vite.config.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { defineConfig } from 'vite'; -import viteTSConfigPaths from 'vite-tsconfig-paths'; - -// https://vitejs.dev/config/ -export default defineConfig({ - build: { - lib: { - entry: 'src/index.ts', - formats: ['es'], - fileName: 'main', - }, - target: 'esnext', - sourcemap: true, - rollupOptions: { - external: [/^@umbraco-cms\/backoffice\//], - output: { - manualChunks: { - uui: ['@umbraco-ui/uui'], - }, - }, - }, - outDir: '../../../Umbraco.Cms.StaticAssets/wwwroot/umbraco/auth', - emptyOutDir: true, - }, - server: { - fs: { - // Allow serving files from the global node_modules folder - allow: ['.', '../../node_modules'], - }, - }, - plugins: [viteTSConfigPaths()], -}); diff --git a/src/Umbraco.Web.UI.Client/package.json b/src/Umbraco.Web.UI.Client/package.json index e8c3085c05..33e545c0fa 100644 --- a/src/Umbraco.Web.UI.Client/package.json +++ b/src/Umbraco.Web.UI.Client/package.json @@ -117,7 +117,6 @@ "url": "https://umbraco.com" }, "scripts": { - "auth:test:e2e": "npx playwright test --config apps/auth/", "backoffice:test:e2e": "npx playwright test", "build-storybook": "npm run wc-analyze && storybook build", "build:for:cms": "npm run build && node ./devops/build/copy-to-cms.js", @@ -146,7 +145,7 @@ "preview": "vite preview --open", "storybook:build": "npm run wc-analyze && storybook build", "storybook": "npm run wc-analyze && storybook dev -p 6006", - "test:e2e": "npm run auth:test:e2e && npm run backoffice:test:e2e", + "test:e2e": "npm run backoffice:test:e2e", "test:dev": "web-test-runner --config ./web-test-runner.dev.config.mjs", "test:dev-watch": "web-test-runner --watch --config ./web-test-runner.dev.config.mjs", "test:watch": "web-test-runner --watch", From 0c98708032dd52afa3036ab3252961059934bb9a Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Fri, 5 Apr 2024 15:44:58 +0200 Subject: [PATCH 123/280] null check --- .../media/recycle-bin/tree/media-recycle-bin-tree.repository.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/tree/media-recycle-bin-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/tree/media-recycle-bin-tree.repository.ts index f027339993..7d3f2eb88d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/tree/media-recycle-bin-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/tree/media-recycle-bin-tree.repository.ts @@ -16,7 +16,7 @@ export class UmbMediaRecycleBinTreeRepository async requestTreeRoot() { const { data: treeRootData } = await this._treeSource.getRootItems({ skip: 0, take: 1 }); - const hasChildren = treeRootData?.total > 0; + const hasChildren = treeRootData ? treeRootData.total > 0 : false; const data = { unique: null, From bcbbe4965c8f8645ed27cf0f2cc8dfb60d8e6d34 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Fri, 5 Apr 2024 16:19:00 +0200 Subject: [PATCH 124/280] install simple-icons and add a few brand icons (recommendation from team at lucide) --- .../devops/icons/index.js | 36 ++++++++++- src/Umbraco.Web.UI.Client/package-lock.json | 14 +++++ src/Umbraco.Web.UI.Client/package.json | 1 + .../core/icon-registry/icon-dictionary.json | 60 ++++++++++++++++--- .../core/icon-registry/icons/icon-azure.js | 1 + .../core/icon-registry/icons/icon-facebook.js | 1 + .../core/icon-registry/icons/icon-gitbook.js | 1 + .../core/icon-registry/icons/icon-github.js | 1 + .../core/icon-registry/icons/icon-gitlab.js | 1 + .../core/icon-registry/icons/icon-google.js | 1 + .../core/icon-registry/icons/icon-linkedin.js | 1 + .../core/icon-registry/icons/icon-mastodon.js | 1 + .../icon-registry/icons/icon-microsoft.js | 1 + .../icon-registry/icons/icon-twitter-x.js | 1 + .../core/icon-registry/icons/icon-twitter.js | 1 + .../core/icon-registry/icons/icons.json | 2 +- .../core/icon-registry/svgs/icon-twitter.svg | 5 ++ 17 files changed, 117 insertions(+), 12 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-azure.js create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-facebook.js create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-gitbook.js create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-github.js create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-gitlab.js create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-google.js create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-linkedin.js create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-mastodon.js create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-microsoft.js create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-twitter-x.js create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-twitter.js create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/svgs/icon-twitter.svg diff --git a/src/Umbraco.Web.UI.Client/devops/icons/index.js b/src/Umbraco.Web.UI.Client/devops/icons/index.js index 29e84f3a96..0835e420c5 100644 --- a/src/Umbraco.Web.UI.Client/devops/icons/index.js +++ b/src/Umbraco.Web.UI.Client/devops/icons/index.js @@ -12,6 +12,7 @@ const umbracoSvgDirectory = `${moduleDirectory}/svgs`; const iconMapJson = `${moduleDirectory}/icon-dictionary.json`; const lucideSvgDirectory = 'node_modules/lucide-static/icons'; +const simpleIconsSvgDirectory = 'node_modules/simple-icons/icons'; const run = async () => { var icons = await collectDictionaryIcons(); @@ -50,8 +51,39 @@ const collectDictionaryIcons = async () => { }; icons.push(icon); - } catch(e) { - console.log(`Could not load file: '${path}'`); + } catch (e) { + console.log(`[Lucide] Could not load file: '${path}'`); + } + } + }); + + // SimpleIcons: + fileJSON.simpleIcons.forEach((iconDef) => { + if (iconDef.file && iconDef.name) { + const path = simpleIconsSvgDirectory + "/" + iconDef.file; + + try { + const rawData = readFileSync(path); + let svg = rawData.toString() + const iconFileName = iconDef.name; + + // SimpleIcons need to use fill="currentColor" + const pattern = /fill=/g; + if (!pattern.test(svg)) { + svg = svg.replace(/=0.12.18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/simple-icons" + } + }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", diff --git a/src/Umbraco.Web.UI.Client/package.json b/src/Umbraco.Web.UI.Client/package.json index 33e545c0fa..929d6ea64c 100644 --- a/src/Umbraco.Web.UI.Client/package.json +++ b/src/Umbraco.Web.UI.Client/package.json @@ -226,6 +226,7 @@ "rollup-plugin-import-css": "^3.4.0", "rollup-plugin-web-worker-loader": "^1.6.1", "storybook": "^7.6.17", + "simple-icons": "^11.11.0", "tiny-glob": "^0.2.9", "tsc-alias": "^1.8.8", "typedoc": "^0.25.10", diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icon-dictionary.json b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icon-dictionary.json index d46fcbda58..1e30ae54aa 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icon-dictionary.json +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icon-dictionary.json @@ -1486,7 +1486,7 @@ { "name": "icon-newspaper-alt", "file": "newspaper.svg", - "legacy":true + "legacy": true }, { "name": "icon-newspaper", @@ -1737,22 +1737,22 @@ { "name": "icon-price-dollar", "file": "badge-dollar-sign.svg", - "legacy":true + "legacy": true }, { "name": "icon-price-euro", "file": "badge-euro.svg", - "legacy":true + "legacy": true }, { "name": "icon-price-pound", "file": "badge-pound-sterling.svg", - "legacy":true + "legacy": true }, { "name": "icon-price-yen", "file": "badge-japanese-yen", - "legacy":true + "legacy": true }, { "name": "icon-print", @@ -2429,10 +2429,6 @@ "name": "icon-zoom-in", "file": "zoom-in.svg" }, - - - - { "name": "icon-zoom-out", "file": "zoom-out.svg" @@ -2446,6 +2442,52 @@ "file": "database.svg" } ], + "simpleIcons": [ + { + "name": "icon-azure", + "file": "microsoftazure.svg" + }, + { + "name": "icon-facebook", + "file": "facebook.svg" + }, + { + "name": "icon-gitbook", + "file": "gitbook.svg" + }, + { + "name": "icon-github", + "file": "github.svg" + }, + { + "name": "icon-gitlab", + "file": "gitlab.svg" + }, + { + "name": "icon-google", + "file": "google.svg" + }, + { + "name": "icon-linkedin", + "file": "linkedin.svg" + }, + { + "name": "icon-mastodon", + "file": "mastodon.svg" + }, + { + "name": "icon-microsoft", + "file": "microsoft.svg" + }, + { + "name": "icon-twitter", + "file": "twitter.svg" + }, + { + "name": "icon-twitter-x", + "file": "x.svg" + } + ], "umbraco": [ { "name": "icon-umbraco", diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-azure.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-azure.js new file mode 100644 index 0000000000..c12ff1b97a --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-azure.js @@ -0,0 +1 @@ +export default `Microsoft Azure`; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-facebook.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-facebook.js new file mode 100644 index 0000000000..d3cd4e5675 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-facebook.js @@ -0,0 +1 @@ +export default `Facebook`; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-gitbook.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-gitbook.js new file mode 100644 index 0000000000..3cad1567e6 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-gitbook.js @@ -0,0 +1 @@ +export default `GitBook`; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-github.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-github.js new file mode 100644 index 0000000000..e7308eddeb --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-github.js @@ -0,0 +1 @@ +export default `GitHub`; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-gitlab.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-gitlab.js new file mode 100644 index 0000000000..8ef7e658bd --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-gitlab.js @@ -0,0 +1 @@ +export default `GitLab`; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-google.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-google.js new file mode 100644 index 0000000000..4e6e37bca7 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-google.js @@ -0,0 +1 @@ +export default `Google`; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-linkedin.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-linkedin.js new file mode 100644 index 0000000000..1fb9aeb48b --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-linkedin.js @@ -0,0 +1 @@ +export default `LinkedIn`; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-mastodon.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-mastodon.js new file mode 100644 index 0000000000..40c5f92c70 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-mastodon.js @@ -0,0 +1 @@ +export default `Mastodon`; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-microsoft.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-microsoft.js new file mode 100644 index 0000000000..48d6ba0e9a --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-microsoft.js @@ -0,0 +1 @@ +export default `Microsoft`; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-twitter-x.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-twitter-x.js new file mode 100644 index 0000000000..34ab0e67f8 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-twitter-x.js @@ -0,0 +1 @@ +export default `X`; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-twitter.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-twitter.js new file mode 100644 index 0000000000..5e4a5c4737 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-twitter.js @@ -0,0 +1 @@ +export default `Twitter`; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icons.json b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icons.json index 5cb738864a..da2d594374 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icons.json +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icons.json @@ -1 +1 @@ -[{"name":"icon-activity","path":"./icons/icon-activity.js"},{"name":"icon-add","path":"./icons/icon-add.js"},{"name":"icon-addressbook","path":"./icons/icon-addressbook.js"},{"name":"icon-alarm-clock","path":"./icons/icon-alarm-clock.js"},{"name":"icon-alert-alt","path":"./icons/icon-alert-alt.js"},{"name":"icon-alert","path":"./icons/icon-alert.js"},{"name":"icon-alt","path":"./icons/icon-alt.js"},{"name":"icon-anchor","path":"./icons/icon-anchor.js"},{"name":"icon-app","path":"./icons/icon-app.js"},{"name":"icon-application-window-alt","path":"./icons/icon-application-window-alt.js"},{"name":"icon-application-window","path":"./icons/icon-application-window.js"},{"name":"icon-arrivals","path":"./icons/icon-arrivals.js"},{"name":"icon-arrow-down","path":"./icons/icon-arrow-down.js"},{"name":"icon-arrow-left","path":"./icons/icon-arrow-left.js"},{"name":"icon-arrow-right","path":"./icons/icon-arrow-right.js"},{"name":"icon-arrow-up","path":"./icons/icon-arrow-up.js"},{"name":"icon-attachment","path":"./icons/icon-attachment.js"},{"name":"icon-autofill","path":"./icons/icon-autofill.js"},{"name":"icon-award","path":"./icons/icon-award.js"},{"name":"icon-axis-rotation-2","path":"./icons/icon-axis-rotation-2.js"},{"name":"icon-axis-rotation-3","path":"./icons/icon-axis-rotation-3.js"},{"name":"icon-axis-rotation","path":"./icons/icon-axis-rotation.js"},{"name":"icon-backspace","path":"./icons/icon-backspace.js"},{"name":"icon-badge-add","path":"./icons/icon-badge-add.js"},{"name":"icon-badge-remove","path":"./icons/icon-badge-remove.js"},{"name":"icon-badge-restricted","legacy":true,"path":"./icons/icon-badge-restricted.js"},{"name":"icon-bar-chart","path":"./icons/icon-bar-chart.js"},{"name":"icon-barcode","path":"./icons/icon-barcode.js"},{"name":"icon-bars","path":"./icons/icon-bars.js"},{"name":"icon-battery-full","path":"./icons/icon-battery-full.js"},{"name":"icon-battery-low","path":"./icons/icon-battery-low.js"},{"name":"icon-beer-glass","path":"./icons/icon-beer-glass.js"},{"name":"icon-bell-off","path":"./icons/icon-bell-off.js"},{"name":"icon-bell","path":"./icons/icon-bell.js"},{"name":"icon-binarycode","path":"./icons/icon-binarycode.js"},{"name":"icon-bird","path":"./icons/icon-bird.js"},{"name":"icon-birthday-cake","path":"./icons/icon-birthday-cake.js"},{"name":"icon-block","path":"./icons/icon-block.js"},{"name":"icon-bluetooth","path":"./icons/icon-bluetooth.js"},{"name":"icon-boat-shipping","path":"./icons/icon-boat-shipping.js"},{"name":"icon-bones","path":"./icons/icon-bones.js"},{"name":"icon-book-alt-2","path":"./icons/icon-book-alt-2.js"},{"name":"icon-book-alt","path":"./icons/icon-book-alt.js"},{"name":"icon-book","path":"./icons/icon-book.js"},{"name":"icon-bookmark","path":"./icons/icon-bookmark.js"},{"name":"icon-books","path":"./icons/icon-books.js"},{"name":"icon-box-alt","path":"./icons/icon-box-alt.js"},{"name":"icon-box-open","path":"./icons/icon-box-open.js"},{"name":"icon-box","path":"./icons/icon-box.js"},{"name":"icon-brackets","path":"./icons/icon-brackets.js"},{"name":"icon-brick","path":"./icons/icon-brick.js"},{"name":"icon-briefcase","path":"./icons/icon-briefcase.js"},{"name":"icon-browser-window","path":"./icons/icon-browser-window.js"},{"name":"icon-brush-alt-2","path":"./icons/icon-brush-alt-2.js"},{"name":"icon-brush-alt","path":"./icons/icon-brush-alt.js"},{"name":"icon-brush","path":"./icons/icon-brush.js"},{"name":"icon-bug","path":"./icons/icon-bug.js"},{"name":"icon-bulleted-list","path":"./icons/icon-bulleted-list.js"},{"name":"icon-burn","path":"./icons/icon-burn.js"},{"name":"icon-bus","path":"./icons/icon-bus.js"},{"name":"icon-calculator","path":"./icons/icon-calculator.js"},{"name":"icon-calendar-alt","path":"./icons/icon-calendar-alt.js"},{"name":"icon-calendar","path":"./icons/icon-calendar.js"},{"name":"icon-camcorder","legacy":true,"path":"./icons/icon-camcorder.js"},{"name":"icon-camera-roll","path":"./icons/icon-camera-roll.js"},{"name":"icon-candy","path":"./icons/icon-candy.js"},{"name":"icon-caps-lock","path":"./icons/icon-caps-lock.js"},{"name":"icon-car","path":"./icons/icon-car.js"},{"name":"icon-categories","path":"./icons/icon-categories.js"},{"name":"icon-certificate","path":"./icons/icon-certificate.js"},{"name":"icon-chart-curve","path":"./icons/icon-chart-curve.js"},{"name":"icon-chart","path":"./icons/icon-chart.js"},{"name":"icon-chat-active","legacy":true,"path":"./icons/icon-chat-active.js"},{"name":"icon-chat","path":"./icons/icon-chat.js"},{"name":"icon-check","path":"./icons/icon-check.js"},{"name":"icon-checkbox-dotted","path":"./icons/icon-checkbox-dotted.js"},{"name":"icon-checkbox-empty","legacy":true,"path":"./icons/icon-checkbox-empty.js"},{"name":"icon-checkbox","path":"./icons/icon-checkbox.js"},{"name":"icon-chip-alt","legacy":true,"path":"./icons/icon-chip-alt.js"},{"name":"icon-chip","path":"./icons/icon-chip.js"},{"name":"icon-cinema","path":"./icons/icon-cinema.js"},{"name":"icon-circle-dotted-active","path":"./icons/icon-circle-dotted-active.js"},{"name":"icon-circle-dotted","path":"./icons/icon-circle-dotted.js"},{"name":"icon-circuits","path":"./icons/icon-circuits.js"},{"name":"icon-client","legacy":true,"path":"./icons/icon-client.js"},{"name":"icon-cloud-drive","path":"./icons/icon-cloud-drive.js"},{"name":"icon-cloud-upload","path":"./icons/icon-cloud-upload.js"},{"name":"icon-cloud","path":"./icons/icon-cloud.js"},{"name":"icon-cloudy","path":"./icons/icon-cloudy.js"},{"name":"icon-clubs","path":"./icons/icon-clubs.js"},{"name":"icon-cocktail","path":"./icons/icon-cocktail.js"},{"name":"icon-code","path":"./icons/icon-code.js"},{"name":"icon-coffee","path":"./icons/icon-coffee.js"},{"name":"icon-coin-euro","path":"./icons/icon-coin-euro.js"},{"name":"icon-coin-yen","path":"./icons/icon-coin-yen.js"},{"name":"icon-coins-alt","legacy":true,"path":"./icons/icon-coins-alt.js"},{"name":"icon-coins","path":"./icons/icon-coins.js"},{"name":"icon-color-bucket","path":"./icons/icon-color-bucket.js"},{"name":"icon-colorpicker","path":"./icons/icon-colorpicker.js"},{"name":"icon-columns","path":"./icons/icon-columns.js"},{"name":"icon-combination-lock-open","path":"./icons/icon-combination-lock-open.js"},{"name":"icon-combination-lock","path":"./icons/icon-combination-lock.js"},{"name":"icon-command","path":"./icons/icon-command.js"},{"name":"icon-company","path":"./icons/icon-company.js"},{"name":"icon-compress","path":"./icons/icon-compress.js"},{"name":"icon-connection","path":"./icons/icon-connection.js"},{"name":"icon-console","path":"./icons/icon-console.js"},{"name":"icon-contrast","path":"./icons/icon-contrast.js"},{"name":"icon-conversation-alt","path":"./icons/icon-conversation-alt.js"},{"name":"icon-conversation","legacy":true,"path":"./icons/icon-conversation.js"},{"name":"icon-coverflow","path":"./icons/icon-coverflow.js"},{"name":"icon-credit-card-alt","legacy":true,"path":"./icons/icon-credit-card-alt.js"},{"name":"icon-credit-card","path":"./icons/icon-credit-card.js"},{"name":"icon-crop","path":"./icons/icon-crop.js"},{"name":"icon-crosshair","path":"./icons/icon-crosshair.js"},{"name":"icon-crown-alt","legacy":true,"path":"./icons/icon-crown-alt.js"},{"name":"icon-crown","path":"./icons/icon-crown.js"},{"name":"icon-cupcake","legacy":true,"path":"./icons/icon-cupcake.js"},{"name":"icon-curve","path":"./icons/icon-curve.js"},{"name":"icon-cut","path":"./icons/icon-cut.js"},{"name":"icon-dashboard","path":"./icons/icon-dashboard.js"},{"name":"icon-defrag","path":"./icons/icon-defrag.js"},{"name":"icon-delete-key","path":"./icons/icon-delete-key.js"},{"name":"icon-delete","path":"./icons/icon-delete.js"},{"name":"icon-departure","path":"./icons/icon-departure.js"},{"name":"icon-desktop","legacy":true,"path":"./icons/icon-desktop.js"},{"name":"icon-diagnostics","path":"./icons/icon-diagnostics.js"},{"name":"icon-diagonal-arrow-alt","path":"./icons/icon-diagonal-arrow-alt.js"},{"name":"icon-diagonal-arrow","path":"./icons/icon-diagonal-arrow.js"},{"name":"icon-diamond","path":"./icons/icon-diamond.js"},{"name":"icon-diamonds","path":"./icons/icon-diamonds.js"},{"name":"icon-dice","path":"./icons/icon-dice.js"},{"name":"icon-diploma-alt","legacy":true,"path":"./icons/icon-diploma-alt.js"},{"name":"icon-diploma","path":"./icons/icon-diploma.js"},{"name":"icon-directions-alt","path":"./icons/icon-directions-alt.js"},{"name":"icon-directions","path":"./icons/icon-directions.js"},{"name":"icon-disc","path":"./icons/icon-disc.js"},{"name":"icon-disk-image","path":"./icons/icon-disk-image.js"},{"name":"icon-display","path":"./icons/icon-display.js"},{"name":"icon-dna","path":"./icons/icon-dna.js"},{"name":"icon-dock-connector","path":"./icons/icon-dock-connector.js"},{"name":"icon-document-dashed-line","path":"./icons/icon-document-dashed-line.js"},{"name":"icon-document","path":"./icons/icon-document.js"},{"name":"icon-documents","path":"./icons/icon-documents.js"},{"name":"icon-donate","legacy":true,"path":"./icons/icon-donate.js"},{"name":"icon-door-open-alt","legacy":true,"path":"./icons/icon-door-open-alt.js"},{"name":"icon-door-open","path":"./icons/icon-door-open.js"},{"name":"icon-download-alt","path":"./icons/icon-download-alt.js"},{"name":"icon-download","path":"./icons/icon-download.js"},{"name":"icon-drop","path":"./icons/icon-drop.js"},{"name":"icon-eco","path":"./icons/icon-eco.js"},{"name":"icon-economy","legacy":true,"path":"./icons/icon-economy.js"},{"name":"icon-edit","path":"./icons/icon-edit.js"},{"name":"icon-employee","legacy":true,"path":"./icons/icon-employee.js"},{"name":"icon-energy-saving-bulb","path":"./icons/icon-energy-saving-bulb.js"},{"name":"icon-enter","path":"./icons/icon-enter.js"},{"name":"icon-equalizer","path":"./icons/icon-equalizer.js"},{"name":"icon-escape","path":"./icons/icon-escape.js"},{"name":"icon-ethernet","path":"./icons/icon-ethernet.js"},{"name":"icon-eye","path":"./icons/icon-eye.js"},{"name":"icon-facebook-like","path":"./icons/icon-facebook-like.js"},{"name":"icon-factory","path":"./icons/icon-factory.js"},{"name":"icon-favorite","path":"./icons/icon-favorite.js"},{"name":"icon-file-cabinet","path":"./icons/icon-file-cabinet.js"},{"name":"icon-files","path":"./icons/icon-files.js"},{"name":"icon-filter","path":"./icons/icon-filter.js"},{"name":"icon-fingerprint","path":"./icons/icon-fingerprint.js"},{"name":"icon-fire","path":"./icons/icon-fire.js"},{"name":"icon-firewire","legacy":true,"path":"./icons/icon-firewire.js"},{"name":"icon-flag-alt","path":"./icons/icon-flag-alt.js"},{"name":"icon-flag","path":"./icons/icon-flag.js"},{"name":"icon-flash","path":"./icons/icon-flash.js"},{"name":"icon-flashlight","path":"./icons/icon-flashlight.js"},{"name":"icon-flowerpot","path":"./icons/icon-flowerpot.js"},{"name":"icon-folder","path":"./icons/icon-folder.js"},{"name":"icon-folders","path":"./icons/icon-folders.js"},{"name":"icon-font","path":"./icons/icon-font.js"},{"name":"icon-food","path":"./icons/icon-food.js"},{"name":"icon-footprints","path":"./icons/icon-footprints.js"},{"name":"icon-forking","path":"./icons/icon-forking.js"},{"name":"icon-frame-alt","legacy":true,"path":"./icons/icon-frame-alt.js"},{"name":"icon-frame","path":"./icons/icon-frame.js"},{"name":"icon-fullscreen-alt","path":"./icons/icon-fullscreen-alt.js"},{"name":"icon-fullscreen","path":"./icons/icon-fullscreen.js"},{"name":"icon-game","path":"./icons/icon-game.js"},{"name":"icon-geometry","legacy":true,"path":"./icons/icon-geometry.js"},{"name":"icon-gift","path":"./icons/icon-gift.js"},{"name":"icon-glasses","path":"./icons/icon-glasses.js"},{"name":"icon-globe-alt","path":"./icons/icon-globe-alt.js"},{"name":"icon-globe-asia","legacy":true,"path":"./icons/icon-globe-asia.js"},{"name":"icon-globe-europe-africa","legacy":true,"path":"./icons/icon-globe-europe-africa.js"},{"name":"icon-globe-inverted-america","legacy":true,"path":"./icons/icon-globe-inverted-america.js"},{"name":"icon-globe-inverted-asia","legacy":true,"path":"./icons/icon-globe-inverted-asia.js"},{"name":"icon-globe-inverted-europe-africa","legacy":true,"path":"./icons/icon-globe-inverted-europe-africa.js"},{"name":"icon-globe","path":"./icons/icon-globe.js"},{"name":"icon-gps","path":"./icons/icon-gps.js"},{"name":"icon-graduate","path":"./icons/icon-graduate.js"},{"name":"icon-grid","path":"./icons/icon-grid.js"},{"name":"icon-hammer","path":"./icons/icon-hammer.js"},{"name":"icon-hand-active-alt","legacy":true,"path":"./icons/icon-hand-active-alt.js"},{"name":"icon-hand-active","path":"./icons/icon-hand-active.js"},{"name":"icon-hand-pointer-alt","legacy":true,"path":"./icons/icon-hand-pointer-alt.js"},{"name":"icon-hand-pointer","path":"./icons/icon-hand-pointer.js"},{"name":"icon-handshake","path":"./icons/icon-handshake.js"},{"name":"icon-handtool-alt","legacy":true,"path":"./icons/icon-handtool-alt.js"},{"name":"icon-handtool","path":"./icons/icon-handtool.js"},{"name":"icon-hard-drive-alt","legacy":true,"path":"./icons/icon-hard-drive-alt.js"},{"name":"icon-hard-drive","legacy":true,"path":"./icons/icon-hard-drive.js"},{"name":"icon-headphones","path":"./icons/icon-headphones.js"},{"name":"icon-headset","legacy":true,"path":"./icons/icon-headset.js"},{"name":"icon-hearts","path":"./icons/icon-hearts.js"},{"name":"icon-height","path":"./icons/icon-height.js"},{"name":"icon-help-alt","path":"./icons/icon-help-alt.js"},{"name":"icon-help","path":"./icons/icon-help.js"},{"name":"icon-home","path":"./icons/icon-home.js"},{"name":"icon-hourglass","path":"./icons/icon-hourglass.js"},{"name":"icon-imac","legacy":true,"path":"./icons/icon-imac.js"},{"name":"icon-inbox-full","legacy":true,"path":"./icons/icon-inbox-full.js"},{"name":"icon-inbox","path":"./icons/icon-inbox.js"},{"name":"icon-indent","path":"./icons/icon-indent.js"},{"name":"icon-infinity","path":"./icons/icon-infinity.js"},{"name":"icon-info","path":"./icons/icon-info.js"},{"name":"icon-invoice","legacy":true,"path":"./icons/icon-invoice.js"},{"name":"icon-ipad","legacy":true,"path":"./icons/icon-ipad.js"},{"name":"icon-iphone","legacy":true,"path":"./icons/icon-iphone.js"},{"name":"icon-item-arrangement","legacy":true,"path":"./icons/icon-item-arrangement.js"},{"name":"icon-junk","path":"./icons/icon-junk.js"},{"name":"icon-key","path":"./icons/icon-key.js"},{"name":"icon-keyboard","path":"./icons/icon-keyboard.js"},{"name":"icon-lab","path":"./icons/icon-lab.js"},{"name":"icon-laptop","path":"./icons/icon-laptop.js"},{"name":"icon-layers-alt","legacy":true,"path":"./icons/icon-layers-alt.js"},{"name":"icon-layers","path":"./icons/icon-layers.js"},{"name":"icon-layout","path":"./icons/icon-layout.js"},{"name":"icon-left-double-arrow","path":"./icons/icon-left-double-arrow.js"},{"name":"icon-legal","path":"./icons/icon-legal.js"},{"name":"icon-lense","legacy":true,"path":"./icons/icon-lense.js"},{"name":"icon-library","path":"./icons/icon-library.js"},{"name":"icon-light-down","path":"./icons/icon-light-down.js"},{"name":"icon-light-up","path":"./icons/icon-light-up.js"},{"name":"icon-lightning","path":"./icons/icon-lightning.js"},{"name":"icon-link","path":"./icons/icon-link.js"},{"name":"icon-list","path":"./icons/icon-list.js"},{"name":"icon-load","legacy":true,"path":"./icons/icon-load.js"},{"name":"icon-loading","legacy":true,"path":"./icons/icon-loading.js"},{"name":"icon-location-nearby","path":"./icons/icon-location-nearby.js"},{"name":"icon-lock","path":"./icons/icon-lock.js"},{"name":"icon-log-out","path":"./icons/icon-log-out.js"},{"name":"icon-logout","legacy":true,"path":"./icons/icon-logout.js"},{"name":"icon-loupe","legacy":true,"path":"./icons/icon-loupe.js"},{"name":"icon-magnet","path":"./icons/icon-magnet.js"},{"name":"icon-mailbox","path":"./icons/icon-mailbox.js"},{"name":"icon-map-alt","path":"./icons/icon-map-alt.js"},{"name":"icon-map-location","legacy":true,"path":"./icons/icon-map-location.js"},{"name":"icon-map-marker","path":"./icons/icon-map-marker.js"},{"name":"icon-map","path":"./icons/icon-map.js"},{"name":"icon-medal","path":"./icons/icon-medal.js"},{"name":"icon-medical-emergency","path":"./icons/icon-medical-emergency.js"},{"name":"icon-medicine","path":"./icons/icon-medicine.js"},{"name":"icon-meeting","legacy":true,"path":"./icons/icon-meeting.js"},{"name":"icon-megaphone","path":"./icons/icon-megaphone.js"},{"name":"icon-merge","path":"./icons/icon-merge.js"},{"name":"icon-message-open","path":"./icons/icon-message-open.js"},{"name":"icon-message-unopened","legacy":true,"path":"./icons/icon-message-unopened.js"},{"name":"icon-message","path":"./icons/icon-message.js"},{"name":"icon-microscope","path":"./icons/icon-microscope.js"},{"name":"icon-mindmap","legacy":true,"path":"./icons/icon-mindmap.js"},{"name":"icon-mobile","path":"./icons/icon-mobile.js"},{"name":"icon-mountain","path":"./icons/icon-mountain.js"},{"name":"icon-mouse-cursor","path":"./icons/icon-mouse-cursor.js"},{"name":"icon-mouse","path":"./icons/icon-mouse.js"},{"name":"icon-movie-alt","path":"./icons/icon-movie-alt.js"},{"name":"icon-movie","path":"./icons/icon-movie.js"},{"name":"icon-multiple-credit-cards","path":"./icons/icon-multiple-credit-cards.js"},{"name":"icon-music","path":"./icons/icon-music.js"},{"name":"icon-name-badge","legacy":true,"path":"./icons/icon-name-badge.js"},{"name":"icon-navigation-bottom","legacy":true,"path":"./icons/icon-navigation-bottom.js"},{"name":"icon-navigation-down","legacy":true,"path":"./icons/icon-navigation-down.js"},{"name":"icon-navigation-first","legacy":true,"path":"./icons/icon-navigation-first.js"},{"name":"icon-navigation-horizontal","legacy":true,"path":"./icons/icon-navigation-horizontal.js"},{"name":"icon-navigation-last","legacy":true,"path":"./icons/icon-navigation-last.js"},{"name":"icon-navigation-left","legacy":true,"path":"./icons/icon-navigation-left.js"},{"name":"icon-navigation-right","legacy":true,"path":"./icons/icon-navigation-right.js"},{"name":"icon-navigation-road","legacy":true,"path":"./icons/icon-navigation-road.js"},{"name":"icon-navigation-up","legacy":true,"path":"./icons/icon-navigation-up.js"},{"name":"icon-navigation-vertical","legacy":true,"path":"./icons/icon-navigation-vertical.js"},{"name":"icon-navigation","legacy":true,"path":"./icons/icon-navigation.js"},{"name":"icon-navigational-arrow","path":"./icons/icon-navigational-arrow.js"},{"name":"icon-network-alt","path":"./icons/icon-network-alt.js"},{"name":"icon-newspaper-alt","legacy":true,"path":"./icons/icon-newspaper-alt.js"},{"name":"icon-newspaper","path":"./icons/icon-newspaper.js"},{"name":"icon-next-media","legacy":true,"path":"./icons/icon-next-media.js"},{"name":"icon-next","legacy":true,"path":"./icons/icon-next.js"},{"name":"icon-nodes","legacy":true,"path":"./icons/icon-nodes.js"},{"name":"icon-notepad-alt","legacy":true,"path":"./icons/icon-notepad-alt.js"},{"name":"icon-notepad","path":"./icons/icon-notepad.js"},{"name":"icon-old-key","path":"./icons/icon-old-key.js"},{"name":"icon-old-phone","legacy":true,"path":"./icons/icon-old-phone.js"},{"name":"icon-operator","path":"./icons/icon-operator.js"},{"name":"icon-ordered-list","path":"./icons/icon-ordered-list.js"},{"name":"icon-out","path":"./icons/icon-out.js"},{"name":"icon-outbox","legacy":true,"path":"./icons/icon-outbox.js"},{"name":"icon-outdent","path":"./icons/icon-outdent.js"},{"name":"icon-page-add","path":"./icons/icon-page-add.js"},{"name":"icon-page-down","path":"./icons/icon-page-down.js"},{"name":"icon-page-remove","path":"./icons/icon-page-remove.js"},{"name":"icon-page-restricted","path":"./icons/icon-page-restricted.js"},{"name":"icon-page-up","path":"./icons/icon-page-up.js"},{"name":"icon-paint-roller","legacy":true,"path":"./icons/icon-paint-roller.js"},{"name":"icon-palette","path":"./icons/icon-palette.js"},{"name":"icon-panel-show","path":"./icons/icon-panel-show.js"},{"name":"icon-pannel-close","path":"./icons/icon-pannel-close.js"},{"name":"icon-paper-bag","legacy":true,"path":"./icons/icon-paper-bag.js"},{"name":"icon-paper-plane-alt","path":"./icons/icon-paper-plane-alt.js"},{"name":"icon-paper-plane","path":"./icons/icon-paper-plane.js"},{"name":"icon-partly-cloudy","path":"./icons/icon-partly-cloudy.js"},{"name":"icon-paste-in","legacy":true,"path":"./icons/icon-paste-in.js"},{"name":"icon-pause","path":"./icons/icon-pause.js"},{"name":"icon-pc","legacy":true,"path":"./icons/icon-pc.js"},{"name":"icon-people-alt-2","legacy":true,"path":"./icons/icon-people-alt-2.js"},{"name":"icon-people-alt","legacy":true,"path":"./icons/icon-people-alt.js"},{"name":"icon-people-female","legacy":true,"path":"./icons/icon-people-female.js"},{"name":"icon-people","path":"./icons/icon-people.js"},{"name":"icon-phone-ring","path":"./icons/icon-phone-ring.js"},{"name":"icon-phone","path":"./icons/icon-phone.js"},{"name":"icon-photo-album","path":"./icons/icon-photo-album.js"},{"name":"icon-picture","path":"./icons/icon-picture.js"},{"name":"icon-pictures-alt-2","path":"./icons/icon-pictures-alt-2.js"},{"name":"icon-pictures-alt","legacy":true,"path":"./icons/icon-pictures-alt.js"},{"name":"icon-pictures","path":"./icons/icon-pictures.js"},{"name":"icon-pie-chart","path":"./icons/icon-pie-chart.js"},{"name":"icon-piggy-bank","path":"./icons/icon-piggy-bank.js"},{"name":"icon-pin-location","path":"./icons/icon-pin-location.js"},{"name":"icon-plane","path":"./icons/icon-plane.js"},{"name":"icon-planet","legacy":true,"path":"./icons/icon-planet.js"},{"name":"icon-play","path":"./icons/icon-play.js"},{"name":"icon-playing-cards","legacy":true,"path":"./icons/icon-playing-cards.js"},{"name":"icon-playlist","path":"./icons/icon-playlist.js"},{"name":"icon-plugin","path":"./icons/icon-plugin.js"},{"name":"icon-podcast","path":"./icons/icon-podcast.js"},{"name":"icon-poll","legacy":true,"path":"./icons/icon-poll.js"},{"name":"icon-post-it","path":"./icons/icon-post-it.js"},{"name":"icon-power-outlet","legacy":true,"path":"./icons/icon-power-outlet.js"},{"name":"icon-power","path":"./icons/icon-power.js"},{"name":"icon-presentation","path":"./icons/icon-presentation.js"},{"name":"icon-previous-media","path":"./icons/icon-previous-media.js"},{"name":"icon-previous","path":"./icons/icon-previous.js"},{"name":"icon-price-dollar","legacy":true,"path":"./icons/icon-price-dollar.js"},{"name":"icon-price-euro","legacy":true,"path":"./icons/icon-price-euro.js"},{"name":"icon-price-pound","legacy":true,"path":"./icons/icon-price-pound.js"},{"name":"icon-print","path":"./icons/icon-print.js"},{"name":"icon-printer-alt","legacy":true,"path":"./icons/icon-printer-alt.js"},{"name":"icon-projector","path":"./icons/icon-projector.js"},{"name":"icon-pulse","path":"./icons/icon-pulse.js"},{"name":"icon-pushpin","path":"./icons/icon-pushpin.js"},{"name":"icon-qr-code","path":"./icons/icon-qr-code.js"},{"name":"icon-quote","path":"./icons/icon-quote.js"},{"name":"icon-radio-alt","path":"./icons/icon-radio-alt.js"},{"name":"icon-radio-receiver","path":"./icons/icon-radio-receiver.js"},{"name":"icon-radio","path":"./icons/icon-radio.js"},{"name":"icon-rain","path":"./icons/icon-rain.js"},{"name":"icon-rate","legacy":true,"path":"./icons/icon-rate.js"},{"name":"icon-re-post","path":"./icons/icon-re-post.js"},{"name":"icon-readonly","legacy":true,"path":"./icons/icon-readonly.js"},{"name":"icon-receipt-alt","path":"./icons/icon-receipt-alt.js"},{"name":"icon-reception","path":"./icons/icon-reception.js"},{"name":"icon-record","legacy":true,"path":"./icons/icon-record.js"},{"name":"icon-redo","path":"./icons/icon-redo.js"},{"name":"icon-refresh","path":"./icons/icon-refresh.js"},{"name":"icon-remote","legacy":true,"path":"./icons/icon-remote.js"},{"name":"icon-remove","path":"./icons/icon-remove.js"},{"name":"icon-repeat-one","path":"./icons/icon-repeat-one.js"},{"name":"icon-repeat","path":"./icons/icon-repeat.js"},{"name":"icon-reply-arrow","path":"./icons/icon-reply-arrow.js"},{"name":"icon-return-to-top","legacy":true,"path":"./icons/icon-return-to-top.js"},{"name":"icon-right-double-arrow","legacy":true,"path":"./icons/icon-right-double-arrow.js"},{"name":"icon-roadsign","legacy":true,"path":"./icons/icon-roadsign.js"},{"name":"icon-rocket","path":"./icons/icon-rocket.js"},{"name":"icon-rss","path":"./icons/icon-rss.js"},{"name":"icon-ruler-alt","path":"./icons/icon-ruler-alt.js"},{"name":"icon-ruler","path":"./icons/icon-ruler.js"},{"name":"icon-satellite-dish","path":"./icons/icon-satellite-dish.js"},{"name":"icon-save","path":"./icons/icon-save.js"},{"name":"icon-scan","path":"./icons/icon-scan.js"},{"name":"icon-school","path":"./icons/icon-school.js"},{"name":"icon-screensharing","path":"./icons/icon-screensharing.js"},{"name":"icon-script-alt","legacy":true,"path":"./icons/icon-script-alt.js"},{"name":"icon-script","path":"./icons/icon-script.js"},{"name":"icon-scull","path":"./icons/icon-scull.js"},{"name":"icon-search","path":"./icons/icon-search.js"},{"name":"icon-sensor","path":"./icons/icon-sensor.js"},{"name":"icon-server-alt","legacy":true,"path":"./icons/icon-server-alt.js"},{"name":"icon-server","path":"./icons/icon-server.js"},{"name":"icon-settings-alt","legacy":true,"path":"./icons/icon-settings-alt.js"},{"name":"icon-settings","path":"./icons/icon-settings.js"},{"name":"icon-share-alt","path":"./icons/icon-share-alt.js"},{"name":"icon-share","path":"./icons/icon-share.js"},{"name":"icon-sharing-iphone","path":"./icons/icon-sharing-iphone.js"},{"name":"icon-shield","path":"./icons/icon-shield.js"},{"name":"icon-shift","path":"./icons/icon-shift.js"},{"name":"icon-shipping-box","path":"./icons/icon-shipping-box.js"},{"name":"icon-shipping","path":"./icons/icon-shipping.js"},{"name":"icon-shoe","path":"./icons/icon-shoe.js"},{"name":"icon-shopping-basket-alt-2","legacy":true,"path":"./icons/icon-shopping-basket-alt-2.js"},{"name":"icon-shopping-basket-alt","path":"./icons/icon-shopping-basket-alt.js"},{"name":"icon-shopping-basket","path":"./icons/icon-shopping-basket.js"},{"name":"icon-shuffle","path":"./icons/icon-shuffle.js"},{"name":"icon-sience","path":"./icons/icon-sience.js"},{"name":"icon-single-note","path":"./icons/icon-single-note.js"},{"name":"icon-sitemap","legacy":true,"path":"./icons/icon-sitemap.js"},{"name":"icon-sleep","path":"./icons/icon-sleep.js"},{"name":"icon-slideshow","legacy":true,"path":"./icons/icon-slideshow.js"},{"name":"icon-smiley-inverted","legacy":true,"path":"./icons/icon-smiley-inverted.js"},{"name":"icon-smiley","path":"./icons/icon-smiley.js"},{"name":"icon-snow","path":"./icons/icon-snow.js"},{"name":"icon-sound-low","path":"./icons/icon-sound-low.js"},{"name":"icon-sound-medium","legacy":true,"path":"./icons/icon-sound-medium.js"},{"name":"icon-sound-off","path":"./icons/icon-sound-off.js"},{"name":"icon-sound-waves","path":"./icons/icon-sound-waves.js"},{"name":"icon-sound","path":"./icons/icon-sound.js"},{"name":"icon-spades","path":"./icons/icon-spades.js"},{"name":"icon-speaker","path":"./icons/icon-speaker.js"},{"name":"icon-speed-gauge","path":"./icons/icon-speed-gauge.js"},{"name":"icon-split","path":"./icons/icon-split.js"},{"name":"icon-sprout","path":"./icons/icon-sprout.js"},{"name":"icon-squiggly-line","legacy":true,"path":"./icons/icon-squiggly-line.js"},{"name":"icon-ssd","legacy":true,"path":"./icons/icon-ssd.js"},{"name":"icon-stacked-disks","legacy":true,"path":"./icons/icon-stacked-disks.js"},{"name":"icon-stamp","legacy":true,"path":"./icons/icon-stamp.js"},{"name":"icon-stop-alt","path":"./icons/icon-stop-alt.js"},{"name":"icon-stop-hand","legacy":true,"path":"./icons/icon-stop-hand.js"},{"name":"icon-stop","path":"./icons/icon-stop.js"},{"name":"icon-store","path":"./icons/icon-store.js"},{"name":"icon-stream","legacy":true,"path":"./icons/icon-stream.js"},{"name":"icon-sunny","path":"./icons/icon-sunny.js"},{"name":"icon-sweatshirt","legacy":true,"path":"./icons/icon-sweatshirt.js"},{"name":"icon-sync","path":"./icons/icon-sync.js"},{"name":"icon-t-shirt","path":"./icons/icon-t-shirt.js"},{"name":"icon-tab-key","path":"./icons/icon-tab-key.js"},{"name":"icon-tag","path":"./icons/icon-tag.js"},{"name":"icon-tags","path":"./icons/icon-tags.js"},{"name":"icon-takeaway-cup","legacy":true,"path":"./icons/icon-takeaway-cup.js"},{"name":"icon-target","path":"./icons/icon-target.js"},{"name":"icon-temperatrure-alt","path":"./icons/icon-temperatrure-alt.js"},{"name":"icon-temperature","path":"./icons/icon-temperature.js"},{"name":"icon-terminal","path":"./icons/icon-terminal.js"},{"name":"icon-theater","path":"./icons/icon-theater.js"},{"name":"icon-thumb-down","path":"./icons/icon-thumb-down.js"},{"name":"icon-thumb-up","path":"./icons/icon-thumb-up.js"},{"name":"icon-thumbnail-list","path":"./icons/icon-thumbnail-list.js"},{"name":"icon-thumbnails-small","path":"./icons/icon-thumbnails-small.js"},{"name":"icon-thumbnails","path":"./icons/icon-thumbnails.js"},{"name":"icon-ticket","path":"./icons/icon-ticket.js"},{"name":"icon-time","path":"./icons/icon-time.js"},{"name":"icon-timer","path":"./icons/icon-timer.js"},{"name":"icon-tools","legacy":true,"path":"./icons/icon-tools.js"},{"name":"icon-top","legacy":true,"path":"./icons/icon-top.js"},{"name":"icon-traffic-alt","legacy":true,"path":"./icons/icon-traffic-alt.js"},{"name":"icon-trafic","path":"./icons/icon-trafic.js"},{"name":"icon-train","path":"./icons/icon-train.js"},{"name":"icon-trash-alt-2","legacy":true,"path":"./icons/icon-trash-alt-2.js"},{"name":"icon-trash-alt","legacy":true,"path":"./icons/icon-trash-alt.js"},{"name":"icon-trash","path":"./icons/icon-trash.js"},{"name":"icon-tree","path":"./icons/icon-tree.js"},{"name":"icon-trophy","path":"./icons/icon-trophy.js"},{"name":"icon-truck","path":"./icons/icon-truck.js"},{"name":"icon-tv-old","path":"./icons/icon-tv-old.js"},{"name":"icon-tv","path":"./icons/icon-tv.js"},{"name":"icon-umb-content","legacy":true,"path":"./icons/icon-umb-content.js"},{"name":"icon-umb-developer","legacy":true,"path":"./icons/icon-umb-developer.js"},{"name":"icon-umb-media","legacy":true,"path":"./icons/icon-umb-media.js"},{"name":"icon-umb-settings","legacy":true,"path":"./icons/icon-umb-settings.js"},{"name":"icon-umb-users","legacy":true,"path":"./icons/icon-umb-users.js"},{"name":"icon-umbrella","path":"./icons/icon-umbrella.js"},{"name":"icon-undo","path":"./icons/icon-undo.js"},{"name":"icon-unlocked","path":"./icons/icon-unlocked.js"},{"name":"icon-untitled","legacy":true,"path":"./icons/icon-untitled.js"},{"name":"icon-usb-connector","legacy":true,"path":"./icons/icon-usb-connector.js"},{"name":"icon-usb","path":"./icons/icon-usb.js"},{"name":"icon-user-female","legacy":true,"path":"./icons/icon-user-female.js"},{"name":"icon-user-females-alt","legacy":true,"path":"./icons/icon-user-females-alt.js"},{"name":"icon-user-females","legacy":true,"path":"./icons/icon-user-females.js"},{"name":"icon-user-glasses","legacy":true,"path":"./icons/icon-user-glasses.js"},{"name":"icon-user","path":"./icons/icon-user.js"},{"name":"icon-users-alt","legacy":true,"path":"./icons/icon-users-alt.js"},{"name":"icon-users","path":"./icons/icon-users.js"},{"name":"icon-utilities","path":"./icons/icon-utilities.js"},{"name":"icon-vcard","path":"./icons/icon-vcard.js"},{"name":"icon-video","path":"./icons/icon-video.js"},{"name":"icon-voice","path":"./icons/icon-voice.js"},{"name":"icon-wall-plug","path":"./icons/icon-wall-plug.js"},{"name":"icon-wallet","path":"./icons/icon-wallet.js"},{"name":"icon-wand","path":"./icons/icon-wand.js"},{"name":"icon-webhook","path":"./icons/icon-webhook.js"},{"name":"icon-weight","path":"./icons/icon-weight.js"},{"name":"icon-width","path":"./icons/icon-width.js"},{"name":"icon-wifi","path":"./icons/icon-wifi.js"},{"name":"icon-window-popin","path":"./icons/icon-window-popin.js"},{"name":"icon-window-sizes","path":"./icons/icon-window-sizes.js"},{"name":"icon-wine-glass","path":"./icons/icon-wine-glass.js"},{"name":"icon-wrench","path":"./icons/icon-wrench.js"},{"name":"icon-wrong","path":"./icons/icon-wrong.js"},{"name":"icon-zip","path":"./icons/icon-zip.js"},{"name":"icon-zom-out","legacy":true,"path":"./icons/icon-zom-out.js"},{"name":"icon-zoom-in","path":"./icons/icon-zoom-in.js"},{"name":"icon-zoom-out","path":"./icons/icon-zoom-out.js"},{"name":"icon-star","path":"./icons/icon-star.js"},{"name":"icon-database","path":"./icons/icon-database.js"},{"name":"icon-umbraco","path":"./icons/icon-umbraco.js"},{"name":"icon-application-error","legacy":true,"path":"./icons/icon-application-error.js"},{"name":"icon-art-easel","legacy":true,"path":"./icons/icon-art-easel.js"},{"name":"icon-article","legacy":true,"path":"./icons/icon-article.js"},{"name":"icon-auction-hammer","legacy":true,"path":"./icons/icon-auction-hammer.js"},{"name":"icon-baby-stroller","legacy":true,"path":"./icons/icon-baby-stroller.js"},{"name":"icon-badge-count","legacy":true,"path":"./icons/icon-badge-count.js"},{"name":"icon-ball","legacy":true,"path":"./icons/icon-ball.js"},{"name":"icon-band-aid","legacy":true,"path":"./icons/icon-band-aid.js"},{"name":"icon-bill-dollar","legacy":true,"path":"./icons/icon-bill-dollar.js"},{"name":"icon-bill-euro","legacy":true,"path":"./icons/icon-bill-euro.js"},{"name":"icon-bill-pound","legacy":true,"path":"./icons/icon-bill-pound.js"},{"name":"icon-bill-yen","legacy":true,"path":"./icons/icon-bill-yen.js"},{"name":"icon-bill","legacy":true,"path":"./icons/icon-bill.js"},{"name":"icon-billboard","legacy":true,"path":"./icons/icon-billboard.js"},{"name":"icon-bills-dollar","legacy":true,"path":"./icons/icon-bills-dollar.js"},{"name":"icon-bills-euro","legacy":true,"path":"./icons/icon-bills-euro.js"},{"name":"icon-bills-pound","legacy":true,"path":"./icons/icon-bills-pound.js"},{"name":"icon-bills-yen","legacy":true,"path":"./icons/icon-bills-yen.js"},{"name":"icon-bills","legacy":true,"path":"./icons/icon-bills.js"},{"name":"icon-binoculars","legacy":true,"path":"./icons/icon-binoculars.js"},{"name":"icon-blueprint","legacy":true,"path":"./icons/icon-blueprint.js"},{"name":"icon-bomb","legacy":true,"path":"./icons/icon-bomb.js"},{"name":"icon-cash-register","legacy":true,"path":"./icons/icon-cash-register.js"},{"name":"icon-checkbox-dotted-active","legacy":true,"path":"./icons/icon-checkbox-dotted-active.js"},{"name":"icon-chess","legacy":true,"path":"./icons/icon-chess.js"},{"name":"icon-circus","legacy":true,"path":"./icons/icon-circus.js"},{"name":"icon-clothes-hanger","legacy":true,"path":"./icons/icon-clothes-hanger.js"},{"name":"icon-coin-dollar","legacy":true,"path":"./icons/icon-coin-dollar.js"},{"name":"icon-coin-pound","legacy":true,"path":"./icons/icon-coin-pound.js"},{"name":"icon-coin","legacy":true,"path":"./icons/icon-coin.js"},{"name":"icon-coins-dollar-alt","legacy":true,"path":"./icons/icon-coins-dollar-alt.js"},{"name":"icon-coins-dollar","legacy":true,"path":"./icons/icon-coins-dollar.js"},{"name":"icon-coins-euro-alt","legacy":true,"path":"./icons/icon-coins-euro-alt.js"},{"name":"icon-coins-euro","legacy":true,"path":"./icons/icon-coins-euro.js"},{"name":"icon-coins-pound-alt","legacy":true,"path":"./icons/icon-coins-pound-alt.js"},{"name":"icon-coins-pound","legacy":true,"path":"./icons/icon-coins-pound.js"},{"name":"icon-coins-yen-alt","legacy":true,"path":"./icons/icon-coins-yen-alt.js"},{"name":"icon-coins-yen","legacy":true,"path":"./icons/icon-coins-yen.js"},{"name":"icon-comb","legacy":true,"path":"./icons/icon-comb.js"},{"name":"icon-desk","legacy":true,"path":"./icons/icon-desk.js"},{"name":"icon-dollar-bag","legacy":true,"path":"./icons/icon-dollar-bag.js"},{"name":"icon-eject","legacy":true,"path":"./icons/icon-eject.js"},{"name":"icon-euro-bag","legacy":true,"path":"./icons/icon-euro-bag.js"},{"name":"icon-exit-fullscreen","legacy":true,"path":"./icons/icon-exit-fullscreen.js"},{"name":"icon-female-symbol","legacy":true,"path":"./icons/icon-female-symbol.js"},{"name":"icon-filter-arrows","legacy":true,"path":"./icons/icon-filter-arrows.js"},{"name":"icon-firewall","legacy":true,"path":"./icons/icon-firewall.js"},{"name":"icon-folder-open","legacy":true,"path":"./icons/icon-folder-open.js"},{"name":"icon-folder-outline","legacy":true,"path":"./icons/icon-folder-outline.js"},{"name":"icon-handprint","legacy":true,"path":"./icons/icon-handprint.js"},{"name":"icon-hat","legacy":true,"path":"./icons/icon-hat.js"},{"name":"icon-hd","legacy":true,"path":"./icons/icon-hd.js"},{"name":"icon-inactive-line","legacy":true,"path":"./icons/icon-inactive-line.js"},{"name":"icon-keychain","legacy":true,"path":"./icons/icon-keychain.js"},{"name":"icon-keyhole","legacy":true,"path":"./icons/icon-keyhole.js"},{"name":"icon-lightbulb-active","legacy":true,"path":"./icons/icon-lightbulb-active.js"},{"name":"icon-lightbulb","legacy":true,"path":"./icons/icon-lightbulb.js"},{"name":"icon-linux-tux","legacy":true,"path":"./icons/icon-linux-tux.js"},{"name":"icon-locate","legacy":true,"path":"./icons/icon-locate.js"},{"name":"icon-location-near-me","legacy":true,"path":"./icons/icon-location-near-me.js"},{"name":"icon-male-and-female","legacy":true,"path":"./icons/icon-male-and-female.js"},{"name":"icon-male-symbol","legacy":true,"path":"./icons/icon-male-symbol.js"},{"name":"icon-molecular-network","legacy":true,"path":"./icons/icon-molecular-network.js"},{"name":"icon-molecular","legacy":true,"path":"./icons/icon-molecular.js"},{"name":"icon-multiple-windows","legacy":true,"path":"./icons/icon-multiple-windows.js"},{"name":"icon-navigation-top","legacy":true,"path":"./icons/icon-navigation-top.js"},{"name":"icon-os-x","legacy":true,"path":"./icons/icon-os-x.js"},{"name":"icon-pants","legacy":true,"path":"./icons/icon-pants.js"},{"name":"icon-parachute-drop","legacy":true,"path":"./icons/icon-parachute-drop.js"},{"name":"icon-parental-control","legacy":true,"path":"./icons/icon-parental-control.js"},{"name":"icon-path","legacy":true,"path":"./icons/icon-path.js"},{"name":"icon-piracy","legacy":true,"path":"./icons/icon-piracy.js"},{"name":"icon-poker-chip","legacy":true,"path":"./icons/icon-poker-chip.js"},{"name":"icon-pound-bag","legacy":true,"path":"./icons/icon-pound-bag.js"},{"name":"icon-price-yen","legacy":true,"path":"./icons/icon-price-yen.js"},{"name":"icon-receipt-dollar","legacy":true,"path":"./icons/icon-receipt-dollar.js"},{"name":"icon-receipt-euro","legacy":true,"path":"./icons/icon-receipt-euro.js"},{"name":"icon-receipt-pound","legacy":true,"path":"./icons/icon-receipt-pound.js"},{"name":"icon-receipt-yen","legacy":true,"path":"./icons/icon-receipt-yen.js"},{"name":"icon-resize","legacy":true,"path":"./icons/icon-resize.js"},{"name":"icon-road","legacy":true,"path":"./icons/icon-road.js"},{"name":"icon-safe","legacy":true,"path":"./icons/icon-safe.js"},{"name":"icon-safedial","legacy":true,"path":"./icons/icon-safedial.js"},{"name":"icon-sandbox-toys","legacy":true,"path":"./icons/icon-sandbox-toys.js"},{"name":"icon-security-camera","legacy":true,"path":"./icons/icon-security-camera.js"},{"name":"icon-settings-alt-2","legacy":true,"path":"./icons/icon-settings-alt-2.js"},{"name":"icon-share-alt-2","legacy":true,"path":"./icons/icon-share-alt-2.js"},{"name":"icon-shorts","legacy":true,"path":"./icons/icon-shorts.js"},{"name":"icon-simcard","legacy":true,"path":"./icons/icon-simcard.js"},{"name":"icon-split-alt","legacy":true,"path":"./icons/icon-split-alt.js"},{"name":"icon-tab","legacy":true,"path":"./icons/icon-tab.js"},{"name":"icon-tactics","legacy":true,"path":"./icons/icon-tactics.js"},{"name":"icon-theif","legacy":true,"path":"./icons/icon-theif.js"},{"name":"icon-thought-bubble","legacy":true,"path":"./icons/icon-thought-bubble.js"},{"name":"icon-umb-contour","legacy":true,"path":"./icons/icon-umb-contour.js"},{"name":"icon-umb-deploy","legacy":true,"path":"./icons/icon-umb-deploy.js"},{"name":"icon-umb-members","legacy":true,"path":"./icons/icon-umb-members.js"},{"name":"icon-universal","legacy":true,"path":"./icons/icon-universal.js"},{"name":"icon-war","legacy":true,"path":"./icons/icon-war.js"},{"name":"icon-windows","legacy":true,"path":"./icons/icon-windows.js"},{"name":"icon-yen-bag","legacy":true,"path":"./icons/icon-yen-bag.js"}] \ No newline at end of file +[{"name":"icon-activity","path":"./icons/icon-activity.js"},{"name":"icon-add","path":"./icons/icon-add.js"},{"name":"icon-addressbook","path":"./icons/icon-addressbook.js"},{"name":"icon-alarm-clock","path":"./icons/icon-alarm-clock.js"},{"name":"icon-alert-alt","path":"./icons/icon-alert-alt.js"},{"name":"icon-alert","path":"./icons/icon-alert.js"},{"name":"icon-alt","path":"./icons/icon-alt.js"},{"name":"icon-anchor","path":"./icons/icon-anchor.js"},{"name":"icon-app","path":"./icons/icon-app.js"},{"name":"icon-application-window-alt","path":"./icons/icon-application-window-alt.js"},{"name":"icon-application-window","path":"./icons/icon-application-window.js"},{"name":"icon-arrivals","path":"./icons/icon-arrivals.js"},{"name":"icon-arrow-down","path":"./icons/icon-arrow-down.js"},{"name":"icon-arrow-left","path":"./icons/icon-arrow-left.js"},{"name":"icon-arrow-right","path":"./icons/icon-arrow-right.js"},{"name":"icon-arrow-up","path":"./icons/icon-arrow-up.js"},{"name":"icon-attachment","path":"./icons/icon-attachment.js"},{"name":"icon-autofill","path":"./icons/icon-autofill.js"},{"name":"icon-award","path":"./icons/icon-award.js"},{"name":"icon-axis-rotation-2","path":"./icons/icon-axis-rotation-2.js"},{"name":"icon-axis-rotation-3","path":"./icons/icon-axis-rotation-3.js"},{"name":"icon-axis-rotation","path":"./icons/icon-axis-rotation.js"},{"name":"icon-backspace","path":"./icons/icon-backspace.js"},{"name":"icon-badge-add","path":"./icons/icon-badge-add.js"},{"name":"icon-badge-remove","path":"./icons/icon-badge-remove.js"},{"name":"icon-badge-restricted","legacy":true,"path":"./icons/icon-badge-restricted.js"},{"name":"icon-bar-chart","path":"./icons/icon-bar-chart.js"},{"name":"icon-barcode","path":"./icons/icon-barcode.js"},{"name":"icon-bars","path":"./icons/icon-bars.js"},{"name":"icon-battery-full","path":"./icons/icon-battery-full.js"},{"name":"icon-battery-low","path":"./icons/icon-battery-low.js"},{"name":"icon-beer-glass","path":"./icons/icon-beer-glass.js"},{"name":"icon-bell-off","path":"./icons/icon-bell-off.js"},{"name":"icon-bell","path":"./icons/icon-bell.js"},{"name":"icon-binarycode","path":"./icons/icon-binarycode.js"},{"name":"icon-bird","path":"./icons/icon-bird.js"},{"name":"icon-birthday-cake","path":"./icons/icon-birthday-cake.js"},{"name":"icon-block","path":"./icons/icon-block.js"},{"name":"icon-bluetooth","path":"./icons/icon-bluetooth.js"},{"name":"icon-boat-shipping","path":"./icons/icon-boat-shipping.js"},{"name":"icon-bones","path":"./icons/icon-bones.js"},{"name":"icon-book-alt-2","path":"./icons/icon-book-alt-2.js"},{"name":"icon-book-alt","path":"./icons/icon-book-alt.js"},{"name":"icon-book","path":"./icons/icon-book.js"},{"name":"icon-bookmark","path":"./icons/icon-bookmark.js"},{"name":"icon-books","path":"./icons/icon-books.js"},{"name":"icon-box-alt","path":"./icons/icon-box-alt.js"},{"name":"icon-box-open","path":"./icons/icon-box-open.js"},{"name":"icon-box","path":"./icons/icon-box.js"},{"name":"icon-brackets","path":"./icons/icon-brackets.js"},{"name":"icon-brick","path":"./icons/icon-brick.js"},{"name":"icon-briefcase","path":"./icons/icon-briefcase.js"},{"name":"icon-browser-window","path":"./icons/icon-browser-window.js"},{"name":"icon-brush-alt-2","path":"./icons/icon-brush-alt-2.js"},{"name":"icon-brush-alt","path":"./icons/icon-brush-alt.js"},{"name":"icon-brush","path":"./icons/icon-brush.js"},{"name":"icon-bug","path":"./icons/icon-bug.js"},{"name":"icon-bulleted-list","path":"./icons/icon-bulleted-list.js"},{"name":"icon-burn","path":"./icons/icon-burn.js"},{"name":"icon-bus","path":"./icons/icon-bus.js"},{"name":"icon-calculator","path":"./icons/icon-calculator.js"},{"name":"icon-calendar-alt","path":"./icons/icon-calendar-alt.js"},{"name":"icon-calendar","path":"./icons/icon-calendar.js"},{"name":"icon-camcorder","legacy":true,"path":"./icons/icon-camcorder.js"},{"name":"icon-camera-roll","path":"./icons/icon-camera-roll.js"},{"name":"icon-candy","path":"./icons/icon-candy.js"},{"name":"icon-caps-lock","path":"./icons/icon-caps-lock.js"},{"name":"icon-car","path":"./icons/icon-car.js"},{"name":"icon-categories","path":"./icons/icon-categories.js"},{"name":"icon-certificate","path":"./icons/icon-certificate.js"},{"name":"icon-chart-curve","path":"./icons/icon-chart-curve.js"},{"name":"icon-chart","path":"./icons/icon-chart.js"},{"name":"icon-chat-active","legacy":true,"path":"./icons/icon-chat-active.js"},{"name":"icon-chat","path":"./icons/icon-chat.js"},{"name":"icon-check","path":"./icons/icon-check.js"},{"name":"icon-checkbox-dotted","path":"./icons/icon-checkbox-dotted.js"},{"name":"icon-checkbox-empty","legacy":true,"path":"./icons/icon-checkbox-empty.js"},{"name":"icon-checkbox","path":"./icons/icon-checkbox.js"},{"name":"icon-chip-alt","legacy":true,"path":"./icons/icon-chip-alt.js"},{"name":"icon-chip","path":"./icons/icon-chip.js"},{"name":"icon-cinema","path":"./icons/icon-cinema.js"},{"name":"icon-circle-dotted-active","path":"./icons/icon-circle-dotted-active.js"},{"name":"icon-circle-dotted","path":"./icons/icon-circle-dotted.js"},{"name":"icon-circuits","path":"./icons/icon-circuits.js"},{"name":"icon-client","legacy":true,"path":"./icons/icon-client.js"},{"name":"icon-cloud-drive","path":"./icons/icon-cloud-drive.js"},{"name":"icon-cloud-upload","path":"./icons/icon-cloud-upload.js"},{"name":"icon-cloud","path":"./icons/icon-cloud.js"},{"name":"icon-cloudy","path":"./icons/icon-cloudy.js"},{"name":"icon-clubs","path":"./icons/icon-clubs.js"},{"name":"icon-cocktail","path":"./icons/icon-cocktail.js"},{"name":"icon-code","path":"./icons/icon-code.js"},{"name":"icon-coffee","path":"./icons/icon-coffee.js"},{"name":"icon-coin-euro","path":"./icons/icon-coin-euro.js"},{"name":"icon-coin-yen","path":"./icons/icon-coin-yen.js"},{"name":"icon-coins-alt","legacy":true,"path":"./icons/icon-coins-alt.js"},{"name":"icon-coins","path":"./icons/icon-coins.js"},{"name":"icon-color-bucket","path":"./icons/icon-color-bucket.js"},{"name":"icon-colorpicker","path":"./icons/icon-colorpicker.js"},{"name":"icon-columns","path":"./icons/icon-columns.js"},{"name":"icon-combination-lock-open","path":"./icons/icon-combination-lock-open.js"},{"name":"icon-combination-lock","path":"./icons/icon-combination-lock.js"},{"name":"icon-command","path":"./icons/icon-command.js"},{"name":"icon-company","path":"./icons/icon-company.js"},{"name":"icon-compress","path":"./icons/icon-compress.js"},{"name":"icon-connection","path":"./icons/icon-connection.js"},{"name":"icon-console","path":"./icons/icon-console.js"},{"name":"icon-contrast","path":"./icons/icon-contrast.js"},{"name":"icon-conversation-alt","path":"./icons/icon-conversation-alt.js"},{"name":"icon-conversation","legacy":true,"path":"./icons/icon-conversation.js"},{"name":"icon-coverflow","path":"./icons/icon-coverflow.js"},{"name":"icon-credit-card-alt","legacy":true,"path":"./icons/icon-credit-card-alt.js"},{"name":"icon-credit-card","path":"./icons/icon-credit-card.js"},{"name":"icon-crop","path":"./icons/icon-crop.js"},{"name":"icon-crosshair","path":"./icons/icon-crosshair.js"},{"name":"icon-crown-alt","legacy":true,"path":"./icons/icon-crown-alt.js"},{"name":"icon-crown","path":"./icons/icon-crown.js"},{"name":"icon-cupcake","legacy":true,"path":"./icons/icon-cupcake.js"},{"name":"icon-curve","path":"./icons/icon-curve.js"},{"name":"icon-cut","path":"./icons/icon-cut.js"},{"name":"icon-dashboard","path":"./icons/icon-dashboard.js"},{"name":"icon-defrag","path":"./icons/icon-defrag.js"},{"name":"icon-delete-key","path":"./icons/icon-delete-key.js"},{"name":"icon-delete","path":"./icons/icon-delete.js"},{"name":"icon-departure","path":"./icons/icon-departure.js"},{"name":"icon-desktop","legacy":true,"path":"./icons/icon-desktop.js"},{"name":"icon-diagnostics","path":"./icons/icon-diagnostics.js"},{"name":"icon-diagonal-arrow-alt","path":"./icons/icon-diagonal-arrow-alt.js"},{"name":"icon-diagonal-arrow","path":"./icons/icon-diagonal-arrow.js"},{"name":"icon-diamond","path":"./icons/icon-diamond.js"},{"name":"icon-diamonds","path":"./icons/icon-diamonds.js"},{"name":"icon-dice","path":"./icons/icon-dice.js"},{"name":"icon-diploma-alt","legacy":true,"path":"./icons/icon-diploma-alt.js"},{"name":"icon-diploma","path":"./icons/icon-diploma.js"},{"name":"icon-directions-alt","path":"./icons/icon-directions-alt.js"},{"name":"icon-directions","path":"./icons/icon-directions.js"},{"name":"icon-disc","path":"./icons/icon-disc.js"},{"name":"icon-disk-image","path":"./icons/icon-disk-image.js"},{"name":"icon-display","path":"./icons/icon-display.js"},{"name":"icon-dna","path":"./icons/icon-dna.js"},{"name":"icon-dock-connector","path":"./icons/icon-dock-connector.js"},{"name":"icon-document-dashed-line","path":"./icons/icon-document-dashed-line.js"},{"name":"icon-document","path":"./icons/icon-document.js"},{"name":"icon-documents","path":"./icons/icon-documents.js"},{"name":"icon-donate","legacy":true,"path":"./icons/icon-donate.js"},{"name":"icon-door-open-alt","legacy":true,"path":"./icons/icon-door-open-alt.js"},{"name":"icon-door-open","path":"./icons/icon-door-open.js"},{"name":"icon-download-alt","path":"./icons/icon-download-alt.js"},{"name":"icon-download","path":"./icons/icon-download.js"},{"name":"icon-drop","path":"./icons/icon-drop.js"},{"name":"icon-eco","path":"./icons/icon-eco.js"},{"name":"icon-economy","legacy":true,"path":"./icons/icon-economy.js"},{"name":"icon-edit","path":"./icons/icon-edit.js"},{"name":"icon-employee","legacy":true,"path":"./icons/icon-employee.js"},{"name":"icon-energy-saving-bulb","path":"./icons/icon-energy-saving-bulb.js"},{"name":"icon-enter","path":"./icons/icon-enter.js"},{"name":"icon-equalizer","path":"./icons/icon-equalizer.js"},{"name":"icon-escape","path":"./icons/icon-escape.js"},{"name":"icon-ethernet","path":"./icons/icon-ethernet.js"},{"name":"icon-eye","path":"./icons/icon-eye.js"},{"name":"icon-facebook-like","path":"./icons/icon-facebook-like.js"},{"name":"icon-factory","path":"./icons/icon-factory.js"},{"name":"icon-favorite","path":"./icons/icon-favorite.js"},{"name":"icon-file-cabinet","path":"./icons/icon-file-cabinet.js"},{"name":"icon-files","path":"./icons/icon-files.js"},{"name":"icon-filter","path":"./icons/icon-filter.js"},{"name":"icon-fingerprint","path":"./icons/icon-fingerprint.js"},{"name":"icon-fire","path":"./icons/icon-fire.js"},{"name":"icon-firewire","legacy":true,"path":"./icons/icon-firewire.js"},{"name":"icon-flag-alt","path":"./icons/icon-flag-alt.js"},{"name":"icon-flag","path":"./icons/icon-flag.js"},{"name":"icon-flash","path":"./icons/icon-flash.js"},{"name":"icon-flashlight","path":"./icons/icon-flashlight.js"},{"name":"icon-flowerpot","path":"./icons/icon-flowerpot.js"},{"name":"icon-folder","path":"./icons/icon-folder.js"},{"name":"icon-folders","path":"./icons/icon-folders.js"},{"name":"icon-font","path":"./icons/icon-font.js"},{"name":"icon-food","path":"./icons/icon-food.js"},{"name":"icon-footprints","path":"./icons/icon-footprints.js"},{"name":"icon-forking","path":"./icons/icon-forking.js"},{"name":"icon-frame-alt","legacy":true,"path":"./icons/icon-frame-alt.js"},{"name":"icon-frame","path":"./icons/icon-frame.js"},{"name":"icon-fullscreen-alt","path":"./icons/icon-fullscreen-alt.js"},{"name":"icon-fullscreen","path":"./icons/icon-fullscreen.js"},{"name":"icon-game","path":"./icons/icon-game.js"},{"name":"icon-geometry","legacy":true,"path":"./icons/icon-geometry.js"},{"name":"icon-gift","path":"./icons/icon-gift.js"},{"name":"icon-glasses","path":"./icons/icon-glasses.js"},{"name":"icon-globe-alt","path":"./icons/icon-globe-alt.js"},{"name":"icon-globe-asia","legacy":true,"path":"./icons/icon-globe-asia.js"},{"name":"icon-globe-europe-africa","legacy":true,"path":"./icons/icon-globe-europe-africa.js"},{"name":"icon-globe-inverted-america","legacy":true,"path":"./icons/icon-globe-inverted-america.js"},{"name":"icon-globe-inverted-asia","legacy":true,"path":"./icons/icon-globe-inverted-asia.js"},{"name":"icon-globe-inverted-europe-africa","legacy":true,"path":"./icons/icon-globe-inverted-europe-africa.js"},{"name":"icon-globe","path":"./icons/icon-globe.js"},{"name":"icon-gps","path":"./icons/icon-gps.js"},{"name":"icon-graduate","path":"./icons/icon-graduate.js"},{"name":"icon-grid","path":"./icons/icon-grid.js"},{"name":"icon-hammer","path":"./icons/icon-hammer.js"},{"name":"icon-hand-active-alt","legacy":true,"path":"./icons/icon-hand-active-alt.js"},{"name":"icon-hand-active","path":"./icons/icon-hand-active.js"},{"name":"icon-hand-pointer-alt","legacy":true,"path":"./icons/icon-hand-pointer-alt.js"},{"name":"icon-hand-pointer","path":"./icons/icon-hand-pointer.js"},{"name":"icon-handshake","path":"./icons/icon-handshake.js"},{"name":"icon-handtool-alt","legacy":true,"path":"./icons/icon-handtool-alt.js"},{"name":"icon-handtool","path":"./icons/icon-handtool.js"},{"name":"icon-hard-drive-alt","legacy":true,"path":"./icons/icon-hard-drive-alt.js"},{"name":"icon-hard-drive","legacy":true,"path":"./icons/icon-hard-drive.js"},{"name":"icon-headphones","path":"./icons/icon-headphones.js"},{"name":"icon-headset","legacy":true,"path":"./icons/icon-headset.js"},{"name":"icon-hearts","path":"./icons/icon-hearts.js"},{"name":"icon-height","path":"./icons/icon-height.js"},{"name":"icon-help-alt","path":"./icons/icon-help-alt.js"},{"name":"icon-help","path":"./icons/icon-help.js"},{"name":"icon-home","path":"./icons/icon-home.js"},{"name":"icon-hourglass","path":"./icons/icon-hourglass.js"},{"name":"icon-imac","legacy":true,"path":"./icons/icon-imac.js"},{"name":"icon-inbox-full","legacy":true,"path":"./icons/icon-inbox-full.js"},{"name":"icon-inbox","path":"./icons/icon-inbox.js"},{"name":"icon-indent","path":"./icons/icon-indent.js"},{"name":"icon-infinity","path":"./icons/icon-infinity.js"},{"name":"icon-info","path":"./icons/icon-info.js"},{"name":"icon-invoice","legacy":true,"path":"./icons/icon-invoice.js"},{"name":"icon-ipad","legacy":true,"path":"./icons/icon-ipad.js"},{"name":"icon-iphone","legacy":true,"path":"./icons/icon-iphone.js"},{"name":"icon-item-arrangement","legacy":true,"path":"./icons/icon-item-arrangement.js"},{"name":"icon-junk","path":"./icons/icon-junk.js"},{"name":"icon-key","path":"./icons/icon-key.js"},{"name":"icon-keyboard","path":"./icons/icon-keyboard.js"},{"name":"icon-lab","path":"./icons/icon-lab.js"},{"name":"icon-laptop","path":"./icons/icon-laptop.js"},{"name":"icon-layers-alt","legacy":true,"path":"./icons/icon-layers-alt.js"},{"name":"icon-layers","path":"./icons/icon-layers.js"},{"name":"icon-layout","path":"./icons/icon-layout.js"},{"name":"icon-left-double-arrow","path":"./icons/icon-left-double-arrow.js"},{"name":"icon-legal","path":"./icons/icon-legal.js"},{"name":"icon-lense","legacy":true,"path":"./icons/icon-lense.js"},{"name":"icon-library","path":"./icons/icon-library.js"},{"name":"icon-light-down","path":"./icons/icon-light-down.js"},{"name":"icon-light-up","path":"./icons/icon-light-up.js"},{"name":"icon-lightning","path":"./icons/icon-lightning.js"},{"name":"icon-link","path":"./icons/icon-link.js"},{"name":"icon-list","path":"./icons/icon-list.js"},{"name":"icon-load","legacy":true,"path":"./icons/icon-load.js"},{"name":"icon-loading","legacy":true,"path":"./icons/icon-loading.js"},{"name":"icon-location-nearby","path":"./icons/icon-location-nearby.js"},{"name":"icon-lock","path":"./icons/icon-lock.js"},{"name":"icon-log-out","path":"./icons/icon-log-out.js"},{"name":"icon-logout","legacy":true,"path":"./icons/icon-logout.js"},{"name":"icon-loupe","legacy":true,"path":"./icons/icon-loupe.js"},{"name":"icon-magnet","path":"./icons/icon-magnet.js"},{"name":"icon-mailbox","path":"./icons/icon-mailbox.js"},{"name":"icon-map-alt","path":"./icons/icon-map-alt.js"},{"name":"icon-map-location","legacy":true,"path":"./icons/icon-map-location.js"},{"name":"icon-map-marker","path":"./icons/icon-map-marker.js"},{"name":"icon-map","path":"./icons/icon-map.js"},{"name":"icon-medal","path":"./icons/icon-medal.js"},{"name":"icon-medical-emergency","path":"./icons/icon-medical-emergency.js"},{"name":"icon-medicine","path":"./icons/icon-medicine.js"},{"name":"icon-meeting","legacy":true,"path":"./icons/icon-meeting.js"},{"name":"icon-megaphone","path":"./icons/icon-megaphone.js"},{"name":"icon-merge","path":"./icons/icon-merge.js"},{"name":"icon-message-open","path":"./icons/icon-message-open.js"},{"name":"icon-message-unopened","legacy":true,"path":"./icons/icon-message-unopened.js"},{"name":"icon-message","path":"./icons/icon-message.js"},{"name":"icon-microscope","path":"./icons/icon-microscope.js"},{"name":"icon-mindmap","legacy":true,"path":"./icons/icon-mindmap.js"},{"name":"icon-mobile","path":"./icons/icon-mobile.js"},{"name":"icon-mountain","path":"./icons/icon-mountain.js"},{"name":"icon-mouse-cursor","path":"./icons/icon-mouse-cursor.js"},{"name":"icon-mouse","path":"./icons/icon-mouse.js"},{"name":"icon-movie-alt","path":"./icons/icon-movie-alt.js"},{"name":"icon-movie","path":"./icons/icon-movie.js"},{"name":"icon-multiple-credit-cards","path":"./icons/icon-multiple-credit-cards.js"},{"name":"icon-music","path":"./icons/icon-music.js"},{"name":"icon-name-badge","legacy":true,"path":"./icons/icon-name-badge.js"},{"name":"icon-navigation-bottom","legacy":true,"path":"./icons/icon-navigation-bottom.js"},{"name":"icon-navigation-down","legacy":true,"path":"./icons/icon-navigation-down.js"},{"name":"icon-navigation-first","legacy":true,"path":"./icons/icon-navigation-first.js"},{"name":"icon-navigation-horizontal","legacy":true,"path":"./icons/icon-navigation-horizontal.js"},{"name":"icon-navigation-last","legacy":true,"path":"./icons/icon-navigation-last.js"},{"name":"icon-navigation-left","legacy":true,"path":"./icons/icon-navigation-left.js"},{"name":"icon-navigation-right","legacy":true,"path":"./icons/icon-navigation-right.js"},{"name":"icon-navigation-road","legacy":true,"path":"./icons/icon-navigation-road.js"},{"name":"icon-navigation-up","legacy":true,"path":"./icons/icon-navigation-up.js"},{"name":"icon-navigation-vertical","legacy":true,"path":"./icons/icon-navigation-vertical.js"},{"name":"icon-navigation","legacy":true,"path":"./icons/icon-navigation.js"},{"name":"icon-navigational-arrow","path":"./icons/icon-navigational-arrow.js"},{"name":"icon-network-alt","path":"./icons/icon-network-alt.js"},{"name":"icon-newspaper-alt","legacy":true,"path":"./icons/icon-newspaper-alt.js"},{"name":"icon-newspaper","path":"./icons/icon-newspaper.js"},{"name":"icon-next-media","legacy":true,"path":"./icons/icon-next-media.js"},{"name":"icon-next","legacy":true,"path":"./icons/icon-next.js"},{"name":"icon-nodes","legacy":true,"path":"./icons/icon-nodes.js"},{"name":"icon-notepad-alt","legacy":true,"path":"./icons/icon-notepad-alt.js"},{"name":"icon-notepad","path":"./icons/icon-notepad.js"},{"name":"icon-old-key","path":"./icons/icon-old-key.js"},{"name":"icon-old-phone","legacy":true,"path":"./icons/icon-old-phone.js"},{"name":"icon-operator","path":"./icons/icon-operator.js"},{"name":"icon-ordered-list","path":"./icons/icon-ordered-list.js"},{"name":"icon-out","path":"./icons/icon-out.js"},{"name":"icon-outbox","legacy":true,"path":"./icons/icon-outbox.js"},{"name":"icon-outdent","path":"./icons/icon-outdent.js"},{"name":"icon-page-add","path":"./icons/icon-page-add.js"},{"name":"icon-page-down","path":"./icons/icon-page-down.js"},{"name":"icon-page-remove","path":"./icons/icon-page-remove.js"},{"name":"icon-page-restricted","path":"./icons/icon-page-restricted.js"},{"name":"icon-page-up","path":"./icons/icon-page-up.js"},{"name":"icon-paint-roller","legacy":true,"path":"./icons/icon-paint-roller.js"},{"name":"icon-palette","path":"./icons/icon-palette.js"},{"name":"icon-panel-show","path":"./icons/icon-panel-show.js"},{"name":"icon-pannel-close","path":"./icons/icon-pannel-close.js"},{"name":"icon-paper-bag","legacy":true,"path":"./icons/icon-paper-bag.js"},{"name":"icon-paper-plane-alt","path":"./icons/icon-paper-plane-alt.js"},{"name":"icon-paper-plane","path":"./icons/icon-paper-plane.js"},{"name":"icon-partly-cloudy","path":"./icons/icon-partly-cloudy.js"},{"name":"icon-paste-in","legacy":true,"path":"./icons/icon-paste-in.js"},{"name":"icon-pause","path":"./icons/icon-pause.js"},{"name":"icon-pc","legacy":true,"path":"./icons/icon-pc.js"},{"name":"icon-people-alt-2","legacy":true,"path":"./icons/icon-people-alt-2.js"},{"name":"icon-people-alt","legacy":true,"path":"./icons/icon-people-alt.js"},{"name":"icon-people-female","legacy":true,"path":"./icons/icon-people-female.js"},{"name":"icon-people","path":"./icons/icon-people.js"},{"name":"icon-phone-ring","path":"./icons/icon-phone-ring.js"},{"name":"icon-phone","path":"./icons/icon-phone.js"},{"name":"icon-photo-album","path":"./icons/icon-photo-album.js"},{"name":"icon-picture","path":"./icons/icon-picture.js"},{"name":"icon-pictures-alt-2","path":"./icons/icon-pictures-alt-2.js"},{"name":"icon-pictures-alt","legacy":true,"path":"./icons/icon-pictures-alt.js"},{"name":"icon-pictures","path":"./icons/icon-pictures.js"},{"name":"icon-pie-chart","path":"./icons/icon-pie-chart.js"},{"name":"icon-piggy-bank","path":"./icons/icon-piggy-bank.js"},{"name":"icon-pin-location","path":"./icons/icon-pin-location.js"},{"name":"icon-plane","path":"./icons/icon-plane.js"},{"name":"icon-planet","legacy":true,"path":"./icons/icon-planet.js"},{"name":"icon-play","path":"./icons/icon-play.js"},{"name":"icon-playing-cards","legacy":true,"path":"./icons/icon-playing-cards.js"},{"name":"icon-playlist","path":"./icons/icon-playlist.js"},{"name":"icon-plugin","path":"./icons/icon-plugin.js"},{"name":"icon-podcast","path":"./icons/icon-podcast.js"},{"name":"icon-poll","legacy":true,"path":"./icons/icon-poll.js"},{"name":"icon-post-it","path":"./icons/icon-post-it.js"},{"name":"icon-power-outlet","legacy":true,"path":"./icons/icon-power-outlet.js"},{"name":"icon-power","path":"./icons/icon-power.js"},{"name":"icon-presentation","path":"./icons/icon-presentation.js"},{"name":"icon-previous-media","path":"./icons/icon-previous-media.js"},{"name":"icon-previous","path":"./icons/icon-previous.js"},{"name":"icon-price-dollar","legacy":true,"path":"./icons/icon-price-dollar.js"},{"name":"icon-price-euro","legacy":true,"path":"./icons/icon-price-euro.js"},{"name":"icon-price-pound","legacy":true,"path":"./icons/icon-price-pound.js"},{"name":"icon-print","path":"./icons/icon-print.js"},{"name":"icon-printer-alt","legacy":true,"path":"./icons/icon-printer-alt.js"},{"name":"icon-projector","path":"./icons/icon-projector.js"},{"name":"icon-pulse","path":"./icons/icon-pulse.js"},{"name":"icon-pushpin","path":"./icons/icon-pushpin.js"},{"name":"icon-qr-code","path":"./icons/icon-qr-code.js"},{"name":"icon-quote","path":"./icons/icon-quote.js"},{"name":"icon-radio-alt","path":"./icons/icon-radio-alt.js"},{"name":"icon-radio-receiver","path":"./icons/icon-radio-receiver.js"},{"name":"icon-radio","path":"./icons/icon-radio.js"},{"name":"icon-rain","path":"./icons/icon-rain.js"},{"name":"icon-rate","legacy":true,"path":"./icons/icon-rate.js"},{"name":"icon-re-post","path":"./icons/icon-re-post.js"},{"name":"icon-readonly","legacy":true,"path":"./icons/icon-readonly.js"},{"name":"icon-receipt-alt","path":"./icons/icon-receipt-alt.js"},{"name":"icon-reception","path":"./icons/icon-reception.js"},{"name":"icon-record","legacy":true,"path":"./icons/icon-record.js"},{"name":"icon-redo","path":"./icons/icon-redo.js"},{"name":"icon-refresh","path":"./icons/icon-refresh.js"},{"name":"icon-remote","legacy":true,"path":"./icons/icon-remote.js"},{"name":"icon-remove","path":"./icons/icon-remove.js"},{"name":"icon-repeat-one","path":"./icons/icon-repeat-one.js"},{"name":"icon-repeat","path":"./icons/icon-repeat.js"},{"name":"icon-reply-arrow","path":"./icons/icon-reply-arrow.js"},{"name":"icon-return-to-top","legacy":true,"path":"./icons/icon-return-to-top.js"},{"name":"icon-right-double-arrow","legacy":true,"path":"./icons/icon-right-double-arrow.js"},{"name":"icon-roadsign","legacy":true,"path":"./icons/icon-roadsign.js"},{"name":"icon-rocket","path":"./icons/icon-rocket.js"},{"name":"icon-rss","path":"./icons/icon-rss.js"},{"name":"icon-ruler-alt","path":"./icons/icon-ruler-alt.js"},{"name":"icon-ruler","path":"./icons/icon-ruler.js"},{"name":"icon-satellite-dish","path":"./icons/icon-satellite-dish.js"},{"name":"icon-save","path":"./icons/icon-save.js"},{"name":"icon-scan","path":"./icons/icon-scan.js"},{"name":"icon-school","path":"./icons/icon-school.js"},{"name":"icon-screensharing","path":"./icons/icon-screensharing.js"},{"name":"icon-script-alt","legacy":true,"path":"./icons/icon-script-alt.js"},{"name":"icon-script","path":"./icons/icon-script.js"},{"name":"icon-scull","path":"./icons/icon-scull.js"},{"name":"icon-search","path":"./icons/icon-search.js"},{"name":"icon-sensor","path":"./icons/icon-sensor.js"},{"name":"icon-server-alt","legacy":true,"path":"./icons/icon-server-alt.js"},{"name":"icon-server","path":"./icons/icon-server.js"},{"name":"icon-settings-alt","legacy":true,"path":"./icons/icon-settings-alt.js"},{"name":"icon-settings","path":"./icons/icon-settings.js"},{"name":"icon-share-alt","path":"./icons/icon-share-alt.js"},{"name":"icon-share","path":"./icons/icon-share.js"},{"name":"icon-sharing-iphone","path":"./icons/icon-sharing-iphone.js"},{"name":"icon-shield","path":"./icons/icon-shield.js"},{"name":"icon-shift","path":"./icons/icon-shift.js"},{"name":"icon-shipping-box","path":"./icons/icon-shipping-box.js"},{"name":"icon-shipping","path":"./icons/icon-shipping.js"},{"name":"icon-shoe","path":"./icons/icon-shoe.js"},{"name":"icon-shopping-basket-alt-2","legacy":true,"path":"./icons/icon-shopping-basket-alt-2.js"},{"name":"icon-shopping-basket-alt","path":"./icons/icon-shopping-basket-alt.js"},{"name":"icon-shopping-basket","path":"./icons/icon-shopping-basket.js"},{"name":"icon-shuffle","path":"./icons/icon-shuffle.js"},{"name":"icon-sience","path":"./icons/icon-sience.js"},{"name":"icon-single-note","path":"./icons/icon-single-note.js"},{"name":"icon-sitemap","legacy":true,"path":"./icons/icon-sitemap.js"},{"name":"icon-sleep","path":"./icons/icon-sleep.js"},{"name":"icon-slideshow","legacy":true,"path":"./icons/icon-slideshow.js"},{"name":"icon-smiley-inverted","legacy":true,"path":"./icons/icon-smiley-inverted.js"},{"name":"icon-smiley","path":"./icons/icon-smiley.js"},{"name":"icon-snow","path":"./icons/icon-snow.js"},{"name":"icon-sound-low","path":"./icons/icon-sound-low.js"},{"name":"icon-sound-medium","legacy":true,"path":"./icons/icon-sound-medium.js"},{"name":"icon-sound-off","path":"./icons/icon-sound-off.js"},{"name":"icon-sound-waves","path":"./icons/icon-sound-waves.js"},{"name":"icon-sound","path":"./icons/icon-sound.js"},{"name":"icon-spades","path":"./icons/icon-spades.js"},{"name":"icon-speaker","path":"./icons/icon-speaker.js"},{"name":"icon-speed-gauge","path":"./icons/icon-speed-gauge.js"},{"name":"icon-split","path":"./icons/icon-split.js"},{"name":"icon-sprout","path":"./icons/icon-sprout.js"},{"name":"icon-squiggly-line","legacy":true,"path":"./icons/icon-squiggly-line.js"},{"name":"icon-ssd","legacy":true,"path":"./icons/icon-ssd.js"},{"name":"icon-stacked-disks","legacy":true,"path":"./icons/icon-stacked-disks.js"},{"name":"icon-stamp","legacy":true,"path":"./icons/icon-stamp.js"},{"name":"icon-stop-alt","path":"./icons/icon-stop-alt.js"},{"name":"icon-stop-hand","legacy":true,"path":"./icons/icon-stop-hand.js"},{"name":"icon-stop","path":"./icons/icon-stop.js"},{"name":"icon-store","path":"./icons/icon-store.js"},{"name":"icon-stream","legacy":true,"path":"./icons/icon-stream.js"},{"name":"icon-sunny","path":"./icons/icon-sunny.js"},{"name":"icon-sweatshirt","legacy":true,"path":"./icons/icon-sweatshirt.js"},{"name":"icon-sync","path":"./icons/icon-sync.js"},{"name":"icon-t-shirt","path":"./icons/icon-t-shirt.js"},{"name":"icon-tab-key","path":"./icons/icon-tab-key.js"},{"name":"icon-tag","path":"./icons/icon-tag.js"},{"name":"icon-tags","path":"./icons/icon-tags.js"},{"name":"icon-takeaway-cup","legacy":true,"path":"./icons/icon-takeaway-cup.js"},{"name":"icon-target","path":"./icons/icon-target.js"},{"name":"icon-temperatrure-alt","path":"./icons/icon-temperatrure-alt.js"},{"name":"icon-temperature","path":"./icons/icon-temperature.js"},{"name":"icon-terminal","path":"./icons/icon-terminal.js"},{"name":"icon-theater","path":"./icons/icon-theater.js"},{"name":"icon-thumb-down","path":"./icons/icon-thumb-down.js"},{"name":"icon-thumb-up","path":"./icons/icon-thumb-up.js"},{"name":"icon-thumbnail-list","path":"./icons/icon-thumbnail-list.js"},{"name":"icon-thumbnails-small","path":"./icons/icon-thumbnails-small.js"},{"name":"icon-thumbnails","path":"./icons/icon-thumbnails.js"},{"name":"icon-ticket","path":"./icons/icon-ticket.js"},{"name":"icon-time","path":"./icons/icon-time.js"},{"name":"icon-timer","path":"./icons/icon-timer.js"},{"name":"icon-tools","legacy":true,"path":"./icons/icon-tools.js"},{"name":"icon-top","legacy":true,"path":"./icons/icon-top.js"},{"name":"icon-traffic-alt","legacy":true,"path":"./icons/icon-traffic-alt.js"},{"name":"icon-trafic","path":"./icons/icon-trafic.js"},{"name":"icon-train","path":"./icons/icon-train.js"},{"name":"icon-trash-alt-2","legacy":true,"path":"./icons/icon-trash-alt-2.js"},{"name":"icon-trash-alt","legacy":true,"path":"./icons/icon-trash-alt.js"},{"name":"icon-trash","path":"./icons/icon-trash.js"},{"name":"icon-tree","path":"./icons/icon-tree.js"},{"name":"icon-trophy","path":"./icons/icon-trophy.js"},{"name":"icon-truck","path":"./icons/icon-truck.js"},{"name":"icon-tv-old","path":"./icons/icon-tv-old.js"},{"name":"icon-tv","path":"./icons/icon-tv.js"},{"name":"icon-umb-content","legacy":true,"path":"./icons/icon-umb-content.js"},{"name":"icon-umb-developer","legacy":true,"path":"./icons/icon-umb-developer.js"},{"name":"icon-umb-media","legacy":true,"path":"./icons/icon-umb-media.js"},{"name":"icon-umb-settings","legacy":true,"path":"./icons/icon-umb-settings.js"},{"name":"icon-umb-users","legacy":true,"path":"./icons/icon-umb-users.js"},{"name":"icon-umbrella","path":"./icons/icon-umbrella.js"},{"name":"icon-undo","path":"./icons/icon-undo.js"},{"name":"icon-unlocked","path":"./icons/icon-unlocked.js"},{"name":"icon-untitled","legacy":true,"path":"./icons/icon-untitled.js"},{"name":"icon-usb-connector","legacy":true,"path":"./icons/icon-usb-connector.js"},{"name":"icon-usb","path":"./icons/icon-usb.js"},{"name":"icon-user-female","legacy":true,"path":"./icons/icon-user-female.js"},{"name":"icon-user-females-alt","legacy":true,"path":"./icons/icon-user-females-alt.js"},{"name":"icon-user-females","legacy":true,"path":"./icons/icon-user-females.js"},{"name":"icon-user-glasses","legacy":true,"path":"./icons/icon-user-glasses.js"},{"name":"icon-user","path":"./icons/icon-user.js"},{"name":"icon-users-alt","legacy":true,"path":"./icons/icon-users-alt.js"},{"name":"icon-users","path":"./icons/icon-users.js"},{"name":"icon-utilities","path":"./icons/icon-utilities.js"},{"name":"icon-vcard","path":"./icons/icon-vcard.js"},{"name":"icon-video","path":"./icons/icon-video.js"},{"name":"icon-voice","path":"./icons/icon-voice.js"},{"name":"icon-wall-plug","path":"./icons/icon-wall-plug.js"},{"name":"icon-wallet","path":"./icons/icon-wallet.js"},{"name":"icon-wand","path":"./icons/icon-wand.js"},{"name":"icon-webhook","path":"./icons/icon-webhook.js"},{"name":"icon-weight","path":"./icons/icon-weight.js"},{"name":"icon-width","path":"./icons/icon-width.js"},{"name":"icon-wifi","path":"./icons/icon-wifi.js"},{"name":"icon-window-popin","path":"./icons/icon-window-popin.js"},{"name":"icon-window-sizes","path":"./icons/icon-window-sizes.js"},{"name":"icon-wine-glass","path":"./icons/icon-wine-glass.js"},{"name":"icon-wrench","path":"./icons/icon-wrench.js"},{"name":"icon-wrong","path":"./icons/icon-wrong.js"},{"name":"icon-zip","path":"./icons/icon-zip.js"},{"name":"icon-zom-out","legacy":true,"path":"./icons/icon-zom-out.js"},{"name":"icon-zoom-in","path":"./icons/icon-zoom-in.js"},{"name":"icon-zoom-out","path":"./icons/icon-zoom-out.js"},{"name":"icon-star","path":"./icons/icon-star.js"},{"name":"icon-database","path":"./icons/icon-database.js"},{"name":"icon-azure","path":"./icons/icon-azure.js"},{"name":"icon-facebook","path":"./icons/icon-facebook.js"},{"name":"icon-gitbook","path":"./icons/icon-gitbook.js"},{"name":"icon-github","path":"./icons/icon-github.js"},{"name":"icon-gitlab","path":"./icons/icon-gitlab.js"},{"name":"icon-google","path":"./icons/icon-google.js"},{"name":"icon-linkedin","path":"./icons/icon-linkedin.js"},{"name":"icon-mastodon","path":"./icons/icon-mastodon.js"},{"name":"icon-microsoft","path":"./icons/icon-microsoft.js"},{"name":"icon-twitter","path":"./icons/icon-twitter.js"},{"name":"icon-twitter-x","path":"./icons/icon-twitter-x.js"},{"name":"icon-umbraco","path":"./icons/icon-umbraco.js"},{"name":"icon-application-error","legacy":true,"path":"./icons/icon-application-error.js"},{"name":"icon-art-easel","legacy":true,"path":"./icons/icon-art-easel.js"},{"name":"icon-article","legacy":true,"path":"./icons/icon-article.js"},{"name":"icon-auction-hammer","legacy":true,"path":"./icons/icon-auction-hammer.js"},{"name":"icon-baby-stroller","legacy":true,"path":"./icons/icon-baby-stroller.js"},{"name":"icon-badge-count","legacy":true,"path":"./icons/icon-badge-count.js"},{"name":"icon-ball","legacy":true,"path":"./icons/icon-ball.js"},{"name":"icon-band-aid","legacy":true,"path":"./icons/icon-band-aid.js"},{"name":"icon-bill-dollar","legacy":true,"path":"./icons/icon-bill-dollar.js"},{"name":"icon-bill-euro","legacy":true,"path":"./icons/icon-bill-euro.js"},{"name":"icon-bill-pound","legacy":true,"path":"./icons/icon-bill-pound.js"},{"name":"icon-bill-yen","legacy":true,"path":"./icons/icon-bill-yen.js"},{"name":"icon-bill","legacy":true,"path":"./icons/icon-bill.js"},{"name":"icon-billboard","legacy":true,"path":"./icons/icon-billboard.js"},{"name":"icon-bills-dollar","legacy":true,"path":"./icons/icon-bills-dollar.js"},{"name":"icon-bills-euro","legacy":true,"path":"./icons/icon-bills-euro.js"},{"name":"icon-bills-pound","legacy":true,"path":"./icons/icon-bills-pound.js"},{"name":"icon-bills-yen","legacy":true,"path":"./icons/icon-bills-yen.js"},{"name":"icon-bills","legacy":true,"path":"./icons/icon-bills.js"},{"name":"icon-binoculars","legacy":true,"path":"./icons/icon-binoculars.js"},{"name":"icon-blueprint","legacy":true,"path":"./icons/icon-blueprint.js"},{"name":"icon-bomb","legacy":true,"path":"./icons/icon-bomb.js"},{"name":"icon-cash-register","legacy":true,"path":"./icons/icon-cash-register.js"},{"name":"icon-checkbox-dotted-active","legacy":true,"path":"./icons/icon-checkbox-dotted-active.js"},{"name":"icon-chess","legacy":true,"path":"./icons/icon-chess.js"},{"name":"icon-circus","legacy":true,"path":"./icons/icon-circus.js"},{"name":"icon-clothes-hanger","legacy":true,"path":"./icons/icon-clothes-hanger.js"},{"name":"icon-coin-dollar","legacy":true,"path":"./icons/icon-coin-dollar.js"},{"name":"icon-coin-pound","legacy":true,"path":"./icons/icon-coin-pound.js"},{"name":"icon-coin","legacy":true,"path":"./icons/icon-coin.js"},{"name":"icon-coins-dollar-alt","legacy":true,"path":"./icons/icon-coins-dollar-alt.js"},{"name":"icon-coins-dollar","legacy":true,"path":"./icons/icon-coins-dollar.js"},{"name":"icon-coins-euro-alt","legacy":true,"path":"./icons/icon-coins-euro-alt.js"},{"name":"icon-coins-euro","legacy":true,"path":"./icons/icon-coins-euro.js"},{"name":"icon-coins-pound-alt","legacy":true,"path":"./icons/icon-coins-pound-alt.js"},{"name":"icon-coins-pound","legacy":true,"path":"./icons/icon-coins-pound.js"},{"name":"icon-coins-yen-alt","legacy":true,"path":"./icons/icon-coins-yen-alt.js"},{"name":"icon-coins-yen","legacy":true,"path":"./icons/icon-coins-yen.js"},{"name":"icon-comb","legacy":true,"path":"./icons/icon-comb.js"},{"name":"icon-desk","legacy":true,"path":"./icons/icon-desk.js"},{"name":"icon-dollar-bag","legacy":true,"path":"./icons/icon-dollar-bag.js"},{"name":"icon-eject","legacy":true,"path":"./icons/icon-eject.js"},{"name":"icon-euro-bag","legacy":true,"path":"./icons/icon-euro-bag.js"},{"name":"icon-exit-fullscreen","legacy":true,"path":"./icons/icon-exit-fullscreen.js"},{"name":"icon-female-symbol","legacy":true,"path":"./icons/icon-female-symbol.js"},{"name":"icon-filter-arrows","legacy":true,"path":"./icons/icon-filter-arrows.js"},{"name":"icon-firewall","legacy":true,"path":"./icons/icon-firewall.js"},{"name":"icon-folder-open","legacy":true,"path":"./icons/icon-folder-open.js"},{"name":"icon-folder-outline","legacy":true,"path":"./icons/icon-folder-outline.js"},{"name":"icon-handprint","legacy":true,"path":"./icons/icon-handprint.js"},{"name":"icon-hat","legacy":true,"path":"./icons/icon-hat.js"},{"name":"icon-hd","legacy":true,"path":"./icons/icon-hd.js"},{"name":"icon-inactive-line","legacy":true,"path":"./icons/icon-inactive-line.js"},{"name":"icon-keychain","legacy":true,"path":"./icons/icon-keychain.js"},{"name":"icon-keyhole","legacy":true,"path":"./icons/icon-keyhole.js"},{"name":"icon-lightbulb-active","legacy":true,"path":"./icons/icon-lightbulb-active.js"},{"name":"icon-lightbulb","legacy":true,"path":"./icons/icon-lightbulb.js"},{"name":"icon-linux-tux","legacy":true,"path":"./icons/icon-linux-tux.js"},{"name":"icon-locate","legacy":true,"path":"./icons/icon-locate.js"},{"name":"icon-location-near-me","legacy":true,"path":"./icons/icon-location-near-me.js"},{"name":"icon-male-and-female","legacy":true,"path":"./icons/icon-male-and-female.js"},{"name":"icon-male-symbol","legacy":true,"path":"./icons/icon-male-symbol.js"},{"name":"icon-molecular-network","legacy":true,"path":"./icons/icon-molecular-network.js"},{"name":"icon-molecular","legacy":true,"path":"./icons/icon-molecular.js"},{"name":"icon-multiple-windows","legacy":true,"path":"./icons/icon-multiple-windows.js"},{"name":"icon-navigation-top","legacy":true,"path":"./icons/icon-navigation-top.js"},{"name":"icon-os-x","legacy":true,"path":"./icons/icon-os-x.js"},{"name":"icon-pants","legacy":true,"path":"./icons/icon-pants.js"},{"name":"icon-parachute-drop","legacy":true,"path":"./icons/icon-parachute-drop.js"},{"name":"icon-parental-control","legacy":true,"path":"./icons/icon-parental-control.js"},{"name":"icon-path","legacy":true,"path":"./icons/icon-path.js"},{"name":"icon-piracy","legacy":true,"path":"./icons/icon-piracy.js"},{"name":"icon-poker-chip","legacy":true,"path":"./icons/icon-poker-chip.js"},{"name":"icon-pound-bag","legacy":true,"path":"./icons/icon-pound-bag.js"},{"name":"icon-price-yen","legacy":true,"path":"./icons/icon-price-yen.js"},{"name":"icon-receipt-dollar","legacy":true,"path":"./icons/icon-receipt-dollar.js"},{"name":"icon-receipt-euro","legacy":true,"path":"./icons/icon-receipt-euro.js"},{"name":"icon-receipt-pound","legacy":true,"path":"./icons/icon-receipt-pound.js"},{"name":"icon-receipt-yen","legacy":true,"path":"./icons/icon-receipt-yen.js"},{"name":"icon-resize","legacy":true,"path":"./icons/icon-resize.js"},{"name":"icon-road","legacy":true,"path":"./icons/icon-road.js"},{"name":"icon-safe","legacy":true,"path":"./icons/icon-safe.js"},{"name":"icon-safedial","legacy":true,"path":"./icons/icon-safedial.js"},{"name":"icon-sandbox-toys","legacy":true,"path":"./icons/icon-sandbox-toys.js"},{"name":"icon-security-camera","legacy":true,"path":"./icons/icon-security-camera.js"},{"name":"icon-settings-alt-2","legacy":true,"path":"./icons/icon-settings-alt-2.js"},{"name":"icon-share-alt-2","legacy":true,"path":"./icons/icon-share-alt-2.js"},{"name":"icon-shorts","legacy":true,"path":"./icons/icon-shorts.js"},{"name":"icon-simcard","legacy":true,"path":"./icons/icon-simcard.js"},{"name":"icon-split-alt","legacy":true,"path":"./icons/icon-split-alt.js"},{"name":"icon-tab","legacy":true,"path":"./icons/icon-tab.js"},{"name":"icon-tactics","legacy":true,"path":"./icons/icon-tactics.js"},{"name":"icon-theif","legacy":true,"path":"./icons/icon-theif.js"},{"name":"icon-thought-bubble","legacy":true,"path":"./icons/icon-thought-bubble.js"},{"name":"icon-umb-contour","legacy":true,"path":"./icons/icon-umb-contour.js"},{"name":"icon-umb-deploy","legacy":true,"path":"./icons/icon-umb-deploy.js"},{"name":"icon-umb-members","legacy":true,"path":"./icons/icon-umb-members.js"},{"name":"icon-universal","legacy":true,"path":"./icons/icon-universal.js"},{"name":"icon-war","legacy":true,"path":"./icons/icon-war.js"},{"name":"icon-windows","legacy":true,"path":"./icons/icon-windows.js"},{"name":"icon-yen-bag","legacy":true,"path":"./icons/icon-yen-bag.js"}] \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/svgs/icon-twitter.svg b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/svgs/icon-twitter.svg new file mode 100644 index 0000000000..02f6e8c48b --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/svgs/icon-twitter.svg @@ -0,0 +1,5 @@ + + + + From 68ff40ba97b2da4b3c0f64d8607ce0eba24211f7 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Fri, 5 Apr 2024 16:19:11 +0200 Subject: [PATCH 125/280] use correct path to locate icons --- src/Umbraco.Web.UI.Client/devops/icons/index.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/devops/icons/index.js b/src/Umbraco.Web.UI.Client/devops/icons/index.js index 0835e420c5..909ee19094 100644 --- a/src/Umbraco.Web.UI.Client/devops/icons/index.js +++ b/src/Umbraco.Web.UI.Client/devops/icons/index.js @@ -6,7 +6,7 @@ const path = pathModule.default; const getDirName = path.dirname; const glob = globModule.default; -const moduleDirectory = 'src/shared/icon-registry'; +const moduleDirectory = 'src/packages/core/icon-registry'; const iconsOutputDirectory = `${moduleDirectory}/icons`; const umbracoSvgDirectory = `${moduleDirectory}/svgs`; const iconMapJson = `${moduleDirectory}/icon-dictionary.json`; @@ -31,7 +31,7 @@ const collectDictionaryIcons = async () => { // Lucide: fileJSON.lucide.forEach((iconDef) => { - if(iconDef.file && iconDef.name) { + if (iconDef.file && iconDef.name) { const path = lucideSvgDirectory + "/" + iconDef.file; try { @@ -90,7 +90,7 @@ const collectDictionaryIcons = async () => { // Umbraco: fileJSON.umbraco.forEach((iconDef) => { - if(iconDef.file && iconDef.name) { + if (iconDef.file && iconDef.name) { const path = umbracoSvgDirectory + "/" + iconDef.file; try { @@ -107,8 +107,8 @@ const collectDictionaryIcons = async () => { }; icons.push(icon); - } catch(e) { - console.log(`Could not load file: '${path}'`); + } catch (e) { + console.log(`[Umbraco] Could not load file: '${path}'`); } } }); @@ -136,7 +136,7 @@ const collectDiskIcons = async (icons) => { const iconName = iconFileName; // Only append not already defined icons: - if(!icons.find(x => x.name === iconName)) { + if (!icons.find(x => x.name === iconName)) { const icon = { name: iconName, From 12624b76604b330e8da000f0cb9e667a77d5a560 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Fri, 5 Apr 2024 16:20:44 +0200 Subject: [PATCH 126/280] use umbraco's icon for its provider --- .../src/packages/core/auth/providers/manifests.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/auth/providers/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/auth/providers/manifests.ts index f1f2f89b41..5c8e7dc2de 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/auth/providers/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/auth/providers/manifests.ts @@ -10,6 +10,7 @@ export const manifests: Array = [ meta: { label: 'Sign in with Umbraco', defaultView: { + icon: 'icon-umbraco', look: 'primary', }, }, From ef49a07e391056415f3ed5025a9f272c1c244482 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Fri, 5 Apr 2024 16:32:12 +0200 Subject: [PATCH 127/280] add fill="currentColor" to the umbraco icon --- .../src/packages/core/icon-registry/icons/icon-umbraco.js | 8 +++++--- .../src/packages/core/icon-registry/svgs/icon-umbraco.svg | 7 ++++--- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-umbraco.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-umbraco.js index 268d9f441c..1bcdcda9fc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-umbraco.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-umbraco.js @@ -1,3 +1,5 @@ -export default ` - -`; \ No newline at end of file +export default ` + + +`; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/svgs/icon-umbraco.svg b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/svgs/icon-umbraco.svg index 0e121eebf3..1e69d80a4b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/svgs/icon-umbraco.svg +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/svgs/icon-umbraco.svg @@ -1,3 +1,4 @@ - - - \ No newline at end of file + + + From 74724a079e8b5dbcb52518b0a1e4d0e6abcdfb10 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Fri, 5 Apr 2024 16:33:18 +0200 Subject: [PATCH 128/280] use the name property for icons --- .../core/auth/components/auth-provider-default.element.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/auth/components/auth-provider-default.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/auth/components/auth-provider-default.element.ts index 8c30b32f48..91a4faca9b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/auth/components/auth-provider-default.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/auth/components/auth-provider-default.element.ts @@ -21,7 +21,7 @@ export class UmbAuthProviderDefaultElement extends UmbLitElement { .look=${this.manifest.meta?.defaultView?.look ?? 'outline'} .color=${this.manifest.meta?.defaultView?.color ?? 'default'}> ${this.manifest.meta?.defaultView?.icon - ? html`` + ? html`` : nothing} ${this.manifest.meta?.label ?? this.manifest.forProviderName}
From 465843233fbdec41d778ff96f9e012d37380b323 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Fri, 5 Apr 2024 16:34:08 +0200 Subject: [PATCH 129/280] dont store the references to the icon registries --- src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) 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 80be3c84e1..d502c4a487 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 @@ -75,8 +75,6 @@ export class UmbAppElement extends UmbLitElement { ]; #authContext?: typeof UMB_AUTH_CONTEXT.TYPE; - #umbIconRegistry = new UmbIconRegistry(); - #uuiIconRegistry = new UUIIconRegistryEssential(); #serverConnection?: UmbServerConnection; #authController?: UmbAppAuthController; @@ -85,14 +83,14 @@ export class UmbAppElement extends UmbLitElement { OpenAPI.BASE = window.location.origin; + new UmbIconRegistry().attach(this); + new UUIIconRegistryEssential().attach(this); + new UmbContextDebugController(this); new UmbBundleExtensionInitializer(this, umbExtensionsRegistry); new UmbEntryPointExtensionInitializer(this, umbExtensionsRegistry); - this.#umbIconRegistry.attach(this); - this.#uuiIconRegistry.attach(this); - umbExtensionsRegistry.registerMany(coreExtensions); } From dcee2672471a2bae46e1526b2b5cb7a502f4146f Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Fri, 5 Apr 2024 16:34:17 +0200 Subject: [PATCH 130/280] change mock background slightly --- src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts b/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts index 518f62d1ff..9fed38ab05 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts @@ -96,7 +96,7 @@ export class UmbAppAuthController extends UmbControllerBase { }, modal: { backdropBackground: this.#firstTimeLoggingIn - ? "url('https://picsum.photos/1440') center center / cover no-repeat" + ? "url('https://picsum.photos/1440?grayscale&blur=2') center center / cover no-repeat" : 'rgb(0, 0, 0)', }, }) From 917da25555cd3ab96f6efa6031a9ba194a65b4dc Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Fri, 5 Apr 2024 16:44:09 +0200 Subject: [PATCH 131/280] add interface to control props of a provider element --- .../auth-provider-default.element.ts | 4 ++-- .../src/packages/core/auth/types.ts | 21 +++++++++++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/auth/components/auth-provider-default.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/auth/components/auth-provider-default.element.ts index 91a4faca9b..eecf6bee2c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/auth/components/auth-provider-default.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/auth/components/auth-provider-default.element.ts @@ -4,12 +4,12 @@ import { UmbTextStyles } from '../../style/index.js'; import { css, customElement, html, nothing, property } from '@umbraco-cms/backoffice/external/lit'; @customElement('umb-auth-provider-default') -export class UmbAuthProviderDefaultElement extends UmbLitElement { +export class UmbAuthProviderDefaultElement extends UmbLitElement implements UmbAuthProviderDefaultProps { @property({ attribute: false }) manifest!: ManifestAuthProvider; @property({ attribute: false }) - onSubmit!: (providerName: string) => void; + onSubmit!: (providerName: string, loginHint?: string) => void; render() { return html` diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/auth/types.ts b/src/Umbraco.Web.UI.Client/src/packages/core/auth/types.ts index d1933d0607..7074b49380 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/auth/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/auth/types.ts @@ -1,5 +1,26 @@ +import type { ManifestAuthProvider } from '../extension-registry/index.js'; + /** * User login state that can be used to determine the current state of the user. * @example 'loggedIn' */ export type UmbUserLoginState = 'loggingIn' | 'loggedOut' | 'timedOut'; + +export interface UmbAuthProviderDefaultProps { + /** + * The manifest for the registered provider. + */ + manifest?: ManifestAuthProvider; + + /** + * The current user login state. + */ + userLoginState?: UmbUserLoginState; + + /** + * Callback that is called when the user selects a provider. + * @param providerName The name of the provider that the user selected. + * @param loginHint The login hint to use for login if available. + */ + onSubmit: (providerName: string, loginHint?: string) => void; +} From 8d986aaa827e793904e8c1b33b743b61492e2b73 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Fri, 5 Apr 2024 16:44:28 +0200 Subject: [PATCH 132/280] use a `part` attribute to style gap between providers --- .../core/auth/components/auth-provider-default.element.ts | 7 ++++++- .../core/auth/modals/umb-app-auth-modal.element.ts | 4 ++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/auth/components/auth-provider-default.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/auth/components/auth-provider-default.element.ts index eecf6bee2c..2b93881d87 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/auth/components/auth-provider-default.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/auth/components/auth-provider-default.element.ts @@ -1,4 +1,5 @@ import type { ManifestAuthProvider } from '../../index.js'; +import type { UmbAuthProviderDefaultProps } from '../types.js'; import { UmbLitElement } from '../../lit-element/lit-element.element.js'; import { UmbTextStyles } from '../../style/index.js'; import { css, customElement, html, nothing, property } from '@umbraco-cms/backoffice/external/lit'; @@ -11,6 +12,11 @@ export class UmbAuthProviderDefaultElement extends UmbLitElement implements UmbA @property({ attribute: false }) onSubmit!: (providerName: string, loginHint?: string) => void; + connectedCallback(): void { + super.connectedCallback(); + this.setAttribute('part', 'auth-provider-default'); + } + render() { return html` Date: Fri, 5 Apr 2024 16:45:56 +0200 Subject: [PATCH 133/280] use flex to style the provider column --- .../packages/core/auth/modals/umb-app-auth-modal.element.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.element.ts index 1516c92e96..2db0be78a8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.element.ts @@ -43,8 +43,10 @@ export class UmbAppAuthModalElement extends UmbModalBaseElement Date: Fri, 5 Apr 2024 17:19:34 +0200 Subject: [PATCH 134/280] update handlers --- .../src/mocks/handlers/manifests.handlers.ts | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/manifests.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/manifests.handlers.ts index df03f8cffd..d0ee368388 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/manifests.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/manifests.handlers.ts @@ -4,7 +4,7 @@ import type { PackageManifestResponse } from '../../packages/packages/types.js'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; export const manifestDevelopmentHandlers = [ - rest.get(umbracoPath('/package/manifest'), (_req, res, ctx) => { + rest.get(umbracoPath('/manifest/manifest/private'), (_req, res, ctx) => { return res( // Respond with a 200 status code ctx.status(200), @@ -94,7 +94,7 @@ export const manifestDevelopmentHandlers = [ ]), ); }), - rest.get(umbracoPath('/package/manifest/public'), (_req, res, ctx) => { + rest.get(umbracoPath('/manifest/manifest/public'), (_req, res, ctx) => { return res( ctx.status(200), ctx.json([ @@ -112,14 +112,16 @@ export const manifestDevelopmentHandlers = [ }, { type: 'authProvider', - alias: 'My.AUthProvider.Github', + alias: 'My.AuthProvider.Github', name: 'My Github Auth Provider', forProviderName: 'Umbraco.Github', meta: { - label: 'Use Github!', - look: 'primary', - icon: 'icon-github', - color: 'success', + label: 'GitHub', + defaultView: { + look: 'primary', + icon: 'icon-github', + color: 'success', + }, }, }, ], @@ -130,10 +132,10 @@ export const manifestDevelopmentHandlers = [ ]; export const manifestEmptyHandlers = [ - rest.get(umbracoPath('/package/manifest'), (_req, res, ctx) => { + rest.get(umbracoPath('/manifest/manifest/private'), (_req, res, ctx) => { return res(ctx.status(200), ctx.json([])); }), - rest.get(umbracoPath('/package/manifest/public'), (_req, res, ctx) => { + rest.get(umbracoPath('/manifest/manifest/public'), (_req, res, ctx) => { return res(ctx.status(200), ctx.json([])); }), ]; From 54f5a4c0ecd30a32dd721eb3248f77af7c16d778 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Fri, 5 Apr 2024 17:19:44 +0200 Subject: [PATCH 135/280] add fallback variable to backdrop --- src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts b/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts index 9fed38ab05..f629ea9ac1 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts @@ -96,8 +96,8 @@ export class UmbAppAuthController extends UmbControllerBase { }, modal: { backdropBackground: this.#firstTimeLoggingIn - ? "url('https://picsum.photos/1440?grayscale&blur=2') center center / cover no-repeat" - : 'rgb(0, 0, 0)', + ? "var(--umb-auth-backdrop, url('https://picsum.photos/1440?grayscale&blur=2') center center / cover no-repeat)" + : 'var(--umb-auth-backdrop-timedout, rgb(0, 0, 0))', }, }) .onSubmit() From f28592bef779d6fb3065050b699ced7262a076db Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Fri, 5 Apr 2024 17:20:11 +0200 Subject: [PATCH 136/280] update api types --- .../src/apps/backoffice/backoffice.element.ts | 2 +- .../src/external/backend-api/src/index.ts | 5 +- ...ponseModel.ts => ManifestResponseModel.ts} | 2 +- .../models/VerifyInviteUserResponseModel.ts | 11 ++++ .../VerifyResetPasswordResponseModel.ts | 11 ++++ .../src/services/ManifestResource.ts | 52 +++++++++++++++++++ .../src/services/PackageResource.ts | 26 ---------- .../src/services/SecurityResource.ts | 5 +- .../backend-api/src/services/UserResource.ts | 7 ++- ...server-extension-registrator.controller.ts | 24 ++++++--- .../src/packages/packages/types.ts | 4 +- 11 files changed, 104 insertions(+), 45 deletions(-) rename src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/{PackageManifestResponseModel.ts => ManifestResponseModel.ts} (82%) create mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/VerifyInviteUserResponseModel.ts create mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/VerifyResetPasswordResponseModel.ts create mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/ManifestResource.ts 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 ae2d293e3e..a0d998a91f 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 @@ -41,7 +41,7 @@ export class UmbBackofficeElement extends UmbLitElement { super(); new UmbBackofficeContext(this); - new UmbServerExtensionRegistrator(this, umbExtensionsRegistry).registerAllExtensions(); + new UmbServerExtensionRegistrator(this, umbExtensionsRegistry).registerPrivateExtensions(); // So far local packages are this simple to registerer, so no need for a manager to do that: CORE_PACKAGES.forEach(async (packageImport) => { 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 2c78b0aa5e..d225cf8c87 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 @@ -195,6 +195,7 @@ 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 { ManifestResponseModel } from './models/ManifestResponseModel'; export type { MediaCollectionResponseModel } from './models/MediaCollectionResponseModel'; export type { MediaConfigurationResponseModel } from './models/MediaConfigurationResponseModel'; export type { MediaItemResponseModel } from './models/MediaItemResponseModel'; @@ -255,7 +256,6 @@ export type { OutOfDateStatusResponseModel } from './models/OutOfDateStatusRespo 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'; @@ -461,6 +461,8 @@ export type { VariantItemResponseModelBaseModel } from './models/VariantItemResp export type { VariantModelBaseModel } from './models/VariantModelBaseModel'; export type { VariantResponseModelBaseModel } from './models/VariantResponseModelBaseModel'; export type { VerifyInviteUserRequestModel } from './models/VerifyInviteUserRequestModel'; +export type { VerifyInviteUserResponseModel } from './models/VerifyInviteUserResponseModel'; +export type { VerifyResetPasswordResponseModel } from './models/VerifyResetPasswordResponseModel'; export type { VerifyResetPasswordTokenRequestModel } from './models/VerifyResetPasswordTokenRequestModel'; export type { WebhookEventResponseModel } from './models/WebhookEventResponseModel'; export type { WebhookItemResponseModel } from './models/WebhookItemResponseModel'; @@ -482,6 +484,7 @@ export { IndexerResource } from './services/IndexerResource'; export { InstallResource } from './services/InstallResource'; export { LanguageResource } from './services/LanguageResource'; export { LogViewerResource } from './services/LogViewerResource'; +export { ManifestResource } from './services/ManifestResource'; export { MediaResource } from './services/MediaResource'; export { MediaTypeResource } from './services/MediaTypeResource'; export { MemberResource } from './services/MemberResource'; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PackageManifestResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ManifestResponseModel.ts similarity index 82% rename from src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PackageManifestResponseModel.ts rename to src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ManifestResponseModel.ts index c247a475af..792e0482bb 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PackageManifestResponseModel.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ManifestResponseModel.ts @@ -3,7 +3,7 @@ /* tslint:disable */ /* eslint-disable */ -export type PackageManifestResponseModel = { +export type ManifestResponseModel = { name: string; version?: string | null; extensions: Array; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/VerifyInviteUserResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/VerifyInviteUserResponseModel.ts new file mode 100644 index 0000000000..cc7f102b7f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/VerifyInviteUserResponseModel.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 VerifyInviteUserResponseModel = { + passwordConfiguration: PasswordConfigurationResponseModel; +}; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/VerifyResetPasswordResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/VerifyResetPasswordResponseModel.ts new file mode 100644 index 0000000000..1c80084a94 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/VerifyResetPasswordResponseModel.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 VerifyResetPasswordResponseModel = { + passwordConfiguration: PasswordConfigurationResponseModel; +}; + diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/ManifestResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/ManifestResource.ts new file mode 100644 index 0000000000..a206603b17 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/ManifestResource.ts @@ -0,0 +1,52 @@ +/* generated using openapi-typescript-codegen -- do no edit */ +/* istanbul ignore file */ +/* tslint:disable */ +/* eslint-disable */ +import type { ManifestResponseModel } from '../models/ManifestResponseModel'; + +import type { CancelablePromise } from '../core/CancelablePromise'; +import { OpenAPI } from '../core/OpenAPI'; +import { request as __request } from '../core/request'; + +export class ManifestResource { + + /** + * @returns any Success + * @throws ApiError + */ + public static getManifestManifest(): CancelablePromise> { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/manifest/manifest', + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static getManifestManifestPrivate(): CancelablePromise> { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/manifest/manifest/private', + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static getManifestManifestPublic(): CancelablePromise> { + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/manifest/manifest/public', + }); + } + +} 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 9e35f2a517..e55cffe247 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 @@ -5,7 +5,6 @@ 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'; import type { PagedPackageMigrationStatusResponseModel } from '../models/PagedPackageMigrationStatusResponseModel'; import type { UpdatePackageRequestModel } from '../models/UpdatePackageRequestModel'; @@ -195,31 +194,6 @@ export class PackageResource { }); } - /** - * @returns any Success - * @throws ApiError - */ - public static getPackageManifest(): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/package/manifest', - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getPackageManifestPublic(): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/package/manifest/public', - }); - } - /** * @returns PagedPackageMigrationStatusResponseModel Success * @throws ApiError 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 f229959ef2..3424b9b118 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 @@ -5,6 +5,7 @@ import type { ResetPasswordRequestModel } from '../models/ResetPasswordRequestModel'; import type { ResetPasswordTokenRequestModel } from '../models/ResetPasswordTokenRequestModel'; import type { SecurityConfigurationResponseModel } from '../models/SecurityConfigurationResponseModel'; +import type { VerifyResetPasswordResponseModel } from '../models/VerifyResetPasswordResponseModel'; import type { VerifyResetPasswordTokenRequestModel } from '../models/VerifyResetPasswordTokenRequestModel'; import type { CancelablePromise } from '../core/CancelablePromise'; @@ -72,14 +73,14 @@ export class SecurityResource { } /** - * @returns void + * @returns any Success * @throws ApiError */ public static postSecurityForgotPasswordVerify({ requestBody, }: { requestBody?: (VerifyResetPasswordTokenRequestModel | ResetPasswordTokenRequestModel), - }): CancelablePromise { + }): CancelablePromise { return __request(OpenAPI, { method: 'POST', url: '/umbraco/management/api/v1/security/forgot-password/verify', 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 18a940811c..a5f3578e4a 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 @@ -31,6 +31,7 @@ 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 { VerifyInviteUserResponseModel } from '../models/VerifyInviteUserResponseModel'; import type { CancelablePromise } from '../core/CancelablePromise'; import { OpenAPI } from '../core/OpenAPI'; @@ -755,7 +756,6 @@ export class UserResource { responseHeader: 'Umb-Notifications', errors: { 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, 404: `Not Found`, }, }); @@ -785,20 +785,19 @@ export class UserResource { } /** - * @returns string Success + * @returns any Success * @throws ApiError */ public static postUserInviteVerify({ requestBody, }: { requestBody?: (VerifyInviteUserRequestModel | CreateInitialPasswordUserRequestModel), - }): CancelablePromise { + }): CancelablePromise { return __request(OpenAPI, { method: 'POST', url: '/umbraco/management/api/v1/user/invite/verify', body: requestBody, mediaType: 'application/json', - responseHeader: 'Umb-Notifications', errors: { 400: `Bad Request`, 404: `Not Found`, diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/server-extension-registrator.controller.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/server-extension-registrator.controller.ts index c663868854..a20359fd72 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/server-extension-registrator.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/server-extension-registrator.controller.ts @@ -1,10 +1,6 @@ import type { ManifestBase } from '../types/index.js'; import { isManifestBaseType } from '../type-guards/index.js'; -import { - PackageResource, - OpenAPI, - type PackageManifestResponseModel, -} from '@umbraco-cms/backoffice/external/backend-api'; +import { OpenAPI, ManifestResource, type ManifestResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import type { UmbBackofficeExtensionRegistry } from '@umbraco-cms/backoffice/extension-registry'; @@ -26,7 +22,19 @@ export class UmbServerExtensionRegistrator extends UmbControllerBase { * @remark Users must have the BACKOFFICE_ACCESS permission to access this method. */ public async registerAllExtensions() { - const { data: packages } = await tryExecuteAndNotify(this, PackageResource.getPackageManifest()); + const { data: packages } = await tryExecuteAndNotify(this, ManifestResource.getManifestManifest()); + if (packages) { + await this.#loadServerPackages(packages); + } + } + + /** + * Registers all private extensions from the server. + * This is used to register all private extensions that are available to the user. + * @remark Users must have the BACKOFFICE_ACCESS permission to access this method. + */ + public async registerPrivateExtensions() { + const { data: packages } = await tryExecuteAndNotify(this, ManifestResource.getManifestManifestPrivate()); if (packages) { await this.#loadServerPackages(packages); } @@ -38,13 +46,13 @@ export class UmbServerExtensionRegistrator extends UmbControllerBase { * @remark Any user can access this method without any permissions. */ public async registerPublicExtensions() { - const { data: packages } = await tryExecuteAndNotify(this, PackageResource.getPackageManifestPublic()); + const { data: packages } = await tryExecuteAndNotify(this, ManifestResource.getManifestManifestPublic()); if (packages) { await this.#loadServerPackages(packages); } } - async #loadServerPackages(packages: PackageManifestResponseModel[]) { + async #loadServerPackages(packages: ManifestResponseModel[]) { const extensions: ManifestBase[] = []; packages.forEach((p) => { diff --git a/src/Umbraco.Web.UI.Client/src/packages/packages/types.ts b/src/Umbraco.Web.UI.Client/src/packages/packages/types.ts index 93ebce7414..e628d84d15 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/packages/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/packages/types.ts @@ -1,6 +1,6 @@ -import type { PackageManifestResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; +import type { ManifestResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; -export type UmbPackage = PackageManifestResponseModel; +export type UmbPackage = ManifestResponseModel; export type PackageManifestResponse = UmbPackage[]; From 8dc6c706d719b8dff135b7501eee12424e97fc67 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Sat, 6 Apr 2024 22:37:20 +0200 Subject: [PATCH 137/280] update constants --- .../documents/user-permissions/constants.ts | 31 +++++++++---------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/constants.ts index b33399bf8f..6b789bd308 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/constants.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/constants.ts @@ -1,16 +1,15 @@ -export const UMB_USER_PERMISSION_DOCUMENT_CREATE = 'Umb.UserPermission.Document.Create'; -export const UMB_USER_PERMISSION_DOCUMENT_READ = 'Umb.UserPermission.Document.Read'; -export const UMB_USER_PERMISSION_DOCUMENT_UPDATE = 'Umb.UserPermission.Document.Update'; -export const UMB_USER_PERMISSION_DOCUMENT_DELETE = 'Umb.UserPermission.Document.Delete'; -export const UMB_USER_PERMISSION_DOCUMENT_CREATE_BLUEPRINT = 'Umb.UserPermission.Document.CreateBlueprint'; -export const UMB_USER_PERMISSION_DOCUMENT_NOTIFICATIONS = 'Umb.UserPermission.Document.Notifications'; -export const UMB_USER_PERMISSION_DOCUMENT_PUBLISH = 'Umb.UserPermission.Document.Publish'; -export const UMB_USER_PERMISSION_DOCUMENT_PERMISSIONS = 'Umb.UserPermission.Document.Permissions'; -export const UMB_USER_PERMISSION_DOCUMENT_SEND_FOR_APPROVAL = 'Umb.UserPermission.Document.SendForApproval'; -export const UMB_USER_PERMISSION_DOCUMENT_UNPUBLISH = 'Umb.UserPermission.Document.Unpublish'; -export const UMB_USER_PERMISSION_DOCUMENT_DUPLICATE = 'Umb.UserPermission.Document.Duplicate'; -export const UMB_USER_PERMISSION_DOCUMENT_MOVE = 'Umb.UserPermission.Document.Move'; -export const UMB_USER_PERMISSION_DOCUMENT_SORT = 'Umb.UserPermission.Document.Sort'; -export const UMB_USER_PERMISSION_DOCUMENT_CULTURE_AND_HOSTNAMES = 'Umb.UserPermission.Document.CultureAndHostnames'; -export const UMB_USER_PERMISSION_DOCUMENT_PUBLIC_ACCESS = 'Umb.UserPermission.Document.PublicAccess'; -export const UMB_USER_PERMISSION_DOCUMENT_ROLLBACK = 'Umb.UserPermission.Document.Rollback'; +export const UMB_USER_PERMISSION_DOCUMENT_CREATE = 'Umb.Document.Create'; +export const UMB_USER_PERMISSION_DOCUMENT_READ = 'Umb.Document.Read'; +export const UMB_USER_PERMISSION_DOCUMENT_UPDATE = 'Umb.Document.Update'; +export const UMB_USER_PERMISSION_DOCUMENT_DELETE = 'Umb.Document.Delete'; +export const UMB_USER_PERMISSION_DOCUMENT_CREATE_BLUEPRINT = 'Umb.Document.CreateBlueprint'; +export const UMB_USER_PERMISSION_DOCUMENT_NOTIFICATIONS = 'Umb.Document.Notifications'; +export const UMB_USER_PERMISSION_DOCUMENT_PUBLISH = 'Umb.Document.Publish'; +export const UMB_USER_PERMISSION_DOCUMENT_PERMISSIONS = 'Umb.Document.Permissions'; +export const UMB_USER_PERMISSION_DOCUMENT_UNPUBLISH = 'Umb.Document.Unpublish'; +export const UMB_USER_PERMISSION_DOCUMENT_DUPLICATE = 'Umb.Document.Duplicate'; +export const UMB_USER_PERMISSION_DOCUMENT_MOVE = 'Umb.Document.Move'; +export const UMB_USER_PERMISSION_DOCUMENT_SORT = 'Umb.Document.Sort'; +export const UMB_USER_PERMISSION_DOCUMENT_CULTURE_AND_HOSTNAMES = 'Umb.Document.CultureAndHostnames'; +export const UMB_USER_PERMISSION_DOCUMENT_PUBLIC_ACCESS = 'Umb.Document.PublicAccess'; +export const UMB_USER_PERMISSION_DOCUMENT_ROLLBACK = 'Umb.Document.Rollback'; From 9fd36fa334cb3d3d8832845e42ca52ba07214bf7 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Sat, 6 Apr 2024 22:38:41 +0200 Subject: [PATCH 138/280] implement document user permission condition --- .../document-user-permission.condition.ts | 91 +++++++++++++++++++ .../documents/user-permissions/manifests.ts | 3 +- .../documents/user-permissions/utils.ts | 10 ++ .../user/user-permission/conditions/index.ts | 1 - .../conditions/user-permission.condition.ts | 45 --------- .../packages/user/user-permission/index.ts | 1 - .../user/user-permission/manifests.ts | 3 +- 7 files changed, 104 insertions(+), 50 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-user-permission.condition.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/utils.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/user/user-permission/conditions/index.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/user/user-permission/conditions/user-permission.condition.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-user-permission.condition.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-user-permission.condition.ts new file mode 100644 index 0000000000..b9b0d62a56 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-user-permission.condition.ts @@ -0,0 +1,91 @@ +import { UMB_ENTITY_CONTEXT } from '@umbraco-cms/backoffice/entity'; +import { UMB_CURRENT_USER_CONTEXT } from '../../../user/current-user/current-user.context.js'; +import { isDocumentUserPermission } from './utils.js'; +import { observeMultiple } from '@umbraco-cms/backoffice/observable-api'; +import { UmbConditionBase } from '@umbraco-cms/backoffice/extension-registry'; +import type { + ManifestCondition, + UmbConditionConfigBase, + UmbConditionControllerArguments, + UmbExtensionCondition, +} from '@umbraco-cms/backoffice/extension-api'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import type { DocumentPermissionPresentationModel } from '@umbraco-cms/backoffice/external/backend-api'; + +export class UmbDocumentUserPermissionCondition + extends UmbConditionBase + implements UmbExtensionCondition +{ + #entityType: string | undefined; + #unique: string | null | undefined; + #documentPermissions: Array = []; + #fallbackPermissions: string[] = []; + + constructor( + host: UmbControllerHost, + args: UmbConditionControllerArguments, + ) { + super(host, args); + + this.consumeContext(UMB_CURRENT_USER_CONTEXT, (context) => { + this.observe( + context.currentUser, + (currentUser) => { + this.#documentPermissions = currentUser?.permissions?.filter(isDocumentUserPermission) || []; + this.#fallbackPermissions = currentUser?.fallbackPermissions || []; + this.#isAllowed(); + }, + 'umbUserPermissionConditionObserver', + ); + }); + + this.consumeContext(UMB_ENTITY_CONTEXT, (context) => { + if (!context) return; + + this.observe( + observeMultiple([context.entityType, context.unique]), + ([entityType, unique]) => { + this.#entityType = entityType; + this.#unique = unique; + this.#isAllowed(); + }, + 'umbUserPermissionEntityContextObserver', + ); + }); + } + + #isAllowed() { + if (!this.#entityType) return; + if (this.#unique === undefined) return; + + let verbs: Array = []; + + if (this.#documentPermissions) { + const permissionsForCurrentDocument = this.#documentPermissions.find( + (permission) => permission.document.id === this.#unique, + ); + const currentDocumentVerbs = permissionsForCurrentDocument ? permissionsForCurrentDocument.verbs : []; + verbs = this.#fallbackPermissions.concat(currentDocumentVerbs); + } + + this.permitted = verbs.includes(this.config.match); + } +} + +export type UmbDocumentUserPermissionConditionConfig = + UmbConditionConfigBase<'Umb.Condition.UserPermission.Document'> & { + /** + * + * + * @example + * "Umb.Document.Create" + */ + match: string; + }; + +export const manifest: ManifestCondition = { + type: 'condition', + name: 'Document User Permission Condition', + alias: 'Umb.Condition.UserPermission.Document', + api: UmbDocumentUserPermissionCondition, +}; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/manifests.ts index 1fc1880cb9..be5dfcfca7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/manifests.ts @@ -17,6 +17,7 @@ import { UMB_USER_PERMISSION_DOCUMENT_ROLLBACK, } from './constants.js'; import { manifests as repositoryManifests } from './repository/manifests.js'; +import { manifest as conditionManifest } from './document-user-permission.condition.js'; import type { ManifestGranularUserPermission, ManifestEntityUserPermission, @@ -211,4 +212,4 @@ export const granularPermissions: Array = [ }, ]; -export const manifests = [...repositoryManifests, ...permissions, ...granularPermissions]; +export const manifests = [...repositoryManifests, ...permissions, ...granularPermissions, conditionManifest]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/utils.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/utils.ts new file mode 100644 index 0000000000..f49a1d73eb --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/utils.ts @@ -0,0 +1,10 @@ +import type { + DocumentPermissionPresentationModel, + UnknownTypePermissionPresentationModel, +} from '@umbraco-cms/backoffice/external/backend-api'; + +export function isDocumentUserPermission( + permission: DocumentPermissionPresentationModel | UnknownTypePermissionPresentationModel, +): permission is DocumentPermissionPresentationModel { + return (permission as DocumentPermissionPresentationModel).$type === 'DocumentPermissionPresentationModel'; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/conditions/index.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/conditions/index.ts deleted file mode 100644 index 64b786466c..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/conditions/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from './user-permission.condition.js'; 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 deleted file mode 100644 index b8074b9fdc..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/conditions/user-permission.condition.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { UMB_CURRENT_USER_CONTEXT } from '../../current-user/current-user.context.js'; -import { UmbConditionBase } from '@umbraco-cms/backoffice/extension-registry'; -import type { - ManifestCondition, - UmbConditionConfigBase, - UmbConditionControllerArguments, - UmbExtensionCondition, -} from '@umbraco-cms/backoffice/extension-api'; -import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; - -export class UmbUserPermissionCondition - extends UmbConditionBase - implements UmbExtensionCondition -{ - constructor(host: UmbControllerHost, args: UmbConditionControllerArguments) { - super(host, args); - - this.consumeContext(UMB_CURRENT_USER_CONTEXT, (context) => { - this.observe( - context.currentUser, - (currentUser) => { - //this.permitted = currentUser?.permissions?.includes(this.config.match) || false; - }, - 'umbUserPermissionConditionObserver', - ); - }); - } -} - -export type UserPermissionConditionConfig = UmbConditionConfigBase<'Umb.Condition.UserPermission'> & { - /** - * - * - * @example - * "Umb.UserPermission.Document.Create" - */ - match: string; -}; - -export const manifest: ManifestCondition = { - type: 'condition', - name: 'User Permission Condition', - alias: 'Umb.Condition.UserPermission', - api: UmbUserPermissionCondition, -}; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/index.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/index.ts index 33baabfff8..85f5141999 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/index.ts @@ -1,4 +1,3 @@ export * from './components/index.js'; -export * from './conditions/index.js'; export type { UmbUserPermissionModel } from './types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/manifests.ts index 3cdcdd9998..93d3d11fab 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/manifests.ts @@ -1,4 +1,3 @@ -import { manifest as userPermissionConditionManifest } from './conditions/user-permission.condition.js'; import { manifests as userPermissionModalManifests } from './modals/manifests.js'; -export const manifests = [userPermissionConditionManifest, ...userPermissionModalManifests]; +export const manifests = [...userPermissionModalManifests]; From db9b4b0154a5a0e8c203c97cd934384b65f252a1 Mon Sep 17 00:00:00 2001 From: JesmoDev <26099018+JesmoDev@users.noreply.github.com> Date: Mon, 8 Apr 2024 02:02:04 +0200 Subject: [PATCH 139/280] add diff --- src/Umbraco.Web.UI.Client/package-lock.json | 14 +++-- src/Umbraco.Web.UI.Client/package.json | 2 + .../modals/rollback/rollback-modal.element.ts | 54 ++++++++++++++++++- 3 files changed, 64 insertions(+), 6 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/package-lock.json b/src/Umbraco.Web.UI.Client/package-lock.json index 9147e5302e..95071cc1b8 100644 --- a/src/Umbraco.Web.UI.Client/package-lock.json +++ b/src/Umbraco.Web.UI.Client/package-lock.json @@ -10,10 +10,12 @@ "license": "MIT", "dependencies": { "@openid/appauth": "^1.3.1", + "@types/diff": "^5.0.9", "@types/dompurify": "^3.0.5", "@types/uuid": "^9.0.8", "@umbraco-ui/uui": "1.7.2", "@umbraco-ui/uui-css": "1.7.2", + "diff": "^5.2.0", "dompurify": "^3.0.9", "element-internals-polyfill": "^1.3.10", "lit": "^3.1.2", @@ -6019,6 +6021,11 @@ "integrity": "sha512-Rf3/lB9WkDfIL9eEKaSYKc+1L/rNVYBjThk22JTqQw0YozXarX8YljFAz+HCoC6h4B4KwCMsBPZHaFezwT4BNA==", "dev": true }, + "node_modules/@types/diff": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/@types/diff/-/diff-5.0.9.tgz", + "integrity": "sha512-RWVEhh/zGXpAVF/ZChwNnv7r4rvqzJ7lYNSmZSVTxjV0PBLf6Qu7RNg+SUtkpzxmiNkjCx0Xn2tPp7FIkshJwQ==" + }, "node_modules/@types/doctrine": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz", @@ -10517,10 +10524,9 @@ "dev": true }, "node_modules/diff": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", - "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", - "dev": true, + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", + "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", "engines": { "node": ">=0.3.1" } diff --git a/src/Umbraco.Web.UI.Client/package.json b/src/Umbraco.Web.UI.Client/package.json index b8c968c82c..f62beb7f4c 100644 --- a/src/Umbraco.Web.UI.Client/package.json +++ b/src/Umbraco.Web.UI.Client/package.json @@ -164,10 +164,12 @@ }, "dependencies": { "@openid/appauth": "^1.3.1", + "@types/diff": "^5.0.9", "@types/dompurify": "^3.0.5", "@types/uuid": "^9.0.8", "@umbraco-ui/uui": "1.7.2", "@umbraco-ui/uui-css": "1.7.2", + "diff": "^5.2.0", "dompurify": "^3.0.9", "element-internals-polyfill": "^1.3.10", "lit": "^3.1.2", diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts index f1abfaa2eb..6ed50fe42e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts @@ -10,6 +10,9 @@ import { UMB_PROPERTY_DATASET_CONTEXT } from '@umbraco-cms/backoffice/property'; import type { UUISelectEvent } from '@umbraco-cms/backoffice/external/uui'; import { UMB_VARIANT_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; +import { diffWords } from 'diff'; +import { UMB_DOCUMENT_WORKSPACE_CONTEXT, UmbDocumentWorkspaceContext } from '../../workspace/index.js'; + type DocumentVersion = { id: string; date: string; @@ -47,6 +50,8 @@ export class UmbRollbackModalElement extends UmbModalBaseElement { + this.#workspaceContext = instance; + }); + this.consumeContext(UMB_VARIANT_WORKSPACE_CONTEXT, (instance) => { this.#variantWorkspaceContext = instance; @@ -216,14 +225,49 @@ export class UmbRollbackModalElement extends UmbModalBaseElement) ?? []; + + draftValues = draftValues.filter((x) => x.culture === this.currentCulture); + + const diffs = this.currentVersion.properties.map((item) => { + const draftValue = draftValues.find((x) => x.alias === item.alias); + + if (!draftValue) return; + + const draftValueString = trimQuotes(JSON.stringify(draftValue.value)); + const versionValueString = trimQuotes(JSON.stringify(item.value)); + + const diff = diffWords(draftValueString, versionValueString); + return { alias: item.alias, diff }; + }); + + function trimQuotes(str: string): string { + return str.replace(/^['"]|['"]$/g, ''); + } + return html` -
+

name: ${this.currentVersion.name}

${repeat( this.currentVersion.properties, (item) => item.alias, (item) => { - return html`

${item.alias}: ${JSON.stringify(item.value)}

`; + const diff = diffs.find((x) => x.alias === item.alias); + return html` +

+ ${item.alias}: + ${diff + ? diff.diff.map((part) => + part.added + ? html`${part.value}` + : part.removed + ? html`${part.value}` + : part.value, + ) + : JSON.stringify(item.value)} +

+ `; }, )}
@@ -256,6 +300,12 @@ export class UmbRollbackModalElement extends UmbModalBaseElement Date: Mon, 8 Apr 2024 08:56:51 +0200 Subject: [PATCH 140/280] fix test error --- src/Umbraco.Web.UI.Client/src/mocks/e2e-handlers.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 17cf239c92..45c56d006b 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 configHandlers } from './handlers/config.handlers.js'; export const handlers = [ serverHandlers.serverRunningHandler, serverHandlers.serverInformationHandler, - manifestsHandlers.manifestEmptyHandler, + manifestsHandlers.manifestEmptyHandlers, ...auditLogHandlers, ...installHandlers, ...upgradeHandlers, From fe1c3d2f43ba24dfab5d7aa5bbe24e93c0cb2cf2 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Mon, 8 Apr 2024 09:05:16 +0200 Subject: [PATCH 141/280] if the user times out, always show the login screen --- .../src/apps/app/app-auth.controller.ts | 60 +++++++++++++------ .../src/assets/lang/da-dk.ts | 1 + .../src/assets/lang/en-us.ts | 1 + .../auth/modals/umb-app-auth-modal.element.ts | 1 + 4 files changed, 46 insertions(+), 17 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts b/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts index f629ea9ac1..a85fd82d3d 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts @@ -69,6 +69,17 @@ export class UmbAppAuthController extends UmbControllerBase { throw new Error('[Fatal] Auth context is not available'); } + // If the user is timed out, we can show the login modal directly + if (userLoginState === 'timedOut') { + const selected = await this.#showLoginModal(userLoginState); + + if (!selected) { + return false; + } + + return this.#updateState(); + } + // Figure out which providers are available const availableProviders = await firstValueFrom(this.#authContext.getAuthProviders()); @@ -88,32 +99,47 @@ export class UmbAppAuthController extends UmbControllerBase { this.#authContext.makeAuthorizationRequest(redirectProvider.forProviderName); } else { // Show the provider selection screen - const modalManager = await this.getContext(UMB_MODAL_MANAGER_CONTEXT); - const selected = await modalManager - .open(this._host, UMB_MODAL_APP_AUTH, { - data: { - userLoginState, - }, - modal: { - backdropBackground: this.#firstTimeLoggingIn - ? "var(--umb-auth-backdrop, url('https://picsum.photos/1440?grayscale&blur=2') center center / cover no-repeat)" - : 'var(--umb-auth-backdrop-timedout, rgb(0, 0, 0))', - }, - }) - .onSubmit() - .catch(() => undefined); + const selected = await this.#showLoginModal(userLoginState); - if (!selected?.providerName) { + if (!selected) { return false; } - - this.#authContext.makeAuthorizationRequest(selected.providerName, selected.loginHint); } } return this.#updateState(); } + async #showLoginModal(userLoginState: UmbUserLoginState): Promise { + if (!this.#authContext) { + throw new Error('[Fatal] Auth context is not available'); + } + + // Show the provider selection screen + const modalManager = await this.getContext(UMB_MODAL_MANAGER_CONTEXT); + const selected = await modalManager + .open(this._host, UMB_MODAL_APP_AUTH, { + data: { + userLoginState, + }, + modal: { + backdropBackground: this.#firstTimeLoggingIn + ? "var(--umb-auth-backdrop, url('https://picsum.photos/1440?grayscale&blur=2') center center / cover no-repeat)" + : 'var(--umb-auth-backdrop-timedout, rgb(0, 0, 0))', + }, + }) + .onSubmit() + .catch(() => undefined); + + if (!selected?.providerName) { + return false; + } + + this.#authContext.makeAuthorizationRequest(selected.providerName, selected.loginHint); + + return true; + } + #updateState() { if (!this.#authContext) { throw new Error('[Fatal] Auth context is not available'); 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 17bd03e419..3fb582cda0 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 @@ -1016,6 +1016,7 @@ export default { login: { instruction: 'Log ind på Umbraco', signInWith: 'Log ind med {0}', + timeout: 'Du er blevet logget ud på grund af inaktivitet, vil du logge ind igen?', }, main: { dashboard: 'Skrivebord', 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 7dc7c62b8d..39c6073f9b 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 @@ -1013,6 +1013,7 @@ export default { login: { instruction: 'Sign in to Umbraco', signInWith: 'Sign in with {0}', + timeout: 'Your session has timed out. Please sign in again below.', }, main: { dashboard: 'Dashboard', diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.element.ts index 2db0be78a8..8e129664a3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.element.ts @@ -15,6 +15,7 @@ export class UmbAppAuthModalElement extends UmbModalBaseElement + ${this.data?.userLoginState === 'timedOut' ? html`

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

` : ''} Date: Mon, 8 Apr 2024 09:14:03 +0200 Subject: [PATCH 142/280] use new resource to fetch packages --- .../package/repository/sources/package.server.data.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/packages/package/repository/sources/package.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/packages/package/repository/sources/package.server.data.ts index b8cc78864e..fe56e10015 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/packages/package/repository/sources/package.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/packages/package/repository/sources/package.server.data.ts @@ -1,5 +1,5 @@ import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; -import { PackageResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { ManifestResource, PackageResource } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; /** @@ -14,7 +14,7 @@ export class UmbPackageServerDataSource { * @memberof UmbPackageServerDataSource */ getRootItems() { - return tryExecuteAndNotify(this.host, PackageResource.getPackageManifest()); + return tryExecuteAndNotify(this.host, ManifestResource.getManifestManifest()); } /** From 3f5f44685d396edd9b85347985240d18cdc3a41b Mon Sep 17 00:00:00 2001 From: JesmoDev <26099018+JesmoDev@users.noreply.github.com> Date: Mon, 8 Apr 2024 09:38:38 +0200 Subject: [PATCH 143/280] styling --- .../modals/rollback/rollback-modal.element.ts | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts index 6ed50fe42e..fbbae37d9b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts @@ -1,3 +1,4 @@ +import { UMB_DOCUMENT_WORKSPACE_CONTEXT } from '../../workspace/index.js'; import type { UmbRollbackModalData, UmbRollbackModalValue } from './rollback-modal.token.js'; import { UmbRollbackRepository } from './repository/rollback.repository.js'; import { css, customElement, html, repeat, state } from '@umbraco-cms/backoffice/external/lit'; @@ -10,8 +11,8 @@ import { UMB_PROPERTY_DATASET_CONTEXT } from '@umbraco-cms/backoffice/property'; import type { UUISelectEvent } from '@umbraco-cms/backoffice/external/uui'; import { UMB_VARIANT_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; +//TODO: Import through backoffice/internal import { diffWords } from 'diff'; -import { UMB_DOCUMENT_WORKSPACE_CONTEXT, UmbDocumentWorkspaceContext } from '../../workspace/index.js'; type DocumentVersion = { id: string; @@ -188,8 +189,10 @@ export class UmbRollbackModalElement extends UmbModalBaseElementLanguage - +
+ Language + +
`; } @@ -300,6 +303,14 @@ export class UmbRollbackModalElement extends UmbModalBaseElement Date: Mon, 8 Apr 2024 09:45:18 +0200 Subject: [PATCH 144/280] add logo and graphics to login --- src/Umbraco.Web.UI.Client/public/login.jpg | Bin 0 -> 366426 bytes .../public/umbraco_logo_blue.svg | 51 ++++++++++++++ .../public/umbraco_logo_white.svg | 52 +++++++++++++- .../auth/modals/umb-app-auth-modal.element.ts | 65 +++++++++++++++--- 4 files changed, 157 insertions(+), 11 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/public/login.jpg create mode 100644 src/Umbraco.Web.UI.Client/public/umbraco_logo_blue.svg diff --git a/src/Umbraco.Web.UI.Client/public/login.jpg b/src/Umbraco.Web.UI.Client/public/login.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6b97f2c9439bdaabb9172019081f9afb6b87bcb0 GIT binary patch literal 366426 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
yu9tN}s3Cwo+N_0sSF(yJrXN0wmd2gkoBF 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≫0m*T$-UoS(m&+$j@TiDQ#uA% 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 z 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˦#& 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 RoZB^R@^NtHar)np{{sh8y1M`X literal 0 HcmV?d00001 diff --git a/src/Umbraco.Web.UI.Client/public/umbraco_logo_blue.svg b/src/Umbraco.Web.UI.Client/public/umbraco_logo_blue.svg new file mode 100644 index 0000000000..578bf592f6 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/public/umbraco_logo_blue.svg @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/Umbraco.Web.UI.Client/public/umbraco_logo_white.svg b/src/Umbraco.Web.UI.Client/public/umbraco_logo_white.svg index 3de8e82ed3..01f7260cd3 100644 --- a/src/Umbraco.Web.UI.Client/public/umbraco_logo_white.svg +++ b/src/Umbraco.Web.UI.Client/public/umbraco_logo_white.svg @@ -1 +1,51 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.element.ts index 8e129664a3..966f86044b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.element.ts @@ -14,14 +14,19 @@ export class UmbAppAuthModalElement extends UmbModalBaseElement - ${this.data?.userLoginState === 'timedOut' ? html`

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

` : ''} - - +
+ + + ${this.data?.userLoginState === 'timedOut' ? html`

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

` : ''} + +
+
`; } @@ -36,12 +41,41 @@ export class UmbAppAuthModalElement extends UmbModalBaseElement Date: Mon, 8 Apr 2024 09:48:16 +0200 Subject: [PATCH 145/280] remove the attribute fill-background altogether --- .../backoffice-modal-container.element.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 ee8be1c38b..1ad2272850 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 @@ -38,7 +38,7 @@ export class UmbBackofficeModalContainerElement extends UmbLitElement { /** We cannot render the umb-modal element directly in the uui-modal-container because it wont get recognized by UUI. * We therefore have a helper class which creates the uui-modal element and returns it. */ #createModalElements(modals: Array) { - this.fillBackground = false; + this.removeAttribute('fill-background'); const oldValue = this._modals; this._modals = modals; From 22282ef72886627251809f0c43ae261fd3e9159c Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Mon, 8 Apr 2024 09:59:20 +0200 Subject: [PATCH 146/280] adjust background for the not-logged-in state --- src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts b/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts index a85fd82d3d..e25de952cd 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts @@ -124,8 +124,8 @@ export class UmbAppAuthController extends UmbControllerBase { }, modal: { backdropBackground: this.#firstTimeLoggingIn - ? "var(--umb-auth-backdrop, url('https://picsum.photos/1440?grayscale&blur=2') center center / cover no-repeat)" - : 'var(--umb-auth-backdrop-timedout, rgb(0, 0, 0))', + ? 'var(--umb-auth-backdrop, rgba(0, 0, 0, 0.75))' + : 'var(--umb-auth-backdrop-timedout, #000)', }, }) .onSubmit() From b30b8a4e198d6c40ec202b30e970f2c300122fdf Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Mon, 8 Apr 2024 09:59:29 +0200 Subject: [PATCH 147/280] add the welcome greeting --- .../src/assets/lang/da-dk.ts | 7 ++++ .../src/assets/lang/en-us.ts | 7 ++++ .../auth/modals/umb-app-auth-modal.element.ts | 37 ++++++++++++++++++- 3 files changed, 49 insertions(+), 2 deletions(-) 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 3fb582cda0..cf53ada307 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 @@ -1014,6 +1014,13 @@ export default { renewSession: 'Forny for at gemme dine ændringer', }, login: { + greeting0: 'Velkommen', + greeting1: 'Velkommen', + greeting2: 'Velkommen', + greeting3: 'Velkommen', + greeting4: 'Velkommen', + greeting5: 'Velkommen', + greeting6: 'Velkommen', instruction: 'Log ind på Umbraco', signInWith: 'Log ind med {0}', timeout: 'Du er blevet logget ud på grund af inaktivitet, vil du logge ind igen?', 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 39c6073f9b..00a3ebc3a2 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 @@ -1011,6 +1011,13 @@ export default { renewSession: 'Renew now to save your work', }, login: { + greeting0: 'Welcome', + greeting1: 'Welcome', + greeting2: 'Welcome', + greeting3: 'Welcome', + greeting4: 'Welcome', + greeting5: 'Welcome', + greeting6: 'Welcome', instruction: 'Sign in to Umbraco', signInWith: 'Sign in with {0}', timeout: 'Your session has timed out. Please sign in again below.', diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.element.ts index 966f86044b..5ed4f90fbb 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.element.ts @@ -12,14 +12,33 @@ export class UmbAppAuthModalElement extends UmbModalBaseElement - - ${this.data?.userLoginState === 'timedOut' ? html`

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

` : ''} + +

${this.headline}

+ ${this.data?.userLoginState === 'timedOut' + ? html`

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

` + : ''} Date: Mon, 8 Apr 2024 10:09:48 +0200 Subject: [PATCH 148/280] remove unused assets --- src/Umbraco.Web.UI.Client/public/login.jpg | Bin 366426 -> 0 bytes .../public/umbraco_logo_blue.svg | 51 ------------------ .../public/umbraco_logo_white.svg | 51 ------------------ 3 files changed, 102 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/public/login.jpg delete mode 100644 src/Umbraco.Web.UI.Client/public/umbraco_logo_blue.svg delete mode 100644 src/Umbraco.Web.UI.Client/public/umbraco_logo_white.svg diff --git a/src/Umbraco.Web.UI.Client/public/login.jpg b/src/Umbraco.Web.UI.Client/public/login.jpg deleted file mode 100644 index 6b97f2c9439bdaabb9172019081f9afb6b87bcb0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 366426 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
yu9tN}s3Cwo+N_0sSF(yJrXN0wmd2gkoBF zSOH;w8DMsif?lpvCtZI!K)L+~^lz$9N#c^@0aDi|ty2>i$B{&YcFPE#iKB#St-YIL z6uvj^C3z&z9_ZfRZiTo)GwPwwURNW3-&-;DHQ3w@JAVlTbSfx<2u@Pry-|NV8U5Pm z+*ThCq&55|m2}~wA6_r%^z#^L!*g$Xmeq$&)kF>!MEzng((P8C1duF`HwpE;GS#lU zPcpus(+$i6B`Ov@o_y3ObdF_O@BLxQQ*m`t! z>}7u-fM>RxAk+b-Csk%_P^i89waMW&im5_aI1hz}IV2HWRrZDG07nm0-2AI-4dmFV71QhV)dJ_8_?8!eqNHu ziau|g=Rn5isLAD|D9Ytri^IV%kLXPIUrx@EnyscrW7C&xNpP9m*n}7ptx=d;Su@A+ zmRIC5S>F)$pd^4?;`MzDFA@xUIM$?E@HF4e?KfvbC=gWNgB+_8t?~R(NU{h5bL*2} zL)Jwnpv zB>&2C)n~02{w*m=GJ-``tRL8_BhzUf9RKAgXwn+8gkBCkMPGOMYAwdhn4ssz=Wi$f z_r!2kYtHby{TS2?@*ys&RvE*|eu(2Vir=aUJ0CR1p=xxk-M*K|Y?3d;uGq4qo-Nu% z1&7NE_XCv#(XGuEmlZ5_KfIpMBCBzitegqEQoan8t|M8L4jevIb_R(C%uVsdhg?4o(FAZGkjRxJMH12`A7fuNWV~gO>NBMXkeUj(~m@4t89c{(0Dgzm?-f=vX!T>{z3(1M7^{|H^vmNIwtn@#&dg zIvNSJ0P?XyyEX(QvE)`7h!^>LQoK}>d!zd=j#xtbT>(77DqPXZ5cIGBa!c}JzxT- zOP4wQg#DrBV?TO3J|w=lNQoLW9wDYRq`Q_JNN#;ccR~V=*l|gUQbw|QX!*dAOHASM zv*G^7{bV|VpEd!Y=9BNv=F8%^*SHS-&$B^F6zY+w`9PGN*u~1{abmX^oG=A+sEpx{ zDlD6xUea|`uKSa)mT}8I8dRjbJK8k$m=F}#!tL%&dc5jixNZ35<4!=Lqs@pA^^Bd%RjX^yOjp@>q0Mf*yaH-Ly>A4HgQzA3w}6SFpG)i z4LJIBm*!$|9&`xsOTYHf{Wp31c29}-l68Z9YDCG>9M1YVvtLkv=wmM$Cka7#U~$p$ z{VHQ1lV^R7B1Y7Vf?fBc)0b*F67ImU#uAd>m(Lj*^n+XT(^bPtZ2_~g#>BD~?{NBA zB>{KeAIz=h=yuK*E`T7~l3V~pRXe2oDG|-_?=L8OZjky`rSw+diXT~6ZsHI5?|XWz zW@Vx%vCPiGbRzs|$pR_CzCNsf`!suXBZS2sKpRzpH>u&NIblJr$cMy|joGL~pWY+( zF-}7^rO`Z|Bb{|rT)ctrsBjvjA0iAL32hU=%_*x#hisIoFV<^Zv|){I$1lZM22)fkOGxTT^Z`x&Qi_SEZ<9RaqxxZUJ&vkmwIfp?(w`TwX4G7-?DQ*64M zTqTzpJBHmSj;SZO{ZVgYRGSI>(iu$D_4C`0f3;dHv8d1yNi%DSCOqpDezl}W4S8Tg z7umh@4m|v9T$jE5vf^#QV`{aRfu+pBG_`eKHsiEt{jFwiicvMcD-Y_-FTF*87rN|5 zT27LzYM2ERj4L0fZk|mjGAd)#o3E%648vWOFg_%hXnAMq(h@(qK*3o$eW7s-C^3q^ zEZwyt8X&6*AlXe$aI{x_&rk>#?uAb1GE?Z^WC;*|cxXIv*ap9ldKgE4u7@~ZlN9S4 zxpn8je=sy>_xhfi>q_S^x$=(^N?cMCV-Py^4ZLbNb)+o`6hp}}GWwU~2Ax3U?u)(F zR^Cx(5B{1P3QFq0gVRJE>9BV7;pC-)5JX%drIqkHXLSfVWK`<;ajR(UrqdR6z}aK~ ze;l#0mY@H)5$V+87`MhtFkSd&GvKv~#aY}p*IvVBi+)Mu5!R9$t9deG6!|&mZMw{Z zCemgi90;l(TlisN@lYvJlnWB4Av~RSW=ZE9&frYVGsoAuqdLWYfBllhr}|UFLw3ur zU#cq*S(SfK=3TD4*5;}rVsAdg)lof4Om5>dZ$Q(Mz?~E@K_h1wMvEJBZ)hn|nX|FB zDL=iJTzOE$r|$Qc)jhVIpP2x7NN(a58Sw^L3cpI-#|p~IQh)D-IQyMw@~QVOvly~p z)B+A68Q{h7m2&+eK}`gNXbS!G4}JYu2|T(-Xi-;DpjIGm&XLxZD~YJAVZXj$#)u7~ z!_?y~Uw%;8H?y^vPd2~NHZFxa0Ak3CP4Y^C;5oCdL=xI>t?zJ+IQOT zQ2{cIJ9mp*Zzp4D5DvzoH_cf(+_39(z|}MMCbrKhCq2=B5DJd#9PgY6C~mBU?!Ie% z(Kcc#O{g|<0l_4CxXx?VLA(@=aL`2tl-nK52~`PxKh|N-H)i2~lJ50RXDj)~X?`H4 z?_(*ZqBLjr2KJ-_G!wRr`iOqRnrQuQtm(l@n0aGUI%$rR;ig_U?%vzGQoc`NG~ntS zj1*vjFgE0wr2wrcunogH*eMLCS}l0SN`(rW8#SJu0u+Vt%L7`@8p+YtrZ^FZ(3>pd z2*grO%o5%g)IOZJRI?uiWe8?nSwwo_&%4eV-bj-gO*3ttO$BkmufPWcpz8&*1sR%} zZXx7V@EMxT>mZJ4HLO8~PlTM`Ku zySSnzQl|K^Nv1IPBPwk+I<S%&?nrkC%2V$V{OX}h#!X<4N! z?mGwA2&u1oe5Q)-q2ok7uOe9iB2Osr7rdiGljc^x0ya%pEJp`*$0C=@9|B(|UG>z5 z*VjAFOVt%Dw!k~-z^Gy20s(t9rLxp!$N-E@7zDqCHM9vvz-E z_!$n)XX0+0I=h7)Cc~{PymZP~yAX4m#EXm1uw^8Sp^5rjmC|uimn}oeEhlw!oW*>0 zaVxN!>t7+2?p?Pj0b&Qy0(E-9?ATYlYZY^;8|Xp;U3zM`!lEpl^+?TFb(Zp4`t#cN z6PvG`-`usF>D`;t?A17e-*n~EY%3ET-_T|EUl^d6)kdbU@-JPumrwUDEaf0qUi?$Z z&dHmtnJf^U>&&C+@yS7=R_rBKSrg)-yjH#{qR7OrjuEve(!@%I8N|&%1xoiI+)f2{ zLp^O{^{Ng(G0-y4=uj@}hZ9heDXn=r-Q21 zpRgF-BBuk?h&DBzeb~Wn)@?Fn$z2xXMMLkLVr6;vuGGD+nN(DKkgbY(UV$LI_G1jImc&aP=HdA`~YhfFTm8Mz^2FaV#ImIBa3%ZOJZvqUpv^f{?YT#9|9F}0o z6AMC#l`?z-#^N?+Ki6%7+P_KbxL419gxFa>51=D{ z(2n~&pl2s^nJ!S;OulW2f0#m z>E7V14wwOae8FuH)@m$(cxE1#>?CXO@N$*p6-}Vrn&-dculX)zlIdgJIrudNsl=Y( zE!SA%X&_zCo~%Ni4=Ni|&PVW(nh6doCv8$R_GB&6_oDJ|`Iga#_guvFlxK@RqUBWi z*-f3N`d|!bFZ9eg)&U_vf~-tU_?NxLS?w%Oire?^I$kkMvAF|R#?Zi1*O&0-tn{Q3 z3lew*!M#N^aSwI<(DW2i{BN>CB)O%ZQ`C7{*^xg4`_AvL#d=NMM-Q00!>rs2CI;Hq%ise~%A@1Mqikgjag#Vy`y-1tUkl#x;*;oTX&e9?AQ&PGzZ;oC?wX8yJmF# z5e%YgjIR4{cL|?e?zWx|c z9=}b+H2LJ$AvX^GaT8*4-R!7z>W+cUSlQd>W$@Gu@Qo%jw`DN(zijCit^|X+kocqd zJ`FR_KG2gsbbnH5<;X*+9xCU#VQdnX`FC&-OYI5SZS6p(=>7F-+N!%J!e|31}{udT$CutTH z?!N$NEClQv2EGa%o=x8+5L9UD2~%Bjart!(sn9UHTMM&FSOhrWwX-a*lUUX0ci@C+a~pTSn@{ye>O%Yt&{#U-!^*X?X3Ppd4Kk+aT%fo9L3 zmvV2B(x3D6#fZ~jVDZ-+4AY`PiVZqfq>MIP25vf2(LY6CZlctDN7CVgK5q-&->8$Q z(KXfx=u2cB8GK~p;n{{Nl~jn{n6F~E%cRScFLIl`Tf;UIK`dE;kt7^;aAB*%9|Ch~ z>DsT&!a7-_4KhAhm;)PbhhM_groZ!GP zT<>7~nXl->DjD4Wx&EPY+wcPQWb;6d3|t|$x+cH+4PGv@dAWEd{Q4Xj-SZDBI|tmw z$;=b`UaNv zo+d5**rwcwlk=CzOSv8@=JZRwSn+~#1Ox2mMc#(!I*f~IQF2)j3zK1vEUQyp=Ia)xi+nP5840zrW<3>i=lXW` zEp*-F5h+%8b|x~ok}?`GOJpSpNhLU4{AghzB~Tc03A0{R4qCr$N#=V{=c>lq(*d_^ z=p(hR7g{eGHfhYg+9jM!xnoKI6d?VpNq>gyA%9OsU1|@<-7&Epjnr(G>MWcoDesg6 z(ecoCG7sO6kAOS1+AHFbooJS>)f{?T@evjBh~o7&A%gbZP0>~&S(~#wM(=3|HqFeo z>rjj>(-qD-c2s_26|{rEZ+C0l_PXVE!+wi9bL})e)HeIE&Vnp137PYDN+qXixC_nv z1EC36$7GM#9IP;s+T+(WDXF{dK9E(7P=D@F36_%XMR6GYnnLmLYa~}zMVtYa_8Tynu-Rx%yRgyQtCZZ|9PqoZ@I)UGZ-sb zcw9|JK$maaLf^m9T&E+FH-gZ86>2uaq5XMaExmU0KuPLa@U}&Qahf`FQ{x+lM5euC zl=)ZyBq>Pm_k>fzdX}E-FUH1LE+INlsxJcX@Itswzo@&%#z(`(b0*UhV~9a=mJ|DR zfB$_eQ1#n9g}&7++49p)M>(CB=ll4f&+m=q8`z5SPl?LgSsDvb+L9x;`@YWT$)!;w zv&nGCCIYZG|0GC!O2z|?kZgy_omR$R^Y%0Tdh8LZ$g?aTz8CgYP)03Gb5jP9e(B*q ztFTw~C38y4(QggYZ(1;Q3^EEzMx_{p(49fE4HOv+*`Aq-brT}MsMce=Qp2BTBdFNG z6iUm!z(J7hh*!0`?$L$&9VYy;tf!Llrp8wRJ~7^|;8&uY&eG1Hj>xH;HL)YPRqc)i zo^Ij`yg&;A?D|ELF?onF^4(Wn-s1}>>%*u~P`cQOd)d^#CiLCKRKXNGd6=jmOpIyoG*(kRI-pX(<>C1P z`fQ?i>-032P6kQi?H!?uBeA3&1M@`Wxh(LA5Q|AAuK21pL953V3+@foC12&|=qcpk zzqcrypOc2SE(xrUdXB_vWP8fkj*bY-!yHjFH?#m;W|qw=tUGL0)d*JGI z&jnzRR7IcdJ0he}!hfhYTu`zX_5V@5ZQP%o>Yn7b_#h5j;RSjE+H=4oNW)Wu%W3=2??mXjdu z8Uh5{Y=>A0?q$~0{FS>7CH&w^4o`ypmf2IAAVLZI-0QLAirN7m){+P;$paN8wvySw z=lU!wZ($3KdfYbnCr7gXVs=6byl#yqfmA^nGc)RIKPM-+tyu9|R~6U9#^iH8*h`P! z(Q$^0aYhPOm!-7{;(z5#u^%m_|9GQ9TT%0O_ioL@*$3T*Xg|{AfIgx@>`1M#qf|n^ zAmRJ>ooa{8Q&84x4S`q1ioEyk(Vv8(N2EFl5n{`+u{)pmUai`+s}x;~`s^rQK$^ym z)UQ5z$e-%U%ehx_2#tUge?!MKgO_2gQXiM9y%5W!5d7%0uJWZlPv@TZqx>3Af(*m~< z30a;&g_!{K4R(HLWf*sLZsSL79h1LOf&uqi`o=eF#!45@UwpeABa@z@MITT1OYM@w zjjx0*U0n?IRmpu=qjLn@q4nt0l#l}Kjvm{jXdikw0hbs{(x5-}wuZu}gkeC;q?HdT z&2ZgvQ3U8T5jPEbbTb3d3a;JUDIug7R*{7W#Mtt_dHUUQED$ko@yi))k~&5zlIj5`7h~O8 z80g=IA+UmrY)BqncfiI1Oc9G(S^dm))Em?ANEHwA_P#8mnU8;gfycR& zjYDrp&@@T%ZkZml{dJ_58!k*TiITzJf36uGMEZ8FOFGzG4eFB6FRu}ySiXSnEiUq| zzlu~56(JiM>uxl$=-kbIuBD)x)HZ$D1T5va#r!f{oe)O)-My;*OsdMgA&eg7ah{*| zXTP$75nEKgy<_x_Se_Wf)(8^m-N&4AqAHWP-7}INyg8~Q%pdd47lVV>o!{&D$x3dG z)Uhah`mvUVtp`Z~u<-FJ0@uf~<|(kSAeQ!~H;bXu+(F?*%EY1XCE8$B1I?=^KDZo5 ztEw6K=VR}=kYI&%=G#icbyR`C5h2JuPiIXk#96>|(sTFMxfTVaii;iBy?W2`{u=$P zPZ+LaB%u4al(1wMhMw7}&RSHW)89a{*g*BJHP+yd(aroif_C*E(LdXXEHh^o zKX4h%*@f@J#eGxzpJ*I@7l-Vwlw{`|8kfX7)+#s6Z3@SXif^(~8IXLBce7>Gki9jHfzEHXvCR|zwn z_NcelRhNT9?$|;9X>dy`t9h%ky4PQo&D>1mnuWaEHIg@dueMGWnVCC@75Y&eSr_f8 zD}dy4qu2&_W`0sQoc*N}`~1JDv$17Ny9Wdt)ENO@nM_=K5_B)WsR0}~ImFiBrn{wp zx;nOT+Z?&8On~W^0uOfhL)U$e=D2cM&-R@S)%uGy zQtkMDH_=qHZ9wO3Ttk~2z8#iNyKfHvWCL^fbgp+*DQZ#v_tX0eg^v$qsJ}otBDY&N zM;o4034Z+PqWi*2FuXCy*VpGlDNnaDXsp%JNz{9@kH^VrTzWHkJ94sypEjP>M)urx zZyLSpO{dNhW-*l?ye@L*Ty5}jEw!&D(*U3j$_6;iv~9&MxOF z*Ag>%k4jH8tR&IF7d!qxJMKi(^FZ;-?6~--v3GQZGSAjtW`D(PcWJJ%F0y5JnlX07 zD0=Z``ac*5j(M6w?3*yuTG;*zJ1)t$xZ{hA>hc-WB@Vjl{&Doog@Fz;`if_`jmPYJ z{tCJxM}G>@@UCVCb9Oz^~5dr$|z3?>6pXhf|PyV$R+P@Wg-7bHzARLoQ(v z%m|w>#HPK09!rx`#xZPGr-*=wxrsP+^doQg1kqAa1FBO%^{)pPZ{fC~4M+-T{Oj)` zCS`D{rsZ{@c4V4Z5$gbQ<2{T?j={vx5IY}(;Acc8h23(ndtB{RNn^1vbizP)`d}&5 z#dloKP*};)%q3oIE!gv#nrEYxPS0&(mr2H+s%7@Zdaa;d^Vg#nv_7}Y8!&OL6A!*2 zt7_9Po@RN^O5UtcXuSMtsGf2+q*7+^rZFbw#sU00k*$%I?N z0jzPMWq;0}V>S_b(Xr$(%}~$(sIn1c?Z^W-?3I&a797bn+xTvcpBy2kAkT(Mzk3>o zelx7hcUX7+=gfSx-1M5o)dOr1mVAW5_*fSI$$*zx1P(8FD~T#SlgWE(E&NHFU+t5Y z+_pi8A`=tgV(EX}dGDy;m%42N^QJog=pSh{;vt{K^rKI3 zF`${zudlpF*PsGjvlC7*8{aj{jm;|+^hg4r>NvaL&7Ci9Qkv~y03>z-@g42HtFTE- zB-O1L&ZxFIsFF~&W7QGA00Qr#nVSI}9^=JRsZPg!@psy~t#GEJz>2_Ls!QXdHzaRD_VeQveP+bAcq@l2^ zfE4tkfgts9FL!K5{H`025OTK6jS=p)T9}SDdm*cfWtS`H)qh-s)NretUU-dBA4amD zV$Z#Sxr`y$MQU2IolkBx2B}bom3Zn?5d8QNVmGvTyN!hp{%!RvPHt3aI-Sf;^GzVQ^STUA9eB(m17C~B8S2U z{ERYsIU`%CnbOlV4ppW6O|SQO_OJa0>i;;p?s%&H|1T=pm5i)gA!U#3ag(fsBzs(i zWN)r@k;=X|gc5Fpthm|RwXczR3DBp&ec2)C#I`$eXc0+}S}>}1RwN4|Yh1b;!#?S}4l4*sRw!F~!h4TEvvw2J zyB7tJlD?!T)agG2}K)nMkSlo-1eAzHgHWA0Vwtb6ldvhmBPt#TJU?l$L+1J-2 zZ;MQl?ccQjXrMM;dedO?{F4V_SIc(aJ2qUU{+}dXAN+yi>=$q_=R#ugp}CFwktR*% zwS?IUT!E(eyc+V^&lLzpzO#2x>Y8xLR%jyc7ooG2kNCfURm8E>zgxq7rrjCp^y%wr zWb6!7zP$SDO0DSa=F~&e22xO|TBcmU{Ov*dKkM|vj3p~{NzvA-p>*>%2I?T+QLh!A z^c-eC%>XJV@1b1{c+t}?Cu;;YfXCZOn}W)o4|?Aql5st+vbGG$aU+(y_GTh!ZoNr- z0xA|;FH*`BCYIp&`y$#Dc;rH33qP@K-^dJ0mfH7j+gU7;(DBZ=B7Y@^TW4n^xI*-h zvWTnfG%S|$o$LN=sr~P5?gY3P89UEHP>iDx=(acnpaL#|=H;4}zBTyGSeY7XYVwkM$@Rq5_ddyp4;*#&0)}7?K z@EtX{EZgQ|paMs)qb<6QmKCV(S&JoefKF-&i0ugy7jdYYD&3NBe^2}_wrXAf!mhX1 zM-1PaW+S=!@)7ND3GuEly>3L8|4#9+(bqNm9YiAdl`&2Lg3CO4ML>1i)V<@HI9cUA z;^#b=IrCcxy7WP}998JFmHT-Ktr5BK3Bo`&AS9l!5xipX_jo3rj~Nb@ieHx$5N`R@ z%kyVDyt$sg!D9VI(>3H1ih|;b;V#Tm=;wWHkEAJ94Y$9UD_|orbITs?|7h-1zP1l$ ztou?aYb5KgV7o?F?XE&Hcj^`*{pH%S?(F?siTL#Aci21it;PxhDj{&BQFC-pO7}PC zF8+{?W5kL~N1Q5&#ALol(Nh9t+Ww>Y$?w+Oe2@IxVD(AIII`_BRrj5(4mX}|m~mOW zNp+EO@ks-Ja&ua`AOu#$c;0T3Yro3$mE&n2=rk&S;IA7PL zz7>;*bQt28xlr4MlhKHYbj#0L3^gW1E}Qn2BMXYcMi0CEb$;y+w%BH%pK#AMciSgOJ676;vvA(quc0sZ0uynl2UMn~mcSXdU059b> zUNW#qk5uYlJSNDmwr;QgK~S9Fe>8{-mQHy;!^Qa=Z*pw3>u-n1C8Z=Q8i@()?WS$mq}^VvkksWa{qa}G zKiHs0U>r!LYcd}gCF3`&QVDW)SK2;f3kEhI9I(05VC%^3+NH!2qnn)KDU+9n4!a`i zrEhAC;~{)%^xpg6MX$yMrX%mcqBJD60h)j;@F$tEp`43xy9B0D&_mo ztvgBgjyNa^k!=^yZk8>wur^$9Yb3j^$9`tpR=gUxa9WwNiR)e|6~fpxf`gGSPy>5J zQ5Q0MES|m{jbrZw)gZPrzuOYOYVK>Y6EPh;e!ESz4JHFSzqKfCU<)(e=w(_444$l> z{5^BE+A-d|B{y~}TQ{Zz-naDUFR^3i$)F5GjyjfM!L~3U*NM9+vlS{?USR9$ce^vu z?=a7e3&2w6ITG1+GzkNFoFLbR*k?kwu`881-daGOde6aW#tALjF47@#l6?u?J;b*T zs#XLVXQxq2P^NZ8I@93?{LjH+&;C_ESegqd9U5S%uBR-;OAnG@cGah6bN(^kW3scc z4I`l3Ym5eRy#p@8Ug5I2STEziYZ{c*?#us|{eSPuD`42uj% z;`7AUPOcM1%?9h=7gl+{X@%GKK6~aO&|GrFOJ!^(>1-gcfB|snDlt^Kbsq$uS^uY3 zusSUx5O%(!cbJy+8qKP4$!$&;5D1p?LCseU6*m9Pnl#mjVNNYsuXJCahl?%Lv9Ty) zOU>4EF|)pTA?a;?=vajPu8p}bcME*bBj{z)CngXC2%oPgD{*wdI!ZYv zl8!TPT_n*u1-7RqW;-6CGSuuyhVB~5#0cL7@YRjs-xIRBBDlq~3->fvRGjdIcUq8? znAZXOu%eS5z1jwBQ{gh+>)1(EM~@G9H@dL?jmBF0qs`ymK%o85vw$mW*S}&*zZkUTW(84Q5Q$!#zO=gT4b?_}0;mDC$7gb47_sZn0bXPqjO!A>>?Jjc!J7?F_ApH8f#46*|}GT<;lQihyhEjn>C6)*U3R{P`Pg z{xrPqL?jERAnPJ1pYz+oz$x=$7cVFCI|pDbtOe@72Rz=%WIa{AzICcE2~`7}BB1o3 z^Y?kYQwrZ<_0ROCG4%Wcj>g`qeU6n$Hccg&=B>O}j}{2fqv9||k=z+8g~G?F4L@z` zbzDrMCbznc=4QountTa+M*9(nDgJADHK6)0nr0Wtbu>v1jv)JosPKm5T@Pn(1tXnS z(jN|b&DOmk<5J&=8jGL`aq*`Hw;V_uzNtB}1+;a(&?nFYzn|uciKCbx_M4_G&*ckM zpQwU3iQbDY$!dm6TWs`i8eU*GgHL6wa5i|VhDb`yEqbNp(+#-$QRB%UBH}x>8+>K; z|M!{;&H7}MqC9`H?mmA}M^y!LvIaf(?MFEUzb1*@s~$eNO#5Dygxc=&$WAGSCg060 zn~;pkE92y*U$gUy7vGD}l|^)gzef=xTkY8l0KYGYE6`PhibZE_KAO&QZ%lk^mt}67 z)~hZ9`SOB5trDAN6W*S;$j|g9ifn!gf7~&|+EQ*BW1iIo}%F)nWTo&$$7g+yrW4#o64J94Wul z?iaK_*kfAfdH2tU(pgpWA}Q=Zchx-zjEimix5*a&Aj17=B3;0!HG?1o^=UBj3CR}u zUbcz9_=Q^@MSXm|MuSTkuZHIj4RF|azTF}Me6+UXdY-h+ z2j$aq^$=$0bi2LEA1am*^qqw)`1Tc8HcU2K7WwLuSLOSgWU=khxnSj285VYQZkFF2 zjUh%;KmGK|Gor9PCR+V~qL&n!UoJ$lKAbqO`RgX0HMawY{sW{VfKOf% zYPV|%Eo^k_i<0sHfKoCaeP}y_&keg1F~%R;;=X@Ky)sSU89eREn#T-0=kH%Uq7MBL zS0WjY3^SH|P`Etc=)Y2YKx634=R886StBviBV%EFuJ2g>}Xfeq> z?cNlTtLlV1O~aR zIhI82jC*9meJ+c*mdr)s^7IM@x3rU~@#5AIC}fCf27%{YLhR51vlu(@h-SOXLM!pQ z3A+I(7NhCXDx#K+B}M>xby`sJAs>C3xcdk@Ki zkoZgO7U;11+PlYmG&CC!Z?ZRWi-0+CB~&TGgeWTmQwP5Twx01UZD5>CMs!h6PW_B- ze1D(MGntpKfGX=bINZI9iYp`#?XCxDC{_R$<4ackFt1XRAEAaRiB~JncKoqm@fBJ^ zWjI6;BhWR}Ywib>3icMI*LUyBD)S0Iy&55BKkL4aJsH{mL&Xv1qXP!+c6G0RMFibg}nS*Bi>Td*{OU)s%r)jE4wjUP>? z3z>1=^5|I3jEVZxHAAVFB3=$kAmXmr(TjQ)uO#yM=`W;NLI3xSV4HU$U}-aMTL5@G zW+VLGczG)x<`5%9koib&Tv&1-ogCb$nC-Z(j%F48Y12AbAmn1?} zd3;O=^rnN3ZhtGc`o3kd@R)#E@5c{McP7~``cA@C9jgPmB(7=&N7(=k>mKH=pKKqS z=|jh2nvKO^O}D;>8+cpd02ZZTR`-ipCPY>yjz){ZH*BOswDhq}(gQeJmWcJ-O^dQoK4ZJmLI(5qKkyJb?fVbQJ1 zEQLVf*DJw2a7=Gt7<|`oOG= z#bZ8^*$PHc)|6Dz^^H@Rp%hXFb2(Z)#LU|$r})#JkB0tCA>xiavkwhFiB%NOo4TA- z5?6NT%4?JOKg&TU#j4-l-sezo3WYNO#C46xo4jbpnP8T@8iluP{4|&+otXo%r&>3; zyVdE>HVl81xwQEFei+fL&!NAp))i&oh*})|ZSZ-TRRQUBg)F9ANd_TD^Qz=$(1I(N zTJMz?xer+_YTf*69FLBQOB?qb^BDpzYX*jjm)b8Q8=As$$7Ayz%{v}0lMWRQkAR;h z!dk0nQ)c~R#K>VUe4hH9BKFO66D+Oj7skx!(lqJeFbB|3u8hQr6Rt=Xa3XK zW;DH5xaHY|OtbeP>fx`-iTj1bM6K9GmThwdBN3Z3=LBUAUPi}Pd|v8TE`((zq%9-l zQOobS{q=P=1pG<5XQ_Y?q(f8Jz&#D~?M_q9Plw;mczAOOFJ3AJcGndqHyR5Mf9YF1 zAkmcjBIDn_^_3SKJr}f`KpVCXTKM)q$%~O+`zqdL}b26kkTb1HlhVGqGZWA`VO>I{;@s%r=5$)ls@W@vNr6MCmenrS`E_V7#QI2#MA+r`__W$oE zm4@{IM9vY#e@W-PBOV=Zozq}gN{q3HmYg5*%}AJXy7V%d0r#CooMtxbZ01ny93i2k zo8|4i906e_)SjfKTc@u4s=^kLX^{y60{errBD$YtGj#&Q8~g4LDy#`At>K!BZ<2|e z+KZJ4BQcT^u*nZbwn;?3MkOFCT59(V+UEEHo+L3`qeMM7zu<93h2Waongj30RJyy; znnM>~qvJsr+)u4@60P0KKg%a8xKy>ooz%TsNZHnvA4pmA=D%-RB4G8iHonfzdF-Wi zOtb3rNN)P7-u@kzep{!L!Tb4&Gp4JJ96L6C~|qMwpjfuy}?MqHFs?OTwK72weA zmd_|m`DDZAhO$x}*k1a|r#}xk7!ABTvy{T?OkX-ZhDgxz_fKclt^l5{C_$g8z4J&F zf;WyG2q zvX2a)&p;Kfi&4rjX$`x-bRxaTsk=(LF`4L+!8D~M58;382y-`0&PIM!m7^mr&tLv=uTSqgRg;R20P5z3r9 z_zek57W|(i>|o}%Jj1vx*4(Zkw|5DYfaYxqCaexE4#n>-5^V@T|ISq$l()^Fm-`a> z&7PFS^}hgCV#)DIW>XF*>f|T86JuFw$@k}{=pL&?d=39F-Ep#{nBL%(5e}#Ws&@5H zQHC`{(84{bB{U_!T3J5q^M@nCVDjyQkMKu^O1GE=zDK49H|%v&yp4u|&7O@I=9N&!~jX1${4?4ad$7hV*L0s4-H+{)KBh ze+N}qdFHP8D6O#9Ds4u*533V@;EFxD!G!|EYJzRu7CCOYbB!Y&jam;E|GusrVR~yJEB~%0U@uTCCsr?_qd^2K(3GP#0?@o{ckO$3U)AJl0`(V-# z9lOn|%(C*4xuC%8X6tO7FQiIPW3q%t_d_*M@n%awbo@gE%rcm~gOq?inftcCEb7M< z3Sq=wi~63}o~oT|Ctua&reUSoNa+8PV#LND`yWklOY{U4M3y63I8spi*e>()SNQwx zUadWo+e+f|+D{1lVJ8bj%>^f@#$}?ix0hgYjy#J=l2|LfTI{FuBa?)!0(-N7@AOh_ zdR@+I2`r0^$dx=v)p3{HD6-H_f4adf{TMY2R&`-y?cL ztk|A0z%=&2!331ZzT!?S=>^1QNb)=0;Pa~*VLlt1Hqc)SvD2&4w#S3gEa6F5+krxE z)X%@Fet_cV;ICHU+Ak=b;J^AU(6u(l)hB=0Pwqedn*TcScC26scN)AyAbrC4en(eW z)x?b7kbK!(HE1sE7kWQ-=~u0*@L)Aw{mJudV5s+9>3aWRNgWOQ2=tSKW>fR9v)hJ` zs3$?!Q~QMmiOCwanMZ;Jd={d(_muo>3)!>SK2}eB2;Hic@)<4MM;*FjHIb6y>vPhO zLd7=KUbcMZSDxh6x^^)Llpk!`-ma=0fw}bbMc%QC{z(a2wVtH4*hje)mHVE3u-#E; zk9Pt8rDrwcM^iPERU=YUtCapfOBRJFyqaT&Ze ztGTSIG}Na_6ZRiXSd#g10RnbMlP{wI61TUV%aV|W36a*P3lpP}OD<+r*M>HC7yYbm zN}1`exbx_2dz-c*s)yqVo_iV3U-Sx%uK4K2bv@3d?jTL(!t!+szL-JX=ky%Lj151` zZ%^w)DCbkhAyuGvCewQRWzC<*LSF7BkG*VLxsvIZdZC;CS4g+mv>G7Vx+Fj;dhqHz zeJ^hNI82(gtD*9J+AWrn)yID_ByurH7Hipx?TvY%aX_~-B*y8B9wu~v2V$N*Lr$bU2+nkX?X!no@BE~)o^8xH6UucPLquayWi z=;PGMbgnMP8H><_{;J_^g{1{$V>$YM$e!dswE&z7>sTh29IiH#Yq!*k_A}C7*+GN+ zo>h6_61cBkIQ3=5A0w&WsvwMdCt1$TU_j&?RNhOl0r0MUd+$o1y(A@gF>GSd^H?pe zO;A-A#{tw!OvvDo#JiaoPtm`dXx6=>A+9OM0MCmb=5!zq)5BC|u>&v2(KN5YJugn_ zXlbg|HB8lUpktIxluz{pR1wdGpz?3NI_==0oO~o^SizCLC$IjNR{In_Qc3b-T;qEY zVZfnJU9HK{$FD*QqaoVZnwrdKxLqL0fIPZ73mg!>bVk z>CkaLW|n{~m{sloX;gMF-IY&ya2d-9z66ThK9Ij~{Xd$n+AKx#U2vsKf_S)hK6vPc z(Z-GCQ1PPA*_5D()jb4^i>yU-F3w?Fl8g`eVdru|a_L?vVi!E~lDZ*3AM@Ae_^3c0 zHVv-Bcdb|^@Ql6BgdszR$!p`ch+8CH>PXDVBqdcB=e?SwwWJP!u0>-zx^u0duITBy zixx-fq`Q%Ac9Bj)xIM$_+L7wXru%sAG|$2Jzx5=%ete2pNuFjBUHb*TJ&KlCtqkNA zg9wt{C#jFD%fKX+| zWAHc}CcHObhu`o8ytGQ29ATB7QUZCf_2v+ z2%8R|Ax48~3r&doTU%pXU~moouq4psUdOG^7cxMS*A8?G@}ZgJYyM`&oNRH(i@Q3e zU9f8{Rq4h$S)+bM(c78e{BZm)x2&4?;aTt$U*W3$gWcqW6=O4{&4M~Lvw5PBVq#`% zB*Da(ZJo>LcGW){i*lN5$+g}g?2Ut^WTp| zwl6`we}|hbY?U8c4S4#*4EMK)kel+!8|bSojIjAo@5Eyk;9QtoWv6AFv9Vh7XRI^{ zW=o%^ohp|d!16DTg7D~$B{_v_6S#TJ=U9wSVIQWSC378E$e$zSKPb~ybiU%r`0(kT zq@6hqltE=BV)hv^oeCgk^cxh5$UCxr;ZHy_HRP>`d$6P1cQf#V=BY4$c+DDL!inl< zMH{3Nt$sIbcWAU>9(TI%ey@A}ZB{{S6Oh{BvVS?()O5s)>qFwRO4X%XC$n#3C$rA5 z3ocz>Ba=Z)5BB&U{a~ul7%H63tvM|Zujtkl3ZJF_CDzDbfzs^OaoKJ1R3j_$RNM&Rx>YfKR%7j6e6ad*3OoFH_%UhQAd|5xcu2oNB7tRiEvf z)+)#k-LvbpTuSMhE&lNA%HJ4Pwkt+T${Uz`|IHH_Hrv z+h|wb{G#D_{an!q7)EUW6}=gqjlihZL?z$7QMiUG;2soB$r;pHW8e{bYxz&^phS6+ zAEN}40vWrltX3hz-91u`o8!+kUv;Rt(19|6YOFf8n`Fm|s(nT%{o-H4B^EbfXGhM* zoE@k^ywX)P2hXR> zyZjGJ5ZQjUM;B7Vp~AeW&}V?FkjZOi%@D>PDM%J;db)q~rEVV`qCe#I3g2k0C}m zB_ra2an4nCM#9=RO|tz{>x5Wkw#X%Y)H~}I*X*W=r1rW@b1c?1*=W4J*26pMaO1<% zBL`7X!)`MBsx4||1yD8~>+J@YL6`EmZl(0loiQ#R8Txftj=mf}`l8lvHQ^_aq{{Jf zOg5K0NZ#$>RJtmhr4=5rQIJ2vZpXH@MrD{M>`^&}wj&m%mG4}e*^<`(Z71-qdg~@T zSg%HE*kS=h<~QAsc~MC;1C(5W!}Gypq4SkFl<##U`s9YCL>pbrS+Br?Mg9huVC9Wd zeK@l7fJL>Vh3CUu_l?^3*XI^4>3tGSx;gal66{7~o9%xzZYW+V7R*k)L3SjjdAh$* zllSrXBA)*5YN?v3S4XA8B3rmGBa`y1j#&Y%ru5oOl zX__vTKzScEv`nCbust9bkR%N~I-jpLb$Db@I=0Htp28eCiRf;*m1wX}--h7m8J&mf z;QMsEe$CcF`psA+8bGpKtP&bYHwIlOvoemmG1dT9){gJ=;O13T*oh!E@dK}+yl z@RE&MydyKRLr^CKgXI9WpEj-PD>jR(i2PKwsbi%CgwrxLy-n=V_0)~9aKsa2b3($N zcMpY*$h!pitq6%7=VSlTJV3bcfX6S>uZx9Y%%_ja70HKc6c(s=o8ha|HV|`_-G%Sw zGC1uz(Bi9~@^hP1>Bg}g!$#3!#b;uNO^S?;g|ADvw1thoesRZEBO1DV%`dl@6RK?j zl|zCyYm_Fq0n|;+VhBV(>!D_a2eGZWP0!`^$zTT{)ao!YHoTrb>ujR+@H0$_h#Lvz z7GK_>4x`50)g2}xN03<~kjAV7ipde3-tXX=k?17HY%{5OkH1lz_8RE-vaTs{j!Ez@ zd1p?6F5EZIk4nlDIUnDazCqA@323L)MOEW=PV{*_AHCr8$HINP>GMSf>oYujqlp0< z(;T2{KYHD(zW}!mRuAqUO@Axd#ef&5hB{+IZtGs8X<9hzA z-urizqHh~;*zPj2`q8_cVLJ%iEq9@B=jI-@IOiwLJvw@&Rk(ri2(<{BxcsVp`C_WP z@JFAkzVlK38;~sged-}Zs)u56$&AF$HW!INR#>z{fH{03Ai}MEl!rto`EDOS|M=pRzVi!yqHq1+!wvK4T6)1im@F^$9<#+N2ntVl2y|3wr1xqDNO^dO zd&~1SQly?Pwex<-wXu1=%%{zMy=cgJ3DxU=qg_*0TKQs1b}?InF&}M&(z&^1JT|k9 zm+PI`eN0AP+0cI@<26+yO}Fzr+@pmDiXR}t0;b-5gawLy%nrSVZHB^s?*GDfV1NMsQ}$W5!nyb94pfWL-h+x1n|-+!V<{hS>4}ROS{F~U=jPwYWm)g;9pVuhhWCx z8X(5SCGlBJuss)7MeSeb`ue&rU!xe5JzTJ~Ed_~&&TnvpD>%(6j_zR{Wjx9VS`d+X z+e@NAYYqLEae+AiQ(NuMEPt=G%m!t$y|YoU9R59w#81A|qEk1rEm_5oo`CWFW!DD> z)iPU!9bw%5BHKV!^X(T?4_obT{YUfeR4*nI8>r0$E!p7v=J$}B4v`=6^*}!Fe_o7x zPv!3XY3-wo@>DFpR_MF>{@zY2y+rP33?D2YSKupbbLD8*?Kc(Ma7aZ9c2YURUlR~r zU-dl$#=k!OSM?uF>YhQPUFKCqEKSPZT;o~o%cSs+k)j7|Nl2#Bre~&0Z13*c$#rEt z;(UAj(CiC4)$*@ui6cVGF1CXuxGR$VK?!i*{-Ab_H?D)h1`4B0(Sr9Jp35rUaL{~C zuVs2aOtII58dWswZ)zO`2;^yIkUowg!p-Mde=~!8&NRkPYGWcDz__iYOAYqcQ0=3y zfb1Y6E3el*diUKP=yV`dc#X^++zI1JGTc{P3Vx@i2rp8f6qljyYuek{ZqXS|jYA|N z1xE|g9AB3efpd{LhyhHuW|y;DLw;F&L4TofPm)h_zd)45diDHv3`xnA@TrONy-898 zGyCF@OXG{a@c|0iLPPE4LF`!V8$bwv5U9!GCllM18TlqI#ncA|h5f0&EPwER{(+~% z!jEMK|Ktt~7Fuu;Znb5tgYm!z(E)k43-1Zj&pr&WRqBx zP{R;-B*6%YfY3Ctgzd9+djEoK@PvA2xf>wASbS6Ee~~*Q>3-PJQM82Mcf);1UQnkq z`8TguMe-y~cC0c%<*MZTR8MY-@GF&ND=0FUBh(q=G45yC)db51`R1HZFIl&f12Ld9 ze6*zIlBQ>|)n-shSV52Qd+HXOTP6(3fpz3~$*Pfl%|YdP#(J2Ui`V@hPKX5H+(27| zk7T(v*5P|DJCSG*%pSuV>}C9oV;fyH4a~!yi)(ymK@;@<(Fj-*`oE@By79>=_O~iw zBHLSnfz2cmy!AsN%YG2~U1iYhj-HKQMb6(QNA7ji^OIt4(V2=N9&&Nrc?=e)yXc>K zm2_4cW-=9X+2f@y=~n1z(bJF3wYhS&E4V`6VYVLMF2DLWj@u(Epc~$MN4`IaSR=$h zT1QsSuaXsb>4_^HAk;jXp=3n555)l217jtIEz!pw>%oSKEwy|QbsV=pIk}7*UknoD zpt@NXcNFT3{Jm@$(G3a+BU$JY67k+U!X(wMyXgd`u1Z&)@LgvWk5*f2dM|y;`Q5da zQ56e}ucS#_*Asa{#S>Q>vtiQiwV^i)w+O`a-J>_u<;aEKk<}LO%QUX_6EfQs?cdZz z${xHtczc8I4vF=5s4t|=8D3jJOv6JG)eINU)ON&PG@I3CsD(VQy815IXmWNKenrjK zF1BkPfvg5&rp-oMgrPYvD;jkYR_Bf0JxaU3P*UmTQxIilNvo1%@rlT_i0K0FFnRJW z>ZJKE**&AJIXBCelIZNcp6MJf$gHp3AFwVq*du#BDT-iE2t5-Ry861xpINSL(QbMd z_L~aKs^t^$Xb-leYeWrp;mi+5UGNBR6B_C!Xfd9Re3W^~V%Q0vKwYEqgliDiI;7}b zbAjNds?gWz`O_V)&YstO`NX#1l*6qdYcjAFPKu-x>3R0j_bvVQrQ%M<)K#JBx{#+Ardz4EqbIUS7Rkuha@`gYcWQKh zwx6l_C^@Z^>U&cmf@|vl<0o4UhwSJI*ANEr5W19*GNkM%)le7Kv(7EV2dC6;`vS4r*+2 zYD0hhy|DVX^^(YL*^LMsMHTq!%+Ld1(gW>C>}#DoY{>bL_S-cBCOhgmx#*a!IEA7` zoU|q*_)8A_PrQj1Y%yxai;#D3zB>|L$1>W&+cyKR&y=5DSEZVr^O7z++K+5=Il4Fs zg=1SY_h)yu8#8IB@}J!1et)Z}K?)Z8nEXI~r$D`#zZ%hakCuEvvj#k+z;B6)(e^gXd#23`n=X9EAF>CoZRyv3l@}=P_%M&wA&;F;;^MC>8P(YsH zJdaa6NuU6fhAY$h1H=`w_R^RMbrgrsUbpWf&lyo96>!}Y>Jd}}WU0lf2tWC-1& zG8XJBfD$6P1-zNUZxCiX6l2xYg}(BfeRyVTRIH^|ro^9OG`?%|fl`isBVkHqyiGDA z#&&=z0XK{x&@}Td)H}|rI*gya}(KA8`bv@W|Ctg8ePuyaPXsQ@8L z08}F|VS|NnyXIcgdz%O$>h0l8Jz{ouqUk(aQC`1Ga7Xw(a5~)Dr{G5Y97bvZ!3N}H zpFfsqifL_Ot=8nTx4saeW-#(H?&T|6-&|=Gi!!M$bS#oF91M=7g3dH}u#m*BX_8z0 zf0|dnw0O5Vust~!1K6Oq{4gBkYK~WnGT8%LRX0y@Zi#<$P=RXfLl~m65Ge^w z5~6NMj=kzV(7Ys*LP6llL*M^sp8miHbY>l7Sg!03_V+^$034(0Hpgx!S#=!kG4vi6 zI5Mmzs66hqqNe$)+v{!$q9JA=)HoW(1k44R;5RiEL`TA6lT3l}sl4$u^hcWQe$LUg z=@ryw|6=fVCP_Y=rP=`UUVs5exQ@C6mB{>yr&KUd+~-Rl#7nIis4D%1&(MH}Xd7Ht zCaqzI2q4FeF15xr4%x^S7y=rMZJj6H?oKY*3bKDdDQ`0N$8V8d&kJMK)0eH>TR?`YkEA^3qA!rl&AtvU4St^dRQo4~n|ojXGMo|qfU*fc*r9lM zxaUgfOQ6fi3LpOUu;icX-vXUqIpJ6x{1*Prfi=CT_HI#+?0+@_vi4i{9$YM zmFnfDJEPuE))C#lVVm;FQdv{J514^3TQ<J~|oFjTX-C z6+Y^fF?iAcsb>xyEMVEq2>-VK;`vhdiR<2DKV6T*-;XOpJVldsE=i-iec1SX{KRJ7 z-^hqf7G2ZHbTN55YNvAtUcr#-o20`Y#LDgX5q+;)C!{P0Yu<=X5K9a&tIe*9cM__5 zk6tNTk^v1MGi#rkGY7BE8`|9M^nTONmr(H_ZaM8>k8|*^ zITx!{u4L78@^IsthEtS`8nb`)LXu~h0^};LH^_5fOx8M%(5M)Nx`IE=nFm$e3m8 z&d|aeCf4qX87Hlqa?+Edmv6C&Uk}lyr+kz)zPS-?@68r3{Pv=Iuf~|?NVi(owRZeU zD^7OScQOjG;diB^0z{OD$N6lUK+PGx$|k z-*nck_n7hFps^3V5u5#&-~C@6tOu-@y)=(E{hMTbe=^o>d6y+-h;U)Yy8El!sE%ot z(f)Su-ra)Y=wji<*`GPJa-KBxnut$$C4ryQ^8Ov6hX=uM) z1*{I#^q9PGozc;DZm;FAkZr*idX8;;3%+CFbJT2$)Oc_C#EmkO4=!n^BRg}OHmkkc z3eiL58>Wo@>3FHYJNZgl87AX7rOC$w={UP@sV1~dDYq{<^V24M)L{*EEZ`8%_~|Eq zbI)`CL1Mf!%dM2h75D5mD(T#!{6C^Umpu;=d5^AQ>DLtHkLy@1{&lrwe;+QdYB#UaG3McY~M z_Cp~BDC3nK1IH4L-<@o`pBJxEH*)1$Rli2Xs$cfE56H^i=M7u`XoIPE#(ACjD>5nS z5dqxf_XsYUJu#x~?#)u=&!92v<$Q4SW_nvUrC6>iO4&9B1B5gPyrud_UwHoJR`)*lZKI*aA@9(`pmEQ= zx7Ks-Uos`_bH zoUV&MjZ@T_TraPTN00PH=te8evZTuRSOAG-pm{#?hRuu8s;_2?lhS^zi*nI13BA~D zw_*Y80$aSjGSMcIE53<+NsMycV=vW4{~~WKa<<6mS}aMNLGT-DWIh&XS^tlQ!~V^6 zsKH4Fp(_*qz|8sWrm^UQ&t7zUw@sOl4;9uph@`tHKHp@&PVr1^(mjhwrij_HnIk?p z&48^+MX$H;ufjM7okz*H=QBWZxonc37aT$9K1+T$4s<*l_CWPdeR{ZR^ZhBnJKzDE zmfCJ6@lgNy=oi8I=ES@i+!we!>7JWb2FXR=_?)6kGLb7hLPcvR!T^eszlFA`f~-Rz zmv8LXT>j}wO?j>R(BRvd+@xL!M0}&6bbS1{KqlWCyFWR9`yyGOX-8epx-V9(Zq`XR!>Z`qA744BNw#UuUyX{-&z0jYlo{#Q> ztOkqgFtL+E!&CS8TY#gE;Ngko+cJw?lDYbEe)AEFJM^vI^xM4GXm?2%3k=vpYtxJa z2_k@z`n~7=6@;uO=c>#NISpA~wkvo_9qYrDv}%}BcnIYSRe?Hi-Zn}VeKX|gHTaz6 z5!>99@kYf%X$I=nC2zOgw$)E1Ko~(#!2ufEaHQlLVrVUf!=4r$eF{1|IYZvuL^D*W z7RXLLJ)urA|ETb!UbV_YZv-dxsNV4e=Y(B&O?UByQ(D4y`jsFh&O5%Nt3jDRH?oAk zm1FN*(@|GJmbwLKe46te0RI^8Rjz{>pyH{JQ5DJvB^K?O%(S?TU%+5S z)`$iswpi~~DF7!$l;hw^T=zS?*I`O59y zu)^_K&?ySD2P9!Lg@*tqOv`^Tb@C1D-3c|ZB?We3T1QRC>F}V+oVAocq9q2kf|!FO z0vg{vwd=3`i3{_5h==_!FqnidJHPzMz~{o3<| zb$!nBY}qPbRd#;8Iq^(#G2btFBQi z>>>AqOsXIF(HJ-8+Ja@WKP!0OKKLb%v*p}5Lnya3dclSsg`%Xsc@fgGjtj8waU{pS zI?ihSvJ4F=mmc>|s1{6t2bfSkf=XV79AaM{i+z6I*mW2y`)HI?PIP|h(igk8PuK5m zKI!nX-oky|Lt!6t1LQyc*vce{Ypq;<3rZomr%5ew*iZi2f<9yvdLM6Ag$oCVtx&L8 zO;)X*zEb;l3e+Qe!isW`(`l_$(~ulV2>l)usDHa$DJ=Yu{f#Z)*t#6vd6g>L9>XPy zF<)CbokA?7)HM12A)2Xfg%sLtyT(m!di;zqj`U&42|BQPjbZ*^y=TH>p%LFK;XN^Q zbt2kEhjyjLa~;L{`S$n>-czS`;=ehmhs`Mzsvxh0@6$6#tBJ7Hgr#Ob z2oENIt@oF->P-3X&v`W?85;59!`{6cvAzI<9vYCnL5I-s_Lo_c9d_1)H?4`4G1;6f6b3!F~6yC2(cBKXwl4Itk9#GkCmG)*CyLs0^xt z@(ufCF@34{hhE{QpI(BO*er@gb&u)QsAakyohbcf2b!f39|1du!QyXq0`A$#8#uaA3E@;t9_#r8=;)Li9Hi}r^l{z?{FS`NoMA1@oo912ov_TLXxGyZnT z3a`QE1iipjt|DU1X&a9XqPTSJh1hL8tpCJnPfL)gkjvDZQfC`f23PS7d42jW{rO{p zX^Pf$FX#m{X=ld>SVF|y?gIAFO;H8ZekGb`!;fa|*2=83f-PgOXiLN?+jv-L-t{`J zcJIB>Mw9;ifeEDtzxU*=IkaA!1g*$3X2})>mIP*8gnZYC$ zFq~caxYX4TZGJghVdCBoHhS=@qI~>9>ud3Cn%bh>Jxs zcib@*fPDc_Q?om;#pS0GN>{O0f&@yQYhL4!0WfV43(fwFD+8V%ac9TF0yl1xoGGAl zs_iPaANzgb3&-!$cdcI&#jM&cR>?6kN3H8=zZRGb6ppE^ou|`$f|_++Uo;%_ufjEh z%iI{}J$@Dl+&@@fwY81359!|#Q#JNV3$i6ZB|4n3d+ z3LroTaE?oh z71uA9d$J1s*r??VGo$0Q?TF5y(vT`<=F8f4Z31>bQXCL)McKw?hlWz3HfCoL%Q9vy z8Lm1SA>Ki%t>8L43{SBir@HJ%*y_lN*?@%Hy(q}V7!mp8m4WxM3HIwu2j?#0s2I(9 zx70z5)22~~W@#aBSM6pD6>tsCVX$6Nkds1p7_YJD-y*U-Vh3c?^eQ(g5@ z@Yh3!Al)_oKD(DSM|(gZ&2vDY{WvgrysZG6c=HvoUj>kBt==Z@k@;GcU&y1G*sa95 zAcg!xMjUDTu8vFqnp|MK3T)x4G)QTH0@zR;LfitX|XrX&wpFJmU!w z(0o!$z3viRwgdNcF`mh$3DDOGyZCCB3N-T$pv146{|TWcPO7YSPu9B8S&A!??iVKM zGEgdav*6j!hq0^f$=xKQ!GV<92R+hYyU&+z@v*BjpNh-RD zZW5#)GS};GbW9*$80424U)v-tkP@hzNsliAa?j_Bdd2h){h!WRJu~qKu{J1iB^3iy z^%|0R4WDADZjx<%-Rykw531y*8O-WJCX|iz2TY|DO;a8wcdM`{hHi-ZR;~6k`GeMv z=o+1E9;X%80>ijjk~CWw=$QoJm`!r4`I;=@Wmw_-^Gj=x+Gg0v*KNja1jw%5@uuSG zENzY@S7C^?+kro~i^QE-VlqjCepUL>>ykn6f8*y;f%YO?WmXBRzp0)BR5|S-zPzBe z;fsC#`>=*w+xH^_$Zky;cVJ#psqgidcad{>frf`Jj&(boymSN{>3qrXdaOZ-Rp%~1 zD-f5pp%cj=MNl;r_#f40l_m1WJq|O0wviEZ8nbs=oBD-R;f{4Fjz-;sd4>YA!{kTDw;$s(I3=9C&&g%_KA3V{1#R8dM0F<=+C}Z) ztc#>(RhTZcnng9g3qy0mJHl_8A?RWxb3V>LAMbLLd-e=3whjgLBkd>69=9?~i#$_n z`t09;(NX1o`ccG1#~_g64Y?RZ zt(vb?TBz9GH!-?9;|t+;+}TCV>S;%ckHh%ypD1tlY8I5O^H|I@YIXKbowJm;M&$4O z(f&<1M&WC9`=QH_ZU}R^>uNcL{>#SrN1s98&?W5Am9F;2>XNn{e-}1f%trKGEsn62 z@8T}?lZuL8P9u|H^{sV2&oqM9{GFh`Hl_rbC)Y0o-8mId*S8u7X;{JiJR`Vus}@&n`n%mg=m1BzjIoxZc2mb>4tQ`Ey9f3kNNU2Bvb8SIO*^S=uYlj#N%^egauO;Cp^0A&pq-m+zis8F;cHPGEKK^Qy`A@UF{S>}6;^iov)E?8*ycJMwzMT7=i>1`C;=ryu8PJYJ|=KRn^DIe z)h9d48!T>_m6Z`aagY6-V##G<%R;S^GcwW*Zvioq#ul?zN)~51VBC4S4~NHZqeF|^ z%^AjP-*83zG1TRML5j+B z(c|U5sG#8#l8Y;1@0;4B%%73b@X`#U$V2IobKx=u3^Z7UVA#-zhd|Bn0`dvSg@dDI z>So|~@Fv1Be-Onm5o={^y$>$ixHf|f;b9H&?O7AnSCYLZ zX`UH(ny`y90q$pr%>n{7$J9Z`;~=A(bmYhHicZqn>jubH*pwGAh(~bF*#r=hLRfSv`SBOdeRYtd1y{6o zhZ~i9FG_=#oP;HgXv-RD{(yWRisM0I($;9^;?M_KM;GWi=scJq z1M?;VV`b98qTfwWHeNA~nMUEd_xz)D z>R{Eh(*x9=g^+QO*)b#muVi0{mrQ`vT7C;|AShg#>6XdUXdj--LJtdz$UV*2wAVkkGGG?>`em5C{@HlB~rI_0B6MmCs-rtGi%b-wbl+LS~^gXN@XU zK<`f)@Qtq3i5x+bSXJ_Pz4or3K?gtn`N_AXZ??XU?bm()$5rDQU1{lFgDg|MGk5p4 z2>X*3&MgSgpUF0$D93vui;yaGPNe! z-I6Kowl*!d97YS9?WKm0mk;N@XSaQ>6&mDDabPRp((7(2iA9%Sfy_rfc5B-Y)Qi9y zFT{!@nIQm^YfOFG9+FK3PY;rT$(`-rB}SCS_D$<*1U z^y|vSrx^tc;U`P#@^{N;T>MbY>w6Z@@n$!T(o$#*$?fiy+RCKVp*P!(Vt10$WC zy`ppPSOyb4T-(++{c7!tdz2C>UY3@Vv35gy#+~5p`WXOs>XO$W@r~u40S3VhsjjDk zkHP!L@Y3#B{5ozM0Qe1XrB+vh(Wk3_@2PCmN5;X#`{e)~1~)kNxi}*tDad-w^?}3u zWXna&^Qu>B37R%!yZW-$hno@LRlRPE#aA2aSG^Xhjj1x}KYyu^F%|N+&MJ$~`gl`O z8~o&3>D(BN&@HOf`J~Xm261U_iSqhaKR;4Q4 zYMy&yFyZWi_!zmg%=FQ1OM)?xdUj;u;0&YZjChrmB_ZHFyL9oV=5u3qc#%|C7nRUy zxLY9e=7IEEugS#A114mxo=tC*3_d5%^d5zt`Hjjj-@kRWJhUo8SH(NnVS12Xf7NiA z>{C$j`;#B6&CeEzQH`Vee7n=`U0AupS2@)dd}8EOCQ?QXVK9Y$&xzRHDcAaeI*-)o z42+oN1V!?n-@W$?Pl~i`Ni(~ryIqtau&Q%hx1gqzl?0wc8Z}($YAcyI6agpz+J(Igg7Ha6? z96d=z$f`3X3Q*tgb6FbxF0eZke`JUFBi`q&m^{2&TckGlbb>2t#b&G|i6*OHpD2%gFL=jch|(UW`?cghJStv!li8{SsT;5lGKk_8a}OdMagm<(cTd{MCVe#qRoUT^O^_mf`}CA?M{5l>ZvVotW0M;ujZG zpq^se&^jPO*c5tccL3LDdPLGimpF4`WXhHF(qp*+R}?DtwJfeXLz-AVK3s03-MDCs z>35^<7(!>6>-tvL$$=r$Q2sYkKSn+Ggk}^uH=BL|=lZ0T?lap|HFW6v@+Y(g zTE3R*rw*{8&erc3(onyt$6mwU1Z%77Plxk3Tcr`s3adZWB%dHaHrC{fYb9n5o(>hut;%i2kmOFL$#_2~J-9CRc<%C~IaNalV_Fg6dbkSZk6bjV*`AnS<1uz5 z6aIsZ4CyYagb(eaayC%$9^(JIv-{o@J&xVF5=~SyDX23!FuZUfVdcoi^qY#3H#pSi z=DFJjKg{*K&1hw)eVp{|GVR5S99eT}NlKY-X=ceweI=&$M}1{dwqK-D1i!&wu+0vP zq{m9UQ_|#JYAB#v&e?cd{NYom&o|eTMmv@-QYJU6{p8YCZCkrLRryK1fA8nr{1LhN zC+DL2*=5O}5o6-$;r!&q+|s3o^lPeNqMZSkACa7sZVFmF4lY;|wgz~}bAkNUuc+%7 zt~9ZsE&g3H5{6kV?XcfySVnB@_PZCj@abLuaFwUn)3F%gaw^RHYf7QceqqlDQ`?3g zr}I6xnsZiF=7#z^tKVa}e#k8~al$IK+}${Hhh<(z9qo7XOvXQA0*lz#uv)XPeD*jK z-8L}z2ut$CqGTMA{b z1nQk)fI;R+#Uh)`2KP`y*q@XZNyVoKt*h zaK8K`XA$HBci}Z9`{{eU^!YoJ#czrzKik$+i4UM#4fhz2Pf`N(_E^fF)f*veN9I1q z5&xhx+Vr_@12oZ)XS)!|lN@0aKMYwk?dj8&WSf(!2lqb+N+p7H+#4h55Jk9Dj2I1x zgo}^A(Bc8n`=As0M|Nx!E&P)A`{=&!C$0-K zUUAH7jWg^R*n8|Ms`!C88bhefj)(ffEzMs$m)}uge*Dr=+Rfj{{g2!|MMiv8mS%vP zQ0{r7$k3C7uNBJAHoxL)l&$WbV748-KqbSDvTw{i$L!k23Uk-rjg1wzJMrynZ?*-B zCiD%z5Xo7AIZV`jnisL8y5r`wZbVOd$*J*eiE|Tiw4qOa~$gc&yW{C1npi~TJ+<&&Eod^^lWu`VfyAOZSRy=FOXJzaN#X; z6%5uR*x7zstqHk#H7L7c`yVJ{BSfbLMIP(;0#So>(3*v>iR~ZW$Dx!~)@W`muKt+f zV9BI|wmiMFQ0?9Y=uy!nTkY90#@=}&DogB&oHRP0n|b+!qrbcoKdXGYt^IZNLrnI6 zpiV~??6WB@oHJT04qR8Xi*Y9D@ukOB`1Ng7EZn0BuHS^P2WhtWM(VzO6XVUJ|A^dz z-(#hiZVDef`4lH`&5n~o>jN5*!1bHguP}D{`!#>}&#~l6zfc-^5Z+^fQ@I)oaY(PYvh`o*| zNZJz{vd!8bV%e_{+;t4Vjr2uFTL%J;O5ZGSP@OwZayIW3l4CWw@2R>%y3d}Og5#PAM-*7FM`PFW)w9| zSiLPDrUnwo3k3c+igz?B_$n-K4h)+n$tZ#j$ZiEmTwCuw?i^6cgoQ~-YDY}a{666D;73j?IUq_{3uhA$zH9b0ZD?=3GA@y!?h(0CaGZ{@1E z_VuPM(GJyw=0hXF46@*mnU!DDaqE@5dM%@P&mRRU)!Uz1;+#tN2YO4{^O1>ya~bQ1 zJ|s@82MYxCbRy;{`}f}ARMv*VWYUYNYJjrzguJP!)8*&d%16>8v&%FsOHt!rABK^(8#OMWt#o>P4gcrHaZWAci z*I{#aI%hNlBighrUv22O{%SZ~z#r2d{1CQlNzM&NszV)UaN;Pe#1XPbqAG-HR~T1o z)Y=HRiq?mVum;Y4@K1TsO|(*aMt2GLOOPhvh>qc?|3IvG4PaSlZ}KZPsweT<4;KDS zpFU2&$7q_rOE~4S0o6n?@ro>0QNI7D@2!_Vo%_=if1Y1@22ntwYck2Q045g4jeu=T z0t3&OV8DaG4rddqXWJiOuo~S7zqhoDq-+!PuF!Isp|Scx_{0*+5tj7g#S3!oYQz*0 zCxGZ%66pqz?gBiwkw_`-;$8j3j|6|$+U`C6!?0oEDhM;a`Y2v-6$r&OXZB0~)8|ar zHvV1Do%8N2h)3F$7QLS6h{4MizlzLJs-4Akh<>#-&!+!(?#NOp!wSoJ}{rmav6Lu$;y8c?_&46QDEe!q6lUl`MUYYL(RIjVWIZV{QE|b7oP8| z9Q*jFF{*>cPox*wIMWA&7AB*AU~^e(Lu8jKev6W+pVJ;t6xVP83l6wmmIDogSc0(M zsRGUp?T5!0n6)I1FNP&GZx%X1sqE8TEiJ5}T`C<uY}VRCR6|DQUN#%N8T582%bgZ>Q0i@f|FY}5`zSaA0P`Pui&yju(cVpx zk-enDz(LRtTBLX*+#VWAjJKINcMcgcoZiPgAFE;pMutJZg$9O&l02jgnzC>B{(S;M&#Pn&;Wdo4A5yD|2~l2$ep(5KPyiBZt$CV0 zfCTTj{m%^teLe2-BkGQ!if3Qj+l=HvU#=97Kkm8WhQi0Lnia>1Yr6g?E485D;kLR;%_A``7iQst@K- zEuXb)+6g&E>X;JTwzVy5ukF1K`O<9v><2A=)O&b7_ksIVLcWcIKRm7|RKv&qB2%muM z4^@knS?pDcQZ`c};MZ$D;LM$JpZcVbCg}ga{dI~`bl3czYa{SuD<)71b;&5Rw->)L(D_nh{Af*T)ns2EjK2WhW6IImHbLzK9 zZljhwh1qtURXNJnib}q!Ox@UzXXv~Pdj#G#o~6Yf-)q|VuugKsYB2n9&PJ%oF1mEe zeq*G3P{bZBq>a$Bz4Vcxw{+!)T6V!OCf~DM`gDOHF!2$vue5$;LEAl(;>E`Rdv@4tA(RuvFN(G!-9 zhM7yAogub^Lg@V*Ci3)*wMPl*L+)RXUs{@{wi%E9H*w`N&s0^Fv*BXNDO3t#;Jz~& zf5qJVD*L!J_u50G3d^r`E1;xnSmMf{2YPoOX%C%uRo7w<(w*5l(uzJOYFSVj8%cAQ zR{Cts8BxbhBf%{L;%L!OLWBD)KD#%@6Nqpqy=kt7KZmO~R)B%$0oV251I#Vf(tmtc zIvU_V`n8*`cqF3p`fl5x>r=w$=RrQysMlV0d?NW?vXL4K3&Y$a{t!TI<#RrA##jN4 zwz&Ti87B)G$9u2-JaO_SI_<074qv6_in+=eShNmxESeNJmvH@9Z}>-0l!D@gGMlha z*m*^6R6CW13aIJyscw7qIPdx<_fDwaPHa#5V%}@sWPnUQ1@17d-kfT}X8bJjpvY8E z4XZT?$))~-&e3}|&Kq{TAxHRD>Pgc;CtIoH$0>^eAHb^p-?BZ((1Daonc^F-A6kRF zB$yz^gXz--K_yHw?YCZ=PRpuKxo`k>#thEE;x{ufXQh^mtSmX=hfK1^QqYxGSiw&C zT=_Zzl~w9WVDK|PHBHy8KWO;k%%MFdJxBS2WRw-IilreAqQzOS0!0$C4v7)_dDALC z@thq>{mk>K1Wv^vl~pFtoC{;RqDhQ@P)AVj#^B@U8#gLX+qr=qwGSF^K_NJygELsGRFn6Tm~(Yo zRsjO^p8j!?iJjv0Pw~Z$W@J3cK=;hsW-4fZ4Z1|&j8~FsUkkMNHe?7%i^%tJ#l9CB zWTDPW3*}YHBW`k~BMY{86GJWJfq@k|TNH>|G`My{=OxD%I#(Ky(d!YqmsX9(i7|{( zR}VTZBwrLN!5Dcjm4j6Y{)hf$RO3&8ru$iuJDc{k|nP9FQDj>yc-L2H3%N z^oqU-9t<1gruE?fvwQ9Oqo{J2eSKY4d+1b{1|lmp*$NH|-uD5D-L z`hhVd#@LJ$oUcW+dMZI0aZ;jnG_->oFVI$`4IU_0IaTpl*a+IWR#&aT)yi23|KuS8 zE1DV%&rq1pjy(JH?n8f@WntI)DT$0HtoT72+}CGjD8o1`e{kblPD9?ODY za>S+~>?IjFsh#+uA0t~k-=-%$p;l*UW&@^4ThHrjMn>_JFp^@guDFZlnb+JJxc==S z&WIVM=`OIS$#VC<^HE7LNBdVg+*J_V9%B&2E0r35 zhI(a&sN9(NUb*3X(3PJ$1bHgQl|+sfLDjpxbZ-B$5b(oU=1V(gr1#o;!eOxldd3nh zNQp~D5xA!0Mm~p8C;YRQ^2+*t!mC{rO%gHc)W7`nY*g;(OH3BX@27XUgqXokOl(U^$Kaf1F?d{`05NDWua#7FX16mc0pBe zf1ahMS)32LYr(1T_J~1G7;xhaKmTMWf2_1Wc1*CUG4V4%^=PzzMUzGt#Jo=lq~y%zBE#CG6l%Yyi(Hm{%OcP{NPjKPXrIWeP@qkW8#9IJk6JQ@l&S>V+g&EKp@8Myysob+$9km4T>E zI4|38I&r*qc4@ZK`tZ=;ln3~2hOq}gRDkT`kVVO~i8Fd`N zKG%F0$nyJFYpEdMd33lhv#tzvg3kB!uN>)HBsgFRwAFzL%_sPO0QJDS zU(|GdhG^;##M>WjWGbNgpfKh?>@-ITiAIlGG8|eW;Mv~kz}z+0{v?qM;N5`PUOl{% zW;X6M5Q+HrC|WhEKNA~iPnNt2(0(gYs-uq-(%0?e|A;j*Ngy)o4(AHGbGeS`U>G5w za7jFV;8$R-u2m59a^hoOLhSi#kDBDBMB(qKitK+ySc@L%Xz~j*$5RZTRXT{(kD}t^V4g`NpJWf$5oj?41RVD9UdKWQNyzD-VD{ z>PsLMB6iy1Cd0;nZ62ImM^*S;5GYBGMJ$dM&1rCN z99@rwxk}3wlHUO z=;^=w7)8-bu!7oieFFnR$NHE65)IfF9m&D&{N3_f=?xLWMVCNXyVXib6VB!0uBMM} zLLum-)=_6yJl)#DRX-FZ4)jWWHf!?PCV{a3)RcL#H%@e7>zs{~aKh zmyq9~dW`A?;_k*~>vQAKJg#s;fJ0{10L}DEIdZh)sv8I>N z3B&QubZ3o38c!|XUofi$@*G?HiTswt^0bqi`Z2ZAVHU0Iw~n{NJD%YLHE=OU+wU8u z&t%MLWpd85!wsLtrwCVwONZ0sF=8x+Vf(<8h7@&Ef^^E!lEbwFk7|0XSx{vk@XU8y zn(@M!-~G1G--!*PB(hDd?@hNt*N_G9yMB&69TZ1X(GmE^)~-eNk~X&;?d%*G!zmtr zxuv|W&|Ox-2m;*-Cgm+vFf)Qn=)L}XEt7EYouD`3NO*R15$-jC@JpB&{1RT1LZUji z`kq|^ZSeS*WepkG!D{m5TxASVr1+__b{MpayDmKl2}cS_2Oqok%gVGS;1xD{d_~%X zpp??i!vj%nKD3jk$>u*F+>)HfJQ(b==2TN?-hT-DeEY6=NgJS( zs={;`G=cX+aUMikCOWP=I~s;-@SF>1C1(woep=*S5`x9JbNw3RAbqSaP#(|zqXvX;t%=$*lx!$2iQ5~x!;!D%Wx-R} zu$Y|38otdmfQb(?%>c&kf*i_4F_k8ptt;-&pm10!Uqac^YaPWv=JUrYpZq5(3q-w3 z>%s!Yjipe*uEL6yyr~ohjH`z1@2T5~HVkA+c7>Mrv@PZbo$t$T#t%BDd0VtULLpg? z--8XVU;XiDb9S1cu<%r+x|dD_;$C2rjEG%3u&EB_VB`J0X>AX8I^m^z{ej^mEbUwl`ak~b%)h!`>8LuTI)*cL$A}gmungsF zy-reP4W-2HL)6tY%oTl`Gbus_oqvJSe_c9n{gjL(lElgg^;udt7|Hg6Gb-m z%s0PH9C$=`wgkW0+}TutHQj4G7PN*B#ctFKc-VX|XjHI&zG+EU*GlT(M^rQHJ|nIF ziqI@uY5)AY$Fb6rn$ss9n$o?UMDj-l;wUXmK3kR9zNzVLv(jY?$8iv!rdDA>R+@s>7$)V&(LelhC%Wdd=D0ei0720 zOTH!`+7-pD5w3?siF_1V{w{l-KI&t=$xUC0B?vo|WL)crc9&9n>)ZO1`?f8xVL)k& z3v~_je?j%Gifp|JWWxE#I&Az`ai;wbL(4>Kx09PZPO1W8p_6h}>%<=EX)3#SnJR}a zOy-a1?M-Wmh47EElfx2exD%&R9Xr;wZsp{wrB>Ux*n)jQHUDUIWNIep^1~Hfv})#; z9bfEuE-X6a2|R5~C=yvukGK9|_T!%Wg+Hkt#Va#SMtzgOu^bN&cq6-B|zO(OYhCod~D#bsZ%&L3=m&!O(#j?>tXZM>?H|jh5#D_pBt3e4QI@m_fR54oNgTZ82a28?xe~JyUHt*c zt(g+uCk&954Bbk{>oBkUfuM%?WzC+=LfV=hA*c8#Qm1~omw!3U8)}-NaKBY%sjw|3 zIq_vyl1MfobN|P=K9alx9qy@7_P6zw4I-J&*_yXwr=|f9p!NEC!_Guu+u5EWun?NJ zN(44BUOXp|tX=LJShEOF=OfOgBlfoZz6`qMB=tT*IRnWi2 zA8FM1C%kHDQojsZ9oVa8FZ4oFqU-h*_#03*ru;Q35pAt#1WBW&2u^R%JF9eUuAN?j z^(!B9Xs`zhtI+x<3F6{8uHOk3Ub`#?3!5tT%vxJNQVi_VScdMNP(_>)osBr@S9avb zmDH+_Y%Dgg`KgdevW2FU6(o1E_r|U|7u0{W&s-H)%TX<4oQol&HhJ8_9_qbbWF&dB zRQ2lu%b&3QRL;CrH(}|81S4lh;99NQz9W;pkME1!>OU)U*lzoV2vV13DMJs&TJP_$8QgYT&`pJ#=ApxC4 zsbMSN@j7D+g6^z|iPlQNPkkt1_yv(T8?}45$p18;A7^Cb?|P_^EX|o#_BH5Cs;Y1) zFUE6zs3yrzhp5`kA5ednsU={nY)`h*+!Nh~>M7Is14V_!tEeY*QVu@mw55N4=dXTT z9q(_=5(e(2`9Qv@U*}j-e63@Dp&^(R?anPH$0W|8x?Qr6+__$FJ7hIEe8r|v`AD*; zx01>uXhHi;sex8gI|~U|O#Pl@SnPORigUniXG^_%8V$~4$~IlBZoS`NtV% zKVjoRH?~w8_ZG-sTJ8;EVbN+*@V8Uc8~w_9@$^HCZ{wFSo)?2$j`gRF$-@lx;_KwZ zwV&!n)N9(W^}gzwhDxK{1)3J=6-W-Bu7RGBALaZYmcTd!mVc|Pd|5vDB#NHQASsE~ z=sg`EhtKvLQ9Zql_z<>zs<=tzQ=v;-WYhtDF3{?Jp?pvrI}JCPz??r>;DA37EzaH~ z&SPa~NNC>PTQ2_E3hc42Rp)oael;o8J{1(&&T@*hNUbGZeFJi%mi*vT+*96uQ(+w0 zo5HVlJ+gS~kE-IR^}BUenykli0~m8hf9e9U)P@Z;0ifq8J>)_nRVUtcO8#3@l8mI% zzNfAvP?z4~17dL15j(Hw)=t0-UBQD~015PG$cmfn89bC0Tpr7=9 zQyf!KJn_gvSkbITSxkhae~09S#Jk^8%yT$}!wPU+RxQt(rV#e_(<{k+MuC#jqYJBAdE-il z%f%RN-ivY~$EoCP)N5<$$v)ctaS`p7r53CckO`(>ai$WTyaTJBP<9)nBwn1^vVB zorUo?H^?lai0f~wKblNV8T8?FVnznSdj!zQ8IeJ+(XR6htJKkJ09sM9)A2Y(!pi-3 zwsm4J>!$K91!wFPwMqWO2ReVE0V22AL)65j!AGW_?Mrpy?m~4bAIawj8DWKEAh&_pA#$ zC06bnkqb%d+STwajlh0Mmy6iA{9XLFtACWJUs8WYB6IXuYZi>f9$Vn=ulI|AYghUU z-2ION4O$%&SoFI*i-v?QlRHNaPA{TlP`VZq2Q_Pgb9>kZoEaEfC<#!%0%iSN8bfTG zwNY$Jrr@6xh%MLt<-120vHaXes4tZqtu@*H&Q!ZhruY0gx!Gs`2ASj${vz*nQ0(af zG7C*yL^;lhPk!ng_tbs)|p5)4W z6oSq|R$KHy=@9XFqN9m7wUbuC$Lgb(9VXPfh@>V=Sf4kTjUXHJ^d<|>0!bk7IqJ`g z<~T)v@*!5CVCB-L`96!)qr*?_0@8gXy6P^)(LuqnCitoP<4hJc<)2-qiEoK&VX8;U z$d9cfbbc{G-q-Se`G6ded3n=Ri%ipg?7_05Ql9>$D^DDkh zVgA`$hGfmIf8}Aw;!2$J?c*2 zr;X446{iEacIo7)-AZX(mZ8H!$(c8NB$36DdCU)el(un;8tQrm#>KiF33apk#yrKJ zT%R-i{o2pQM5`rD)L4zu{9ZNPS45rb-TD1M9?tjSLq{0PB5M-O8G^Td^1*O0C7*BG z7lmyrku)m3pr+BBISH^AwGtx&SO_~T> zcWzTP!D)i3zU#$vYzriJm#S*W^BLqr3?bH#{r?Zzv^@63EUX#ooo5ZK^eo>EHy8VZ z*&GsvX{orx;y)h2zl3nu zgKG`CqqT6a2@mC7#tHKLYGf!0vrCn^4ZAUiwj-yJGFcG~&A(zj+|!>I_vs$R&aoNQ zt&&r*2}Wf$Rko@(qU8Hk*k%GOVe0AH z_*ci=`+G+@9nwKwN5$P#52zbU6z)z-#wni)j7(fS!(CMU2g2fTjST&;c~l<|xJ9!M zyNkqg&a0~ts-yx1)38LHcOS_}5t&NFVyE(=t|1RQOgPI09MX8!GG|s{OXZgWvUdF= zp7dD`kK@0rMY@TM-aB8^KWm?qU z47k7cY3aM4dhVIdH2~v6iI#oX8~!2LR)aKGWQxV~0R9Qi5$LWI;l|c6Oy17=sNR;5 zZ+UGC$~Fz5|ACr;7+54d1f5L~##sh6NPa9r;7s)A)kWvqT&%wmCEmA;1|P8VU3W9M z{NTWsk%3r2vT1*CGhMlNaYd^pFcSRRiM*-0@|qZdZI)1(?=;XCIB8hqCrMtIrdEyR&XAN571!v3A$g5?fUq@9&K+frd<)cF5VbkivTyBV7x&0x|>igXJCqZ=k5T@nIgbZ+E;ZQtMh{k3zp zvvYQK?!BLPJkRU-hs!y|Pp{mDnPrO+xK<~DyxR_X9hZZzxDD5<%W-KMR*?n3$Ed|>NoXy=NJ-+2}8006yM$FsQB+SEx9YEa2_H{?;T z8S@h_=pVE`c|LSbu9QlK;gUn4iNZf7r2_ze&==O$86+72WiPi9=A9%@=Cj=gwM8}Y z)D_iC&6H~e`CK)CjIhg~Gw;9<*Y|oqPi1_|IVFAkh{Ln)g@lsBNBPutv_h<~f&h zlvwq%E!?hkxg{fcb6bactI=Z>upk-!EAzl<|Phbc#jE7z$ z+@8bvQf(?u>*+{gs;LTUZJfAwKfiH%F=#0AofNNaC7fUDE51t}Ju>YO zF}y(=ZCVvZ8y|#15b)o{PG!BH6_GZO#*>mcC!c>l3%Z@%NfL5&<#qIl&#TRGot&F0 zsi)}?Agc}rvj81XEKi+AvsH%2GUdfXMuoY(Ik_)1$9hPY}W(AEUt=j8P!p%(-Dx%0%0h$>{(e5 z|7gK}xu+Xk<^((*o-m|XDLUXC*Mt;3%7;9$%q_p(!tp*ffdf}FFXE#E2&1b1k~q)5KZ(QR`&%7hJVx1Ym`h7QC@GrC%D!?bOFbSRHP@GUrJ zK&!*9q$?IncrTfL-ztpScnH}LO35F2kMoIx9GUR|w+g-qi$VXJaD)m@-2-d)8X4`l ziDsSk>a8JAOg#__d?JQRyHBQr0(xgqq&~Q$m1u0RUo`KbV%cxMm5ocb?5AR@BJ#2tVXSJf~+m zGLCP3B-=gkA6bKv3N@Bc3neYr=O_0j0w;u~~uRXaFg((IM28ZU-N@)V{1dmpR<)?{4vyhwoj z%1uY;TBe?|z)3=Lgb-pv>jTUi-!7be&+ZiV^h#6Geo{2wzs_sBW}m$ckarL-GKzkG0tk_EjF_U$9%{Uq94E2UUxSrSGZS4)AiM^QEnc0z7t4q?Vox7FTNUrJ@OrD_JuTdpD zsUkdRr+b?=a@$$bmm*aUv2MwA`)I-RWpkYfr_PGFIvT+B!d;aJohKM1IPDMD?!YBf z^Q4JK!1Zs2yyygj=M#Ubx2au{h};kJH=nTxk3OS5sbm$3(zA_}JAi~=V~Cu$bfNf- zp^)Q}$arshIrFYDO-s~hF~U&ot zbh<+cs-v9791E)3Q)h=jJ#&koi>qFBi^C$j#$$YMJMFt#n^+6|zWw=W(*XnJK_`ZZ zh$gV%9nr9`+*?xa;W;#V%*p5lfri*Xaq+Dt|Lp-G`2%`ua8w6Ytz*t@wmau`E3t~; zc-`Zlvz8P)L(?_6{fZU2G&ItqY)^p`QbxVnR@@K6zNL=`GNN=5(mbDXv9GG>7x1Ac z1J~J+yc&dJ04Pvo*e)Ub`36_BU3eu4HE2}{aDxwPWsZr%r3=6rmh+~Sr0_j+!G?*jK8`G5hA8-OtrH^6eoQaPGp=Rs5Wecwp7*Yu{_`5zqcz3XAQo1qY0}0<1%QBhU|BO2Tuj zZoEFA=jc?JPD5I6JQc_Y>Gi*ftfAx!B0A@1ySlBj_~Cv4*vHQ~C@yi~3q2fyaF>1s z`Pp|CC$?9)Dgr~ZM7v}Wb9OablXm{rax3iyr&$f5u$sAuS7(UNxmW|lJoxM_PB0f+ zPNETWq|5)l)c9+X#JgScCMzKz-kmRA;w}T~akw`eUhjNr@{V-<;L4?2E}h9S|B}Bg z;A5Nz1aq8t1uB$z3RZ8ODG{gee$KMK9i%klHSM0xjnetmmBuM&&@t+-86o z8XW5@lbq_@sPelQmwuhTyEUT@m+I?bUrF=z6@%6=|H16E$_+ftin&9Y`>L`j=px!l z)8-}UWJKlJ*;PFXpNW}itFWV-vWZj*nL>O(eSb$PYJCC7bZc}8Ocbk%4;#j$#HgPA zGt+C4l>}t0Ri1EY{RvORe`G7MfC$z-?i#Wm27ju`@?PXbMA-^62?@`g_!X&Vy#Job zK)$Dv?*KBqdI(=)z^=XVuLk!vl7u5Ej(CVpSb&t3Zh%Kr(9;m8uuJ)vH(Ddp2;ETl zt6;Z~mUkhV)yt#dFs$nG-;Qos24`-$$y0ikC3V$f>6W5YldIkq18g6(9wI@^g)$QO zC#=WYIq*R}FYBW}TK@{Q;=ylKKhH5#gP4-2m|o9&S+0VBWqla1uh;sIYyotZmceCq z7CU3y3FXSXaZ>s4v)>jhVx52e_ey96=@ZE25C{|98@}Ro6sGD%&@FV8NJeDpeGNnc zLW8!awl#a=!UqAaj5o-iU8}f7-nc@3X*iN#==c}=^j4q7 zVu4FQW^Z$DY`uo7Eon?JR!iv&B$Xtp;>QUIzj2|3DH0w$)&9j*A?Z~8q&863o0CCZ z0Q@xn7WyZsS<%Q%s$uepNRb$4LxpYgQP+U*^w$sZaD`8v6TgHK4pcn>+fB~+_}4Cl zJH|t){*3QVMgVtnb%gZ23P|h5Qc+c&xBr8wpFOnQZsGdG@?q{*S&%_5iOKcRpyO?& z_g*zOYHzVpMxrr~A1s2RDWA!#*?RUbUdAFll+sxmel9*xor~Jg0A_i^VzICl&9cMoqk2VR<6=tNSN6DV)|l zb1GS$htbj$#T7v+mC|RcnioOdYE%RI>((mS2F1I}*ov#u^u465jQ0^jlNw@crGMy& zy(7;z*SRE4m?oTpWWF=LOn3RIG8J!O?10=2MXX||QSOCBnQWaOWba-1hsJ8qJuPh+bhoVQKy^Trgv@N7_Z_IT-dE0H1GI?OP$YW&L_ z_i3{7o`;N;_`JEP;(+9DPxfyxIFsQ;&0izY4*RkJn@f>JJ=4JSl25-s?R$nLHtMUQ zxPpCFo3yuG1Sgl4Uog-HJEkc{y<3QSajyA$Q69w;;jf+(b+`2Il%o{(O<^5kbLklb zBlf5CjvO5gV8N=^d1~IbQ7$m~UaKI&WYrcKE6>;E%X6 zO5&Tp*ufD^jt<+eFkREfL|5%GB1(dPi=?qF#Li2?Be#J(gxkCG~Lb1Nz@ z{*TN-Ny2hx#n2%-|m2~YNoGu z-B;Uu<3CF;n1jAOkmu+Fe2ts|xZtmKSp?Qstar ze#i0d?w1>?0!NKB=3nHUyhb(5f3czgX_MsaDwblj0vc=5(GZoN?>87C_$-? z)?3HyS8kYaW_rtWjO@2W29B^C+822#3rC9W!s*mx{aMQ{Yt8N)a}blKrG;CTf7M!O zZWTLq-&|fVxdd|bD8D18WKGJ=QseKHxkkIIFDXFg$Sh$)_8a(_Qt3&&5PkWKLD&UV@BNM1uI|V)AF0iKc>)K`#Z`0H1}g zPbv?l`q*U;G7Nuvp;C3k={%3w-!DBxv)3P^yxtF9=Xc~vv8JJ0v>~xFrG>#H(4Wc* zs^H_{)TKx+$!AK|oJPIOkEDCP&C5pJzaC&nTq38C-)X$OYkr_zI!+nik~vh=lIFT$ zH^LjTpwCrSkhPhU%e%?-sC1Q`O z@Ascfe|juiLG)(fpyF3X@ZLpO8%v8A?jxO^O7e*F6}VBQhN-x~B|PYhbq8xdPD<~Z z4KR;T-f^SyIO>XibRBb@v5Dv5UJ#90yd)uCHkFsLCf+(V|6yo5cI^bSrd$^Iqpq39 ziZEZ3{;VZ!<7I$u%KepNWKqBBQ9>*Cx8Ef;ZOEuW)5@w`Z5FHugnNV9bL51o9~TvzXBW71nw6IGxxN8Ju(xx zVM+PcZ`7|s=;4XoSUgfG-xAA{Pzia~aYu#oRm1%6H|Y{jNgH~f^4iT^7wO*NP&&?k ze5=U;pH%uPhc!-Atzp7NBWLLDMY}cJx*QnY$zl=BO?>U;GWQRPni^Z*N4_YCWs=#X zx}iZuReY{XF;g$U%06QCX0FX4flW&3T8+iE+h<{C*eJ`@o)>b~O91ja2pn`bgl?sh+C{;b_AFk?q zj=9J4Ml;_J_kQiksZp?U-d(N)5H#%~`1Ial5(6xZdDPia{PAUS9-ZoXxCEw@bg`-O zm1&Y7hkt|axS_^x@rT9W?}MBpe{Pp@ji(@T4LaAvIIq{Va;tMzs|}mZlu;vv&NIwQEIZMaue2N zq{3WPT9gTHd$_)XpP*TAw- zsXQ}K<8e?JH99qt=I08Wq0gIl&G?`_s+0hnVPQxJodTq2wr82G^?~abe6PPA9Mbd2 za^7f%(sbzsaYB~FAJEgy{Rkhj3NVXr1Wfc>$Qn*;$ebHZz@^+ebg21LKX&O;uU3ox z3F(l2T%K0p4=y{B`Xjlnre4W1{K^b8e&*1fU#QW+moCJ#&8-}BeqO128((dK1x4?* zenguU*G$!IC#}w}in2elmN(+j)d}|qs0v&zv|U`hZr(t4UMP@dZaS8hah{e2nB+(_ z5?87Yum+*t+&NhPymHiBtF8B{md|as34#0U2Qt5oY~ZuTZ>*%>n!2h(6_g(WG<}xX& zt~Cf>(gOcc41{8$RcsZI4fCK0iT?t;`^{{U%)GxQZO=a5>4{IS=KYT>fJYDfRHsr& zlz#_oO8~8tG$!TV^`p~d&XX+9*I_*d$6lxHwkBNG4pVy%zuVU4uk%8Ek3rFHtuP$R zYVR^l>)n!pyzNWrW^?eO>33Pl0g3t8CNw2xU`Mw;grdZjk55OO#!82RZYe9|2E-b3 z)xiys!591EK%LBorD|mhB9;4Dx0nrY{_zr0orMS8g|qLMExKBd!rx`L#xYlIRYLmY_zDLvnZ9bPKA~^jq99Pkh(6~htV=x z9|%IM*WEb05j*mIMmy`}8ZYevzO6P+F&j&CH%tuQl9hkP@&_TX#;ot}If?h|zv01- zh^@37Pa54T7-DbKc>C_B1^mxb#8+$9MRnD+9LajcY@IO_*Zf6X0Gr*F6hn+m_3QmN z73OP^WMntDEkDxQKXaGnkDMMXOEG6|6p*2~o%!|}HA-K8&q+_C(CIRD(df*3pu&s zI}tzHzel=@RruZb_nUBFQ28iXX%|0F3q`*1I%uy4YYfb<>tKDkbP#Ghgh_BlY<@zJ z?03T!G;mWnAeL8ad(3zi49w9GBqn?+ZjdK3_vSZid~Q%m1VOX^=s`@@xx_<$q)X5R`psh0{;9hnXIV+P)VT z_S?xhMa>~HjzvgtW`IkCGM%DbYtPH+J!{7o0tf*-Tl6P>H4Gbu4dphyj4BcLX^xaO z+_~q2`hHfOmy+V6dGXKR8f3RT*S&CdhOb!#;dP|7Dxf?8f`?bqB9$iPJ1k{X86z6l zV%1Ck>NmvNj*rVx;9A{JYxsXx3L)h>t{g72Gy1QORDE5)a56!|>AZw{fL?l@Z|IB# z|7{gPi{FsH+pY4bB?PQH6}BN~lS_2b_q(A(lOsn|?l?OnwziUAX+j>s=78~nV!XE* zj+1Z6IhuvYJ~D@E*Lq-H<%cbkAGoBzr%Aq#8#YUJGXE!2b7gni7CUs0FMnXrvz>jW zlA!v1-Z}04k^B9GfMenu8DD!mF+CDk|N5hA0T4yW1neYFc$0_Dp(eol*-tF7TH^15 znp*)bkuhQv16Csqfn@i!u!9nCWb8@eg--FM@s6R>(9U5d6g)=AxtD+X^$4OgA7tKk z<<$Ulsg4e01#-Fp2mOSJ^LqYpi1wA&#}44_2e8ev<&%bRV?&T##K%I%$IKHm z6V%@+zQ^CWjzR^A8XOwz7kF1YQb1hhg@}Fka)-3Mc?taaJ=Vq#K5diZ@MaZgkFvR(JNk4MTQZP+$Yj)3m}@noom_s$@CkZb8{ z!3M*_e4NLI11P?%3M!_9c2r7(f-;SBFh@*%c~7(t-V#lu91jJ9@LE-(C$qC+l0wsh z!NsRNxhYWE*prUvNo7P2zE0RXE|)>4#&haf)D!5}Dm_NI6pcIG4{7qp=!99yPaZ!W zKPA$Bm_(A#)zi)XMuy9w5>6`=GQdx|#AoDq?N{WpE7ATPnMVMp;xrn555 z+@2RhM*p1N0LApPmY76^d!@(r2^h*fYqtAmH-W=1bnMe_99f z$^n%RSA%`7TtW+P$LGm$1zH09O=aQBSN6xUPlEDc235(8fgr?`JbO_dY7n$_*7E-)ul6kiRXSF%e9?{P7Fhx+MWFLKkC zZmd2uo?|(dmtI-oo7q31mGI^}Ow;F&WV)Kr3?e7$ejElUjWH*%o7+#FP4|AVe&j%u zDyPt`om^|p@2=T}3N!A#Rh_$$c6P^3KV%|#3d*EafMTOy8Z-;Q zbZ7Jzs>BsI-7zX!iT?5rZgGp?ayZO(C8L5l9 zp((}}9`SecwhSYw%Zt!jE1R5#Y(?OQ^)xb4ep>;^ZVS7^S6IJdbj+G$NUVXam#)zf zk3P7U zRp#K&o|`g(0)kSh!wr7lVXR5h75Pe^3Z9fcmd|-y#6zX;1AX9ouE>365LF1~(Mfd= zT{vn(ltDZJiOeS~fjzAT`x%|PPbs||59OGgHE6@0_LcQHjQ@OlFMR0bO&_+UKY1xX ztA8Kf3_uztVf3+wF_k2Bj4k4tr=|>p$KsyT91oCo!!t2ZRU=I5ui|bWxkkzwHE8H)oif#ldSG z1DO*eBnPH2>p<-9xAKjUhvvEh&pCd4%yrMI`ku&lBrk{JisA_1624R-MoU?Uo!use zK|WrE;Fku#y$X?O=L!(7BAMRdwYirX=k}@L@d?0%PA`cHrV*)**-H3BNwqMecO~pS z33Hr-_+MEQK2CJ3B!Oyu7q%>KVf*T<2~RAbW1qg5bg~T9M0B(U-P;-c;!$#X^$pE) z6FLn0X}`CXAp?J+baw?ryHGC(~GC}UM8o4`EeNI?(%=ZB!+lUZ?jGFCq+njOH9FN z5&5p3E(g1J8@sm7We1)ouipF?cj``?&(hEY3ip0x6#wvaCKH3f+Mf+zBa49!9Nwkp ztL^xq;TwXDxb=@!C~rvY%0hVekgW)T5urTnUV7XRWiWC2u(fo*NKe3^cPT&bl&WMO zJjS!XeX7{Lz|bL&XOXC?J@C`npFz^=dj$sTQsR zEB4*y!@VfnbN{9(CI03&+^gV@2a$WM$BP3sfi-Uf1Nl)XUg(!bqAySH)sL7NHN7y7gQr-4Aq$58( zsh$J>T{u%ChO0awjpp3M|HBre)1wG7%?IB&CrmjWG&%?W)=l-M&lG&$@Cr_@l=vB( z1;W0er*(3@0`!*M$2ehF@8)WHZ#>o8Bz4Z;0<){`LpC?m04QO z%w*;sD_0o#wxu+77L3Hl0bROKk43+MHoZ>cc}L~$T*5%E3(V> zqXP%6e8PM7&iA>-tV2aUm7F}Vph$|jWLt+Hsbj|8=}UQjI(QyBt7IG=fW)LnDk)cQ zlWuDll4fTZ{p+LQY1*zWqpxqbM6p#%%|ahIHzzL?B@D7J2_6@JJRT6D8tR7MDj6{@ z=CmqHW7pq$v}(=8a00-5d=}j6G&m?TX4idJuDiH(jVOA9nF+SU?^V7nY(5|g9sXYz zm^7=#<7{f;MDnM+X8Y>GK#gAan9H_??D8!Y?kQ%i6-JAtdz~Wu34A)O5&bIJ!kBD- z{mE19@|$A(f&3|K{E@S?QpPmKL&qGvlz<9m0K;_n!RvSVEBlx@REt->-Nt6mu3yr# za+PAy?c(}yF5F^o{>HyAWGE^!iaz^LQl|Gc#fAA-Ru4_pOb87eh4ae+JWk~m+X@A< zKiJsz`;%5x%Q!!1$lNq$?cx6XmuAxryOF0{kfBhTbLN`s(A4zy{_))${w)eI4~bo{ z)*E3Ski3j>EJ-o$9;v$_L(^q$&xlQZV&H!N!8ecc-xX#kM{bUm?w3f0Cw__ffnG1x zAuaEJ-W=JZyX{w6uwyAS4f|EW-{_pJ@%71GRK}11C*=D>_azTWx@#xZzylj-VM#X; zRlBqM7~O=VhIr?|_22Vq`Tvm>4E-w3!mJ~RQv)dd+t%*#z(Jte5scn zps^8vz6sDpgJMY!17g9{cnY1&w>gInX09stAH_8PVxy)hhld=)lX6Ym{r52xgGp>K_ z$2@-0|L(b1e+Qi49O4+I*N2>9O*|+P`B|eVT~F5|tK6siwJO|L5aI67nI@JmN|#2X z+}!u+PQtlcu#eCO!ad`TzW|0t?8n16O>A1cQya|RmSzRWVKAQbP`au zXBiI}{qZ!k*fDh92od3Iq17_YepsEPv`yk9s0fFT)e+m$_r_07`sa^$xS@l&zx;dO zDDM%hSBCkvZFoXlljMzwv(GB%8>j>)BGXKR_8^{6l}jUFTQ8oH|=$b+)Ti)P8)A|Jdzhj;k zzNQKHQYy*Ik`{lA=DFv1cI+s-Y~A9J68MzYQ1T%KKdxs_<17#*v!B3Eh9Wcu8^*;?b52ScD2HnnLYlZDPCzNvE7h@Bl_m~v%@TG z<2HB#x%VEZxV2kx)e(SLH+H!`C*QxIr=&NX!9k|FVL!3Ss4=x;I(do@o`9D=S|;4t zJ$qP7{0@D(NPyvEY>?b{vA0UFDDgkWLFKo{1?g}7q+gPCT~LErpRaGG7NkacBT&eR z4h~F?NU3_q)KAG@;Je@?5O@W8H&PHWTQi8ek|4r<<2AaLvAT%Ax#;QIZ4wvWHNOc? zz6tJie;~&?;E43L=w1E=+rv4ve8dVxjca@?Rt;SMc~7*bwjDiB{cz`VPHtc9MwRzD zFj+ZG`HxJu5c*!pkIy~Bmjhb7Gd_gtWpoWO9{$4fsfl0{Ytjg_J{$ch_Wktg$hVGlNz|5{OKt=9+ zpfSn6aGHdBS%T3fD<;E1tzF@&w?ma=*0g4jX+T% zk^_br6wN*F3-0SO=-dfP$co)OXpk6@*fp(C0|UPZ{&NbJ81fsdm>UYBjFHFYAadxL zJ^cU{-0Te?bRlYe2!8zO9C_4p+7 zY9y%9)CkYA2$RdL6Z@?62y3uPDqnG@yNx8TY-V({E@7u zWS+a=`+dQs4xJ_zTKAH)>%*7y)z)6zJ$<5LWT%(9cAOYXtbSbjxKZJ04xxnbi{q7e zrM|?tMYesq!=(-}?7*XZ%?5froPKz+Mm{D>aa^@CK_1Ab@-?m7IpINgc9_Y1C7%^W z?|w<)Fn7iUt-xTF9QK=b8jS!eC@dQM7MMSI4!d^Xnw65isYWu*f)9pRO>3rTV zxWuUIRTH5H5o4>?K33@$JWWL6lDI$?2)(Nb#>&bL-1_47S!^u&E7Y%tGYcc_&TC~ z*V*$Qi~W@hG&T)QYlopzWP>u8NPX5v+}t0-v)@0ivnWH^1Iw|6p_9S_#%ayKtkZ+ND zS~Hr^b#>F>kOkYmd%0zi^o-I8*$D(E=Cb@p=0-oC1e$xg0xij5YnXJwOhJrSU$Ev_ zsLZ(Wh0Q!YBK|P9xf}o8h9SYxLifn3r5Z2jzAuyy{S89S#*M~jna)GBkhM*d2f5ee zg=(UEv2IF~WCwbvO-nH2>h9alSMOve-B9jy=n^B8x*Q_HN2Qd&Qi2pUpiq;(0|2dQ@G%ZOV8YhJ6RLP`cf~-HCs^+uJTY{qc>6Yr{extDe9g z^_LD!i$@ZGY>mwMB9NHXs)hm6;O$@IPDhCRy~ZrHyAR7eA7mws*oOy8!NevDA-Xj0 z%D*b$gU)M>Kkv<;=5T6{S%qHQjnV=|>TRu_PyQyt@ZZpYj&&1W54slcC1T1aE=J^m z-_GB4E@g@;x)5UdM)jSAx<>*9Oah-&Eb@|hUDr0{E+Rd|oexGAt}q>4xhw=eeBhPk zZgXE+vOh*d!nOM3_|LKB9O(codT;2bmVY(vx#vDOs@WeU77ONVwItmjrnfRx;D-#G z=cCio7P3A;t*jyn9#YHy6YL5dk%+xAWxaF?D>XH*bRe1XaDXXf4JUgvzWE^C@z#sd zhYZATvqM?8f3y0`t9!&B!GXlF+4{gWsAzMj(va&|pGUj7*B1)bQKPq-82BwLo%2w; zI6;M2-(d|^uJBbuehRq)ba0%8|jgDSM@!y6a#`s}$+hc*rR%5U8^jUNDOj&UX z3K~h7#1=Wd<%IeT{eWVWzIf|6fupQGxpY3)&Ns@D%>Ik#A-Eof1?K6Wl%#PW5{>q1 z2M<22pW_$}q8WWqoD(`D95*lll29FCRj>Gd+EsmE{?~D@!=6F??p2FAC>0{;*=Oj{ z_)Wj~hD}J0UiS%(HDEdm2^tdW0^PO8g`ejzecqf0X@2MDLU*HGjs|CV4AhT5yS!70 z<}xdn=X8;=>coE7-h}0IpTgUPyh~fGST8f+9?#u-gaOZ!=F-Ht0tg*pkXyxydCTEb zV%FS=^r8ayD*ONxIh$#Z04na}iy(D57#>K|BBb+U<;83j6E?0Vl}P@Bvceeg>0Oq>DmQQk ziNR>1-{OV$HhXGa8uDlDnM1Z=6n9_9rO|s!(UiwJ1{r6FV%xE&=F-N`v+mP-3By!6 zX7h;TfKM0u=C(DadhdNHbh`Z>?rpN!ui$NwlY23i%)chj`Gw^!lKhY6QhaECT`fX* zZl?tMLtj*B990ReobQWabZPOS{h(mA#2!y$|(9U2YlYeGUlUQJByX*D5;>r(@75EkY)HM)FWT_p&P&aO1G4g|T-C)H zjd&H_Wl;F3g($TET)F_xHfi@ZOtO9H^ar0io3oLEOV<3B$MY*#M8U_SyQD2PCf0AI zuarvZZ@(##8`%E4U+D{D+#PZIa8%bwe_67Q82$n*VaTDMiz|a=_u^KycXQ{L(e0TP zog!6xkoScbEuiUU#q1vg-`SsasZ zT7&N_%qvB!8r=wwo4hKNBRG#{SXo2x zz^O(zpaa~V=Nd=V)75w(AIkIR_){x|VeF(4>*Xz&DdF3s;BbmPG1TNE6V3#2Ob1!v@2RBvQ!a`@Ajr#-w!bnlxlqFKGCZlc?ATZS)f@JLB-_ zjQ_|4Tey86ALNWqEL6X^WXDz$m=4bpKC4A8X}i-q-?~Fz|Hk?8tIg@~rvib%!tPzL z@nCM9@qQEzf%(^wje~*TO^E1bWcap=xbXAmOWJSp*Cb|g)qtaEu|+7Y3nhsvXNA`< z3XEp$hfY?+onm1T?QHE51FJ1@!@jHX1|>QZKpjhthP^s|w1zh|I7`_o82O{_9$QIo zZ*XTZ*kp$!1qo=uSJ~n}Vs+Gk^au$j)4^-^!?pf7 zw?7FJurd!^O*)Q@jo)_S*&|s2hiyE1i?PnyQ(kf)wfMb z72Gjf?4r?Fd;P(jPs&TC6RjG8mtR2T8cP@Ja_Qcb#`*3A)k((I|1|VWbY9$osX)c2 ztZ*y|Rc@82OTjNc`WLul$z*f4-|xtER>V{2=DwK_*{@2lmrt|a707)Gi*O^4JrS`9 zl--|vW_g1$EmpnU>TZ(EiNP$k;)mSG613w>AGncX!;TZ7OR6_cS+U`y00i=J*X;kB zxwOfDdi2x0^T#shKC&v44 z?ti&%IIpuLM;p2g9-quET!Tr@ z%4PnS>G?VBB688MT8&r&vUS#-TR8hN?ZZ*|>ZHRoDKE&93$X|Wj$I&|)4c?880eDS-u;I15HeDNwhyF)s|Z57AV+`AKe56bgmby)Nm)qKlzBiS|3RVA;; z{LZ-LeBa}i&Q4q;8JyvB7PoNq-Pm{A3W?@3##+AekI)x8>RGvB+6&fefN%RXjwgyF z`2qvGv*jP86OU=5<5D&9d9?XFVO-Uh``KdrPk1QYct#;AzExhNdfxRQ?%57BK*#L5 zA9s7|89jj+@KBKCi23bw5D#oEpp&OY#k9(b=6*=z)wHgI2PQse@+e~<2d%Zu@V!lN|}l#6)ecCK(qF21Xy7pjfJ~pGIceHfS6ncvitTv zUnxU-q00D2IE}NwiG!0ivA%h$(Gp#MkIDM+)@Y_D^fbTeG{NZ`D;~m|MEl-`nyn)z z1xP;8K&G>bdh3RYBAeBY;0Ry^iqVkwUxJ@BdUQiq~1jOi;cN_8=Zl1h3Hgnj2e zPhJlL=#A*VA6#4c^WU4ga)t_gc`kwH6M-16EI9v12Jc{0QpBdK4P^Fa#Mg(Suzmci zMwqLbjTSG64?5l3D0RLGmGL28$zJ5)d#MIxZB1--Y@IT<7)L;hPGjxo{%CifZ*F&8 z{AJFTTOKGJNmh=?xxY4MsoFj>od5zV+;6WJ_#8Pp24%Vg1C`xtAhkWF z)e#MvLv*I!X-~wq59DX(^)J`!lquCDWWMvhFy7FJ6q>5v_v`7-crD@|Qen|&ZSTs; zvC-7@A(1aZ#Y&SqHQ{}nuSfe#Z38JyNTRDh;gP}jORTW@f{6%>8SJ-u5D-J z5hu7`zRWR@BT*^&tVTc2zWF%iN2O?ga;X_(laN@DBBYu7-<6K++(|X{veb_|WI9EkOGIZ!fyZzG?7Iu)rv#o zugF=x1~P%g3rV1Cr65su8YHCb+a+Pm_@UprqZHOK)UT_0} zOk5cz1hUoi(`Wv_|@a0W)SR6;Yw;8Z?YNsH%Fi`nc!LM99J zFHqUC;;_rm-MkA6fA(c)N04(#=#V!d+17eiu&=4JYBk$>FZDs;;n%J;h1(LcA@Cr|HzeiR%BMNW}0bw z7zE9qeeG(Ye~C6~^Ks}~8&Z(RRKtq+9?K#T^{0lIh^t=?a^cA!bn>XTIju3>#*uj?OZ7ftu)zd@d4<1EoLpdW59uT`)r zjvi2b`IW2(2-R@LccIrq|14bLiW3H*_%ZCB3 z!~9f-wL<`$qCx3MkR)V@t!+eiZyJ5B6o z@tBD2eSfV=#qlz;;FuMM=rnM!tRh}q$OOBm3zpa6sbj!BHOb*_c{?D@R|(V_mM5yC{V(=O&MXf==& z(6@ZHg~R`l+WW79{GDwm;$Y$sT?%YO-@GyFY-O{>H#ysVR}#BM#qX6_Bfvm|t#KuF zUYHldFH9G<*(KXAP&AgB!Z_yKbizxWE(J9^?Ik061KV>Bi^BbUuVenMY{jNgt1hff zRzypR{;ok$7-XIseT6ZNQ}zhFo3|`#H?x?KQhFRTxnP_|wLVwy2K9a-|JyIdgi!H} zw)v}gvEnzu(RZ&0}KpQ@BS8&XN_-Z2sk^UEnIYuLZqg4!CuscSm+c>3X#K%0(}ig=H~ikn#Xm z6GxK9Ewsy-*jW09Eic;Y?HsjzdgS;r{QV^TO8hA!ZC2Qnl578E z{+J@w!PumRx}$hFYOIEFX}j7NW^M~N-vq-Ukz(JL zj%LY$%h2WdI>A5kfCE!|6!ek4t4S<(++%e^m6L4&sPPyUU8(}%3#9)!LJ2$wF= zvGuR%w(5o|H7eI)5|go1aBhm(=|VVU@e6`oY#<_2!Lo}G2H`GiZqlNap)R)pmpvsrO%i96iM%Q7 zm*X}#7~77pcA+VW61T%S2pk*9WD%<;m$#c6_X)preN(1qGkp~x;#-|E`YHpZpM1d^o>Z#`ly?-DZFjzcmG2Zp|Tc}aJodV#}Fo3Q) z<;GV()^^J%J2N~vH;Ou}+^$*;X1t}Y^o(o-#bG;;H=TKH8~sF8>*1?^j>J^220+`I z8_O~J7YZK6FZ5y-1Kl}0LlG@+;ZRSayNxrOCgqFvKhU=ra_^lIMa9;p2ceuD{#KsG znf$N&zhGDyTr>KM8rJS;8@d`yZVeuHh6vq1gt58G-8N-Ab0cU{Xap~=kp3gr$TIRk zy2$3|{gCTc(<)4p{nZ;}k-oqEe@hOrYY9qT1FmaW2j|5CeP-yAZPnrAPOnt`Bg@S18P3h}quif30KY#P(r2+Pq)b9GH&a|Q!j$@nro;S{|T0Ykp8Mys; zcE;qAfN+@6H`a*4t(tS$<7vaf>#3)5{X_aUi%eF$6&xLJGpTd%SA_t@%M}W_41k!~ zW2VIz6K)}+7^6!j3>!vrt706(yxA}5B*{BE&T?M)HWkxH%|Vx^}IWbNs?c2Mr-o zH?&W2S3Gzlv9q+ZirlmyJS2Z@l)V5``gysC)JyTD(@%IE$=!>y3x^y!S3-wF z`p5V$6Q;G~1MZcA#h7(>0#4@=JPuJ|E#16m=n1HS?Zb7wKW{sQH;kOUu8xk2vyP%t zm7L&M3}x+`lV~yTq6T8Js`l5o;1ihqvrexxF9-hNniz@1cyC?E#PKhY@Dx=^s~W~J z!~ko=TVS}NSn|WG`c?mwa+J`Zg{n`2bv|avdg99AT=C`Ax-F7wu`@pns@Dm?d2~$w zOuld@R*yUh5}~oL8p*w|U2A#RTJrgq2KU4(GR!8CE(@U7RP%XRPj$MXkMyHj0Ol3hOn#o1Nu)5~KA3!0U`xJM*9M&}vA5ER-1+9ec-A7Z# zz+5W2_=OIuXLh%eEwV>7f2s?i*03J5k7*yoebeO^c7HtyQtVQ)DAs4OU3N4yvFo3f zj@>3Ain`!w2jVsQOx5UuIh)>}DO0j7_sTxyOZ*%<%zh@PxD|1Qfy!bJcoLx~G_g69 zQ55wmu@kS~;g>EHweOTZVo*M8E?)U}y#Iz}Uh1>Y!knz{;_ezs*D{FUc)?6ALpEZG zm!bs{GczHd9pZH$isszOpR~~&ouOYsv0&UYL@cJvDbfc_O;lE|#%o8(8WF!BoaX;7 z{VL79L?=)d_AuFbfs4M*rtoQl-(C3iXTJ$;%KFDjZ=;t|1@$?(+Rw|5$D)8U9H`jE z5ikR%7K{h%b+3NvJYAavYC7F#)=f!7d)nFbA!{wyD6)1kKXe{=;H5>7I19EGDzPo& z`j{vv)8%=qs`_PR<*!f;rc>tDDYhia0{h!ZQ~K=4um8t;T%SE$PJUAfTM z>JYv0@ZEn29AjU8KYq;oZ8dRp_2vImrNs=$twuq-Me8(XmmXg-<;}>cHSohmx3zqX zedBOMkK}{N4419B*uS}i&&minUvz;G{h#T4-G{Lw~vO1?21Q2=t!DCw5!!d8{!uK%&dRl zTFHLO+h%9(u4gAxd`s{5tBx>T(mywE1ApP(Z&CcdW-8KM^;W~IVF8>OtJ4DSpq9F^C5 z3rDTHbps?Lk9G<;1yYlz!{&GR!{n$kLGn{koysfU;%R8CHOq~Y-wn@9QdHAP@8 z9(963Vfz3*O^_0sQMo+&`m>xpx4F`|t!8SV&X>g}Q)o4Deyz~T%u_J#1M$b1cTjGO z1LMIL$kg&2iAH9Pm9V&&$qd~x!uc&4wIZf=+9dp`7d;|n4(MFiwr{HEKl~ku<$QV7 z=A!H_rWdth6PPj(!H;)}x+^zb6Xj@N*yVF(rwB{Hsqck-yLe%7ZWr1Ht<(%1hmQIsfA*VG$qF1wz5ZrKKj1HnzhxDmOWnsVLe23qb^&~7?%spQfWmJz{ z!H}2+2oItN=H!Hu=G*?|-Rdji(es971r4QwF)dUCE{E)A4-D2>cMrLb(L<G znPFG}aqz16L20n$(ic(e`J1+Y;F(x2^*g|2X)->g4ads-N1=0`90u#y|O^WTu208K`w7ZoxmWS zf$4f>3)5ECRrS+3m;G}7+_`b@_WhpwtG6bI{5S~VN~}52$pas?qB26#s&4*0zF%n| zf%STmHgzVNwH(n{Wzfpy{k7i+6z2&nVA$KrDzPUAI#;Q3IDY9iBlzsytQyNje!#d7 z4qUt-uJ3vZq<5SndQ+N$GfyS8Fv|DPGYiumD;^{k%@%MaW2^%n(}rOtVmlM<9{3&3 z+WulQ)k*w;PK!-ox@`>cv19oMV!Thz2)@sljH@BouYiEPffU+3!JZ9Os)-E^BcW+L=XmsXW_vH#Dirhcq=WG3m^kj&QY}n z{w##K2T6YSuR7r~Ysr$t(S9k6lET=fFK}7`yT0+_&jX_N()dRk!W&eQHX$ z4Y@xD#w;QeCP&#J<)5HOkAdsy51oH&@9txJ+3^_02iY90K(qqza_1&T6%;q|X{+5G z%`vg#h*q-O;Q72fB^dn~v&ic)CINn3@jr;bA}Tq_Hqy4IrGTdxHM9b(`tdI_B;%lq zQBm$B`xV(0w#P}1N@(g6z^iJ_AwpL9 z@-=1Pa~Ze2xs=g}>^1}klTl+$?f_RpI|YBoY+$R8EUl*6h(`{?t1LQ++S%rcuOHJV zFmw#4+i;e`tr;V|2sY(2c^F0_wXaFy68?GZ2q79!m(mQ2R#gCvLjq>@is zv?;CE8Rz&v1zHpa8w^%qXtu1_+mWo>=V>2hQ)5J*TK?}G$21CEv2GbL?7uK(iRcGy zDx#l~vm5#Cmr>mM%S~>Shs~VPCtQCRXUT&-amPD$jLVRl^Zo~&R;YNNJJBcBkzdfK zOu=Q}2+u$k6T-$mXC+0}D0<2lN&dZ)0&?jpA zoj+&VFBq4ga{d&O0Un{%@qJ)Q%=D#HE^=-$A;88Pz4`MPl0NEFw)^_z=a>0yA;k0y zyk9x|++rG0W%2PP5q+T?%tu^j*lDg+ z)E+=xl;-!KOB>PFyXS<@lg@ulN%6u$21~l;JUsqt3+Wi1g;q5t;?OdTZs}?vxnfDj zhsIjF_Q~S3j$c>f(PwJ=bBmrAX2GJ`;YA0mIE)x}(&4@_Rzsm)Kh?-PG}(WLPz3!5 zDQ83B4ovIli%D{LT34&rD@Q!iPoG}Lqbn_VEwQ;kfV-H_KM z;Wqn-V0uMBO@zJ9ou>ljN$S^%>I7D=U$@xB?4p6Yo(?!MlS4-c<`e-n=4xWV4?`+# z#LE5bac#{6(=M4HWd4`L@aJQlOTSh6y>#V+5H0dK?}}sBDn0I%TAz7CWMl_ot;Xwc zr;mt;AW63nzJR=sY)j^EUR*kvvkR@C>nl7e$#{^ZN^^|OL)cNS1Aa=wsydm?nPm&? z){EMf1-6JK;>&oWAC1ZT5Yr!3!J0t9`IQ&|qw{}Cct1YA$Z$0$M^oj|MMSNQMLeZ) zk>6i~5UP!)l)hX|PAN@6u6Zn%65^w>9-&5O_BY zzhX!f!kccagrcMORYddbW?jay6sv_<@kG$Mh}sdQC!MT7JODm;5NP$(n>nm|3rT!q z!QyznX|YtC@|MK_lHjCf7}D57QUn&AgjSq(kCww1kqH!rF%_=jFyGd~j-g)-LG8D% zDq75OOgz3mz-Wc4$dS%2wY7@fD5M&CqxN9u*5}jof#`j^BhxXVpyIkOYq{A^k`Ok4 zYziE_S4IYdZ)Hn*Ok-D6cAS<_|0(M`A0dj5a{hrV6~Gh?We zql)7CE}H}<$yP{2$O7Jt@V50a+3Bz|VmH0`&kG=a5NN)ZuvCZf zd7O-a?2->_O+>7<8u+AP+ZUI^ zClZt`I-8{$C}ZVsev7+5>Lu%tlr0!NepS#9H&Y|>LXngKFwO|d7VJvAw2VTcn5s}j z%}N-=AbUsC`m?btb%bt5{9TpY;FtW!3^WzzZkCPMf+z>D zUV_*N(v`BkvtMf>sV(aY2#CF%#S)TnM@cas zsZONQ2U$!fBBivb4svSdTNc9y@;euB&lecCr?I=fp<@1if056K*66L!d*yA_#@2d# z?)tpf5Yq1?Ks?3AT)LQ=x{(j#rg} zu;11my{5QrKYF`|+bc|-LHQ+y7qN&0bNOU(5j^qKyI)tX%FXi;^?%K~4A00jJSY`# z;SUa^xgL$>pc-$Y0#YIIP;1=P*ky5|&_SmqEpR^jbl_d)?b~g)Zd7m1DX!jKigP%9 z^Ue>Q4cOp}BGpvLX$WV)==9$uBAv63Led@BitR1lnn1**d=TPB1Q(|Mnf#OSvL7WX z$~#4r#-Ymf^td5HO=kc@p`Snr$rcXH23)<2`TqHj8-}Vr-Uzb(IIZXq8u#Hv%!PD2 z<_3uh-_R1iYuGb(O)5)^0y;rKt2+ zO@>GhT+eTO{%*wLooe&$YR4`J8+ha~t-NF&?{?wiFSC<6 z)aSGuO9L}jTIJkpbtL=|d>r!KVex{IVTvy3d8(jY%gg#5duP*3w~>T$t)Y(56xpi; zk=7uWyve5Z?|iK=H!fX)_`@QtcS%OyKo%Q6^S<@rSqP>??1hF~>Wq7%g$HX_CU-E- zr8+r35ewUH_y=OP%fk0|8Q`U#16eU)t8;GBGmOl3TA|i%mUkaZx^ugK;s#_u=U{gt z>?-m?FxU#$9DSq6W&YMD0bz+NaM(2Uq5|6betSdzuM6jZ+P@l&_cfcFqqf=KuNp-o zuFGawUTPdw6Seji(yXbpm^`(z%g9yt@wJSSv?|E@FwA(c2mKlmd~)$-$Le)4-fbz@ zm)#}cZU!Fwh+XNUMw!0vFZs^P=*tTHZNg}}N^zTs0!kMz3-Q$NLegIY(DCJBT^2<| zwc7$&E6+3i7GPs&@0}op)O(BM>AduwZ_y3VGLkV|U z!j^TtV28OU(XH(i(I_{*yuX=q^dR=g^R3s#UtX@7B|8M}^*@kKT3cXE!kz#l<3}H^ zjJ4N-MoEV+rJmumlRm0_Dcy$a9J%U0`Z^ozJT_tyYls{D{b*?WR_AB;C|XmlON8}) z2HO4D*A^F({4rglDi-9drLU#@_Um8r>pera?R8gpS~&PsK?6M64_1uTyld?Vkt(ZKY8brY z=$lXA(V0`^EE3=EWIdwUQoJHgtuNQ|k?(PjMh?ltyM=51i~Ufwc7KY6MeA^!Am6qaxgvGc`*Dt zpS6jz;a`KhT8qOcf##KvwsLG^vgG{R8E!qEEWqvJhghn}nHkwxCADdo4q^Kpge8J|`{Lh`@Wke-e|^b3QK zuUK@N@Gduxs2Z|kS~6@~%)Fks3av~-s$9ZruN=fu_=AN*8N6 z!F8+wUa9VFQ}^|sYqNR&(5(EwhnKX3@4`oh)3H>Zd&a+kn1iQ5k;NsM#K z#D$0~4y)~bssHf4I$GzF=iA0lMrT_#CA~>eo*O_wWp&=?QkGI>c~B@c@9o6fB|34F zcR)0ph)xdM-;6)fpEw-QYuh4U>pzDH+Np)Jq65VHP|zKlz7gfjfHM2Dvjvs%{~zw^Q}7+UlQxn5SFq*~s!Qo)HxQPc;&Q*SR$eNTPnY16 zXfJ@jX#0ZB*%#c02=5TyCTy+}VyrnwY5-RyQnBAqwOHe&gjOIBD&Yi7b;hg&Uj3bk zY`t5z(|B`ZzB=Ds3V{A>RkZF{b@XWCf!W7@?y)9m1R!B5$$x?uF$ko1PD>gZm8D4%q5E@F;{~MdvZjdsQOKe7?NOq!*v*#O2k|W~Ynm($>5ZCfg*4httM+%~idTP1e-aIc3&Qe%z+TSs6 z9JP<>=dv`YUEt&7JA8Rny!IydWlRS(CGMc#-Uu?@S%-dnCy?a}^aUSSsY7}x_C_5p3(O56 z%c<5FHjNto@F^DgQp#8M`45cH7jq~Q#&PeOE)_Tk-Q+=Uy6?t?eJRH2pS=2~*7E8z z@E3^}{x&yq0qE_AL7%U%lQS{zy>)AGIoTNHcMg#}Ip03LD(v@U*i8V^D6gt&wHqah zEjwjgVY))Yvz#0@;#K-W2T%9|s%rn+36;T4x(#k;>fflO-qA&)~^FD_F?Mks$F?5o4g zw{-~z)c!@xd2Ty$3&PH;XHRC-6%TFyyjE-2}LqnX7BL^_2burY}@z*Mr2wMWMmt zX7q^Ku#4beqv0Q;!O-O)6}4LzdS|F9C6zaW0f|>HDs1zi+>*=3Zo)mK*xz_ zRR%_ov6IJhUK$={M98y@)hOeN*MH3o7ku3L`n&6Cp3rI6~FE$usP_2SVsQVG|z`yhVgE!B_+8o*V%Bl6Yk|0vYI^u6@7bgspayo z#;ng_2)(2+`Y92{p5pkvy*-<$pB^#T(Wf1Hdm{Wc75Cd;xYQ1sH|PFoTIh{)w?BJX zTKbi3ZzL%s>hjMc(LMe%iGrL$wG<-#1p?99fhn`twf?mbEQ5QK1en7+f0`PIXuO%3 z=~lL}UFmtk99CQxmFF1Q+W)KWKKAPwk1Sqh6Pun>4hen4X2QVyklRZ=X^^oN^$C6S zg}4SRjVU2owJG)T0CB10 z(UcIA)$^|KI0xtOybx7hW~_nTQ1p`7a@=*W*sp(}r>|{qZLB46WNiQU(v_EKL~OJv zQSM-`hhj!~1EIkz0traMM(rZU869dO!z4fFT(+9=O5)<%obq1RvPG25EeaCg+aZaH zZUi6lH(57G6twbZ`oeV;1MgnIZf8JX766_y41Y8on51ZemuXTCuOMM8)H;`TR zwXgWa#@EAAu{*FS1RXhn{fC`lVLoP1)TDs*j>vY0y~e+5M|`f0>xelxzmBd~ahEHn z++J?Z8kX&&?wnSrD@#)D)gAS|^En)GbQvc#9y_z zonU^NQ?nWP3%ohyHo!q^DohrKKy$hQJW!;F zD4cYg)hghJaMTyow|G@K_6E&&(j+pd_mo>su_ zqjKYN))?>ey4}9`weaMeBrlwjzw3%k|GI)_;FUnu!vV@nYX*7(&MA(2w!bd*ZA!|Dq0>Uk>RBhaJnfC zWy}A_$HtaAtRU6hEq5Cd5}28fBg5@Ba2ckf)Ib;up(L@*W3T!R?CkEdO)?xvrU?z# zND(%VxR=|A9KiF=8;oYweLY^-D+~t47H$yk22UZ53p^^iIqX}hBf2U|{vD~d~D zgDeZt$w6n5RuULOiYMB|XVnAv(^yEB80iyv3eB7EDo%L#=R*v=?8+I38~#*1B?0NO zcLTA>hp|R1rpaG#mLk>`C_=8E%r|FzM|bzpod!BK+Kvl?Kb3OJAf^Gaa0ZjOU^a6p z3Q5Fh7FZfenBt8H(@eE1R6c-q>@!h|pHA zdMLzk7LBG8Qwkivc}O&CS9l5Vt3qv)j>Vq$RKg_-!-I=%i9_VKfxr=e;B-C&lh4;}hC(M{DMYN^rcfP4(zOA`d|xp>}{_1pBdS|HJk@C7FX*1J}PEWwq4%q?XV<XmFn_qcZ7Ecn{j^?p{d20{+rTu3WT+?Q?>|sYO&4Zrd4$4bU}BF)zuRa3 zQ;*yK#pe7$JM50%m3$tiHPr~e!8WtDR$+JY#2I985&bbIrfAJv1)ZaRWDUNn^vTn; z;jYLDbr+^WycIm{(aw(GfY^)tWcO|9Eg}ly=gvf~B@eyTJ~hH2|7Kk1H%Sp} z)hI$?&K$Xk-3^wUfnkgqsv_kn&qwVJ<|fw)HJ;VX;G{X^aU(SRG0Cm-H;EPagB7DF zj3Z{M#sK*oe-QJP^j;cPIkLycmDf=3?yD6eJ(3OjFQ$;3g%=`mp)QR4{aWIe0j#*^ z?}FW3UI)i{Dit@s@6DgC~a+-Y$pxL4hVV zO^lt@3Z`&W-lM*T^#N!wZLh7i%`nNbG+2!IK2IMIX*h^hYr7{fv8Ty53*afLg9++e zVTzs3k}WILBhyVqQW4MZkN7<~EE-9mZQt&1^JBBvJS(m)d^~C~bMkmd z(+(ss22aSc6p~zm8s0MhdZ6|q7iOMS(Xx3nVpBroM6-iJhhyIh$?L<56Pzn-sk_W4 zGwg6$Yh=p2U5MgG<3;lN#}_A9*aEOlJ#^w`1oqE{*-h)~KH6bXhjYd}Z!D!%V!C#F zBMuI21_Cn_J_>?;_5GVBNQ?%I8-caAD!Eee)$wnD^dRiFUwN%q2e zjwM#IB_tQoh7cUEJHVrslCm=JQOW3?w?2y572fMb@IMu-R8j6G@g=;w{E&C-7>zxc z93cEA@+^r$un1-nSe{^eQg5T$pM*7u8SHMTHd-rn5E-miX~f+sLw{M?G>^Ykp=acl zrg_P(O3^Iu>L?&^s3b38NUX7hFmf1dPi3Y7dBb1$uD zZM}9Perezx3gG)j`at3lIK!DQl>;o+Si$ug9K}!HfBng8-O9POM{k8JsxET9*d!|{ zP|A4PUXi~d%;BtEfr=`QYTzHJ2&3rT1nmf=9qq4L64hAIZ+s?sMo4%W5-0I2rIoMQ zk4JmE7VYuDrp6Z1`#R*V?Z-$Fx?OnEy6#p8Y-zRJRZy z3ga}t4WB^$c&Ra6i7ENr(cP5#6&1eYM<9m(g1bC23{edR7Y8`#ICjX9Q>sMF_8ahp z@vj*Xg{Vo)NP+=yX!>oYX7i046B`}z++AuD%UOmu19H5^-mEBEJ7d*rHuw)D(UbI3 zXX!s4?a#tZbS2bdNJpF&*}=npPMbHK+dex8URJCf~mi;%XNP)s;dTr0H z)dxN>T$j-h7dGaZY`EFu8z@aQ01MLOfG~c7f5jOm-N#P%H=5Uv_LOLWs~7g zr?ZOLmu6Q28S1EHNvAHSZDSVKulp}GIP5@o1PgUNd^`lRmLL4?$>ZUEC6yRdjgGSXUJ{{=DIgor`oYo|Nb549R|+t%h*4 zUJXtN`24ti+VldMg>ZmOp<9*av%q`o7pAUEM31HQ&y+X1L5CRxWa44Sx(zY~)QfU& z&boL-SqNO%lUyPYO>jNKP{v@X@)v(R_&(H+(U)CEN+C~7u7~bRcnxMhq&w3rCN6Z& zE4clKPsmftVM~am&y}jS50eGaN1v*T8f zRy(XQel>0N{2Q*ztV(*3tZz%vg(oO1*B?hfv9KTc8)rS$NK=veU-h3BpxLiKx7hO| zG55CJGK|7$nh}db>{X=w+s-ZTWY3mb4d|0cK_Up|w7%pu9>zh7HH(;FI;Uku+67E> z>96Akm=v9*K+xAzuKY+h?<>|?Ixd`qMHp{Z@o6vN#s7qq*u|^K%czK+)Mm~Lo{|s7 zy=z#(n91Pp0x$YCd7mdIEgr>S)jIBX$tY)w&F|%J|7Mz!}HUqd!7%wJp5C;xWPmH2cYNo1+q1`u;mq5y0RPR zj*ke8=wEwoPA5C9QuV?sZKl?%+r!@OM@<@wE7LVo-vmt=;qMd^pk_N9+)!>(I$3Vk zGf~SH!?vOT{QJ}dw#M$x5D??GFcnaN=Wlge*L9-(O&J^E^Eh$5#5tW8*}1mz@{)k4 zAL<&y6%z^YIXBvsjd=Wd_mzXXe;ii9_%xc`v!vp5;!q+|70gv-k-SlS&ATJ+B`0(j zBB@MhUMsyi#Qh;l3pmFjRVKs9nd*flrQJ?&NbLb+PyK@1)nwC7tD6tT`OUA%z%R()P=+gyG%u9pU3p%K$f77EP zP6R}Aw?(u4uW&>wPHRb$1hw460GOicK-3+!1zt54|EP99y_~-pI$gz%BdI+RuWS;c zd{x~>WsuWHOQ$iiI>B`Ko-qn9ar!26uVdl9zV0jI-g>&oo?VqsG}PHN+!Np3LaCF^ z*Xc4YmuuJQ%P0tUGaAyIU~5>X&jcM!0&JGoQ>r0+h&PbwgT=ItpoPo9Cd3yL<=gXD zCtwGwRdrQK)7sU(T!U;J8_pcZr9X~;C>f(8`V*?z;u} zzB?AI3AOQWUsOfL9XDCGq&L7Q(`9uv#@*Cu0-4y`TS*__-6ad}DPrMR1oeYPv*HCT z&!4JTgV98a3;&qR`XTtO`0a*!FEDd2+{!ru4Me;rH++62APDZ{j7COWe`}-4knDU` zp}=^0US$>{-oN)I^b-7m8fN^}F zl3orydCC|KhiVb|jojQaepVa*f$?i9OOe9++DUcX6_=?m6t>b2Q8Vlvfdg$wAPZq- zJeGY1-OOeCX7n~hdd?qV3g=E84xi|Gc}q@JF5LFBtHLv#^))n1n{8M+jq$1z@oz9Lj8O=B zm3z@*sKrrCQ*+|O1V~j?{XH|2w!I78mR*r(aG{!O zFaLoajqH6TO}?EZlOh$>V{XIy4MDPFx=S#sRv>xN8xy5=b6iZ8UfW>U$C~VCni6Z^ zRj}~qMh7=C#cM6OCcfYugUGt`L&aC_EiSrGj&R#<%3oQ#`mrYc>ofIvKnQu0OQ*U(!Jr zK^A9#Jq#v_XlM_VsaY`i`M8IQ`ZA9-Htle3VL@-W@6Ls2wUln#I|VZiGh+~lmcoXf z{UZh&)n*vG%<+yx^)kNw#i?Btxf9X)yZXjtXgfthcjYh|Uxl9xLgdUKCs>bF9w*s* zD(XjEE1t7ODYj3I3-P44nXS$D{un7E-<31!X|6K0Nsz33Sy~2y36+?BzAmBOjnC=-J>?E)_eSswN2qH?wJD5fM>8w>q)39;K!HhThP;Rhp zI7f&Q1XwdS&qR((LB#EI@PA#H*8FV`4KFCn-zE~*kNO9)1K#`&l&Qm0`y0AC_?|kh zE31YQGID0IdnVrr=y926q5Hg;?}NM&k2Ts^@2h|eCC#R=R_8JUiAfyRb-8nt$6C*k zfv@4M-@A2h>_g%uYTzdBEA%E`g~d!CMYQhpD?c+NuE=u9bNmCTJmdAqceUxfmsF8G zW;W{})Ah-(2rUnP`WMELB$M^9)691(Jszo0@U@QcD>FWaSwDD^^#r>sesLe@psNvk z%1h|?RucZZ2afVeB|V7V>I{#_tfR@qk0WDWEV}Qc-Ihhb!8i@Xs**wPfp8hb_vznf7zRQknCTob^d75 zRuaRha28M!uN89mafVCFv%_~c$U@vtL5ee%E9_*T2fjtQx%@E^RnV*#ei|4a2XKC)Ugcg&$5MHyhTDV2qyER76OMWhd4ZzN4-dZm$?YGAWIGa6q<_AOAqW8mY>_WL6xa`m{C8?ixNa8)5~B*fnqTh$pgZ_*d-X zFOxQrMz;%vG!7Btxlfyi66ee2pWItV+wekCfLTp&xpwuG-fKmbW3tHAT~bwn;GhSfTUyZKbN`DA{-xl)42~2h$J8STW{Q{{teoqKdlV0zA z@a`&dgnDGquQN0W(fVTFju9Z@Cags|zE9R0s!p|8&G0932YL}-V#I&EAYfh}T^)~O zai0^UDg}PnK#R=)zl$o_)!?6!p@$Zm1BJ~rx*j1*dsb}|Pd&?@0mH+!c$%rCkkCTY(Y*{DC4waR8DrIJ8bB+j^ zCkjQJWF_Nd&m8+0A$zZL?0JrPIOF}hKi}WK9v;raeO~wVx~}K-98J$gt>!%09`HO$ zGw3JVJou3t%m^X6L5HEj|8rY%8)gUiLgnPv%3rRF53)CBpLqLw2QUuszXvY}aeL9{ zUwxJ0G24!Hy%%9)d=~#Ec={W&kp7M-sM)J;GuSy5MwjOy;Z|)NCh&_z-r8GoFrd>@ zQ{kf=TEpp56O(_)uPru@DZv*mOA;Yzue|-_Tc@9V9)6TdK!4G>{WnNbv|?mX!<#!H zxZ@y6s8^zEuf1(&U-H)+`A7eeG2*UK?1NvHnbEx>0y8~#^?xEwrH--;PRM*+#;1Ix zF!73Vul#wGyYL%3sKea!UCCkLZ&QXV*{;I59$>b)^D6<2bcjKr$QM0bOzFwKX$C_8 zQ&|5+-WQ9dyD1B@H<{#SOZh!OxFpsTpW>w4iAl55=A8zmkZIL0mH5YL2~KU60&x3% z^FFFTCH65V1ChbkHBIB!7w7cyNT(UvH(VGCd?fz=?%A61HwpM=UVaQ51-%kN6~dtPCf7k82avD4ce9I06F)IiejGu&K&oW zHB*f9V;wAiDgT{z4eZv%5iW?r0JIXc@T&S6LQLKcg#lNQ7jS8P_K>n~XeDmJ&L71T z@h3#8XX-Hx_Y2JD#_*KP*4o-e)5Zo?Zuap8cEA@ zWCYnwYDp;3TfI8@%K>D|pUAce0%`CNZ|z+MnJUH>$$&Dv2v zsl`oA27U7G8*nfGZohgH{YF_x z2XRdco~ks z*&;xc9*WE;g`VfO@$6ssWt8bWAv^tT;;b7ODq(MIuB+INYRDwif0F!o5M0Zm8H!<+qTd zC}K-WgNxB_r%P9d71q|q=ojnzwmpaEk9ATat=oL{%y=bt8UkKXZeJjRI&H=`D18pw zb+A0*7G^;GAP#ZeTZ`BIP@~oU!O^3J&#Ut@a&vtYaUt(CGtXp_`(uriV=|QL0;)_o}hr(%L?4iiYrZJp94;3?HNyi{3=!!_w#5YykIuQlXI-gR;1L| z1$H?|`LLwF<>}AYFLt$&@kTp3+uI#~DN=ymq6AdOwZ}u$p^RJ%w;v<~RtG~K;&O{7 zC$$8IgwN^s_ls4#$|VFgLmn5mI20Txq&j7k0=@2^K-XbrQds{y0OHK zOw{5fAiF?rO@K?sZZ6vL_qW+aUB6t5)IL7)q2Tcw4=&@=J~qk~ zsz=wRQ_TdZmP36Z)tf}OG~P>4=o*l-@Y8o@f}~(PA|d=v6vorqBG+{sw9tbH2m;wt$MBT> zM>So1szE3L-X~UaffV#I!R`rB@vtB>s}3ojnfPcdPx4QiR?OFw-f^r{=(|t$!Sm-Y zexD`G2!wb Q8Q-h(0lbaSa%A8@^2iQ65-nDNZl<%A&782A-;M}Dg+dxqP8T3|*6gXOWM6BreCsEm$b}_n8)y!^;IHZfN#=Z081oXiVUVW{SysEmu8Rvg zRZ47A^LSSg?$F8```v=R(&YG)LK{|u!Z=uW+rAHt{pq`^OrqnRpyht-h?vl`Q5EeJ$2a?CrX3&Z19Uy z?O9z#=#E(plhWWc5~;+qXzs8xNY~9^x;0v?)&;t-RI`BGQ^!|1cyv5rVxcAYvHl>~ znQ7OlM<_3?F>`%)3*0|-$ghn+65H~pJ=4#jS$Scb0u(G@#PwB%bpKBg{>=vzBkulrj9V6@`nC=OQ@O5U*^rL#?+xNwC1f!YS>6@#+ z`mI3^{8Eu;gFY`SYwj4S5H4;vp9iXyjFdZm%cI>7@O}+2Pj10Ue1#>!>^fu=^sa4i zyptK{e6aJNV!rZaUjKtXQipVdT)QjSu=#<2K*PtXri7j(TMVw*M?w>+)C@#N|KV* z8uu*va6{B{WcO{B{L^P0yJ-F>ZDLRl2xs>n6+x0Ki9{_HS>}XOiSu^(@Q`w|vL*-V zgr&tKxV?V&N~_g|iu_L%Ib2-<>aplC{i9}`baLEyA!yviZSZ{ML7}PjHO)660RN%b z7Ke-nL@o^ zjN66%H*%;c+0~T!{vdzi?bZfh{b}}9V6ggJLFX=5l-vJX3O&S~7;Qu@ZoL8hmt_Ii zMMDZ(5tuuvFW^0)icA~7RUg-%Zr^xB|6uDVg-XEVsCKZ)fkpJy`Fth6+_2Dn&2!B- zqk+cs?t#ur@9X&<8_c|R`glc{YSoEGK=O26m%*Z@E^Q_s$FFIvhqvwC&qYr!@d2I2 z0?Z0mkSmP?fP&%}$aG$61-t@hUf>9c$(8F9I_pD zEx3ZuJ5o!&311Q8PoI67xNvtXNO|8-&?5CbE&ux6AYrFz>%_uJuCy-wzg2a9cehq|4TyU64-0iGZMedn`vrGmdUtu`C;iwE0HF)_eh(SZ(hOxj< zVP1E|;`O_>SZmR(`p|TnOA$AiCoVkxJW<0ZkPZ}j{D+=W%Kwp>#5=>TDhiK>S8+f- zr=&;w`lB7GiX9z%8!iGXoVO3IT9+Vm{tTP0PI1wA4?GLv()z}TC57Qx+QHXI(qUNS zhtTencR#jD*BzF&6$;C1B*$b$Vk|<#PLXgeAmhsb_5z%oD+6x>U1^mLcCnu<^p@ef zBl}=LfqCT0rI5H81#51@(!#u?U%Kkb@LCzKNFJr3h51)Rb1zw%Ydb?8xs6Siy^3Eb zTm5MSg`XgSZqgMVy?BNEqm?B%ZW+;KaQQ<2L)mK07uK{Gbnnh)@APY}AAed;S5tI- zn$oA9?AW$9)J*A!+mtGh+9N~u|!S(2bIK^n8%`4rcaCzGvyw}%|J3d^sUBzf!t zJJltYRw|NeYwZL@9&pbe3s8+bl2RPt9AAw|_-JVZ)qO5^v~hElN-pcdn8Hj$c;T_^ zJy$h{x%T;iI*i}ds{ZM9RTV2p!$-1F3=+M^I7r*C?Ukn^nAi#v!f>&)Iha)enz~a9DuD;45X%RU5iyR3r z&-8M9gd?=>aR&lI0xUQOnn~$X`!k8i3wE)IZ2&<@q3Cn(_u9FvTt`d4>BCEy68kP+Y62k%qj2z9Tn{`sK+T*pd1S4T-=QGZ%2a3Mxv+`BzK@4{d7z`-Pl81IH zVkGu#3L{X%Xm5;_X~`10X9x6~$A8o`wBWDqXG*%uIM+7@drm)($XWJz*`f0H3->)x zE9feCITG|6-ib``3qI;{vc$(kZKcjsq?Vbrjys57o~InV5cxSP48F5^;WUU$?i@=m zIM@t*>o+qO28svQ09hDE%c!0|tZ(_2-p^X)z2SHnbE1y-myo#>mG|=eS<3Q;67CuT z?Xh&3Fr>+{QvV*vo?!T!u^0R{2mH8M^43Ri_{bxXUYg6{&3g2Oun<9Jay0Da!R25D zGXm^8z>vIfn|&2!=Xv_1=RK@WfA0yfcKbDqTpH#`9?w7% ztxb|!8hr$Q$m`$G7kcJ9en}EV09Nj_H>(Necs>X|Gf_jOXraA~{OL*SsC1!6@M?3? zvN6B+$D&6vc#@q5nc8~gtn-7FIrF<>Nqa}WbF-Oz^@=PZ>dz!pcvnJ9Q##dKBq!k$ z5d`g9;?B5$#iN*8z-9LCoZhb$kES0uAKLY67~GIgzbiUWBw?^IQ;$L~EHP4Rizr+OlxZaogJ2}CV}5&%fTtZNU_ zPPsj%VSKq2)F>Fvt~W}GlrP18v|#2Ugj$z}KLq+`U=DgA;5C@J60U}d@?IHxRS9hR z_72J?U3%u?g&Jjs29iA4ZhegK(Z^)&X#%~VD!ECEdds>A-ab%6fUl(2rHPyC(M_2L zJ7~j{2j^J6Ik9RKkLZS~nhNEsrM4yu281X0n9U4aoP%Cd&=;sZ`W4uWQ`-^)<%TQk z+`LDVWl`ZzLdJ!+JkzV-E~kNdDxTZ3Uo55ABh3omE?w8qSw_4E2<*H#bHlLmxy>mq zwe(|zg6{3r`0VTwH986YUnj?ai;*npfA$I`lu=Z5ac3C(T~lt1_vxNEZDI9d$G`cR zbEoHqFP<|$X1)QqD{mq@m$*p0;HnLh7=<1GCX`Z(?7Oij`Nt0#=IgIKa_iiM)@Zq~ zC0u4Cg&Jwi5@NBw8Dfdu-71tm1uCuj49RdALA5yv6{*(=$lvS`Q0TOJa&2^*D-E9W z55{gVcqF(ahs|0TDMNQ0(0hQ`pm!Wg=jZEZYs20hMUp}S@po2#T@t?EQthAO@sSXM z+dk4Br|)4&y#4mh?ybY)M4m4Z+1g`;k9+BYRi2jcWgqyzOQD+JjSB9xi^iZ6r4gpM z+^9!QoS7=uq{{!JlFeicHBumcncJsnj!p`FQoHYC_VCAFFasL71nI*&VLU7ACz0ip z!2-9mTRS(m{WAO4x9vh6W7?M%YYVG(}oFX8edEjIq5#XsYp zx_O^QAT6E^lqQA$n=N%Z^Od{iKm7#CkqKaX@+1-~$*ix+A9Ys_qDA?)C^(M1nIb?p zD>+S)&yA>U!K+$lJZO9=H`F!&tYYk0bJGXRVtgzGW?>;?S|Z(J2}Z{I`p1QU#`9kO zvTk9OBf)$n78Sz({ao+xaPgnkSc>v_3+$qFRW=cY^Z$>kyVT^0Y%5o|)JV;i7bE)8 zcIMHN*6B^pxvRcZKHBX!sdpg5frTq>`){o(rv!`~5H${83%sjaSV5Sa$h60Y8}2`7 zm&Qr8>x&wR=D5>uiXMiXo{x*Or9Ks8;A-yEGQ4L${Pmlgp9;)-;^vd$a4q8N+Bl}{ z?Vcd4X#j6PmLg06g$f`GMP-t_KbhldH@fbGvpNqTggY~C4X-jaezrFT&E7yXHE2e} zK$Sc$4&o`dJc1mB@e5rSlT{n+5cea^@kR;1zpn;-)Sc?-nv6qa1B^W)I63MbRw;B$ z`jpjcJsR~B>5ObyzUi}id|KhoCuy9BP`-C1cI!R-a!Q-*lbVl)8(zK%7gsqQ;tJ9V zO=MG-G5GYNxf0Q(B{Eb`XQ4gfhGdw6@fyp5F0XIPiO3!7w>53F`=(U)>e-W7D&u`o zut;*g#$Ah^8-kc76Rx(|^yAdO_-s|>&)$muk-;6I*eQ-3UcI=Y&BqL7<}!2|=r#OS z?vl3So)mv!D|!f{!02O@(0s3)r2}myx8!cbyF$mRR;F`NKlTnX7ewNNF(jVe#jDHs zEy^@66YcDdNjrpYA6r!Q5s?TJ3gu2WsV`Qv3ff+q_3Us0N zKc!x)T5en$Ak}lb$in;SMwG0GfpLj$ODF9fm`$`Wzx521^FOLo4>JL1BWn!jpqGu+d5DEvWY$tpBbDCIVs zQT`N>ipdqiEq!RYU25{3P}H;W2vy&fHM!3f<=VIErB59v_~ZAP(>qAP63!Ad7q)`h zTfzgIAVMJy_23UM^e%8}%G)U2NRZ4f;j|H%w-WQ=u&k?imRo!N6{R6Kk;_?bR3r4X z?4HPEcZg)jF_QD6n8k|FusNUbE5_B-==Y@IS$M?#=_WV#y9nEvug?{c7E3}d( z3D*igjH||!a#2{H^oi2BvjG9J>DkV|ga@EXOe%vh1uSTR7(?$HQ$cdG+I+?$Nvv#g z8O~zV_XUQvZA{(8`|SX)h5bHIAqr>2G7aF>p77av6WrMc>94>t?PF6NN(}eK>0ZLp zm_n~ImiVp`viaod^#`Sw87uV?I9T-=Z&3ZBTBg#JJhG!)(I>LoQ975Za&uNZ{T77r zi1>c@Md3_B#>&*0)j6osTaaBq#Y=PNxbkcM(-i7!eVP}c)<+0V7w@}0Mn4FgsmG9Y zm<}$(kem~h^y<&K`+rmetB+g$#u#5+zOIGXm~HeZEznQJQul)1l1B)WgGYISHk)x& zL8PXajdqhRudUh~|K3M_(jQkqG$YQmKjXKiiB>nNzU}KSM9RyxA1f96ZNot9I;sPgOk6aSC78*Ykd7s5EB+DFsmZ!H-FEKKxh&ZTuy}9Mn@36p>zx{O_*H2E zSZ-7rWl4*k{0@4_fuuk2R8zm3H&H1wt|s=4(#bjhE7@Dzal?{6my#kdKTtzw7;qO1 z6#ks>t_<)2Ed6C%PRQ<3kq-K~WHMkVz6{*_fvQtic$qowQ@w1BBR8Vnpm-?@h#KV* z{8;w`I}t$+J4N4$@p_}5;_ZPaq*Qvg7WiVMalGj{H($>>9+xeB39 zb`JB?^OE;1U#YeW`z3|3LVzRp?060+{>=DBroO6?58%^HTBy?irR>dGT?zp^+ImJ! z*)s_NDI~%V3ZOZ#b~W&F9tebb&cf<}V5LwiXKQ4Yx7d1>I+Z;bo3oGc!}Zmv#E*CP zUe>yc7S6&#?~wcm>BL7QYrF~?mdN|H6)*N--(+pC%dM7rRyc+G9~HO^x?T-5C{j~(aD%I|l-aF)K83SP`rkeN4yqSsthysfjSCR0=5T6 z2~Nxyff+lA+pc{bRLZIUa+ByyPc}OACqTP(A8R@;Rh7j|aO693iI565k{f7d>%FDC zg~qVCVu#+VY3mDLBcGir2H(=%)xU36Cuc{x`^4euz0cX+C5t2#+;_mEE&wo+0(k2p zS;ZfYjrFc-pBJ?xx%@{Zpn(8Z%}k zng+C`{FAkTA{G#yYg)jFEiq_q?4&#%RsSy_?~Mv1HPU>Z%F_dKNv8g}WG z&Vha1Wq{!l)j*Q{-y1)-qoxu=lKmBI-K8Z^7rXJKy5&_Ctzo>S+@tKEt5NrKwI(ja zvCa9QSnmRO(t~MIGSoLAPfh;qwxnXj1n<964mH4fSPLX%Mq_KQve;-Y4)93glqlg~ zoc~l$DUjm{uFs64u!l5`k*=&9Hysiqs;$B^gva$F83E=1oK9XPQn5HO_4Lj&*wW3Z zb09lALTehl{0q#Mc2rvtdmXXQqt1!#Y2D=p#F zqqjv~p{FZndiSPWSz#?|4z|ESWQ3a^)<>isgLm=7+t87v+RQ{m8=^WcIzX1&{o{`o z{PeFftIegi!y1J`?*-@PUATFWFmgV4Ic*8|1U947j>Pj}5gj?!CO8s}!nU%4?RLf~ zb`nbHU2*$GNa$a(o;tasce@4E9P>Iu z@5T7l4_NyBACZz{t(Tz_iz+}X≫0m*T$-UoS(m&+$j@TiDQ#uA% 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 z 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˦#& z^2bt++lhlU(vG8Af@mAMq)7@hI{bSu$LXA((RaI6)}bR(@D)rUU*(@_KjWCk&0$YN zRegG3k;sxTuA0X&V{*H@&FvymDDdMOkF#w9V4Lt!*URjrjTClS=3qM|4MNwO$ zkJLk*qSC2G8*7WfncZ;)t1Va$jCwIRBW(1T&b^)>Ie6*Sr#zEg`0DK13v`a?K8M%4M|ncXg`&DE@%$-PLqFIiz`g0Rg70k9vL|wH^KmPFCx1lhPQax}&#`kbf_{f>wRP-H zE$nCIh1bxo9aUZV!Uc6;A?RTcQbuLRn@f!(Gc=t`cQ^~=Rfs3$$?}?pP($S7&7yfe z4ue-jsW4<3`{O<^;g0uP;5|47Ev}Gf5Ok;2mNS^p#XZX}3o9S9e#Ad~v&X}e^C~F| zP()UqX`I^Q@PSRx5youpKKdBKb-cZ2xkVC$~>$Af5|3i0+Y(;AbzF_1! z`rV3yh!BV&cjL?+#Bm@V{+)z^6p{dWO~MEJkiOUVt{H_E_(wE*&)%t!d7 z;;^d%6s+;GkkVD@|<7i(I&|{wgQ;^QdYX9NaCOd$-TMO@deI zzP~o`KZ+=(WKHlZt9{95&s)InRzatc2@YJD|Ne#q zh+iC*Qr*4-y?0bv!~{qIE7suxApvk3L~r(fGvaI<>z9n&SGrnF@gzexo0#rE%c@sd zgS~CAaqT|q%b~0^ziazI>jJ0F+S93k`PZ41&XUz3?t=@Bd0vOZ&^Bw5@u2(IwI}{; z`6_uHN~3-fwCV7D43j+Iwtn&ZZ}&HLOk$tXlug% zIJ)k5s{a2^LMcfIg{x@T$)2}QG9qMeLUvX*ms^C)8$v0gknNJa?zOLxy)PNp9+!KK z>vBiG^ZotrkK;bhdB0z;=d}0+%P}9L+1I+z8bpXC)|HY2iKnZe#L!{9+{cr!vMEi{ zSm#hZ7eH-&*N!8a@j405elbivz1!3Z|4l;n?dIQ8yR7&rf}AV7pK)+7#%DW{!~E=i z9M^M+zdX5l#a|oYmB?2TQ7MpcN;Q?2EYX(aT+=drx3N`&+sMs=vbK+j= zziw!yZnv-8%;oKA$$qCbOJ^hO0AK-kz`sxTR&YlIX55*Tjh$H?tQVmq-yQoB(NSCL z{olnq|MBJBBEKb;m0E01xCJTx7)q+oca!Pcb4Y&eOqPwOa1pm%@R|f1Ku3NI-eHNB z6{~PRr`D9nBt|$qODNhFHZX5Ve`XRRdKmisnidDnt{cqIwaUV5z4am@#3V8&S8ish zFoej&6ntyao7CTng~majhw}Bh#H|fIn(_qFY)g($feeOg&=SUX0pXw?)oT+nf3F#5 zjqjj^9D;|9dv};td8=)sFW#oPfcyj_^4pO);9a)&i2*L8n-OETYAwM@%A%2j&$G_D zpBG#99QJ$*o{j=;faTn`!S47>l70{0y@~OD zaKh>1^71DH1G`ZuDmRG=!f8f%LmcrSi<(h?6-C)BxBWu%JL(4g&W^)MO#f(;YIVwTUcpl1sfz_j6l}WNbrr#fy&>05SRd6_{_StLx0{%%0bQ zdD(g&yZ|4FVeR6Ix${9k{mC)Mc^HYU6|D(yrG!y@L^2rT;=LReW-M@U>9x*JBB6sK za{6YwIhYfqML7q>_)z4h{``=TlV~wIWLep$E+KB}wGi_$Hy^u4NKA^Kv=pi6EDnrE zynAn(>*vHfoGYr28ca#I~T2TfL3QP|oj`g^MTn*EdS6%l-+HUv@wid&hxl9&}}EuH<$h6T$VMxcPSK zmC;%&+2nrcnpl~w{zZ$(hZ;6d)8{)g9Y<-0AeRdvY?LhEZOG=Vs3bd2i&7=YeiLH7 z`7SF~PoXQkqk@S}F37a<3T~QGRqo_Vuuom%R62a)UoD zM0~w{DDXRKzdP#J%2Bw;s+6c-`47u9-RiA(qQMNWwka&~sYwJSgF7X&F}=!iopM;S-o4eDpPVm@>@zkn zDEd%QbQu5gd-Z3p<0-4xEuKG)T=v{npe(^z67jj0AqEaLmKMRkbx3cE1{>?sXY(>H zo3XIR2d+#;%@=W;R5sv^dh9MN`{DD4r<9ehqsaG|qW&}(0p5Gp?u6mTjA#KG5QgT+ z){k_}E$a!TFhaf_E-2gVnO;aJ3J8#3oiB_&Y3V~voVs_m>8sr5qX3Ob9!V;QP z!@gxIoUMPV+;r|I@G{Ut29OsK4{Jy>#)fIl7iS=JiS3h^`1K%QvO@lnB=>~L zb$O#vD=s~r*1>X?oT|)tcXEv@x-{f*#xm&MEWJVp_%-bQqJtHgS*(5Mx^O{%B5^_$J0-5zh5MANGD&m6oyEHA;TwPkE_2hKa+FP@)A za7_8JZL`c}`IWocDiM_)9DwVkGmtfm7sD$DM?OKj4ss=_6vB@Ibol-E-j2PVal778wLwtYnB!UjngXFel1_f?b zm#AxTtFw$>OI;6HdE}Ck$@Z_o9gl8X<7O2^h>jS$t3+5w*2z*d#Kd0pTZy@rLt|az z)70*+YLMQ4Jgj{fqzxHdzMI1_&5vh^-p}bgpWRTv$lLE}J}qiaiBya~x9e?Y1aOM^ zmadnqQ!_ZC?vM&_#s1ZE}Z2^bERzXJ^v)_4nI{Z2w zngKdIC#pUUoUL~1e&d?R791@=um;)@9|wQhT4Fsud{g)~Bdg+fMoklM)$G}AQ2VUv zSB|4HFOa}hvzbx2UM+{V9$r#^eqaZgpN=dY`p z;+9h$iHmJ$97SEr%NI8)n&4Ok(F3EkL^8By`hUVFCYiHiqK;R_RJB-n?!nVD+i)|F zu$k@3SO5&*rQ}c*XS)Ef8hy}ynYZsHa{kuKh24YbE00;6oHGXA$*1q@%njB|g_H6zR%I&Y`!&Oq)O`u2XyvQL{81?fqyA-%d+Rqta+JQ(x~?w7 zEB_%~JuGT?!QxKgjv_oEYT|Qs(z=&^>v!MQ^;HFcnZUfRVYOuTDg%Dht1XZ9e>8k# zS|B945k)&)QL~5wnJBIq2_{fxy77zykrDT?D zvEz~I{}iDmw5v)^)*QA(kx|gfh<>494j)NyuEAexwZpvr!nl`0hhuV^!ugCZaxJJn zKvJ`TC>L`Kl3D(Vc=%mdL(yU!rzawAK#?} z;osM$e5YOVR6J7CT7TFjkwGiRMM%o!|4W@wgV~0fISSu<&*rXoShxB2m2x}#Rn;dK zmjn0Y@28Q3rQSa~~_L!8f@{zZ=>MT{cnyes${nI;#o^9cO`p!$M`JIo} zCYM0e!OO0d-RFiIQtXnNT!-Wm?uK{y#Np?(EpIg&it>93)Li@sE%I{G#l`VuNjc`I zKW|lEvd~qP&wF0kyCwX@epb0F?W#R{a=u7YLj>=({O6olX1^j`zkAg=Y5{&3pWg^a zvc41KRde#W;QTwSD=@{k{zWFhIB$$!@+ zGVd#%D72$&BhsI)KCfc^j+R;Q)7$&Q=HboNJ9(_)_g?37S&l=7ku;l|Y#1h4nVZY; z-o$rLV4K~O?^QA?96$0oRJz#`4MC|j3Ans6&P2ThH%p>;%bGpqUNlXp&iT@*$F>tJy+K7jT@0#M^#*6*J_ozFUl*RuOIb06)-)zZzR`dG^q&v@k zDskJZ2{l2aFN@8(|%>M%extQco}IN~X6OGnKsf4!mP z|Lpn2SAHy9%COI{7q611(pX~rzbV)fZln$cuZqhSL@J+<8NvFHnQ+QinW3+#S{oM| z`o8{&=enBxm&i?Hud6uDd_QbmXQ;TH?4`F!#WKDjg(()@JipZWgytLMxvcE>ad=6?3Tdg@|_j*Fft_YQG>Qbs{jMI@`+< zN_jPkT>dUaysgP6N+}}y76yZ~Oz3~Im8a3<`Ed6=30?KtZ!8ZxKzmRxkC3EG5|&*) zJRp99KclhHF+LNEdf0wv!*=!`O~y;A%+OW+T1ca-!nv3#CAt4qw)~NUV9EKxshEC> zDpN#{9bbgmG0=~hl^GOIhB?{11E6kWsezxiZX^ang z1Ebz@2qs$%|Yr zvb&{vZ@Z{tiCJtJ#~8zLRdUX)QR+)|qI8FuH>m4YF|R^p5%toQRc3LZ_i7YegF>rU zHUav^2ZTioaF#etVNC@;1>KcPV4S#%e7NAn@h4cW2Xqq{Bf!bcE?5PUl8w3tM&}^{ z73Sub=29{%Nsrw$7*@RAwP8rhE5dVhw@4H@yIfKzIC12<-FGxM{)gj@HD$VD4cSL* z>HS}rs69z}_Z-#%;%g^ZW=0pK_PQ2wIW~M+6-ZC<8R&|<=4aQ0#CZcq{sAB87V(Ji zY0C5d1X(2fm*tk_>)(+H;l3Q>3%Y_&R{ecGFj+%d;%IQbyL@+mslGR&*Y1Y@Ag>Og zo_M9QzU|e!ht$3(t9SC7Z{&pfUmRa6JBEJ(yCI1pAS@%vFxbocgI$gO2QLIi@GXph zi*K=wFsgLOB?<9@m4DtnvGuiI@)vk~28h%0%C!>dk>BUNHxkY}i?ggik0F8hoG82i zp_o{MXX_mPy&c*R59gaUCZ(3&xhq~Y_VqGjTWIc{hrbxq9q1ZpFl_FPt7y0QvSNI7 zGq)4rg)4d|?oaZNxE%a;`g!hpc=aGR0b!@HRQakUxkU^ zdH3W57*Gxgbx$7C&{e@<-K%8|pY2W1taD8f1XLN){O70%8 z2j*cBwVS$?Hc{aX+sn2VQfJgy*2jKp1f|-NhK7A{GlN z+nV7@Cd{>do#90W7txI)ZCeeB=ZIllX6VJAol0R!ZcZuR-f^&}*#WR*^~~NX2F^_# zQ02p$#Xv&JiBF-||GI~MAWYX2PHztJ_AKOBMQ7X{fV3e4+6fgUL)w`lXFTbvgC;Vw z7^J5pUsK_hE$#Tz{)$~iL@sZEz}1np1;HBG#eo!&n_e{JvT;bjO4u%UT}zo~)%;%@ z&Gnx`dOi`aLY{WhToQOEGS^B^;tytAxkvr6$}w3d!4dp(g}!aLp-k3R#Kj)L_4J_@ z`@1WSxe-%!tKs58(k-($Wb3S)_^fRquGI_*O7)e~BVNk^l^+NC1+vP;_aX0b@MqVF zE|`qjzAGzRp^4Bx+O%6DpD3Bf=^h6kZC?!!F`c16$K&+yAF3SNlF&|OynTAYSp;{3 z0GPlLMHYEa`C9vfcd7d(sAuK&8T3#EPMqHL2>C~o5+82`ct3I+m$Svb_1dvyf{v87 zbIay2jTEcruD=@Vd1zND%8rz6`Y>ddr_6nzfQKh>6Lrp`M!h(iOG#}6%xG@JDX&i8 z+`Gr3V}PQ_07codcV(e7U*$u>Dxg*Za;t$^yPVx^3;$@kF`#kxB}(nFV*ot(rwq4% z*0>j7kpJL#K7EQRGtp9gAj!zOTYZP@R9QnPtFdUc$GlDnR%NRDOfkTsPKtkcd1vk< zCt)&ACJ&Jx{ZM`+Te8$7&nC&SlR+SP+3Lvp_Lgb=(iJLG*DKZorwOvIJ#Qme?)*h+ zvHY+@d3R^Hy2{E!y6w8Gj52h2Yja5j*98X7KpwSKj9uJcE zhgH@qNtpW?Rl6WoEju8p-8toa_~-Akdw(kGkbfQ`Ck`z^52+KXe7V$HQm9WF;3@b2 z+7SMhxUwV}dj=uS8~%XflN0+S!}b#8CqiIH>KV)@fXg99miKm_+V?PL#NC?*%D+P9 z{i+8+ezwDWoJAnDzV4CJ--n|(2~INq1Vrx_X66kiU*nlBWC#ucKjOx7z8!KWdp=*5- z`z^T;+Sz>D`y(Ik!+(9GrU^knDS``4NmYM)b6) z>50Bynr)11UH9slDsc@z)?X4&yF|gOc*dFd-w^1E)0(Y_@0fK*DUZ2w58T2c7pe^V>%GXv6 zIgt8ip+Jp#?oII6firD|xm<4ig1r%#}HG&-{3&eK4`XHBniG-zWI%cG_&E~#g z+N+C`c!Ry6PXCO28JJ!Xb%Q-pYB9WJd*Engos|{0Xdk_aF>LKxS5j95B#1m_vvZnLDzZt^kYx&ted^d&=JdH*vDK3uhs`j zORhVIb3&v7NdE}|E>&Oe)XN}Lq{*f|xWc|-#G<6*H}^9}fCU}IBFa3+O9K~bAkO`o z-NnzfeUJRps4oxtLf7lNrHE+*b>3Cc9`|Nhz;6i9pLB4^pPPMigI+k%3HNlGaf!p; zc{Ly~yh)eWO9QG1Q3w~kde1gTfz%&XhAfQYFk_W)5tR;KL}*U%2?63$JX`xr&W*_` zo6J8onV_9b-b)1g4i4f;nbnAWseX~o9nDCMq|XF_M6x?2_1RkR2hJColYA{Ba`-8Bi<^YmzaX^KvZ0ESS^Z~u}5h8#I%Y7g5IQu|w z0^2hU3lsX2Da$=yHxhCOETqyavPJw}f(|?6^*Dj+b=%^_LZgGOd-UdcHBL2@<2f=x6sd z;tz=R4TKi2APr-8&}R-V75L#{AlVt7y7%Em&QjxB!I4w7YbQr&{}P6U>u%2!zFU3{ z1^pX6<$94ZqvPk?E0ph8J+bbaBQG!wccb3Ki`O`b=jUx_nq`c-{7GG8OqFi$zgW!w z%2cLs3Pz}FocfwNF|4m#(!uI=)(5CwHjuUviXJmdmk`(86l1$8tlhFa5kKBEhu7td zdD(w@t9g1V{#<2u=!b?3TUuZ>-mt{wS06c4wXMZ4n#s?WL{f9BR$moSc{8u+6jZi7 zecF(*{q9BxZNIR*;SOEOjz@?2D_`rwSkdp=h}h2%3!*^*#Axi|jmPMnj4sNJT^z7CXMg|4mKMCdv>Z=K>0R^~0E8K$qlkxF zgWkcN^DpZ`TMbWM7m==l<5-Hkej;X~8%vf2t7fxZk>t#Y!M?NBgL~%DSl4YCVs83H z-xtC_adl=-1ltUmvtlqWIA&pfL48=U4DPHp2E5tZ9hj!n;Gu~A%TIkwgj#yAjz_1Q zH&^dDH?w|HoB=kQs-Qi%C&@lytXaR4*O{QJq|Q26ymR`<+? zj{`zpK<3nr%=V4&1K_pxU?d$2@-uulvqWs&mFKk;FT3TQGq(*-Y?LNj4F(vtzcrKR zZm)#ADb-|=)5O%r5bxQ+(M}ZJBWD4qn3dgv<4aDge5}{52c)nQP-!?+J)0)k8&2!kJxxc;l;_P@W z{zL0A_%bm|l!D!8 z@4s-~z#|wi7<$0a7fuQJlpn1+_|E-5ZiD4Ix8^Nh%gtfM^38ud)x2F_ES4G;v4hd`SEYvB4>^FIOa@5WLnpX9+PgW^A8KGWE^SlbJ_ne9Q zLMI-(qU%mzrOrNs!8(#6G+DDKfG{UgK6n__vD7dU?T=-0UpOGMP7lfGqoLh50dTo!2Pk?GYpdQGk}j@5P14z= z6TE(-pDLBoguSJYh^O}E2z$>dQJHvGT<~`1qP9GEW%SLW4IW`N|3he zVT3Ql=OH)|!e{(Jr$`@K@`p!|!IMk9p0B+hGw=&8@BG2(F!uIpneR`)aYv!WXO{E>yi8UXqiSi`j zx2=i~CPs0vICL!5f~0Hr>j&vsaFIEl@3yc^Lfv%@P2Y>JsUKDA=82${%~%A;ZOE;l z@@yTItzgZGdIgTwEDRFwQcbt{CKD`LbR~NFvl?%<13n?Opn|W@uU-pl_iG8K4Nrhx zgNWh%dcZX!yhDJ{E_rx(J8Kx4o5({H$A{W*TzL zJi3=hGwr&nN8b19U;bER3vxL`FZn_-ne8KSc2%hEY)wKa5kPEZK4d)`zyGzQ^^NGs zZ4PjA26uH;WMkj3G0t88f-SLZmGR?UoLxJX&Jdpimm8=@tJEww*4wnR=AAmznC(b( z0Lv)~H9`~2H?or1vvkeXj>BI?<*AiAM*dk^Zz+wz=9}r9J z*j*yikG9I-Vs*d8vBbVf+5ZxH`L+79^N%$Lw(L$>PnlrVx|IzR`>Lr0zq68N2o-jF z^G3O20A7;AOk~ZQBbxwk=uhGyh;I9UG;c@0C3U63;dqr|o%~f`wEW3xOZ+gg1o)l- zJudv+I#5%PJF||8qBMo4=r&`6rIQHX&;wET{ zx1N;UJms_Nz+M~XYbfI>;A<4{rFf*1(kmZlEAGxVRzAzf7_&S7@2O$ofjVg>=*%@D z1HwqD^ggZ#?d-Bn!^#S#NE@z7mX;`7Bw*SA>E1{=)Da?pqZaYgG&VMQ`BK|XbIJZQ zYhv>oV&zY;S?3I3^tG-PWQQ>h6btmadrnU;asl_!XY(lEQM113f%OlGB}PFXD!c`@ zeC9s54{2);KLFNW@(qcOa~7D)5)8zytn0+PkwHLr|JHo$m29FDoqB23AAMMP;L9hO zI5W;^c0ng5Rr9Q-|FqJGdf8?r2xmsVk&lW1iyA^%JxndF#Y1aNje1zgbL;m@miogy z0|=>q#71w*pRDpWhfXWV*oM~a=;Sy2{juXBJtgcfq*+I$z%-1}?@@p?z$}w&L=?d- ztukkAgIH_7)LqDbG{7*2ktdC5HQHN(uGC?JtiPF6%{(2*kopkwg2uu^&5>_v2eT;K z@=!AI+N{6?H{9Ap1_E{17t0^%*TJ*Thl~+kPJ38mc`BY)0b-hhdwpCAza|v z7MNJAO#7W_*Gj!$N=^rP=a%R$Drd8NUIyqu)5%NWdf?yJlCOXDJ>Jeb&woDg=GaD-`F^`+3|jIQ z%PXNHYxJzu^N_H+U03ZQH18Nd+1?2c)pg4mi1pNzryzy5)P(rDeXX<$3d;YKOe6-V zr*98w3y`A~j7W8EY&@nxa@9AAxPMfnP&HnfEmnS5yEY|^>eaMVi2MsHK!70O@5%B@ zR}k{s+ZZU*Uy0B7;mGHA^dwIaMB8?9SM@T}85;q}_=|Mn_74GkkEl!}E-g4hKS%d= z#BLeXfUZHDk$eb|$L6HZi8ZJ7ZI8F;(+AJ=g07tyloQ3z_MBHE77d>$DT2~tCw=ER zP+Z18jL<9h21wzVhg(5m?k3x%@_k3*FsvpplaPfF<0rhr1Wzf$h79xuV8i_HvGm*C zE~1V3g`(N`yg|Eh&15mCGZek6uPd^;kt)q{J$mk1gA=KUvEhJb8Ct{d1Rn&rst44| z{do9tt3C!w&qCBCOP-D&>BA_((%6kBO$%UjV(zJW*sL-k{kgEoj38k2O;Z;2W-*B* zd~q3J5t}ImD{JGm7;gR&?h>XQ$SwdZvwIp0myV?)+ZJPo`>iw{Ib=C7&lf(Azc6Oc zG64_pp6<{NstK)ENbbx^4&{#)%T@tV_kPYJ*fRGbkhCJMiF3b05I)6Rh1k> zd}T)E*i1Ol6=Ey!)w2`_Z-4(b0j$9As#Z4OaCe|owhG={>Q38Uy#K*ReZBPA8no@Q z9fhIE=^d)e%L2NF+(=qU9&{;c12D(Yb&zh3NOUq|950CJ5pt*HeX3;pKA5RVEOh|3 zS?|D=p6}GleyXs~h+MJLu>kbMW{8`_re|O-D$Bf$3+;M+#%1KabasFopK5a>83TVH zN`3{#6yS!dS7snyb5}`>6k?Fwc+&#@5%oSVxqSHJSmy{a_#=5AskT~{a6jHSWJ-`} z|BjRA`$zg!vD?_`5n|nUpuHd5$KyW!a&9RM?PjY zTUcYC|EZ>Jp|$|Hm*sfWauJ#B)Z(lblr-J{iR0poY(*{0lY#U!)I+lI8WKD0^}9)C z-xxr*8dA=%(l^>6L;rDGDbXrREbRC+ogrhDU2vr%plm;OFCJjRY-xgcGSNKXFQ!>d zW>Akv&YjaFSTrYbz925;ryr7k4|`gC0U2$=*0li+b+5f8V|CRzYW;dyO+emDPF}>= z5}gbfZLACoQ=C+F=xdBJ68G>Q&DXO$T$j*S%N4;(EMM86Ouh|VB9V+Qu0{OJZ>*oh zbO+wo`8XP$tsQ-l?KGK_+Zy`rE>de`4@tUdE~;ii{97QGN^{$(mU{ikw$OHtipXQT zC?rlV>86aX&Z;rJ!;`4K)ay@dePqjCxqQDS1R%6VBuOao%0C)@>R@SuuN~nS`iJ~i zmV{mCozI7+8~G%gxA(I81TGUs;Pt{*V{KQbhb5Pja4K%P#@cuRQqGwChwEkjG|c~$G4LeXZ_%aSWxU;VwWx-as3u?%@DT-D?` zJJdiH$|R%_AL;_q0wk_8_?9nmw*xxAv<6|a&skh4jG{Q+U|24`sgAO}jPgyEvI&Zz z-XiPaYdcx!x8=^ibJ2vS4qM!kbpXdj*yPbI1o4XOURfdv+wILQQ&q2%*&3b;Y$$j$ z*CANo`>CcB50tV8@D)T+itC7rOC6@6;F!D05-GIJDVn75bUPr0-(K@k3C{k^>@>?R zQlUt>IrX%f^DzD&O^k|2M=nm^8x8Bd-X;5^z`|7$Yqx0oqUzDXr|Qc*p|1$2wosdq zy&&Ka;4?u2$#&wiZq9-_c+b4V1 zsKInU?Qy|#l|P!A=DHr;PTkA^n<~i6T+QVGubLXz{6v~jHAQP6?BJ;X2Fd!zn%MAD ztor|FiL$ehg`pQ0$?x-7~A;?U%K$l0!}7du-Ei4a=w=mSojCc1+}Zqx%6Zf8J5G9k~1!pX=R_q~bZ! zpZ8wL^6J0U`K`pY!-k+7;OV&I1J*u|C3pk&Ga2e+=)gQgcH*j{AwpaxtWXmDjL}+F zH4q@Qq=-zE_mo`Z@@EhemA%Jv)f+uw2 zReHRRRE!en3uB z^f7aJBFjbA9!UQ8b+DVkqUOYN4QWdH#e9yj8RR;&iyL!g%7D z(gh+f32?zbDI1aWg9lfft5tLHW-El>=+M3;mucyT0LB#@``7J;%+VeB9d6&8SPuPV z@Lmhvju42y2ai_fTm=q3h(yhzXRVmtAeNKx(eL*q?`LJC&tQLLuMQ0!}U|>J$LL*{V{(8Kzy@Pj#d)!Nuoff1XiWsMx zY-FhqB<0hogsYB>se*!o+H+VZlzCU?ovJ3J!ycBGUy;3lV)C?3ydKP}8@7=z?d>Yq zVz{I26T%N|fz9v)z#k#p?3+@Khbl)gvgQlY+FyB6dZ&fMoSWIk$4oVqERVF#R(o$b zA-{zcrg`!_bZEcR{upqfX6oau8F; z&?Ng>^VM59(>ZSS1!fmD0O9)Urj$@foBZm9)-X$$9w4P3sssKz>fnYjIsSLoguMN` z*GkYhkDnrHIX{j-owrTxVwY~_{ntPh`Z965!O<(9bthaTk@C%6z>pXj7m37u*s+Gz zY@!|7mNOexMhW%rh*hYn}}&Edn^^NJZ||VIa41Pd?qFoHc&O(cd6V~)%c(; zb4JymZX5nc==PVyX}$U+37A*KlQU=h{udf-%W#kV$GUw#BYmw(Kp*IWrHOC$?s-ML zx+qvrZtb$+#Cj^aQHAl+@cH)3=PDI%b8EYEUyZ2>x<7s;LQEFi{>ueg>--HA`9ayx zD7;xu1XsP&<9Q;}xU<2eC=$>DVmz|atpCwSOz}=}iUBu2ycQxsGKM(g@54y1sDC1E zkHh&EdnK+CL!V>RqJ8C`{72|<2o8ES51h+_M30}(WE1q+`hSsVem}2`&}c0qOw?xT zP$~g(+T+wZJikMgS{7dH_&d3a%9Oi&(mR!aDXazkCmQX0J~MWY%fOvwPon$C z(7i%Jsfb98h0VH!Q1Xud@+Y$6hrax`P5orrGV(DiaCamgmgtGUpQ<_K)lN-!zWp$d zQgb{nFhOPOV*vkcMV(Y;Vg&is@Fq)NE|9={=fjU3pZKp{2eQi`LjYLywVy$sgEj z{USPPqet`RqLr0JTB|lclI4#v^_c3Y&@(m0ZkX^scD~H!6f_ z>v=crIu?@@cfN-SnzYq|TwD?%15(xt7l*i$&P4j!v9_rxq6ty9-l9;4R^ir*-s4q& zM3hxRWz4#2lpdE}?_Sw8fZmv5x%A^d6)9U1F6U4sti!FymV96@HHQQRIo|@4KlIx& zOPY_^Wfu1Yg6IO^zsZ_YkVn|)*6R2}8Eo@hYXkUWFlxo->md;6w%sBxeA#usP{ zH#Gj$V3)ENTA!(!t%~9{I@Na&5h`%?6@8sAv<$!K(1rniLW4RFiy8hy6+}7)Auuj} ztdx{?H9vfMPo0|~?5ZU}#=nFJ)<0BUSQ5?V#NNSCHD{JCBVEOmx=qK35}41CBCVIO zCpY;8^L%c2wV#94mZlq8gK&jn;(P}>3CqPYH~^15hzZ$b7=Fd!QU<_g0=;3Tfy(~p4*%) zaZu?R4PPXZvyNGB*ASU&3p!zk8jvq7rA zT5}C15nVhEm$JgX#a>5S^*%n*`^)jeQ5LNFJj97m%P~yr=QtQt4@=u`M8wB^3Kiawr&{|U(|sap6?EQ79m(O0UD~R zZ_P2_D93D6*()(*czOv23rq3aL}zvWy$^SY#y2CwSA*!@<|#K&?D z;1{n#68MkdwTPRL*Emo&^5Q&%hEiCWRF_mdmq$!|H?gf3%&LvbsC$qcv3&fJ$@6Ab zgOS$Z-mxk;#rM6*#{=62yvGVlQUr5wB~TkZe*N|Z9gi;vkFa8vzZslceO-rJ9s{pm zTs3{GC*G|sJG!jwx2(@hemXXsgpm)T-w-m2v-dXk0vv|>B1f?p?@n(vh+ON?PWZ2m zc~)DEMh${JnRzexcqpQT3-zCgc)6#{Z41#lF2k@8Ge^|j7*oCvd?MS2*B*2`!P78B zWaRoRUP?JDL&(olb#wKBK*jS!xC{Z@BQY0ipJqjL$+T-lhvjHe-a7uH$!k~+GegPA zHe`i&p>4bII;`leRlq3sQALEn1DEgIU_Zkho&{*Oul_!tbs02)rszA~xv#4F-N@Y< zp9SOC&X4;1b}b95Otk@BNX=>6w)g6~^$x9lBjn6Kim+P|ta-bj+s8<>W4k+eE*2Lob&>f6LbV zh?s@~`v9;@;PK&WvV8Yzn?1u;uqP7^k`W9pRbstUjW#6B7ftf_j6s>eCCq}B!`SVG z;nNI&CHT3xNx>LdccnsIwkPaOqM?=BXd;7cpscFVPC-0wD@$MywjKG?=9$X`IXfMA6&`J%cmP817)EnKkWmn?kO zs3lbk4|<2Bg}O@2vtWFPGNgyDfCsJgrJZ}GLag@q4@a0R267$IN2fJ=#~9NlKxN`2 ziBX3Ejg)?pGBfVVO2fxO{0z)7*`*CN1%)j7rub0k1v#@q7D})|+6Z-+NJH6Ecde(hWbxL*YdMot40-uLR3$CeS z{o5;B1$j8o{T0<}wxVJSy&OE=sVimtUQMNTRq4||8XhlI3jq~5Apzw8E|4;`!viY; zQCb1dNi2K4m(F-`@6%J9LcICwy5BMKi?Uqkt$ijw6vwg4o)IaS2qFyPrn3P*-QOFP zDfqj*qeRCZ;m8GdZ$3`ldp)slJg6zDAiYQk^F5+Q;ib8_BIR0?GF!ebaya zOvToBpYy&Oe>1+w#{Q~)^Pyy}^^uLuXT#PCe%h$xxx@MesHJy;^1X7hBpwT7eBRQE zGXJff!_EFiXWq2W0%J5!vpeDHol$3t{JE3~hxJcXU z`&2-+aA5tz!%~5I6H(;KSWkce?LsBga@A(bXD~( zWrhXN)%(7PNgR3bZm^F>TqQ}Sfwj>`FTCu<{4&p{P=6liN$LH#=SuH36O9_p&teH4 z#5*`(zNRPnL!J@sNE!zSoLxst7@fYe1E>$Nj7+Tb7iEPzLq-DjEKDB=T>Zy=$X8;uwv)MF!4!)F|XnuO_W`YM)mU2$6L85 z{lo~NR{UwVjTfy)P^I17?z?pt9TulK&g>KTZ_xI`>2?~C@Y04;rL(~5YKnG>v++3`d-3T5}zwG+EY@F;pW5;JQxLHE&|~aZT`{Z zr+pQ3x(#Gfuy~g)&*Y#kFTWphRlg~fVtr!l+~iyV|(n{x-u}GtYFZ zNValdLNqu{tM1S>cy8V{57TN5o!Q7mNf7Thpbnya5lzd%6DY+?w^Mgt&{%)KHeWpg zf#2UV9aaRb+xU&_DAH>tE`h|$Ez3;@_jB} zIe>EiBy)N|?>}me{uvU)N{W263nN(J;3;H3;Daq9LRYm4rjX9wyfJB|+gZqiON1ka zIZg51#Vr<)ica+4oeUCB>c+iWhhs zw~gNYS7hLj=EMS!q^J36|7d90i*##yFM6Dr?1vdbCf`arp;Sl1e$IQR-RPHxCs#0 zK%gcJ%w0$PIgOCpomRbGwcL80)z1&6i()My?UPACbN6Hl3Us{Rv;dx_6WHK8IMRw=1E?Ffhy_oxD`4C+-FTNo03);nT zB##jBejx__j_f-ZmAj&$h}j|MQ^P>tL5zSUG!4m!xLvMzidDg|!I!Q+8ZW;bKd+hu zTLe=TMUJg>@On|p-Yi8?5zJc|Ih^ATw+%dhs=o=v8q|XP(yW14#DO`{(6oMODx>yU zxq9eq?9j(txlHxL*>hzXMS0i5mAw2j%G!9pSU1-1EmjmhsFeK&dMm*@loOn;^!DVq zy!;VQ0On^J_u1hka_DjXkoCdHfR^>Ee>95rT=eXj0(7pZi+;JNGecI}5MHT`${s^H z$&QOD6lQ0eKUHpf&KjOXrlw(_NPbJvxk7hS>CWe~_=TvXACDBuuYARj6wL3>HE^?L z&wnM36dO>4CtobYNjzw%)pB`L3YmAbzM)ABJ!*$Po^fuR^z=&goOmR1OYn|Evg|9x zruE3=w~TsI(>p=;&7Croe|%#75+BWvd#}$MicjPt!uutXa_bIyU(20`P`WJqN=y3UR zS-eis=ZT}?f1EtE$<|Y8V>426&=@IABMNX9pRE`{_eb-p9rA=$n<^uBhApJ$6LhvY z2ObxF&M~!?6lBzVV(^t_J_g0b@7%h-sv8rgqOqylFtK4}aO3B^QtwUUK9Lr0-p9e` z@k<$Ko?*>T!KQthKOu%!EoxRQK7HkM_AQ?GOS~EYm!V{TuB^si7oTWpKlObj0g}!@ zT$IsIoi6*8B2`s z^!b4J2#?#gi_kTP)qNrHr48p`*}r=bPh6f}340WZfUOP&3kDJys_I0($*T&^_xNRec|%;r+vF*+$0>x(!3+ayo){z;>+r(U&s1iwnDs$6d*uB^JP zpM4?zJmMV|_*_giIRQe5IJHR+urBxuw*$_85j_f6P_kSU=8!LLN5&~Zu*jPq1bf-bgAloxb74kR-H^Jfjj z6W;a0Z!Lk7{Ae>)o${ zibtzYeVDvF=+7>#T*27W{jqOs6r8c$1I2nB*6Qg@=tuVhN@TNnKG%H-cOaRsnn7Bg z26tl@0!o`S6&}i-)&Ar3l4ub(nccnPGWWoNPxr7OsL3^5OWPK%dj#cF5wrc?#4NX( zd%$DAW8*3_kJMJA`Fm4L{XxEi?(MTY??xr%Oi{tToo6V00mvQ?df5_mQ<4{h8;NFs zi!MI+3?R6>VowEW4wKB4k>A-csueYeXyQl(IRx(~ePCO7fIYu&rCc-_jx?xkVewa3 z1E?|8i#r~IHvov1e+QkSj7d_J#OGNNgd*OiEE#`89j>G~E{1D$qKC&b2WsJ+d~7>y zFU4Uu2nl063g#V=O1mH5SlRS%U4?QV*%iLbPuK#v&^I>}%>coS)9)Do;rQUKk&}{B zld!i{8hCWiq9p!i-m(|hY+^~m@4vznMQaDcAM)JAp<;&?2GZpt>!IAscUml!kbJOv zlYZZ45wUvKbN&bDwMxb<^-L@q(@^an977wc=T)-UlDMiYVPjdhTK#$(n8Uf^#C<4z1FvfC6_v>7 zBbSy?zGvAoL$S%(Y!)}7Mzd5Id>}me8-J_4_BPIcg#JK7wlL$iG6_(xSo8T!m=_^t z-+cNF$qp~dehk00;rMG^!D2J~*u`qEEsEs8gHdHLVYVc}iI${L`OoF?a!8i#X?kw3 z$U;!%mT?oETEIOePrGDGFdd!tKF`Wku z>7Fi>B~(K=U@mtCcX4S;PwT?q^}7P>E>~59#<5O({!%SRr=%hJWfB~;jaM@;$toRr z54pA*#<6)a8&j+Tfg*aDYxYo3i_F6PqGn~$GF>EURV|0Bu5vkOpn?lI{JLggA*(g( zLrP}3my_D~soB6-hioI8PbZP5iph!{IS&6@WQmV150{feH8(X*Wf5|BOC4XS|7v{k z<_=&nbXX_*TD~maeNY@imwMXV^Hx*p8&CqHu1rerRu?3pYPM~zT)W5Ju0=^d?7T|5%7=H8nbt7^P1_mn#e|} z*5eVm=LqeVtvbM|7D*Q2qa|x|bJoVX-Oba_!hu}I*+bVN!KW)dQ5;zKO=a_P#u@lZ zHTnurmJZe6X`6+l6VttJN7tGyDIUs4cfC~iWTc0P>T!PS2{&&KZO6|M$0uMkczJNt zNiOHo@2vV)R**-34S^t4UbVJU*MO8DDsx9R19Kws&ztZl5*`wV z94~SI6BP#w@$n;n6YBt z17plsf(e0uKFQufWc1^E9rx`D+6tHW58_?@Z9&)1jQfkeW0H?}rfqKfP1Q^nRK#uY z;c2=6u^`|F^g!25G$b~SA6o^9zcpZZ_gRZC;u89C=X&#N%k>@;@Gx>7)+9u2nUd+? zHPGq^hnFsORk_Hvmo8MtKVs?bSGu1i!@cXC(}d8ttbEx2X>=!fW~KL2nwHPT;pdqHwAbHr56{jPU09Hy_pru+$; zy>^*yDhGq^)8IoJEk$?jZ=UjPyxV6pwXx%zDVgUU0QM+PQF@3P{z_u&{ga%iEU_)F zwE&M*?eSqc+A9B(aE5qwQ351Mp_^U|`=8rG?e~`@5pQ3EaUeSFj@d2n{=#hKVc}|3 z5wY%dQ5Vp%is|EvU8IFX^6~iTF(v|9gYK)-PYH~_h5MQ^nJ&}L*BMS{{*)VQ&8{%L_!jMEPHw`P1%_vRInDBhPAl*Al8hqHd}Ty4`HCt3WxvXvb@hWJw{D-qF-R1Oq8s0fH8L-};{!BX#O^gM z$zs_ezIeoj3;b8ODt`%$yLP*ET=)Ho4jln5dbZV;L`m7^#x$Y zM1iHz+DDt>{6M;B8B>H!HQ}~BQZ!X>l2`v>D~qwtnAhq^8a=gMvpw1h21tP}gD;xA zs^O@PhnVI4m^0lQV~fxz)A&1bCrnwG6-|)EMG**_4X+Qa(kE!InAH%9d(Ci^$CR5% zR-1hoeB(AOPldVGK*ju#Ecc@&K@Q)J(br2^iR+`I5A#^`ea&>~&!-?U|53dI3H#mP zvLG0syp~58X7#_ivOQ$x3h|TCSv?b-{xOI@>4jfC-gSCHXsoi>`r-KF6t8|Qxs)mb z!_gONyj(QL(r?30`n-&Y`d?CP)Da>|opY+uN{oJK$B>w8zc=+NLnnPpMmT%j<|@J& zsdQ1-7%-tOOKvjhN%isS$Sv{D~Wjh4N$Sp)<1PWXERAzJ95}~8P>j#@Jkcd+U=CkPmONpF7 zthjrOW0%VvaYHonw6`wmDiw1z+nKNsJPNw~dz5l5G_#Hds>>>9kW;r8fz9%0G zd$_4+!@Qvg^tjv|Qw>&~ z|Ar3ogZyK4&x?uM&8UkqI5rVfKfOy|iY}6jVbQj#U`tE+a1rA*WKlIB_Z+nRmP|LU zY7MCD^ctcsFa8b}LyXI<-~_PC5{VjHBK@*I4qlvX6Fo?+I0#7uywg|-%%~k-9s-bi z6h846zlGv+IX%#iv~M`|x2lP$CxJWgmA)YK&f2;4<`Qc@NeF|Nh{e$>gt#nwrHMGk zWqP!nBU4X&kAA`EmiZFT&^z@6bT_EcEBfRbS@PYL8g5u9QoE%$&_`aGvcJKBmAQfp z1s;have2I}Hp&zWOcO7$MAD}4TUbF62D#LY3@KC}D|l;~3_$I>Hd6qBcXO97w(fwe znJv;~j_9p{YaDB?#izRjFc|oz=3gkA{+*&rWQw*f&L@Ia&DZF5{-Zi~9w{HDi|UZn zwV{rVGEq{I{sT_=6cD!5w+*SxQn+(6<-PFgMcNaY*c6j4b2EU6j#Rt)E0n^HXrQ)nF~WF9pRVorU-$q~eBo=82m|pWMlF>4EAP{Ca*uMdk}f=&VZm?tfHM zH8GD<@i(9F*H~zZ|C680h-mw1>qD|HHL>n+yP0q3Etb)*w7Y4;bFM*l{sRz9@F>fZ zeh|~s={r9JM7tMmPGz}R+b2kcc&27JabG{Xw!#(2`<{sW0QW44-~^TxwsR5E^fKN1 zga>t%uS#;mRxahWJ~x796m})qy@PU;a}Wi)iC~A#qG%9a8wil4jPl(O?+~HSxk3X(PM|GM*_P+wz%1t|Ia_Ra5vwi-O#pMw z{wix~U6y3}eQDm>f}b{P5zBb$aZN4ccr#&F9iT6|f;t$S(X@Vmnwji7bq}wQ{78>| z$Nv|j8J|;2%o**B$TR=>tyM4UmhFVoRxDo<%<0^hGLya3wA&ZmpNCDR(ai3laJe-| z>wO*eeQ>&GCOg!ZBToTwN(KoKiAJ&$ZE@|+TFtg5ek&bKM(UdPEsB4OJr$se!Zeykl@F7qGOkl~ZdwfHYO)Ai zWwZMSl(%Qy#fhpl{}S+F_SVw3NfDfD!-qCkzxkE%EajfiW3_hI3HeG69^Z^r-j8J0 z+3vZhLMq}WMe`LZ-0l_CHt?%38e?s81g{mLSQE?HrMxPb?~Ol)>Ad*|>fzHM9QYDt zxQJ^)pAh>v)kqzGUFzhn4)qlDR5ofM!Qgb3M_vY2KdLANMXv=NYD-ML$17v?)A?2fw z=0Gg7$ou;8Sh~CLaisuClG|~b*y~+Itof5N*R#bB8ZLppR`6*N4((ON+AXDi<&@Nl zpKYUqRu6}_VJ0n*6KnJh#Cl#o{EE6HOzka%2MV?r3-GoK5ea}VIae3e1WC6xIvr%a zS-Kc|49d2obQ}Q}Zih;Q`bfy5z&iN56*)UZ=k<-o1r=-&0w)60yzeDe)Q4_J-SwLE zJ)5r5OBBVB8q5a^9c}LP43kW2w$K9<-JeD`i*G-48bg=y1QLaSB4vyI=c*k3Uv!rG z%3rrV4h3q~bPtjtlxuG10$VL!H%L8@vFHE3XBKE*kdpw2bHBW=S(^Z~n*&*i>dXM^ zINZ`l-aRcE>Hq0pPRn{8`W4=Fmn`^BcG)XokTSIJ7Xw_O%5YJfCji|hFEP)j7sH;8 zO0YF;zcN47b*og>%LbhWd8Gr3eF47TzA1Kol(b@U)43Blb&AF&qZ=gkz;~d*kV*qI z&SZql)I4D*k*FVu4!(_(6FSH7*XG?TsrgCCRb|Qj> z^iHz85LgEnn}B0aifo5F*Tc--Xx?vH48*K&8<7$vAP2{xBjg0cjdd`^I!qhq!v1wA z;i7jOn7xRjw_v6On=vWnL~Av8-cNXDusi}7V=^wXAAM&`RKM%SnW9|tqmK%>PnZzf z7Q+cLB(jXx*uz;>F+@m7hcgA%#5;L;+zJq$A^pJ>eQ^CBl4O=?%C+O=FT6PINx3P= z>3M5T1`txBarZ)Ou}vJ`L)0Y&HjvnsQ!-h~p9@CH!+-VUu2u9+fYug7KrK8bB&~9C zTMa9zXb^x!+IVmX&KFG`^nd($Y_zcSDo*Lg{Yz6F7?MBmcg|eYhw?`2U@^YzMF5MBl(X7wl~h+HKaHHx7I!PrJPcJGd?BzOFAF!S!Psq`ZomncB={F%^$HW1vh2R5Fw|D!drax)C@%J)7UZVU)80H&?2h z=ngTzY{$Nnk~5W$vL_@w+10;Ip>=*E{7+Oi-}uMan)ZW_+y=>xp#(;pDY8eh30%Gz zVCk1z`-%A5A=j(GK0(lDC@Jly)=f6nF;bKkoSL-O#{MJeM{>bJ9>g;73+KvTtrdAK z*o}X^k7`-R z@s__$2vv2nr!qCUBQsCt8yEHVFh~nfXr9&Y8b184(=!OkVU1V-vX#$LElPW*&L3@R z==@|)dwy-?F7RZUi8?S1X(r}X#D^q`v>k`G-Z%Ug#D#b}0`IOnrk}IObN_tCcVF(_ z6O;bs6h%5DN*5_nbqiK6@chHG1Z>rS@>iNvlG&AVATfw}J5LWIcK7|ATq>HR{P&l` z>B??+u(LObUtDCA*3@2qm=g8deNQK5JX*hb0Rh$}B%5pF!)hvDK`V*fljU`t-&%7Q z-a`A$6@7<7Wo;6JLVQ^Js*})fwO^l(zNZVc9UK{|>T)ED4INjVOMA$d?NzB(bFR?P zXmcD;3}b8qB9&}@ZCX7QQeCxZN7v~queb>4n9cgX6&$W^R;9k^-%j$`w^6B>UHOf* zrvEqwP}HMkc{H*E23V}qD*tw$|BsX!(dRebuW-S__V(6=iwh$9O+I$c>hN@3YRl`* zK9l9L)|!26%r*IwN@^0{Om2!`?k9 ze=(qg=(XsEn%f%UJs-C!e<^8hWdvXY==xZH&KAA*zcV3sxx2)E%F1~;hFQi+$hY;) zl>zqd!x5u4mkE~>;ADh8Jt~&Sf>*F&`Yt5qh@B)bmhb911q!oFw}D7s%(izKuJzK< zKK*b_spmSGGGU|#pL^mjLOC8u5r-54j_{92EfUAwwu{Cv=GofY3h_szPTubZ31ZoV z=&yOiv2hOv96Wgk#|;m8sf({uj5YHZDeLP`Sko0l9h3M6K(0ht@*6_kz`(TJHEK2L zL+&H8*v`^iRd2Az{;s)ibp^9VHBh^}H>S**JKGIjzX5YN2Up9$tO)JBv955}ExK`v zr6RILuIMk4*mhCeCh`g9kC%MEmiGdvptRB%-?enIC@XNkr*n{s67-IuOCnaQHFAod zKcCBir%rvKtP(7 zSUC@mHivT;Yd5A7QtB7iAfV1bc_Witf^3uf=-2@qTmQ(4b)Ci<6a^(!JjlCR-o&()tzwi(@d zo}CdDqY0!CPMrH8>$=`526K2^QxcM}_=lRqt3woeObgZ9jK&LX@^Xu=l5adf0NBm7 z2i19=o@`9___lCrl$x{aC%1|l?^jfGuXhC0xR~WtsF#QFX1H`|sWEj+JBW? zb$DWir_|wl0Bym0e(ObIK7iWWpcitP#^gbVqjZ-8xfAw=38MM!`3+z%2uX1A%a*ae z7vC_2`cDbrR~&@;93JgDo2Ay6&5@!b&u%HiH7cj)sY zs_88vqMSsJ_3F{AlYNl$+4;^|X`#cY_QSp4`T@+R)w)jBUwuIt_nzB2lffZ=)@(m< zgZRbs-jP-4(ys8}%DrWDa?d3sE0ltHJ<+jf11? zh$Mv#rZic8*a*3~X|A82E|(+$UNLI&1INH`_&Hf63-tu+mqZmmabR!?Bx-$MQ(@)H;ut*2J@5Ai9}4WdRo#c0g|rpHhd;7ds#C+bjcN zd@StU#4~fJZ<%tuA#OEMIlL-(bSFh%tnd)C#JtDfPVj81L_OfnbK~+q&uZ#C(%iyS zp&zuTN(CQ(#Y-myCkQIs_n64$R~?J!7bzL{eU*`O@9uHm69MO5W@^lfgfM-njnYRC zsM|wDs4=(4;O~8M5qAqe)_h?D{WpGmW&dTnUTZ>h%O*q~27Y?y==Q<{@vFYkt@6T5 z4pTMfUy7U!MyaoM`NO_+B$GnU^+@C0meNEVbM-i@?u$= zZqIUHvOoOJFjic&t5(jL{+g}UQx>P!9RUu1Ht3Q9khE!&I&%qUY*@bj5|UxX>shy~ zgV!#B%a?yqL6l`VhHyR{Mo@kbSa-XpQnrHK^u%FR|J7!R0Zkt-_f(r;HTV-WWlB$F z*dhM@hj;Ci0%iM_VifoEH`4aX$@?$?7!d9I9*MCG-F8l?qQN*k^jW<60ajhTHP{@? zl;nf4JW`WgHs9&O9WUTdR*Id?B~RR8rsW^663;bTRh=lOta8rXvT3CPD@_ua3WDXQ zd}4mYYLAd-W3cB=M7~=yJ)w+`>p#IlWykTz`hB#0QA#qs4e5cnWM5NMs(Soa4WCpB z?l!!~1KQt?H^$LL>%qJAmc`!=2$`kzTNj=DF+$e}hv=v~1L>-yOBJzMV=1xS>cSUU z9lYDG@}31XHk{3pQz6V5-q z9w;V#f+)gQRi_IUWaiK_jTXPE5X+gc`co<7UtGmw7C&Y&2Lzz4tvRYRXIt_>47c=D zU}LFcx5WMlL!;wkGM&pe%TEhU4cJS7ltFnkG8Moj76PsDz->Upgv(X^y0gO_->}^x z4mpg^>d5``|5{TN^8KjC5jd&vLGrB|U)+`&ZQ*ma{T-DZ_>pK&J+9;jeTXW{UbuDU z`^DS%A4T#@`t=5#^cJy{VQXgGyc~GNPIBAnjH4&k&3H;~7wGed3<99!E<<2dELLDT zWq~d_u(o-3$npiTMv1tcGTd>d*mKa z56k!D`Ree4pnE~5?;c-jDdMuj)jZ@jUpV83@4SAISsoWaX&Z_6gh}FxI3NWYy#$-B zKqb206K~SYL3ojPxmg!9gPi;|;)zZ+&+WC20%?d&X!PD?$7_RBMH;6QMvqHVcHZDC z>3#u3 zF0G34^*^a`_qibc+f&hMKU+b+fMY)_-oc+lhe^UTFDl3ustaPv2GPDD+=xN9Uz*lW zfH>d&G)B^`THRMu;-gifhwsw&M+4MetDEYYx@d}NDbK*r8jZjwUH~)4-zhzR1=S#$ z;oH9bg{fcU9kDlZ*gm|&Hko@n@)x7~+~YummK=!*h+K7wN4p`I^sw-&dg4Wq9)fdU zA+_eaj_|b%o8pNv==d_C*DIxnRrNVR16Nz73oSBko|JIkS^E$~2@w<3g)U#Jv}Igg zX&>v+9{00ie`NjO>aMuQw7XRAXG6BX=D+*jD@|%wX^*b>T4~RWE>N!6q6$XVVG=BvTs**t2h54V$QpQj~@KNk;^fGw1QMDhxT12=@aF+&lfXo2xeJSOS z5cjBs$NP})5d2F}WUf=^e^kk5fxAKYGUvTEI)dWd{GeJB=i<^!QC_78KFMtFW?T3o zZ)Q)9k&(fi9%TD$Cp3$OX;!T(X2vmS$XF3t@}OW5QcWrq!8{Gr1B!;j?AjjE@ZJw9UCCQ%iU6&Vi9 zsWr4ebzcJa?A|ESC~0D|l`l^>EopY-&$dd! zp7{xwe-;&`I=HFk6K)Y=e)t5-7YFbukQJRaFxG9lt}S+T=%BV}-tWA&qcbiW>u#lEilkE+l;Y*~oJ^{-@l3hNu}-#)l0*}0ynz^Adx z1)aG!ZxPMc(@BG`>aq$u>J+~O6ZQmdVhJ#vVyPRt{l&X2GgtIXEY(p(U!%^=NCU#Cd@n3Z4_b#6!bgJvNss|$tw z2GwV$sCr>zho96$d6g$Nn^P=j=Uz({I?wUlGd*oJ&xd!JG&TuM>66d1Te=cQXAEBpmoe0q(WY5v^wZ@M%4 z8seo|rGS=4RY5b4dcoF?gCc(lNVzXpz|!K6_Z1b+hN`Fpdneu;VwFyt!`P=ker{vP zr;6*JOnE9-!f7>xQ?>1k??;RkTV_(p3BHDE_KUtuQ1;PLHX8fRC)I|F0Tt*7X7~k= zw?qv!Kln)LoOt>ub#AfuzU=)_9EX{sB6sG1;%bnJ?;CJmx8sj`@wh7Mx&a-y)SL6hbbRAd6pD|lyv^#Cgy)Tp+<#?4 z4Uqv6rg>bwV;=KT-t5s`eStEH23I$}ZN9EP3(L487Nqgysb2Y9jl3>Dt@o@fU)|m$V&cR|`KY(yZ~QI33hF z?!)r>+}s8^7qK@8BL`TA>jQJzLg#H}l@DYB})%o%aX3dH)uZMso2d=mBssUsw zJ2#z8%f@VT-g(YWgIkfXwg>U8)Z%mTW@En`j=2=3Rw^wuH8*H)w{IO%t^)00F!C!E z_0du<6~)Nq5S^4?VK*;I$z1!fla$9L?Niqy_cWq%sfdzco% z)lgamh`CJXJ=cN$b(f093I+e{9^+%G@1G4GDjvEu#$H4sMVwUrm8-@-OT`b=Qvco~QqYEqrlns=by}XE#~`L4 zgrm|x&l>UFo$}y0K>-jcV7M4>#Kt}!C37czPb#S&n$0X%9K4=T=}q_gf@%|u&0VU4 z16bayB@R<~m*jI%P_{YhLijfh4waSQU5(fMg5kTzTt~c%{@KTe2@Fy$P z4_h7Aetd88D0f?^ig$P!>?Ewn3cz|@@^I|u!iN_LjY#HyO_t11gg$|JE@yYv!IOAm zb{;8HQ1Xr=bD|c?o#cC<_|rpo$hf=;Tt+-l+qud6o>kBa8z|X@*Y1VXBgm{mosg@l zj*k=+a@i7r{2pU&k}k-ySU=2hzQ)Ue7~~&h1eKO|6Icj z(tse}2KPW3?D zxF-32gjb~H(6+_;&)~z9 z6{wX_h$0-Hyzb1wsdY%^hB8u$4 zsXgWq>l%?cT@f^R`7dylwDst8QeWctIT1yAf}iVz6(Kig1BwD&2elynv$vK)@0T6Iznxcqgn?vEps_BEsbdW3cLhdTM5;3l+&#CB)QG8B&U|H zxO`E4gWT`y=+yu|y7K0hi*~ZCN>K|g?=6IM1IudlYRvr@nZo%yr}|lXDUclm=-I2- zCRVU1?|sL|%1Lr}0XAm_U$AvCqv`}K<_Mb_mn|t-%EWY*2qq6F43x3414Di9v>98b zNoI;@0v>#RLcV!Uxh`0%$GF=^xIZ;ZYvtI1qLN%1XnfE67sE<8V%Ah#;Na7k2xC1$ z@9yjep1Z^J3R<^@q%qF-`(OoY+~IU`WqeYFJdJLcJ?Wn^v;J-dUq23W$N+P##Y5#WyOo(AFt$S2@voZUz4>p z%zLoJ`J`es=g;ATwk1R_An5Mg|x` zHplb#QFz~GcZ*-tzfpd+!@NmXhI^mR3uw06>`(XoDpU(xyUzwOriD|Qd{MM>r<@lw zZG?@OhPri|VO3o<520PasI+AzncTtr{&J&2{n3gTeKy5#>Zm!z&&V(>?U3h1jsD`x zKw!m;0jchcTTI0v9*;{Rtv(%y3)-FTc9Qi&P!VXyrMM39OwTqKNizSBAk{CdX~f4N z4375!e}FU*5U-=Tn%-YWfX*MA}OE{ZAq=ryrDSUz@CDAOI@3lWl4}pG3^@q_&_wqbXYP9Xk_@0N{s6Oio}-hj4uC!@fY`e zUwQk0N4bmPi9Q2>3c}9p$!Iqj-3wg;10^>s-?BRCnA5E)&vv9qPc^E-!_=te5ydl>Zy3sTambH{-wd;AfgMWh*W;DsrN-# zfUCZrdebaxT&R%xpWDwi7eZ|J;`K@R@||xf9$vjSTM)Y6G{n0U2NqE8Uo))LMf?h; zi}6qPGQ>}2eO?Jw^J_P9M!mKa_~IWO50b!B2{1Tuzs>)4eA{I9d&uQC$e|$f-l8PS zz=&FKw5qg=P#nxyhQ_O8_Qu#d8BU`XrZT1B03yNHzhPg@ypMUGA5=u3@j zsouWYGvnudG;D#cc3xw-K4Uq}4tFO7XySQj zHP;zfN4B2`(WHPfAIYlga(_KqMOrwNipR8J+idto?59zWo7f*#R`9ZF>5?Lf=Ei@bt z?b9Se|GuLG>jJxg;T-Mto73qMNkn?96i#N_0*Mfn7DUEKrdD8Vsgjegb4{O$9+zDMHx{p{} zIUZKC{`GjMoIcd}Qe=6plRT%Lxo zhRKm%@M`zmU?92a+cmfbj||HS4xt6SUIj{oVo@Gj%fyimR6^^g8V z+^$c@W||XZ4|P`I3_ggQc%Y?CuRw1_sGn#2IX8s`|FhWn1zW$`Bu_7iW$tJyVRYd;5lea!8oVRkEMsLf%NS#T`;i%`EPK z3nFHVr-gW`1bl7!xt_fU`IvcKk#6>j$hzZ1%#N0rt`2}Hy}0`g8@)rO%udEr36y;0W)-gvT4zp3N;;i*3~zOmzyp>pyp7m$uWBaQm6XTgq{Gq~5`v zYmsXpwR^_*>qoQzZ&XC?H~v!##%#qtP0z(QBC5}123pvU)I`s;Gfv+<$EhhHbx2}X zPe0v==nw122%P`OzLGx_9-P|8(5ys9pHfiq?r&Bo3eQKx5|(;E{5>7Y=F<(2E&+uu zjgO0Vbizn9UlhJwzJ3u$0&<-@;cSoOrrT)YtmJD5`Fp+J`1abMLr42vJ3f$~$eS(f zYTw*G;}J=1#@HLdj4V)@Gi!CqeE9d?Iq;v9r1BqyjHMy$sW# zOx7F5A%`@$!KCB8gTeP_fjAyY?3u~)|7uc+$1`4GDK$m5dWe#eSSU;q^H}A6y?D~(2B#P;Q+`!DfAD$U2OLE0o|6NBLeQJ11-L-IVh$%099Xb2>)2b(( zkX&DU_h@Z~o2H7p|1yEqxpgc+9dv5zC$rUeLLYYI<~OT|#t!dFH5M^5z(L>eXC-ihK+5$v+P<)6W%n6)TJu9vyOf9ZNblB+w0&jpcTM_= z(R-lFSc984ho%vhdM-*CfH1eQ5qQT}=z87!$BM@|78hwV-=w+l=)$S*3e&Z0l!g`e zYrhCr8a(=3da62-QL($@)|BF4naS}ow)?kk^L5{^mF=U7Fb2P}JC|{vk1D&3sKFgQ zYj=GTqH~C+0=vK2^1W%j3#Nr+YDc8}*ng{SwfFq6GYxA|1kjSjPlbC@2tONzmmwFU zXTfHEWrp{4zw@BwuVR!o5v7mf12hL~bq5BSj7sh(^{8FmA@Yx-)`>Wyx4+-YmQ0hg6h%g1|$@chp^&jf5#_*^I;? zr!>M_hdLcW-H6p)%v0s#YJf&_Z1anJ`NkHR@mlw1zWmE@DIehbs){*~C>|I8d}xbR<*gn-X)K?eiaCZ=F4^|m!r#E5A0#oL3q zpLu#snK_pCKbkR+lpOsKdzo7$6jlth$fBVc-*#)uTw0UCT>urG{Zl3)>5Yh>?zvxQ z87Xp0p#BE^z+uO@Cvipvhq%0d&tPdU{m(SLhp6k1xmU87K(DWLDYIk0-hGcaiOaZo zP1R%1t@4&xt75t7j^`HTZjO-$?|d7oR34m+prnv%4Wy(`-q8*Dq}o{dSLb*McEnih zW?e|%Ed-0wtl617AD8fLB!oZ45?%se3ujpDjrRG|goW}XjD1&0qm7ONSLBx+v2dNs zlI)(eFd;%LaS-nm)prux#+h~2K0owD$3x~vu#OD-P|qcMSwtpK8))G76;oLJUCB{N zVF*#%=7U2rLd|>FEK};#+9NHx)qj08_@XrW7cV8dL5pE`JPp3-cF4D~zuQ>t8ptL^ zmT0nij=Zl^+xXyd&4b^BZgriD6xs2y4jsaNFPMw0KQV1gDA>u?0%a*uc6=mlEB;Ww z27h4kNjlj`INh=F5jk&Q&BpylMYUMS)Bg5JphS5!WVpih@VSq_^!$NtU(U!oUz?V5 zb*NYmgh^cmD!F`;WPvGh3tmgkTsE71A*)+C#MQKXu+il9)9{JMM)Ri8D}A4G8;!44 zN(s&dHVPVz#r}6=F8hgkYnMXhluB|{aL%*a8t16-BQ>_}ZMG;Ff7#!EXC4V9QdU;l z-|i!6Tt8u4DNr=_8y^6;_b^67_$WYF6Unz6Q|1Q0RV%sEc&-P@;;MJYU-itrcTmz= zGP^_ft3QYX`I&M9xLw`V`GlgXYt+?9<|c5a*=P6D&UJ3Jx6eF5NL8n4jn>0&ab>G1 zV#8d+Mu84*|NY(ga~r7M3eQ@iOR#!gX!&24CK;*p!6r80pTD)a7QX*VQKZSgPIy-> z7_68n0u!2i3ndG_kV#gN-$~o0X#ZTiR^L3{p#Tkh+5}NCv<@EnEqoi>)=yw!n-eex zhF_nUY}WO&AyzThwI|rUp5p}uqbe`bJnCv#5nTm(cPkUpd&*4D(Oi% zWfI=76h$^Hw%F>pKT3Y$QT6Z3o?Os9ef9NM)X{PC5rWX1CLBM<3Oew3yXXcf{l$+7 z^}BPg2A#9^1@^t;OdT`_2kpY?Hm!5Y-h4G9229Q_q`0?=nF=c@IKhYhQ7)0S-HD4r zXqhCwh5_(OKho7v;^FQPPq~N2%J3XuTV~w~oYe}$$Sw3dDLP&KtqaFB*W5{tNp<$- zibCLP=WMQHM%uZwr;G3gN@19DE0S9X?N8+oe30*YuO)ZVRME31o#`8Uq%vmEHO?Bq zB3d2BbMfVf#~z$%pJ)hrLR50i-pMEf&!%_2Vag&fh?64wzqk&{`x#QWVMV8$MKplH zZx+)PNVm_&=CX0vu6snE_ZHOD9v#tj*amkmh41n61fe=BA})X?Z|`={ve3BIe^d|t zO#k8JO`07c-!6Lk=YG;1uee*yG`0L~udb1^vUsf;tfF9*pr44s|ERqFqe=iVw(*^N zlb`${L#pOnPzuUv&-rG7o$p4Q;ws^6`h&%wL(Qwi3r^?S-KD)jn(BnG=;y2_BbZaT z6Jpj0=~fOoatFV)&pn;U9KU$iO!hAKE}a0Q?z*Z&3F&OzO#_>kX9b;%Z(-T+v6=Hu zp<8?PuI$wF&e+E1S95P}D%Pf4y>!g38i3@*>lgLW!`3o2Ig`aiSVjX3C8p7+e zE*)>%U;?JI@5pMD4mF)Hay>Nq;bk$Oa_x2PPVgHuf9J32R^^-DjLkP4B>Td|001Xk zRUD23vHWgo;(YVKWj>;lubb}O!tFpIR>DX$EacqL*@h8yQ5z;h3Kb7yBt`BI#wdQE zuaRHK8;)7arcQGAX3tW4N5#&{*f%m0g=6fMq+ZbeN*bmxTe~h=)b3UbHR)NYq|kC5MioEH%VN1Ip+(&`+~d1)Be%A)0?ZVa zZKhUS#uUrU`^S@CE6U;1JWGQmQ?lI(Xurkbv@Q9B_a3yCQQKI3RJ2 z>rE{BZ*n(E+VMtyaPajH(q13^Fo4AN`p6PzK}~u);v6)NugaV0SmwT|{SC`WvsUd|MXeHB zi=sB65qodG@AG^AfaJ)NBf0PEI8C-EZoStiN_YZ#HqN2N< z5(QtntdvUD-WC=!ZwL^GJeN3{DlGgAGMM0L5Ubg`_040SG^Ad20l@HY1N8n;y=(cB zV;5KbSiOgu)KP>xXe%M|>JQ7uD_N&3TlLPZ6cQM$Qu4ih5py#9RGO$**I9BT+e4)Y z8CeQ^&enqDn6hj2ed3kjp*u1uDtu!{>p;)5Bas`!f zR`nUVD(PkaBh1PzW1A2lg-{Cwb_{>Q$O-LRti<#r+3imy5}I@U`)7FM!h-x^y&i*q zo!0$$8}!b(ZS8noHaP9q)9;KXiVHP%=oOx8Y_VQzw0Kp#Q5y+_Jw zT<)bGM&Wg}G)-W|TtR_lcPTD?dM+;{(VpaF~_2z=l5_D>b1*(51&IvxOxk-oFI#bYk_pF$;G**9&UV3`5 z@>sSq{uPHfmc`%3cq3!S+f4r^GsI5#9odYWe2Bft!SGAa4nA&HR9O>t=Y{u;-o@8b z>>Z`el4@5BzSpL`weJD{uP6+$PgS|1=IwT*G-br6+u*dE11fNjd%!VgV(|;LC(>I{ z-2}`mlQu_94R)C|;i??ao9CWScw%HVOTm<3bB*smA29aJ&h)yJ3|(mrxR_m)yZavF z!(MWgE)>O)>ed-U1cd7=I3KFv<2-+wwU`=s*h8eA?_AL#RI>tuJL~)r$^dv ztP|f?%iZl<578`b-F|OOT~HO*H_}6^HVtfzX&!_y-j2a2bJZK^UiFb z(@TU!#uBgrxBO*^I#8W^LP5-7Z)Iqt_2o88$v5jwIE^^$3$t2faHg-$&mZ6eR3gm> zIgSw5@|l737a!GL(Ifv_tRdo#S4^K6e-sgR^7P(daG_GiuCsI;{K{j-!pwL|8L9o4{kP4?E;ym4By{OSBAw30UyOUN`Au80P0Wp}j_oujx4Dn~08 z^U(HyquU@MW1GlRwwwR?0)D#pvNQ9@dMEkb8s;VM$&P}ym3kGU6wC=@=B`)28EW3{ zarnevdH33k=&Fr9CzZ2ibTH1xBkw-3;(33F#xXkaP=!Lz7_;A*c)o91f1`+L6r5q* zhad$Rz;9r56U8QmAWKh1CINa;O<(+HOZ?{?QJ2MU(dq?X7#~y*()jxV=PbX(=Et13 zIZvK5u+{3ANj~UVV-epcpHYzS_<5_91o#Xg? z(m3(09W!)RhI~JJ^-a`4;z~@+t&r~<>HLX6wGy*Uqu=u)14crr)cG-Qfku{bgGx-W zGPf9oe$SW?37MOlE5I=5@v9`zg38OG6nT~)5Md?#jK7gbs_SkgWn5t6JC9x|g+E-g z!8u}%0@tsTz$e9809J1@DOJbNF@^C3CuZ#Q+v zZO1x%WafPg)-o#n2@k6cdq+vJZTslzmsu+uN7@UV>y^m{v{w(cx#F(+PetEoA$lI< zM$XAfgE!?*b{}X@H)f8l{41rJUjsiI>maJOHZk@&Jt#7WHghtYX@uVm|)3q0Ml!RM`S`Qmc`v#_o=BO*5Si-RN6 z+bN-sOZ7}gVh0#Dzc9Mo$gDEgr1(A>A*ZF6PRi?p?{6j+$x^ zCw>o%`04xiFsAFVjtj&DNSgMVP>8=A96GJYm9aBf6plr>sB=gZsLm*2tM`)-7W9Dz zH_ZTuS$@*%{cD=R=@XXH^qDW8O`$b;L^z!k4wUiR+lG3#5_X4HR{gSSL4}@!=-P5$ z3&oGLuUnMF&@U&})r%T+NxH+r1KSCBv7~YbiHQng!Lt@rw=7xT*w{_HDwT|$oXYdi z&8fNPJZT@i({HKB|8b6_0}}lBb^?9>hiLVwcZILS4lk&zWF~@v%Z+3T=6C4>9dq0# zb2en)7F9Z~mZHmky8GJ#b`C0)Jdww)mh3Pd0OaIx%vW>aXf%(jOi;>&nDGEp}&*Kyb_`G}@9-i`?TbmdQ(zz>JkT=)vOf>&+5%*lIK=EwlU zP#Uq0D>1)i6jWw@$oMQtv7c?T`)f+z%mNaX6JR7M!QYhOP-J5Oav66;h zKyd34SD*+KKkvCxee>qp$_U-FNd0T~S{Y%RwczRe=BdfPm^w>Sl1v&=entDoVr_#Q zYx?w?8oAflrEu83?tdWmYt?g$a-D+B-!aG?o)Z0NwP(jywb3DhGg74^4`FLf<2dZPm_-3U?rJO+GN~!S%`j_ zwmW=%x7|~`WW`4c%+_jLG`2!RZ+dQuF>S3)mz6Y+g@ldiE;Lj~>EI(j#`)($`9eVNxdAO|GbXs7w&AiBapy?tC) z$hiRQT6m0EjR$Ya^pP)Rt&bACdh|fbt&sP^GNY3j+F8wVlj(_@1Z;a2G2hLhH+vtx zjVff2g%o?hzDX?2a&WXcc!9>UDwnKp{{uZ04BkxsO+G95qVR^MLhe;jAi+)Ut;n_V zO@SOEHbEBi(E_Y%xyrd9|Q}*-FfVC>%$W)O%}zu|_xOj!`mY@XDKyNR=#26}UtM+Z2&8pQgvZ{`4I@h>Mmr`Nl*{fH`}QuHT1+AMY`|_QmRqS6WWF zCaEC;Yxz-zte`O<^i(LHP5z};IjQ#KWM$r;{!TU$62VS3QcXf^vVq_-a7||uQxpYz zN&b=#T}=|9VOY6@n=6e%3+43bH9m`IJo0~F;cscJ$U8yDS^R~2$k4q*3f#GxIx6n%uI8%wb<~*5A3YQ|4q>sm%de}w+dKw9xrEdX zseK2mLkn^rA961Gb?wT~I2mg2s0QUVsxoKGu?G1EEE}tE+RStgP;WRN{`45raX}bH z4m7z0+kgf7M-_5I1j~32=cP@M(@GOp7(la3950u@X|K7TT%&3Uu3ogY8ek1Ur7dVj z*wSbHH?K=k=~LzUHt-%QdPpwvx)fZ?xf~W(r*2N$Llie~1y3GGDE!CF=@D@g z(p~vA%J(suazCr}bzC=mP^wg6=S93(_%|QF^Na3|H`{>&S30i*+N0e?&W)WU{4T0C5EA0obm@R|aRy-0j&p7?5(^}-{^2AiKGeRM^A!+)b7Yv_iNzt@y zSKK}YK%fvg2Uiu{XxKh9&A!K)_S3kyk5rYMVXiOWmRM0%{fA^@BC?v_VolYAM> zsJGl?(12cZlR3fWRnmQwhHjtMWqq=B3!p!){zVfD46?`0`DnVw?o|)pG95gsD9}Kb z*YBl~HVsx-P+Yij-ppMWCYIvIf1I3?Qv&M-(YNA(e3UHLwZQ(s{hK^D4l5R=k;LdduvvTsE52-sOMeCc)IHEkp{L z(l1(AvHdEdKDRk4Fvqfvp8zh2Kz?Z%an*>?{}!ZxJ<~k5>|9BX5nPJ$=9d4R@!ZhJ zBBK$pSSq33U+H+^PR18+y_C5AQZakZdYCt+ucr6Zf?EL5nQK87bb7*}IrZzCgG7ao zhS?}e`G=jn#xbU(q`}L%L2|om?pHvN?`mE$cT(dx!7;2lK8o!C+RsK_-DT?FAiI&1zoFOy*;fDn`pE7>VxKvqDaOwz9(% zJ$`p7q^!XM$Zu8Bqlz~sl*s@OVXE}HvMqWWMo~=1*qHFwAXHwuRI|~2^=nNh^V)-i zjB_=s>+(s$H7aV*ro141ikq5gRz?-%bE0LJc|h>ff)D29zt+}$F?sFzuS$N?ftcuk;{Et4hN8-bspI!3Hg5@Xmwoh z{~Q*I9q(vj!@`;fu5G8p^3kcYQ^PP?r1rm z;d@^Q@M?5!b$|9*_*bZ$j3Q^{*e@Y@X9Qc2OVm`ZIV`zEsJk_fX}U0kl5({S0FD#U zVZuGvoMjv2T>`6RFJ@-E4zrUW7JOaS&YG%}*t#naA=@^*zjn7{_e%FZpFvvxvj1v! zQioh95(qh7RLpuK71#-a5;YZz)r!C6%FyxxV<)zD6lolOo9{V=C1zZ;oRt0@e=NkB zLOprP_-apomfk~VnPcS`N0^tje)xt(@4J?pj*i=1ea0buS?+!wH&$9P=~;PLcV24a zysG5x#)6m{5RX_+326P3+%KESXKHrPdan*73jSC-kG`;d4wIBulvhCgaiDj!FezTy-ic~qj)Xxs|wHLNKMwS0PITLKC3Uz6?VEG5K9*K^g{jE+y+&G zM5UR^mM$_2Ptt)w%n{VO?ruRLf>rwF36H)v^WJ1uX#8^yOlb2s3vv?-Yrm&>U(r-P zJ60UZ8n@ zlA7<6cMjPk(KOf>C}-7se0}WwF$ikgl>Aw7*xOGnG!I#bnxBRRl(juDpbSWam@o!J zKNf@E{8C)k(X4Rwx+$^!{?@$vOe`wRHs(&slQR6Zu9&_(%!W3HSPZu`G(!!y$1Y`vx7+Jfq`nTwfM^ zqaR1bJ4=c=Z5kFi^$$&e6QD#}KzN?UO-G1*;s^S{%h&VltZ|0?J=%#*fWnSn61Sn* zO)D0hTt(U$9>WmVc0l0DS=Uw1S6_fX(KJ!H)<7a%g5JwnpV)5eM@%|*vC(K=51#|Z ztvgKnr&$gmD?l0hUG4O%Pd^>%KrWkitC^QaT)aju#)(7wPO!G4&*$`(kVhqz<}ZA_ zAdio<{;9q7PZ{~7`&H3h=(F$NojcYdFLwO_FRW`K2a|$Om@8KJt%EcD&FfT)?@iCy zK+ij&tW;~$Nf=rp%JX1GPDORn;|j#jPP?Y2Vz<#lpHCtJYAPRog9s&iO{2gm#^JKo zQ1;YXwIs=dM7)uq6#rv_%agAU@9mO({OynZM}#DGtZe|V_|DBSm-OYyk~L#5;I&n& zWEidFomb7s)i0++mRRuCFB->BHkLa|M~DlGPj^x|2eHZc zz)btRY$3cLbWk@6XuO)yVe;u-yLV#ghzoH&jIMOFm;)985YJ;+0J}plC z{(~oY3i!f}SG3#rGfuV7Z98c44zg8ldE3(0#t_ht$;5Isbary@4mryV=~}iss5BAo z15u6&32@(0=_g{8q*z8Rl#iDjoDdbub)m#y4+eXAj_HAT-hERY#z2e2)98bDH;u8& z9Z?f%6^@rtb01b!bxpxtC%iV71e=Q0+&AR_oJ*A9T5x*xJnP{Os$(Vb!Rv)L4l+|& z{OOA;HgB(VKo!)Ho~z#zLqnK3LU^zJueC~H88c6VBE0O$KF06C%DFfa7o7b8ewufD^@OO!C z&e;UtksZz-Gu56_2y9*MxHg}UlacF|#CvvD2H1a4WcEE_Kc3-YAw0pDBTOkdz*_tM zo>g}Aw6i96Y_D=_KR2;skLa2jWeyZ|jXh{tjv1Yq*gK>wG?Vj?N8@Q)0#nPbg>37N*p z6AzE~$(*H)V za%7+MST&^a!WI<9sVjNqIN1y+`W9_rrn?#4le!RKOiXkyTr;18@{@2z6L7bm9Ak5&) z+($~vrWSH2)W~qjdX!K1rA8n(E0WxNSh@0&!)IXO9fc zl1DB!<52U)&}phO4!d|6x%lDvgw}v2wxAfi{=ikq72m@GC}}X5C&U8@{_pF9#xMPJyq z)?V`w@x_gs;i#;2M__lN#VVT4JuZ!&^wg_QZg}3lYYs|^nvdb-??V_+_S+`^re4j& zei1?;Z&1!f+rn4%>CEgu{>VucI;c?b#PCS3CCOd|DWr`ElKd|9U46;lwlSj~{k%o9G@K^Gf8UUwt7@b|zp zJet(2dpH1{yW3I!x&t5jQIaaT;+`csI+IWJ!fez+1e& z?ffA>-o|#N>9BbJfF*I;f_2XP-0>Ry{rToCPQGKRy!x8rhi2NrBkY;a-40RM*o7ha zgH7^+_HQBe3o1hoTk|gpQ^c7~{24jfg$igH1l?c0^pruz2H*Lk01i}|x@CJ$*@%7K zp8o4#fGpVHSSVbf0e41i;@9EfGpGSH?#3HuI}z`!4=^iZfY|3OO8NZTRt=``{4*Km zI$-lO!gf{GFCzbV&LSs6SaOxQ_8WaC?xbRk>e*Uu`hq-FNzCJCDe9b!!w1Mt&+>YV zfD84Wxt0HE#U6rnq~_)yz7KN#$B&jf6U(!9ws8lpH|Fth!uO71H>(Zy_!2H&3N|@h zzQ&NUCOVFPeyaA<`SxtTN=^QyLGn=g;fHvnzrRl<{MkA=;e7zmLHdsfg~rVm@K#AyH}%$8RYpTiIfMg#!vfUU$P4BPmRvd+zq5Z5L%V$ zG3yFiW^+7J%a|Iq3%w`*jJD)}q`3-#nkn=_XpcCFSRY$-TI|EeX6w6Jt)})Kw>>Ar zK8UK@1NmzZB-HOJRoAsK0)R$ zw9UBCaVM;|a$6s^nqMd5IcL%9n$fiTE;uJdFl^_~=sytJjb zL}^00p23{ZcU5aUaT@Xq@viwkmJHPg_8L_srKBIMsR0e8le??GdK z4_8`Z*58OPEna%O$WcGL*SD!N^bHXP9CbHB2bV*)lr;OqkH2j7Tpquh6O3i77ZD?& zxl~`xhF#w$It`w?r<8yGp&+5i?|w@c>!F>*1vtnN?QycOn`HJiNsMw-itq`Fde*7F zO}l<&Rh+Gv_YOe->H?#A?f&VOl5XFY8D$niu{B;ct75T{+$V_?liU3Fl;iwyQ$!SQ zPNIWo)4A4LaLfk;#^|J>o40^kPUUSKPE7#u*S%%VTRa6;s*MIIz)hY5NC8i=ml%tixpDB&XZw;JuoC{(4KA!k~tESj! zT#x0QmuQkpMn(*>eW#*uh!|6e{PdZi^ZjJ=J_K76a>h>)Ha@sJ zWN{w1yLxN8^>DKK2}kdck*UfD2zXY$xe#6V#5ckdQ>&PlVK{ zM!k~zt2OSv^C!__tWql(tu^_>gq5yONcxc`51g%q=3SP8?r@{GYLvKd#Y9Ba&I z4Q9TCf28A~kTLjmFKAOKx~puRGIkx;7^0c=j6Fy;K!5H2-HGcfcplxrDYp1UsJW*@ zhxGEF+>dS1I9QaTb_&6u!FTMl5O;#Sp?$5{358)nd37Ez4pCmqxmQP?8wr zd^NWQAcxpn!=j$LBRX=tE9hJoT1ZDGh)T=W1Xn-A@&ba_icyLL6yn*r?1{TD&|~^{ z0zJi6nwuxLd9h+k4vYI`<7rE~8FACs2d26u`gvhnze3RKdVLJmRulmojxDSXt?NJ; zOLN=)B32_sE6XkZinX1;thL%FLgK3(d<^{Mee_7pw(}9EI%dwYN{R!+b;wLkW-i zM_!rVjIET54KzHX&fNM1FW z4$cKUQb?XTt&we}AB%)sPNaKcV1D(XVuF689%|gVqmt}`G3fPpjk(>^{D-4}6@F9Z z(z|54dwtvHo*ze=MAK06jAwc6u&No49AX1{Ef9EE?__>|Q`>iJ{Bx*zBWz}8Q=oXj z)ukO01~)ZHVq#MoP*^NTTet5@GjW0Tzv(VBU>tg^I`M6vMrr)>D7;Kg1oAmwuJ9q~ zFJ@RrY0r?jGJ-)geqVOY8>YQbVKQ#ha=*AeT3mRI6v0Ls((hfWvJs}$?vHeb{4z3F z63VAlr=<$K4nt)!W7!)RnrL|BzjVW5JlHD2FfO6{KyCb+f<*gW_CT?xeWikt<&!jC zg89=Cy9M*dWC>z$_h6k2f+Xrt>!-OMzBT>Itq^LuKRSZ2NP>t@OEs7#tGw2urUALTG2n0eqZEEu>_ zPhsu4o8TESzB@IoPcMc6s*GnS6;jY~mMowkkX96yfKj&&fhTCe(a- zIjtbFPRRI)%!bq!d#0P1$r{*k<65lh%2S)T-JIH|Xv>)eMobVvN1?FLuf>WD`WVX$ z_rI;rKJvI;C=%aSs66Jd*e{vO8tGbSR{bfY%EHG3<|M$+7(aP9e}4yOgJH0yAPO8p zsVV)sw5{s$;}xvw?!G6+EM@_FCcPZkFeIa(TAMYg5Hr}mT!W^w;OBQphQVqxbyk1hpGM_MV7;}7+T0Gi5U?x~-@u6=8v8NHc z_f2)L@}%}-@>xC5coVcMM5T4;A`=U`v+N&ALaMBFbn4tS#H#SioiO+n!;i0+ox2AT zw59g*5GOi3GV_=a)x_uV>=j%DPJK;)$1m2tJg#%$kMxL?qhd#U0v5O}1NPmQW#G9^ zgMVV3mo}dLC&ed-EA74(v_1c*6k_74a6SO8Bdrbgb4|+E7~`;*n5~Qdnm6Yhv>pq- zP$c>yFHd@I=;2wHo8R=$s{~O>$ z<-$gVB(x89?V~|Bl$19Xl}7tLIl?7q-iAZ#W~ueUl3E3*ygDLH z=T5GfVbihD$t$lbA8BO8yo5JT3p;%8To6U!CrVr`Gz$*<%l?V) zzGJ0n&AGay@;CZjWH%gCam9XZwI36G;%v7p+GkAKiKgX#A=|>TYqBJAe{tJek(w^M zX;6pq4gEpM3P;=z%0Q*bTjuj0l2>m~=dX+-Q6yKN_}*5v2g!I>(|q^M)$GrY@M3l5 z44X9GnC@O;v=3=C?rx>|i(P$qZ3Lr}drD_P{+>yVvUHB%KM?1|{D~Vh9#sflWBZ9e zyz1Kzo}$QJaK5!z3-+GxkyA1tIJMjtBTV!!-)a_6Y;hsu$=kud2EuZsR$(MtXQ+Dz z?;>ZtD@t0TS7+b#6cS8;yI!}0-Bg8;DPnoTom6h5T2wTS(%Mpm^<2ps@R!XXH;?%s z!3xnkOaDkI@zWjS)f{5`O0KKK`=Cp>o*7#qtLx@hdEZL|_3TtlLY26p_|t7bnh~8D zvi4!V@LdkDp8fVr-~kpR@Gf(f0$3cu|tD<-0`UTc(q^p%1F)!|r>* z$JJ-S7Of|}^5Ntohd)nfB7icEg7g%6u!L!UK?~3UX(20PG!g`j5IePfA7E6xR7x!T10%?IX%HN@F^Wy1%RY)_%}$j5p%QEf0>Wy zYL+c8iH=KYcu^!!7_LE6sgKq}uj9%B2Z%dW&t_n4E-w}RHl!J)7tRwkzb>=um`dMq zeij`8XahjA+n_LefgQU5-bXbZUC=>eS-Q--1VIg>}A z)W`0O2u3%xiO;&!;tr~aIEWgjx#Z5We&m?&cy72flp+7Qf?{(vbVN=BTEf3(5Dpx? zNF}7+_3Ls)F|mTrd7gbCnx8mBW#Na6h#p2xEa_AxjqG>pczCvs%eNN7wU6;YM?Z}o z%QO`Djv0RFh*Ct~}rIDS0=*CeB=2Qn4`loMOAh&x4$N+fJr$_*q z?f9LLnyDDpq%Hd&NDF=?*5b^3ivxKxLO-sN_)MB>7GG%n1pi^8F5egYha7NN%|z6u*_|IQ+_+8WF$$24U=;a25@j;CY&fj0<`aPE%~EHX}X2){o_g8PA{KfE19= zGn5d8l3E*cr)kWH`%^Dd1-*YPP7AhlhGLr9O|KL=Hs@Rr5#x29L;6n%%rlKkH zuU~|d)@DPFxBITPj5TKVJRvchCm1E*P;~Ta_F3qsY~qWjL-)h42+9fzUYYFjhO0i= zAe}0vk5NwNG868+H94#D5*g>JoAV}^H|7xS0H%+dWyAB;^Kaa|k6}6%C7Ky3#ZPRs z`^Q=|lS2uPZ_US9D(e_hcin&5!8jR_4{28oT0Qm`Kb}(qqdln|5_Jeu|HmfIgVud4 z9w{KhHR@?L_ntqHrhQl7<*gR_|GL zqyIsU-M++QSsHuSuPry-sdw4MXErdiD3Oo+hX)@R&X zr1+PT$x-8jbH<9&7%MG%(C5E`0$(iLulnu_)idI zg1x&UI|lB(enkTAvM{IUZ^>Qcj)fSzNzWZ3u6clYhi>KI(?ac{XBr?X%P25rXuMLF zNxJkfC`Euf3~)5-1TE%;T$YoxA|B1bXQD`Oe2!t;&^05mHkE|8VB73}lqoZ$RjRPd zh4RX^4fmv%XA7#jR4XAd;MMOuF;BcCL?sT*YLGJ$TY?!pJY=NL3R`%ppPH_&{%Py4 z?CaB|$?Xm zp%?I`Gk00LM$!g-)Qg1LpEwUqolI46ritrY!(0!M2an*c-!u|>$`2vUSW5KztBEn9 zqN&-4a1e)FL=5EysZM8b+O%eDB(5dj>uLLBl9RbrjExh5IozxaZX0kiVY*7Ku_z2AUt1qjvUhiMn+K`E9T-5h3hveKE;`Q>^ z5Qe28|NXvb7ZuT}6!c538C7~Wn}^=BL}#}O~;TyVWvi z=^nd~clD8IlRWu#GzJ(PzP)V``u;-Ik6n?R!cEmb$9wFsx+C|l1dPRyx@vJfGHj>A zSM}eKl=GO}E;G>#O^N2O`gRj$l<`Gl3>EbPZU)(NeOzVuMyS|ih5PB<0a6z;4qtDK zW4&|Wuy?oW_#C73-B1vQO`%~#kV(Rz@yn(8Ych5QF7!har%h;|x%8MenxtUo*)4x_XzebYlkiq`&<-JQ0hUEolVJor*b=njD& zFCiqJqcugoTrWT(GgXqDR|F&rVxyLa;^T0EXGRDYWk$+GelOSx9)Awk@klDqDeN!b z#W~orBI0d=S*JpbBn+Kv#~*I<*Je&Or3ar%Q!O02!9)b^PCQ$(4t2pSIvqPvg+GbE zG?r%@58ixuPXNwov%(;%oQx@cZ1C;3punBr+npt^nEXD-jm&SLA9)j_hLEGJ;186s zemozp29)2LKB%j#OaU0=PV|&THCvE;Mf&Y8+k2{XgXv>~1gsu=1KXgY_nGU=dbkTe zK~|)jA8xLxSm#e`c;(E-olbLUcNQLZ%cML+e83Gt{fq)hxO14AqG(Q4v+Ra232}hm zN$d1TwFCi?Ecm$U(^OhNUE1>b9i?yxW}$F~^xKAWp9y||IAq1KJxT5pj6dRbP6ksS@{{KHV4UDOLL}n%O}bb< z5OL`A6r1MhNPE8spUa!|p{98UKE@UsHba6BUhQ97B6}KTJuoZqb>D-UGK-ATO<80> zkl_86WGU|DW&-lQdF!PnM#s<=%tgu_zVJbhcuOMujv;ZE4HEt~{wu3G^;E(%m@^^? ze!Q1sz*0lm63v2K_8BWJP0{??mps zE1ywY!@rTLkC*@Ha1B{3NL)I@)Op)1vD-txm9cE^g($1H!t%D*a2kIc7Pq9Gx#!HaW-}TE4BneenLRN_rjg z$&dSYsMP|AkkR$&_ka+Fjwx%{>fZcGM-;ja*SDAOK^Ofkwi8h%cvIhFbZHaFl)igOoB(1QYz+=C)wpuHzI$Fl7Lo`= zXWsczr;9V+Zy1=^ZK94Df*PE+5RLx;9fTw_+<0H^_FUN+cl>@}bS1%bmca8NBofeV z0&2TDd#zd7UdcKi3QzX*Nj2QCbx?BnY<5upe;VNKs`5co@4@-iPow6!mFl}}Q@574 zEFbf`<4>4LXMgyepIp5RR65@QFjFr1P5VGiA<@Y3_XpdA>X49IVRSHQHs96D&h0x6 zw*wsYclUPqDwZ4?nY=GaGKzSez1%j~&NR;ML%W#yT>0{MO{9l$q0ZSqxcSLZf7Tkk_7W$;iw4&t4@Dch%DQVy@$Zt>%*TL6V_`i9^h#;ySz2 zP0~aRJA-S4zB`>&i8glbowf@{?f@Y6W5~0%5Wx=vIigw!E#Y(2O<4fMJUHY#6ma!r z0!HZ2ai%eW3A`Q?vE4!Ob}ynhF<8}OM@u*{`+7AKCm+(6)rLbJ2XGyc&8%7T!kyqj zONRoKcKM}4bVr_F$|y5~)%1FqiLEQ2ANl-CV(&||5qWE*(6ORU!!rT&M648ApVaE9 zEu}XB>q^WQhu$CP(X1(?;y-$c?k7`411Db$PTw|%>1gVgloo*tk$>I{OGk&{U(SL? zG=crxyda3q->7~FUL!)MlOfx0HKU%f&to?G+sScR#{<{#L|fV99qH9i;D5z)$kb3D zh5)hV-(4dTlbOAoz3jt2Jd}$W4rS6K5|T1{+ntIun%-g_+5?@%1AM?sg+37MX@ih$ z`UV)1L|Z0Cr7?zW`tgivwlcNX3&14bjVR}Vul01IrY*E{N1K^2qn>y`{z+#EHLwE6 zsb+3aza$SU7PU2oK&970a`c+Lu#5TgG<@xXpLG7lKrHR5t+e~EmSTz($wmVv!#X}* zj-Of$>$LceY5H>cjal>*8!uqWfCgE2VXEYB)DTxR^f~~Z-{;n#GYmc^L6z`0Ty+3L zT9Maxk>qO=XEf&4aphkX4yk1V;9;?EX5_yEbA@3a2_l8-TZU2{`5AAvkWs;;S?!5V z7!GexAx#iA#^!cM)aEJo1#v>c#07kdPgmUl6;o+P`dsk|hV|0$!@8G~mwYtDU^`~m zK`05$#|Q2_tsompQFi7jIK?;)EUGPH!;B(FNk6NbpO$$>7rj@5j1qLpU0MbSy2{$F z5fPPWCHWqY*f6cB5U`#CdQ}LzJC~v09{I8tMme!`M{hg2$n|2T(-y#b7^unCSRaYN z+WP==H7v@i0s;~>JjU-#mC!#jM0|?p0D2T-NF$#vfs4l4(WN)ANjSbh!W%t!d9alC zRjgB0@4TPr3$<)W4#Mc}kmSa@mDYn#JLm8#x+7ri#GbY~MJ&t>&Y`mww7ELMNx~br zW(VXjbKI8WevYfOe0;1;LLZjsI#_&9AYoKW=wytU2q|{=MIOxF`Qmh~Le<-{Ox~BR z2G;$Rcg~}^lv;bfN?b=fSD|6-V>lhmFBfCW#LP-#F^-y0NpYsIp7BnRC)K(NIjPm% zUk^~ukMnjXcg7@jsS{0i;GQig{?0I1U$a5!5ak1Qs1J5xtJ17OGDn@9rP#QTS(?-= zFP7S78s!=JlQMoc8pu4gV z(5KpgItlD8mPxiygS9ow$fN{iV0;Px0SPfU-1~Rt|8;3l*2c+)t+06~3wP`ELGe#=G{15u&?m#V zWF7CA56zpJ6=3cq{frry*PxsrN!~MdSPZNaqr}>a&?sF)2MRZDk^+>A{kor}*!cMl zT{t62pd24Y1&D`}t@O^jZ23~(PXLPzS`#^$QuiNhi* zLt))5OY&M*-F}Ea zo&KazjfV=7&`vsZjMoin(9#MeHgV6vQz;oVOY0HawLzTF{lo%(sC%vA^RO#tY z(o{X^HTNVCH-F4&ByuD3`l!VqC*^vJFNm#5j)+(zP)zn%3NJv; zd>=j|7-LgpWp4ogxRrIVf3_xoF$eezr;POTV4Q-j`Tuov?eR>1|9@`n6C$;8X{ZRBzH&=r zu9al2b16!4E0NqL_q$Lt8zE#i#SE1qg$TK9lv|t1-7=S!TWmx|zjwd?cJ_F`&*gQ_ z`<&P1d7iIYVosY9PHkg-_inaP`~HjLRYkQjYt7y=COaX2F7bX8el-77n7mx~$o#}F zOZ4EW37U@6sB1xickpLojpNShpcYL6?C892X#4zA>(tQ;j-)schrC-)v42;5{FLu8 z`xo7dc2uQ$)B^P^%^^Gf=bSoqt?c76t%E~Y-Z-5bbOND$;NYfd8~dAlW7S&sE;=K4 zis|(Wv_jytRcX6dDu&jrG>qYpjG*jJjhDW9lDG zLHsUFQ-Nr~D1DQU4SB@#VggyVA%ni-@p*3`PmgO0rhKar2u|2J+v=Qm@YiNHXS(U3 zOzwko#SLw3#_Y9?XU`1OIs{)PO}#8ff+BgOhATms%YXmwlK7c}!Y9Wp2PTa4 zmzH?Xq$Vyf)C-M$J+q?R^<`!F&!o>zfcx*zgP%)zWt~JtBs&8+A5QqqrTr}juT zEGXcEbNH;*C-2fz0STlpeYEb{?}U7n@dJ&lgdc{4_D4r*1p{vc6TP8}3avZ-J>Q#- z=bd{Z9nzU8SD#fO*f^8;-q<~4044id{_SGulzJ6$Ux}nU8P&0E7IhD;r-bvV;(p^T zOlHo!9J%2po|KIXR3LgoT3&iq72}gu4&4hZ{Ur6u8egcmxV`m9b(9l6$J+lrtH*8&9P$1f`hGUU3@&x%fwGH`` z#u(R^hmBfXRsH$HCLK&6p_kmM-Gpo<9nChH5Hvxf^~xt{6RpSE5KZCC&+LkKcw+G_$lvJx&XagcFH7w*P?U1W?>IO(w`5c?%h&_(sQHse zH8*jo;AMOPAFidOq}w=uYaY5Q#2~+th{@4S%uIa%BHO}`JowK`#wSdnk!}kY(t+do zQa}8~x!L6WWgaxn+{y323~a1kc}9(1QX#YD9bmX;8L^=_5BYu9heJYa2r(7s54qMf z_1eCVxkTzEd5^S+#Kv!?Y$G?Z^PR?mS1nsc{=>$^boXW(8!vdeqH4J~sJD^=(E{Hb zGyU>G%l}$dTQgtEZ95P7NS=KD#1!O-hQwB3H6aptorX!4*PC`B?VW5TnT;j8VM>); z#nSB`SGY={np#PY49eRf9OyJKfp&dd%=*0W3o{QdI%rrOvP zN52GYQS)+7pF+3(rweB5CVA(5mIfsQzFgPArHoO|574U(!b^wKwSv1{mW_TM4!|i) zCoVyZT)x$kAscucQR;!tF8LAF4LI=TA%wK!||# z(E6HbY0_aelCFQsJsIchK0ZzOv{nifeSejzmhZdFig5_BsFl{g4Q6DeaGbSEQ?PdV z)gmT7&{<*#HeAxp*;cDdjTZIqm7t)lE=2rkdk@E*2h>G+uPX;Xm8zyxf9UFQ;(x%t z?f~fFF5{9{?9F7BoIAo*auQnnVl?Oew`au?zynt)ekID~*NPnPPZ+pjzkWFa%1jAg zI$LJ!MT?QM@4!8N$(znGP8nkmfVR5=xE#C7Jd+vc6Y-O|JAXlwOBS^fq5X^E*mzd_ zZ#y8cdhX7=aL7fO=x_?4Wna4-5L?{jxQ0xCmnd$!Fn`Yk4WNv&Fwy`$!c^jE?WVhg zdTPL>$gHHbg!KmMRtmylY%LnU`gLg9WLF7;S_*Hg#$BsE$E0FkMbPl6NDIbv|-j~?`B?49~RrYhfep|nc z0-HCT|ApQk^x!_|m~s+VXl-@eC!%CR9Cj(w6akH;GWjB2vcm`EX6``u>wLqL(#RXx zisL3)KT0Cj>9zo$iOIh(e>~&kj5JNc(i8U=L`GZ9FJ_C*)UWQ5mEmnnziMWcDZv7K z;w-3C`JWf5k>0eW1`sYw%i>>e@f_5aUaRWr-8O*V{(1-2Rn=7c%z4YDF{PbVZfgL-fE-nh+uc2 zOt(@XX28V#Y2#+~-U1)#4yaE8nh6=GE6zwiT5YHPZLD&d@C^LM7p0MZr$i;z%*$T~2`Z}9TR<6fS-X?dh)PmZgI?LMVLM`|fsR!P%$@{<(0AfCN;-;K9nl5i63|Sn;@r_kT{lPgr3~UFZJS znWJ>)f30wqK-(Cz6|igHkK+w1rlMyAbrMYmDCYAksxs~u7+}v7Tmt-yeZ3jx$eNoQ zQb%v7`%^ZLvx~u|zPz8lI0AbO&F)|6m>MIuzry`g+WXtt_B)|Soj1UWgG(Z05gxrI zK4DOa^`}p*3ZEJEU#p!m^aur?MS3U3=UrPqp?`BUMRsDy=a0fvwYu8)Ye~4x$GA<< z#>O9K%NrRd!k3QjTwJHcJ&XLT6RN8)tGJg?xJN>Zh$p90oMVz*Dm*kTvn^!*#Rw`4 z7bVsrjZ4J68C5-cEY+c&E2j zk8NHV{BhW8&&;v#Rlt&`u~R?X`Dkm>v!gEJ;voT|qY6-q+6Ehy8@Kc`9kt2X_uUH- zKaFZG#eThc;K^*Xq}dM>c-MjKL>;<+!efbZAq`=b8)lfOISUV=U@9pEA@st~jr^LG z*(71Pu$hqRb@F+KIEK_t^a1;c?wPU$An`!9tx+uN=qT>YAy$}>;yitAQ`CtMns=?We>-~+?{yOh?&Y9A85+GCC$wa+y++D$>lNgIxAMFyiKdb}; z+QC=K`rT}t=xtjUabIDnJl;mdhEn4@m*b0#0<;CC8oD5|R9n?6>)^M3h37^-5_Y?gsc$r6i7Bn#29esRMUeym>tG zvcYRs?28{R(b;4CzaaQy%M|%CB5cbRAzK+H>Y$fN??xMYm2f#6Yyz1p!^L4<1zT84 zb{tCGNTWY)Slkl_mf={8%7l40tc4I|!(lEAI z03ZsM9<5C}Zd~@#j5kf5w@@4y#Dh5W?-n&8N&#*nUId&s(n6@7dI)k^P;YcMWfqEy zi9hsERZO8bb;cumH$k#JXGw;(ToS>%;@}ij+k49u(+i8?q#s1b;it^1Ym7ttG2r z0`YUyJL7QnR!n%s2-_k2t$`07gB_Tnf9gkum+Q90%T5zKptHbHh||vIx1y@u5~4yA zC{EhswrGrv-_;d~H}0Kooh=^j0-UjOxb{MEddbp~^XRqKVBolzMQ^1DG2fiNsQ>Bg zh3%1fZfTz|F*Nd!X%AhM>Mx#dxB~+`R{5QY;`lmRNH=(j;=m2nvEgbOaP5Y3`mgB- zh9VusTf4fPPA&Aqnzpg-ow2jY{5S*0*a1dWRDmq`@fqAUdeOY!b&7BC=E%>A=ra;^ zF;bXEDbpln`KqV&wnHr73TJ+eqP}-8W#8zt8Is8Wq;SzcE^8|T*-$2l_kX**Qz<0H z$OlxF$)7gt_s#>5K;50J#*EnTGBCEvy@*Ls=)SBGNY_nDb?gx&?%gOI5&2YD)>DgK!{Gm;)F1@%|0v<*b>r7oT;sFjh(l||6}%elV^vL#xA`85)uD@8fqgdHE55%H~g=zR;_ z)HKy3#=kiq&}pR@T5U<%n!rn&S*K0H_gFw;1i1MOhv+aFPM^)Z$LvMk^V;$61kNtx zsdYpfWf9!(|9~L8PB*G-w>LItGivV@pi`{o1U~#ofM36?s9&u@6FSJRTrfd6CYm(0 zJx@3Ty0h!Fdemr5MDen;{#$^ecz^pm&XLcMRxSqUf4EqhWz;@WG&IKXtEo`~`@KS^ z+uZlC>yPcI-A!yM0Ry_8@en&00#nY~BZ*kx@SfWt zU;+*5{HpT}BPz4VXdp`*5KGg4Jx6c4C5vX(H}Iw@R+(g&Fu#nr%6}%gBoESOlR_@4 zjwEUd=*w>Kx=wkC-ef&ewSSVpQ$Ys5 zqQ%46YaC!x!1xZBE6oahGQ@8!)sL20go{X?@h0lG0@}Ort>4ujL>xGUc>(!g+g(eK3 zT;`-&KGUQVjpB@Rcao*`Tk3CW&0ZL$g8*oW$;Sc>PmAk1Aev57rQt@G=T@q>`Uinf z6DlKnIdohP5(;92U-99OmhJ`;DbV=iwQ}su zf*Hkl1h0ZZ)D)G_A#^C@`6sIqM`P-gj~zkfWR`;V8$`=h2TGjn{FF1u-i)ikeZ5ZV zIAMzn#t?p0h>zG^N81gTgzC9_Hg73v&xRsE>{j3aFWk8QxwbVd1h)$?xF_k+Og=ED zI93}Eq;#Z~n0ze7G+)WVb+4Jwe&WH7b$tiCe zZllN+-OQ;XUB4{f`tp9Fz-J4P0J&Fccp1IP+$kih)Q2c>EYkD^GUkc z@>}#n{<1fjJ9bFS)=d041iH$6;o$cQv8(V!DxYlk^@Zbk?qOLPh^B>~%#$p*5Jj_7 zVmy1jnr)xf5d*~0{ABjeSt&^rSC!TrWj+{i|03pli20wazJJ2sA^vw9{!6r~(rAVG zXf^!XlBHq_%KQzG)({%Pph%J|Y4CDMj_r8I8|ahXYnRx%;IU0-I~^Xy70D~j)wp(m zL@I`x=}lTF>@1k{wn3UU|DZntPT-3`rd%hI_g&R7Z2$Osi!0&FbJQ$~5&$K$@Q)~J zqyGgx7ww;n>{AQf69%$`xjB}%iLL?-%?*Lo2>;Ow*sPSKQuR<;CJ`z=o zFq>h|+jv~9e&A*S5D3duJe|ugg>p9?&(8;52HL_)axVIusMzqHJM|g|g(i^w4R`vQ zn2M>svN5ZVZ8i-*FLo3#xqG)NGgKzie?9*T()mTJ^f^wI5r3r@ddFT2* zu$WfK&45YX>+U)l-^9^6H5VH5fAA z@fRo6F|)VO-Ow(A4kITayowKi4vz!7zyFymZU2@K%N&cN7-=DV0aegIuKc;hAEj+F^X0IJXpB9MnG(UV8p#X2_7_Bj6eY48LnF)nKk}DBMqT4O#WXQe`cB<6 z_S~+Ne6L&61zNSsa_jhDREgoBS0|HxMp6L*nJBN9_}2UTbsbfL{u6H$$9lzPTxY%P zHx(#FyiuDV!3|%4HYnZD&Jm-^z3f1Ltv-#oTL6ohhOG@~CIl^MhYG(nBdv8*caht7 zju<-u3k912EzPj-rJRcwS&uW`%Nm8)W$8ai@%ZByp$2J>oGTsoTLWw90sJ5WE6hUz zsuhr;KR5BF4kv?zNM*Z_Y1VpG(QDg@1we9#QxfC$Y4Ahg74fwE2>wIeCrH)F{NP0FDZa$O#W_0 z%x*PFuczFMYCu+&dy^2<#Sa$;{q|^1r5g5|^%xHJ^hE;kXt7q&eXmZ3F(*XQMLG zt~CS#P&C!m+B{Mrr`ghBsO^V*28>qle->-Se)8l#QFn>7OgeKPv8Uc;Z7vgm^rpofn!} z8%KX};VLKzEnV(wh;?c8LWIfRFMRfc zeYc+SD!lK5;A;{(*X!5F1Iy=6zBwq`VA^Hs6z}9xW@e74hSfnJXn=MBazLL7K3-_9 zfqob?T|5T_avc1=!$dmb1kb{n_8r-W6lL=}tmd4~OW9C7$FtsRtij=GuiT2_MNSoB zld&hIRk(<@GA6eSP%Qb5fe0&w>SW%iAp(M=U+C9ai_sx&y$S&AXx}YUG zdvg3L&py_Z(>D)2T6d@Nt(+dfNp=3JxymFwF1KhO^l766(~i2R8=(6fnK>X+2K*d^ zxjehC4GWE7Eb2Dx)39$SM3hwuKDJ5AS98112&xp#wxN79_A;8w??q5O&~>7*r41zC za@d(a%vWk%(9$^>#mD)EVdc}0@Mt%;oUcWF|1&&c>=39;h|ck({0Cc0?QW?fu2-U> z9RhSi!CHG2DJq~J@VI-TH`Qh(yfot~qn2SjbT{(BW0C(M{U{$bJc;<+DU8EXsUIXX zUGqbO0~hD`mXv$X3vWLs{#g4~7t)goJeBKJHnLzltTro_x7w$%&*qgw01x=zOTk>{ zw6|w@HePK;E?Xi5C0F*8tcKY)9%3`@k5ZeJ)>5RRg1(jmlEX-OA3A!{K<)}`Eji0) za4!UH0kh1=x!|W(nhW-s&IwsUL6~pl+@6Fy$y5u4h5s8sy5@=wyd80F}y61aXe%>&`&v@;~ii)I)XFFDn0jHmLbS5^S>w@eosm-1hmkvhg@I zv7A)uovQDIz#&$j`GZC;Y)Xv7ivLOV9JKvbI)k8zACj0EYH!J%(!nL!XiJ%=hlFQa zri|wF>P~4&)VV~Q5cLapI*T4Hp8M?4&=g{cbF_Y6+2R3Nlvbvxb?KrcZHLm#zUC#f zYc9Zw=)XRKZ*oyTFU^|k|JKiYQOPsdvL z>A#X#hPmb=Ue_6nJ@O%g%_tf7+s;&%m}#<6VOoz*<^~4xTrMl(97XX%MZ=Eb1r$%N z#E6ZkpKw}=>RVuqWz=DRo6K@#6xBZVIi7UvX-C6ST4q{SkLkk<$%1QXIeul@(e}!^U`ha0uJ*#IJKdtSR$YbauI#V9|wH-Fu|=O7Sb+G3chz RoZB^R@^NtHar)np{{sh8y1M`X diff --git a/src/Umbraco.Web.UI.Client/public/umbraco_logo_blue.svg b/src/Umbraco.Web.UI.Client/public/umbraco_logo_blue.svg deleted file mode 100644 index 578bf592f6..0000000000 --- a/src/Umbraco.Web.UI.Client/public/umbraco_logo_blue.svg +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/src/Umbraco.Web.UI.Client/public/umbraco_logo_white.svg b/src/Umbraco.Web.UI.Client/public/umbraco_logo_white.svg deleted file mode 100644 index 01f7260cd3..0000000000 --- a/src/Umbraco.Web.UI.Client/public/umbraco_logo_white.svg +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - From a15f22f959c0c313ffeb51d1f9e554e01e853cb3 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Mon, 8 Apr 2024 10:10:02 +0200 Subject: [PATCH 149/280] move assets to src/assets and remove unused files --- .../src/assets/installer.jpg | Bin 191322 -> 0 bytes .../src/assets/login.jpg | Bin 0 -> 366426 bytes .../src/assets/umbraco_background.jpg | Bin 30678 -> 0 bytes .../src/assets/umbraco_logo_blue.svg | 51 +++++++++++++++++ .../src/assets/umbraco_logo_white.svg | 52 +++++++++++++++++- .../auth/modals/umb-app-auth-modal.element.ts | 4 +- 6 files changed, 104 insertions(+), 3 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/assets/installer.jpg create mode 100644 src/Umbraco.Web.UI.Client/src/assets/login.jpg delete mode 100644 src/Umbraco.Web.UI.Client/src/assets/umbraco_background.jpg create mode 100644 src/Umbraco.Web.UI.Client/src/assets/umbraco_logo_blue.svg diff --git a/src/Umbraco.Web.UI.Client/src/assets/installer.jpg b/src/Umbraco.Web.UI.Client/src/assets/installer.jpg deleted file mode 100644 index f0f5de8695c4ad6284a7ed6f5031e1c445834979..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 191322 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

#ln95|EI8(sR+#vBZS}rGqyh2EemdNvn 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�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

yu9tN}s3Cwo+N_0sSF(yJrXN0wmd2gkoBF zSOH;w8DMsif?lpvCtZI!K)L+~^lz$9N#c^@0aDi|ty2>i$B{&YcFPE#iKB#St-YIL z6uvj^C3z&z9_ZfRZiTo)GwPwwURNW3-&-;DHQ3w@JAVlTbSfx<2u@Pry-|NV8U5Pm z+*ThCq&55|m2}~wA6_r%^z#^L!*g$Xmeq$&)kF>!MEzng((P8C1duF`HwpE;GS#lU zPcpus(+$i6B`Ov@o_y3ObdF_O@BLxQQ*m`t! z>}7u-fM>RxAk+b-Csk%_P^i89waMW&im5_aI1hz}IV2HWRrZDG07nm0-2AI-4dmFV71QhV)dJ_8_?8!eqNHu ziau|g=Rn5isLAD|D9Ytri^IV%kLXPIUrx@EnyscrW7C&xNpP9m*n}7ptx=d;Su@A+ zmRIC5S>F)$pd^4?;`MzDFA@xUIM$?E@HF4e?KfvbC=gWNgB+_8t?~R(NU{h5bL*2} zL)Jwnpv zB>&2C)n~02{w*m=GJ-``tRL8_BhzUf9RKAgXwn+8gkBCkMPGOMYAwdhn4ssz=Wi$f z_r!2kYtHby{TS2?@*ys&RvE*|eu(2Vir=aUJ0CR1p=xxk-M*K|Y?3d;uGq4qo-Nu% z1&7NE_XCv#(XGuEmlZ5_KfIpMBCBzitegqEQoan8t|M8L4jevIb_R(C%uVsdhg?4o(FAZGkjRxJMH12`A7fuNWV~gO>NBMXkeUj(~m@4t89c{(0Dgzm?-f=vX!T>{z3(1M7^{|H^vmNIwtn@#&dg zIvNSJ0P?XyyEX(QvE)`7h!^>LQoK}>d!zd=j#xtbT>(77DqPXZ5cIGBa!c}JzxT- zOP4wQg#DrBV?TO3J|w=lNQoLW9wDYRq`Q_JNN#;ccR~V=*l|gUQbw|QX!*dAOHASM zv*G^7{bV|VpEd!Y=9BNv=F8%^*SHS-&$B^F6zY+w`9PGN*u~1{abmX^oG=A+sEpx{ zDlD6xUea|`uKSa)mT}8I8dRjbJK8k$m=F}#!tL%&dc5jixNZ35<4!=Lqs@pA^^Bd%RjX^yOjp@>q0Mf*yaH-Ly>A4HgQzA3w}6SFpG)i z4LJIBm*!$|9&`xsOTYHf{Wp31c29}-l68Z9YDCG>9M1YVvtLkv=wmM$Cka7#U~$p$ z{VHQ1lV^R7B1Y7Vf?fBc)0b*F67ImU#uAd>m(Lj*^n+XT(^bPtZ2_~g#>BD~?{NBA zB>{KeAIz=h=yuK*E`T7~l3V~pRXe2oDG|-_?=L8OZjky`rSw+diXT~6ZsHI5?|XWz zW@Vx%vCPiGbRzs|$pR_CzCNsf`!suXBZS2sKpRzpH>u&NIblJr$cMy|joGL~pWY+( zF-}7^rO`Z|Bb{|rT)ctrsBjvjA0iAL32hU=%_*x#hisIoFV<^Zv|){I$1lZM22)fkOGxTT^Z`x&Qi_SEZ<9RaqxxZUJ&vkmwIfp?(w`TwX4G7-?DQ*64M zTqTzpJBHmSj;SZO{ZVgYRGSI>(iu$D_4C`0f3;dHv8d1yNi%DSCOqpDezl}W4S8Tg z7umh@4m|v9T$jE5vf^#QV`{aRfu+pBG_`eKHsiEt{jFwiicvMcD-Y_-FTF*87rN|5 zT27LzYM2ERj4L0fZk|mjGAd)#o3E%648vWOFg_%hXnAMq(h@(qK*3o$eW7s-C^3q^ zEZwyt8X&6*AlXe$aI{x_&rk>#?uAb1GE?Z^WC;*|cxXIv*ap9ldKgE4u7@~ZlN9S4 zxpn8je=sy>_xhfi>q_S^x$=(^N?cMCV-Py^4ZLbNb)+o`6hp}}GWwU~2Ax3U?u)(F zR^Cx(5B{1P3QFq0gVRJE>9BV7;pC-)5JX%drIqkHXLSfVWK`<;ajR(UrqdR6z}aK~ ze;l#0mY@H)5$V+87`MhtFkSd&GvKv~#aY}p*IvVBi+)Mu5!R9$t9deG6!|&mZMw{Z zCemgi90;l(TlisN@lYvJlnWB4Av~RSW=ZE9&frYVGsoAuqdLWYfBllhr}|UFLw3ur zU#cq*S(SfK=3TD4*5;}rVsAdg)lof4Om5>dZ$Q(Mz?~E@K_h1wMvEJBZ)hn|nX|FB zDL=iJTzOE$r|$Qc)jhVIpP2x7NN(a58Sw^L3cpI-#|p~IQh)D-IQyMw@~QVOvly~p z)B+A68Q{h7m2&+eK}`gNXbS!G4}JYu2|T(-Xi-;DpjIGm&XLxZD~YJAVZXj$#)u7~ z!_?y~Uw%;8H?y^vPd2~NHZFxa0Ak3CP4Y^C;5oCdL=xI>t?zJ+IQOT zQ2{cIJ9mp*Zzp4D5DvzoH_cf(+_39(z|}MMCbrKhCq2=B5DJd#9PgY6C~mBU?!Ie% z(Kcc#O{g|<0l_4CxXx?VLA(@=aL`2tl-nK52~`PxKh|N-H)i2~lJ50RXDj)~X?`H4 z?_(*ZqBLjr2KJ-_G!wRr`iOqRnrQuQtm(l@n0aGUI%$rR;ig_U?%vzGQoc`NG~ntS zj1*vjFgE0wr2wrcunogH*eMLCS}l0SN`(rW8#SJu0u+Vt%L7`@8p+YtrZ^FZ(3>pd z2*grO%o5%g)IOZJRI?uiWe8?nSwwo_&%4eV-bj-gO*3ttO$BkmufPWcpz8&*1sR%} zZXx7V@EMxT>mZJ4HLO8~PlTM`Ku zySSnzQl|K^Nv1IPBPwk+I<S%&?nrkC%2V$V{OX}h#!X<4N! z?mGwA2&u1oe5Q)-q2ok7uOe9iB2Osr7rdiGljc^x0ya%pEJp`*$0C=@9|B(|UG>z5 z*VjAFOVt%Dw!k~-z^Gy20s(t9rLxp!$N-E@7zDqCHM9vvz-E z_!$n)XX0+0I=h7)Cc~{PymZP~yAX4m#EXm1uw^8Sp^5rjmC|uimn}oeEhlw!oW*>0 zaVxN!>t7+2?p?Pj0b&Qy0(E-9?ATYlYZY^;8|Xp;U3zM`!lEpl^+?TFb(Zp4`t#cN z6PvG`-`usF>D`;t?A17e-*n~EY%3ET-_T|EUl^d6)kdbU@-JPumrwUDEaf0qUi?$Z z&dHmtnJf^U>&&C+@yS7=R_rBKSrg)-yjH#{qR7OrjuEve(!@%I8N|&%1xoiI+)f2{ zLp^O{^{Ng(G0-y4=uj@}hZ9heDXn=r-Q21 zpRgF-BBuk?h&DBzeb~Wn)@?Fn$z2xXMMLkLVr6;vuGGD+nN(DKkgbY(UV$LI_G1jImc&aP=HdA`~YhfFTm8Mz^2FaV#ImIBa3%ZOJZvqUpv^f{?YT#9|9F}0o z6AMC#l`?z-#^N?+Ki6%7+P_KbxL419gxFa>51=D{ z(2n~&pl2s^nJ!S;OulW2f0#m z>E7V14wwOae8FuH)@m$(cxE1#>?CXO@N$*p6-}Vrn&-dculX)zlIdgJIrudNsl=Y( zE!SA%X&_zCo~%Ni4=Ni|&PVW(nh6doCv8$R_GB&6_oDJ|`Iga#_guvFlxK@RqUBWi z*-f3N`d|!bFZ9eg)&U_vf~-tU_?NxLS?w%Oire?^I$kkMvAF|R#?Zi1*O&0-tn{Q3 z3lew*!M#N^aSwI<(DW2i{BN>CB)O%ZQ`C7{*^xg4`_AvL#d=NMM-Q00!>rs2CI;Hq%ise~%A@1Mqikgjag#Vy`y-1tUkl#x;*;oTX&e9?AQ&PGzZ;oC?wX8yJmF# z5e%YgjIR4{cL|?e?zWx|c z9=}b+H2LJ$AvX^GaT8*4-R!7z>W+cUSlQd>W$@Gu@Qo%jw`DN(zijCit^|X+kocqd zJ`FR_KG2gsbbnH5<;X*+9xCU#VQdnX`FC&-OYI5SZS6p(=>7F-+N!%J!e|31}{udT$CutTH z?!N$NEClQv2EGa%o=x8+5L9UD2~%Bjart!(sn9UHTMM&FSOhrWwX-a*lUUX0ci@C+a~pTSn@{ye>O%Yt&{#U-!^*X?X3Ppd4Kk+aT%fo9L3 zmvV2B(x3D6#fZ~jVDZ-+4AY`PiVZqfq>MIP25vf2(LY6CZlctDN7CVgK5q-&->8$Q z(KXfx=u2cB8GK~p;n{{Nl~jn{n6F~E%cRScFLIl`Tf;UIK`dE;kt7^;aAB*%9|Ch~ z>DsT&!a7-_4KhAhm;)PbhhM_groZ!GP zT<>7~nXl->DjD4Wx&EPY+wcPQWb;6d3|t|$x+cH+4PGv@dAWEd{Q4Xj-SZDBI|tmw z$;=b`UaNv zo+d5**rwcwlk=CzOSv8@=JZRwSn+~#1Ox2mMc#(!I*f~IQF2)j3zK1vEUQyp=Ia)xi+nP5840zrW<3>i=lXW` zEp*-F5h+%8b|x~ok}?`GOJpSpNhLU4{AghzB~Tc03A0{R4qCr$N#=V{=c>lq(*d_^ z=p(hR7g{eGHfhYg+9jM!xnoKI6d?VpNq>gyA%9OsU1|@<-7&Epjnr(G>MWcoDesg6 z(ecoCG7sO6kAOS1+AHFbooJS>)f{?T@evjBh~o7&A%gbZP0>~&S(~#wM(=3|HqFeo z>rjj>(-qD-c2s_26|{rEZ+C0l_PXVE!+wi9bL})e)HeIE&Vnp137PYDN+qXixC_nv z1EC36$7GM#9IP;s+T+(WDXF{dK9E(7P=D@F36_%XMR6GYnnLmLYa~}zMVtYa_8Tynu-Rx%yRgyQtCZZ|9PqoZ@I)UGZ-sb zcw9|JK$maaLf^m9T&E+FH-gZ86>2uaq5XMaExmU0KuPLa@U}&Qahf`FQ{x+lM5euC zl=)ZyBq>Pm_k>fzdX}E-FUH1LE+INlsxJcX@Itswzo@&%#z(`(b0*UhV~9a=mJ|DR zfB$_eQ1#n9g}&7++49p)M>(CB=ll4f&+m=q8`z5SPl?LgSsDvb+L9x;`@YWT$)!;w zv&nGCCIYZG|0GC!O2z|?kZgy_omR$R^Y%0Tdh8LZ$g?aTz8CgYP)03Gb5jP9e(B*q ztFTw~C38y4(QggYZ(1;Q3^EEzMx_{p(49fE4HOv+*`Aq-brT}MsMce=Qp2BTBdFNG z6iUm!z(J7hh*!0`?$L$&9VYy;tf!Llrp8wRJ~7^|;8&uY&eG1Hj>xH;HL)YPRqc)i zo^Ij`yg&;A?D|ELF?onF^4(Wn-s1}>>%*u~P`cQOd)d^#CiLCKRKXNGd6=jmOpIyoG*(kRI-pX(<>C1P z`fQ?i>-032P6kQi?H!?uBeA3&1M@`Wxh(LA5Q|AAuK21pL953V3+@foC12&|=qcpk zzqcrypOc2SE(xrUdXB_vWP8fkj*bY-!yHjFH?#m;W|qw=tUGL0)d*JGI z&jnzRR7IcdJ0he}!hfhYTu`zX_5V@5ZQP%o>Yn7b_#h5j;RSjE+H=4oNW)Wu%W3=2??mXjdu z8Uh5{Y=>A0?q$~0{FS>7CH&w^4o`ypmf2IAAVLZI-0QLAirN7m){+P;$paN8wvySw z=lU!wZ($3KdfYbnCr7gXVs=6byl#yqfmA^nGc)RIKPM-+tyu9|R~6U9#^iH8*h`P! z(Q$^0aYhPOm!-7{;(z5#u^%m_|9GQ9TT%0O_ioL@*$3T*Xg|{AfIgx@>`1M#qf|n^ zAmRJ>ooa{8Q&84x4S`q1ioEyk(Vv8(N2EFl5n{`+u{)pmUai`+s}x;~`s^rQK$^ym z)UQ5z$e-%U%ehx_2#tUge?!MKgO_2gQXiM9y%5W!5d7%0uJWZlPv@TZqx>3Af(*m~< z30a;&g_!{K4R(HLWf*sLZsSL79h1LOf&uqi`o=eF#!45@UwpeABa@z@MITT1OYM@w zjjx0*U0n?IRmpu=qjLn@q4nt0l#l}Kjvm{jXdikw0hbs{(x5-}wuZu}gkeC;q?HdT z&2ZgvQ3U8T5jPEbbTb3d3a;JUDIug7R*{7W#Mtt_dHUUQED$ko@yi))k~&5zlIj5`7h~O8 z80g=IA+UmrY)BqncfiI1Oc9G(S^dm))Em?ANEHwA_P#8mnU8;gfycR& zjYDrp&@@T%ZkZml{dJ_58!k*TiITzJf36uGMEZ8FOFGzG4eFB6FRu}ySiXSnEiUq| zzlu~56(JiM>uxl$=-kbIuBD)x)HZ$D1T5va#r!f{oe)O)-My;*OsdMgA&eg7ah{*| zXTP$75nEKgy<_x_Se_Wf)(8^m-N&4AqAHWP-7}INyg8~Q%pdd47lVV>o!{&D$x3dG z)Uhah`mvUVtp`Z~u<-FJ0@uf~<|(kSAeQ!~H;bXu+(F?*%EY1XCE8$B1I?=^KDZo5 ztEw6K=VR}=kYI&%=G#icbyR`C5h2JuPiIXk#96>|(sTFMxfTVaii;iBy?W2`{u=$P zPZ+LaB%u4al(1wMhMw7}&RSHW)89a{*g*BJHP+yd(aroif_C*E(LdXXEHh^o zKX4h%*@f@J#eGxzpJ*I@7l-Vwlw{`|8kfX7)+#s6Z3@SXif^(~8IXLBce7>Gki9jHfzEHXvCR|zwn z_NcelRhNT9?$|;9X>dy`t9h%ky4PQo&D>1mnuWaEHIg@dueMGWnVCC@75Y&eSr_f8 zD}dy4qu2&_W`0sQoc*N}`~1JDv$17Ny9Wdt)ENO@nM_=K5_B)WsR0}~ImFiBrn{wp zx;nOT+Z?&8On~W^0uOfhL)U$e=D2cM&-R@S)%uGy zQtkMDH_=qHZ9wO3Ttk~2z8#iNyKfHvWCL^fbgp+*DQZ#v_tX0eg^v$qsJ}otBDY&N zM;o4034Z+PqWi*2FuXCy*VpGlDNnaDXsp%JNz{9@kH^VrTzWHkJ94sypEjP>M)urx zZyLSpO{dNhW-*l?ye@L*Ty5}jEw!&D(*U3j$_6;iv~9&MxOF z*Ag>%k4jH8tR&IF7d!qxJMKi(^FZ;-?6~--v3GQZGSAjtW`D(PcWJJ%F0y5JnlX07 zD0=Z``ac*5j(M6w?3*yuTG;*zJ1)t$xZ{hA>hc-WB@Vjl{&Doog@Fz;`if_`jmPYJ z{tCJxM}G>@@UCVCb9Oz^~5dr$|z3?>6pXhf|PyV$R+P@Wg-7bHzARLoQ(v z%m|w>#HPK09!rx`#xZPGr-*=wxrsP+^doQg1kqAa1FBO%^{)pPZ{fC~4M+-T{Oj)` zCS`D{rsZ{@c4V4Z5$gbQ<2{T?j={vx5IY}(;Acc8h23(ndtB{RNn^1vbizP)`d}&5 z#dloKP*};)%q3oIE!gv#nrEYxPS0&(mr2H+s%7@Zdaa;d^Vg#nv_7}Y8!&OL6A!*2 zt7_9Po@RN^O5UtcXuSMtsGf2+q*7+^rZFbw#sU00k*$%I?N z0jzPMWq;0}V>S_b(Xr$(%}~$(sIn1c?Z^W-?3I&a797bn+xTvcpBy2kAkT(Mzk3>o zelx7hcUX7+=gfSx-1M5o)dOr1mVAW5_*fSI$$*zx1P(8FD~T#SlgWE(E&NHFU+t5Y z+_pi8A`=tgV(EX}dGDy;m%42N^QJog=pSh{;vt{K^rKI3 zF`${zudlpF*PsGjvlC7*8{aj{jm;|+^hg4r>NvaL&7Ci9Qkv~y03>z-@g42HtFTE- zB-O1L&ZxFIsFF~&W7QGA00Qr#nVSI}9^=JRsZPg!@psy~t#GEJz>2_Ls!QXdHzaRD_VeQveP+bAcq@l2^ zfE4tkfgts9FL!K5{H`025OTK6jS=p)T9}SDdm*cfWtS`H)qh-s)NretUU-dBA4amD zV$Z#Sxr`y$MQU2IolkBx2B}bom3Zn?5d8QNVmGvTyN!hp{%!RvPHt3aI-Sf;^GzVQ^STUA9eB(m17C~B8S2U z{ERYsIU`%CnbOlV4ppW6O|SQO_OJa0>i;;p?s%&H|1T=pm5i)gA!U#3ag(fsBzs(i zWN)r@k;=X|gc5Fpthm|RwXczR3DBp&ec2)C#I`$eXc0+}S}>}1RwN4|Yh1b;!#?S}4l4*sRw!F~!h4TEvvw2J zyB7tJlD?!T)agG2}K)nMkSlo-1eAzHgHWA0Vwtb6ldvhmBPt#TJU?l$L+1J-2 zZ;MQl?ccQjXrMM;dedO?{F4V_SIc(aJ2qUU{+}dXAN+yi>=$q_=R#ugp}CFwktR*% zwS?IUT!E(eyc+V^&lLzpzO#2x>Y8xLR%jyc7ooG2kNCfURm8E>zgxq7rrjCp^y%wr zWb6!7zP$SDO0DSa=F~&e22xO|TBcmU{Ov*dKkM|vj3p~{NzvA-p>*>%2I?T+QLh!A z^c-eC%>XJV@1b1{c+t}?Cu;;YfXCZOn}W)o4|?Aql5st+vbGG$aU+(y_GTh!ZoNr- z0xA|;FH*`BCYIp&`y$#Dc;rH33qP@K-^dJ0mfH7j+gU7;(DBZ=B7Y@^TW4n^xI*-h zvWTnfG%S|$o$LN=sr~P5?gY3P89UEHP>iDx=(acnpaL#|=H;4}zBTyGSeY7XYVwkM$@Rq5_ddyp4;*#&0)}7?K z@EtX{EZgQ|paMs)qb<6QmKCV(S&JoefKF-&i0ugy7jdYYD&3NBe^2}_wrXAf!mhX1 zM-1PaW+S=!@)7ND3GuEly>3L8|4#9+(bqNm9YiAdl`&2Lg3CO4ML>1i)V<@HI9cUA z;^#b=IrCcxy7WP}998JFmHT-Ktr5BK3Bo`&AS9l!5xipX_jo3rj~Nb@ieHx$5N`R@ z%kyVDyt$sg!D9VI(>3H1ih|;b;V#Tm=;wWHkEAJ94Y$9UD_|orbITs?|7h-1zP1l$ ztou?aYb5KgV7o?F?XE&Hcj^`*{pH%S?(F?siTL#Aci21it;PxhDj{&BQFC-pO7}PC zF8+{?W5kL~N1Q5&#ALol(Nh9t+Ww>Y$?w+Oe2@IxVD(AIII`_BRrj5(4mX}|m~mOW zNp+EO@ks-Ja&ua`AOu#$c;0T3Yro3$mE&n2=rk&S;IA7PL zz7>;*bQt28xlr4MlhKHYbj#0L3^gW1E}Qn2BMXYcMi0CEb$;y+w%BH%pK#AMciSgOJ676;vvA(quc0sZ0uynl2UMn~mcSXdU059b> zUNW#qk5uYlJSNDmwr;QgK~S9Fe>8{-mQHy;!^Qa=Z*pw3>u-n1C8Z=Q8i@()?WS$mq}^VvkksWa{qa}G zKiHs0U>r!LYcd}gCF3`&QVDW)SK2;f3kEhI9I(05VC%^3+NH!2qnn)KDU+9n4!a`i zrEhAC;~{)%^xpg6MX$yMrX%mcqBJD60h)j;@F$tEp`43xy9B0D&_mo ztvgBgjyNa^k!=^yZk8>wur^$9Yb3j^$9`tpR=gUxa9WwNiR)e|6~fpxf`gGSPy>5J zQ5Q0MES|m{jbrZw)gZPrzuOYOYVK>Y6EPh;e!ESz4JHFSzqKfCU<)(e=w(_444$l> z{5^BE+A-d|B{y~}TQ{Zz-naDUFR^3i$)F5GjyjfM!L~3U*NM9+vlS{?USR9$ce^vu z?=a7e3&2w6ITG1+GzkNFoFLbR*k?kwu`881-daGOde6aW#tALjF47@#l6?u?J;b*T zs#XLVXQxq2P^NZ8I@93?{LjH+&;C_ESegqd9U5S%uBR-;OAnG@cGah6bN(^kW3scc z4I`l3Ym5eRy#p@8Ug5I2STEziYZ{c*?#us|{eSPuD`42uj% z;`7AUPOcM1%?9h=7gl+{X@%GKK6~aO&|GrFOJ!^(>1-gcfB|snDlt^Kbsq$uS^uY3 zusSUx5O%(!cbJy+8qKP4$!$&;5D1p?LCseU6*m9Pnl#mjVNNYsuXJCahl?%Lv9Ty) zOU>4EF|)pTA?a;?=vajPu8p}bcME*bBj{z)CngXC2%oPgD{*wdI!ZYv zl8!TPT_n*u1-7RqW;-6CGSuuyhVB~5#0cL7@YRjs-xIRBBDlq~3->fvRGjdIcUq8? znAZXOu%eS5z1jwBQ{gh+>)1(EM~@G9H@dL?jmBF0qs`ymK%o85vw$mW*S}&*zZkUTW(84Q5Q$!#zO=gT4b?_}0;mDC$7gb47_sZn0bXPqjO!A>>?Jjc!J7?F_ApH8f#46*|}GT<;lQihyhEjn>C6)*U3R{P`Pg z{xrPqL?jERAnPJ1pYz+oz$x=$7cVFCI|pDbtOe@72Rz=%WIa{AzICcE2~`7}BB1o3 z^Y?kYQwrZ<_0ROCG4%Wcj>g`qeU6n$Hccg&=B>O}j}{2fqv9||k=z+8g~G?F4L@z` zbzDrMCbznc=4QountTa+M*9(nDgJADHK6)0nr0Wtbu>v1jv)JosPKm5T@Pn(1tXnS z(jN|b&DOmk<5J&=8jGL`aq*`Hw;V_uzNtB}1+;a(&?nFYzn|uciKCbx_M4_G&*ckM zpQwU3iQbDY$!dm6TWs`i8eU*GgHL6wa5i|VhDb`yEqbNp(+#-$QRB%UBH}x>8+>K; z|M!{;&H7}MqC9`H?mmA}M^y!LvIaf(?MFEUzb1*@s~$eNO#5Dygxc=&$WAGSCg060 zn~;pkE92y*U$gUy7vGD}l|^)gzef=xTkY8l0KYGYE6`PhibZE_KAO&QZ%lk^mt}67 z)~hZ9`SOB5trDAN6W*S;$j|g9ifn!gf7~&|+EQ*BW1iIo}%F)nWTo&$$7g+yrW4#o64J94Wul z?iaK_*kfAfdH2tU(pgpWA}Q=Zchx-zjEimix5*a&Aj17=B3;0!HG?1o^=UBj3CR}u zUbcz9_=Q^@MSXm|MuSTkuZHIj4RF|azTF}Me6+UXdY-h+ z2j$aq^$=$0bi2LEA1am*^qqw)`1Tc8HcU2K7WwLuSLOSgWU=khxnSj285VYQZkFF2 zjUh%;KmGK|Gor9PCR+V~qL&n!UoJ$lKAbqO`RgX0HMawY{sW{VfKOf% zYPV|%Eo^k_i<0sHfKoCaeP}y_&keg1F~%R;;=X@Ky)sSU89eREn#T-0=kH%Uq7MBL zS0WjY3^SH|P`Etc=)Y2YKx634=R886StBviBV%EFuJ2g>}Xfeq> z?cNlTtLlV1O~aR zIhI82jC*9meJ+c*mdr)s^7IM@x3rU~@#5AIC}fCf27%{YLhR51vlu(@h-SOXLM!pQ z3A+I(7NhCXDx#K+B}M>xby`sJAs>C3xcdk@Ki zkoZgO7U;11+PlYmG&CC!Z?ZRWi-0+CB~&TGgeWTmQwP5Twx01UZD5>CMs!h6PW_B- ze1D(MGntpKfGX=bINZI9iYp`#?XCxDC{_R$<4ackFt1XRAEAaRiB~JncKoqm@fBJ^ zWjI6;BhWR}Ywib>3icMI*LUyBD)S0Iy&55BKkL4aJsH{mL&Xv1qXP!+c6G0RMFibg}nS*Bi>Td*{OU)s%r)jE4wjUP>? z3z>1=^5|I3jEVZxHAAVFB3=$kAmXmr(TjQ)uO#yM=`W;NLI3xSV4HU$U}-aMTL5@G zW+VLGczG)x<`5%9koib&Tv&1-ogCb$nC-Z(j%F48Y12AbAmn1?} zd3;O=^rnN3ZhtGc`o3kd@R)#E@5c{McP7~``cA@C9jgPmB(7=&N7(=k>mKH=pKKqS z=|jh2nvKO^O}D;>8+cpd02ZZTR`-ipCPY>yjz){ZH*BOswDhq}(gQeJmWcJ-O^dQoK4ZJmLI(5qKkyJb?fVbQJ1 zEQLVf*DJw2a7=Gt7<|`oOG= z#bZ8^*$PHc)|6Dz^^H@Rp%hXFb2(Z)#LU|$r})#JkB0tCA>xiavkwhFiB%NOo4TA- z5?6NT%4?JOKg&TU#j4-l-sezo3WYNO#C46xo4jbpnP8T@8iluP{4|&+otXo%r&>3; zyVdE>HVl81xwQEFei+fL&!NAp))i&oh*})|ZSZ-TRRQUBg)F9ANd_TD^Qz=$(1I(N zTJMz?xer+_YTf*69FLBQOB?qb^BDpzYX*jjm)b8Q8=As$$7Ayz%{v}0lMWRQkAR;h z!dk0nQ)c~R#K>VUe4hH9BKFO66D+Oj7skx!(lqJeFbB|3u8hQr6Rt=Xa3XK zW;DH5xaHY|OtbeP>fx`-iTj1bM6K9GmThwdBN3Z3=LBUAUPi}Pd|v8TE`((zq%9-l zQOobS{q=P=1pG<5XQ_Y?q(f8Jz&#D~?M_q9Plw;mczAOOFJ3AJcGndqHyR5Mf9YF1 zAkmcjBIDn_^_3SKJr}f`KpVCXTKM)q$%~O+`zqdL}b26kkTb1HlhVGqGZWA`VO>I{;@s%r=5$)ls@W@vNr6MCmenrS`E_V7#QI2#MA+r`__W$oE zm4@{IM9vY#e@W-PBOV=Zozq}gN{q3HmYg5*%}AJXy7V%d0r#CooMtxbZ01ny93i2k zo8|4i906e_)SjfKTc@u4s=^kLX^{y60{errBD$YtGj#&Q8~g4LDy#`At>K!BZ<2|e z+KZJ4BQcT^u*nZbwn;?3MkOFCT59(V+UEEHo+L3`qeMM7zu<93h2Waongj30RJyy; znnM>~qvJsr+)u4@60P0KKg%a8xKy>ooz%TsNZHnvA4pmA=D%-RB4G8iHonfzdF-Wi zOtb3rNN)P7-u@kzep{!L!Tb4&Gp4JJ96L6C~|qMwpjfuy}?MqHFs?OTwK72weA zmd_|m`DDZAhO$x}*k1a|r#}xk7!ABTvy{T?OkX-ZhDgxz_fKclt^l5{C_$g8z4J&F zf;WyG2q zvX2a)&p;Kfi&4rjX$`x-bRxaTsk=(LF`4L+!8D~M58;382y-`0&PIM!m7^mr&tLv=uTSqgRg;R20P5z3r9 z_zek57W|(i>|o}%Jj1vx*4(Zkw|5DYfaYxqCaexE4#n>-5^V@T|ISq$l()^Fm-`a> z&7PFS^}hgCV#)DIW>XF*>f|T86JuFw$@k}{=pL&?d=39F-Ep#{nBL%(5e}#Ws&@5H zQHC`{(84{bB{U_!T3J5q^M@nCVDjyQkMKu^O1GE=zDK49H|%v&yp4u|&7O@I=9N&!~jX1${4?4ad$7hV*L0s4-H+{)KBh ze+N}qdFHP8D6O#9Ds4u*533V@;EFxD!G!|EYJzRu7CCOYbB!Y&jam;E|GusrVR~yJEB~%0U@uTCCsr?_qd^2K(3GP#0?@o{ckO$3U)AJl0`(V-# z9lOn|%(C*4xuC%8X6tO7FQiIPW3q%t_d_*M@n%awbo@gE%rcm~gOq?inftcCEb7M< z3Sq=wi~63}o~oT|Ctua&reUSoNa+8PV#LND`yWklOY{U4M3y63I8spi*e>()SNQwx zUadWo+e+f|+D{1lVJ8bj%>^f@#$}?ix0hgYjy#J=l2|LfTI{FuBa?)!0(-N7@AOh_ zdR@+I2`r0^$dx=v)p3{HD6-H_f4adf{TMY2R&`-y?cL ztk|A0z%=&2!331ZzT!?S=>^1QNb)=0;Pa~*VLlt1Hqc)SvD2&4w#S3gEa6F5+krxE z)X%@Fet_cV;ICHU+Ak=b;J^AU(6u(l)hB=0Pwqedn*TcScC26scN)AyAbrC4en(eW z)x?b7kbK!(HE1sE7kWQ-=~u0*@L)Aw{mJudV5s+9>3aWRNgWOQ2=tSKW>fR9v)hJ` zs3$?!Q~QMmiOCwanMZ;Jd={d(_muo>3)!>SK2}eB2;Hic@)<4MM;*FjHIb6y>vPhO zLd7=KUbcMZSDxh6x^^)Llpk!`-ma=0fw}bbMc%QC{z(a2wVtH4*hje)mHVE3u-#E; zk9Pt8rDrwcM^iPERU=YUtCapfOBRJFyqaT&Ze ztGTSIG}Na_6ZRiXSd#g10RnbMlP{wI61TUV%aV|W36a*P3lpP}OD<+r*M>HC7yYbm zN}1`exbx_2dz-c*s)yqVo_iV3U-Sx%uK4K2bv@3d?jTL(!t!+szL-JX=ky%Lj151` zZ%^w)DCbkhAyuGvCewQRWzC<*LSF7BkG*VLxsvIZdZC;CS4g+mv>G7Vx+Fj;dhqHz zeJ^hNI82(gtD*9J+AWrn)yID_ByurH7Hipx?TvY%aX_~-B*y8B9wu~v2V$N*Lr$bU2+nkX?X!no@BE~)o^8xH6UucPLquayWi z=;PGMbgnMP8H><_{;J_^g{1{$V>$YM$e!dswE&z7>sTh29IiH#Yq!*k_A}C7*+GN+ zo>h6_61cBkIQ3=5A0w&WsvwMdCt1$TU_j&?RNhOl0r0MUd+$o1y(A@gF>GSd^H?pe zO;A-A#{tw!OvvDo#JiaoPtm`dXx6=>A+9OM0MCmb=5!zq)5BC|u>&v2(KN5YJugn_ zXlbg|HB8lUpktIxluz{pR1wdGpz?3NI_==0oO~o^SizCLC$IjNR{In_Qc3b-T;qEY zVZfnJU9HK{$FD*QqaoVZnwrdKxLqL0fIPZ73mg!>bVk z>CkaLW|n{~m{sloX;gMF-IY&ya2d-9z66ThK9Ij~{Xd$n+AKx#U2vsKf_S)hK6vPc z(Z-GCQ1PPA*_5D()jb4^i>yU-F3w?Fl8g`eVdru|a_L?vVi!E~lDZ*3AM@Ae_^3c0 zHVv-Bcdb|^@Ql6BgdszR$!p`ch+8CH>PXDVBqdcB=e?SwwWJP!u0>-zx^u0duITBy zixx-fq`Q%Ac9Bj)xIM$_+L7wXru%sAG|$2Jzx5=%ete2pNuFjBUHb*TJ&KlCtqkNA zg9wt{C#jFD%fKX+| zWAHc}CcHObhu`o8ytGQ29ATB7QUZCf_2v+ z2%8R|Ax48~3r&doTU%pXU~moouq4psUdOG^7cxMS*A8?G@}ZgJYyM`&oNRH(i@Q3e zU9f8{Rq4h$S)+bM(c78e{BZm)x2&4?;aTt$U*W3$gWcqW6=O4{&4M~Lvw5PBVq#`% zB*Da(ZJo>LcGW){i*lN5$+g}g?2Ut^WTp| zwl6`we}|hbY?U8c4S4#*4EMK)kel+!8|bSojIjAo@5Eyk;9QtoWv6AFv9Vh7XRI^{ zW=o%^ohp|d!16DTg7D~$B{_v_6S#TJ=U9wSVIQWSC378E$e$zSKPb~ybiU%r`0(kT zq@6hqltE=BV)hv^oeCgk^cxh5$UCxr;ZHy_HRP>`d$6P1cQf#V=BY4$c+DDL!inl< zMH{3Nt$sIbcWAU>9(TI%ey@A}ZB{{S6Oh{BvVS?()O5s)>qFwRO4X%XC$n#3C$rA5 z3ocz>Ba=Z)5BB&U{a~ul7%H63tvM|Zujtkl3ZJF_CDzDbfzs^OaoKJ1R3j_$RNM&Rx>YfKR%7j6e6ad*3OoFH_%UhQAd|5xcu2oNB7tRiEvf z)+)#k-LvbpTuSMhE&lNA%HJ4Pwkt+T${Uz`|IHH_Hrv z+h|wb{G#D_{an!q7)EUW6}=gqjlihZL?z$7QMiUG;2soB$r;pHW8e{bYxz&^phS6+ zAEN}40vWrltX3hz-91u`o8!+kUv;Rt(19|6YOFf8n`Fm|s(nT%{o-H4B^EbfXGhM* zoE@k^ywX)P2hXR> zyZjGJ5ZQjUM;B7Vp~AeW&}V?FkjZOi%@D>PDM%J;db)q~rEVV`qCe#I3g2k0C}m zB_ra2an4nCM#9=RO|tz{>x5Wkw#X%Y)H~}I*X*W=r1rW@b1c?1*=W4J*26pMaO1<% zBL`7X!)`MBsx4||1yD8~>+J@YL6`EmZl(0loiQ#R8Txftj=mf}`l8lvHQ^_aq{{Jf zOg5K0NZ#$>RJtmhr4=5rQIJ2vZpXH@MrD{M>`^&}wj&m%mG4}e*^<`(Z71-qdg~@T zSg%HE*kS=h<~QAsc~MC;1C(5W!}Gypq4SkFl<##U`s9YCL>pbrS+Br?Mg9huVC9Wd zeK@l7fJL>Vh3CUu_l?^3*XI^4>3tGSx;gal66{7~o9%xzZYW+V7R*k)L3SjjdAh$* zllSrXBA)*5YN?v3S4XA8B3rmGBa`y1j#&Y%ru5oOl zX__vTKzScEv`nCbust9bkR%N~I-jpLb$Db@I=0Htp28eCiRf;*m1wX}--h7m8J&mf z;QMsEe$CcF`psA+8bGpKtP&bYHwIlOvoemmG1dT9){gJ=;O13T*oh!E@dK}+yl z@RE&MydyKRLr^CKgXI9WpEj-PD>jR(i2PKwsbi%CgwrxLy-n=V_0)~9aKsa2b3($N zcMpY*$h!pitq6%7=VSlTJV3bcfX6S>uZx9Y%%_ja70HKc6c(s=o8ha|HV|`_-G%Sw zGC1uz(Bi9~@^hP1>Bg}g!$#3!#b;uNO^S?;g|ADvw1thoesRZEBO1DV%`dl@6RK?j zl|zCyYm_Fq0n|;+VhBV(>!D_a2eGZWP0!`^$zTT{)ao!YHoTrb>ujR+@H0$_h#Lvz z7GK_>4x`50)g2}xN03<~kjAV7ipde3-tXX=k?17HY%{5OkH1lz_8RE-vaTs{j!Ez@ zd1p?6F5EZIk4nlDIUnDazCqA@323L)MOEW=PV{*_AHCr8$HINP>GMSf>oYujqlp0< z(;T2{KYHD(zW}!mRuAqUO@Axd#ef&5hB{+IZtGs8X<9hzA z-urizqHh~;*zPj2`q8_cVLJ%iEq9@B=jI-@IOiwLJvw@&Rk(ri2(<{BxcsVp`C_WP z@JFAkzVlK38;~sged-}Zs)u56$&AF$HW!INR#>z{fH{03Ai}MEl!rto`EDOS|M=pRzVi!yqHq1+!wvK4T6)1im@F^$9<#+N2ntVl2y|3wr1xqDNO^dO zd&~1SQly?Pwex<-wXu1=%%{zMy=cgJ3DxU=qg_*0TKQs1b}?InF&}M&(z&^1JT|k9 zm+PI`eN0AP+0cI@<26+yO}Fzr+@pmDiXR}t0;b-5gawLy%nrSVZHB^s?*GDfV1NMsQ}$W5!nyb94pfWL-h+x1n|-+!V<{hS>4}ROS{F~U=jPwYWm)g;9pVuhhWCx z8X(5SCGlBJuss)7MeSeb`ue&rU!xe5JzTJ~Ed_~&&TnvpD>%(6j_zR{Wjx9VS`d+X z+e@NAYYqLEae+AiQ(NuMEPt=G%m!t$y|YoU9R59w#81A|qEk1rEm_5oo`CWFW!DD> z)iPU!9bw%5BHKV!^X(T?4_obT{YUfeR4*nI8>r0$E!p7v=J$}B4v`=6^*}!Fe_o7x zPv!3XY3-wo@>DFpR_MF>{@zY2y+rP33?D2YSKupbbLD8*?Kc(Ma7aZ9c2YURUlR~r zU-dl$#=k!OSM?uF>YhQPUFKCqEKSPZT;o~o%cSs+k)j7|Nl2#Bre~&0Z13*c$#rEt z;(UAj(CiC4)$*@ui6cVGF1CXuxGR$VK?!i*{-Ab_H?D)h1`4B0(Sr9Jp35rUaL{~C zuVs2aOtII58dWswZ)zO`2;^yIkUowg!p-Mde=~!8&NRkPYGWcDz__iYOAYqcQ0=3y zfb1Y6E3el*diUKP=yV`dc#X^++zI1JGTc{P3Vx@i2rp8f6qljyYuek{ZqXS|jYA|N z1xE|g9AB3efpd{LhyhHuW|y;DLw;F&L4TofPm)h_zd)45diDHv3`xnA@TrONy-898 zGyCF@OXG{a@c|0iLPPE4LF`!V8$bwv5U9!GCllM18TlqI#ncA|h5f0&EPwER{(+~% z!jEMK|Ktt~7Fuu;Znb5tgYm!z(E)k43-1Zj&pr&WRqBx zP{R;-B*6%YfY3Ctgzd9+djEoK@PvA2xf>wASbS6Ee~~*Q>3-PJQM82Mcf);1UQnkq z`8TguMe-y~cC0c%<*MZTR8MY-@GF&ND=0FUBh(q=G45yC)db51`R1HZFIl&f12Ld9 ze6*zIlBQ>|)n-shSV52Qd+HXOTP6(3fpz3~$*Pfl%|YdP#(J2Ui`V@hPKX5H+(27| zk7T(v*5P|DJCSG*%pSuV>}C9oV;fyH4a~!yi)(ymK@;@<(Fj-*`oE@By79>=_O~iw zBHLSnfz2cmy!AsN%YG2~U1iYhj-HKQMb6(QNA7ji^OIt4(V2=N9&&Nrc?=e)yXc>K zm2_4cW-=9X+2f@y=~n1z(bJF3wYhS&E4V`6VYVLMF2DLWj@u(Epc~$MN4`IaSR=$h zT1QsSuaXsb>4_^HAk;jXp=3n555)l217jtIEz!pw>%oSKEwy|QbsV=pIk}7*UknoD zpt@NXcNFT3{Jm@$(G3a+BU$JY67k+U!X(wMyXgd`u1Z&)@LgvWk5*f2dM|y;`Q5da zQ56e}ucS#_*Asa{#S>Q>vtiQiwV^i)w+O`a-J>_u<;aEKk<}LO%QUX_6EfQs?cdZz z${xHtczc8I4vF=5s4t|=8D3jJOv6JG)eINU)ON&PG@I3CsD(VQy815IXmWNKenrjK zF1BkPfvg5&rp-oMgrPYvD;jkYR_Bf0JxaU3P*UmTQxIilNvo1%@rlT_i0K0FFnRJW z>ZJKE**&AJIXBCelIZNcp6MJf$gHp3AFwVq*du#BDT-iE2t5-Ry861xpINSL(QbMd z_L~aKs^t^$Xb-leYeWrp;mi+5UGNBR6B_C!Xfd9Re3W^~V%Q0vKwYEqgliDiI;7}b zbAjNds?gWz`O_V)&YstO`NX#1l*6qdYcjAFPKu-x>3R0j_bvVQrQ%M<)K#JBx{#+Ardz4EqbIUS7Rkuha@`gYcWQKh zwx6l_C^@Z^>U&cmf@|vl<0o4UhwSJI*ANEr5W19*GNkM%)le7Kv(7EV2dC6;`vS4r*+2 zYD0hhy|DVX^^(YL*^LMsMHTq!%+Ld1(gW>C>}#DoY{>bL_S-cBCOhgmx#*a!IEA7` zoU|q*_)8A_PrQj1Y%yxai;#D3zB>|L$1>W&+cyKR&y=5DSEZVr^O7z++K+5=Il4Fs zg=1SY_h)yu8#8IB@}J!1et)Z}K?)Z8nEXI~r$D`#zZ%hakCuEvvj#k+z;B6)(e^gXd#23`n=X9EAF>CoZRyv3l@}=P_%M&wA&;F;;^MC>8P(YsH zJdaa6NuU6fhAY$h1H=`w_R^RMbrgrsUbpWf&lyo96>!}Y>Jd}}WU0lf2tWC-1& zG8XJBfD$6P1-zNUZxCiX6l2xYg}(BfeRyVTRIH^|ro^9OG`?%|fl`isBVkHqyiGDA z#&&=z0XK{x&@}Td)H}|rI*gya}(KA8`bv@W|Ctg8ePuyaPXsQ@8L z08}F|VS|NnyXIcgdz%O$>h0l8Jz{ouqUk(aQC`1Ga7Xw(a5~)Dr{G5Y97bvZ!3N}H zpFfsqifL_Ot=8nTx4saeW-#(H?&T|6-&|=Gi!!M$bS#oF91M=7g3dH}u#m*BX_8z0 zf0|dnw0O5Vust~!1K6Oq{4gBkYK~WnGT8%LRX0y@Zi#<$P=RXfLl~m65Ge^w z5~6NMj=kzV(7Ys*LP6llL*M^sp8miHbY>l7Sg!03_V+^$034(0Hpgx!S#=!kG4vi6 zI5Mmzs66hqqNe$)+v{!$q9JA=)HoW(1k44R;5RiEL`TA6lT3l}sl4$u^hcWQe$LUg z=@ryw|6=fVCP_Y=rP=`UUVs5exQ@C6mB{>yr&KUd+~-Rl#7nIis4D%1&(MH}Xd7Ht zCaqzI2q4FeF15xr4%x^S7y=rMZJj6H?oKY*3bKDdDQ`0N$8V8d&kJMK)0eH>TR?`YkEA^3qA!rl&AtvU4St^dRQo4~n|ojXGMo|qfU*fc*r9lM zxaUgfOQ6fi3LpOUu;icX-vXUqIpJ6x{1*Prfi=CT_HI#+?0+@_vi4i{9$YM zmFnfDJEPuE))C#lVVm;FQdv{J514^3TQ<J~|oFjTX-C z6+Y^fF?iAcsb>xyEMVEq2>-VK;`vhdiR<2DKV6T*-;XOpJVldsE=i-iec1SX{KRJ7 z-^hqf7G2ZHbTN55YNvAtUcr#-o20`Y#LDgX5q+;)C!{P0Yu<=X5K9a&tIe*9cM__5 zk6tNTk^v1MGi#rkGY7BE8`|9M^nTONmr(H_ZaM8>k8|*^ zITx!{u4L78@^IsthEtS`8nb`)LXu~h0^};LH^_5fOx8M%(5M)Nx`IE=nFm$e3m8 z&d|aeCf4qX87Hlqa?+Edmv6C&Uk}lyr+kz)zPS-?@68r3{Pv=Iuf~|?NVi(owRZeU zD^7OScQOjG;diB^0z{OD$N6lUK+PGx$|k z-*nck_n7hFps^3V5u5#&-~C@6tOu-@y)=(E{hMTbe=^o>d6y+-h;U)Yy8El!sE%ot z(f)Su-ra)Y=wji<*`GPJa-KBxnut$$C4ryQ^8Ov6hX=uM) z1*{I#^q9PGozc;DZm;FAkZr*idX8;;3%+CFbJT2$)Oc_C#EmkO4=!n^BRg}OHmkkc z3eiL58>Wo@>3FHYJNZgl87AX7rOC$w={UP@sV1~dDYq{<^V24M)L{*EEZ`8%_~|Eq zbI)`CL1Mf!%dM2h75D5mD(T#!{6C^Umpu;=d5^AQ>DLtHkLy@1{&lrwe;+QdYB#UaG3McY~M z_Cp~BDC3nK1IH4L-<@o`pBJxEH*)1$Rli2Xs$cfE56H^i=M7u`XoIPE#(ACjD>5nS z5dqxf_XsYUJu#x~?#)u=&!92v<$Q4SW_nvUrC6>iO4&9B1B5gPyrud_UwHoJR`)*lZKI*aA@9(`pmEQ= zx7Ks-Uos`_bH zoUV&MjZ@T_TraPTN00PH=te8evZTuRSOAG-pm{#?hRuu8s;_2?lhS^zi*nI13BA~D zw_*Y80$aSjGSMcIE53<+NsMycV=vW4{~~WKa<<6mS}aMNLGT-DWIh&XS^tlQ!~V^6 zsKH4Fp(_*qz|8sWrm^UQ&t7zUw@sOl4;9uph@`tHKHp@&PVr1^(mjhwrij_HnIk?p z&48^+MX$H;ufjM7okz*H=QBWZxonc37aT$9K1+T$4s<*l_CWPdeR{ZR^ZhBnJKzDE zmfCJ6@lgNy=oi8I=ES@i+!we!>7JWb2FXR=_?)6kGLb7hLPcvR!T^eszlFA`f~-Rz zmv8LXT>j}wO?j>R(BRvd+@xL!M0}&6bbS1{KqlWCyFWR9`yyGOX-8epx-V9(Zq`XR!>Z`qA744BNw#UuUyX{-&z0jYlo{#Q> ztOkqgFtL+E!&CS8TY#gE;Ngko+cJw?lDYbEe)AEFJM^vI^xM4GXm?2%3k=vpYtxJa z2_k@z`n~7=6@;uO=c>#NISpA~wkvo_9qYrDv}%}BcnIYSRe?Hi-Zn}VeKX|gHTaz6 z5!>99@kYf%X$I=nC2zOgw$)E1Ko~(#!2ufEaHQlLVrVUf!=4r$eF{1|IYZvuL^D*W z7RXLLJ)urA|ETb!UbV_YZv-dxsNV4e=Y(B&O?UByQ(D4y`jsFh&O5%Nt3jDRH?oAk zm1FN*(@|GJmbwLKe46te0RI^8Rjz{>pyH{JQ5DJvB^K?O%(S?TU%+5S z)`$iswpi~~DF7!$l;hw^T=zS?*I`O59y zu)^_K&?ySD2P9!Lg@*tqOv`^Tb@C1D-3c|ZB?We3T1QRC>F}V+oVAocq9q2kf|!FO z0vg{vwd=3`i3{_5h==_!FqnidJHPzMz~{o3<| zb$!nBY}qPbRd#;8Iq^(#G2btFBQi z>>>AqOsXIF(HJ-8+Ja@WKP!0OKKLb%v*p}5Lnya3dclSsg`%Xsc@fgGjtj8waU{pS zI?ihSvJ4F=mmc>|s1{6t2bfSkf=XV79AaM{i+z6I*mW2y`)HI?PIP|h(igk8PuK5m zKI!nX-oky|Lt!6t1LQyc*vce{Ypq;<3rZomr%5ew*iZi2f<9yvdLM6Ag$oCVtx&L8 zO;)X*zEb;l3e+Qe!isW`(`l_$(~ulV2>l)usDHa$DJ=Yu{f#Z)*t#6vd6g>L9>XPy zF<)CbokA?7)HM12A)2Xfg%sLtyT(m!di;zqj`U&42|BQPjbZ*^y=TH>p%LFK;XN^Q zbt2kEhjyjLa~;L{`S$n>-czS`;=ehmhs`Mzsvxh0@6$6#tBJ7Hgr#Ob z2oENIt@oF->P-3X&v`W?85;59!`{6cvAzI<9vYCnL5I-s_Lo_c9d_1)H?4`4G1;6f6b3!F~6yC2(cBKXwl4Itk9#GkCmG)*CyLs0^xt z@(ufCF@34{hhE{QpI(BO*er@gb&u)QsAakyohbcf2b!f39|1du!QyXq0`A$#8#uaA3E@;t9_#r8=;)Li9Hi}r^l{z?{FS`NoMA1@oo912ov_TLXxGyZnT z3a`QE1iipjt|DU1X&a9XqPTSJh1hL8tpCJnPfL)gkjvDZQfC`f23PS7d42jW{rO{p zX^Pf$FX#m{X=ld>SVF|y?gIAFO;H8ZekGb`!;fa|*2=83f-PgOXiLN?+jv-L-t{`J zcJIB>Mw9;ifeEDtzxU*=IkaA!1g*$3X2})>mIP*8gnZYC$ zFq~caxYX4TZGJghVdCBoHhS=@qI~>9>ud3Cn%bh>Jxs zcib@*fPDc_Q?om;#pS0GN>{O0f&@yQYhL4!0WfV43(fwFD+8V%ac9TF0yl1xoGGAl zs_iPaANzgb3&-!$cdcI&#jM&cR>?6kN3H8=zZRGb6ppE^ou|`$f|_++Uo;%_ufjEh z%iI{}J$@Dl+&@@fwY81359!|#Q#JNV3$i6ZB|4n3d+ z3LroTaE?oh z71uA9d$J1s*r??VGo$0Q?TF5y(vT`<=F8f4Z31>bQXCL)McKw?hlWz3HfCoL%Q9vy z8Lm1SA>Ki%t>8L43{SBir@HJ%*y_lN*?@%Hy(q}V7!mp8m4WxM3HIwu2j?#0s2I(9 zx70z5)22~~W@#aBSM6pD6>tsCVX$6Nkds1p7_YJD-y*U-Vh3c?^eQ(g5@ z@Yh3!Al)_oKD(DSM|(gZ&2vDY{WvgrysZG6c=HvoUj>kBt==Z@k@;GcU&y1G*sa95 zAcg!xMjUDTu8vFqnp|MK3T)x4G)QTH0@zR;LfitX|XrX&wpFJmU!w z(0o!$z3viRwgdNcF`mh$3DDOGyZCCB3N-T$pv146{|TWcPO7YSPu9B8S&A!??iVKM zGEgdav*6j!hq0^f$=xKQ!GV<92R+hYyU&+z@v*BjpNh-RD zZW5#)GS};GbW9*$80424U)v-tkP@hzNsliAa?j_Bdd2h){h!WRJu~qKu{J1iB^3iy z^%|0R4WDADZjx<%-Rykw531y*8O-WJCX|iz2TY|DO;a8wcdM`{hHi-ZR;~6k`GeMv z=o+1E9;X%80>ijjk~CWw=$QoJm`!r4`I;=@Wmw_-^Gj=x+Gg0v*KNja1jw%5@uuSG zENzY@S7C^?+kro~i^QE-VlqjCepUL>>ykn6f8*y;f%YO?WmXBRzp0)BR5|S-zPzBe z;fsC#`>=*w+xH^_$Zky;cVJ#psqgidcad{>frf`Jj&(boymSN{>3qrXdaOZ-Rp%~1 zD-f5pp%cj=MNl;r_#f40l_m1WJq|O0wviEZ8nbs=oBD-R;f{4Fjz-;sd4>YA!{kTDw;$s(I3=9C&&g%_KA3V{1#R8dM0F<=+C}Z) ztc#>(RhTZcnng9g3qy0mJHl_8A?RWxb3V>LAMbLLd-e=3whjgLBkd>69=9?~i#$_n z`t09;(NX1o`ccG1#~_g64Y?RZ zt(vb?TBz9GH!-?9;|t+;+}TCV>S;%ckHh%ypD1tlY8I5O^H|I@YIXKbowJm;M&$4O z(f&<1M&WC9`=QH_ZU}R^>uNcL{>#SrN1s98&?W5Am9F;2>XNn{e-}1f%trKGEsn62 z@8T}?lZuL8P9u|H^{sV2&oqM9{GFh`Hl_rbC)Y0o-8mId*S8u7X;{JiJR`Vus}@&n`n%mg=m1BzjIoxZc2mb>4tQ`Ey9f3kNNU2Bvb8SIO*^S=uYlj#N%^egauO;Cp^0A&pq-m+zis8F;cHPGEKK^Qy`A@UF{S>}6;^iov)E?8*ycJMwzMT7=i>1`C;=ryu8PJYJ|=KRn^DIe z)h9d48!T>_m6Z`aagY6-V##G<%R;S^GcwW*Zvioq#ul?zN)~51VBC4S4~NHZqeF|^ z%^AjP-*83zG1TRML5j+B z(c|U5sG#8#l8Y;1@0;4B%%73b@X`#U$V2IobKx=u3^Z7UVA#-zhd|Bn0`dvSg@dDI z>So|~@Fv1Be-Onm5o={^y$>$ixHf|f;b9H&?O7AnSCYLZ zX`UH(ny`y90q$pr%>n{7$J9Z`;~=A(bmYhHicZqn>jubH*pwGAh(~bF*#r=hLRfSv`SBOdeRYtd1y{6o zhZ~i9FG_=#oP;HgXv-RD{(yWRisM0I($;9^;?M_KM;GWi=scJq z1M?;VV`b98qTfwWHeNA~nMUEd_xz)D z>R{Eh(*x9=g^+QO*)b#muVi0{mrQ`vT7C;|AShg#>6XdUXdj--LJtdz$UV*2wAVkkGGG?>`em5C{@HlB~rI_0B6MmCs-rtGi%b-wbl+LS~^gXN@XU zK<`f)@Qtq3i5x+bSXJ_Pz4or3K?gtn`N_AXZ??XU?bm()$5rDQU1{lFgDg|MGk5p4 z2>X*3&MgSgpUF0$D93vui;yaGPNe! z-I6Kowl*!d97YS9?WKm0mk;N@XSaQ>6&mDDabPRp((7(2iA9%Sfy_rfc5B-Y)Qi9y zFT{!@nIQm^YfOFG9+FK3PY;rT$(`-rB}SCS_D$<*1U z^y|vSrx^tc;U`P#@^{N;T>MbY>w6Z@@n$!T(o$#*$?fiy+RCKVp*P!(Vt10$WC zy`ppPSOyb4T-(++{c7!tdz2C>UY3@Vv35gy#+~5p`WXOs>XO$W@r~u40S3VhsjjDk zkHP!L@Y3#B{5ozM0Qe1XrB+vh(Wk3_@2PCmN5;X#`{e)~1~)kNxi}*tDad-w^?}3u zWXna&^Qu>B37R%!yZW-$hno@LRlRPE#aA2aSG^Xhjj1x}KYyu^F%|N+&MJ$~`gl`O z8~o&3>D(BN&@HOf`J~Xm261U_iSqhaKR;4Q4 zYMy&yFyZWi_!zmg%=FQ1OM)?xdUj;u;0&YZjChrmB_ZHFyL9oV=5u3qc#%|C7nRUy zxLY9e=7IEEugS#A114mxo=tC*3_d5%^d5zt`Hjjj-@kRWJhUo8SH(NnVS12Xf7NiA z>{C$j`;#B6&CeEzQH`Vee7n=`U0AupS2@)dd}8EOCQ?QXVK9Y$&xzRHDcAaeI*-)o z42+oN1V!?n-@W$?Pl~i`Ni(~ryIqtau&Q%hx1gqzl?0wc8Z}($YAcyI6agpz+J(Igg7Ha6? z96d=z$f`3X3Q*tgb6FbxF0eZke`JUFBi`q&m^{2&TckGlbb>2t#b&G|i6*OHpD2%gFL=jch|(UW`?cghJStv!li8{SsT;5lGKk_8a}OdMagm<(cTd{MCVe#qRoUT^O^_mf`}CA?M{5l>ZvVotW0M;ujZG zpq^se&^jPO*c5tccL3LDdPLGimpF4`WXhHF(qp*+R}?DtwJfeXLz-AVK3s03-MDCs z>35^<7(!>6>-tvL$$=r$Q2sYkKSn+Ggk}^uH=BL|=lZ0T?lap|HFW6v@+Y(g zTE3R*rw*{8&erc3(onyt$6mwU1Z%77Plxk3Tcr`s3adZWB%dHaHrC{fYb9n5o(>hut;%i2kmOFL$#_2~J-9CRc<%C~IaNalV_Fg6dbkSZk6bjV*`AnS<1uz5 z6aIsZ4CyYagb(eaayC%$9^(JIv-{o@J&xVF5=~SyDX23!FuZUfVdcoi^qY#3H#pSi z=DFJjKg{*K&1hw)eVp{|GVR5S99eT}NlKY-X=ceweI=&$M}1{dwqK-D1i!&wu+0vP zq{m9UQ_|#JYAB#v&e?cd{NYom&o|eTMmv@-QYJU6{p8YCZCkrLRryK1fA8nr{1LhN zC+DL2*=5O}5o6-$;r!&q+|s3o^lPeNqMZSkACa7sZVFmF4lY;|wgz~}bAkNUuc+%7 zt~9ZsE&g3H5{6kV?XcfySVnB@_PZCj@abLuaFwUn)3F%gaw^RHYf7QceqqlDQ`?3g zr}I6xnsZiF=7#z^tKVa}e#k8~al$IK+}${Hhh<(z9qo7XOvXQA0*lz#uv)XPeD*jK z-8L}z2ut$CqGTMA{b z1nQk)fI;R+#Uh)`2KP`y*q@XZNyVoKt*h zaK8K`XA$HBci}Z9`{{eU^!YoJ#czrzKik$+i4UM#4fhz2Pf`N(_E^fF)f*veN9I1q z5&xhx+Vr_@12oZ)XS)!|lN@0aKMYwk?dj8&WSf(!2lqb+N+p7H+#4h55Jk9Dj2I1x zgo}^A(Bc8n`=As0M|Nx!E&P)A`{=&!C$0-K zUUAH7jWg^R*n8|Ms`!C88bhefj)(ffEzMs$m)}uge*Dr=+Rfj{{g2!|MMiv8mS%vP zQ0{r7$k3C7uNBJAHoxL)l&$WbV748-KqbSDvTw{i$L!k23Uk-rjg1wzJMrynZ?*-B zCiD%z5Xo7AIZV`jnisL8y5r`wZbVOd$*J*eiE|Tiw4qOa~$gc&yW{C1npi~TJ+<&&Eod^^lWu`VfyAOZSRy=FOXJzaN#X; z6%5uR*x7zstqHk#H7L7c`yVJ{BSfbLMIP(;0#So>(3*v>iR~ZW$Dx!~)@W`muKt+f zV9BI|wmiMFQ0?9Y=uy!nTkY90#@=}&DogB&oHRP0n|b+!qrbcoKdXGYt^IZNLrnI6 zpiV~??6WB@oHJT04qR8Xi*Y9D@ukOB`1Ng7EZn0BuHS^P2WhtWM(VzO6XVUJ|A^dz z-(#hiZVDef`4lH`&5n~o>jN5*!1bHguP}D{`!#>}&#~l6zfc-^5Z+^fQ@I)oaY(PYvh`o*| zNZJz{vd!8bV%e_{+;t4Vjr2uFTL%J;O5ZGSP@OwZayIW3l4CWw@2R>%y3d}Og5#PAM-*7FM`PFW)w9| zSiLPDrUnwo3k3c+igz?B_$n-K4h)+n$tZ#j$ZiEmTwCuw?i^6cgoQ~-YDY}a{666D;73j?IUq_{3uhA$zH9b0ZD?=3GA@y!?h(0CaGZ{@1E z_VuPM(GJyw=0hXF46@*mnU!DDaqE@5dM%@P&mRRU)!Uz1;+#tN2YO4{^O1>ya~bQ1 zJ|s@82MYxCbRy;{`}f}ARMv*VWYUYNYJjrzguJP!)8*&d%16>8v&%FsOHt!rABK^(8#OMWt#o>P4gcrHaZWAci z*I{#aI%hNlBighrUv22O{%SZ~z#r2d{1CQlNzM&NszV)UaN;Pe#1XPbqAG-HR~T1o z)Y=HRiq?mVum;Y4@K1TsO|(*aMt2GLOOPhvh>qc?|3IvG4PaSlZ}KZPsweT<4;KDS zpFU2&$7q_rOE~4S0o6n?@ro>0QNI7D@2!_Vo%_=if1Y1@22ntwYck2Q045g4jeu=T z0t3&OV8DaG4rddqXWJiOuo~S7zqhoDq-+!PuF!Isp|Scx_{0*+5tj7g#S3!oYQz*0 zCxGZ%66pqz?gBiwkw_`-;$8j3j|6|$+U`C6!?0oEDhM;a`Y2v-6$r&OXZB0~)8|ar zHvV1Do%8N2h)3F$7QLS6h{4MizlzLJs-4Akh<>#-&!+!(?#NOp!wSoJ}{rmav6Lu$;y8c?_&46QDEe!q6lUl`MUYYL(RIjVWIZV{QE|b7oP8| z9Q*jFF{*>cPox*wIMWA&7AB*AU~^e(Lu8jKev6W+pVJ;t6xVP83l6wmmIDogSc0(M zsRGUp?T5!0n6)I1FNP&GZx%X1sqE8TEiJ5}T`C<uY}VRCR6|DQUN#%N8T582%bgZ>Q0i@f|FY}5`zSaA0P`Pui&yju(cVpx zk-enDz(LRtTBLX*+#VWAjJKINcMcgcoZiPgAFE;pMutJZg$9O&l02jgnzC>B{(S;M&#Pn&;Wdo4A5yD|2~l2$ep(5KPyiBZt$CV0 zfCTTj{m%^teLe2-BkGQ!if3Qj+l=HvU#=97Kkm8WhQi0Lnia>1Yr6g?E485D;kLR;%_A``7iQst@K- zEuXb)+6g&E>X;JTwzVy5ukF1K`O<9v><2A=)O&b7_ksIVLcWcIKRm7|RKv&qB2%muM z4^@knS?pDcQZ`c};MZ$D;LM$JpZcVbCg}ga{dI~`bl3czYa{SuD<)71b;&5Rw->)L(D_nh{Af*T)ns2EjK2WhW6IImHbLzK9 zZljhwh1qtURXNJnib}q!Ox@UzXXv~Pdj#G#o~6Yf-)q|VuugKsYB2n9&PJ%oF1mEe zeq*G3P{bZBq>a$Bz4Vcxw{+!)T6V!OCf~DM`gDOHF!2$vue5$;LEAl(;>E`Rdv@4tA(RuvFN(G!-9 zhM7yAogub^Lg@V*Ci3)*wMPl*L+)RXUs{@{wi%E9H*w`N&s0^Fv*BXNDO3t#;Jz~& zf5qJVD*L!J_u50G3d^r`E1;xnSmMf{2YPoOX%C%uRo7w<(w*5l(uzJOYFSVj8%cAQ zR{Cts8BxbhBf%{L;%L!OLWBD)KD#%@6Nqpqy=kt7KZmO~R)B%$0oV251I#Vf(tmtc zIvU_V`n8*`cqF3p`fl5x>r=w$=RrQysMlV0d?NW?vXL4K3&Y$a{t!TI<#RrA##jN4 zwz&Ti87B)G$9u2-JaO_SI_<074qv6_in+=eShNmxESeNJmvH@9Z}>-0l!D@gGMlha z*m*^6R6CW13aIJyscw7qIPdx<_fDwaPHa#5V%}@sWPnUQ1@17d-kfT}X8bJjpvY8E z4XZT?$))~-&e3}|&Kq{TAxHRD>Pgc;CtIoH$0>^eAHb^p-?BZ((1Daonc^F-A6kRF zB$yz^gXz--K_yHw?YCZ=PRpuKxo`k>#thEE;x{ufXQh^mtSmX=hfK1^QqYxGSiw&C zT=_Zzl~w9WVDK|PHBHy8KWO;k%%MFdJxBS2WRw-IilreAqQzOS0!0$C4v7)_dDALC z@thq>{mk>K1Wv^vl~pFtoC{;RqDhQ@P)AVj#^B@U8#gLX+qr=qwGSF^K_NJygELsGRFn6Tm~(Yo zRsjO^p8j!?iJjv0Pw~Z$W@J3cK=;hsW-4fZ4Z1|&j8~FsUkkMNHe?7%i^%tJ#l9CB zWTDPW3*}YHBW`k~BMY{86GJWJfq@k|TNH>|G`My{=OxD%I#(Ky(d!YqmsX9(i7|{( zR}VTZBwrLN!5Dcjm4j6Y{)hf$RO3&8ru$iuJDc{k|nP9FQDj>yc-L2H3%N z^oqU-9t<1gruE?fvwQ9Oqo{J2eSKY4d+1b{1|lmp*$NH|-uD5D-L z`hhVd#@LJ$oUcW+dMZI0aZ;jnG_->oFVI$`4IU_0IaTpl*a+IWR#&aT)yi23|KuS8 zE1DV%&rq1pjy(JH?n8f@WntI)DT$0HtoT72+}CGjD8o1`e{kblPD9?ODY za>S+~>?IjFsh#+uA0t~k-=-%$p;l*UW&@^4ThHrjMn>_JFp^@guDFZlnb+JJxc==S z&WIVM=`OIS$#VC<^HE7LNBdVg+*J_V9%B&2E0r35 zhI(a&sN9(NUb*3X(3PJ$1bHgQl|+sfLDjpxbZ-B$5b(oU=1V(gr1#o;!eOxldd3nh zNQp~D5xA!0Mm~p8C;YRQ^2+*t!mC{rO%gHc)W7`nY*g;(OH3BX@27XUgqXokOl(U^$Kaf1F?d{`05NDWua#7FX16mc0pBe zf1ahMS)32LYr(1T_J~1G7;xhaKmTMWf2_1Wc1*CUG4V4%^=PzzMUzGt#Jo=lq~y%zBE#CG6l%Yyi(Hm{%OcP{NPjKPXrIWeP@qkW8#9IJk6JQ@l&S>V+g&EKp@8Myysob+$9km4T>E zI4|38I&r*qc4@ZK`tZ=;ln3~2hOq}gRDkT`kVVO~i8Fd`N zKG%F0$nyJFYpEdMd33lhv#tzvg3kB!uN>)HBsgFRwAFzL%_sPO0QJDS zU(|GdhG^;##M>WjWGbNgpfKh?>@-ITiAIlGG8|eW;Mv~kz}z+0{v?qM;N5`PUOl{% zW;X6M5Q+HrC|WhEKNA~iPnNt2(0(gYs-uq-(%0?e|A;j*Ngy)o4(AHGbGeS`U>G5w za7jFV;8$R-u2m59a^hoOLhSi#kDBDBMB(qKitK+ySc@L%Xz~j*$5RZTRXT{(kD}t^V4g`NpJWf$5oj?41RVD9UdKWQNyzD-VD{ z>PsLMB6iy1Cd0;nZ62ImM^*S;5GYBGMJ$dM&1rCN z99@rwxk}3wlHUO z=;^=w7)8-bu!7oieFFnR$NHE65)IfF9m&D&{N3_f=?xLWMVCNXyVXib6VB!0uBMM} zLLum-)=_6yJl)#DRX-FZ4)jWWHf!?PCV{a3)RcL#H%@e7>zs{~aKh zmyq9~dW`A?;_k*~>vQAKJg#s;fJ0{10L}DEIdZh)sv8I>N z3B&QubZ3o38c!|XUofi$@*G?HiTswt^0bqi`Z2ZAVHU0Iw~n{NJD%YLHE=OU+wU8u z&t%MLWpd85!wsLtrwCVwONZ0sF=8x+Vf(<8h7@&Ef^^E!lEbwFk7|0XSx{vk@XU8y zn(@M!-~G1G--!*PB(hDd?@hNt*N_G9yMB&69TZ1X(GmE^)~-eNk~X&;?d%*G!zmtr zxuv|W&|Ox-2m;*-Cgm+vFf)Qn=)L}XEt7EYouD`3NO*R15$-jC@JpB&{1RT1LZUji z`kq|^ZSeS*WepkG!D{m5TxASVr1+__b{MpayDmKl2}cS_2Oqok%gVGS;1xD{d_~%X zpp??i!vj%nKD3jk$>u*F+>)HfJQ(b==2TN?-hT-DeEY6=NgJS( zs={;`G=cX+aUMikCOWP=I~s;-@SF>1C1(woep=*S5`x9JbNw3RAbqSaP#(|zqXvX;t%=$*lx!$2iQ5~x!;!D%Wx-R} zu$Y|38otdmfQb(?%>c&kf*i_4F_k8ptt;-&pm10!Uqac^YaPWv=JUrYpZq5(3q-w3 z>%s!Yjipe*uEL6yyr~ohjH`z1@2T5~HVkA+c7>Mrv@PZbo$t$T#t%BDd0VtULLpg? z--8XVU;XiDb9S1cu<%r+x|dD_;$C2rjEG%3u&EB_VB`J0X>AX8I^m^z{ej^mEbUwl`ak~b%)h!`>8LuTI)*cL$A}gmungsF zy-reP4W-2HL)6tY%oTl`Gbus_oqvJSe_c9n{gjL(lElgg^;udt7|Hg6Gb-m z%s0PH9C$=`wgkW0+}TutHQj4G7PN*B#ctFKc-VX|XjHI&zG+EU*GlT(M^rQHJ|nIF ziqI@uY5)AY$Fb6rn$ss9n$o?UMDj-l;wUXmK3kR9zNzVLv(jY?$8iv!rdDA>R+@s>7$)V&(LelhC%Wdd=D0ei0720 zOTH!`+7-pD5w3?siF_1V{w{l-KI&t=$xUC0B?vo|WL)crc9&9n>)ZO1`?f8xVL)k& z3v~_je?j%Gifp|JWWxE#I&Az`ai;wbL(4>Kx09PZPO1W8p_6h}>%<=EX)3#SnJR}a zOy-a1?M-Wmh47EElfx2exD%&R9Xr;wZsp{wrB>Ux*n)jQHUDUIWNIep^1~Hfv})#; z9bfEuE-X6a2|R5~C=yvukGK9|_T!%Wg+Hkt#Va#SMtzgOu^bN&cq6-B|zO(OYhCod~D#bsZ%&L3=m&!O(#j?>tXZM>?H|jh5#D_pBt3e4QI@m_fR54oNgTZ82a28?xe~JyUHt*c zt(g+uCk&954Bbk{>oBkUfuM%?WzC+=LfV=hA*c8#Qm1~omw!3U8)}-NaKBY%sjw|3 zIq_vyl1MfobN|P=K9alx9qy@7_P6zw4I-J&*_yXwr=|f9p!NEC!_Guu+u5EWun?NJ zN(44BUOXp|tX=LJShEOF=OfOgBlfoZz6`qMB=tT*IRnWi2 zA8FM1C%kHDQojsZ9oVa8FZ4oFqU-h*_#03*ru;Q35pAt#1WBW&2u^R%JF9eUuAN?j z^(!B9Xs`zhtI+x<3F6{8uHOk3Ub`#?3!5tT%vxJNQVi_VScdMNP(_>)osBr@S9avb zmDH+_Y%Dgg`KgdevW2FU6(o1E_r|U|7u0{W&s-H)%TX<4oQol&HhJ8_9_qbbWF&dB zRQ2lu%b&3QRL;CrH(}|81S4lh;99NQz9W;pkME1!>OU)U*lzoV2vV13DMJs&TJP_$8QgYT&`pJ#=ApxC4 zsbMSN@j7D+g6^z|iPlQNPkkt1_yv(T8?}45$p18;A7^Cb?|P_^EX|o#_BH5Cs;Y1) zFUE6zs3yrzhp5`kA5ednsU={nY)`h*+!Nh~>M7Is14V_!tEeY*QVu@mw55N4=dXTT z9q(_=5(e(2`9Qv@U*}j-e63@Dp&^(R?anPH$0W|8x?Qr6+__$FJ7hIEe8r|v`AD*; zx01>uXhHi;sex8gI|~U|O#Pl@SnPORigUniXG^_%8V$~4$~IlBZoS`NtV% zKVjoRH?~w8_ZG-sTJ8;EVbN+*@V8Uc8~w_9@$^HCZ{wFSo)?2$j`gRF$-@lx;_KwZ zwV&!n)N9(W^}gzwhDxK{1)3J=6-W-Bu7RGBALaZYmcTd!mVc|Pd|5vDB#NHQASsE~ z=sg`EhtKvLQ9Zql_z<>zs<=tzQ=v;-WYhtDF3{?Jp?pvrI}JCPz??r>;DA37EzaH~ z&SPa~NNC>PTQ2_E3hc42Rp)oael;o8J{1(&&T@*hNUbGZeFJi%mi*vT+*96uQ(+w0 zo5HVlJ+gS~kE-IR^}BUenykli0~m8hf9e9U)P@Z;0ifq8J>)_nRVUtcO8#3@l8mI% zzNfAvP?z4~17dL15j(Hw)=t0-UBQD~015PG$cmfn89bC0Tpr7=9 zQyf!KJn_gvSkbITSxkhae~09S#Jk^8%yT$}!wPU+RxQt(rV#e_(<{k+MuC#jqYJBAdE-il z%f%RN-ivY~$EoCP)N5<$$v)ctaS`p7r53CckO`(>ai$WTyaTJBP<9)nBwn1^vVB zorUo?H^?lai0f~wKblNV8T8?FVnznSdj!zQ8IeJ+(XR6htJKkJ09sM9)A2Y(!pi-3 zwsm4J>!$K91!wFPwMqWO2ReVE0V22AL)65j!AGW_?Mrpy?m~4bAIawj8DWKEAh&_pA#$ zC06bnkqb%d+STwajlh0Mmy6iA{9XLFtACWJUs8WYB6IXuYZi>f9$Vn=ulI|AYghUU z-2ION4O$%&SoFI*i-v?QlRHNaPA{TlP`VZq2Q_Pgb9>kZoEaEfC<#!%0%iSN8bfTG zwNY$Jrr@6xh%MLt<-120vHaXes4tZqtu@*H&Q!ZhruY0gx!Gs`2ASj${vz*nQ0(af zG7C*yL^;lhPk!ng_tbs)|p5)4W z6oSq|R$KHy=@9XFqN9m7wUbuC$Lgb(9VXPfh@>V=Sf4kTjUXHJ^d<|>0!bk7IqJ`g z<~T)v@*!5CVCB-L`96!)qr*?_0@8gXy6P^)(LuqnCitoP<4hJc<)2-qiEoK&VX8;U z$d9cfbbc{G-q-Se`G6ded3n=Ri%ipg?7_05Ql9>$D^DDkh zVgA`$hGfmIf8}Aw;!2$J?c*2 zr;X446{iEacIo7)-AZX(mZ8H!$(c8NB$36DdCU)el(un;8tQrm#>KiF33apk#yrKJ zT%R-i{o2pQM5`rD)L4zu{9ZNPS45rb-TD1M9?tjSLq{0PB5M-O8G^Td^1*O0C7*BG z7lmyrku)m3pr+BBISH^AwGtx&SO_~T> zcWzTP!D)i3zU#$vYzriJm#S*W^BLqr3?bH#{r?Zzv^@63EUX#ooo5ZK^eo>EHy8VZ z*&GsvX{orx;y)h2zl3nu zgKG`CqqT6a2@mC7#tHKLYGf!0vrCn^4ZAUiwj-yJGFcG~&A(zj+|!>I_vs$R&aoNQ zt&&r*2}Wf$Rko@(qU8Hk*k%GOVe0AH z_*ci=`+G+@9nwKwN5$P#52zbU6z)z-#wni)j7(fS!(CMU2g2fTjST&;c~l<|xJ9!M zyNkqg&a0~ts-yx1)38LHcOS_}5t&NFVyE(=t|1RQOgPI09MX8!GG|s{OXZgWvUdF= zp7dD`kK@0rMY@TM-aB8^KWm?qU z47k7cY3aM4dhVIdH2~v6iI#oX8~!2LR)aKGWQxV~0R9Qi5$LWI;l|c6Oy17=sNR;5 zZ+UGC$~Fz5|ACr;7+54d1f5L~##sh6NPa9r;7s)A)kWvqT&%wmCEmA;1|P8VU3W9M z{NTWsk%3r2vT1*CGhMlNaYd^pFcSRRiM*-0@|qZdZI)1(?=;XCIB8hqCrMtIrdEyR&XAN571!v3A$g5?fUq@9&K+frd<)cF5VbkivTyBV7x&0x|>igXJCqZ=k5T@nIgbZ+E;ZQtMh{k3zp zvvYQK?!BLPJkRU-hs!y|Pp{mDnPrO+xK<~DyxR_X9hZZzxDD5<%W-KMR*?n3$Ed|>NoXy=NJ-+2}8006yM$FsQB+SEx9YEa2_H{?;T z8S@h_=pVE`c|LSbu9QlK;gUn4iNZf7r2_ze&==O$86+72WiPi9=A9%@=Cj=gwM8}Y z)D_iC&6H~e`CK)CjIhg~Gw;9<*Y|oqPi1_|IVFAkh{Ln)g@lsBNBPutv_h<~f&h zlvwq%E!?hkxg{fcb6bactI=Z>upk-!EAzl<|Phbc#jE7z$ z+@8bvQf(?u>*+{gs;LTUZJfAwKfiH%F=#0AofNNaC7fUDE51t}Ju>YO zF}y(=ZCVvZ8y|#15b)o{PG!BH6_GZO#*>mcC!c>l3%Z@%NfL5&<#qIl&#TRGot&F0 zsi)}?Agc}rvj81XEKi+AvsH%2GUdfXMuoY(Ik_)1$9hPY}W(AEUt=j8P!p%(-Dx%0%0h$>{(e5 z|7gK}xu+Xk<^((*o-m|XDLUXC*Mt;3%7;9$%q_p(!tp*ffdf}FFXE#E2&1b1k~q)5KZ(QR`&%7hJVx1Ym`h7QC@GrC%D!?bOFbSRHP@GUrJ zK&!*9q$?IncrTfL-ztpScnH}LO35F2kMoIx9GUR|w+g-qi$VXJaD)m@-2-d)8X4`l ziDsSk>a8JAOg#__d?JQRyHBQr0(xgqq&~Q$m1u0RUo`KbV%cxMm5ocb?5AR@BJ#2tVXSJf~+m zGLCP3B-=gkA6bKv3N@Bc3neYr=O_0j0w;u~~uRXaFg((IM28ZU-N@)V{1dmpR<)?{4vyhwoj z%1uY;TBe?|z)3=Lgb-pv>jTUi-!7be&+ZiV^h#6Geo{2wzs_sBW}m$ckarL-GKzkG0tk_EjF_U$9%{Uq94E2UUxSrSGZS4)AiM^QEnc0z7t4q?Vox7FTNUrJ@OrD_JuTdpD zsUkdRr+b?=a@$$bmm*aUv2MwA`)I-RWpkYfr_PGFIvT+B!d;aJohKM1IPDMD?!YBf z^Q4JK!1Zs2yyygj=M#Ubx2au{h};kJH=nTxk3OS5sbm$3(zA_}JAi~=V~Cu$bfNf- zp^)Q}$arshIrFYDO-s~hF~U&ot zbh<+cs-v9791E)3Q)h=jJ#&koi>qFBi^C$j#$$YMJMFt#n^+6|zWw=W(*XnJK_`ZZ zh$gV%9nr9`+*?xa;W;#V%*p5lfri*Xaq+Dt|Lp-G`2%`ua8w6Ytz*t@wmau`E3t~; zc-`Zlvz8P)L(?_6{fZU2G&ItqY)^p`QbxVnR@@K6zNL=`GNN=5(mbDXv9GG>7x1Ac z1J~J+yc&dJ04Pvo*e)Ub`36_BU3eu4HE2}{aDxwPWsZr%r3=6rmh+~Sr0_j+!G?*jK8`G5hA8-OtrH^6eoQaPGp=Rs5Wecwp7*Yu{_`5zqcz3XAQo1qY0}0<1%QBhU|BO2Tuj zZoEFA=jc?JPD5I6JQc_Y>Gi*ftfAx!B0A@1ySlBj_~Cv4*vHQ~C@yi~3q2fyaF>1s z`Pp|CC$?9)Dgr~ZM7v}Wb9OablXm{rax3iyr&$f5u$sAuS7(UNxmW|lJoxM_PB0f+ zPNETWq|5)l)c9+X#JgScCMzKz-kmRA;w}T~akw`eUhjNr@{V-<;L4?2E}h9S|B}Bg z;A5Nz1aq8t1uB$z3RZ8ODG{gee$KMK9i%klHSM0xjnetmmBuM&&@t+-86o z8XW5@lbq_@sPelQmwuhTyEUT@m+I?bUrF=z6@%6=|H16E$_+ftin&9Y`>L`j=px!l z)8-}UWJKlJ*;PFXpNW}itFWV-vWZj*nL>O(eSb$PYJCC7bZc}8Ocbk%4;#j$#HgPA zGt+C4l>}t0Ri1EY{RvORe`G7MfC$z-?i#Wm27ju`@?PXbMA-^62?@`g_!X&Vy#Job zK)$Dv?*KBqdI(=)z^=XVuLk!vl7u5Ej(CVpSb&t3Zh%Kr(9;m8uuJ)vH(Ddp2;ETl zt6;Z~mUkhV)yt#dFs$nG-;Qos24`-$$y0ikC3V$f>6W5YldIkq18g6(9wI@^g)$QO zC#=WYIq*R}FYBW}TK@{Q;=ylKKhH5#gP4-2m|o9&S+0VBWqla1uh;sIYyotZmceCq z7CU3y3FXSXaZ>s4v)>jhVx52e_ey96=@ZE25C{|98@}Ro6sGD%&@FV8NJeDpeGNnc zLW8!awl#a=!UqAaj5o-iU8}f7-nc@3X*iN#==c}=^j4q7 zVu4FQW^Z$DY`uo7Eon?JR!iv&B$Xtp;>QUIzj2|3DH0w$)&9j*A?Z~8q&863o0CCZ z0Q@xn7WyZsS<%Q%s$uepNRb$4LxpYgQP+U*^w$sZaD`8v6TgHK4pcn>+fB~+_}4Cl zJH|t){*3QVMgVtnb%gZ23P|h5Qc+c&xBr8wpFOnQZsGdG@?q{*S&%_5iOKcRpyO?& z_g*zOYHzVpMxrr~A1s2RDWA!#*?RUbUdAFll+sxmel9*xor~Jg0A_i^VzICl&9cMoqk2VR<6=tNSN6DV)|l zb1GS$htbj$#T7v+mC|RcnioOdYE%RI>((mS2F1I}*ov#u^u465jQ0^jlNw@crGMy& zy(7;z*SRE4m?oTpWWF=LOn3RIG8J!O?10=2MXX||QSOCBnQWaOWba-1hsJ8qJuPh+bhoVQKy^Trgv@N7_Z_IT-dE0H1GI?OP$YW&L_ z_i3{7o`;N;_`JEP;(+9DPxfyxIFsQ;&0izY4*RkJn@f>JJ=4JSl25-s?R$nLHtMUQ zxPpCFo3yuG1Sgl4Uog-HJEkc{y<3QSajyA$Q69w;;jf+(b+`2Il%o{(O<^5kbLklb zBlf5CjvO5gV8N=^d1~IbQ7$m~UaKI&WYrcKE6>;E%X6 zO5&Tp*ufD^jt<+eFkREfL|5%GB1(dPi=?qF#Li2?Be#J(gxkCG~Lb1Nz@ z{*TN-Ny2hx#n2%-|m2~YNoGu z-B;Uu<3CF;n1jAOkmu+Fe2ts|xZtmKSp?Qstar ze#i0d?w1>?0!NKB=3nHUyhb(5f3czgX_MsaDwblj0vc=5(GZoN?>87C_$-? z)?3HyS8kYaW_rtWjO@2W29B^C+822#3rC9W!s*mx{aMQ{Yt8N)a}blKrG;CTf7M!O zZWTLq-&|fVxdd|bD8D18WKGJ=QseKHxkkIIFDXFg$Sh$)_8a(_Qt3&&5PkWKLD&UV@BNM1uI|V)AF0iKc>)K`#Z`0H1}g zPbv?l`q*U;G7Nuvp;C3k={%3w-!DBxv)3P^yxtF9=Xc~vv8JJ0v>~xFrG>#H(4Wc* zs^H_{)TKx+$!AK|oJPIOkEDCP&C5pJzaC&nTq38C-)X$OYkr_zI!+nik~vh=lIFT$ zH^LjTpwCrSkhPhU%e%?-sC1Q`O z@Ascfe|juiLG)(fpyF3X@ZLpO8%v8A?jxO^O7e*F6}VBQhN-x~B|PYhbq8xdPD<~Z z4KR;T-f^SyIO>XibRBb@v5Dv5UJ#90yd)uCHkFsLCf+(V|6yo5cI^bSrd$^Iqpq39 ziZEZ3{;VZ!<7I$u%KepNWKqBBQ9>*Cx8Ef;ZOEuW)5@w`Z5FHugnNV9bL51o9~TvzXBW71nw6IGxxN8Ju(xx zVM+PcZ`7|s=;4XoSUgfG-xAA{Pzia~aYu#oRm1%6H|Y{jNgH~f^4iT^7wO*NP&&?k ze5=U;pH%uPhc!-Atzp7NBWLLDMY}cJx*QnY$zl=BO?>U;GWQRPni^Z*N4_YCWs=#X zx}iZuReY{XF;g$U%06QCX0FX4flW&3T8+iE+h<{C*eJ`@o)>b~O91ja2pn`bgl?sh+C{;b_AFk?q zj=9J4Ml;_J_kQiksZp?U-d(N)5H#%~`1Ial5(6xZdDPia{PAUS9-ZoXxCEw@bg`-O zm1&Y7hkt|axS_^x@rT9W?}MBpe{Pp@ji(@T4LaAvIIq{Va;tMzs|}mZlu;vv&NIwQEIZMaue2N zq{3WPT9gTHd$_)XpP*TAw- zsXQ}K<8e?JH99qt=I08Wq0gIl&G?`_s+0hnVPQxJodTq2wr82G^?~abe6PPA9Mbd2 za^7f%(sbzsaYB~FAJEgy{Rkhj3NVXr1Wfc>$Qn*;$ebHZz@^+ebg21LKX&O;uU3ox z3F(l2T%K0p4=y{B`Xjlnre4W1{K^b8e&*1fU#QW+moCJ#&8-}BeqO128((dK1x4?* zenguU*G$!IC#}w}in2elmN(+j)d}|qs0v&zv|U`hZr(t4UMP@dZaS8hah{e2nB+(_ z5?87Yum+*t+&NhPymHiBtF8B{md|as34#0U2Qt5oY~ZuTZ>*%>n!2h(6_g(WG<}xX& zt~Cf>(gOcc41{8$RcsZI4fCK0iT?t;`^{{U%)GxQZO=a5>4{IS=KYT>fJYDfRHsr& zlz#_oO8~8tG$!TV^`p~d&XX+9*I_*d$6lxHwkBNG4pVy%zuVU4uk%8Ek3rFHtuP$R zYVR^l>)n!pyzNWrW^?eO>33Pl0g3t8CNw2xU`Mw;grdZjk55OO#!82RZYe9|2E-b3 z)xiys!591EK%LBorD|mhB9;4Dx0nrY{_zr0orMS8g|qLMExKBd!rx`L#xYlIRYLmY_zDLvnZ9bPKA~^jq99Pkh(6~htV=x z9|%IM*WEb05j*mIMmy`}8ZYevzO6P+F&j&CH%tuQl9hkP@&_TX#;ot}If?h|zv01- zh^@37Pa54T7-DbKc>C_B1^mxb#8+$9MRnD+9LajcY@IO_*Zf6X0Gr*F6hn+m_3QmN z73OP^WMntDEkDxQKXaGnkDMMXOEG6|6p*2~o%!|}HA-K8&q+_C(CIRD(df*3pu&s zI}tzHzel=@RruZb_nUBFQ28iXX%|0F3q`*1I%uy4YYfb<>tKDkbP#Ghgh_BlY<@zJ z?03T!G;mWnAeL8ad(3zi49w9GBqn?+ZjdK3_vSZid~Q%m1VOX^=s`@@xx_<$q)X5R`psh0{;9hnXIV+P)VT z_S?xhMa>~HjzvgtW`IkCGM%DbYtPH+J!{7o0tf*-Tl6P>H4Gbu4dphyj4BcLX^xaO z+_~q2`hHfOmy+V6dGXKR8f3RT*S&CdhOb!#;dP|7Dxf?8f`?bqB9$iPJ1k{X86z6l zV%1Ck>NmvNj*rVx;9A{JYxsXx3L)h>t{g72Gy1QORDE5)a56!|>AZw{fL?l@Z|IB# z|7{gPi{FsH+pY4bB?PQH6}BN~lS_2b_q(A(lOsn|?l?OnwziUAX+j>s=78~nV!XE* zj+1Z6IhuvYJ~D@E*Lq-H<%cbkAGoBzr%Aq#8#YUJGXE!2b7gni7CUs0FMnXrvz>jW zlA!v1-Z}04k^B9GfMenu8DD!mF+CDk|N5hA0T4yW1neYFc$0_Dp(eol*-tF7TH^15 znp*)bkuhQv16Csqfn@i!u!9nCWb8@eg--FM@s6R>(9U5d6g)=AxtD+X^$4OgA7tKk z<<$Ulsg4e01#-Fp2mOSJ^LqYpi1wA&#}44_2e8ev<&%bRV?&T##K%I%$IKHm z6V%@+zQ^CWjzR^A8XOwz7kF1YQb1hhg@}Fka)-3Mc?taaJ=Vq#K5diZ@MaZgkFvR(JNk4MTQZP+$Yj)3m}@noom_s$@CkZb8{ z!3M*_e4NLI11P?%3M!_9c2r7(f-;SBFh@*%c~7(t-V#lu91jJ9@LE-(C$qC+l0wsh z!NsRNxhYWE*prUvNo7P2zE0RXE|)>4#&haf)D!5}Dm_NI6pcIG4{7qp=!99yPaZ!W zKPA$Bm_(A#)zi)XMuy9w5>6`=GQdx|#AoDq?N{WpE7ATPnMVMp;xrn555 z+@2RhM*p1N0LApPmY76^d!@(r2^h*fYqtAmH-W=1bnMe_99f z$^n%RSA%`7TtW+P$LGm$1zH09O=aQBSN6xUPlEDc235(8fgr?`JbO_dY7n$_*7E-)ul6kiRXSF%e9?{P7Fhx+MWFLKkC zZmd2uo?|(dmtI-oo7q31mGI^}Ow;F&WV)Kr3?e7$ejElUjWH*%o7+#FP4|AVe&j%u zDyPt`om^|p@2=T}3N!A#Rh_$$c6P^3KV%|#3d*EafMTOy8Z-;Q zbZ7Jzs>BsI-7zX!iT?5rZgGp?ayZO(C8L5l9 zp((}}9`SecwhSYw%Zt!jE1R5#Y(?OQ^)xb4ep>;^ZVS7^S6IJdbj+G$NUVXam#)zf zk3P7U zRp#K&o|`g(0)kSh!wr7lVXR5h75Pe^3Z9fcmd|-y#6zX;1AX9ouE>365LF1~(Mfd= zT{vn(ltDZJiOeS~fjzAT`x%|PPbs||59OGgHE6@0_LcQHjQ@OlFMR0bO&_+UKY1xX ztA8Kf3_uztVf3+wF_k2Bj4k4tr=|>p$KsyT91oCo!!t2ZRU=I5ui|bWxkkzwHE8H)oif#ldSG z1DO*eBnPH2>p<-9xAKjUhvvEh&pCd4%yrMI`ku&lBrk{JisA_1624R-MoU?Uo!use zK|WrE;Fku#y$X?O=L!(7BAMRdwYirX=k}@L@d?0%PA`cHrV*)**-H3BNwqMecO~pS z33Hr-_+MEQK2CJ3B!Oyu7q%>KVf*T<2~RAbW1qg5bg~T9M0B(U-P;-c;!$#X^$pE) z6FLn0X}`CXAp?J+baw?ryHGC(~GC}UM8o4`EeNI?(%=ZB!+lUZ?jGFCq+njOH9FN z5&5p3E(g1J8@sm7We1)ouipF?cj``?&(hEY3ip0x6#wvaCKH3f+Mf+zBa49!9Nwkp ztL^xq;TwXDxb=@!C~rvY%0hVekgW)T5urTnUV7XRWiWC2u(fo*NKe3^cPT&bl&WMO zJjS!XeX7{Lz|bL&XOXC?J@C`npFz^=dj$sTQsR zEB4*y!@VfnbN{9(CI03&+^gV@2a$WM$BP3sfi-Uf1Nl)XUg(!bqAySH)sL7NHN7y7gQr-4Aq$58( zsh$J>T{u%ChO0awjpp3M|HBre)1wG7%?IB&CrmjWG&%?W)=l-M&lG&$@Cr_@l=vB( z1;W0er*(3@0`!*M$2ehF@8)WHZ#>o8Bz4Z;0<){`LpC?m04QO z%w*;sD_0o#wxu+77L3Hl0bROKk43+MHoZ>cc}L~$T*5%E3(V> zqXP%6e8PM7&iA>-tV2aUm7F}Vph$|jWLt+Hsbj|8=}UQjI(QyBt7IG=fW)LnDk)cQ zlWuDll4fTZ{p+LQY1*zWqpxqbM6p#%%|ahIHzzL?B@D7J2_6@JJRT6D8tR7MDj6{@ z=CmqHW7pq$v}(=8a00-5d=}j6G&m?TX4idJuDiH(jVOA9nF+SU?^V7nY(5|g9sXYz zm^7=#<7{f;MDnM+X8Y>GK#gAan9H_??D8!Y?kQ%i6-JAtdz~Wu34A)O5&bIJ!kBD- z{mE19@|$A(f&3|K{E@S?QpPmKL&qGvlz<9m0K;_n!RvSVEBlx@REt->-Nt6mu3yr# za+PAy?c(}yF5F^o{>HyAWGE^!iaz^LQl|Gc#fAA-Ru4_pOb87eh4ae+JWk~m+X@A< zKiJsz`;%5x%Q!!1$lNq$?cx6XmuAxryOF0{kfBhTbLN`s(A4zy{_))${w)eI4~bo{ z)*E3Ski3j>EJ-o$9;v$_L(^q$&xlQZV&H!N!8ecc-xX#kM{bUm?w3f0Cw__ffnG1x zAuaEJ-W=JZyX{w6uwyAS4f|EW-{_pJ@%71GRK}11C*=D>_azTWx@#xZzylj-VM#X; zRlBqM7~O=VhIr?|_22Vq`Tvm>4E-w3!mJ~RQv)dd+t%*#z(Jte5scn zps^8vz6sDpgJMY!17g9{cnY1&w>gInX09stAH_8PVxy)hhld=)lX6Ym{r52xgGp>K_ z$2@-0|L(b1e+Qi49O4+I*N2>9O*|+P`B|eVT~F5|tK6siwJO|L5aI67nI@JmN|#2X z+}!u+PQtlcu#eCO!ad`TzW|0t?8n16O>A1cQya|RmSzRWVKAQbP`au zXBiI}{qZ!k*fDh92od3Iq17_YepsEPv`yk9s0fFT)e+m$_r_07`sa^$xS@l&zx;dO zDDM%hSBCkvZFoXlljMzwv(GB%8>j>)BGXKR_8^{6l}jUFTQ8oH|=$b+)Ti)P8)A|Jdzhj;k zzNQKHQYy*Ik`{lA=DFv1cI+s-Y~A9J68MzYQ1T%KKdxs_<17#*v!B3Eh9Wcu8^*;?b52ScD2HnnLYlZDPCzNvE7h@Bl_m~v%@TG z<2HB#x%VEZxV2kx)e(SLH+H!`C*QxIr=&NX!9k|FVL!3Ss4=x;I(do@o`9D=S|;4t zJ$qP7{0@D(NPyvEY>?b{vA0UFDDgkWLFKo{1?g}7q+gPCT~LErpRaGG7NkacBT&eR z4h~F?NU3_q)KAG@;Je@?5O@W8H&PHWTQi8ek|4r<<2AaLvAT%Ax#;QIZ4wvWHNOc? zz6tJie;~&?;E43L=w1E=+rv4ve8dVxjca@?Rt;SMc~7*bwjDiB{cz`VPHtc9MwRzD zFj+ZG`HxJu5c*!pkIy~Bmjhb7Gd_gtWpoWO9{$4fsfl0{Ytjg_J{$ch_Wktg$hVGlNz|5{OKt=9+ zpfSn6aGHdBS%T3fD<;E1tzF@&w?ma=*0g4jX+T% zk^_br6wN*F3-0SO=-dfP$co)OXpk6@*fp(C0|UPZ{&NbJ81fsdm>UYBjFHFYAadxL zJ^cU{-0Te?bRlYe2!8zO9C_4p+7 zY9y%9)CkYA2$RdL6Z@?62y3uPDqnG@yNx8TY-V({E@7u zWS+a=`+dQs4xJ_zTKAH)>%*7y)z)6zJ$<5LWT%(9cAOYXtbSbjxKZJ04xxnbi{q7e zrM|?tMYesq!=(-}?7*XZ%?5froPKz+Mm{D>aa^@CK_1Ab@-?m7IpINgc9_Y1C7%^W z?|w<)Fn7iUt-xTF9QK=b8jS!eC@dQM7MMSI4!d^Xnw65isYWu*f)9pRO>3rTV zxWuUIRTH5H5o4>?K33@$JWWL6lDI$?2)(Nb#>&bL-1_47S!^u&E7Y%tGYcc_&TC~ z*V*$Qi~W@hG&T)QYlopzWP>u8NPX5v+}t0-v)@0ivnWH^1Iw|6p_9S_#%ayKtkZ+ND zS~Hr^b#>F>kOkYmd%0zi^o-I8*$D(E=Cb@p=0-oC1e$xg0xij5YnXJwOhJrSU$Ev_ zsLZ(Wh0Q!YBK|P9xf}o8h9SYxLifn3r5Z2jzAuyy{S89S#*M~jna)GBkhM*d2f5ee zg=(UEv2IF~WCwbvO-nH2>h9alSMOve-B9jy=n^B8x*Q_HN2Qd&Qi2pUpiq;(0|2dQ@G%ZOV8YhJ6RLP`cf~-HCs^+uJTY{qc>6Yr{extDe9g z^_LD!i$@ZGY>mwMB9NHXs)hm6;O$@IPDhCRy~ZrHyAR7eA7mws*oOy8!NevDA-Xj0 z%D*b$gU)M>Kkv<;=5T6{S%qHQjnV=|>TRu_PyQyt@ZZpYj&&1W54slcC1T1aE=J^m z-_GB4E@g@;x)5UdM)jSAx<>*9Oah-&Eb@|hUDr0{E+Rd|oexGAt}q>4xhw=eeBhPk zZgXE+vOh*d!nOM3_|LKB9O(codT;2bmVY(vx#vDOs@WeU77ONVwItmjrnfRx;D-#G z=cCio7P3A;t*jyn9#YHy6YL5dk%+xAWxaF?D>XH*bRe1XaDXXf4JUgvzWE^C@z#sd zhYZATvqM?8f3y0`t9!&B!GXlF+4{gWsAzMj(va&|pGUj7*B1)bQKPq-82BwLo%2w; zI6;M2-(d|^uJBbuehRq)ba0%8|jgDSM@!y6a#`s}$+hc*rR%5U8^jUNDOj&UX z3K~h7#1=Wd<%IeT{eWVWzIf|6fupQGxpY3)&Ns@D%>Ik#A-Eof1?K6Wl%#PW5{>q1 z2M<22pW_$}q8WWqoD(`D95*lll29FCRj>Gd+EsmE{?~D@!=6F??p2FAC>0{;*=Oj{ z_)Wj~hD}J0UiS%(HDEdm2^tdW0^PO8g`ejzecqf0X@2MDLU*HGjs|CV4AhT5yS!70 z<}xdn=X8;=>coE7-h}0IpTgUPyh~fGST8f+9?#u-gaOZ!=F-Ht0tg*pkXyxydCTEb zV%FS=^r8ayD*ONxIh$#Z04na}iy(D57#>K|BBb+U<;83j6E?0Vl}P@Bvceeg>0Oq>DmQQk ziNR>1-{OV$HhXGa8uDlDnM1Z=6n9_9rO|s!(UiwJ1{r6FV%xE&=F-N`v+mP-3By!6 zX7h;TfKM0u=C(DadhdNHbh`Z>?rpN!ui$NwlY23i%)chj`Gw^!lKhY6QhaECT`fX* zZl?tMLtj*B990ReobQWabZPOS{h(mA#2!y$|(9U2YlYeGUlUQJByX*D5;>r(@75EkY)HM)FWT_p&P&aO1G4g|T-C)H zjd&H_Wl;F3g($TET)F_xHfi@ZOtO9H^ar0io3oLEOV<3B$MY*#M8U_SyQD2PCf0AI zuarvZZ@(##8`%E4U+D{D+#PZIa8%bwe_67Q82$n*VaTDMiz|a=_u^KycXQ{L(e0TP zog!6xkoScbEuiUU#q1vg-`SsasZ zT7&N_%qvB!8r=wwo4hKNBRG#{SXo2x zz^O(zpaa~V=Nd=V)75w(AIkIR_){x|VeF(4>*Xz&DdF3s;BbmPG1TNE6V3#2Ob1!v@2RBvQ!a`@Ajr#-w!bnlxlqFKGCZlc?ATZS)f@JLB-_ zjQ_|4Tey86ALNWqEL6X^WXDz$m=4bpKC4A8X}i-q-?~Fz|Hk?8tIg@~rvib%!tPzL z@nCM9@qQEzf%(^wje~*TO^E1bWcap=xbXAmOWJSp*Cb|g)qtaEu|+7Y3nhsvXNA`< z3XEp$hfY?+onm1T?QHE51FJ1@!@jHX1|>QZKpjhthP^s|w1zh|I7`_o82O{_9$QIo zZ*XTZ*kp$!1qo=uSJ~n}Vs+Gk^au$j)4^-^!?pf7 zw?7FJurd!^O*)Q@jo)_S*&|s2hiyE1i?PnyQ(kf)wfMb z72Gjf?4r?Fd;P(jPs&TC6RjG8mtR2T8cP@Ja_Qcb#`*3A)k((I|1|VWbY9$osX)c2 ztZ*y|Rc@82OTjNc`WLul$z*f4-|xtER>V{2=DwK_*{@2lmrt|a707)Gi*O^4JrS`9 zl--|vW_g1$EmpnU>TZ(EiNP$k;)mSG613w>AGncX!;TZ7OR6_cS+U`y00i=J*X;kB zxwOfDdi2x0^T#shKC&v44 z?ti&%IIpuLM;p2g9-quET!Tr@ z%4PnS>G?VBB688MT8&r&vUS#-TR8hN?ZZ*|>ZHRoDKE&93$X|Wj$I&|)4c?880eDS-u;I15HeDNwhyF)s|Z57AV+`AKe56bgmby)Nm)qKlzBiS|3RVA;; z{LZ-LeBa}i&Q4q;8JyvB7PoNq-Pm{A3W?@3##+AekI)x8>RGvB+6&fefN%RXjwgyF z`2qvGv*jP86OU=5<5D&9d9?XFVO-Uh``KdrPk1QYct#;AzExhNdfxRQ?%57BK*#L5 zA9s7|89jj+@KBKCi23bw5D#oEpp&OY#k9(b=6*=z)wHgI2PQse@+e~<2d%Zu@V!lN|}l#6)ecCK(qF21Xy7pjfJ~pGIceHfS6ncvitTv zUnxU-q00D2IE}NwiG!0ivA%h$(Gp#MkIDM+)@Y_D^fbTeG{NZ`D;~m|MEl-`nyn)z z1xP;8K&G>bdh3RYBAeBY;0Ry^iqVkwUxJ@BdUQiq~1jOi;cN_8=Zl1h3Hgnj2e zPhJlL=#A*VA6#4c^WU4ga)t_gc`kwH6M-16EI9v12Jc{0QpBdK4P^Fa#Mg(Suzmci zMwqLbjTSG64?5l3D0RLGmGL28$zJ5)d#MIxZB1--Y@IT<7)L;hPGjxo{%CifZ*F&8 z{AJFTTOKGJNmh=?xxY4MsoFj>od5zV+;6WJ_#8Pp24%Vg1C`xtAhkWF z)e#MvLv*I!X-~wq59DX(^)J`!lquCDWWMvhFy7FJ6q>5v_v`7-crD@|Qen|&ZSTs; zvC-7@A(1aZ#Y&SqHQ{}nuSfe#Z38JyNTRDh;gP}jORTW@f{6%>8SJ-u5D-J z5hu7`zRWR@BT*^&tVTc2zWF%iN2O?ga;X_(laN@DBBYu7-<6K++(|X{veb_|WI9EkOGIZ!fyZzG?7Iu)rv#o zugF=x1~P%g3rV1Cr65su8YHCb+a+Pm_@UprqZHOK)UT_0} zOk5cz1hUoi(`Wv_|@a0W)SR6;Yw;8Z?YNsH%Fi`nc!LM99J zFHqUC;;_rm-MkA6fA(c)N04(#=#V!d+17eiu&=4JYBk$>FZDs;;n%J;h1(LcA@Cr|HzeiR%BMNW}0bw z7zE9qeeG(Ye~C6~^Ks}~8&Z(RRKtq+9?K#T^{0lIh^t=?a^cA!bn>XTIju3>#*uj?OZ7ftu)zd@d4<1EoLpdW59uT`)r zjvi2b`IW2(2-R@LccIrq|14bLiW3H*_%ZCB3 z!~9f-wL<`$qCx3MkR)V@t!+eiZyJ5B6o z@tBD2eSfV=#qlz;;FuMM=rnM!tRh}q$OOBm3zpa6sbj!BHOb*_c{?D@R|(V_mM5yC{V(=O&MXf==& z(6@ZHg~R`l+WW79{GDwm;$Y$sT?%YO-@GyFY-O{>H#ysVR}#BM#qX6_Bfvm|t#KuF zUYHldFH9G<*(KXAP&AgB!Z_yKbizxWE(J9^?Ik061KV>Bi^BbUuVenMY{jNgt1hff zRzypR{;ok$7-XIseT6ZNQ}zhFo3|`#H?x?KQhFRTxnP_|wLVwy2K9a-|JyIdgi!H} zw)v}gvEnzu(RZ&0}KpQ@BS8&XN_-Z2sk^UEnIYuLZqg4!CuscSm+c>3X#K%0(}ig=H~ikn#Xm z6GxK9Ewsy-*jW09Eic;Y?HsjzdgS;r{QV^TO8hA!ZC2Qnl578E z{+J@w!PumRx}$hFYOIEFX}j7NW^M~N-vq-Ukz(JL zj%LY$%h2WdI>A5kfCE!|6!ek4t4S<(++%e^m6L4&sPPyUU8(}%3#9)!LJ2$wF= zvGuR%w(5o|H7eI)5|go1aBhm(=|VVU@e6`oY#<_2!Lo}G2H`GiZqlNap)R)pmpvsrO%i96iM%Q7 zm*X}#7~77pcA+VW61T%S2pk*9WD%<;m$#c6_X)preN(1qGkp~x;#-|E`YHpZpM1d^o>Z#`ly?-DZFjzcmG2Zp|Tc}aJodV#}Fo3Q) z<;GV()^^J%J2N~vH;Ou}+^$*;X1t}Y^o(o-#bG;;H=TKH8~sF8>*1?^j>J^220+`I z8_O~J7YZK6FZ5y-1Kl}0LlG@+;ZRSayNxrOCgqFvKhU=ra_^lIMa9;p2ceuD{#KsG znf$N&zhGDyTr>KM8rJS;8@d`yZVeuHh6vq1gt58G-8N-Ab0cU{Xap~=kp3gr$TIRk zy2$3|{gCTc(<)4p{nZ;}k-oqEe@hOrYY9qT1FmaW2j|5CeP-yAZPnrAPOnt`Bg@S18P3h}quif30KY#P(r2+Pq)b9GH&a|Q!j$@nro;S{|T0Ykp8Mys; zcE;qAfN+@6H`a*4t(tS$<7vaf>#3)5{X_aUi%eF$6&xLJGpTd%SA_t@%M}W_41k!~ zW2VIz6K)}+7^6!j3>!vrt706(yxA}5B*{BE&T?M)HWkxH%|Vx^}IWbNs?c2Mr-o zH?&W2S3Gzlv9q+ZirlmyJS2Z@l)V5``gysC)JyTD(@%IE$=!>y3x^y!S3-wF z`p5V$6Q;G~1MZcA#h7(>0#4@=JPuJ|E#16m=n1HS?Zb7wKW{sQH;kOUu8xk2vyP%t zm7L&M3}x+`lV~yTq6T8Js`l5o;1ihqvrexxF9-hNniz@1cyC?E#PKhY@Dx=^s~W~J z!~ko=TVS}NSn|WG`c?mwa+J`Zg{n`2bv|avdg99AT=C`Ax-F7wu`@pns@Dm?d2~$w zOuld@R*yUh5}~oL8p*w|U2A#RTJrgq2KU4(GR!8CE(@U7RP%XRPj$MXkMyHj0Ol3hOn#o1Nu)5~KA3!0U`xJM*9M&}vA5ER-1+9ec-A7Z# zz+5W2_=OIuXLh%eEwV>7f2s?i*03J5k7*yoebeO^c7HtyQtVQ)DAs4OU3N4yvFo3f zj@>3Ain`!w2jVsQOx5UuIh)>}DO0j7_sTxyOZ*%<%zh@PxD|1Qfy!bJcoLx~G_g69 zQ55wmu@kS~;g>EHweOTZVo*M8E?)U}y#Iz}Uh1>Y!knz{;_ezs*D{FUc)?6ALpEZG zm!bs{GczHd9pZH$isszOpR~~&ouOYsv0&UYL@cJvDbfc_O;lE|#%o8(8WF!BoaX;7 z{VL79L?=)d_AuFbfs4M*rtoQl-(C3iXTJ$;%KFDjZ=;t|1@$?(+Rw|5$D)8U9H`jE z5ikR%7K{h%b+3NvJYAavYC7F#)=f!7d)nFbA!{wyD6)1kKXe{=;H5>7I19EGDzPo& z`j{vv)8%=qs`_PR<*!f;rc>tDDYhia0{h!ZQ~K=4um8t;T%SE$PJUAfTM z>JYv0@ZEn29AjU8KYq;oZ8dRp_2vImrNs=$twuq-Me8(XmmXg-<;}>cHSohmx3zqX zedBOMkK}{N4419B*uS}i&&minUvz;G{h#T4-G{Lw~vO1?21Q2=t!DCw5!!d8{!uK%&dRl zTFHLO+h%9(u4gAxd`s{5tBx>T(mywE1ApP(Z&CcdW-8KM^;W~IVF8>OtJ4DSpq9F^C5 z3rDTHbps?Lk9G<;1yYlz!{&GR!{n$kLGn{koysfU;%R8CHOq~Y-wn@9QdHAP@8 z9(963Vfz3*O^_0sQMo+&`m>xpx4F`|t!8SV&X>g}Q)o4Deyz~T%u_J#1M$b1cTjGO z1LMIL$kg&2iAH9Pm9V&&$qd~x!uc&4wIZf=+9dp`7d;|n4(MFiwr{HEKl~ku<$QV7 z=A!H_rWdth6PPj(!H;)}x+^zb6Xj@N*yVF(rwB{Hsqck-yLe%7ZWr1Ht<(%1hmQIsfA*VG$qF1wz5ZrKKj1HnzhxDmOWnsVLe23qb^&~7?%spQfWmJz{ z!H}2+2oItN=H!Hu=G*?|-Rdji(es971r4QwF)dUCE{E)A4-D2>cMrLb(L<G znPFG}aqz16L20n$(ic(e`J1+Y;F(x2^*g|2X)->g4ads-N1=0`90u#y|O^WTu208K`w7ZoxmWS zf$4f>3)5ECRrS+3m;G}7+_`b@_WhpwtG6bI{5S~VN~}52$pas?qB26#s&4*0zF%n| zf%STmHgzVNwH(n{Wzfpy{k7i+6z2&nVA$KrDzPUAI#;Q3IDY9iBlzsytQyNje!#d7 z4qUt-uJ3vZq<5SndQ+N$GfyS8Fv|DPGYiumD;^{k%@%MaW2^%n(}rOtVmlM<9{3&3 z+WulQ)k*w;PK!-ox@`>cv19oMV!Thz2)@sljH@BouYiEPffU+3!JZ9Os)-E^BcW+L=XmsXW_vH#Dirhcq=WG3m^kj&QY}n z{w##K2T6YSuR7r~Ysr$t(S9k6lET=fFK}7`yT0+_&jX_N()dRk!W&eQHX$ z4Y@xD#w;QeCP&#J<)5HOkAdsy51oH&@9txJ+3^_02iY90K(qqza_1&T6%;q|X{+5G z%`vg#h*q-O;Q72fB^dn~v&ic)CINn3@jr;bA}Tq_Hqy4IrGTdxHM9b(`tdI_B;%lq zQBm$B`xV(0w#P}1N@(g6z^iJ_AwpL9 z@-=1Pa~Ze2xs=g}>^1}klTl+$?f_RpI|YBoY+$R8EUl*6h(`{?t1LQ++S%rcuOHJV zFmw#4+i;e`tr;V|2sY(2c^F0_wXaFy68?GZ2q79!m(mQ2R#gCvLjq>@is zv?;CE8Rz&v1zHpa8w^%qXtu1_+mWo>=V>2hQ)5J*TK?}G$21CEv2GbL?7uK(iRcGy zDx#l~vm5#Cmr>mM%S~>Shs~VPCtQCRXUT&-amPD$jLVRl^Zo~&R;YNNJJBcBkzdfK zOu=Q}2+u$k6T-$mXC+0}D0<2lN&dZ)0&?jpA zoj+&VFBq4ga{d&O0Un{%@qJ)Q%=D#HE^=-$A;88Pz4`MPl0NEFw)^_z=a>0yA;k0y zyk9x|++rG0W%2PP5q+T?%tu^j*lDg+ z)E+=xl;-!KOB>PFyXS<@lg@ulN%6u$21~l;JUsqt3+Wi1g;q5t;?OdTZs}?vxnfDj zhsIjF_Q~S3j$c>f(PwJ=bBmrAX2GJ`;YA0mIE)x}(&4@_Rzsm)Kh?-PG}(WLPz3!5 zDQ83B4ovIli%D{LT34&rD@Q!iPoG}Lqbn_VEwQ;kfV-H_KM z;Wqn-V0uMBO@zJ9ou>ljN$S^%>I7D=U$@xB?4p6Yo(?!MlS4-c<`e-n=4xWV4?`+# z#LE5bac#{6(=M4HWd4`L@aJQlOTSh6y>#V+5H0dK?}}sBDn0I%TAz7CWMl_ot;Xwc zr;mt;AW63nzJR=sY)j^EUR*kvvkR@C>nl7e$#{^ZN^^|OL)cNS1Aa=wsydm?nPm&? z){EMf1-6JK;>&oWAC1ZT5Yr!3!J0t9`IQ&|qw{}Cct1YA$Z$0$M^oj|MMSNQMLeZ) zk>6i~5UP!)l)hX|PAN@6u6Zn%65^w>9-&5O_BY zzhX!f!kccagrcMORYddbW?jay6sv_<@kG$Mh}sdQC!MT7JODm;5NP$(n>nm|3rT!q z!QyznX|YtC@|MK_lHjCf7}D57QUn&AgjSq(kCww1kqH!rF%_=jFyGd~j-g)-LG8D% zDq75OOgz3mz-Wc4$dS%2wY7@fD5M&CqxN9u*5}jof#`j^BhxXVpyIkOYq{A^k`Ok4 zYziE_S4IYdZ)Hn*Ok-D6cAS<_|0(M`A0dj5a{hrV6~Gh?We zql)7CE}H}<$yP{2$O7Jt@V50a+3Bz|VmH0`&kG=a5NN)ZuvCZf zd7O-a?2->_O+>7<8u+AP+ZUI^ zClZt`I-8{$C}ZVsev7+5>Lu%tlr0!NepS#9H&Y|>LXngKFwO|d7VJvAw2VTcn5s}j z%}N-=AbUsC`m?btb%bt5{9TpY;FtW!3^WzzZkCPMf+z>D zUV_*N(v`BkvtMf>sV(aY2#CF%#S)TnM@cas zsZONQ2U$!fBBivb4svSdTNc9y@;euB&lecCr?I=fp<@1if056K*66L!d*yA_#@2d# z?)tpf5Yq1?Ks?3AT)LQ=x{(j#rg} zu;11my{5QrKYF`|+bc|-LHQ+y7qN&0bNOU(5j^qKyI)tX%FXi;^?%K~4A00jJSY`# z;SUa^xgL$>pc-$Y0#YIIP;1=P*ky5|&_SmqEpR^jbl_d)?b~g)Zd7m1DX!jKigP%9 z^Ue>Q4cOp}BGpvLX$WV)==9$uBAv63Led@BitR1lnn1**d=TPB1Q(|Mnf#OSvL7WX z$~#4r#-Ymf^td5HO=kc@p`Snr$rcXH23)<2`TqHj8-}Vr-Uzb(IIZXq8u#Hv%!PD2 z<_3uh-_R1iYuGb(O)5)^0y;rKt2+ zO@>GhT+eTO{%*wLooe&$YR4`J8+ha~t-NF&?{?wiFSC<6 z)aSGuO9L}jTIJkpbtL=|d>r!KVex{IVTvy3d8(jY%gg#5duP*3w~>T$t)Y(56xpi; zk=7uWyve5Z?|iK=H!fX)_`@QtcS%OyKo%Q6^S<@rSqP>??1hF~>Wq7%g$HX_CU-E- zr8+r35ewUH_y=OP%fk0|8Q`U#16eU)t8;GBGmOl3TA|i%mUkaZx^ugK;s#_u=U{gt z>?-m?FxU#$9DSq6W&YMD0bz+NaM(2Uq5|6betSdzuM6jZ+P@l&_cfcFqqf=KuNp-o zuFGawUTPdw6Seji(yXbpm^`(z%g9yt@wJSSv?|E@FwA(c2mKlmd~)$-$Le)4-fbz@ zm)#}cZU!Fwh+XNUMw!0vFZs^P=*tTHZNg}}N^zTs0!kMz3-Q$NLegIY(DCJBT^2<| zwc7$&E6+3i7GPs&@0}op)O(BM>AduwZ_y3VGLkV|U z!j^TtV28OU(XH(i(I_{*yuX=q^dR=g^R3s#UtX@7B|8M}^*@kKT3cXE!kz#l<3}H^ zjJ4N-MoEV+rJmumlRm0_Dcy$a9J%U0`Z^ozJT_tyYls{D{b*?WR_AB;C|XmlON8}) z2HO4D*A^F({4rglDi-9drLU#@_Um8r>pera?R8gpS~&PsK?6M64_1uTyld?Vkt(ZKY8brY z=$lXA(V0`^EE3=EWIdwUQoJHgtuNQ|k?(PjMh?ltyM=51i~Ufwc7KY6MeA^!Am6qaxgvGc`*Dt zpS6jz;a`KhT8qOcf##KvwsLG^vgG{R8E!qEEWqvJhghn}nHkwxCADdo4q^Kpge8J|`{Lh`@Wke-e|^b3QK zuUK@N@Gduxs2Z|kS~6@~%)Fks3av~-s$9ZruN=fu_=AN*8N6 z!F8+wUa9VFQ}^|sYqNR&(5(EwhnKX3@4`oh)3H>Zd&a+kn1iQ5k;NsM#K z#D$0~4y)~bssHf4I$GzF=iA0lMrT_#CA~>eo*O_wWp&=?QkGI>c~B@c@9o6fB|34F zcR)0ph)xdM-;6)fpEw-QYuh4U>pzDH+Np)Jq65VHP|zKlz7gfjfHM2Dvjvs%{~zw^Q}7+UlQxn5SFq*~s!Qo)HxQPc;&Q*SR$eNTPnY16 zXfJ@jX#0ZB*%#c02=5TyCTy+}VyrnwY5-RyQnBAqwOHe&gjOIBD&Yi7b;hg&Uj3bk zY`t5z(|B`ZzB=Ds3V{A>RkZF{b@XWCf!W7@?y)9m1R!B5$$x?uF$ko1PD>gZm8D4%q5E@F;{~MdvZjdsQOKe7?NOq!*v*#O2k|W~Ynm($>5ZCfg*4httM+%~idTP1e-aIc3&Qe%z+TSs6 z9JP<>=dv`YUEt&7JA8Rny!IydWlRS(CGMc#-Uu?@S%-dnCy?a}^aUSSsY7}x_C_5p3(O56 z%c<5FHjNto@F^DgQp#8M`45cH7jq~Q#&PeOE)_Tk-Q+=Uy6?t?eJRH2pS=2~*7E8z z@E3^}{x&yq0qE_AL7%U%lQS{zy>)AGIoTNHcMg#}Ip03LD(v@U*i8V^D6gt&wHqah zEjwjgVY))Yvz#0@;#K-W2T%9|s%rn+36;T4x(#k;>fflO-qA&)~^FD_F?Mks$F?5o4g zw{-~z)c!@xd2Ty$3&PH;XHRC-6%TFyyjE-2}LqnX7BL^_2burY}@z*Mr2wMWMmt zX7q^Ku#4beqv0Q;!O-O)6}4LzdS|F9C6zaW0f|>HDs1zi+>*=3Zo)mK*xz_ zRR%_ov6IJhUK$={M98y@)hOeN*MH3o7ku3L`n&6Cp3rI6~FE$usP_2SVsQVG|z`yhVgE!B_+8o*V%Bl6Yk|0vYI^u6@7bgspayo z#;ng_2)(2+`Y92{p5pkvy*-<$pB^#T(Wf1Hdm{Wc75Cd;xYQ1sH|PFoTIh{)w?BJX zTKbi3ZzL%s>hjMc(LMe%iGrL$wG<-#1p?99fhn`twf?mbEQ5QK1en7+f0`PIXuO%3 z=~lL}UFmtk99CQxmFF1Q+W)KWKKAPwk1Sqh6Pun>4hen4X2QVyklRZ=X^^oN^$C6S zg}4SRjVU2owJG)T0CB10 z(UcIA)$^|KI0xtOybx7hW~_nTQ1p`7a@=*W*sp(}r>|{qZLB46WNiQU(v_EKL~OJv zQSM-`hhj!~1EIkz0traMM(rZU869dO!z4fFT(+9=O5)<%obq1RvPG25EeaCg+aZaH zZUi6lH(57G6twbZ`oeV;1MgnIZf8JX766_y41Y8on51ZemuXTCuOMM8)H;`TR zwXgWa#@EAAu{*FS1RXhn{fC`lVLoP1)TDs*j>vY0y~e+5M|`f0>xelxzmBd~ahEHn z++J?Z8kX&&?wnSrD@#)D)gAS|^En)GbQvc#9y_z zonU^NQ?nWP3%ohyHo!q^DohrKKy$hQJW!;F zD4cYg)hghJaMTyow|G@K_6E&&(j+pd_mo>su_ zqjKYN))?>ey4}9`weaMeBrlwjzw3%k|GI)_;FUnu!vV@nYX*7(&MA(2w!bd*ZA!|Dq0>Uk>RBhaJnfC zWy}A_$HtaAtRU6hEq5Cd5}28fBg5@Ba2ckf)Ib;up(L@*W3T!R?CkEdO)?xvrU?z# zND(%VxR=|A9KiF=8;oYweLY^-D+~t47H$yk22UZ53p^^iIqX}hBf2U|{vD~d~D zgDeZt$w6n5RuULOiYMB|XVnAv(^yEB80iyv3eB7EDo%L#=R*v=?8+I38~#*1B?0NO zcLTA>hp|R1rpaG#mLk>`C_=8E%r|FzM|bzpod!BK+Kvl?Kb3OJAf^Gaa0ZjOU^a6p z3Q5Fh7FZfenBt8H(@eE1R6c-q>@!h|pHA zdMLzk7LBG8Qwkivc}O&CS9l5Vt3qv)j>Vq$RKg_-!-I=%i9_VKfxr=e;B-C&lh4;}hC(M{DMYN^rcfP4(zOA`d|xp>}{_1pBdS|HJk@C7FX*1J}PEWwq4%q?XV<XmFn_qcZ7Ecn{j^?p{d20{+rTu3WT+?Q?>|sYO&4Zrd4$4bU}BF)zuRa3 zQ;*yK#pe7$JM50%m3$tiHPr~e!8WtDR$+JY#2I985&bbIrfAJv1)ZaRWDUNn^vTn; z;jYLDbr+^WycIm{(aw(GfY^)tWcO|9Eg}ly=gvf~B@eyTJ~hH2|7Kk1H%Sp} z)hI$?&K$Xk-3^wUfnkgqsv_kn&qwVJ<|fw)HJ;VX;G{X^aU(SRG0Cm-H;EPagB7DF zj3Z{M#sK*oe-QJP^j;cPIkLycmDf=3?yD6eJ(3OjFQ$;3g%=`mp)QR4{aWIe0j#*^ z?}FW3UI)i{Dit@s@6DgC~a+-Y$pxL4hVV zO^lt@3Z`&W-lM*T^#N!wZLh7i%`nNbG+2!IK2IMIX*h^hYr7{fv8Ty53*afLg9++e zVTzs3k}WILBhyVqQW4MZkN7<~EE-9mZQt&1^JBBvJS(m)d^~C~bMkmd z(+(ss22aSc6p~zm8s0MhdZ6|q7iOMS(Xx3nVpBroM6-iJhhyIh$?L<56Pzn-sk_W4 zGwg6$Yh=p2U5MgG<3;lN#}_A9*aEOlJ#^w`1oqE{*-h)~KH6bXhjYd}Z!D!%V!C#F zBMuI21_Cn_J_>?;_5GVBNQ?%I8-caAD!Eee)$wnD^dRiFUwN%q2e zjwM#IB_tQoh7cUEJHVrslCm=JQOW3?w?2y572fMb@IMu-R8j6G@g=;w{E&C-7>zxc z93cEA@+^r$un1-nSe{^eQg5T$pM*7u8SHMTHd-rn5E-miX~f+sLw{M?G>^Ykp=acl zrg_P(O3^Iu>L?&^s3b38NUX7hFmf1dPi3Y7dBb1$uD zZM}9Perezx3gG)j`at3lIK!DQl>;o+Si$ug9K}!HfBng8-O9POM{k8JsxET9*d!|{ zP|A4PUXi~d%;BtEfr=`QYTzHJ2&3rT1nmf=9qq4L64hAIZ+s?sMo4%W5-0I2rIoMQ zk4JmE7VYuDrp6Z1`#R*V?Z-$Fx?OnEy6#p8Y-zRJRZy z3ga}t4WB^$c&Ra6i7ENr(cP5#6&1eYM<9m(g1bC23{edR7Y8`#ICjX9Q>sMF_8ahp z@vj*Xg{Vo)NP+=yX!>oYX7i046B`}z++AuD%UOmu19H5^-mEBEJ7d*rHuw)D(UbI3 zXX!s4?a#tZbS2bdNJpF&*}=npPMbHK+dex8URJCf~mi;%XNP)s;dTr0H z)dxN>T$j-h7dGaZY`EFu8z@aQ01MLOfG~c7f5jOm-N#P%H=5Uv_LOLWs~7g zr?ZOLmu6Q28S1EHNvAHSZDSVKulp}GIP5@o1PgUNd^`lRmLL4?$>ZUEC6yRdjgGSXUJ{{=DIgor`oYo|Nb549R|+t%h*4 zUJXtN`24ti+VldMg>ZmOp<9*av%q`o7pAUEM31HQ&y+X1L5CRxWa44Sx(zY~)QfU& z&boL-SqNO%lUyPYO>jNKP{v@X@)v(R_&(H+(U)CEN+C~7u7~bRcnxMhq&w3rCN6Z& zE4clKPsmftVM~am&y}jS50eGaN1v*T8f zRy(XQel>0N{2Q*ztV(*3tZz%vg(oO1*B?hfv9KTc8)rS$NK=veU-h3BpxLiKx7hO| zG55CJGK|7$nh}db>{X=w+s-ZTWY3mb4d|0cK_Up|w7%pu9>zh7HH(;FI;Uku+67E> z>96Akm=v9*K+xAzuKY+h?<>|?Ixd`qMHp{Z@o6vN#s7qq*u|^K%czK+)Mm~Lo{|s7 zy=z#(n91Pp0x$YCd7mdIEgr>S)jIBX$tY)w&F|%J|7Mz!}HUqd!7%wJp5C;xWPmH2cYNo1+q1`u;mq5y0RPR zj*ke8=wEwoPA5C9QuV?sZKl?%+r!@OM@<@wE7LVo-vmt=;qMd^pk_N9+)!>(I$3Vk zGf~SH!?vOT{QJ}dw#M$x5D??GFcnaN=Wlge*L9-(O&J^E^Eh$5#5tW8*}1mz@{)k4 zAL<&y6%z^YIXBvsjd=Wd_mzXXe;ii9_%xc`v!vp5;!q+|70gv-k-SlS&ATJ+B`0(j zBB@MhUMsyi#Qh;l3pmFjRVKs9nd*flrQJ?&NbLb+PyK@1)nwC7tD6tT`OUA%z%R()P=+gyG%u9pU3p%K$f77EP zP6R}Aw?(u4uW&>wPHRb$1hw460GOicK-3+!1zt54|EP99y_~-pI$gz%BdI+RuWS;c zd{x~>WsuWHOQ$iiI>B`Ko-qn9ar!26uVdl9zV0jI-g>&oo?VqsG}PHN+!Np3LaCF^ z*Xc4YmuuJQ%P0tUGaAyIU~5>X&jcM!0&JGoQ>r0+h&PbwgT=ItpoPo9Cd3yL<=gXD zCtwGwRdrQK)7sU(T!U;J8_pcZr9X~;C>f(8`V*?z;u} zzB?AI3AOQWUsOfL9XDCGq&L7Q(`9uv#@*Cu0-4y`TS*__-6ad}DPrMR1oeYPv*HCT z&!4JTgV98a3;&qR`XTtO`0a*!FEDd2+{!ru4Me;rH++62APDZ{j7COWe`}-4knDU` zp}=^0US$>{-oN)I^b-7m8fN^}F zl3orydCC|KhiVb|jojQaepVa*f$?i9OOe9++DUcX6_=?m6t>b2Q8Vlvfdg$wAPZq- zJeGY1-OOeCX7n~hdd?qV3g=E84xi|Gc}q@JF5LFBtHLv#^))n1n{8M+jq$1z@oz9Lj8O=B zm3z@*sKrrCQ*+|O1V~j?{XH|2w!I78mR*r(aG{!O zFaLoajqH6TO}?EZlOh$>V{XIy4MDPFx=S#sRv>xN8xy5=b6iZ8UfW>U$C~VCni6Z^ zRj}~qMh7=C#cM6OCcfYugUGt`L&aC_EiSrGj&R#<%3oQ#`mrYc>ofIvKnQu0OQ*U(!Jr zK^A9#Jq#v_XlM_VsaY`i`M8IQ`ZA9-Htle3VL@-W@6Ls2wUln#I|VZiGh+~lmcoXf z{UZh&)n*vG%<+yx^)kNw#i?Btxf9X)yZXjtXgfthcjYh|Uxl9xLgdUKCs>bF9w*s* zD(XjEE1t7ODYj3I3-P44nXS$D{un7E-<31!X|6K0Nsz33Sy~2y36+?BzAmBOjnC=-J>?E)_eSswN2qH?wJD5fM>8w>q)39;K!HhThP;Rhp zI7f&Q1XwdS&qR((LB#EI@PA#H*8FV`4KFCn-zE~*kNO9)1K#`&l&Qm0`y0AC_?|kh zE31YQGID0IdnVrr=y926q5Hg;?}NM&k2Ts^@2h|eCC#R=R_8JUiAfyRb-8nt$6C*k zfv@4M-@A2h>_g%uYTzdBEA%E`g~d!CMYQhpD?c+NuE=u9bNmCTJmdAqceUxfmsF8G zW;W{})Ah-(2rUnP`WMELB$M^9)691(Jszo0@U@QcD>FWaSwDD^^#r>sesLe@psNvk z%1h|?RucZZ2afVeB|V7V>I{#_tfR@qk0WDWEV}Qc-Ihhb!8i@Xs**wPfp8hb_vznf7zRQknCTob^d75 zRuaRha28M!uN89mafVCFv%_~c$U@vtL5ee%E9_*T2fjtQx%@E^RnV*#ei|4a2XKC)Ugcg&$5MHyhTDV2qyER76OMWhd4ZzN4-dZm$?YGAWIGa6q<_AOAqW8mY>_WL6xa`m{C8?ixNa8)5~B*fnqTh$pgZ_*d-X zFOxQrMz;%vG!7Btxlfyi66ee2pWItV+wekCfLTp&xpwuG-fKmbW3tHAT~bwn;GhSfTUyZKbN`DA{-xl)42~2h$J8STW{Q{{teoqKdlV0zA z@a`&dgnDGquQN0W(fVTFju9Z@Cags|zE9R0s!p|8&G0932YL}-V#I&EAYfh}T^)~O zai0^UDg}PnK#R=)zl$o_)!?6!p@$Zm1BJ~rx*j1*dsb}|Pd&?@0mH+!c$%rCkkCTY(Y*{DC4waR8DrIJ8bB+j^ zCkjQJWF_Nd&m8+0A$zZL?0JrPIOF}hKi}WK9v;raeO~wVx~}K-98J$gt>!%09`HO$ zGw3JVJou3t%m^X6L5HEj|8rY%8)gUiLgnPv%3rRF53)CBpLqLw2QUuszXvY}aeL9{ zUwxJ0G24!Hy%%9)d=~#Ec={W&kp7M-sM)J;GuSy5MwjOy;Z|)NCh&_z-r8GoFrd>@ zQ{kf=TEpp56O(_)uPru@DZv*mOA;Yzue|-_Tc@9V9)6TdK!4G>{WnNbv|?mX!<#!H zxZ@y6s8^zEuf1(&U-H)+`A7eeG2*UK?1NvHnbEx>0y8~#^?xEwrH--;PRM*+#;1Ix zF!73Vul#wGyYL%3sKea!UCCkLZ&QXV*{;I59$>b)^D6<2bcjKr$QM0bOzFwKX$C_8 zQ&|5+-WQ9dyD1B@H<{#SOZh!OxFpsTpW>w4iAl55=A8zmkZIL0mH5YL2~KU60&x3% z^FFFTCH65V1ChbkHBIB!7w7cyNT(UvH(VGCd?fz=?%A61HwpM=UVaQ51-%kN6~dtPCf7k82avD4ce9I06F)IiejGu&K&oW zHB*f9V;wAiDgT{z4eZv%5iW?r0JIXc@T&S6LQLKcg#lNQ7jS8P_K>n~XeDmJ&L71T z@h3#8XX-Hx_Y2JD#_*KP*4o-e)5Zo?Zuap8cEA@ zWCYnwYDp;3TfI8@%K>D|pUAce0%`CNZ|z+MnJUH>$$&Dv2v zsl`oA27U7G8*nfGZohgH{YF_x z2XRdco~ks z*&;xc9*WE;g`VfO@$6ssWt8bWAv^tT;;b7ODq(MIuB+INYRDwif0F!o5M0Zm8H!<+qTd zC}K-WgNxB_r%P9d71q|q=ojnzwmpaEk9ATat=oL{%y=bt8UkKXZeJjRI&H=`D18pw zb+A0*7G^;GAP#ZeTZ`BIP@~oU!O^3J&#Ut@a&vtYaUt(CGtXp_`(uriV=|QL0;)_o}hr(%L?4iiYrZJp94;3?HNyi{3=!!_w#5YykIuQlXI-gR;1L| z1$H?|`LLwF<>}AYFLt$&@kTp3+uI#~DN=ymq6AdOwZ}u$p^RJ%w;v<~RtG~K;&O{7 zC$$8IgwN^s_ls4#$|VFgLmn5mI20Txq&j7k0=@2^K-XbrQds{y0OHK zOw{5fAiF?rO@K?sZZ6vL_qW+aUB6t5)IL7)q2Tcw4=&@=J~qk~ zsz=wRQ_TdZmP36Z)tf}OG~P>4=o*l-@Y8o@f}~(PA|d=v6vorqBG+{sw9tbH2m;wt$MBT> zM>So1szE3L-X~UaffV#I!R`rB@vtB>s}3ojnfPcdPx4QiR?OFw-f^r{=(|t$!Sm-Y zexD`G2!wb Q8Q-h(0lbaSa%A8@^2iQ65-nDNZl<%A&782A-;M}Dg+dxqP8T3|*6gXOWM6BreCsEm$b}_n8)y!^;IHZfN#=Z081oXiVUVW{SysEmu8Rvg zRZ47A^LSSg?$F8```v=R(&YG)LK{|u!Z=uW+rAHt{pq`^OrqnRpyht-h?vl`Q5EeJ$2a?CrX3&Z19Uy z?O9z#=#E(plhWWc5~;+qXzs8xNY~9^x;0v?)&;t-RI`BGQ^!|1cyv5rVxcAYvHl>~ znQ7OlM<_3?F>`%)3*0|-$ghn+65H~pJ=4#jS$Scb0u(G@#PwB%bpKBg{>=vzBkulrj9V6@`nC=OQ@O5U*^rL#?+xNwC1f!YS>6@#+ z`mI3^{8Eu;gFY`SYwj4S5H4;vp9iXyjFdZm%cI>7@O}+2Pj10Ue1#>!>^fu=^sa4i zyptK{e6aJNV!rZaUjKtXQipVdT)QjSu=#<2K*PtXri7j(TMVw*M?w>+)C@#N|KV* z8uu*va6{B{WcO{B{L^P0yJ-F>ZDLRl2xs>n6+x0Ki9{_HS>}XOiSu^(@Q`w|vL*-V zgr&tKxV?V&N~_g|iu_L%Ib2-<>aplC{i9}`baLEyA!yviZSZ{ML7}PjHO)660RN%b z7Ke-nL@o^ zjN66%H*%;c+0~T!{vdzi?bZfh{b}}9V6ggJLFX=5l-vJX3O&S~7;Qu@ZoL8hmt_Ii zMMDZ(5tuuvFW^0)icA~7RUg-%Zr^xB|6uDVg-XEVsCKZ)fkpJy`Fth6+_2Dn&2!B- zqk+cs?t#ur@9X&<8_c|R`glc{YSoEGK=O26m%*Z@E^Q_s$FFIvhqvwC&qYr!@d2I2 z0?Z0mkSmP?fP&%}$aG$61-t@hUf>9c$(8F9I_pD zEx3ZuJ5o!&311Q8PoI67xNvtXNO|8-&?5CbE&ux6AYrFz>%_uJuCy-wzg2a9cehq|4TyU64-0iGZMedn`vrGmdUtu`C;iwE0HF)_eh(SZ(hOxj< zVP1E|;`O_>SZmR(`p|TnOA$AiCoVkxJW<0ZkPZ}j{D+=W%Kwp>#5=>TDhiK>S8+f- zr=&;w`lB7GiX9z%8!iGXoVO3IT9+Vm{tTP0PI1wA4?GLv()z}TC57Qx+QHXI(qUNS zhtTencR#jD*BzF&6$;C1B*$b$Vk|<#PLXgeAmhsb_5z%oD+6x>U1^mLcCnu<^p@ef zBl}=LfqCT0rI5H81#51@(!#u?U%Kkb@LCzKNFJr3h51)Rb1zw%Ydb?8xs6Siy^3Eb zTm5MSg`XgSZqgMVy?BNEqm?B%ZW+;KaQQ<2L)mK07uK{Gbnnh)@APY}AAed;S5tI- zn$oA9?AW$9)J*A!+mtGh+9N~u|!S(2bIK^n8%`4rcaCzGvyw}%|J3d^sUBzf!t zJJltYRw|NeYwZL@9&pbe3s8+bl2RPt9AAw|_-JVZ)qO5^v~hElN-pcdn8Hj$c;T_^ zJy$h{x%T;iI*i}ds{ZM9RTV2p!$-1F3=+M^I7r*C?Ukn^nAi#v!f>&)Iha)enz~a9DuD;45X%RU5iyR3r z&-8M9gd?=>aR&lI0xUQOnn~$X`!k8i3wE)IZ2&<@q3Cn(_u9FvTt`d4>BCEy68kP+Y62k%qj2z9Tn{`sK+T*pd1S4T-=QGZ%2a3Mxv+`BzK@4{d7z`-Pl81IH zVkGu#3L{X%Xm5;_X~`10X9x6~$A8o`wBWDqXG*%uIM+7@drm)($XWJz*`f0H3->)x zE9feCITG|6-ib``3qI;{vc$(kZKcjsq?Vbrjys57o~InV5cxSP48F5^;WUU$?i@=m zIM@t*>o+qO28svQ09hDE%c!0|tZ(_2-p^X)z2SHnbE1y-myo#>mG|=eS<3Q;67CuT z?Xh&3Fr>+{QvV*vo?!T!u^0R{2mH8M^43Ri_{bxXUYg6{&3g2Oun<9Jay0Da!R25D zGXm^8z>vIfn|&2!=Xv_1=RK@WfA0yfcKbDqTpH#`9?w7% ztxb|!8hr$Q$m`$G7kcJ9en}EV09Nj_H>(Necs>X|Gf_jOXraA~{OL*SsC1!6@M?3? zvN6B+$D&6vc#@q5nc8~gtn-7FIrF<>Nqa}WbF-Oz^@=PZ>dz!pcvnJ9Q##dKBq!k$ z5d`g9;?B5$#iN*8z-9LCoZhb$kES0uAKLY67~GIgzbiUWBw?^IQ;$L~EHP4Rizr+OlxZaogJ2}CV}5&%fTtZNU_ zPPsj%VSKq2)F>Fvt~W}GlrP18v|#2Ugj$z}KLq+`U=DgA;5C@J60U}d@?IHxRS9hR z_72J?U3%u?g&Jjs29iA4ZhegK(Z^)&X#%~VD!ECEdds>A-ab%6fUl(2rHPyC(M_2L zJ7~j{2j^J6Ik9RKkLZS~nhNEsrM4yu281X0n9U4aoP%Cd&=;sZ`W4uWQ`-^)<%TQk z+`LDVWl`ZzLdJ!+JkzV-E~kNdDxTZ3Uo55ABh3omE?w8qSw_4E2<*H#bHlLmxy>mq zwe(|zg6{3r`0VTwH986YUnj?ai;*npfA$I`lu=Z5ac3C(T~lt1_vxNEZDI9d$G`cR zbEoHqFP<|$X1)QqD{mq@m$*p0;HnLh7=<1GCX`Z(?7Oij`Nt0#=IgIKa_iiM)@Zq~ zC0u4Cg&Jwi5@NBw8Dfdu-71tm1uCuj49RdALA5yv6{*(=$lvS`Q0TOJa&2^*D-E9W z55{gVcqF(ahs|0TDMNQ0(0hQ`pm!Wg=jZEZYs20hMUp}S@po2#T@t?EQthAO@sSXM z+dk4Br|)4&y#4mh?ybY)M4m4Z+1g`;k9+BYRi2jcWgqyzOQD+JjSB9xi^iZ6r4gpM z+^9!QoS7=uq{{!JlFeicHBumcncJsnj!p`FQoHYC_VCAFFasL71nI*&VLU7ACz0ip z!2-9mTRS(m{WAO4x9vh6W7?M%YYVG(}oFX8edEjIq5#XsYp zx_O^QAT6E^lqQA$n=N%Z^Od{iKm7#CkqKaX@+1-~$*ix+A9Ys_qDA?)C^(M1nIb?p zD>+S)&yA>U!K+$lJZO9=H`F!&tYYk0bJGXRVtgzGW?>;?S|Z(J2}Z{I`p1QU#`9kO zvTk9OBf)$n78Sz({ao+xaPgnkSc>v_3+$qFRW=cY^Z$>kyVT^0Y%5o|)JV;i7bE)8 zcIMHN*6B^pxvRcZKHBX!sdpg5frTq>`){o(rv!`~5H${83%sjaSV5Sa$h60Y8}2`7 zm&Qr8>x&wR=D5>uiXMiXo{x*Or9Ks8;A-yEGQ4L${Pmlgp9;)-;^vd$a4q8N+Bl}{ z?Vcd4X#j6PmLg06g$f`GMP-t_KbhldH@fbGvpNqTggY~C4X-jaezrFT&E7yXHE2e} zK$Sc$4&o`dJc1mB@e5rSlT{n+5cea^@kR;1zpn;-)Sc?-nv6qa1B^W)I63MbRw;B$ z`jpjcJsR~B>5ObyzUi}id|KhoCuy9BP`-C1cI!R-a!Q-*lbVl)8(zK%7gsqQ;tJ9V zO=MG-G5GYNxf0Q(B{Eb`XQ4gfhGdw6@fyp5F0XIPiO3!7w>53F`=(U)>e-W7D&u`o zut;*g#$Ah^8-kc76Rx(|^yAdO_-s|>&)$muk-;6I*eQ-3UcI=Y&BqL7<}!2|=r#OS z?vl3So)mv!D|!f{!02O@(0s3)r2}myx8!cbyF$mRR;F`NKlTnX7ewNNF(jVe#jDHs zEy^@66YcDdNjrpYA6r!Q5s?TJ3gu2WsV`Qv3ff+q_3Us0N zKc!x)T5en$Ak}lb$in;SMwG0GfpLj$ODF9fm`$`Wzx521^FOLo4>JL1BWn!jpqGu+d5DEvWY$tpBbDCIVs zQT`N>ipdqiEq!RYU25{3P}H;W2vy&fHM!3f<=VIErB59v_~ZAP(>qAP63!Ad7q)`h zTfzgIAVMJy_23UM^e%8}%G)U2NRZ4f;j|H%w-WQ=u&k?imRo!N6{R6Kk;_?bR3r4X z?4HPEcZg)jF_QD6n8k|FusNUbE5_B-==Y@IS$M?#=_WV#y9nEvug?{c7E3}d( z3D*igjH||!a#2{H^oi2BvjG9J>DkV|ga@EXOe%vh1uSTR7(?$HQ$cdG+I+?$Nvv#g z8O~zV_XUQvZA{(8`|SX)h5bHIAqr>2G7aF>p77av6WrMc>94>t?PF6NN(}eK>0ZLp zm_n~ImiVp`viaod^#`Sw87uV?I9T-=Z&3ZBTBg#JJhG!)(I>LoQ975Za&uNZ{T77r zi1>c@Md3_B#>&*0)j6osTaaBq#Y=PNxbkcM(-i7!eVP}c)<+0V7w@}0Mn4FgsmG9Y zm<}$(kem~h^y<&K`+rmetB+g$#u#5+zOIGXm~HeZEznQJQul)1l1B)WgGYISHk)x& zL8PXajdqhRudUh~|K3M_(jQkqG$YQmKjXKiiB>nNzU}KSM9RyxA1f96ZNot9I;sPgOk6aSC78*Ykd7s5EB+DFsmZ!H-FEKKxh&ZTuy}9Mn@36p>zx{O_*H2E zSZ-7rWl4*k{0@4_fuuk2R8zm3H&H1wt|s=4(#bjhE7@Dzal?{6my#kdKTtzw7;qO1 z6#ks>t_<)2Ed6C%PRQ<3kq-K~WHMkVz6{*_fvQtic$qowQ@w1BBR8Vnpm-?@h#KV* z{8;w`I}t$+J4N4$@p_}5;_ZPaq*Qvg7WiVMalGj{H($>>9+xeB39 zb`JB?^OE;1U#YeW`z3|3LVzRp?060+{>=DBroO6?58%^HTBy?irR>dGT?zp^+ImJ! z*)s_NDI~%V3ZOZ#b~W&F9tebb&cf<}V5LwiXKQ4Yx7d1>I+Z;bo3oGc!}Zmv#E*CP zUe>yc7S6&#?~wcm>BL7QYrF~?mdN|H6)*N--(+pC%dM7rRyc+G9~HO^x?T-5C{j~(aD%I|l-aF)K83SP`rkeN4yqSsthysfjSCR0=5T6 z2~Nxyff+lA+pc{bRLZIUa+ByyPc}OACqTP(A8R@;Rh7j|aO693iI565k{f7d>%FDC zg~qVCVu#+VY3mDLBcGir2H(=%)xU36Cuc{x`^4euz0cX+C5t2#+;_mEE&wo+0(k2p zS;ZfYjrFc-pBJ?xx%@{Zpn(8Z%}k zng+C`{FAkTA{G#yYg)jFEiq_q?4&#%RsSy_?~Mv1HPU>Z%F_dKNv8g}WG z&Vha1Wq{!l)j*Q{-y1)-qoxu=lKmBI-K8Z^7rXJKy5&_Ctzo>S+@tKEt5NrKwI(ja zvCa9QSnmRO(t~MIGSoLAPfh;qwxnXj1n<964mH4fSPLX%Mq_KQve;-Y4)93glqlg~ zoc~l$DUjm{uFs64u!l5`k*=&9Hysiqs;$B^gva$F83E=1oK9XPQn5HO_4Lj&*wW3Z zb09lALTehl{0q#Mc2rvtdmXXQqt1!#Y2D=p#F zqqjv~p{FZndiSPWSz#?|4z|ESWQ3a^)<>isgLm=7+t87v+RQ{m8=^WcIzX1&{o{`o z{PeFftIegi!y1J`?*-@PUATFWFmgV4Ic*8|1U947j>Pj}5gj?!CO8s}!nU%4?RLf~ zb`nbHU2*$GNa$a(o;tasce@4E9P>Iu z@5T7l4_NyBACZz{t(Tz_iz+}X≫0m*T$-UoS(m&+$j@TiDQ#uA% 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 z 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˦#& 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 RoZB^R@^NtHar)np{{sh8y1M`X literal 0 HcmV?d00001 diff --git a/src/Umbraco.Web.UI.Client/src/assets/umbraco_background.jpg b/src/Umbraco.Web.UI.Client/src/assets/umbraco_background.jpg deleted file mode 100644 index 412cd17865c1b847affa4f0c2abc74645f678187..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 30678 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 diff --git a/src/Umbraco.Web.UI.Client/src/assets/umbraco_logo_blue.svg b/src/Umbraco.Web.UI.Client/src/assets/umbraco_logo_blue.svg new file mode 100644 index 0000000000..578bf592f6 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/assets/umbraco_logo_blue.svg @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/Umbraco.Web.UI.Client/src/assets/umbraco_logo_white.svg b/src/Umbraco.Web.UI.Client/src/assets/umbraco_logo_white.svg index 3de8e82ed3..01f7260cd3 100644 --- a/src/Umbraco.Web.UI.Client/src/assets/umbraco_logo_white.svg +++ b/src/Umbraco.Web.UI.Client/src/assets/umbraco_logo_white.svg @@ -1 +1,51 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.element.ts index 5ed4f90fbb..c767b57350 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.element.ts @@ -32,7 +32,7 @@ export class UmbAppAuthModalElement extends UmbModalBaseElement

${this.headline}

@@ -64,7 +64,7 @@ export class UmbAppAuthModalElement extends UmbModalBaseElement Date: Mon, 8 Apr 2024 10:10:09 +0200 Subject: [PATCH 150/280] serve all images through vite --- src/Umbraco.Web.UI.Client/vite.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/vite.config.ts b/src/Umbraco.Web.UI.Client/vite.config.ts index f058a79d6f..4ecc0d2ab2 100644 --- a/src/Umbraco.Web.UI.Client/vite.config.ts +++ b/src/Umbraco.Web.UI.Client/vite.config.ts @@ -22,7 +22,7 @@ export const plugins: PluginOption[] = [ dest: 'umbraco/backoffice/css', }, { - src: 'src/assets/*.svg', + src: 'src/assets/*', dest: 'umbraco/backoffice/assets', }, { From 1dba67ac4331fedef3b8fccef264779c5a3ec4eb Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Mon, 8 Apr 2024 10:16:24 +0200 Subject: [PATCH 151/280] export types from the appauth module to fix tests --- .../src/external/openid/index.ts | 14 ++--- .../umbraco-news-dashboard.element.ts | 58 ++++++------------- 2 files changed, 24 insertions(+), 48 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/external/openid/index.ts b/src/Umbraco.Web.UI.Client/src/external/openid/index.ts index ff18b32b45..8b049e918b 100644 --- a/src/Umbraco.Web.UI.Client/src/external/openid/index.ts +++ b/src/Umbraco.Web.UI.Client/src/external/openid/index.ts @@ -5,14 +5,12 @@ export { LocalStorageBackend, RedirectRequestHandler, RevokeTokenRequest, -} from '@openid/appauth'; -export { AuthorizationRequest } from '@openid/appauth/built/authorization_request'; -export { AuthorizationNotifier } from '@openid/appauth/built/authorization_request_handler'; -export { AuthorizationServiceConfiguration } from '@openid/appauth/built/authorization_service_configuration'; -export { + AuthorizationNotifier, + AuthorizationRequest, + AuthorizationServiceConfiguration, GRANT_TYPE_AUTHORIZATION_CODE, GRANT_TYPE_REFRESH_TOKEN, TokenRequest, -} from '@openid/appauth/built/token_request'; -export { TokenResponse } from '@openid/appauth/built/token_response'; -export type { LocationLike, StringMap } from '@openid/appauth/built/types'; + TokenResponse, +} from '@openid/appauth'; +export type { LocationLike, StringMap } from '@openid/appauth'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/umbraco-news/umbraco-news-dashboard.element.ts b/src/Umbraco.Web.UI.Client/src/packages/umbraco-news/umbraco-news-dashboard.element.ts index d9a5135dbb..3f605ebf38 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/umbraco-news/umbraco-news-dashboard.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/umbraco-news/umbraco-news-dashboard.element.ts @@ -1,61 +1,39 @@ -import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; -import { UMB_CURRENT_USER_CONTEXT } from '@umbraco-cms/backoffice/current-user'; -import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; +import { UMB_AUTH_CONTEXT } from '../core/auth/auth.context.token.js'; +import { tryExecuteAndNotify } from '../core/resources/tryExecuteAndNotify.function.js'; +import { html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; +import { UserGroupResource, type UserGroupResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; @customElement('umb-umbraco-news-dashboard') export class UmbUmbracoNewsDashboardElement extends UmbLitElement { - #currentUserContext?: typeof UMB_CURRENT_USER_CONTEXT.TYPE; - @state() - private _name = ''; + _groups: UserGroupResponseModel[] = []; - constructor() { - super(); - this.consumeContext(UMB_CURRENT_USER_CONTEXT, (instance) => { - this.#currentUserContext = instance; - this.#observeCurrentUser(); - }); + async clearToken() { + const authContext = await this.getContext(UMB_AUTH_CONTEXT); + authContext.clearTokenStorage(); } - #observeCurrentUser(): void { - if (!this.#currentUserContext) return; - this.observe(this.#currentUserContext.currentUser, (user) => { - this._name = user?.name ?? ''; - }); + async makeAuthorizedRequest() { + const { data } = await tryExecuteAndNotify(this, UserGroupResource.getUserGroup({ skip: 0, take: 10 })); + + if (data) { + this._groups = data.items; + } } render() { return html` -

- Welcome, ${this._name} -

-

- This is the beta version of Umbraco 14, where you can have a first-hand look at the new Backoffice. -

- Please refer to the - documentation to learn - more about what is possible. Here you will find excellent tutorials, guides, and references to help you get - started extending the Backoffice. + Clear all tokens + Make authorized request + + ${this._groups.map((group) => html`

${group.name}

`)}

`; } - - static styles = [ - UmbTextStyles, - css` - :host { - display: block; - padding: var(--uui-size-layout-1); - } - p { - position: relative; - } - `, - ]; } export default UmbUmbracoNewsDashboardElement; From 1881d37c7433a9ad41baef9cc9f1ea1d9e588d2f Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Mon, 8 Apr 2024 10:16:36 +0200 Subject: [PATCH 152/280] Revert "export types from the appauth module to fix tests" This reverts commit 1dba67ac4331fedef3b8fccef264779c5a3ec4eb. --- .../src/external/openid/index.ts | 14 +++-- .../umbraco-news-dashboard.element.ts | 60 +++++++++++++------ 2 files changed, 49 insertions(+), 25 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/external/openid/index.ts b/src/Umbraco.Web.UI.Client/src/external/openid/index.ts index 8b049e918b..ff18b32b45 100644 --- a/src/Umbraco.Web.UI.Client/src/external/openid/index.ts +++ b/src/Umbraco.Web.UI.Client/src/external/openid/index.ts @@ -5,12 +5,14 @@ export { LocalStorageBackend, RedirectRequestHandler, RevokeTokenRequest, - AuthorizationNotifier, - AuthorizationRequest, - AuthorizationServiceConfiguration, +} from '@openid/appauth'; +export { AuthorizationRequest } from '@openid/appauth/built/authorization_request'; +export { AuthorizationNotifier } from '@openid/appauth/built/authorization_request_handler'; +export { AuthorizationServiceConfiguration } from '@openid/appauth/built/authorization_service_configuration'; +export { GRANT_TYPE_AUTHORIZATION_CODE, GRANT_TYPE_REFRESH_TOKEN, TokenRequest, - TokenResponse, -} from '@openid/appauth'; -export type { LocationLike, StringMap } from '@openid/appauth'; +} from '@openid/appauth/built/token_request'; +export { TokenResponse } from '@openid/appauth/built/token_response'; +export type { LocationLike, StringMap } from '@openid/appauth/built/types'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/umbraco-news/umbraco-news-dashboard.element.ts b/src/Umbraco.Web.UI.Client/src/packages/umbraco-news/umbraco-news-dashboard.element.ts index 3f605ebf38..d9a5135dbb 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/umbraco-news/umbraco-news-dashboard.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/umbraco-news/umbraco-news-dashboard.element.ts @@ -1,39 +1,61 @@ -import { UMB_AUTH_CONTEXT } from '../core/auth/auth.context.token.js'; -import { tryExecuteAndNotify } from '../core/resources/tryExecuteAndNotify.function.js'; -import { html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; +import { UMB_CURRENT_USER_CONTEXT } from '@umbraco-cms/backoffice/current-user'; +import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import { UserGroupResource, type UserGroupResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; @customElement('umb-umbraco-news-dashboard') export class UmbUmbracoNewsDashboardElement extends UmbLitElement { - @state() - _groups: UserGroupResponseModel[] = []; + #currentUserContext?: typeof UMB_CURRENT_USER_CONTEXT.TYPE; - async clearToken() { - const authContext = await this.getContext(UMB_AUTH_CONTEXT); - authContext.clearTokenStorage(); + @state() + private _name = ''; + + constructor() { + super(); + this.consumeContext(UMB_CURRENT_USER_CONTEXT, (instance) => { + this.#currentUserContext = instance; + this.#observeCurrentUser(); + }); } - async makeAuthorizedRequest() { - const { data } = await tryExecuteAndNotify(this, UserGroupResource.getUserGroup({ skip: 0, take: 10 })); - - if (data) { - this._groups = data.items; - } + #observeCurrentUser(): void { + if (!this.#currentUserContext) return; + this.observe(this.#currentUserContext.currentUser, (user) => { + this._name = user?.name ?? ''; + }); } render() { return html` +

+ Welcome, ${this._name} +

+

+ This is the beta version of Umbraco 14, where you can have a first-hand look at the new Backoffice. +

- Clear all tokens - Make authorized request - - ${this._groups.map((group) => html`

${group.name}

`)} + Please refer to the + documentation to learn + more about what is possible. Here you will find excellent tutorials, guides, and references to help you get + started extending the Backoffice.

`; } + + static styles = [ + UmbTextStyles, + css` + :host { + display: block; + padding: var(--uui-size-layout-1); + } + p { + position: relative; + } + `, + ]; } export default UmbUmbracoNewsDashboardElement; From 44a6e0085f759dabad73c973d2c462c1d2f92724 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Mon, 8 Apr 2024 10:17:08 +0200 Subject: [PATCH 153/280] export types from the appauth module to fix tests --- .../src/external/openid/index.ts | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/external/openid/index.ts b/src/Umbraco.Web.UI.Client/src/external/openid/index.ts index ff18b32b45..8b049e918b 100644 --- a/src/Umbraco.Web.UI.Client/src/external/openid/index.ts +++ b/src/Umbraco.Web.UI.Client/src/external/openid/index.ts @@ -5,14 +5,12 @@ export { LocalStorageBackend, RedirectRequestHandler, RevokeTokenRequest, -} from '@openid/appauth'; -export { AuthorizationRequest } from '@openid/appauth/built/authorization_request'; -export { AuthorizationNotifier } from '@openid/appauth/built/authorization_request_handler'; -export { AuthorizationServiceConfiguration } from '@openid/appauth/built/authorization_service_configuration'; -export { + AuthorizationNotifier, + AuthorizationRequest, + AuthorizationServiceConfiguration, GRANT_TYPE_AUTHORIZATION_CODE, GRANT_TYPE_REFRESH_TOKEN, TokenRequest, -} from '@openid/appauth/built/token_request'; -export { TokenResponse } from '@openid/appauth/built/token_response'; -export type { LocationLike, StringMap } from '@openid/appauth/built/types'; + TokenResponse, +} from '@openid/appauth'; +export type { LocationLike, StringMap } from '@openid/appauth'; From 677d1304372407f3ada4d395646b2bf6ec76d4e8 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Mon, 8 Apr 2024 11:52:15 +0200 Subject: [PATCH 154/280] import openid from the ts source instead to build properly as esmodule --- .../src/external/openid/index.ts | 21 ++++++++++--------- .../web-test-runner.config.mjs | 2 +- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/external/openid/index.ts b/src/Umbraco.Web.UI.Client/src/external/openid/index.ts index 8b049e918b..fa968cbfc8 100644 --- a/src/Umbraco.Web.UI.Client/src/external/openid/index.ts +++ b/src/Umbraco.Web.UI.Client/src/external/openid/index.ts @@ -1,16 +1,17 @@ export { - BaseTokenRequestHandler, - BasicQueryStringUtils, - FetchRequestor, - LocalStorageBackend, - RedirectRequestHandler, - RevokeTokenRequest, AuthorizationNotifier, AuthorizationRequest, AuthorizationServiceConfiguration, - GRANT_TYPE_AUTHORIZATION_CODE, - GRANT_TYPE_REFRESH_TOKEN, + BaseTokenRequestHandler, + FetchRequestor, + BasicQueryStringUtils, + LocalStorageBackend, + RedirectRequestHandler, TokenRequest, TokenResponse, -} from '@openid/appauth'; -export type { LocationLike, StringMap } from '@openid/appauth'; + RevokeTokenRequest, + GRANT_TYPE_AUTHORIZATION_CODE, + GRANT_TYPE_REFRESH_TOKEN, +} from '@openid/appauth/src/index.js'; + +export type { LocationLike, StringMap } from '@openid/appauth/src/types.js'; 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 3da2a3dc6f..832c831714 100644 --- a/src/Umbraco.Web.UI.Client/web-test-runner.config.mjs +++ b/src/Umbraco.Web.UI.Client/web-test-runner.config.mjs @@ -35,7 +35,7 @@ export default { }, }), commonjs({ - include: ['node_modules/**', 'src/external/**'], + include: [/node_modules/], }), ], testRunnerHtml: (testFramework, devMode) => From fe908fc565625b1f1b694d38240d48415a03def3 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Mon, 8 Apr 2024 12:02:42 +0200 Subject: [PATCH 155/280] avoid cyclic dependency --- .../src/packages/core/auth/modals/umb-app-auth-modal.token.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.token.ts index 9b763e4c36..97dd990b68 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.token.ts @@ -1,5 +1,5 @@ +import { UmbModalToken } from '../../modal/token/index.js'; import type { UmbUserLoginState } from '../types.js'; -import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; export type UmbModalAppAuthConfig = { userLoginState: UmbUserLoginState; From b26f1d4a81c8b99d86d25c4dcba967301ea12e46 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Mon, 8 Apr 2024 12:44:25 +0200 Subject: [PATCH 156/280] import relative to avoid cyclic dependencies in test --- .../packages/core/collection/collection-view.manager.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 02eed66b19..d08174ea78 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 @@ -1,9 +1,9 @@ import { expect } from '@open-wc/testing'; +import type { ManifestCollectionView } from '../extension-registry/models/index.js'; +import { umbExtensionsRegistry } from '../index.js'; import { UmbCollectionViewManager } from './collection-view.manager.js'; import { Observable } from '@umbraco-cms/backoffice/external/rxjs'; import { UmbControllerHostElementMixin } from '@umbraco-cms/backoffice/controller-api'; -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') From 4de47f8078d03443f3f7c82ae82a7e7df48d886b Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Mon, 8 Apr 2024 13:03:16 +0200 Subject: [PATCH 157/280] avoid cyclic dependency --- .../packages/core/collection/collection-view.manager.test.ts | 2 +- .../src/packages/core/extension-registry/index.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) 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 d08174ea78..0f6024506d 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 @@ -1,6 +1,6 @@ import { expect } from '@open-wc/testing'; import type { ManifestCollectionView } from '../extension-registry/models/index.js'; -import { umbExtensionsRegistry } from '../index.js'; +import { umbExtensionsRegistry } from '../extension-registry/index.js'; import { UmbCollectionViewManager } from './collection-view.manager.js'; import { Observable } from '@umbraco-cms/backoffice/external/rxjs'; import { UmbControllerHostElementMixin } from '@umbraco-cms/backoffice/controller-api'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/index.ts index 9d63aeebbb..7442cd6ae9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/index.ts @@ -1,6 +1,6 @@ export * from './conditions/index.js'; -export * from './interfaces/index.js'; -export * from './models/index.js'; +export type * from './interfaces/index.js'; +export type * from './models/index.js'; export * from './registry.js'; export * from './utils/index.js'; From 0e264553ab1c0e8968bb78913ab974365f043056 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Mon, 8 Apr 2024 13:03:22 +0200 Subject: [PATCH 158/280] avoid cyclic dependency --- .../property-editor-ui-multi-url-picker.element.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/multi-url-picker/property-editor-ui-multi-url-picker.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/multi-url-picker/property-editor-ui-multi-url-picker.element.ts index fe5de77170..4e3a978277 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/multi-url-picker/property-editor-ui-multi-url-picker.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/multi-url-picker/property-editor-ui-multi-url-picker.element.ts @@ -1,10 +1,10 @@ +import { UmbLitElement } from '../../../lit-element/index.js'; import { UMB_PROPERTY_CONTEXT } from '@umbraco-cms/backoffice/property'; import { html, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; import type { UUIModalSidebarSize } from '@umbraco-cms/backoffice/external/uui'; import type { UmbInputMultiUrlElement } from '@umbraco-cms/backoffice/components'; import type { UmbLinkPickerLink } from '@umbraco-cms/backoffice/modal'; import type { UmbPropertyEditorUiElement } from '@umbraco-cms/backoffice/extension-registry'; -import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import type { UmbPropertyEditorConfigCollection } from '@umbraco-cms/backoffice/property-editor'; /** From 1607e08953d933ac5fc360edb5b8d8b6e4a2a6d7 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Mon, 8 Apr 2024 13:14:30 +0200 Subject: [PATCH 159/280] use relative imports to avoid cyclic dependency --- .../property-editor-ui-multi-url-picker.element.ts | 2 +- .../src/packages/core/property/property/property.element.ts | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/multi-url-picker/property-editor-ui-multi-url-picker.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/multi-url-picker/property-editor-ui-multi-url-picker.element.ts index 4e3a978277..a4602e52ef 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/multi-url-picker/property-editor-ui-multi-url-picker.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/property-editor/uis/multi-url-picker/property-editor-ui-multi-url-picker.element.ts @@ -1,5 +1,5 @@ import { UmbLitElement } from '../../../lit-element/index.js'; -import { UMB_PROPERTY_CONTEXT } from '@umbraco-cms/backoffice/property'; +import { UMB_PROPERTY_CONTEXT } from '../../../property/property/index.js'; import { html, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; import type { UUIModalSidebarSize } from '@umbraco-cms/backoffice/external/uui'; import type { UmbInputMultiUrlElement } from '@umbraco-cms/backoffice/components'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/property/property/property.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/property/property/property.element.ts index b52179f9f7..1bf8e3c8d2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/property/property/property.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/property/property/property.element.ts @@ -1,9 +1,8 @@ +import { umbExtensionsRegistry, type ManifestPropertyEditorUi } from '../../extension-registry/index.js'; import { UmbPropertyContext } from './property.context.js'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { css, html, customElement, property, state, ifDefined } from '@umbraco-cms/backoffice/external/lit'; import { createExtensionElement } from '@umbraco-cms/backoffice/extension-api'; -import type { ManifestPropertyEditorUi } from '@umbraco-cms/backoffice/extension-registry'; -import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; import type { UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import type { From 5781e8151f7a580662e71807d4375a8e623c5dc4 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Mon, 8 Apr 2024 13:16:15 +0200 Subject: [PATCH 160/280] use relative import to avoid cyclic dependency --- .../components/input-tiny-mce/input-tiny-mce.element.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/tiny-mce/components/input-tiny-mce/input-tiny-mce.element.ts b/src/Umbraco.Web.UI.Client/src/packages/tiny-mce/components/input-tiny-mce/input-tiny-mce.element.ts index 7ccc036d14..4c85e03a05 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tiny-mce/components/input-tiny-mce/input-tiny-mce.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tiny-mce/components/input-tiny-mce/input-tiny-mce.element.ts @@ -1,3 +1,4 @@ +import { loadManifestApi } from '../../../../libs/extension-api/functions/load-manifest-api.function.js'; import { pastePreProcessHandler } from './input-tiny-mce.handlers.js'; import { defaultFallbackConfig } from './input-tiny-mce.defaults.js'; import { availableLanguages } from './input-tiny-mce.languages.js'; @@ -6,7 +7,6 @@ import type { TinyMcePluginArguments, UmbTinyMcePluginBase } from './tiny-mce-pl import { getProcessedImageUrl } from '@umbraco-cms/backoffice/utils'; import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; import type { EditorEvent, Editor, RawEditorOptions } from '@umbraco-cms/backoffice/external/tinymce'; -import { loadManifestApi } from '@umbraco-cms/backoffice/extension-api'; import { type ManifestTinyMcePlugin, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; import { css, customElement, html, property, query, state } from '@umbraco-cms/backoffice/external/lit'; import { firstValueFrom } from '@umbraco-cms/backoffice/external/rxjs'; From 08935284118786ff795b22f66ab959c23661a0c1 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Mon, 8 Apr 2024 13:17:30 +0200 Subject: [PATCH 161/280] add export type --- .../src/libs/extension-api/functions/index.ts | 2 +- src/Umbraco.Web.UI.Client/src/libs/extension-api/index.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/functions/index.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/functions/index.ts index cf2758ba9f..21d7768a87 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/functions/index.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/functions/index.ts @@ -6,4 +6,4 @@ export * from './load-manifest-api.function.js'; export * from './load-manifest-element.function.js'; export * from './load-manifest-plain-css.function.js'; export * from './load-manifest-plain-js.function.js'; -export * from './types.js'; +export type * from './types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/index.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/index.ts index c8ce6b7200..22c8863cb0 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/index.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/index.ts @@ -2,7 +2,7 @@ export * from './condition/index.js'; export * from './controller/index.js'; export * from './functions/index.js'; export * from './initializers/index.js'; -export * from './models/index.js'; +export type * from './models/index.js'; export * from './registry/extension.registry.js'; export * from './type-guards/index.js'; -export * from './types/index.js'; +export type * from './types/index.js'; From 93d408d94c8e8e2489501e849c730c3a5efcb6bd Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Mon, 8 Apr 2024 13:24:42 +0200 Subject: [PATCH 162/280] fix import path after merge --- .../core/auth/components/auth-provider-default.element.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/auth/components/auth-provider-default.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/auth/components/auth-provider-default.element.ts index 2b93881d87..c6c10745c1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/auth/components/auth-provider-default.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/auth/components/auth-provider-default.element.ts @@ -1,4 +1,4 @@ -import type { ManifestAuthProvider } from '../../index.js'; +import type { ManifestAuthProvider } from '../../extension-registry/models/index.js'; import type { UmbAuthProviderDefaultProps } from '../types.js'; import { UmbLitElement } from '../../lit-element/lit-element.element.js'; import { UmbTextStyles } from '../../style/index.js'; From eaa4f812261bb3a34360ec3bf8dde71301c59b88 Mon Sep 17 00:00:00 2001 From: JesmoDev <26099018+JesmoDev@users.noreply.github.com> Date: Mon, 8 Apr 2024 14:20:37 +0200 Subject: [PATCH 163/280] reload workspace --- .../documents/modals/rollback/rollback-modal.element.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts index fbbae37d9b..4d24557b92 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts @@ -157,6 +157,8 @@ export class UmbRollbackModalElement extends UmbModalBaseElement 1 ? this.currentCulture : undefined; this.#rollbackRepository.rollback(id, culture); + const docUnique = this.#workspaceContext?.getUnique() ?? ''; + this.#workspaceContext?.load(docUnique); this.modalContext?.reject(); } From 8aad8b6e7a87260c280ba829ad42bed443aa8834 Mon Sep 17 00:00:00 2001 From: JesmoDev <26099018+JesmoDev@users.noreply.github.com> Date: Mon, 8 Apr 2024 14:38:58 +0200 Subject: [PATCH 164/280] temp fix for reload doc --- .../documents/modals/rollback/rollback-modal.element.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts index 4d24557b92..481cfcbd5d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts @@ -158,7 +158,9 @@ export class UmbRollbackModalElement extends UmbModalBaseElement item.alias, (item) => { - const diff = diffs.find((x) => x.alias === item.alias); + const diff = diffs.find((x) => x?.alias === item.alias); return html`

${item.alias}: From 0a618ca18f34687694ad05421169223e39c8ffdb Mon Sep 17 00:00:00 2001 From: JesmoDev <26099018+JesmoDev@users.noreply.github.com> Date: Mon, 8 Apr 2024 14:46:53 +0200 Subject: [PATCH 165/280] export from external --- src/Umbraco.Web.UI.Client/package.json | 1 + src/Umbraco.Web.UI.Client/src/external/diff/index.ts | 1 + .../documents/modals/rollback/rollback-modal.element.ts | 6 ++---- src/Umbraco.Web.UI.Client/tsconfig.json | 1 + 4 files changed, 5 insertions(+), 4 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/external/diff/index.ts diff --git a/src/Umbraco.Web.UI.Client/package.json b/src/Umbraco.Web.UI.Client/package.json index f62beb7f4c..52dd384501 100644 --- a/src/Umbraco.Web.UI.Client/package.json +++ b/src/Umbraco.Web.UI.Client/package.json @@ -88,6 +88,7 @@ "./webhook": "./dist-cms/packages/webhook/index.js", "./workspace": "./dist-cms/packages/core/workspace/index.js", "./external/backend-api": "./dist-cms/external/backend-api/index.js", + "./external/diff": "./dist-cms/external/diff/index.js", "./external/dompurify": "./dist-cms/external/dompurify/index.js", "./external/lit": "./dist-cms/external/lit/index.js", "./external/marked": "./dist-cms/external/marked/index.js", diff --git a/src/Umbraco.Web.UI.Client/src/external/diff/index.ts b/src/Umbraco.Web.UI.Client/src/external/diff/index.ts new file mode 100644 index 0000000000..498d9d0e23 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/diff/index.ts @@ -0,0 +1 @@ +export { diffWords } from 'diff'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts index 481cfcbd5d..5fde8d7386 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts @@ -1,3 +1,4 @@ +import { diffWords } from '@umbraco-cms/backoffice/external/diff'; import { UMB_DOCUMENT_WORKSPACE_CONTEXT } from '../../workspace/index.js'; import type { UmbRollbackModalData, UmbRollbackModalValue } from './rollback-modal.token.js'; import { UmbRollbackRepository } from './repository/rollback.repository.js'; @@ -11,9 +12,6 @@ import { UMB_PROPERTY_DATASET_CONTEXT } from '@umbraco-cms/backoffice/property'; import type { UUISelectEvent } from '@umbraco-cms/backoffice/external/uui'; import { UMB_VARIANT_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; -//TODO: Import through backoffice/internal -import { diffWords } from 'diff'; - type DocumentVersion = { id: string; date: string; @@ -158,7 +156,7 @@ export class UmbRollbackModalElement extends UmbModalBaseElement Date: Mon, 8 Apr 2024 15:07:49 +0200 Subject: [PATCH 166/280] import --- .../documents/modals/rollback/rollback-modal.element.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts index 5fde8d7386..c394afcf9b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts @@ -1,7 +1,7 @@ -import { diffWords } from '@umbraco-cms/backoffice/external/diff'; import { UMB_DOCUMENT_WORKSPACE_CONTEXT } from '../../workspace/index.js'; import type { UmbRollbackModalData, UmbRollbackModalValue } from './rollback-modal.token.js'; import { UmbRollbackRepository } from './repository/rollback.repository.js'; +import { diffWords } from '@umbraco-cms/backoffice/external/diff'; import { css, customElement, html, repeat, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; From 7979139afcd2e0e8d3a62103ff258f5a891d707c Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 8 Apr 2024 15:28:48 +0200 Subject: [PATCH 167/280] remove double registration --- src/Umbraco.Web.UI.Client/src/packages/core/manifests.ts | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/manifests.ts index e941207544..daba6cd6d3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/manifests.ts @@ -22,13 +22,6 @@ export const manifests: Array = [ ...extensionManifests, ...cultureManifests, ...localizationManifests, - ...modalManifests, - ...propertyActionManifests, - ...propertyEditorManifests, - ...recycleBinManifests, - ...sectionManifests, - ...serverFileSystemManifests, - ...settingsManifests, ...themeManifests, ...sectionManifests, ...treeManifests, @@ -42,4 +35,5 @@ export const manifests: Array = [ ...propertyActionManifests, ...serverFileSystemManifests, ...debugManifests, + ...recycleBinManifests, ]; From 582654cc82a35ea521c07551b792be2123cd4c2d Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Mon, 8 Apr 2024 16:56:57 +0200 Subject: [PATCH 168/280] no need for distinctUntilChanged on boolean states --- src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts b/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts index e25de952cd..2a61b36e2a 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts @@ -6,7 +6,7 @@ import { } from '@umbraco-cms/backoffice/auth'; import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import { distinctUntilChanged, filter, firstValueFrom, skip } from '@umbraco-cms/backoffice/external/rxjs'; +import { filter, firstValueFrom, skip } from '@umbraco-cms/backoffice/external/rxjs'; import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; export class UmbAppAuthController extends UmbControllerBase { @@ -22,8 +22,6 @@ export class UmbAppAuthController extends UmbControllerBase { // Observe the user's authorization state and start the authorization flow if the user is not authorized this.observe( context.isAuthorized.pipe( - // Only continue if the value has changed - distinctUntilChanged(), // Skip the first since it is always false skip(1), // Only continue if the value is false From 51edd913de302340c06772ad0975b8885e89203d Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Mon, 8 Apr 2024 16:57:16 +0200 Subject: [PATCH 169/280] save location when making auth requests --- .../src/apps/app/app-auth.controller.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts b/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts index 2a61b36e2a..db450075c4 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts @@ -51,9 +51,6 @@ export class UmbAppAuthController extends UmbControllerBase { return true; } - // Save location.href so we can redirect to it after login - window.sessionStorage.setItem(UMB_STORAGE_REDIRECT_URL, location.href); - // Make a request to the auth server to start the auth flow return this.makeAuthorizationRequest(); } @@ -67,6 +64,9 @@ export class UmbAppAuthController extends UmbControllerBase { throw new Error('[Fatal] Auth context is not available'); } + // Save location.href so we can redirect to it after login + window.sessionStorage.setItem(UMB_STORAGE_REDIRECT_URL, location.href); + // If the user is timed out, we can show the login modal directly if (userLoginState === 'timedOut') { const selected = await this.#showLoginModal(userLoginState); From c046fefbc67cf11bd4ed88058e920d72f2e97c36 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Mon, 8 Apr 2024 16:57:57 +0200 Subject: [PATCH 170/280] bind controller on startup --- src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 d502c4a487..901ab5b0e5 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 @@ -76,7 +76,7 @@ export class UmbAppElement extends UmbLitElement { #authContext?: typeof UMB_AUTH_CONTEXT.TYPE; #serverConnection?: UmbServerConnection; - #authController?: UmbAppAuthController; + #authController = new UmbAppAuthController(this); constructor() { super(); @@ -114,7 +114,6 @@ export class UmbAppElement extends UmbLitElement { if (this.#serverConnection.getStatus() === RuntimeLevelModel.INSTALL) { await this.#authContext.clearTokenStorage(); } else { - this.#authController = new UmbAppAuthController(this); await this.#setAuthStatus(); } From def6534d6b61c337aa2e6005e150ec4fb02b0a5d Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 8 Apr 2024 17:04:58 +0200 Subject: [PATCH 171/280] add keys to dashboard manifests --- .../src/packages/core/settings/welcome-dashboard/manifests.ts | 2 +- .../src/packages/dictionary/dashboard/manifests.ts | 2 +- .../src/packages/documents/dashboards/manifests.ts | 2 +- .../src/packages/health-check/manifests.ts | 2 +- .../src/packages/models-builder/manifests.ts | 2 +- src/Umbraco.Web.UI.Client/src/packages/search/manifests.ts | 2 +- .../src/packages/settings/dashboards/manifests.ts | 4 ++-- .../src/packages/umbraco-news/manifests.ts | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/settings/welcome-dashboard/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/settings/welcome-dashboard/manifests.ts index 5865d480c2..5112dd2791 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/settings/welcome-dashboard/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/settings/welcome-dashboard/manifests.ts @@ -6,7 +6,7 @@ export const manifests = [ element: () => import('./settings-welcome-dashboard.element.js'), weight: 500, meta: { - label: 'Welcome', + label: '#dashboardTabs_settingsWelcome', pathname: 'welcome', }, conditions: [ diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/dashboard/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/dashboard/manifests.ts index 9c2bd689f9..7d8ca0164f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/dictionary/dashboard/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/dashboard/manifests.ts @@ -8,7 +8,7 @@ const dashboards: Array = [ name: 'Dictionary Overview Dashboard', element: () => import('./dictionary-overview-dashboard.element.js'), meta: { - label: 'Dictionary overview', + label: '#dictionaryItem_overviewTitle', pathname: '', }, conditions: [ diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/dashboards/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/dashboards/manifests.ts index 4d156accdd..5318ffcc8f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/dashboards/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/dashboards/manifests.ts @@ -8,7 +8,7 @@ const dashboards: Array = [ js: () => import('./redirect-management/dashboard-redirect-management.element.js'), weight: 10, meta: { - label: 'Redirect Management', + label: '#dashboardTabs_contentRedirectManager', pathname: 'redirect-management', }, conditions: [ diff --git a/src/Umbraco.Web.UI.Client/src/packages/health-check/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/health-check/manifests.ts index f40347abb5..c630937f90 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/health-check/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/health-check/manifests.ts @@ -7,7 +7,7 @@ export const manifests = [ js: () => import('./dashboard-health-check.element.js'), weight: 102, meta: { - label: 'Health Check', + label: '#dashboardTabs_settingsHealthCheck', pathname: 'health-check', }, conditions: [ diff --git a/src/Umbraco.Web.UI.Client/src/packages/models-builder/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/models-builder/manifests.ts index d3b793e074..9f20431ef3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/models-builder/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/models-builder/manifests.ts @@ -6,7 +6,7 @@ export const manifests = [ element: () => import('./models-builder-dashboard.element.js'), weight: 300, meta: { - label: 'Models Builder', + label: '#dashboardTabs_settingsModelsBuilder', pathname: 'models-builder', }, conditions: [ diff --git a/src/Umbraco.Web.UI.Client/src/packages/search/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/search/manifests.ts index 6842024300..74f7473793 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/search/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/search/manifests.ts @@ -27,7 +27,7 @@ export const manifests: Array = [ js: () => import('./examine-management-dashboard/dashboard-examine-management.element.js'), weight: 400, meta: { - label: 'Examine Management', + label: '#dashboardTabs_settingsExamine', pathname: 'examine-management', }, conditions: [ diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/dashboards/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/dashboards/manifests.ts index a406ba57df..c1f82d6790 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/dashboards/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/dashboards/manifests.ts @@ -11,7 +11,7 @@ const dashboards: Array = [ js: () => import('./published-status/dashboard-published-status.element.js'), weight: 200, meta: { - label: 'Published Status', + label: '#dashboardTabs_settingsPublishedStatus', pathname: 'published-status', }, conditions: [ @@ -29,7 +29,7 @@ const dashboards: Array = [ js: () => import('./performance-profiling/dashboard-performance-profiling.element.js'), weight: 101, meta: { - label: 'Profiling', + label: '#dashboardTabs_settingsProfiler', pathname: 'profiling', }, conditions: [ 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 62024e27f5..fea4b1dd92 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 @@ -7,7 +7,7 @@ export const dashboard: ManifestDashboard = { js: () => import('./umbraco-news-dashboard.element.js'), weight: 20, meta: { - label: 'Welcome', + label: '#dashboardTabs_contentIntro', }, conditions: [ { From 928c38fc7121e6dc263a9b0b0a8efcf61506fe2a Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Mon, 8 Apr 2024 17:15:57 +0200 Subject: [PATCH 172/280] revert backoffice element and let it be the host of entrypoints --- .../src/apps/backoffice/backoffice.element.ts | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) 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 a0d998a91f..672117fa16 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 @@ -1,7 +1,11 @@ import { UmbBackofficeContext } from './backoffice.context.js'; import { css, html, customElement } from '@umbraco-cms/backoffice/external/lit'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; -import { UmbServerExtensionRegistrator } from '@umbraco-cms/backoffice/extension-api'; +import { + UmbBundleExtensionInitializer, + UmbEntryPointExtensionInitializer, + UmbServerExtensionRegistrator, +} from '@umbraco-cms/backoffice/extension-api'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import './components/index.js'; @@ -37,10 +41,20 @@ const CORE_PACKAGES = [ @customElement('umb-backoffice') export class UmbBackofficeElement extends UmbLitElement { + /** + * Backoffice extension registry. + * This enables to register and unregister extensions via DevTools, or just via querying this element via the DOM. + */ + public extensionRegistry = umbExtensionsRegistry; + constructor() { super(); new UmbBackofficeContext(this); + + new UmbBundleExtensionInitializer(this, umbExtensionsRegistry); + new UmbEntryPointExtensionInitializer(this, umbExtensionsRegistry); + new UmbServerExtensionRegistrator(this, umbExtensionsRegistry).registerPrivateExtensions(); // So far local packages are this simple to registerer, so no need for a manager to do that: From 619bb1e1fdabb54403fe84da0984bebb53e461b0 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Mon, 8 Apr 2024 17:16:47 +0200 Subject: [PATCH 173/280] load the core package entrypoint directly to avoid using the entrypoint initializer and thereby affecting all third party entrypoints --- .../src/apps/app/app.element.ts | 26 +++++-------------- 1 file changed, 7 insertions(+), 19 deletions(-) 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 901ab5b0e5..f33d0b672f 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,4 +1,4 @@ -import { extensions as coreExtensions } from '../../packages/core/umbraco-package.js'; +import { onInit } from '../../packages/core/index.js'; import type { UmbAppErrorElement } from './app-error.element.js'; import { UmbAppContext } from './app.context.js'; import { UmbServerConnection } from './server-connection.js'; @@ -13,22 +13,11 @@ import type { Guard, UmbRoute } from '@umbraco-cms/backoffice/router'; import { pathWithoutBasePath } from '@umbraco-cms/backoffice/router'; import { OpenAPI, RuntimeLevelModel } from '@umbraco-cms/backoffice/external/backend-api'; import { UmbContextDebugController } from '@umbraco-cms/backoffice/debug'; -import { - UmbBundleExtensionInitializer, - UmbEntryPointExtensionInitializer, - UmbServerExtensionRegistrator, -} from '@umbraco-cms/backoffice/extension-api'; +import { UmbServerExtensionRegistrator } from '@umbraco-cms/backoffice/extension-api'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; @customElement('umb-app') export class UmbAppElement extends UmbLitElement { - /** - * Backoffice extension registry. - * This enables to register and unregister extensions via DevTools, or just via querying this element via the DOM. - * @type {UmbExtensionsRegistry} - */ - public extensionRegistry = umbExtensionsRegistry; - /** * The base URL of the configured Umbraco server. * @@ -87,11 +76,6 @@ export class UmbAppElement extends UmbLitElement { new UUIIconRegistryEssential().attach(this); new UmbContextDebugController(this); - - new UmbBundleExtensionInitializer(this, umbExtensionsRegistry); - new UmbEntryPointExtensionInitializer(this, umbExtensionsRegistry); - - umbExtensionsRegistry.registerMany(coreExtensions); } connectedCallback(): void { @@ -105,6 +89,10 @@ export class UmbAppElement extends UmbLitElement { this.#authContext = new UmbAuthContext(this, this.serverUrl, this.backofficePath, this.bypassAuth); new UmbAppContext(this, { backofficePath: this.backofficePath, serverUrl: this.serverUrl }); + // Register Core extensions + onInit(this, umbExtensionsRegistry); + + // Register public extensions await new UmbServerExtensionRegistrator(this, umbExtensionsRegistry).registerPublicExtensions(); // Try to initialise the auth flow and get the runtime status @@ -202,7 +190,7 @@ export class UmbAppElement extends UmbLitElement { } #isAuthorizedGuard(): Guard { - return () => this.#authController?.isAuthorized() ?? false; + return () => this.#authController.isAuthorized() ?? false; } #errorPage(errorMsg: string, error?: unknown) { From 7aaeeadb7c5c0d64c2602fb7595c95a5bf16b5f4 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 8 Apr 2024 18:56:22 +0200 Subject: [PATCH 174/280] add localize string to entity action manifests --- .../src/assets/lang/en-us.ts | 60 ++++++++++--------- .../common/delete/delete.action.kind.ts | 2 +- .../common/duplicate/duplicate.action.kind.ts | 2 +- .../common/move/move.action.kind.ts | 2 +- .../sort-children-of.action.kind.ts | 2 +- .../common/trash/trash.action.kind.ts | 2 +- .../rename/rename-server-file.action.kind.ts | 2 +- .../create-folder.action.kind.ts | 2 +- .../delete-folder.action.kind.ts | 2 +- .../update-folder.action.kind.ts | 2 +- .../reload-tree-item-children.action.kind.ts | 2 +- .../entity-actions/create/manifests.ts | 4 +- .../reload-tree-item-children/manifests.ts | 1 - .../dictionary/entity-action/manifests.ts | 6 +- .../entity-actions/create/manifests.ts | 2 +- .../entity-actions/create/manifests.ts | 2 +- .../culture-and-hostnames/manifests.ts | 2 +- .../documents/entity-actions/manifests.ts | 10 ++-- .../entity-actions/public-access/manifests.ts | 4 +- .../language/entity-actions/manifests.ts | 2 +- .../entity-actions/create/manifests.ts | 2 +- .../media/entity-actions/create/manifests.ts | 2 +- .../member-type/entity-actions/manifests.ts | 2 +- .../entity-actions/create/manifests.ts | 2 +- .../entity-actions/create/manifests.ts | 2 +- .../entity-actions/create/manifests.ts | 2 +- .../templates/entity-actions/manifests.ts | 2 +- .../user/user/entity-actions/manifests.ts | 10 ++-- .../user/invite/entity-action/manifests.ts | 2 +- 29 files changed, 72 insertions(+), 67 deletions(-) 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 40987bee26..5a1f48c0a4 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 @@ -5,61 +5,66 @@ export default { assigndomain: 'Culture and Hostnames', auditTrail: 'Audit Trail', browse: 'Browse Node', - changeDocType: 'Change Document Type', changeDataType: 'Change Data Type', - copy: 'Copy', + changeDocType: 'Change Document Type', + chooseWhereToCopy: 'Choose where to copy', + chooseWhereToImport: 'Choose where to import', + chooseWhereToMove: 'Choose where to move', + copy: 'Copy to', create: 'Create', - export: 'Export', - createPackage: 'Create Package', + createblueprint: 'Create Document Blueprint', createGroup: 'Create group', + createPackage: 'Create Package', delete: 'Delete', + deployCompare: 'Compare', + deployPartialRestore: 'Partial restore', + deployQueueForTransfer: 'Queue for transfer', + deployRestore: 'Workspace restore', + deployTransferNow: 'Transfer now', + deployTreeRestore: 'Tree restore', disable: 'Disable', editContent: 'Edit content', editSettings: 'Edit settings', emptyrecyclebin: 'Empty recycle bin', enable: 'Enable', + export: 'Export', exportDocumentType: 'Export Document Type', + folderCreate: 'Create folder', + folderDelete: 'Delete folder', + folderRename: 'Rename folder', + import: 'Import', importdocumenttype: 'Import Document Type', importPackage: 'Import Package', + infiniteEditorChooseWhereToCopy: 'Choose where to copy the selected item(s)', + infiniteEditorChooseWhereToMove: 'Choose where to move the selected item(s)', liveEdit: 'Edit in Canvas', logout: 'Exit', - move: 'Move', + move: 'Move to', notify: 'Notifications', protect: 'Restrict Public Access', publish: 'Publish', - unpublish: 'Unpublish', refreshNode: 'Reload', - republish: 'Republish entire site', remove: 'Remove', rename: 'Rename', + republish: 'Republish entire site', + resendInvite: 'Resend Invitation', restore: 'Restore', - chooseWhereToCopy: 'Choose where to copy', - chooseWhereToMove: 'Choose where to move', - chooseWhereToImport: 'Choose where to import', - toInTheTreeStructureBelow: 'to in the tree structure below', - infiniteEditorChooseWhereToCopy: 'Choose where to copy the selected item(s)', - infiniteEditorChooseWhereToMove: 'Choose where to move the selected item(s)', - wasMovedTo: 'was moved to', - wasCopiedTo: 'was copied to', - wasDeleted: 'was deleted', rights: 'Permissions', rollback: 'Rollback', sendtopublish: 'Send To Publish', sendToTranslate: 'Send To Translation', setGroup: 'Set group', - sort: 'Sort', - translate: 'Translate', - update: 'Update', setPermissions: 'Set permissions', + sort: 'Sort children of', + toInTheTreeStructureBelow: 'to in the tree structure below', + translate: 'Translate', + trash: 'Trash', unlock: 'Unlock', - createblueprint: 'Create Document Blueprint', - resendInvite: 'Resend Invitation', - deployQueueForTransfer: 'Queue for transfer', - deployRestore: 'Workspace restore', - deployTreeRestore: 'Tree restore', - deployPartialRestore: 'Partial restore', - deployTransferNow: 'Transfer now', - deployCompare: 'Compare', + unpublish: 'Unpublish', + update: 'Update', + wasCopiedTo: 'was copied to', + wasDeleted: 'was deleted', + wasMovedTo: 'was moved to', }, actionCategories: { content: 'Content', @@ -1800,6 +1805,7 @@ export default { createDate: 'User created', changePassword: 'Change your password', changePhoto: 'Change photo', + configureMfa: 'Configure MFA', emailRequired: 'Required - enter an email address for this user', newPassword: 'New password', newPasswordFormatLengthTip: 'Minimum %0% character(s) to go!', diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/delete/delete.action.kind.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/delete/delete.action.kind.ts index bf2f0136f6..6e386576d1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/delete/delete.action.kind.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/delete/delete.action.kind.ts @@ -15,7 +15,7 @@ export const manifest: UmbBackofficeManifestKind = { forEntityTypes: [], meta: { icon: 'icon-trash', - label: 'Delete...', + label: '#actions_delete', itemRepositoryAlias: '', detailRepositoryAlias: '', }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/duplicate/duplicate.action.kind.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/duplicate/duplicate.action.kind.ts index 0174d495ef..051ebdde0b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/duplicate/duplicate.action.kind.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/duplicate/duplicate.action.kind.ts @@ -15,7 +15,7 @@ export const manifest: UmbBackofficeManifestKind = { forEntityTypes: [], meta: { icon: 'icon-documents', - label: 'Duplicate to...', + label: '#actions_copy', itemRepositoryAlias: '', duplicateRepositoryAlias: '', pickerModal: '', diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/move.action.kind.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/move.action.kind.ts index a872359e9f..09b3fb9010 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/move.action.kind.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/move/move.action.kind.ts @@ -15,7 +15,7 @@ export const manifest: UmbBackofficeManifestKind = { forEntityTypes: [], meta: { icon: 'icon-enter', - label: 'Move to (TBD)...', + label: '#actions_move', itemRepositoryAlias: '', moveRepositoryAlias: '', pickerModal: '', diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/sort-children-of/sort-children-of.action.kind.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/sort-children-of/sort-children-of.action.kind.ts index 42dab12acb..3845a19139 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/sort-children-of/sort-children-of.action.kind.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/sort-children-of/sort-children-of.action.kind.ts @@ -15,7 +15,7 @@ export const manifest: UmbBackofficeManifestKind = { forEntityTypes: [], meta: { icon: 'icon-height', - label: 'Sort Children...', + label: '#actions_sort', itemRepositoryAlias: '', sortRepositoryAlias: '', }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/trash/trash.action.kind.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/trash/trash.action.kind.ts index beb3103a7b..82f5511ddf 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/trash/trash.action.kind.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/common/trash/trash.action.kind.ts @@ -15,7 +15,7 @@ export const manifest: UmbBackofficeManifestKind = { forEntityTypes: [], meta: { icon: 'icon-trash', - label: 'Trash', + label: '#actions_trash', itemRepositoryAlias: '', trashRepositoryAlias: '', }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/server-file-system/rename/rename-server-file.action.kind.ts b/src/Umbraco.Web.UI.Client/src/packages/core/server-file-system/rename/rename-server-file.action.kind.ts index 7af4436044..f54bb2417c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/server-file-system/rename/rename-server-file.action.kind.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/server-file-system/rename/rename-server-file.action.kind.ts @@ -15,7 +15,7 @@ export const manifest: UmbBackofficeManifestKind = { forEntityTypes: [], meta: { icon: 'icon-edit', - label: 'Rename...', + label: '#actions_rename', renameRepositoryAlias: '', itemRepositoryAlias: '', }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/folder/entity-action/create-folder/create-folder.action.kind.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/folder/entity-action/create-folder/create-folder.action.kind.ts index 4a03faa74f..6d3ec770bf 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/folder/entity-action/create-folder/create-folder.action.kind.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/folder/entity-action/create-folder/create-folder.action.kind.ts @@ -16,7 +16,7 @@ export const manifest: UmbBackofficeManifestKind = { forEntityTypes: [], meta: { icon: 'icon-add', - label: 'Create folder...', + label: '#actions_folderCreate', }, }, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/folder/entity-action/delete-folder/delete-folder.action.kind.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/folder/entity-action/delete-folder/delete-folder.action.kind.ts index a737db6ff2..30677f4ba5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/folder/entity-action/delete-folder/delete-folder.action.kind.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/folder/entity-action/delete-folder/delete-folder.action.kind.ts @@ -16,7 +16,7 @@ export const manifest: UmbBackofficeManifestKind = { forEntityTypes: [], meta: { icon: 'icon-trash', - label: 'Delete Folder...', + label: '#actions_folderDelete', }, }, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/folder/entity-action/update-folder/update-folder.action.kind.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/folder/entity-action/update-folder/update-folder.action.kind.ts index a7390e4da4..39f62fcb10 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/folder/entity-action/update-folder/update-folder.action.kind.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/folder/entity-action/update-folder/update-folder.action.kind.ts @@ -16,7 +16,7 @@ export const manifest: UmbBackofficeManifestKind = { forEntityTypes: [], meta: { icon: 'icon-edit', - label: 'Rename Folder...', + label: '#actions_folderRename', }, }, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/reload-tree-item-children/reload-tree-item-children.action.kind.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/reload-tree-item-children/reload-tree-item-children.action.kind.ts index 87e817a078..56906b23a9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/reload-tree-item-children/reload-tree-item-children.action.kind.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/reload-tree-item-children/reload-tree-item-children.action.kind.ts @@ -15,7 +15,7 @@ export const manifest: UmbBackofficeManifestKind = { forEntityTypes: [], meta: { icon: 'icon-refresh', - label: 'Reload children', + label: '#actions_refreshNode', }, }, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/create/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/create/manifests.ts index b4ecb39f47..69a757fac4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/create/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/create/manifests.ts @@ -5,7 +5,7 @@ import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; const entityActions: Array = [ { type: 'entityAction', - kind: 'delete', + kind: 'default', alias: 'Umb.EntityAction.DataType.Create', name: 'Create Data Type Entity Action', weight: 1000, @@ -13,7 +13,7 @@ const entityActions: Array = [ forEntityTypes: [UMB_DATA_TYPE_ROOT_ENTITY_TYPE, UMB_DATA_TYPE_FOLDER_ENTITY_TYPE], meta: { icon: 'icon-add', - label: 'Create...', + label: '#actions_create', }, }, { diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/reload-tree-item-children/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/reload-tree-item-children/manifests.ts index cf276f7dc6..c2a2ff3859 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/reload-tree-item-children/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/reload-tree-item-children/manifests.ts @@ -8,6 +8,5 @@ export const manifests: Array = [ alias: 'Umb.EntityAction.DataType.Tree.ReloadChildrenOf', name: 'Reload Data Type Tree Item Children Entity Action', forEntityTypes: [UMB_DATA_TYPE_ROOT_ENTITY_TYPE, UMB_DATA_TYPE_FOLDER_ENTITY_TYPE], - meta: {}, }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/entity-action/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/entity-action/manifests.ts index e3503e1c88..e331dd3d01 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/dictionary/entity-action/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/entity-action/manifests.ts @@ -13,7 +13,7 @@ const entityActions: Array = [ forEntityTypes: [UMB_DICTIONARY_ENTITY_TYPE, UMB_DICTIONARY_ROOT_ENTITY_TYPE], meta: { icon: 'icon-add', - label: 'Create', + label: '#dictionary_createNew', }, }, { @@ -36,7 +36,7 @@ const entityActions: Array = [ forEntityTypes: [UMB_DICTIONARY_ENTITY_TYPE], meta: { icon: 'icon-download-alt', - label: 'Export', + label: '#actions_export', }, }, { @@ -49,7 +49,7 @@ const entityActions: Array = [ forEntityTypes: [UMB_DICTIONARY_ENTITY_TYPE, UMB_DICTIONARY_ROOT_ENTITY_TYPE], meta: { icon: 'icon-page-up', - label: 'Import', + label: '#actions_import', }, }, { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/create/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/create/manifests.ts index e22aaa3ac6..fcea8dd858 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/create/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/entity-actions/create/manifests.ts @@ -21,7 +21,7 @@ const entityActions: Array = [ ], meta: { icon: 'icon-add', - label: 'Create...', + label: '#actions_create', }, }, { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create/manifests.ts index 844d5dd2ff..db6c6478f7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create/manifests.ts @@ -12,7 +12,7 @@ const entityActions: Array = [ forEntityTypes: [UMB_DOCUMENT_ROOT_ENTITY_TYPE, UMB_DOCUMENT_ENTITY_TYPE], meta: { icon: 'icon-add', - label: 'Create...', + label: '#actions_create', }, }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/culture-and-hostnames/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/culture-and-hostnames/manifests.ts index 76f0b2f269..7a74ff3ef1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/culture-and-hostnames/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/culture-and-hostnames/manifests.ts @@ -13,7 +13,7 @@ const entityActions: Array = [ forEntityTypes: [UMB_DOCUMENT_ENTITY_TYPE], meta: { icon: 'icon-home', - label: 'Culture and Hostnames...', + label: '#actions_assigndomain', }, }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts index 3d5c84ca4c..1db66fe1de 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts @@ -31,7 +31,7 @@ const entityActions: Array = [ forEntityTypes: [UMB_DOCUMENT_ENTITY_TYPE], meta: { icon: 'icon-blueprint', - label: 'Create Document Blueprint (TBD)', + label: '#actions_createblueprint', }, }, { @@ -70,7 +70,7 @@ const entityActions: Array = [ forEntityTypes: [UMB_DOCUMENT_ENTITY_TYPE], meta: { icon: 'icon-globe', - label: 'Publish', + label: '#actions_publish', }, }, { @@ -83,7 +83,7 @@ const entityActions: Array = [ forEntityTypes: [UMB_DOCUMENT_ENTITY_TYPE], meta: { icon: 'icon-globe', - label: 'Unpublish...', + label: '#actions_unpublish', }, }, { @@ -96,7 +96,7 @@ const entityActions: Array = [ api: () => import('./permissions.action.js'), meta: { icon: 'icon-name-badge', - label: 'Permissions...', + label: '#actions_setPermissions', }, }, { @@ -109,7 +109,7 @@ const entityActions: Array = [ api: () => import('./permissions.action.js'), meta: { icon: 'icon-megaphone', - label: 'Notifications...', + label: '#actions_notify', }, }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/manifests.ts index 6fafa57fb6..3f7b69c528 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/manifests.ts @@ -7,13 +7,13 @@ const entityActions: Array = [ type: 'entityAction', kind: 'default', alias: 'Umb.EntityAction.Document.PublicAccess', - name: 'Document Permissions Entity Action', + name: 'Document Public Access Entity Action', weight: 200, api: UmbDocumentPublicAccessEntityAction, forEntityTypes: [UMB_DOCUMENT_ENTITY_TYPE], meta: { icon: 'icon-lock', - label: 'Restrict Public Access...', + label: '#actions_protect', }, }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/language/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/language/entity-actions/manifests.ts index e1f0f005cb..cfb8a2c75e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/language/entity-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/language/entity-actions/manifests.ts @@ -25,7 +25,7 @@ const entityActions: Array = [ forEntityTypes: [UMB_LANGUAGE_ROOT_ENTITY_TYPE], meta: { icon: 'icon-add', - label: 'Create', + label: '#actions_create', }, }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/entity-actions/create/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/entity-actions/create/manifests.ts index 950ba4c98f..e47997e8ee 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/entity-actions/create/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/entity-actions/create/manifests.ts @@ -17,7 +17,7 @@ const entityActions: Array = [ forEntityTypes: [UMB_MEDIA_TYPE_ENTITY_TYPE, UMB_MEDIA_TYPE_ROOT_ENTITY_TYPE, UMB_MEDIA_TYPE_FOLDER_ENTITY_TYPE], meta: { icon: 'icon-add', - label: 'Create...', + label: '#actions_create', }, }, { diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/create/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/create/manifests.ts index 01adf09894..6d961309f3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/create/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/create/manifests.ts @@ -13,7 +13,7 @@ const entityActions: Array = [ forEntityTypes: [UMB_MEDIA_ROOT_ENTITY_TYPE, UMB_MEDIA_ENTITY_TYPE], meta: { icon: 'icon-add', - label: 'Create', + label: '#actions_create', }, }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/manifests.ts index 177b69c006..1af70b700e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/entity-actions/manifests.ts @@ -15,7 +15,7 @@ const entityActions: Array = [ forEntityTypes: [UMB_MEMBER_TYPE_ROOT_ENTITY_TYPE], meta: { icon: 'icon-add', - label: 'Create...', + label: '#actions_create', }, }, { diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/entity-actions/create/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/entity-actions/create/manifests.ts index da6fef2722..91977b42b3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/entity-actions/create/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/entity-actions/create/manifests.ts @@ -13,7 +13,7 @@ export const manifests: Array = [ forEntityTypes: [UMB_PARTIAL_VIEW_ROOT_ENTITY_TYPE, UMB_PARTIAL_VIEW_FOLDER_ENTITY_TYPE], meta: { icon: 'icon-add', - label: 'Create...', + label: '#actions_create', }, }, { diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/entity-actions/create/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/entity-actions/create/manifests.ts index 1c8c5aa5da..4b9b260cf4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/entity-actions/create/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/entity-actions/create/manifests.ts @@ -13,7 +13,7 @@ export const manifests: Array = [ forEntityTypes: [UMB_SCRIPT_ROOT_ENTITY_TYPE, UMB_SCRIPT_FOLDER_ENTITY_TYPE], meta: { icon: 'icon-add', - label: 'Create...', + label: '#actions_create', }, }, { diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-actions/create/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-actions/create/manifests.ts index df096e95f5..b0b1c1903f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-actions/create/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-actions/create/manifests.ts @@ -13,7 +13,7 @@ export const manifests: Array = [ forEntityTypes: [UMB_STYLESHEET_ROOT_ENTITY_TYPE, UMB_STYLESHEET_FOLDER_ENTITY_TYPE], meta: { icon: 'icon-add', - label: 'Create...', + label: '#actions_create', }, }, { diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/entity-actions/manifests.ts index 701e5606e7..f7ec206706 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/entity-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/entity-actions/manifests.ts @@ -13,7 +13,7 @@ const entityActions: Array = [ forEntityTypes: [UMB_TEMPLATE_ENTITY_TYPE, UMB_TEMPLATE_ROOT_ENTITY_TYPE], meta: { icon: 'icon-add', - label: 'Create', + label: '#actions_create', }, }, { 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 a8200fddfc..6e6b8d2f63 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 @@ -34,7 +34,7 @@ const entityActions: Array = [ forEntityTypes: [UMB_USER_ENTITY_TYPE], meta: { icon: 'icon-check', - label: 'Enable', + label: '#actions_enable', }, conditions: [ { @@ -52,7 +52,7 @@ const entityActions: Array = [ forEntityTypes: [UMB_USER_ENTITY_TYPE], meta: { icon: 'icon-block', - label: 'Disable', + label: '#actions_disable', }, conditions: [ { @@ -70,7 +70,7 @@ const entityActions: Array = [ forEntityTypes: [UMB_USER_ENTITY_TYPE], meta: { icon: 'icon-key', - label: 'Change Password', + label: '#user_changePassword', }, }, { @@ -83,7 +83,7 @@ const entityActions: Array = [ forEntityTypes: [UMB_USER_ENTITY_TYPE], meta: { icon: 'icon-unlocked', - label: 'Unlock', + label: '#actions_unlock', }, conditions: [ { @@ -101,7 +101,7 @@ const entityActions: Array = [ forEntityTypes: [UMB_USER_ENTITY_TYPE], meta: { icon: 'icon-settings', - label: 'Configure Two-Factor', + label: '#user_configureMfa', }, conditions: [ { 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 bfce6da496..f2b7db505e 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 @@ -14,7 +14,7 @@ const entityActions: Array = [ forEntityTypes: [UMB_USER_ENTITY_TYPE], meta: { icon: 'icon-message', - label: 'Resend Invite', + label: '#actions_resendInvite', }, conditions: [ { From 12ec793d176c6ed0d80f2b5f1c17473116368b6a Mon Sep 17 00:00:00 2001 From: JesmoDev <26099018+JesmoDev@users.noreply.github.com> Date: Mon, 8 Apr 2024 19:03:51 +0200 Subject: [PATCH 175/280] fix invariant --- .../documents/modals/rollback/rollback-modal.element.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts index c394afcf9b..5a7754397a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts @@ -138,7 +138,7 @@ export class UmbRollbackModalElement extends UmbModalBaseElement x.culture === this.currentCulture)?.name || data.variants[0].name, id: data.id, properties: data.values - .filter((x) => x.culture === this.currentCulture) + .filter((x) => x.culture === this.currentCulture || !x.culture) // When invariant, culture is undefined or null. .map((value: any) => { return { alias: value.alias, From d742dbbf5224bc5eca8efe9ff6f976eb4a605b6a Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 8 Apr 2024 19:04:04 +0200 Subject: [PATCH 176/280] add method to localize string with hashes --- .../localization-api/localization.controller.ts | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.controller.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.controller.ts index 9706aa8272..49691db7e7 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.controller.ts @@ -159,4 +159,18 @@ export class UmbLocalizationController { + const key = match.slice(1); + const localized = this.term(key); + // we didn't find a localized string, so we return the original string with the # + return localized === key ? match : localized; + }); + + return localizedText; + } } From ee20c9e0183f66f62e6b9c8ccde9aa11ec83de9b Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 8 Apr 2024 19:04:17 +0200 Subject: [PATCH 177/280] localize dashboard labels --- .../section-main-views/section-main-views.element.ts | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/section/section-main-views/section-main-views.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/section/section-main-views/section-main-views.element.ts index c8d639e8e7..023f3a450d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/section/section-main-views/section-main-views.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/section/section-main-views/section-main-views.element.ts @@ -97,7 +97,7 @@ export class UmbSectionMainViewElement extends UmbLitElement { }}> - ` + ` : html`${nothing}`; } @@ -107,17 +107,16 @@ export class UmbSectionMainViewElement extends UmbLitElement { ? html` ${this._dashboards.map((dashboard) => { - const dashboardName = dashboard.meta.label ?? dashboard.name; const dashboardPath = this.#constructDashboardPath(dashboard); return html` `; })} - ` + ` : ''; } @@ -140,7 +139,7 @@ export class UmbSectionMainViewElement extends UmbLitElement { `; })} - ` + ` : ''; } From 0daab7023fcb0a7f2dd95c9ad719e9dc7554963f Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 8 Apr 2024 19:07:12 +0200 Subject: [PATCH 178/280] add keys to section manifests --- .../src/packages/core/settings/manifests.ts | 2 +- .../src/packages/dictionary/section/manifests.ts | 2 +- .../src/packages/documents/section.manifests.ts | 2 +- .../src/packages/media/section.manifests.ts | 2 +- .../src/packages/members/member-section/manifests.ts | 2 +- .../src/packages/packages/package-section/manifests.ts | 2 +- .../src/packages/user/user-section/manifests.ts | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/settings/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/settings/manifests.ts index 73f0a117b6..803d177dbe 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/settings/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/settings/manifests.ts @@ -9,7 +9,7 @@ export const manifests = [ name: 'Settings Section', weight: 400, meta: { - label: 'Settings', + label: '#sections_settings', pathname: 'settings', }, conditions: [ diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/section/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/section/manifests.ts index 9baccac979..2ae5954eab 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/dictionary/section/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/section/manifests.ts @@ -10,7 +10,7 @@ const section: ManifestSection = { name: 'Dictionary Section', weight: 100, meta: { - label: 'Dictionary', + label: '#sections_translation', pathname: 'dictionary', }, conditions: [ diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/section.manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/section.manifests.ts index 81a84ad864..bba5937c6b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/section.manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/section.manifests.ts @@ -12,7 +12,7 @@ const section: ManifestSection = { name: 'Content Section', weight: 600, meta: { - label: 'Content', + label: '#sections_content', pathname: 'content', }, conditions: [ diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/section.manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/media/section.manifests.ts index e06de6f026..3981df871d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/section.manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/section.manifests.ts @@ -9,7 +9,7 @@ const section: ManifestSection = { name: 'Media Section', weight: 500, meta: { - label: 'Media', + label: '#sections_media', pathname: 'media', }, conditions: [ diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-section/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-section/manifests.ts index 9b9ffe225e..368ad7f0d3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-section/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-section/manifests.ts @@ -6,7 +6,7 @@ const section: ManifestSection = { name: 'Members Section', weight: 300, meta: { - label: 'Members', + label: '#sections_member', pathname: 'member-management', }, conditions: [ diff --git a/src/Umbraco.Web.UI.Client/src/packages/packages/package-section/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/packages/package-section/manifests.ts index 6667d5cbd2..7d33c33694 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/packages/package-section/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/packages/package-section/manifests.ts @@ -8,7 +8,7 @@ const section: ManifestSection = { name: 'Packages Section', weight: 200, meta: { - label: 'Packages', + label: '#sections_packages', pathname: 'packages', }, conditions: [ diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-section/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-section/manifests.ts index 72f444e0b0..2a5b10ef93 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-section/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-section/manifests.ts @@ -8,7 +8,7 @@ const section: ManifestSection = { name: 'User Management Section', weight: 100, meta: { - label: 'Users', + label: '#sections_users', pathname: 'user-management', }, conditions: [ From f96f7850c2053cc6c6da0d6ae360a5cae33471e4 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 8 Apr 2024 19:11:10 +0200 Subject: [PATCH 179/280] localize entity action label --- .../core/entity-action/default/entity-action.element.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/default/entity-action.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/default/entity-action.element.ts index e0c639c52c..de1f6cab4e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/default/entity-action.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/entity-action/default/entity-action.element.ts @@ -53,7 +53,9 @@ export class UmbEntityActionElement< render() { return html` From b1dd3f566676aaf9241d833821bba21b75230030 Mon Sep 17 00:00:00 2001 From: JesmoDev <26099018+JesmoDev@users.noreply.github.com> Date: Mon, 8 Apr 2024 19:18:05 +0200 Subject: [PATCH 180/280] use correct variants --- .../modals/rollback/rollback-modal.element.ts | 27 ++++++------------- 1 file changed, 8 insertions(+), 19 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts index 5a7754397a..7995d1edc4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts @@ -2,7 +2,7 @@ import { UMB_DOCUMENT_WORKSPACE_CONTEXT } from '../../workspace/index.js'; import type { UmbRollbackModalData, UmbRollbackModalValue } from './rollback-modal.token.js'; import { UmbRollbackRepository } from './repository/rollback.repository.js'; import { diffWords } from '@umbraco-cms/backoffice/external/diff'; -import { css, customElement, html, repeat, state } from '@umbraco-cms/backoffice/external/lit'; +import { css, customElement, html, nothing, repeat, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; @@ -10,7 +10,6 @@ import '../shared/document-variant-language-picker.element.js'; import { UmbUserItemRepository } from '@umbraco-cms/backoffice/user'; import { UMB_PROPERTY_DATASET_CONTEXT } from '@umbraco-cms/backoffice/property'; import type { UUISelectEvent } from '@umbraco-cms/backoffice/external/uui'; -import { UMB_VARIANT_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/workspace'; type DocumentVersion = { id: string; @@ -41,10 +40,7 @@ export class UmbRollbackModalElement extends UmbModalBaseElement { this.#workspaceContext = instance; - }); - this.consumeContext(UMB_VARIANT_WORKSPACE_CONTEXT, (instance) => { - this.#variantWorkspaceContext = instance; - - // TODO: For some reason TS cant find languages on the context - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - instance.languages.subscribe((languages) => { - this.availableVariants = languages.map((language: any) => { + this.observe(instance.variantOptions, (options) => { + this.availableVariants = options.map((option) => { return { - name: language.name, - value: language.unique, - selected: language.unique === this.currentCulture, + name: option.language.name, + value: option.language.unique, + selected: option.language.unique === this.currentCulture, }; }); }); @@ -190,6 +178,7 @@ export class UmbRollbackModalElement extends UmbModalBaseElement Language From b6c789001175baf617aa1a8c0123dbf9050895ed Mon Sep 17 00:00:00 2001 From: JesmoDev <26099018+JesmoDev@users.noreply.github.com> Date: Mon, 8 Apr 2024 19:31:46 +0200 Subject: [PATCH 181/280] fix invariant --- .../documents/modals/rollback/rollback-modal.element.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts index 7995d1edc4..260d3a7d9d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts @@ -222,7 +222,7 @@ export class UmbRollbackModalElement extends UmbModalBaseElement) ?? []; - draftValues = draftValues.filter((x) => x.culture === this.currentCulture); + draftValues = draftValues.filter((x) => x.culture === this.currentCulture || !x.culture); // When invariant, culture is undefined or null. const diffs = this.currentVersion.properties.map((item) => { const draftValue = draftValues.find((x) => x.alias === item.alias); From 33259bfdba6abca8eaf9a0a02dcf899026f96ed2 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 8 Apr 2024 20:15:26 +0200 Subject: [PATCH 182/280] add key to workspace views --- src/Umbraco.Web.UI.Client/src/assets/lang/en-us.ts | 1 + .../workspace/views/manifests.ts | 2 +- .../block/block-grid/workspace/views/manifests.ts | 6 +++--- .../block/block-list/workspace/views/manifests.ts | 2 +- .../block/block-rte/workspace/views/manifests.ts | 2 +- .../packages/block/block/workspace/manifests.ts | 4 ++-- .../workspace/views/design/manifest.ts | 2 +- .../src/packages/data-type/workspace/manifests.ts | 6 +++--- .../src/packages/dictionary/workspace/manifests.ts | 2 +- .../document-types/workspace/manifests.ts | 10 +++++----- .../documents/documents/workspace/manifests.ts | 14 +++++++------- .../language/workspace/language/manifests.ts | 4 ++-- .../src/packages/log-viewer/workspace/manifests.ts | 2 +- .../media/media-types/workspace/manifests.ts | 6 +++--- .../packages/media/media/workspace/manifests.ts | 6 +++--- .../members/member-group/workspace/manifests.ts | 2 +- .../members/member-type/workspace/manifests.ts | 4 ++-- .../packages/members/member/workspace/manifests.ts | 2 +- .../workspace/relation-type/manifests.ts | 2 +- .../templating/stylesheets/workspace/manifests.ts | 6 +++--- 20 files changed, 43 insertions(+), 42 deletions(-) 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 5a1f48c0a4..00ce18b31c 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 @@ -750,6 +750,7 @@ export default { deleted: 'Deleted', deleting: 'Deleting...', design: 'Design', + details: 'Details', dictionary: 'Dictionary', dimensions: 'Dimensions', discard: 'Discard', diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/components/block-grid-area-config-entry/workspace/views/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/components/block-grid-area-config-entry/workspace/views/manifests.ts index c92f2b2d77..0e8e9ccd27 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/components/block-grid-area-config-entry/workspace/views/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/components/block-grid-area-config-entry/workspace/views/manifests.ts @@ -9,7 +9,7 @@ export const workspaceViews: Array = [ js: () => import('./settings.element.js'), weight: 1000, meta: { - label: 'Settings', + label: '#general_settings', pathname: 'settings', icon: 'icon-settings', }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/workspace/views/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/workspace/views/manifests.ts index 57f890ed14..793f06141d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/workspace/views/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/workspace/views/manifests.ts @@ -9,7 +9,7 @@ export const workspaceViews: Array = [ js: () => import('./block-grid-type-workspace-view-settings.element.js'), weight: 1000, meta: { - label: 'Settings', + label: '#general_settings', pathname: 'settings', icon: 'icon-settings', }, @@ -27,7 +27,7 @@ export const workspaceViews: Array = [ js: () => import('./block-grid-type-workspace-view-areas.element.js'), weight: 1000, meta: { - label: 'Areas', + label: '#blockEditor_areas', pathname: 'areas', icon: 'icon-grid', }, @@ -45,7 +45,7 @@ export const workspaceViews: Array = [ js: () => import('./block-grid-type-workspace-view-advanced.element.js'), weight: 1000, meta: { - label: 'Advanced', + label: '#blockEditor_tabAreas', pathname: 'advanced', icon: 'icon-wrench', }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-list/workspace/views/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-list/workspace/views/manifests.ts index 03b003709b..1774211ed4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-list/workspace/views/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-list/workspace/views/manifests.ts @@ -9,7 +9,7 @@ export const workspaceViews: Array = [ js: () => import('./block-list-type-workspace-view.element.js'), weight: 1000, meta: { - label: 'Settings', + label: '#blockEditor_tabBlockSettings', pathname: 'settings', icon: 'icon-settings', }, 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 e574f7aa62..b94ed190cf 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 @@ -9,7 +9,7 @@ export const workspaceViews: Array = [ js: () => import('./block-rte-type-workspace-view.element.js'), weight: 1000, meta: { - label: 'Settings', + label: '#general_settings', pathname: 'settings', icon: 'icon-settings', }, 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 index bc76264f4d..3567aa784c 100644 --- 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 @@ -38,7 +38,7 @@ export const manifests: Array = [ js: () => import('./views/edit/block-workspace-view-edit.element.js'), weight: 1000, meta: { - label: 'Content', + label: '#general_content', pathname: 'content', icon: 'icon-document', blockElementManagerName: 'content', @@ -63,7 +63,7 @@ export const manifests: Array = [ js: () => import('./views/edit/block-workspace-view-edit.element.js'), weight: 1000, meta: { - label: 'Settings', + label: '#general_settings', pathname: 'settings', icon: 'icon-settings', blockElementManagerName: 'settings', diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/manifest.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/manifest.ts index 42b52d383f..86a9442024 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/manifest.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/workspace/views/design/manifest.ts @@ -11,7 +11,7 @@ export const contentTypeDesignEditorManifest: UmbBackofficeManifestKind = { element: () => import('./content-type-design-editor.element.js'), weight: 1000, meta: { - label: 'Design', + label: '#general_design', pathname: 'design', icon: 'icon-document-dashed-line', }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/workspace/manifests.ts index 5aa2fda518..39b93bc9a7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/workspace/manifests.ts @@ -26,7 +26,7 @@ const workspaceViews: Array = [ js: () => import('./views/details/data-type-details-workspace-view.element.js'), weight: 90, meta: { - label: 'Details', + label: '#general_details', pathname: 'details', icon: 'edit', }, @@ -44,7 +44,7 @@ const workspaceViews: Array = [ js: () => import('./views/info/workspace-view-data-type-info.element.js'), weight: 90, meta: { - label: 'Info', + label: '#general_info', pathname: 'info', icon: 'info', }, @@ -65,7 +65,7 @@ const workspaceActions: Array = [ name: 'Save Data Type Workspace Action', api: UmbSubmitWorkspaceAction, meta: { - label: 'Save', + label: '#buttons_save', look: 'primary', color: 'positive', }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/workspace/manifests.ts index e889ec34da..dcf75fd076 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/dictionary/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/workspace/manifests.ts @@ -25,7 +25,7 @@ const workspaceViews: Array = [ js: () => import('./views/workspace-view-dictionary-editor.element.js'), weight: 100, meta: { - label: 'Edit', + label: '#general_edit', pathname: 'edit', icon: 'edit', }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/manifests.ts index 7aa4387ada..deaca635a6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/manifests.ts @@ -26,7 +26,7 @@ const workspaceViews: Array = [ alias: 'Umb.WorkspaceView.DocumentType.Design', name: 'Document Type Workspace Design View', meta: { - label: 'Design', + label: '#general_design', pathname: 'design', icon: 'icon-document-dashed-line', compositionRepositoryAlias: UMB_DOCUMENT_TYPE_COMPOSITION_REPOSITORY_ALIAS, @@ -45,7 +45,7 @@ const workspaceViews: Array = [ element: () => import('./views/structure/document-type-workspace-view-structure.element.js'), weight: 800, meta: { - label: 'Structure', + label: '#contentTypeEditor_structure', pathname: 'structure', icon: 'icon-mindmap', }, @@ -63,7 +63,7 @@ const workspaceViews: Array = [ element: () => import('./views/settings/document-type-workspace-view-settings.element.js'), weight: 600, meta: { - label: 'Settings', + label: '#general_settings', pathname: 'settings', icon: 'icon-settings', }, @@ -81,7 +81,7 @@ const workspaceViews: Array = [ element: () => import('./views/templates/document-type-workspace-view-templates.element.js'), weight: 400, meta: { - label: 'Templates', + label: '#treeHeaders_templates', pathname: 'templates', icon: 'icon-layout', }, @@ -102,7 +102,7 @@ const workspaceActions: Array = [ name: 'Save Document Type Workspace Action', api: UmbSubmitWorkspaceAction, meta: { - label: 'Save', + label: '#buttons_save', look: 'primary', color: 'positive', }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/manifests.ts index a46f146d5c..dc5e8493b1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/manifests.ts @@ -52,7 +52,7 @@ const workspaceViews: Array = [ element: () => import('./views/edit/document-workspace-view-edit.element.js'), weight: 200, meta: { - label: 'Content', + label: '#general_content', pathname: 'content', icon: 'document', }, @@ -70,7 +70,7 @@ const workspaceViews: Array = [ element: () => import('./views/info/document-workspace-view-info.element.js'), weight: 100, meta: { - label: 'Info', + label: '#general_info', pathname: 'info', icon: 'info', }, @@ -92,7 +92,7 @@ const workspaceActions: Array = [ weight: 70, api: UmbDocumentSaveAndPublishWorkspaceAction, meta: { - label: 'Save And Publish', + label: '#buttons_saveAndPublish', look: 'primary', color: 'positive', }, @@ -111,7 +111,7 @@ const workspaceActions: Array = [ weight: 80, api: UmbSubmitWorkspaceAction, meta: { - label: 'Save', + label: '#buttons_save', look: 'secondary', color: 'positive', }, @@ -152,7 +152,7 @@ const workspaceActionMenuItems: Array = [ api: UmbDocumentUnpublishWorkspaceAction, forWorkspaceActions: 'Umb.WorkspaceAction.Document.SaveAndPublish', meta: { - label: 'Unpublish...', + label: '#buttons_unpublish', icon: 'icon-globe', }, }, @@ -165,7 +165,7 @@ const workspaceActionMenuItems: Array = [ api: UmbDocumentPublishWithDescendantsWorkspaceAction, forWorkspaceActions: 'Umb.WorkspaceAction.Document.SaveAndPublish', meta: { - label: 'Publish with descendants...', + label: '#buttons_publishWithDescendants', icon: 'icon-globe', }, }, @@ -178,7 +178,7 @@ const workspaceActionMenuItems: Array = [ api: UmbDocumentSaveAndScheduleWorkspaceAction, forWorkspaceActions: 'Umb.WorkspaceAction.Document.SaveAndPublish', meta: { - label: 'Schedule...', + label: '#buttons_schedulePublish', icon: 'icon-globe', }, }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/language/workspace/language/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/language/workspace/language/manifests.ts index 96711c9deb..ce50e15990 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/language/workspace/language/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/language/workspace/language/manifests.ts @@ -24,7 +24,7 @@ const workspaceViews: Array = [ js: () => import('./views/language-details-workspace-view.element.js'), weight: 90, meta: { - label: 'Details', + label: '#general_details', pathname: 'details', icon: 'edit', }, @@ -47,7 +47,7 @@ const workspaceActions: Array = [ meta: { look: 'primary', color: 'positive', - label: 'Save', + label: '#buttons_save', }, conditions: [ { diff --git a/src/Umbraco.Web.UI.Client/src/packages/log-viewer/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/log-viewer/workspace/manifests.ts index 22154a19b6..b1076a052c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/log-viewer/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/log-viewer/workspace/manifests.ts @@ -44,7 +44,7 @@ const workspaceViews: Array = [ element: () => import('./views/search/index.js'), weight: 200, meta: { - label: 'Search', + label: '#general_search', pathname: 'search', icon: 'icon-search', }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/workspace/manifests.ts index 9826f39746..62bd3c02b8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/workspace/manifests.ts @@ -26,7 +26,7 @@ const workspaceViews: Array = [ alias: 'Umb.WorkspaceView.MediaType.Design', name: 'Media Type Workspace Design View', meta: { - label: 'Design', + label: '#general_design', pathname: 'design', icon: 'icon-document-dashed-line', }, @@ -44,7 +44,7 @@ const workspaceViews: Array = [ js: () => import('./views/structure/media-type-workspace-view-structure.element.js'), weight: 800, meta: { - label: 'Structure', + label: '#contentTypeEditor_structure', pathname: 'structure', icon: 'icon-mindmap', }, @@ -65,7 +65,7 @@ const workspaceActions: Array = [ name: 'Save Media Type Workspace Action', api: UmbSubmitWorkspaceAction, meta: { - label: 'Save', + label: '#buttons_save', look: 'primary', color: 'positive', }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/manifests.ts index bd158e586e..00808ce9c6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/manifests.ts @@ -44,7 +44,7 @@ const workspaceViews: Array = [ js: () => import('./views/edit/media-workspace-view-edit.element.js'), weight: 200, meta: { - label: 'Media', + label: '#general_details', pathname: 'media', icon: 'icon-picture', }, @@ -62,7 +62,7 @@ const workspaceViews: Array = [ js: () => import('./views/info/media-workspace-view-info.element.js'), weight: 100, meta: { - label: 'Info', + label: '#general_info', pathname: 'info', icon: 'info', }, @@ -83,7 +83,7 @@ const workspaceActions: Array = [ name: 'Save Media Workspace Action', api: UmbSubmitWorkspaceAction, meta: { - label: 'Save', + label: '#buttons_save', look: 'primary', color: 'positive', }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-group/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-group/workspace/manifests.ts index f17abf1cf3..20b806865c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-group/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-group/workspace/manifests.ts @@ -48,7 +48,7 @@ export const workspaceViews: Array = [ js: () => import('./views/info/member-type-workspace-view-info.element.js'), weight: 300, meta: { - label: 'Info', + label: '#general_info', pathname: 'info', icon: 'icon-document', }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/workspace/manifests.ts index 336c403747..8acc0d3acd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/workspace/manifests.ts @@ -25,7 +25,7 @@ const workspaceViews: Array = [ alias: 'Umb.WorkspaceView.MemberType.Design', name: 'Member Type Workspace Design View', meta: { - label: 'Design', + label: '#general_design', pathname: 'design', icon: 'icon-member-dashed-line', }, @@ -46,7 +46,7 @@ const workspaceActions: Array = [ name: 'Save Member Type Workspace Action', api: UmbSubmitWorkspaceAction, meta: { - label: 'Save', + label: '#buttons_save', look: 'primary', color: 'positive', }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/manifests.ts index 9198c2ef10..52d5bf443e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/manifests.ts @@ -48,7 +48,7 @@ export const workspaceViews: Array = [ js: () => import('./views/content/member-workspace-view-content.element.js'), weight: 100, meta: { - label: 'Content', + label: '#general_details', pathname: 'content', icon: 'icon-document', }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/workspace/relation-type/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/workspace/relation-type/manifests.ts index 49fc7fad40..88485c6869 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/workspace/relation-type/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/workspace/relation-type/manifests.ts @@ -19,7 +19,7 @@ const workspaceViews: Array = [ js: () => import('./views/relation-type-detail-workspace-view.element.js'), weight: 20, meta: { - label: 'Details', + label: '#general_details', pathname: 'details', icon: 'icon-trafic', }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/manifests.ts index ffdb1016de..576b32f168 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/workspace/manifests.ts @@ -26,7 +26,7 @@ const workspaceViews: Array = [ js: () => import('./views/code-editor/stylesheet-code-editor-workspace-view.element.js'), weight: 700, meta: { - label: 'Code', + label: '#stylesheet_tabCode', pathname: 'code', icon: 'icon-brackets', }, @@ -44,7 +44,7 @@ const workspaceViews: Array = [ js: () => import('./views/rich-text-rule/stylesheet-rich-text-rule-workspace-view.element.js'), weight: 800, meta: { - label: 'Rich Text Editor', + label: '#stylesheet_tabRule', pathname: 'rich-text-editor', icon: 'icon-font', }, @@ -64,7 +64,7 @@ const workspaceActions: Array = [ name: 'Save Stylesheet Workspace Action', api: UmbSubmitWorkspaceAction, meta: { - label: 'Save', + label: '#buttons_save', look: 'primary', color: 'positive', }, From 77b1b220b543e3278cdd8e0bc43cf13c6d899e9b Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 8 Apr 2024 20:19:28 +0200 Subject: [PATCH 183/280] add keys for workspace actions --- .../block-grid-area-config-entry/workspace/manifests.ts | 2 +- .../src/packages/block/block-type/workspace/manifests.ts | 2 +- .../src/packages/block/block/workspace/manifests.ts | 2 +- .../src/packages/dictionary/workspace/manifests.ts | 2 +- .../src/packages/members/member-group/workspace/manifests.ts | 2 +- .../src/packages/members/member/workspace/manifests.ts | 2 +- .../packages/templating/partial-views/workspace/manifests.ts | 2 +- .../src/packages/templating/scripts/workspace/manifests.ts | 2 +- .../src/packages/templating/templates/workspace/manifests.ts | 2 +- .../src/packages/user/user-group/workspace/manifests.ts | 2 +- .../src/packages/user/user/workspace/manifests.ts | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/components/block-grid-area-config-entry/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/components/block-grid-area-config-entry/workspace/manifests.ts index 17644bc775..f338a81368 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/components/block-grid-area-config-entry/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-grid/components/block-grid-area-config-entry/workspace/manifests.ts @@ -21,7 +21,7 @@ export const manifests: Array = [ name: 'Save Block Grid Area Type Workspace Action', api: UmbSubmitWorkspaceAction, meta: { - label: 'Submit', + label: '#general_submit', look: 'primary', color: 'positive', }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/block/block-type/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/block/block-type/workspace/manifests.ts index 0df0592053..3bd2d3aea3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/block/block-type/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/block/block-type/workspace/manifests.ts @@ -12,7 +12,7 @@ export const manifests: Array = [ name: 'Save Block Type Workspace Action', api: UmbSubmitWorkspaceAction, meta: { - label: 'Submit', + label: '#general_submit', look: 'primary', color: 'positive', }, 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 index 3567aa784c..8d31bc6c3f 100644 --- 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 @@ -10,7 +10,7 @@ export const manifests: Array = [ name: 'Save Block Type Workspace Action', api: UmbSubmitWorkspaceAction, meta: { - label: 'Submit', + label: '#general_submit', look: 'primary', color: 'positive', }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/workspace/manifests.ts index dcf75fd076..fb241d41d8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/dictionary/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/workspace/manifests.ts @@ -47,7 +47,7 @@ const workspaceActions: Array = [ weight: 90, api: UmbSubmitWorkspaceAction, meta: { - label: 'Save', + label: '#buttons_save', look: 'primary', color: 'positive', }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-group/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-group/workspace/manifests.ts index 20b806865c..7732091c9b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-group/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-group/workspace/manifests.ts @@ -27,7 +27,7 @@ const workspaceActions: Array = [ name: 'Save Member Group Workspace Action', api: UmbSubmitWorkspaceAction, meta: { - label: 'Save', + label: '#buttons_save', look: 'primary', color: 'positive', }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/manifests.ts index 52d5bf443e..98312be30d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member/workspace/manifests.ts @@ -27,7 +27,7 @@ const workspaceActions: Array = [ name: 'Save Member Workspace Action', api: UmbSubmitWorkspaceAction, meta: { - label: 'Save', + label: '#buttons_save', look: 'primary', color: 'positive', }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/manifests.ts index 734cd8e35d..e390ab43c0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/manifests.ts @@ -22,7 +22,7 @@ const workspaceActions: Array = [ name: 'Save Partial View', api: UmbSubmitWorkspaceAction, meta: { - label: 'Save', + label: '#buttons_save', look: 'primary', color: 'positive', }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/manifests.ts index a5ac33c6db..a440205f97 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/workspace/manifests.ts @@ -24,7 +24,7 @@ const workspaceActions: Array = [ name: 'Save Script Workspace Action', api: UmbSubmitWorkspaceAction, meta: { - label: 'Save', + label: '#buttons_save', look: 'primary', color: 'positive', }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/workspace/manifests.ts index 13a5f9b71b..9648fdcc09 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/workspace/manifests.ts @@ -31,7 +31,7 @@ const workspaceActions: Array = [ meta: { look: 'primary', color: 'positive', - label: 'Save', + label: '#buttons_save', }, conditions: [ { diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/manifests.ts index 9a24209b37..cae9d05cd7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/manifests.ts @@ -25,7 +25,7 @@ const workspaceActions: Array = [ name: 'Save User Group Workspace Action', api: UmbSubmitWorkspaceAction, meta: { - label: 'Save', + label: '#buttons_save', look: 'primary', color: 'positive', }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/manifests.ts index f54a0593a2..9e4423458c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/manifests.ts @@ -28,7 +28,7 @@ const workspaceActions: Array = [ name: 'Save User Workspace Action', api: UmbSubmitWorkspaceAction, meta: { - label: 'Save', + label: '#buttons_save', look: 'primary', color: 'positive', }, From 7601f81d0542b3dd2c8605e5a194cfb767623ab8 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 8 Apr 2024 20:31:04 +0200 Subject: [PATCH 184/280] fix keys --- .../src/packages/documents/documents/workspace/manifests.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/manifests.ts index dc5e8493b1..70284ccffd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/manifests.ts @@ -152,7 +152,7 @@ const workspaceActionMenuItems: Array = [ api: UmbDocumentUnpublishWorkspaceAction, forWorkspaceActions: 'Umb.WorkspaceAction.Document.SaveAndPublish', meta: { - label: '#buttons_unpublish', + label: '#actions_unpublish', icon: 'icon-globe', }, }, @@ -165,7 +165,7 @@ const workspaceActionMenuItems: Array = [ api: UmbDocumentPublishWithDescendantsWorkspaceAction, forWorkspaceActions: 'Umb.WorkspaceAction.Document.SaveAndPublish', meta: { - label: '#buttons_publishWithDescendants', + label: '#buttons_publishDescendants', icon: 'icon-globe', }, }, From 436bab24fa7946010de90859ee283deec5ad3a9f Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 8 Apr 2024 20:31:17 +0200 Subject: [PATCH 185/280] localize workspace action --- .../workspace-action/default/workspace-action.element.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-action/default/workspace-action.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-action/default/workspace-action.element.ts index 3aa40821b3..8539bbda99 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-action/default/workspace-action.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-action/default/workspace-action.element.ts @@ -1,6 +1,6 @@ import type { UmbWorkspaceAction } from '../workspace-action.interface.js'; import { UmbActionExecutedEvent } from '@umbraco-cms/backoffice/event'; -import { html, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; +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/backoffice/lit-element'; import type { @@ -117,7 +117,9 @@ export class UmbWorkspaceActionElement< @click=${this._onClick} look=${this.#manifest?.meta.look || 'default'} color=${this.#manifest?.meta.color || 'default'} - label=${this.#manifest?.meta.label || ''} + label=${ifDefined( + this.#manifest?.meta.label ? this.localize.string(this.#manifest.meta.label) : this.#manifest?.name, + )} .disabled=${this._isDisabled} .state=${this._buttonState}> Date: Mon, 8 Apr 2024 20:31:29 +0200 Subject: [PATCH 186/280] localize workspace action menu item --- .../default/workspace-action-menu-item.element.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-action-menu-item/default/workspace-action-menu-item.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-action-menu-item/default/workspace-action-menu-item.element.ts index b9314156d5..ce758395d0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-action-menu-item/default/workspace-action-menu-item.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-action-menu-item/default/workspace-action-menu-item.element.ts @@ -48,7 +48,9 @@ export class UmbWorkspaceActionMenuItemElement< render() { return html` From 71970c9f6599316df6ef1fcacfaf0fe85b899f64 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 8 Apr 2024 20:39:31 +0200 Subject: [PATCH 187/280] localize workspace views --- .../components/workspace-editor/workspace-editor.element.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-editor/workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-editor/workspace-editor.element.ts index a97eb4b5ed..0ab6de3fe3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-editor/workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-editor/workspace-editor.element.ts @@ -110,11 +110,11 @@ export class UmbWorkspaceEditorElement extends UmbLitElement { (view) => view.alias, (view) => html` - ${view.meta.label || view.name} + ${view.meta.label ? this.localize.string(view.meta.label) : view.name} `, )} From 510ca07bda6da05ea971eb6245587e60d06cd1db Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 8 Apr 2024 20:55:57 +0200 Subject: [PATCH 188/280] localize section views --- .../section/section-main-views/section-main-views.element.ts | 2 +- .../src/packages/media/media/section-view/manifests.ts | 2 +- .../src/packages/packages/package-section/manifests.ts | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/section/section-main-views/section-main-views.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/section/section-main-views/section-main-views.element.ts index 023f3a450d..6a7d3917b6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/section/section-main-views/section-main-views.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/section/section-main-views/section-main-views.element.ts @@ -126,7 +126,7 @@ export class UmbSectionMainViewElement extends UmbLitElement { ? html` ${this._views.map((view) => { - const viewName = view.meta.label ?? view.name; + const viewName = view.meta.label ? this.localize.string(view.meta.label) : view.name; const viewPath = this.#constructViewPath(view); return html` = [ element: () => import('./media-section-view.element.js'), weight: 200, meta: { - label: 'Media', + label: '#general_media', pathname: 'media', icon: 'icon-user', }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/packages/package-section/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/packages/package-section/manifests.ts index 7d33c33694..fb2c6018c7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/packages/package-section/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/packages/package-section/manifests.ts @@ -45,7 +45,7 @@ const sectionsViews: Array = [ element: () => import('./views/installed/installed-packages-section-view.element.js'), weight: 200, meta: { - label: 'Installed', + label: '#packager_installed', pathname: 'installed', icon: 'icon-box', }, @@ -63,7 +63,7 @@ const sectionsViews: Array = [ element: () => import('./views/created/created-packages-section-view.element.js'), weight: 100, meta: { - label: 'Created', + label: '#packager_created', pathname: 'created', icon: 'icon-files', }, From c3dd6866d13b4a1ee44013b9e87fce5b5efcc9f4 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 8 Apr 2024 20:58:56 +0200 Subject: [PATCH 189/280] localize sections --- .../components/backoffice-header-sections.element.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) 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 12a8fac134..5dd782a1a0 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,7 +1,7 @@ import { UMB_BACKOFFICE_CONTEXT } from '../backoffice.context.js'; import type { UmbBackofficeContext } from '../backoffice.context.js'; import type { CSSResultGroup } from '@umbraco-cms/backoffice/external/lit'; -import { css, html, customElement, state, repeat } from '@umbraco-cms/backoffice/external/lit'; +import { css, html, customElement, state, repeat, ifDefined } from '@umbraco-cms/backoffice/external/lit'; import type { ManifestSection } from '@umbraco-cms/backoffice/extension-registry'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import type { UmbExtensionManifestInitializer } from '@umbraco-cms/backoffice/extension-api'; @@ -62,7 +62,11 @@ export class UmbBackofficeHeaderSectionsElement extends UmbLitElement { + label="${ifDefined( + section.manifest?.meta.label + ? this.localize.string(section.manifest?.meta.label) + : section.manifest?.name, + )}"> `, )} From ada8ff545201bd4643167c3a4302f5911b7c6398 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 8 Apr 2024 21:18:06 +0200 Subject: [PATCH 190/280] update the use permission manifest to use same convention --- .../models/entity-user-permission.model.ts | 2 - .../documents/user-permissions/manifests.ts | 60 +++++++++---------- .../input-entity-user-permission.element.ts | 6 +- 3 files changed, 32 insertions(+), 36 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/entity-user-permission.model.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/entity-user-permission.model.ts index 4eb5723b94..db8ed1e2e2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/entity-user-permission.model.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/entity-user-permission.model.ts @@ -9,8 +9,6 @@ export interface ManifestEntityUserPermission extends ManifestBase { export interface MetaEntityUserPermission { verbs: Array; label?: string; - labelKey?: string; description?: string; - descriptionKey?: string; group?: string; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/manifests.ts index 1fc1880cb9..dd05ad4153 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/manifests.ts @@ -30,8 +30,8 @@ const permissions: Array = [ forEntityTypes: [UMB_DOCUMENT_ENTITY_TYPE], meta: { verbs: ['Umb.Document.Read'], - labelKey: 'actions_browse', - descriptionKey: 'actionDescriptions_browse', + label: '#actions_browse', + description: '#actionDescriptions_browse', }, }, { @@ -41,8 +41,8 @@ const permissions: Array = [ forEntityTypes: [UMB_DOCUMENT_ENTITY_TYPE], meta: { verbs: ['Umb.Document.CreateBlueprint'], - labelKey: 'actions_createblueprint', - descriptionKey: 'actionDescriptions_createblueprint', + label: '#actions_createblueprint', + description: '#actionDescriptions_createblueprint', }, }, { @@ -52,8 +52,8 @@ const permissions: Array = [ forEntityTypes: [UMB_DOCUMENT_ENTITY_TYPE], meta: { verbs: ['Umb.Document.Delete'], - labelKey: 'actions_delete', - descriptionKey: 'actionDescriptions_delete', + label: '#actions_delete', + description: '#actionDescriptions_delete', }, }, { @@ -63,8 +63,8 @@ const permissions: Array = [ forEntityTypes: [UMB_DOCUMENT_ENTITY_TYPE], meta: { verbs: ['Umb.Document.Create'], - labelKey: 'actions_create', - descriptionKey: 'actionDescriptions_create', + label: '#actions_create', + description: '#actionDescriptions_create', }, }, { @@ -74,8 +74,8 @@ const permissions: Array = [ forEntityTypes: [UMB_DOCUMENT_ENTITY_TYPE], meta: { verbs: ['Umb.Document.Notifications'], - labelKey: 'actions_notify', - descriptionKey: 'actionDescriptions_notify', + label: '#actions_notify', + description: '#actionDescriptions_notify', }, }, { @@ -85,8 +85,8 @@ const permissions: Array = [ forEntityTypes: [UMB_DOCUMENT_ENTITY_TYPE], meta: { verbs: ['Umb.Document.Publish'], - labelKey: 'actions_publish', - descriptionKey: 'actionDescriptions_publish', + label: '#actions_publish', + description: '#actionDescriptions_publish', }, }, { @@ -96,8 +96,8 @@ const permissions: Array = [ forEntityTypes: [UMB_DOCUMENT_ENTITY_TYPE], meta: { verbs: ['Umb.Document.Permissions'], - labelKey: 'actions_setPermissions', - descriptionKey: 'actionDescriptions_rights', + label: '#actions_setPermissions', + description: '#actionDescriptions_rights', }, }, { @@ -107,8 +107,8 @@ const permissions: Array = [ forEntityTypes: [UMB_DOCUMENT_ENTITY_TYPE], meta: { verbs: ['Umb.Document.Unpublish'], - labelKey: 'actions_unpublish', - descriptionKey: 'actionDescriptions_unpublish', + label: '#actions_unpublish', + description: '#actionDescriptions_unpublish', }, }, { @@ -118,8 +118,8 @@ const permissions: Array = [ forEntityTypes: [UMB_DOCUMENT_ENTITY_TYPE], meta: { verbs: ['Umb.Document.Update'], - labelKey: 'actions_update', - descriptionKey: 'actionDescriptions_update', + label: '#actions_update', + description: '#actionDescriptions_update', }, }, { @@ -129,8 +129,8 @@ const permissions: Array = [ forEntityTypes: [UMB_DOCUMENT_ENTITY_TYPE], meta: { verbs: ['Umb.Document.Duplicate'], - labelKey: 'actions_copy', - descriptionKey: 'actionDescriptions_copy', + label: '#actions_copy', + description: '#actionDescriptions_copy', group: 'structure', }, }, @@ -141,8 +141,8 @@ const permissions: Array = [ forEntityTypes: [UMB_DOCUMENT_ENTITY_TYPE], meta: { verbs: ['Umb.Document.Move'], - labelKey: 'actions_move', - descriptionKey: 'actionDescriptions_move', + label: '#actions_move', + description: '#actionDescriptions_move', group: 'structure', }, }, @@ -153,8 +153,8 @@ const permissions: Array = [ forEntityTypes: [UMB_DOCUMENT_ENTITY_TYPE], meta: { verbs: ['Umb.Document.Sort'], - labelKey: 'actions_sort', - descriptionKey: 'actionDescriptions_sort', + label: '#actions_sort', + description: '#actionDescriptions_sort', group: 'structure', }, }, @@ -165,8 +165,8 @@ const permissions: Array = [ forEntityTypes: [UMB_DOCUMENT_ENTITY_TYPE], meta: { verbs: ['Umb.Document.CultureAndHostnames'], - labelKey: 'actions_assigndomain', - descriptionKey: 'actionDescriptions_assignDomain', + label: '#actions_assigndomain', + description: '#actionDescriptions_assignDomain', group: 'administration', }, }, @@ -177,8 +177,8 @@ const permissions: Array = [ forEntityTypes: [UMB_DOCUMENT_ENTITY_TYPE], meta: { verbs: ['Umb.Document.PublicAccess'], - labelKey: 'actions_protect', - descriptionKey: 'actionDescriptions_protect', + label: '#actions_protect', + description: '#actionDescriptions_protect', group: 'administration', }, }, @@ -189,8 +189,8 @@ const permissions: Array = [ forEntityTypes: [UMB_DOCUMENT_ENTITY_TYPE], meta: { verbs: ['Umb.Document.Rollback'], - labelKey: 'actions_rollback', - descriptionKey: 'actionDescriptions_rollback', + label: '#actions_rollback', + description: '#actionDescriptions_rollback', group: 'administration', }, }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/input-entity-user-permission/input-entity-user-permission.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/input-entity-user-permission/input-entity-user-permission.element.ts index 490b97b45e..5b19e06dd3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/input-entity-user-permission/input-entity-user-permission.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-permission/components/input-entity-user-permission/input-entity-user-permission.element.ts @@ -94,10 +94,8 @@ export class UmbInputEntityUserPermissionElement extends FormControlMixin(UmbLit #renderPermission(manifest: ManifestEntityUserPermission) { return html` this.#onChangeUserPermission(event, manifest.meta.verbs)}>`; From c5f1e7adb9390ce6deec6b8f2722e745c49d8e9f Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 8 Apr 2024 21:21:24 +0200 Subject: [PATCH 191/280] localize sections --- .../user-group-table-sections-column-layout.element.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 684c9d266d..657fc4355a 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 @@ -24,7 +24,9 @@ export class UmbUserGroupTableSectionsColumnLayoutElement extends UmbLitElement this.observe( umbExtensionsRegistry.byType('section'), (sections) => { - this._sectionsNames = sections.filter((x) => this.value.includes(x.alias)).map((x) => x.meta.label || x.name); + this._sectionsNames = sections + .filter((x) => this.value.includes(x.alias)) + .map((x) => (x.meta.label ? this.localize.string(x.meta.label) : x.name)); }, 'umbUserGroupTableSectionsColumnLayoutObserver', ); From 4938c6632b0fe707b5204d78cdfa4ac0a632335c Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 8 Apr 2024 21:25:26 +0200 Subject: [PATCH 192/280] localize sections --- .../core/section/components/ref-section/ref-section.element.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/section/components/ref-section/ref-section.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/section/components/ref-section/ref-section.element.ts index 8b41537035..0b9892c507 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/section/components/ref-section/ref-section.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/section/components/ref-section/ref-section.element.ts @@ -11,7 +11,7 @@ export class UmbRefSectionElement extends UmbElementMixin(UUIRefElement) { public render() { return html`

-
${this.item?.meta.label}
+
${this.item?.meta.label ? this.localize.string(this.item.meta.label) : this.item?.name}
From 4f7d553fc2ccaabd452f9672f5997c9aba3ac22a Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Mon, 8 Apr 2024 21:34:15 +0200 Subject: [PATCH 193/280] add translations keys to all tree root items --- .../src/packages/data-type/tree/data-type-tree.repository.ts | 2 +- .../src/packages/dictionary/tree/dictionary-tree.repository.ts | 2 +- .../document-types/tree/document-type-tree.repository.ts | 2 +- .../recycle-bin/tree/document-recycle-bin-tree.repository.ts | 2 +- .../documents/documents/tree/document-tree.repository.ts | 2 +- .../media/media-types/tree/media-type-tree.repository.ts | 2 +- .../src/packages/media/media/tree/media-tree.repository.ts | 2 +- .../members/member-type/tree/member-type-tree.repository.ts | 2 +- .../partial-views/tree/partial-view-tree.repository.ts | 2 +- .../packages/templating/scripts/tree/script-tree.repository.ts | 2 +- .../templating/stylesheets/tree/stylesheet-tree.repository.ts | 2 +- .../templating/templates/tree/template-tree.repository.ts | 2 +- 12 files changed, 12 insertions(+), 12 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/data-type-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/data-type-tree.repository.ts index 8e1702f7ef..2c9f04fc7c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/data-type-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/data-type-tree.repository.ts @@ -18,7 +18,7 @@ export class UmbDataTypeTreeRepository const data: UmbDataTypeTreeRootModel = { unique: null, entityType: UMB_DATA_TYPE_ROOT_ENTITY_TYPE, - name: 'Data Types', + name: '#treeHeaders_dataTypes', hasChildren: true, isFolder: true, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/tree/dictionary-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/tree/dictionary-tree.repository.ts index 8e273e86ef..b772686501 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/dictionary/tree/dictionary-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/tree/dictionary-tree.repository.ts @@ -18,7 +18,7 @@ export class UmbDictionaryTreeRepository const data: UmbDictionaryTreeRootModel = { unique: null, entityType: UMB_DICTIONARY_ROOT_ENTITY_TYPE, - name: 'Dictionary', + name: '#treeHeaders_dictionary', hasChildren: true, isFolder: true, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/document-type-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/document-type-tree.repository.ts index 0f45c87dfa..15d2f7f74c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/document-type-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/document-type-tree.repository.ts @@ -18,7 +18,7 @@ export class UmbDocumentTypeTreeRepository const data: UmbDocumentTypeTreeRootModel = { unique: null, entityType: UMB_DOCUMENT_TYPE_ROOT_ENTITY_TYPE, - name: 'Document Types', + name: '#treeHeaders_documentTypes', hasChildren: true, isFolder: true, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/document-recycle-bin-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/document-recycle-bin-tree.repository.ts index 37ff658fb9..e1857c9203 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/document-recycle-bin-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/document-recycle-bin-tree.repository.ts @@ -18,7 +18,7 @@ export class UmbDocumentRecycleBinTreeRepository const data = { unique: null, entityType: UMB_DOCUMENT_RECYCLE_BIN_ROOT_ENTITY_TYPE, - name: 'Recycle Bin', + name: '#treeHeaders_contentRecycleBin', icon: 'icon-trash', hasChildren: true, isContainer: false, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/document-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/document-tree.repository.ts index 8e1e117978..999e7aff82 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/document-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/document-tree.repository.ts @@ -18,7 +18,7 @@ export class UmbDocumentTreeRepository const data: UmbDocumentTreeRootModel = { unique: null, entityType: UMB_DOCUMENT_ROOT_ENTITY_TYPE, - name: 'Documents', + name: '#treeHeaders_content', hasChildren: true, isFolder: true, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/tree/media-type-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/tree/media-type-tree.repository.ts index ae20ab7e9c..deac728c26 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/tree/media-type-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/tree/media-type-tree.repository.ts @@ -18,7 +18,7 @@ export class UmbMediaTypeTreeRepository const data: UmbMediaTypeTreeRootModel = { unique: null, entityType: UMB_MEDIA_TYPE_ROOT_ENTITY_TYPE, - name: 'Media Types', + name: '#treeHeaders_mediaTypes', hasChildren: true, isFolder: true, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/tree/media-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/tree/media-tree.repository.ts index c9b9893e53..7fea19f1ac 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/tree/media-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/tree/media-tree.repository.ts @@ -18,7 +18,7 @@ export class UmbMediaTreeRepository const data: UmbMediaTreeRootModel = { unique: null, entityType: UMB_MEDIA_ROOT_ENTITY_TYPE, - name: 'Media', + name: '#treeHeaders_media', hasChildren: true, isFolder: true, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/member-type-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/member-type-tree.repository.ts index 80d19d5ef5..fa6123d7d7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/member-type-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/member-type-tree.repository.ts @@ -18,7 +18,7 @@ export class UmbMemberTypeTreeRepository const data: UmbMemberTypeTreeRootModel = { unique: null, entityType: UMB_MEMBER_TYPE_ROOT_ENTITY_TYPE, - name: 'Member Types', + name: '#treeHeaders_memberTypes', hasChildren: true, isFolder: true, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/tree/partial-view-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/tree/partial-view-tree.repository.ts index d24813369e..27cd6feb94 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/tree/partial-view-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/tree/partial-view-tree.repository.ts @@ -18,7 +18,7 @@ export class UmbPartialViewTreeRepository const data: UmbPartialViewTreeRootModel = { unique: null, entityType: UMB_PARTIAL_VIEW_ROOT_ENTITY_TYPE, - name: 'Partial Views', + name: '#treeHeaders_partialViews', hasChildren: true, isFolder: true, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/tree/script-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/tree/script-tree.repository.ts index 7e12203803..2dec0c4450 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/tree/script-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/tree/script-tree.repository.ts @@ -15,7 +15,7 @@ export class UmbScriptTreeRepository extends UmbTreeRepositoryBase Date: Mon, 8 Apr 2024 21:53:41 +0200 Subject: [PATCH 194/280] translate in repo --- .../src/packages/core/tree/data/tree-repository-base.ts | 2 ++ .../src/packages/data-type/tree/data-type-tree.repository.ts | 2 +- .../src/packages/dictionary/tree/dictionary-tree.repository.ts | 2 +- .../document-types/tree/document-type-tree.repository.ts | 2 +- .../recycle-bin/tree/document-recycle-bin-tree.repository.ts | 2 +- .../documents/documents/tree/document-tree.repository.ts | 2 +- .../media/media-types/tree/media-type-tree.repository.ts | 2 +- .../src/packages/media/media/tree/media-tree.repository.ts | 2 +- .../members/member-type/tree/member-type-tree.repository.ts | 2 +- .../partial-views/tree/partial-view-tree.repository.ts | 2 +- .../packages/templating/scripts/tree/script-tree.repository.ts | 2 +- .../templating/stylesheets/tree/stylesheet-tree.repository.ts | 2 +- .../templating/templates/tree/template-tree.repository.ts | 2 +- 13 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-repository-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-repository-base.ts index 2409617d42..5b31136389 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-repository-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-repository-base.ts @@ -7,6 +7,7 @@ import { UmbRepositoryBase } from '@umbraco-cms/backoffice/repository'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; import type { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; +import { UmbLocalizationController } from '@umbraco-cms/backoffice/localization-api'; /** * Base class for a tree repository. @@ -28,6 +29,7 @@ export abstract class UmbTreeRepositoryBase< { protected _init: Promise; protected _treeStore?: UmbTreeStore; + protected _localization = new UmbLocalizationController(this._host); #treeSource: UmbTreeDataSource; /** diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/data-type-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/data-type-tree.repository.ts index 2c9f04fc7c..693e029576 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/data-type-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/data-type-tree.repository.ts @@ -18,7 +18,7 @@ export class UmbDataTypeTreeRepository const data: UmbDataTypeTreeRootModel = { unique: null, entityType: UMB_DATA_TYPE_ROOT_ENTITY_TYPE, - name: '#treeHeaders_dataTypes', + name: this._localization.term('treeHeaders_dataTypes'), hasChildren: true, isFolder: true, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/tree/dictionary-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/tree/dictionary-tree.repository.ts index b772686501..347ddaa4f8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/dictionary/tree/dictionary-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/tree/dictionary-tree.repository.ts @@ -18,7 +18,7 @@ export class UmbDictionaryTreeRepository const data: UmbDictionaryTreeRootModel = { unique: null, entityType: UMB_DICTIONARY_ROOT_ENTITY_TYPE, - name: '#treeHeaders_dictionary', + name: this._localization.term('treeHeaders_dictionary'), hasChildren: true, isFolder: true, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/document-type-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/document-type-tree.repository.ts index 15d2f7f74c..b78b79aa7a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/document-type-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/document-type-tree.repository.ts @@ -18,7 +18,7 @@ export class UmbDocumentTypeTreeRepository const data: UmbDocumentTypeTreeRootModel = { unique: null, entityType: UMB_DOCUMENT_TYPE_ROOT_ENTITY_TYPE, - name: '#treeHeaders_documentTypes', + name: this._localization.term('treeHeaders_documentTypes'), hasChildren: true, isFolder: true, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/document-recycle-bin-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/document-recycle-bin-tree.repository.ts index e1857c9203..7638856a56 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/document-recycle-bin-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/document-recycle-bin-tree.repository.ts @@ -18,7 +18,7 @@ export class UmbDocumentRecycleBinTreeRepository const data = { unique: null, entityType: UMB_DOCUMENT_RECYCLE_BIN_ROOT_ENTITY_TYPE, - name: '#treeHeaders_contentRecycleBin', + name: this._localization.term('treeHeaders_contentRecycleBin'), icon: 'icon-trash', hasChildren: true, isContainer: false, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/document-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/document-tree.repository.ts index 999e7aff82..cca61a908a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/document-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/document-tree.repository.ts @@ -18,7 +18,7 @@ export class UmbDocumentTreeRepository const data: UmbDocumentTreeRootModel = { unique: null, entityType: UMB_DOCUMENT_ROOT_ENTITY_TYPE, - name: '#treeHeaders_content', + name: this._localization.term('treeHeaders_content'), hasChildren: true, isFolder: true, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/tree/media-type-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/tree/media-type-tree.repository.ts index deac728c26..b4277e789c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/tree/media-type-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/tree/media-type-tree.repository.ts @@ -18,7 +18,7 @@ export class UmbMediaTypeTreeRepository const data: UmbMediaTypeTreeRootModel = { unique: null, entityType: UMB_MEDIA_TYPE_ROOT_ENTITY_TYPE, - name: '#treeHeaders_mediaTypes', + name: this._localization.term('treeHeaders_mediaTypes'), hasChildren: true, isFolder: true, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/tree/media-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/tree/media-tree.repository.ts index 7fea19f1ac..31c76138c0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/tree/media-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/tree/media-tree.repository.ts @@ -18,7 +18,7 @@ export class UmbMediaTreeRepository const data: UmbMediaTreeRootModel = { unique: null, entityType: UMB_MEDIA_ROOT_ENTITY_TYPE, - name: '#treeHeaders_media', + name: this._localization.term('treeHeaders_media'), hasChildren: true, isFolder: true, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/member-type-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/member-type-tree.repository.ts index fa6123d7d7..6d227d5502 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/member-type-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/member-type-tree.repository.ts @@ -18,7 +18,7 @@ export class UmbMemberTypeTreeRepository const data: UmbMemberTypeTreeRootModel = { unique: null, entityType: UMB_MEMBER_TYPE_ROOT_ENTITY_TYPE, - name: '#treeHeaders_memberTypes', + name: this._localization.term('treeHeaders_memberTypes'), hasChildren: true, isFolder: true, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/tree/partial-view-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/tree/partial-view-tree.repository.ts index 27cd6feb94..6064d7e544 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/tree/partial-view-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/tree/partial-view-tree.repository.ts @@ -18,7 +18,7 @@ export class UmbPartialViewTreeRepository const data: UmbPartialViewTreeRootModel = { unique: null, entityType: UMB_PARTIAL_VIEW_ROOT_ENTITY_TYPE, - name: '#treeHeaders_partialViews', + name: this._localization.term('treeHeaders_partialViews'), hasChildren: true, isFolder: true, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/tree/script-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/tree/script-tree.repository.ts index 2dec0c4450..84c1add8f0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/tree/script-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/tree/script-tree.repository.ts @@ -15,7 +15,7 @@ export class UmbScriptTreeRepository extends UmbTreeRepositoryBase Date: Tue, 9 Apr 2024 08:55:14 +0200 Subject: [PATCH 195/280] Revert "translate in repo" This reverts commit f304b15b856a5cb0d93dea619b4d35818768cb8e. --- .../src/packages/core/tree/data/tree-repository-base.ts | 2 -- .../src/packages/data-type/tree/data-type-tree.repository.ts | 2 +- .../src/packages/dictionary/tree/dictionary-tree.repository.ts | 2 +- .../document-types/tree/document-type-tree.repository.ts | 2 +- .../recycle-bin/tree/document-recycle-bin-tree.repository.ts | 2 +- .../documents/documents/tree/document-tree.repository.ts | 2 +- .../media/media-types/tree/media-type-tree.repository.ts | 2 +- .../src/packages/media/media/tree/media-tree.repository.ts | 2 +- .../members/member-type/tree/member-type-tree.repository.ts | 2 +- .../partial-views/tree/partial-view-tree.repository.ts | 2 +- .../packages/templating/scripts/tree/script-tree.repository.ts | 2 +- .../templating/stylesheets/tree/stylesheet-tree.repository.ts | 2 +- .../templating/templates/tree/template-tree.repository.ts | 2 +- 13 files changed, 12 insertions(+), 14 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-repository-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-repository-base.ts index 5b31136389..2409617d42 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-repository-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-repository-base.ts @@ -7,7 +7,6 @@ import { UmbRepositoryBase } from '@umbraco-cms/backoffice/repository'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; import type { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import { UmbLocalizationController } from '@umbraco-cms/backoffice/localization-api'; /** * Base class for a tree repository. @@ -29,7 +28,6 @@ export abstract class UmbTreeRepositoryBase< { protected _init: Promise; protected _treeStore?: UmbTreeStore; - protected _localization = new UmbLocalizationController(this._host); #treeSource: UmbTreeDataSource; /** diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/data-type-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/data-type-tree.repository.ts index 693e029576..2c9f04fc7c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/data-type-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/data-type-tree.repository.ts @@ -18,7 +18,7 @@ export class UmbDataTypeTreeRepository const data: UmbDataTypeTreeRootModel = { unique: null, entityType: UMB_DATA_TYPE_ROOT_ENTITY_TYPE, - name: this._localization.term('treeHeaders_dataTypes'), + name: '#treeHeaders_dataTypes', hasChildren: true, isFolder: true, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/tree/dictionary-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/tree/dictionary-tree.repository.ts index 347ddaa4f8..b772686501 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/dictionary/tree/dictionary-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/tree/dictionary-tree.repository.ts @@ -18,7 +18,7 @@ export class UmbDictionaryTreeRepository const data: UmbDictionaryTreeRootModel = { unique: null, entityType: UMB_DICTIONARY_ROOT_ENTITY_TYPE, - name: this._localization.term('treeHeaders_dictionary'), + name: '#treeHeaders_dictionary', hasChildren: true, isFolder: true, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/document-type-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/document-type-tree.repository.ts index b78b79aa7a..15d2f7f74c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/document-type-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/document-type-tree.repository.ts @@ -18,7 +18,7 @@ export class UmbDocumentTypeTreeRepository const data: UmbDocumentTypeTreeRootModel = { unique: null, entityType: UMB_DOCUMENT_TYPE_ROOT_ENTITY_TYPE, - name: this._localization.term('treeHeaders_documentTypes'), + name: '#treeHeaders_documentTypes', hasChildren: true, isFolder: true, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/document-recycle-bin-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/document-recycle-bin-tree.repository.ts index 7638856a56..e1857c9203 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/document-recycle-bin-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/document-recycle-bin-tree.repository.ts @@ -18,7 +18,7 @@ export class UmbDocumentRecycleBinTreeRepository const data = { unique: null, entityType: UMB_DOCUMENT_RECYCLE_BIN_ROOT_ENTITY_TYPE, - name: this._localization.term('treeHeaders_contentRecycleBin'), + name: '#treeHeaders_contentRecycleBin', icon: 'icon-trash', hasChildren: true, isContainer: false, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/document-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/document-tree.repository.ts index cca61a908a..999e7aff82 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/document-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/document-tree.repository.ts @@ -18,7 +18,7 @@ export class UmbDocumentTreeRepository const data: UmbDocumentTreeRootModel = { unique: null, entityType: UMB_DOCUMENT_ROOT_ENTITY_TYPE, - name: this._localization.term('treeHeaders_content'), + name: '#treeHeaders_content', hasChildren: true, isFolder: true, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/tree/media-type-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/tree/media-type-tree.repository.ts index b4277e789c..deac728c26 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/tree/media-type-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/tree/media-type-tree.repository.ts @@ -18,7 +18,7 @@ export class UmbMediaTypeTreeRepository const data: UmbMediaTypeTreeRootModel = { unique: null, entityType: UMB_MEDIA_TYPE_ROOT_ENTITY_TYPE, - name: this._localization.term('treeHeaders_mediaTypes'), + name: '#treeHeaders_mediaTypes', hasChildren: true, isFolder: true, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/tree/media-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/tree/media-tree.repository.ts index 31c76138c0..7fea19f1ac 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/tree/media-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/tree/media-tree.repository.ts @@ -18,7 +18,7 @@ export class UmbMediaTreeRepository const data: UmbMediaTreeRootModel = { unique: null, entityType: UMB_MEDIA_ROOT_ENTITY_TYPE, - name: this._localization.term('treeHeaders_media'), + name: '#treeHeaders_media', hasChildren: true, isFolder: true, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/member-type-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/member-type-tree.repository.ts index 6d227d5502..fa6123d7d7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/member-type-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/member-type-tree.repository.ts @@ -18,7 +18,7 @@ export class UmbMemberTypeTreeRepository const data: UmbMemberTypeTreeRootModel = { unique: null, entityType: UMB_MEMBER_TYPE_ROOT_ENTITY_TYPE, - name: this._localization.term('treeHeaders_memberTypes'), + name: '#treeHeaders_memberTypes', hasChildren: true, isFolder: true, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/tree/partial-view-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/tree/partial-view-tree.repository.ts index 6064d7e544..27cd6feb94 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/tree/partial-view-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/tree/partial-view-tree.repository.ts @@ -18,7 +18,7 @@ export class UmbPartialViewTreeRepository const data: UmbPartialViewTreeRootModel = { unique: null, entityType: UMB_PARTIAL_VIEW_ROOT_ENTITY_TYPE, - name: this._localization.term('treeHeaders_partialViews'), + name: '#treeHeaders_partialViews', hasChildren: true, isFolder: true, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/tree/script-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/tree/script-tree.repository.ts index 84c1add8f0..2dec0c4450 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/tree/script-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/tree/script-tree.repository.ts @@ -15,7 +15,7 @@ export class UmbScriptTreeRepository extends UmbTreeRepositoryBase Date: Tue, 9 Apr 2024 08:57:04 +0200 Subject: [PATCH 196/280] translate magic hash --- .../tree/tree-item/tree-item-base/tree-item-element-base.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-element-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-element-base.ts index fff0a03aeb..82f98b8a28 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-element-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-item/tree-item-base/tree-item-element-base.ts @@ -117,7 +117,7 @@ export abstract class UmbTreeItemElementBase ${this.renderIconContainer()} ${this.renderLabel()} ${this.#renderActions()} ${this.#renderChildItems()} From 45ce082f507981cbb5136ae93de875357b04a7b1 Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Tue, 9 Apr 2024 09:49:17 +0200 Subject: [PATCH 197/280] Co-authored-by: Lee Kelleher --- .../entity-actions/manifests.ts | 8 +- .../documents/document-blueprints/entity.ts | 2 - .../menu-item/manifests.ts | 4 +- .../document-blueprint-tree.repository.ts | 4 +- .../document-blueprints/tree/manifests.ts | 12 +- .../reload-tree-item-children/manifests.ts | 12 +- .../document-blueprints/tree/types.ts | 10 +- .../documents/document-blueprints/types.ts | 4 +- ...cument-blueprint-root-workspace.element.ts | 2 +- ...ment-blueprint-workspace-editor.element.ts | 14 +- ...-blueprint-workspace-split-view.element.ts | 2 +- .../document-blueprint-workspace.context.ts | 308 +++++++----------- .../document-blueprint-workspace.element.ts | 2 +- .../workspace/manifests.ts | 8 +- 14 files changed, 148 insertions(+), 244 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/manifests.ts index ff487efb7f..e5c2ec3ba5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/manifests.ts @@ -1,8 +1,4 @@ -import { - UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, - UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE, - UMB_DOCUMENT_BLUEPRINT_ROOT_ENTITY_TYPE, -} from '../entity.js'; +import { UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE } from '../entity.js'; import { UMB_DOCUMENT_BLUEPRINT_DETAIL_REPOSITORY_ALIAS, UMB_DOCUMENT_BLUEPRINT_ITEM_REPOSITORY_ALIAS, @@ -18,7 +14,7 @@ const entityActions: Array = [ alias: 'Umb.EntityAction.DocumentBlueprint.Create', name: 'Create Document Blueprint Entity Action', api: UmbCreateEntityAction, - forEntityTypes: [UMB_DOCUMENT_BLUEPRINT_ROOT_ENTITY_TYPE, UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE], + forEntityTypes: [UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE], meta: { icon: 'icon-add', label: 'Create', diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity.ts index 8aa8201389..9c0cff3d89 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity.ts @@ -1,7 +1,5 @@ -export const UMB_DOCUMENT_BLUEPRINT_ROOT_ENTITY_TYPE = 'document-blueprint-root'; export const UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE = 'document-blueprint'; export const UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE = 'document-blueprint-folder'; -export type UmbDocumentBlueprintRootEntityType = typeof UMB_DOCUMENT_BLUEPRINT_ROOT_ENTITY_TYPE; export type UmbDocumentBlueprintEntityType = typeof UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE; export type UmbDocumentBlueprintFolderEntityType = typeof UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/menu-item/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/menu-item/manifests.ts index 74345977a8..1ccfeb6caf 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/menu-item/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/menu-item/manifests.ts @@ -10,8 +10,8 @@ const menuItem: ManifestTypes = { meta: { treeAlias: UMB_DOCUMENT_BLUEPRINT_TREE_ALIAS, label: 'Document Blueprints', - icon: 'icon-blueprint', - entityType: 'document-blueprint-root', + //icon: 'icon-blueprint', + //entityType: 'document-blueprint', menus: ['Umb.Menu.StructureSettings'], }, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/document-blueprint-tree.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/document-blueprint-tree.repository.ts index 31dd948145..55e303dfc5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/document-blueprint-tree.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/document-blueprint-tree.repository.ts @@ -1,4 +1,4 @@ -import { UMB_DOCUMENT_BLUEPRINT_ROOT_ENTITY_TYPE } from '../entity.js'; +import { UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE } from '../entity.js'; import { UmbDocumentBlueprintTreeServerDataSource } from './document-blueprint-tree.server.data-source.js'; import { UMB_DOCUMENT_BLUEPRINT_TREE_STORE_CONTEXT } from './document-blueprint-tree.store.js'; import type { UmbDocumentBlueprintTreeItemModel, UmbDocumentBlueprintTreeRootModel } from './types.js'; @@ -17,7 +17,7 @@ export class UmbDocumentBlueprintTreeRepository async requestTreeRoot() { const data: UmbDocumentBlueprintTreeRootModel = { unique: null, - entityType: UMB_DOCUMENT_BLUEPRINT_ROOT_ENTITY_TYPE, + entityType: UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, name: 'Document Blueprints', hasChildren: true, isFolder: true, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/manifests.ts index 6a413d7177..1a085f7d96 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/manifests.ts @@ -1,8 +1,4 @@ -import { - UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, - UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE, - UMB_DOCUMENT_BLUEPRINT_ROOT_ENTITY_TYPE, -} from '../entity.js'; +import { UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE } from '../entity.js'; //import { manifests as folderManifests } from './folder/manifests.js'; import { manifests as reloadManifests } from './reload-tree-item-children/manifests.js'; import { UmbDocumentBlueprintTreeRepository } from './document-blueprint-tree.repository.js'; @@ -47,11 +43,7 @@ const treeItem: ManifestTreeItem = { kind: 'default', alias: 'Umb.TreeItem.DocumentBlueprint', name: 'Document Blueprint Tree Item', - forEntityTypes: [ - UMB_DOCUMENT_BLUEPRINT_ROOT_ENTITY_TYPE, - UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, - UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE, - ], + forEntityTypes: [UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE], }; export const manifests = [treeRepository, treeStore, tree, treeItem, ...reloadManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/reload-tree-item-children/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/reload-tree-item-children/manifests.ts index d2071f88c7..54c0de35fa 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/reload-tree-item-children/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/reload-tree-item-children/manifests.ts @@ -1,8 +1,4 @@ -import { - UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, - UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE, - UMB_DOCUMENT_BLUEPRINT_ROOT_ENTITY_TYPE, -} from '../../entity.js'; +import { UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE } from '../../entity.js'; import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; export const manifests: Array = [ @@ -11,11 +7,7 @@ export const manifests: Array = [ kind: 'reloadTreeItemChildren', alias: 'Umb.EntityAction.DocumentBlueprint.Tree.ReloadChildrenOf', name: 'Reload Document Blueprint Tree Item Children Entity Action', - forEntityTypes: [ - UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, - UMB_DOCUMENT_BLUEPRINT_ROOT_ENTITY_TYPE, - UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE, - ], + forEntityTypes: [UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, UMB_DOCUMENT_BLUEPRINT_FOLDER_ENTITY_TYPE], meta: {}, }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/types.ts index 3d58af58a2..c5ede67df1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/types.ts @@ -1,14 +1,6 @@ -import type { - UmbDocumentBlueprintEntityType, - UmbDocumentBlueprintFolderEntityType, - UmbDocumentBlueprintRootEntityType, -} from '../entity.js'; +import type { UmbDocumentBlueprintEntityType, UmbDocumentBlueprintFolderEntityType } from '../entity.js'; import type { UmbUniqueTreeItemModel, UmbUniqueTreeRootModel } from '@umbraco-cms/backoffice/tree'; export interface UmbDocumentBlueprintTreeItemModel extends UmbUniqueTreeItemModel { entityType: UmbDocumentBlueprintEntityType | UmbDocumentBlueprintFolderEntityType; } - -export interface UmbDocumentBlueprintTreeRootModel extends UmbUniqueTreeRootModel { - entityType: UmbDocumentBlueprintRootEntityType; -} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/types.ts index 6cbcb6199b..4cb2c496f1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/types.ts @@ -19,8 +19,8 @@ export interface UmbDocumentBlueprintDetailModel { } export interface UmbDocumentBlueprintVariantModel extends UmbVariantModel { - state: UmbDocumentBlueprintVariantState | null; - publishDate: string | null; + state?: UmbDocumentBlueprintVariantState | null; + publishDate?: string | null; } export interface UmbDocumentBlueprintUrlInfoModel { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-root-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-root-workspace.element.ts index 5e5c8b36de..cd8819af72 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-root-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-root-workspace.element.ts @@ -4,7 +4,7 @@ import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; @customElement('umb-document-blueprint-root-workspace') export class UmbDocumentBlueprintRootWorkspaceElement extends UmbLitElement { render() { - return html` + return html`

diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace-editor.element.ts index 0b4d12d646..9387350ca2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace-editor.element.ts @@ -6,7 +6,6 @@ import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import type { UmbRoute, UmbRouterSlotInitEvent } from '@umbraco-cms/backoffice/router'; -// TODO: This seem fully identical with Media Workspace Editor, so we can refactor this to a generic component. [NL] @customElement('umb-document-blueprint-workspace-editor') export class UmbDocumentBlueprintWorkspaceEditorElement extends UmbLitElement { // @@ -30,7 +29,6 @@ export class UmbDocumentBlueprintWorkspaceEditorElement extends UmbLitElement { #observeVariants() { if (!this.#workspaceContext) return; - // TODO: the variantOptions observable is like too broad as this will be triggered then there is any change in the variant options, we need to only update routes when there is a relevant change to them. [NL] this.observe(this.#workspaceContext.variantOptions, (options) => this._generateRoutes(options), '_observeVariants'); } @@ -41,15 +39,15 @@ export class UmbDocumentBlueprintWorkspaceEditorElement extends UmbLitElement { this.#workspaceContext?.splitView.setActiveVariant(index, culture, segment); } - private async _generateRoutes(options: Array) { - if (!options || options.length === 0) return; + private async _generateRoutes(variants: Array) { + if (!variants || variants.length === 0) return; // Generate split view routes for all available routes const routes: Array = []; // Split view routes: - options.forEach((variantA) => { - options.forEach((variantB) => { + variants.forEach((variantA) => { + variants.forEach((variantB) => { routes.push({ // TODO: When implementing Segments, be aware if using the unique is URL Safe... [NL] path: variantA.unique + '_&_' + variantB.unique, @@ -66,7 +64,7 @@ export class UmbDocumentBlueprintWorkspaceEditorElement extends UmbLitElement { }); // Single view: - options.forEach((variant) => { + variants.forEach((variant) => { routes.push({ // TODO: When implementing Segments, be aware if using the unique is URL Safe... [NL] path: variant.unique, @@ -83,7 +81,7 @@ export class UmbDocumentBlueprintWorkspaceEditorElement extends UmbLitElement { // Using first single view as the default route for now (hence the math below): routes.push({ path: '', - redirectTo: routes[options.length * options.length]?.path, + redirectTo: routes[variants.length * variants.length]?.path, }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace-split-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace-split-view.element.ts index 533e7c36ed..77cc3b90b3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace-split-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace-split-view.element.ts @@ -42,7 +42,7 @@ export class UmbDocumentBlueprintWorkspaceSplitViewElement extends UmbLitElement view.index + '_' + (view.culture ?? '') + '_' + (view.segment ?? '') + '_' + this._variants!.length, (view) => html` `, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.context.ts index 9017a990fa..061e1aa23f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.context.ts @@ -1,48 +1,41 @@ import { UmbDocumentPropertyDataContext } from '../../documents/property-dataset-context/document-property-dataset-context.js'; -import { UmbDocumentTypeDetailRepository } from '../../document-types/repository/detail/document-type-detail.repository.js'; import { UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE } from '../entity.js'; import { UmbDocumentBlueprintDetailRepository } from '../repository/index.js'; import type { UmbDocumentBlueprintDetailModel, - UmbDocumentBlueprintValueModel, UmbDocumentBlueprintVariantModel, UmbDocumentBlueprintVariantOptionModel, } from '../types.js'; -/* import { umbPickDocumentVariantModal, type UmbDocumentBlueprintVariantPickerModalType } from '../modals/index.js';*/ -import { UMB_DOCUMENT_BLUEPRINT_ROOT_WORKSPACE_ALIAS } from './manifests.js'; -import { UMB_INVARIANT_CULTURE, UmbVariantId } from '@umbraco-cms/backoffice/variant'; +import { UmbContentTypeStructureManager } from '@umbraco-cms/backoffice/content-type'; import { - UmbEditableWorkspaceContextBase, + UmbSubmittableWorkspaceContextBase, + UmbWorkspaceIsNewRedirectController, + UmbWorkspaceRouteManager, UmbWorkspaceSplitViewManager, - type UmbVariantableWorkspaceContextInterface, } from '@umbraco-cms/backoffice/workspace'; import { appendToFrozenArray, mergeObservables, - jsonStringComparison, UmbArrayState, UmbObjectState, } from '@umbraco-cms/backoffice/observable-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbLanguageCollectionRepository, type UmbLanguageDetailModel } from '@umbraco-cms/backoffice/language'; import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; -import { UmbReloadTreeItemChildrenRequestEntityActionEvent } from '@umbraco-cms/backoffice/tree'; -import { UmbRequestReloadStructureForEntityEvent } from '@umbraco-cms/backoffice/event'; -import { UmbContentTypeStructureManager } from '@umbraco-cms/backoffice/content-type'; -import type { Observable } from '@umbraco-cms/backoffice/external/rxjs'; +import { UmbRequestReloadTreeItemChildrenEvent } from '@umbraco-cms/backoffice/tree'; +import { UmbRequestReloadStructureForEntityEvent } from '@umbraco-cms/backoffice/entity-action'; +import { UmbDocumentTypeDetailRepository } from '@umbraco-cms/backoffice/document-type'; +import { UMB_INVARIANT_CULTURE, UmbVariantId } from '@umbraco-cms/backoffice/variant'; type EntityType = UmbDocumentBlueprintDetailModel; -export class UmbDocumentBlueprintWorkspaceContext - extends UmbEditableWorkspaceContextBase - implements UmbVariantableWorkspaceContextInterface -{ +export class UmbDocumentBlueprintWorkspaceContext extends UmbSubmittableWorkspaceContextBase { // public readonly repository = new UmbDocumentBlueprintDetailRepository(this); - #parent?: { entityType: string; unique: string | null }; + #parent = new UmbObjectState<{ entityType: string; unique: string | null } | undefined>(undefined); + readonly parentUnique = this.#parent.asObservablePart((parent) => (parent ? parent.unique : undefined)); /** - * The document is the current state/draft version of the document. */ #persistedData = new UmbObjectState(undefined); #currentData = new UmbObjectState(undefined); @@ -57,13 +50,12 @@ export class UmbDocumentBlueprintWorkspaceContext } readonly unique = this.#currentData.asObservablePart((data) => data?.unique); - readonly contentTypeUnique = this.#currentData.asObservablePart((data) => data?.documentType.unique); readonly contentTypeHasCollection = this.#currentData.asObservablePart((data) => !!data?.documentType.collection); - readonly variants = this.#currentData.asObservablePart((data) => data?.variants ?? []); + + readonly variants = this.#currentData.asObservablePart((data) => data?.variants || []); readonly urls = this.#currentData.asObservablePart((data) => data?.urls || []); - readonly templateId = this.#currentData.asObservablePart((data) => data?.template?.unique || null); readonly structure = new UmbContentTypeStructureManager(this, new UmbDocumentTypeDetailRepository(this)); readonly variesByCulture = this.structure.ownerContentTypePart((x) => x?.variesByCulture); @@ -75,6 +67,7 @@ export class UmbDocumentBlueprintWorkspaceContext ); #varies?: boolean; + readonly routes = new UmbWorkspaceRouteManager(this); readonly splitView = new UmbWorkspaceSplitViewManager(); readonly variantOptions = mergeObservables( @@ -109,12 +102,39 @@ export class UmbDocumentBlueprintWorkspaceContext ); constructor(host: UmbControllerHost) { - super(host, UMB_DOCUMENT_BLUEPRINT_ROOT_WORKSPACE_ALIAS); + super(host, 'Umb.Workspace.Media'); this.observe(this.contentTypeUnique, (unique) => this.structure.loadType(unique)); this.observe(this.varies, (varies) => (this.#varies = varies)); this.loadLanguages(); + + this.routes.setRoutes([ + { + path: 'create/parent/:entityType/:parentUnique/:documentTypeUnique', + component: () => import('./document-blueprint-workspace-editor.element.js'), + setup: async (_component, info) => { + const parentEntityType = info.match.params.entityType; + const parentUnique = info.match.params.parentUnique === 'null' ? null : info.match.params.parentUnique; + const documentTypeUnique = info.match.params.documentTypeUnique; + this.create({ entityType: parentEntityType, unique: parentUnique }, documentTypeUnique); + + new UmbWorkspaceIsNewRedirectController( + this, + this, + this.getHostElement().shadowRoot!.querySelector('umb-router-slot')!, + ); + }, + }, + { + path: 'edit/:unique', + component: () => import('./document-blueprint-workspace-editor.element.js'), + setup: (_component, info) => { + const unique = info.match.params.unique; + this.load(unique); + }, + }, + ]); } resetState() { @@ -132,33 +152,44 @@ export class UmbDocumentBlueprintWorkspaceContext async load(unique: string) { this.resetState(); this.#getDataPromise = this.repository.requestByUnique(unique); - const { data } = await this.#getDataPromise; - if (!data) return undefined; + type GetDataType = Awaited>; + const { data, asObservable } = (await this.#getDataPromise) as GetDataType; - this.setIsNew(false); - this.#persistedData.setValue(data); - this.#currentData.setValue(data); - return data || undefined; + if (data) { + this.setIsNew(false); + this.#persistedData.update(data); + this.#currentData.update(data); + } + + this.observe(asObservable(), (entity) => this.#onStoreChange(entity), 'UmbDocumentBlueprintStoreObserver'); + } + + #onStoreChange(entity: EntityType | undefined) { + if (!entity) { + //TODO: This solution is alright for now. But reconsider when we introduce signal-r + history.pushState(null, '', 'section/media'); + } } async create(parent: { entityType: string; unique: string | null }, documentTypeUnique: string) { this.resetState(); - this.#parent = parent; + this.#parent.setValue(parent); this.#getDataPromise = this.repository.createScaffold({ - documentType: { - unique: documentTypeUnique, - collection: null, - }, + documentType: { unique: documentTypeUnique, collection: null }, }); const { data } = await this.#getDataPromise; if (!data) return undefined; this.setIsNew(true); - this.#persistedData.setValue(undefined); + this.#persistedData.setValue(data); this.#currentData.setValue(data); return data; } + getCollectionAlias() { + return 'Umb.Collection.Media'; + } + getData() { return this.#currentData.getValue(); } @@ -179,13 +210,6 @@ export class UmbDocumentBlueprintWorkspaceContext getVaries() { return this.#varies; } - /* - getVariesByCulture() { - return this.#variesByCulture; - } - getVariesBySegment() { - return this.#variesBySegment; - }*/ variantById(variantId: UmbVariantId) { return this.#currentData.asObservablePart((data) => data?.variants?.find((x) => variantId.compare(x))); @@ -206,34 +230,29 @@ export class UmbDocumentBlueprintWorkspaceContext } setName(name: string, variantId?: UmbVariantId) { - /* - const oldVariants = this.#currentData.getValue()?.variants || []; - const variants = partialUpdateFrozenArray( - oldVariants, - { name }, - variantId ? (x) => variantId.compare(x) : () => true, - ); - this.#currentData.update({ variants }); - */ - // TODO: We should move this type of logic to the act of saving [NL] + // const oldVariants = this.#currentData.getValue()?.variants || []; + // const variants = partialUpdateFrozenArray( + // oldVariants, + // { name }, + // variantId ? (x) => variantId.compare(x) : () => true, + // ); + // this.#currentData.update({ variants }); + this.#updateVariantData(variantId ?? UmbVariantId.CreateInvariant(), { name }); } - setTemplate(templateUnique: string) { - this.#currentData.update({ template: { unique: templateUnique } }); + name(variantId?: UmbVariantId) { + return this.#currentData.asObservablePart((data) => data?.variants?.find((x) => variantId?.compare(x))?.name ?? ''); } async propertyStructureById(propertyId: string) { return this.structure.propertyStructureById(propertyId); } - async propertyValueByAlias( - propertyAlias: string, - variantId?: UmbVariantId, - ): Promise | undefined> { + async propertyValueByAlias(propertyAlias: string, variantId?: UmbVariantId) { return this.#currentData.asObservablePart( (data) => - data?.values?.find((x) => x?.alias === propertyAlias && (variantId ? variantId.compare(x) : true)) + data?.values?.find((x) => x?.alias === propertyAlias && (variantId ? variantId.compare(x as any) : true)) ?.value as PropertyValueType, ); } @@ -245,25 +264,29 @@ export class UmbDocumentBlueprintWorkspaceContext * @returns The value or undefined if not set or found. */ getPropertyValue(alias: string, variantId?: UmbVariantId) { - const currentData = this.getData(); + const currentData = this.#currentData.value; if (currentData) { const newDataSet = currentData.values?.find( - (x) => x.alias === alias && (variantId ? variantId.compare(x) : true), + (x) => x.alias === alias && (variantId ? variantId.compare(x as any) : true), ); return newDataSet?.value as ReturnType; } return undefined; } - async setPropertyValue(alias: string, value: ValueType, variantId?: UmbVariantId) { - variantId ??= UmbVariantId.CreateInvariant(); + async setPropertyValue( + alias: string, + value: UmbDocumentBlueprintValueModel, + variantId?: UmbVariantId, + ) { + if (!variantId) throw new Error('VariantId is missing'); - const entry = { ...variantId.toObject(), alias, value } as UmbDocumentBlueprintValueModel; - const currentData = this.getData(); + const entry = { ...variantId.toObject(), alias, value }; + const currentData = this.#currentData.value; if (currentData) { const values = appendToFrozenArray( - currentData.values ?? [], + currentData.values || [], entry, - (x) => x.alias === alias && variantId!.compare(x), + (x) => x.alias === alias && (variantId ? variantId.compare(x as any) : true), ); this.#currentData.update({ values }); @@ -272,7 +295,7 @@ export class UmbDocumentBlueprintWorkspaceContext } } - #calculateChangedVariants() { + /* #calculateChangedVariants() { const persisted = this.#persistedData.getValue(); const current = this.#currentData.getValue(); if (!current) throw new Error('Current data is missing'); @@ -302,7 +325,7 @@ export class UmbDocumentBlueprintWorkspaceContext .filter((x) => x.equal === false) .map((x) => new UmbVariantId(x.culture, x.segment)) ?? [] ); - } + } */ #updateVariantData(variantId: UmbVariantId, update?: Partial) { const currentData = this.getData(); @@ -314,9 +337,7 @@ export class UmbDocumentBlueprintWorkspaceContext const newVariants = appendToFrozenArray( currentData.variants, { - state: null, name: '', - publishDate: null, createDate: null, updateDate: null, ...variantId.toObject(), @@ -333,9 +354,7 @@ export class UmbDocumentBlueprintWorkspaceContext // Cause we are invariant, we will just overwrite all variants with this one: const newVariants = [ { - state: null, name: '', - publishDate: null, createDate: null, updateDate: null, ...invariantVariantId.toObject(), @@ -348,113 +367,28 @@ export class UmbDocumentBlueprintWorkspaceContext throw new Error('Varies by culture is missing'); } } - /* - async #runUserFlorFor(type: UmbDocumentBlueprintVariantPickerModalType): Promise { - const activeVariants = this.splitView.getActiveVariants(); - const activeVariantIds = activeVariants.map((activeVariant) => UmbVariantId.Create(activeVariant)); - // TODO: We need to filter the selected array, so it only contains one of each variantId. [NL] - const changedVariantIds = this.#calculateChangedVariants(); - const selected = activeVariantIds.concat(changedVariantIds); - // Selected can contain entries that are not part of the options, therefor the modal filters selection based on options. - - const options = await firstValueFrom(this.variantOptions); - - // If there is only one variant, we don't need to open the modal. - if (options.length === 0) { - throw new Error('No variants are available'); - } else if (options.length === 1) { - // If only one option we will skip ahead and save the document with the only variant available: - const firstVariant = UmbVariantId.Create(options[0]); - return this.#performSaveOrCreate([firstVariant]); - } - - const selectedVariants = await umbPickDocumentVariantModal(this, { type, options, selected }); - - // If no variants are selected, we don't save anything. - if (!selectedVariants.length) return []; - - return this.#performSaveOrCreate(selectedVariants); - } - */ - - #buildSaveData(selectedVariants: Array): UmbDocumentBlueprintDetailModel { - const data = this.getData(); - if (!data) throw new Error('Data is missing'); - if (!data.unique) throw new Error('Unique is missing'); - const invariantVariantId = UmbVariantId.CreateInvariant(); - if (this.#varies === false) { - // If we do not vary, we wil just do this for the invariant variant id. - selectedVariants = [invariantVariantId]; - } - - const persistedData = this.#persistedData.getValue(); - - const variantIdsToParseForValues = [...selectedVariants]; - if (this.#varies === true) { - // If we vary then We need to include the invariant variant id for invariant values to be saved, as we always want to save the invariant values. - variantIdsToParseForValues.push(invariantVariantId); - } - - // Combine data and persisted data depending on the selectedVariants. Always use the invariant values from the data. - // loops over each entry in values, determine wether the value should be from the data or the persisted data, depending on wether its a selectedVariant or an invariant value. - // loops over each entry in variants, determine wether the variant should be from the data or the persisted data, depending on the selectedVariants. - return { - ...data, - values: data.values - .map((value) => { - // Should this value be saved? - if (variantIdsToParseForValues.some((x) => x.compare(value))) { - return value; - } else { - // If not we will find the value in the persisted data and use that instead. - return persistedData?.values.find( - (x) => x.alias === value.alias && x.culture === value.culture && x.segment === value.segment, - ); - } - }) - .filter((x) => x !== undefined) as Array>, - variants: data.variants - .map((variant) => { - // Should this value be saved? - if (selectedVariants.some((x) => x.compare(variant))) { - return variant; - } else { - // If not we will find the value in the persisted data and use that instead. - return persistedData?.variants.find((x) => x.culture === variant.culture && x.segment === variant.segment); - } - }) - .filter((x) => x !== undefined) as Array, - }; - } - - async #performSaveOrCreate(selectedVariants: Array) { - const saveData = this.#buildSaveData(selectedVariants); + async #createOrSave() { + if (!this.#currentData.value?.unique) throw new Error('Unique is missing'); if (this.getIsNew()) { - if (!this.#parent) throw new Error('Parent is not set'); + const parent = this.#parent.getValue(); + if (!parent) throw new Error('Parent is not set'); + const value = this.#currentData.value; - const { data: create, error } = await this.repository.create(saveData, this.#parent.unique); - if (!create || error) { - console.error('Error creating document', error); - throw new Error('Error creating document'); + if ((await this.repository.create(value, parent.unique)).data !== undefined) { + this.setIsNew(false); + + // TODO: this might not be the right place to alert the tree, but it works for now + const eventContext = await this.getContext(UMB_ACTION_EVENT_CONTEXT); + const event = new UmbRequestReloadTreeItemChildrenEvent({ + entityType: parent.entityType, + unique: parent.unique, + }); + eventContext.dispatchEvent(event); } - - this.setIsNew(false); - - // TODO: this might not be the right place to alert the tree, but it works for now - const eventContext = await this.getContext(UMB_ACTION_EVENT_CONTEXT); - const event = new UmbReloadTreeItemChildrenRequestEntityActionEvent({ - entityType: this.#parent.entityType, - unique: this.#parent.unique, - }); - eventContext.dispatchEvent(event); } else { - const { data: save, error } = await this.repository.save(saveData); - if (!save || error) { - console.error('Error saving document', error); - throw new Error('Error saving document'); - } + await this.repository.save(this.#currentData.value); const actionEventContext = await this.getContext(UMB_ACTION_EVENT_CONTEXT); const event = new UmbRequestReloadStructureForEntityEvent({ @@ -464,19 +398,14 @@ export class UmbDocumentBlueprintWorkspaceContext actionEventContext.dispatchEvent(event); } - - return selectedVariants; } - async save() { - //await this.#runUserFlorFor('save'); + async submit() { const data = this.getData(); if (!data) throw new Error('Data is missing'); - - this.#persistedData.setValue(data); - this.#currentData.setValue(data); - - this.workspaceComplete(data); + await this.#createOrSave(); + this.setIsNew(false); + return true; } async delete() { @@ -486,17 +415,24 @@ export class UmbDocumentBlueprintWorkspaceContext } } - public createPropertyDatasetContext(host: UmbControllerHost, variantId: UmbVariantId) { - return new UmbDocumentPropertyDataContext(host, this as any, variantId); + /* + concept notes: + + public saveAndPreview() { + } + */ + /* + public createPropertyDatasetContext(host: UmbControllerHost, variantId: UmbVariantId) { + return new UmbDocumentPropertyDataContext(host, this, variantId); + }*/ public destroy(): void { this.#persistedData.destroy(); this.#currentData.destroy(); this.structure.destroy(); - this.#languageRepository.destroy(); super.destroy(); } } -export default UmbDocumentBlueprintWorkspaceContext; +export { UmbDocumentBlueprintWorkspaceContext as api }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.element.ts index abf3533d08..a31cf9b80b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.element.ts @@ -37,7 +37,7 @@ export class UmbDocumentBlueprintWorkspaceElement extends UmbLitElement { path: 'edit/:unique', component: this.#editorElement, setup: (_component, info) => { - this.removeControllerByAlias('isNewRedirectController'); + this.removeUmbControllerByAlias('isNewRedirectController'); const unique = info.match.params.unique; this.#workspaceContext.load(unique); }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/manifests.ts index 6e9d8a47d5..d77dd06dc4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/manifests.ts @@ -1,13 +1,13 @@ -import { UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, UMB_DOCUMENT_BLUEPRINT_ROOT_ENTITY_TYPE } from '../entity.js'; +import { UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE } from '../entity.js'; import { UmbSaveWorkspaceAction } from '@umbraco-cms/backoffice/workspace'; import type { ManifestWorkspace, ManifestWorkspaceActions } from '@umbraco-cms/backoffice/extension-registry'; -export const UMB_DOCUMENT_BLUEPRINT_ROOT_WORKSPACE_ALIAS = 'Umb.Workspace.DocumentBlueprint.Root'; +export const UMB_DOCUMENT_BLUEPRINT_WORKSPACE_ALIAS = 'Umb.Workspace.DocumentBlueprint'; const workspace: ManifestWorkspace = { type: 'workspace', - alias: UMB_DOCUMENT_BLUEPRINT_ROOT_WORKSPACE_ALIAS, - name: 'Document Blueprint Root Workspace', + alias: UMB_DOCUMENT_BLUEPRINT_WORKSPACE_ALIAS, + name: 'Document Blueprint Workspace', js: () => import('./document-blueprint-workspace.element.js'), meta: { entityType: UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, From 88545b9f9582767d12e21e2b23cdf9135ddbbd2a Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 9 Apr 2024 09:59:38 +0200 Subject: [PATCH 198/280] add tests --- .../localization.controller.test.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.controller.test.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.controller.test.ts index c9b1ab775a..e85968960f 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.controller.test.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.controller.test.ts @@ -274,6 +274,22 @@ describe('UmbLocalizeController', () => { }); }); + describe('string', () => { + it('should replace words prefixed with a # with translated value', async () => { + const str = '#close'; + const str2 = '#logout #close'; + const str3 = '#logout #missing_translation_key #close'; + expect(controller.string(str)).to.equal('Close'); + expect(controller.string(str2)).to.equal('Log out Close'); + expect(controller.string(str3)).to.equal('Log out #missing_translation_key Close'); + }); + + it('should return the word with a # if the word is not found', async () => { + const str = '#missing_translation_key'; + expect(controller.string(str)).to.equal('#missing_translation_key'); + }); + }); + describe('host element', () => { let element: UmbLocalizeControllerHostElement; From 5a34eba10cb30e90d5cb19a03ad9d8a3e8845a51 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Tue, 9 Apr 2024 10:06:53 +0200 Subject: [PATCH 199/280] remove extra layout --- .../src/assets/login.jpg | Bin 366426 -> 0 bytes .../auth/modals/umb-app-auth-modal.element.ts | 74 +++--------------- 2 files changed, 13 insertions(+), 61 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/assets/login.jpg diff --git a/src/Umbraco.Web.UI.Client/src/assets/login.jpg b/src/Umbraco.Web.UI.Client/src/assets/login.jpg deleted file mode 100644 index 6b97f2c9439bdaabb9172019081f9afb6b87bcb0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 366426 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
yu9tN}s3Cwo+N_0sSF(yJrXN0wmd2gkoBF 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≫0m*T$-UoS(m&+$j@TiDQ#uA% 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 z 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˦#& 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 RoZB^R@^NtHar)np{{sh8y1M`X diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.element.ts index c767b57350..9fb5122908 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/auth/modals/umb-app-auth-modal.element.ts @@ -30,22 +30,17 @@ export class UmbAppAuthModalElement extends UmbModalBaseElement - - -

${this.headline}

- ${this.data?.userLoginState === 'timedOut' - ? html`

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

` - : ''} - -
-

+ +

${this.headline}

+ ${this.data?.userLoginState === 'timedOut' + ? html`

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

` + : ''} + +
`; } @@ -59,41 +54,13 @@ export class UmbAppAuthModalElement extends UmbModalBaseElement Date: Tue, 9 Apr 2024 10:10:20 +0200 Subject: [PATCH 200/280] update implementation after labelKey is removed --- .../input-document-granular-user-permission.element.ts | 9 +-------- .../components/user-group-ref/user-group-ref.element.ts | 2 +- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/input-document-granular-user-permission/input-document-granular-user-permission.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/input-document-granular-user-permission/input-document-granular-user-permission.element.ts index 7eb0367957..661cbed611 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/input-document-granular-user-permission/input-document-granular-user-permission.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/input-document-granular-user-permission/input-document-granular-user-permission.element.ts @@ -218,14 +218,7 @@ export class UmbInputDocumentGranularUserPermissionElement extends FormControlMi ) .map((m) => { const manifest = m as ManifestEntityUserPermission; - - if (manifest.meta.labelKey) { - return this.localize.term(manifest.meta.labelKey); - } else if (manifest.meta.label) { - return manifest.meta.label; - } else { - return manifest.name; - } + return manifest.meta.label ? this.localize.string(manifest.meta.label) : manifest.name; }) .join(', '); } 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 79d6c5adf5..1c2b3c03a7 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 @@ -40,7 +40,7 @@ export class UmbUserGroupRefElement extends UmbElementMixin(UUIRefNodeElement) { #setUserPermissionLabels(manifests: Array) { this.#userPermissionLabels = manifests.map((manifest) => - manifest.meta.labelKey ? this.localize.term(manifest.meta.labelKey) : manifest.meta.label ?? '', + manifest.meta.label ? this.localize.string(manifest.meta.label) : manifest.name, ); } From 5bbdca08feedca185364ba4c608c466a7aa54f58 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Tue, 9 Apr 2024 10:19:43 +0200 Subject: [PATCH 201/280] remove automatic opacity --- .../backoffice-modal-container.element.ts | 1 - 1 file changed, 1 deletion(-) 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 1ad2272850..bd01e0acf1 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 @@ -113,7 +113,6 @@ export class UmbBackofficeModalContainerElement extends UmbLitElement { :host([fill-background]) #container::after { background: var(--backdrop-background); - opacity: 0.75; } `, ]; From 7fe1fa772d31368b06bd367c15797d502715d22e Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Tue, 9 Apr 2024 10:19:59 +0200 Subject: [PATCH 202/280] set background with logo for backdrop when first signing in --- src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts b/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts index db450075c4..78f61dd40b 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts @@ -122,8 +122,8 @@ export class UmbAppAuthController extends UmbControllerBase { }, modal: { backdropBackground: this.#firstTimeLoggingIn - ? 'var(--umb-auth-backdrop, rgba(0, 0, 0, 0.75))' - : 'var(--umb-auth-backdrop-timedout, #000)', + ? 'var(--umb-auth-backdrop, url("/umbraco/backoffice/assets/umbraco_logo_white.svg") 20px 20px / 200px no-repeat, radial-gradient(circle, rgba(2,0,36,1) 0%, rgba(40,58,151,.9) 50%, rgba(0,212,255,1) 100%))' + : 'var(--umb-auth-backdrop-timedout, rgba(0,0,0,0.75))', }, }) .onSubmit() From 149c662a9897bc9d811370a50e6c223447cac12e Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Tue, 9 Apr 2024 10:31:06 +0200 Subject: [PATCH 203/280] generate new models --- .../src/services/PackageResource.ts | 25 ------------------- 1 file changed, 25 deletions(-) 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 5224dc06b3..6698b384b0 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 @@ -194,31 +194,6 @@ export class PackageResource { }); } - /** - * @returns any Success - * @throws ApiError - */ - public static getPackageManifest(): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/package/manifest', - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getPackageManifestPublic(): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/package/manifest/public', - }); - } - /** * @returns any Success * @throws ApiError From 455712ecd71e3da5856dbb6a8ef9bcd00214c095 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Tue, 9 Apr 2024 10:35:53 +0200 Subject: [PATCH 204/280] update code after merge --- .../src/apps/app/app.element.ts | 4 ++-- .../src/packages/core/umbraco-package.ts | 12 ------------ 2 files changed, 2 insertions(+), 14 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/umbraco-package.ts diff --git a/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts b/src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts index f33d0b672f..e5a2a100ab 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,4 +1,4 @@ -import { onInit } from '../../packages/core/index.js'; +import { onInit } from '../../packages/core/entry-point.js'; import type { UmbAppErrorElement } from './app-error.element.js'; import { UmbAppContext } from './app.context.js'; import { UmbServerConnection } from './server-connection.js'; @@ -89,7 +89,7 @@ export class UmbAppElement extends UmbLitElement { this.#authContext = new UmbAuthContext(this, this.serverUrl, this.backofficePath, this.bypassAuth); new UmbAppContext(this, { backofficePath: this.backofficePath, serverUrl: this.serverUrl }); - // Register Core extensions + // Register Core extensions (this is specifically done here because we need these extensions to be registered before the application is initialized) onInit(this, umbExtensionsRegistry); // Register public extensions diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/umbraco-package.ts b/src/Umbraco.Web.UI.Client/src/packages/core/umbraco-package.ts deleted file mode 100644 index 98bf5c8f3b..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/core/umbraco-package.ts +++ /dev/null @@ -1,12 +0,0 @@ -import type { ManifestEntryPoint } from '@umbraco-cms/backoffice/extension-api'; - -export const name = 'Umbraco.Core'; -export const version = '0.0.1'; -export const extensions: Array = [ - { - name: 'Core Entry Point', - alias: 'Umb.EntryPoint.Core', - type: 'entryPoint', - js: () => import('./entry-point.js'), - }, -]; From d99104e8000b84e3fff2259e701800b0c2d0862c Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Tue, 9 Apr 2024 10:40:19 +0200 Subject: [PATCH 205/280] fix wrong import --- src/Umbraco.Web.UI.Client/src/mocks/e2e-handlers.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 45c56d006b..30ecb97891 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 configHandlers } from './handlers/config.handlers.js'; export const handlers = [ serverHandlers.serverRunningHandler, serverHandlers.serverInformationHandler, - manifestsHandlers.manifestEmptyHandlers, + ...manifestsHandlers.manifestEmptyHandlers, ...auditLogHandlers, ...installHandlers, ...upgradeHandlers, From a3199d54f41bd1caca1e3a0eb8145bce5800696a Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 9 Apr 2024 11:25:47 +0200 Subject: [PATCH 206/280] temp ts ignore --- .../src/libs/localization-api/localization.controller.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.controller.ts b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.controller.ts index 49691db7e7..1a2ebfbfdf 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/localization-api/localization.controller.ts @@ -166,6 +166,9 @@ export class UmbLocalizationController { const key = match.slice(1); + // TODO: find solution to pass dynamic string to term + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore const localized = this.term(key); // we didn't find a localized string, so we return the original string with the # return localized === key ? match : localized; From 4bc218a315fdd81ace63065637f4e47ed43f9410 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 9 Apr 2024 12:24:14 +0200 Subject: [PATCH 207/280] add conditions --- .../entity-actions/create/manifests.ts | 6 +++ .../culture-and-hostnames/manifests.ts | 6 +++ .../documents/entity-actions/manifests.ts | 53 +++++++++++++++++++ .../entity-actions/public-access/manifests.ts | 6 +++ .../sort-children-of/manifests.ts | 6 +++ 5 files changed, 77 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create/manifests.ts index 844d5dd2ff..bac22f39b7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create/manifests.ts @@ -14,6 +14,12 @@ const entityActions: Array = [ icon: 'icon-add', label: 'Create...', }, + conditions: [ + { + alias: 'Umb.Condition.UserPermission.Document', + match: UMB_USER_PERMISSION_DOCUMENT_CREATE, + }, + ], }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/culture-and-hostnames/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/culture-and-hostnames/manifests.ts index 76f0b2f269..e7be38a554 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/culture-and-hostnames/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/culture-and-hostnames/manifests.ts @@ -15,6 +15,12 @@ const entityActions: Array = [ icon: 'icon-home', label: 'Culture and Hostnames...', }, + conditions: [ + { + alias: 'Umb.Condition.UserPermission.Document', + match: UMB_USER_PERMISSION_DOCUMENT_CULTURE_AND_HOSTNAMES, + }, + ], }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts index 3d5c84ca4c..4b27b62e9f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts @@ -1,6 +1,11 @@ import { UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS } from '../repository/index.js'; import { UMB_DOCUMENT_ENTITY_TYPE } from '../entity.js'; import { UMB_DOCUMENT_PICKER_MODAL } from '../modals/index.js'; +import { + UMB_USER_PERMISSION_DOCUMENT_DELETE, + UMB_USER_PERMISSION_DOCUMENT_PUBLISH, + UMB_USER_PERMISSION_DOCUMENT_UNPUBLISH, +} from '../user-permissions/constants.js'; import { manifests as createManifests } from './create/manifests.js'; import { manifests as publicAccessManifests } from './public-access/manifests.js'; import { manifests as cultureAndHostnamesManifests } from './culture-and-hostnames/manifests.js'; @@ -20,6 +25,12 @@ const entityActions: Array = [ itemRepositoryAlias: UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS, pickerModalAlias: UMB_DOCUMENT_PICKER_MODAL, }, + conditions: [ + { + alias: 'Umb.Condition.UserPermission.Document', + match: UMB_USER_PERMISSION_DOCUMENT_DELETE, + }, + ], }, { type: 'entityAction', @@ -33,6 +44,12 @@ const entityActions: Array = [ icon: 'icon-blueprint', label: 'Create Document Blueprint (TBD)', }, + conditions: [ + { + alias: 'Umb.Condition.UserPermission.Document', + match: UMB_USER_PERMISSION_DOCUMENT_CREATE_BLUEPRINT, + }, + ], }, { type: 'entityAction', @@ -46,6 +63,12 @@ const entityActions: Array = [ itemRepositoryAlias: UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS, pickerModelAlias: UMB_DOCUMENT_PICKER_MODAL, }, + conditions: [ + { + alias: 'Umb.Condition.UserPermission.Document', + match: UMB_USER_PERMISSION_DOCUMENT_MOVE, + }, + ], }, { type: 'entityAction', @@ -59,6 +82,12 @@ const entityActions: Array = [ itemRepositoryAlias: UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS, pickerModal: UMB_DOCUMENT_PICKER_MODAL, }, + conditions: [ + { + alias: 'Umb.Condition.UserPermission.Document', + match: UMB_USER_PERMISSION_DOCUMENT_DUPLICATE, + }, + ], }, { type: 'entityAction', @@ -72,6 +101,12 @@ const entityActions: Array = [ icon: 'icon-globe', label: 'Publish', }, + conditions: [ + { + alias: 'Umb.Condition.UserPermission.Document', + match: UMB_USER_PERMISSION_DOCUMENT_PUBLISH, + }, + ], }, { type: 'entityAction', @@ -85,6 +120,12 @@ const entityActions: Array = [ icon: 'icon-globe', label: 'Unpublish...', }, + conditions: [ + { + alias: 'Umb.Condition.UserPermission.Document', + match: UMB_USER_PERMISSION_DOCUMENT_UNPUBLISH, + }, + ], }, { type: 'entityAction', @@ -98,6 +139,12 @@ const entityActions: Array = [ icon: 'icon-name-badge', label: 'Permissions...', }, + conditions: [ + { + alias: 'Umb.Condition.UserPermission.Document', + match: UMB_USER_PERMISSION_DOCUMENT_PERMISSIONS, + }, + ], }, { type: 'entityAction', @@ -111,6 +158,12 @@ const entityActions: Array = [ icon: 'icon-megaphone', label: 'Notifications...', }, + conditions: [ + { + alias: 'Umb.Condition.UserPermission.Document', + match: UMB_USER_PERMISSION_DOCUMENT_NOTIFICATIONS, + }, + ], }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/manifests.ts index 6fafa57fb6..271f0274d4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/manifests.ts @@ -15,6 +15,12 @@ const entityActions: Array = [ icon: 'icon-lock', label: 'Restrict Public Access...', }, + conditions: [ + { + alias: 'Umb.Condition.UserPermission.Document', + match: UMB_USER_PERMISSION_DOCUMENT_PUBLIC_ACCESS, + }, + ], }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/sort-children-of/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/sort-children-of/manifests.ts index e38ec7363f..22c12d959b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/sort-children-of/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/sort-children-of/manifests.ts @@ -18,5 +18,11 @@ export const manifests: Array = [ sortChildrenOfRepositoryAlias: UMB_SORT_CHILDREN_OF_DOCUMENT_REPOSITORY_ALIAS, treeRepositoryAlias: UMB_DOCUMENT_TREE_REPOSITORY_ALIAS, }, + conditions: [ + { + alias: 'Umb.Condition.UserPermission.Document', + match: UMB_USER_PERMISSION_DOCUMENT_SORT, + }, + ], }, ]; From 7c910266d4a74a30e8d04dcb41e86f5934bbb2b4 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 9 Apr 2024 12:24:48 +0200 Subject: [PATCH 208/280] Update manifests.ts --- .../documents/documents/entity-actions/create/manifests.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create/manifests.ts index bac22f39b7..2706244689 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create/manifests.ts @@ -1,4 +1,5 @@ import { UMB_DOCUMENT_ENTITY_TYPE, UMB_DOCUMENT_ROOT_ENTITY_TYPE } from '../../entity.js'; +import { UMB_USER_PERMISSION_DOCUMENT_CREATE } from '../../user-permissions/index.js'; import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; const entityActions: Array = [ From f6c72a99eb7c33bc9b22f612b015da208a3c64b7 Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Tue, 9 Apr 2024 12:36:45 +0200 Subject: [PATCH 209/280] document blueprint action, use documentblueprintresource --- ...ent-blueprint-detail.server.data-source.ts | 29 ++--- .../documents/document-blueprints/types.ts | 3 - .../entity-actions/create-blueprint.action.ts | 15 --- .../create-blueprint.action.ts | 23 ++++ .../entity-actions/create-blueprint/index.ts | 1 + .../create-blueprint/manifests.ts | 29 +++++ .../modal/create-blueprint-modal.element.ts | 114 ++++++++++++++++++ .../modal/create-blueprint-modal.token.ts | 15 +++ .../create-blueprint/modal/index.ts | 2 + .../documents/entity-actions/manifests.ts | 15 +-- 10 files changed, 196 insertions(+), 50 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint.action.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/create-blueprint.action.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/modal/create-blueprint-modal.element.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/modal/create-blueprint-modal.token.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/modal/index.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/detail/document-blueprint-detail.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/detail/document-blueprint-detail.server.data-source.ts index 3cfc56e569..13671e4eb2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/detail/document-blueprint-detail.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/repository/detail/document-blueprint-detail.server.data-source.ts @@ -1,4 +1,4 @@ -import type { UmbDocumentBlueprintDetailModel, UmbDocumentBlueprintVariantModel } from '../../types.js'; +import type { UmbDocumentBlueprintDetailModel } from '../../types.js'; import { UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE } from '../../entity.js'; import { UmbId } from '@umbraco-cms/backoffice/id'; import type { UmbDetailDataSource } from '@umbraco-cms/backoffice/repository'; @@ -6,7 +6,7 @@ import type { CreateDocumentRequestModel, UpdateDocumentRequestModel, } from '@umbraco-cms/backoffice/external/backend-api'; -import { DocumentResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { DocumentBlueprintResource } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -37,13 +37,10 @@ export class UmbDocumentBlueprintServerDataSource implements UmbDetailDataSource const data: UmbDocumentBlueprintDetailModel = { entityType: UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, unique: UmbId.new(), - urls: [], - template: null, documentType: { unique: '', collection: null, }, - isTrashed: false, values: [], variants: [], ...preset, @@ -80,7 +77,10 @@ export class UmbDocumentBlueprintServerDataSource implements UmbDetailDataSource async read(unique: string) { if (!unique) throw new Error('Unique is missing'); - const { data, error } = await tryExecuteAndNotify(this.#host, DocumentResource.getDocumentById({ id: unique })); + const { data, error } = await tryExecuteAndNotify( + this.#host, + DocumentBlueprintResource.getDocumentBlueprintById({ id: unique }), + ); if (error || !data) { return { error }; @@ -109,18 +109,10 @@ export class UmbDocumentBlueprintServerDataSource implements UmbDetailDataSource updateDate: variant.updateDate, }; }), - urls: data.urls.map((url) => { - return { - culture: url.culture || null, - url: url.url, - }; - }), - template: data.template ? { unique: data.template.id } : null, documentType: { unique: data.documentType.id, collection: data.documentType.collection ? { unique: data.documentType.collection.id } : null, }, - isTrashed: data.isTrashed, }; return { data: document }; @@ -141,14 +133,14 @@ export class UmbDocumentBlueprintServerDataSource implements UmbDetailDataSource id: model.unique, parent: parentUnique ? { id: parentUnique } : null, documentType: { id: model.documentType.unique }, - template: model.template ? { id: model.template.unique } : null, + values: model.values, variants: model.variants, }; const { data, error } = await tryExecuteAndNotify( this.#host, - DocumentResource.postDocument({ + DocumentBlueprintResource.postDocumentBlueprint({ requestBody, }), ); @@ -171,14 +163,13 @@ export class UmbDocumentBlueprintServerDataSource implements UmbDetailDataSource // TODO: make data mapper to prevent errors const requestBody: UpdateDocumentRequestModel = { - template: model.template ? { id: model.template.unique } : null, values: model.values, variants: model.variants, }; const { error } = await tryExecuteAndNotify( this.#host, - DocumentResource.putDocumentById({ + DocumentBlueprintResource.putDocumentBlueprintById({ id: model.unique, requestBody, }), @@ -201,6 +192,6 @@ export class UmbDocumentBlueprintServerDataSource implements UmbDetailDataSource if (!unique) throw new Error('Unique is missing'); // TODO: update to delete when implemented - return tryExecuteAndNotify(this.#host, DocumentResource.putDocumentByIdMoveToRecycleBin({ id: unique })); + return tryExecuteAndNotify(this.#host, DocumentBlueprintResource.deleteDocumentBlueprintById({ id: unique })); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/types.ts index 4cb2c496f1..09965e112f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/types.ts @@ -10,10 +10,7 @@ export interface UmbDocumentBlueprintDetailModel { collection: UmbReferenceByUnique | null; }; entityType: UmbDocumentBlueprintEntityType; - isTrashed: boolean; - template: { unique: string } | null; unique: string; - urls: Array; values: Array; variants: Array; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint.action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint.action.ts deleted file mode 100644 index dac438922f..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint.action.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { UmbEntityActionArgs } from '@umbraco-cms/backoffice/entity-action'; -import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action'; -import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; - -export class UmbCreateDocumentBlueprintEntityAction extends UmbEntityActionBase { - constructor(host: UmbControllerHost, args: UmbEntityActionArgs) { - super(host, args); - } - - async execute() { - console.log(`execute for: ${this.args.unique}`); - //await this.repository?.createBlueprint(); - } -} -export default UmbCreateDocumentBlueprintEntityAction; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/create-blueprint.action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/create-blueprint.action.ts new file mode 100644 index 0000000000..6bf9bec25d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/create-blueprint.action.ts @@ -0,0 +1,23 @@ +import { UMB_CREATE_BLUEPRINT_MODAL } from './modal/create-blueprint-modal.token.js'; +import type { UmbEntityActionArgs } from '@umbraco-cms/backoffice/entity-action'; +import { UmbEntityActionBase } from '@umbraco-cms/backoffice/entity-action'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; +import { UmbDocumentBlueprintDetailRepository } from '@umbraco-cms/backoffice/document-blueprint'; + +export class UmbCreateDocumentBlueprintEntityAction extends UmbEntityActionBase { + #repository = new UmbDocumentBlueprintDetailRepository(this); + + constructor(host: UmbControllerHost, args: UmbEntityActionArgs) { + super(host, args); + } + + async execute() { + const modalManager = await this.getContext(UMB_MODAL_MANAGER_CONTEXT); + const modalContext = modalManager.open(this, UMB_CREATE_BLUEPRINT_MODAL, { + data: { unique: this.args.unique }, + }); + await modalContext.onSubmit().catch(() => undefined); + } +} +export default UmbCreateDocumentBlueprintEntityAction; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/index.ts new file mode 100644 index 0000000000..28d9f38fba --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/index.ts @@ -0,0 +1 @@ +export * from './modal/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/manifests.ts new file mode 100644 index 0000000000..3de8559c0a --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/manifests.ts @@ -0,0 +1,29 @@ +import { UMB_DOCUMENT_ENTITY_TYPE } from '../../entity.js'; +import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; + +const entityActions: Array = [ + { + type: 'entityAction', + kind: 'default', + alias: 'Umb.EntityAction.Document.CreateBlueprint', + name: 'Create Document Blueprint Entity Action', + weight: 1000, + api: () => import('./create-blueprint.action.js'), + forEntityTypes: [UMB_DOCUMENT_ENTITY_TYPE], + meta: { + icon: 'icon-blueprint', + label: 'Create Content Template', + }, + }, +]; + +const manifestModals: Array = [ + { + type: 'modal', + alias: 'Umb.Modal.CreateBlueprint', + name: 'Create Blueprint Modal', + js: () => import('./modal/create-blueprint-modal.element.js'), + }, +]; + +export const manifests = [...entityActions, ...manifestModals]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/modal/create-blueprint-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/modal/create-blueprint-modal.element.ts new file mode 100644 index 0000000000..b4e55bb144 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/modal/create-blueprint-modal.element.ts @@ -0,0 +1,114 @@ +import { UmbDocumentDetailRepository } from '../../../repository/index.js'; +import type { UmbCreateBlueprintModalData } from './create-blueprint-modal.token.js'; +import { html, customElement, css, state } from '@umbraco-cms/backoffice/external/lit'; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; +import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; +import type { UmbDocumentDetailModel } from '@umbraco-cms/backoffice/document'; +import { + type UmbDocumentBlueprintDetailModel, + UmbDocumentBlueprintDetailRepository, +} from '@umbraco-cms/backoffice/document-blueprint'; +import type { UUIInputEvent } from '@umbraco-cms/backoffice/external/uui'; + +@customElement('umb-create-blueprint-modal') +export class UmbCreateBlueprintModalElement extends UmbModalBaseElement { + #blueprintRepository = new UmbDocumentBlueprintDetailRepository(this); + #documentRepository = new UmbDocumentDetailRepository(this); + + #documentUnique = ''; + #document?: UmbDocumentDetailModel; + + @state() + private _documentName = ''; + + @state() + private _blueprintName = ''; + + firstUpdated() { + this.#documentUnique = this.data?.unique ?? ''; + this.#getDocumentData(); + } + + async #getDocumentData() { + const { data } = await this.#documentRepository.requestByUnique(this.#documentUnique); + if (!data) return; + + this.#document = data; + this._documentName = data.variants[0].name; + this._blueprintName = data.variants[0].name; + } + + #mapDocumentToBlueprintModel() { + if (!this.#document) return; + const variants = { ...this.#document?.variants, name: this._blueprintName }; + const model: UmbDocumentBlueprintDetailModel = { ...this.#document, entityType: 'document-blueprint', variants }; + + return model; + } + + async #handleSave() { + const model = this.#mapDocumentToBlueprintModel(); + if (!model) return; + const { error } = await this.#blueprintRepository.create(model, null); + console.log('error', error); + this.modalContext?.submit(); + } + + #renderBlueprintName() { + return html`Create a new Content Template from ${this._documentName} + A Content Template is predefined content that an editor can select to use as the basis for creating new content . + Name + (this._blueprintName = e.target.value as string)}>`; + } + + render() { + return html` + + ${this.#renderBlueprintName()} + + + + `; + } + + #handleClose() { + this.modalContext?.reject(); + } + + static styles = [ + UmbTextStyles, + css` + strong, + uui-label, + uui-input { + display: block; + } + + uui-label { + margin-top: var(--uui-size-space-6); + } + `, + ]; +} + +export default UmbCreateBlueprintModalElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-create-blueprint-modal': UmbCreateBlueprintModalElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/modal/create-blueprint-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/modal/create-blueprint-modal.token.ts new file mode 100644 index 0000000000..dbd009afca --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/modal/create-blueprint-modal.token.ts @@ -0,0 +1,15 @@ +import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; + +export interface UmbCreateBlueprintModalData { + unique: string | null; +} + +export const UMB_CREATE_BLUEPRINT_MODAL = new UmbModalToken( + 'Umb.Modal.CreateBlueprint', + { + modal: { + type: 'sidebar', + size: 'small', + }, + }, +); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/modal/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/modal/index.ts new file mode 100644 index 0000000000..9f1d8090a6 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/modal/index.ts @@ -0,0 +1,2 @@ +export * from './create-blueprint-modal.token.js'; +export * from './create-blueprint-modal.element.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts index 3d5c84ca4c..8de4f5b9f6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts @@ -2,6 +2,7 @@ import { UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS } from '../repository/index.js'; import { UMB_DOCUMENT_ENTITY_TYPE } from '../entity.js'; import { UMB_DOCUMENT_PICKER_MODAL } from '../modals/index.js'; import { manifests as createManifests } from './create/manifests.js'; +import { manifests as createBlueprintManifests } from './create-blueprint/manifests.js'; import { manifests as publicAccessManifests } from './public-access/manifests.js'; import { manifests as cultureAndHostnamesManifests } from './culture-and-hostnames/manifests.js'; import { manifests as sortChildrenOfManifests } from './sort-children-of/manifests.js'; @@ -21,19 +22,6 @@ const entityActions: Array = [ pickerModalAlias: UMB_DOCUMENT_PICKER_MODAL, }, }, - { - type: 'entityAction', - kind: 'default', - alias: 'Umb.EntityAction.Document.CreateBlueprint', - name: 'Create Document Blueprint Entity Action', - weight: 1000, - api: () => import('./create-blueprint.action.js'), - forEntityTypes: [UMB_DOCUMENT_ENTITY_TYPE], - meta: { - icon: 'icon-blueprint', - label: 'Create Document Blueprint (TBD)', - }, - }, { type: 'entityAction', alias: 'Umb.EntityAction.Document.Move', @@ -116,6 +104,7 @@ const entityActions: Array = [ export const manifests = [ ...createManifests, + ...createBlueprintManifests, ...publicAccessManifests, ...cultureAndHostnamesManifests, ...sortChildrenOfManifests, From aa208bb1084ef4a33c5e717c8067134f43da7b0c Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Tue, 9 Apr 2024 12:41:56 +0200 Subject: [PATCH 210/280] set name --- .../modal/create-blueprint-modal.element.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/modal/create-blueprint-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/modal/create-blueprint-modal.element.ts index b4e55bb144..b099cb20af 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/modal/create-blueprint-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/modal/create-blueprint-modal.element.ts @@ -9,6 +9,7 @@ import { UmbDocumentBlueprintDetailRepository, } from '@umbraco-cms/backoffice/document-blueprint'; import type { UUIInputEvent } from '@umbraco-cms/backoffice/external/uui'; +import { UmbId } from '@umbraco-cms/backoffice/id'; @customElement('umb-create-blueprint-modal') export class UmbCreateBlueprintModalElement extends UmbModalBaseElement { @@ -40,8 +41,13 @@ export class UmbCreateBlueprintModalElement extends UmbModalBaseElement ({ ...variant, name: this._blueprintName })); + const model: UmbDocumentBlueprintDetailModel = { + ...this.#document, + entityType: 'document-blueprint', + variants, + unique: UmbId.new(), + }; return model; } From 004427dfe22aabc02360ebeaee28a4e163efe3ab Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 9 Apr 2024 13:17:10 +0200 Subject: [PATCH 211/280] implement allOf to allow multiple verbs for one permission condition --- .../extension-registry/conditions/types.ts | 10 ++++----- .../entity-actions/create/manifests.ts | 2 +- .../culture-and-hostnames/manifests.ts | 3 ++- .../documents/entity-actions/manifests.ts | 21 ++++++++++++------- .../entity-actions/public-access/manifests.ts | 3 ++- .../sort-children-of/manifests.ts | 3 ++- .../src/packages/documents/documents/types.ts | 1 + .../document-user-permission.condition.ts | 11 +++++----- 8 files changed, 32 insertions(+), 22 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/conditions/types.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/conditions/types.ts index f6747e7ed9..3c893630a7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/conditions/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/conditions/types.ts @@ -3,26 +3,26 @@ import type { CollectionBulkActionPermissionConditionConfig } from '../../collec import type { UmbSectionUserPermissionConditionConfig } from '../../section/conditions/index.js'; import type { SectionAliasConditionConfig } from './section-alias.condition.js'; import type { SwitchConditionConfig } from './switch.condition.js'; -import type { UserPermissionConditionConfig } from '@umbraco-cms/backoffice/user-permission'; import type { BlockWorkspaceHasSettingsConditionConfig } from '@umbraco-cms/backoffice/block'; import type { WorkspaceAliasConditionConfig, WorkspaceEntityTypeConditionConfig, } from '@umbraco-cms/backoffice/workspace'; import type { UmbConditionConfigBase } from '@umbraco-cms/backoffice/extension-api'; +import type { UmbDocumentUserPermissionConditionConfig } from '@umbraco-cms/backoffice/document'; /* TODO: in theory should't the core package import from other packages. Are there any other way we can do this? Niels: Sadly I don't see any other solutions currently. But are very open for ideas :-) now that I think about it maybe there is some ability to extend a global type, similar to the 'declare global' trick we use on Elements. */ export type ConditionTypes = + | BlockWorkspaceHasSettingsConditionConfig | CollectionAliasConditionConfig | CollectionBulkActionPermissionConditionConfig | SectionAliasConditionConfig - | WorkspaceAliasConditionConfig - | BlockWorkspaceHasSettingsConditionConfig - | WorkspaceEntityTypeConditionConfig | SwitchConditionConfig - | UserPermissionConditionConfig + | UmbDocumentUserPermissionConditionConfig | UmbSectionUserPermissionConditionConfig + | WorkspaceAliasConditionConfig + | WorkspaceEntityTypeConditionConfig | UmbConditionConfigBase; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create/manifests.ts index 2706244689..55eeb98d8a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create/manifests.ts @@ -18,7 +18,7 @@ const entityActions: Array = [ conditions: [ { alias: 'Umb.Condition.UserPermission.Document', - match: UMB_USER_PERMISSION_DOCUMENT_CREATE, + allOf: [UMB_USER_PERMISSION_DOCUMENT_CREATE], }, ], }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/culture-and-hostnames/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/culture-and-hostnames/manifests.ts index e7be38a554..d1f5066a78 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/culture-and-hostnames/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/culture-and-hostnames/manifests.ts @@ -1,4 +1,5 @@ import { UMB_DOCUMENT_ENTITY_TYPE } from '../../entity.js'; +import { UMB_USER_PERMISSION_DOCUMENT_CULTURE_AND_HOSTNAMES } from '../../user-permissions/index.js'; import { UmbDocumentCultureAndHostnamesEntityAction } from './culture-and-hostnames.action.js'; import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; @@ -18,7 +19,7 @@ const entityActions: Array = [ conditions: [ { alias: 'Umb.Condition.UserPermission.Document', - match: UMB_USER_PERMISSION_DOCUMENT_CULTURE_AND_HOSTNAMES, + allOf: [UMB_USER_PERMISSION_DOCUMENT_CULTURE_AND_HOSTNAMES], }, ], }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts index 4b27b62e9f..c1958c0ffb 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/manifests.ts @@ -2,7 +2,12 @@ import { UMB_DOCUMENT_DETAIL_REPOSITORY_ALIAS } from '../repository/index.js'; import { UMB_DOCUMENT_ENTITY_TYPE } from '../entity.js'; import { UMB_DOCUMENT_PICKER_MODAL } from '../modals/index.js'; import { + UMB_USER_PERMISSION_DOCUMENT_CREATE_BLUEPRINT, UMB_USER_PERMISSION_DOCUMENT_DELETE, + UMB_USER_PERMISSION_DOCUMENT_DUPLICATE, + UMB_USER_PERMISSION_DOCUMENT_MOVE, + UMB_USER_PERMISSION_DOCUMENT_NOTIFICATIONS, + UMB_USER_PERMISSION_DOCUMENT_PERMISSIONS, UMB_USER_PERMISSION_DOCUMENT_PUBLISH, UMB_USER_PERMISSION_DOCUMENT_UNPUBLISH, } from '../user-permissions/constants.js'; @@ -28,7 +33,7 @@ const entityActions: Array = [ conditions: [ { alias: 'Umb.Condition.UserPermission.Document', - match: UMB_USER_PERMISSION_DOCUMENT_DELETE, + allOf: [UMB_USER_PERMISSION_DOCUMENT_DELETE], }, ], }, @@ -47,7 +52,7 @@ const entityActions: Array = [ conditions: [ { alias: 'Umb.Condition.UserPermission.Document', - match: UMB_USER_PERMISSION_DOCUMENT_CREATE_BLUEPRINT, + allOf: [UMB_USER_PERMISSION_DOCUMENT_CREATE_BLUEPRINT], }, ], }, @@ -66,7 +71,7 @@ const entityActions: Array = [ conditions: [ { alias: 'Umb.Condition.UserPermission.Document', - match: UMB_USER_PERMISSION_DOCUMENT_MOVE, + allOf: [UMB_USER_PERMISSION_DOCUMENT_MOVE], }, ], }, @@ -85,7 +90,7 @@ const entityActions: Array = [ conditions: [ { alias: 'Umb.Condition.UserPermission.Document', - match: UMB_USER_PERMISSION_DOCUMENT_DUPLICATE, + allOf: [UMB_USER_PERMISSION_DOCUMENT_DUPLICATE], }, ], }, @@ -104,7 +109,7 @@ const entityActions: Array = [ conditions: [ { alias: 'Umb.Condition.UserPermission.Document', - match: UMB_USER_PERMISSION_DOCUMENT_PUBLISH, + allOf: [UMB_USER_PERMISSION_DOCUMENT_PUBLISH], }, ], }, @@ -123,7 +128,7 @@ const entityActions: Array = [ conditions: [ { alias: 'Umb.Condition.UserPermission.Document', - match: UMB_USER_PERMISSION_DOCUMENT_UNPUBLISH, + allOf: [UMB_USER_PERMISSION_DOCUMENT_UNPUBLISH], }, ], }, @@ -142,7 +147,7 @@ const entityActions: Array = [ conditions: [ { alias: 'Umb.Condition.UserPermission.Document', - match: UMB_USER_PERMISSION_DOCUMENT_PERMISSIONS, + allOf: [UMB_USER_PERMISSION_DOCUMENT_PERMISSIONS], }, ], }, @@ -161,7 +166,7 @@ const entityActions: Array = [ conditions: [ { alias: 'Umb.Condition.UserPermission.Document', - match: UMB_USER_PERMISSION_DOCUMENT_NOTIFICATIONS, + allOf: [UMB_USER_PERMISSION_DOCUMENT_NOTIFICATIONS], }, ], }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/manifests.ts index 271f0274d4..0e0e684fe2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/manifests.ts @@ -1,4 +1,5 @@ import { UMB_DOCUMENT_ENTITY_TYPE } from '../../entity.js'; +import { UMB_USER_PERMISSION_DOCUMENT_PUBLIC_ACCESS } from '../../user-permissions/index.js'; import { UmbDocumentPublicAccessEntityAction } from './public-access.action.js'; import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; @@ -18,7 +19,7 @@ const entityActions: Array = [ conditions: [ { alias: 'Umb.Condition.UserPermission.Document', - match: UMB_USER_PERMISSION_DOCUMENT_PUBLIC_ACCESS, + allOf: [UMB_USER_PERMISSION_DOCUMENT_PUBLIC_ACCESS], }, ], }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/sort-children-of/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/sort-children-of/manifests.ts index 22c12d959b..0476d0180a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/sort-children-of/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/sort-children-of/manifests.ts @@ -1,6 +1,7 @@ import { UMB_DOCUMENT_ENTITY_TYPE, UMB_DOCUMENT_ROOT_ENTITY_TYPE } from '../../entity.js'; import { UMB_DOCUMENT_ITEM_REPOSITORY_ALIAS } from '../../repository/index.js'; import { UMB_DOCUMENT_TREE_REPOSITORY_ALIAS } from '../../tree/index.js'; +import { UMB_USER_PERMISSION_DOCUMENT_SORT } from '../../user-permissions/index.js'; import { UMB_SORT_CHILDREN_OF_DOCUMENT_REPOSITORY_ALIAS } from './repository/constants.js'; import { manifests as repositoryManifests } from './repository/manifests.js'; import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; @@ -21,7 +22,7 @@ export const manifests: Array = [ conditions: [ { alias: 'Umb.Condition.UserPermission.Document', - match: UMB_USER_PERMISSION_DOCUMENT_SORT, + allOf: [UMB_USER_PERMISSION_DOCUMENT_SORT], }, ], }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/types.ts index 8c5903cfa5..fca17e55dc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/types.ts @@ -3,6 +3,7 @@ import type { UmbVariantModel, UmbVariantOptionModel, UmbVariantPublishModel } f import type { UmbReferenceByUnique } from '@umbraco-cms/backoffice/models'; import { DocumentVariantStateModel as UmbDocumentVariantState } from '@umbraco-cms/backoffice/external/backend-api'; export { UmbDocumentVariantState }; +export type { UmbDocumentUserPermissionConditionConfig } from './user-permissions/document-user-permission.condition.js'; export interface UmbDocumentDetailModel { documentType: { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-user-permission.condition.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-user-permission.condition.ts index b9b0d62a56..91a0e19528 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-user-permission.condition.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-user-permission.condition.ts @@ -58,17 +58,18 @@ export class UmbDocumentUserPermissionCondition if (!this.#entityType) return; if (this.#unique === undefined) return; - let verbs: Array = []; + let verbs: Array = this.#fallbackPermissions; if (this.#documentPermissions) { const permissionsForCurrentDocument = this.#documentPermissions.find( (permission) => permission.document.id === this.#unique, ); const currentDocumentVerbs = permissionsForCurrentDocument ? permissionsForCurrentDocument.verbs : []; - verbs = this.#fallbackPermissions.concat(currentDocumentVerbs); + verbs = verbs.concat(currentDocumentVerbs); } - this.permitted = verbs.includes(this.config.match); + const uniqueVerbs = [...new Set(verbs)]; + this.permitted = this.config.allOf.every((verb) => uniqueVerbs.includes(verb)); } } @@ -78,9 +79,9 @@ export type UmbDocumentUserPermissionConditionConfig = * * * @example - * "Umb.Document.Create" + * ["Umb.Document.Save", "Umb.Document.Publish"] */ - match: string; + allOf: Array; }; export const manifest: ManifestCondition = { From 27271b1fe665e9d4e0acd686df245d3fa706d7b9 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Tue, 9 Apr 2024 14:25:37 +0200 Subject: [PATCH 212/280] add /logout to post logout uri redirect in the signout method --- .../src/apps/app/app-auth.controller.ts | 9 +++++++-- src/Umbraco.Web.UI.Client/src/apps/app/app.element.ts | 7 +++++++ .../src/packages/core/auth/auth-flow.ts | 5 ++++- .../src/packages/core/auth/auth.context.ts | 8 ++++++-- 4 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts b/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts index 78f61dd40b..758803b65b 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts @@ -65,7 +65,9 @@ export class UmbAppAuthController extends UmbControllerBase { } // Save location.href so we can redirect to it after login - window.sessionStorage.setItem(UMB_STORAGE_REDIRECT_URL, location.href); + if (location.href !== this.#authContext.getPostLogoutRedirectUrl()) { + window.sessionStorage.setItem(UMB_STORAGE_REDIRECT_URL, location.href); + } // If the user is timed out, we can show the login modal directly if (userLoginState === 'timedOut') { @@ -90,7 +92,10 @@ export class UmbAppAuthController extends UmbControllerBase { this.#authContext.makeAuthorizationRequest(); } else { // Check if any provider is redirecting directly to the provider - const redirectProvider = availableProviders.find((provider) => provider.meta?.behavior?.autoRedirect); + const redirectProvider = + userLoginState === 'loggingIn' + ? availableProviders.find((provider) => provider.meta?.behavior?.autoRedirect) + : undefined; if (redirectProvider) { // Redirect directly to the provider 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 e5a2a100ab..de8c4ee346 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 @@ -56,6 +56,13 @@ export class UmbAppElement extends UmbLitElement { component: () => import('../upgrader/upgrader.element.js'), guards: [this.#isAuthorizedGuard()], }, + { + path: 'logout', + resolve: () => { + this.#authContext?.clearTokenStorage(); + this.#authController.makeAuthorizationRequest('loggedOut'); + }, + }, { path: '**', component: () => import('../backoffice/backoffice.element.js'), diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/auth/auth-flow.ts b/src/Umbraco.Web.UI.Client/src/packages/core/auth/auth-flow.ts index 01b20582f9..82455be922 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/auth/auth-flow.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/auth/auth-flow.ts @@ -89,6 +89,7 @@ export class UmbAuthFlow { // state readonly #configuration: AuthorizationServiceConfiguration; readonly #redirectUri: string; + readonly #postLogoutRedirectUri: string; readonly #clientId: string; readonly #scope: string; @@ -99,10 +100,12 @@ export class UmbAuthFlow { constructor( openIdConnectUrl: string, redirectUri: string, + postLogoutRedirectUri: string, clientId = 'umbraco-back-office', scope = 'offline_access', ) { this.#redirectUri = redirectUri; + this.#postLogoutRedirectUri = postLogoutRedirectUri; this.#clientId = clientId; this.#scope = scope; @@ -283,7 +286,7 @@ export class UmbAuthFlow { // 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}`; + location.href = `${this.#configuration.endSessionEndpoint}?post_logout_redirect_uri=${this.#postLogoutRedirectUri}`; } /** diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/auth/auth.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/auth/auth.context.ts index cf99b23c35..be37177cc0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/auth/auth.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/auth/auth.context.ts @@ -26,7 +26,7 @@ export class UmbAuthContext extends UmbContextBase { this.#serverUrl = serverUrl; this.#backofficePath = backofficePath; - this.#authFlow = new UmbAuthFlow(serverUrl, this.#getRedirectUrl()); + this.#authFlow = new UmbAuthFlow(serverUrl, this.getRedirectUrl(), this.getPostLogoutRedirectUrl()); } /** @@ -166,7 +166,11 @@ export class UmbAuthContext extends UmbContextBase { return this.isInitialized.pipe(switchMap(() => umbExtensionsRegistry.byType('authProvider'))); } - #getRedirectUrl() { + getRedirectUrl() { return `${window.location.origin}${this.#backofficePath}`; } + + getPostLogoutRedirectUrl() { + return `${window.location.origin}${this.#backofficePath.endsWith('/') ? this.#backofficePath : this.#backofficePath + '/'}logout`; + } } From 8cb105b00c828f08ce3638da78072a5c48c4884b Mon Sep 17 00:00:00 2001 From: JesmoDev <26099018+JesmoDev@users.noreply.github.com> Date: Tue, 9 Apr 2024 14:27:49 +0200 Subject: [PATCH 213/280] small fixes --- .../rollback/repository/rollback.repository.ts | 12 ++++-------- ...document-workspace-view-info-history.element.ts | 14 +++++--------- 2 files changed, 9 insertions(+), 17 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/repository/rollback.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/repository/rollback.repository.ts index e4ba53c696..1d8ec27d60 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/repository/rollback.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/repository/rollback.repository.ts @@ -13,23 +13,19 @@ export class UmbRollbackRepository extends UmbControllerBase implements UmbApi { } async requestVersionsByDocumentId(id: string, culture?: string) { - const { data, error } = await this.#dataSource.getVersionsByDocumentId(id, culture); - return { data, error }; + return await this.#dataSource.getVersionsByDocumentId(id, culture); } async requestVersionById(id: string) { - const { data, error } = await this.#dataSource.getVersionById(id); - return { data, error }; + return await this.#dataSource.getVersionById(id); } async setPreventCleanup(versionId: string, preventCleanup: boolean) { - const { error } = await this.#dataSource.setPreventCleanup(versionId, preventCleanup); - return { error }; + return await this.#dataSource.setPreventCleanup(versionId, preventCleanup); } async rollback(versionId: string, culture?: string) { - const { error } = await this.#dataSource.rollback(versionId, culture); - return { error }; + return await this.#dataSource.rollback(versionId, culture); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info-history.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info-history.element.ts index 0c73f5cf84..36c6aee92e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info-history.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info-history.element.ts @@ -1,3 +1,4 @@ +import { UMB_ROLLBACK_MODAL } from '../../../modals/rollback/index.js'; import { HistoryTagStyleAndText, TimeOptions } from './utils.js'; import { UmbAuditLogRepository } from '@umbraco-cms/backoffice/audit-log'; import { @@ -15,15 +16,12 @@ import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import type { AuditLogWithUsernameResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; import { DirectionModel } from '@umbraco-cms/backoffice/external/backend-api'; -import { UMB_MODAL_MANAGER_CONTEXT, type UmbModalManagerContext } from '@umbraco-cms/backoffice/modal'; -import { UMB_ROLLBACK_MODAL_ALIAS } from '../../../modals/manifests.js'; -import { UMB_ROLLBACK_MODAL } from '../../../modals/rollback/index.js'; +import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; @customElement('umb-document-workspace-view-info-history') export class UmbDocumentWorkspaceViewInfoHistoryElement extends UmbLitElement { #logRepository: UmbAuditLogRepository; #itemsPerPage = 10; - #modalContext?: UmbModalManagerContext; @property() documentUnique = ''; @@ -40,9 +38,6 @@ export class UmbDocumentWorkspaceViewInfoHistoryElement extends UmbLitElement { constructor() { super(); this.#logRepository = new UmbAuditLogRepository(this); - this.consumeContext(UMB_MODAL_MANAGER_CONTEXT, (instance) => { - this.#modalContext = instance; - }); } protected firstUpdated(): void { @@ -95,8 +90,9 @@ export class UmbDocumentWorkspaceViewInfoHistoryElement extends UmbLitElement { this.#getLogs(); } - #onRollbackModalOpen = () => { - const modalContext = this.#modalContext?.open(this, UMB_ROLLBACK_MODAL, {}); + #onRollbackModalOpen = async () => { + const modalManagerContext = await this.getContext(UMB_MODAL_MANAGER_CONTEXT); + const modalContext = modalManagerContext.open(this, UMB_ROLLBACK_MODAL, {}); if (!modalContext) return; From ec820b0ca912051e9acf6f2175f393ccc4baf19e Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 9 Apr 2024 14:33:24 +0200 Subject: [PATCH 214/280] add user permissions to workspace actions --- .../documents/workspace/manifests.ts | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/manifests.ts index a46f146d5c..0591d7ba88 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/manifests.ts @@ -1,4 +1,9 @@ import { UMB_DOCUMENT_ENTITY_TYPE } from '../entity.js'; +import { + UMB_USER_PERMISSION_DOCUMENT_UNPUBLISH, + UMB_USER_PERMISSION_DOCUMENT_UPDATE, + UMB_USER_PERMISSION_DOCUMENT_PUBLISH, +} from '../user-permissions/index.js'; import { UmbDocumentSaveAndScheduleWorkspaceAction } from './actions/save-and-schedule.action.js'; import { UmbDocumentUnpublishWorkspaceAction } from './actions/unpublish.action.js'; import { UmbDocumentSaveAndPublishWorkspaceAction } from './actions/save-and-publish.action.js'; @@ -101,6 +106,10 @@ const workspaceActions: Array = [ alias: 'Umb.Condition.WorkspaceAlias', match: workspace.alias, }, + { + alias: 'Umb.Condition.UserPermission.Document', + allOf: [UMB_USER_PERMISSION_DOCUMENT_UPDATE, UMB_USER_PERMISSION_DOCUMENT_PUBLISH], + }, ], }, { @@ -120,6 +129,10 @@ const workspaceActions: Array = [ alias: 'Umb.Condition.WorkspaceAlias', match: workspace.alias, }, + { + alias: 'Umb.Condition.UserPermission.Document', + allOf: [UMB_USER_PERMISSION_DOCUMENT_UPDATE], + }, ], }, /* @@ -155,6 +168,12 @@ const workspaceActionMenuItems: Array = [ label: 'Unpublish...', icon: 'icon-globe', }, + conditions: [ + { + alias: 'Umb.Condition.UserPermission.Document', + allOf: [UMB_USER_PERMISSION_DOCUMENT_UNPUBLISH], + }, + ], }, { type: 'workspaceActionMenuItem', @@ -168,6 +187,12 @@ const workspaceActionMenuItems: Array = [ label: 'Publish with descendants...', icon: 'icon-globe', }, + conditions: [ + { + alias: 'Umb.Condition.UserPermission.Document', + allOf: [UMB_USER_PERMISSION_DOCUMENT_UPDATE, UMB_USER_PERMISSION_DOCUMENT_PUBLISH], + }, + ], }, { type: 'workspaceActionMenuItem', @@ -181,6 +206,12 @@ const workspaceActionMenuItems: Array = [ label: 'Schedule...', icon: 'icon-globe', }, + conditions: [ + { + alias: 'Umb.Condition.UserPermission.Document', + allOf: [UMB_USER_PERMISSION_DOCUMENT_UPDATE, UMB_USER_PERMISSION_DOCUMENT_PUBLISH], + }, + ], }, ]; From df9d50bb35927420c10828b21d11fe3eacebe9ac Mon Sep 17 00:00:00 2001 From: leekelleher Date: Tue, 9 Apr 2024 13:39:21 +0100 Subject: [PATCH 215/280] When an Auth Provider has `denyLocalLogin` enables then unregister the default Umbraco provider, e.g. "Umb.AuthProviders.Umbraco" extension. --- .../src/apps/app/app-auth.controller.ts | 56 ++++++++++++------- 1 file changed, 35 insertions(+), 21 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts b/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts index 758803b65b..b87afe24f6 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts @@ -7,7 +7,9 @@ import { import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { filter, firstValueFrom, skip } from '@umbraco-cms/backoffice/external/rxjs'; +import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; +import type { ManifestAuthProvider } from '@umbraco-cms/backoffice/extension-registry'; export class UmbAppAuthController extends UmbControllerBase { #authContext?: typeof UMB_AUTH_CONTEXT.TYPE; @@ -69,9 +71,12 @@ export class UmbAppAuthController extends UmbControllerBase { window.sessionStorage.setItem(UMB_STORAGE_REDIRECT_URL, location.href); } + // Figure out which providers are available + const availableProviders = await firstValueFrom(this.#authContext.getAuthProviders()); + // If the user is timed out, we can show the login modal directly if (userLoginState === 'timedOut') { - const selected = await this.#showLoginModal(userLoginState); + const selected = await this.#showLoginModal(userLoginState, availableProviders); if (!selected) { return false; @@ -80,9 +85,6 @@ export class UmbAppAuthController extends UmbControllerBase { return this.#updateState(); } - // Figure out which providers are available - const availableProviders = await firstValueFrom(this.#authContext.getAuthProviders()); - if (availableProviders.length === 0) { throw new Error('[Fatal] No auth providers available'); } @@ -90,34 +92,46 @@ export class UmbAppAuthController extends UmbControllerBase { if (availableProviders.length === 1) { // One provider available (most likely the Umbraco provider), so initiate the authorization request to the default provider this.#authContext.makeAuthorizationRequest(); - } else { - // Check if any provider is redirecting directly to the provider - const redirectProvider = - userLoginState === 'loggingIn' - ? availableProviders.find((provider) => provider.meta?.behavior?.autoRedirect) - : undefined; + return this.#updateState(); + } - if (redirectProvider) { - // Redirect directly to the provider - this.#authContext.makeAuthorizationRequest(redirectProvider.forProviderName); - } else { - // Show the provider selection screen - const selected = await this.#showLoginModal(userLoginState); + // Check if any provider is redirecting directly to the provider + const redirectProvider = + userLoginState === 'loggingIn' + ? availableProviders.find((provider) => provider.meta?.behavior?.autoRedirect) + : undefined; - if (!selected) { - return false; - } - } + if (redirectProvider) { + // Redirect directly to the provider + this.#authContext.makeAuthorizationRequest(redirectProvider.forProviderName); + return this.#updateState(); + } + + // Show the provider selection screen + const selected = await this.#showLoginModal(userLoginState, availableProviders); + + if (!selected) { + return false; } return this.#updateState(); } - async #showLoginModal(userLoginState: UmbUserLoginState): Promise { + async #showLoginModal( + userLoginState: UmbUserLoginState, + availableProviders: Array, + ): Promise { if (!this.#authContext) { throw new Error('[Fatal] Auth context is not available'); } + // Check if any provider denies local login + const denyLocalLogin = availableProviders.some((provider) => provider.meta?.behavior?.denyLocalLogin); + if (denyLocalLogin) { + // Unregister the Umbraco provider + umbExtensionsRegistry.unregister('Umb.AuthProviders.Umbraco'); + } + // Show the provider selection screen const modalManager = await this.getContext(UMB_MODAL_MANAGER_CONTEXT); const selected = await modalManager From 4b1e1815f6d045455ffb52e81fbf5db843cfc7df Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Tue, 9 Apr 2024 15:07:05 +0200 Subject: [PATCH 216/280] use the built source from @openid/appauth --- src/Umbraco.Web.UI.Client/src/external/openid/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/external/openid/index.ts b/src/Umbraco.Web.UI.Client/src/external/openid/index.ts index fa968cbfc8..5d92bc1f8c 100644 --- a/src/Umbraco.Web.UI.Client/src/external/openid/index.ts +++ b/src/Umbraco.Web.UI.Client/src/external/openid/index.ts @@ -12,6 +12,6 @@ export { RevokeTokenRequest, GRANT_TYPE_AUTHORIZATION_CODE, GRANT_TYPE_REFRESH_TOKEN, -} from '@openid/appauth/src/index.js'; +} from '@openid/appauth'; -export type { LocationLike, StringMap } from '@openid/appauth/src/types.js'; +export type { LocationLike, StringMap } from '@openid/appauth'; From edd7c548052c7a50496359f96502acc70b746d32 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Tue, 9 Apr 2024 15:20:07 +0200 Subject: [PATCH 217/280] use the first providerName for default auth --- src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts b/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts index b87afe24f6..2e3bb77d9b 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts @@ -91,7 +91,7 @@ export class UmbAppAuthController extends UmbControllerBase { if (availableProviders.length === 1) { // One provider available (most likely the Umbraco provider), so initiate the authorization request to the default provider - this.#authContext.makeAuthorizationRequest(); + this.#authContext.makeAuthorizationRequest(availableProviders[0].forProviderName); return this.#updateState(); } From 98f5cd2f56a25f9c52e0cbd6b7303861574ad07e Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 9 Apr 2024 15:31:13 +0200 Subject: [PATCH 218/280] add public methods to enable and disable the action --- .../workspace-action-base.controller.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-action/workspace-action-base.controller.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-action/workspace-action-base.controller.ts index 605ca48cc8..791bf2c720 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-action/workspace-action-base.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-action/workspace-action-base.controller.ts @@ -37,4 +37,20 @@ export abstract class UmbWorkspaceActionBase public execute(): Promise { return Promise.resolve(); } + + /** + * Disables the action. + * @memberof UmbWorkspaceActionBase + */ + public disable(): void { + this._isDisabled.setValue(true); + } + + /** + * Enables the action. + * @memberof UmbWorkspaceActionBase + */ + public enable(): void { + this._isDisabled.setValue(false); + } } From 383fe6d05b62878236567354615b583e88ca166e Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 9 Apr 2024 15:31:58 +0200 Subject: [PATCH 219/280] programatically set the condition for save and publish so we can disable the button instead of removing it --- .../actions/save-and-publish.action.ts | 25 +++++++++++++++++++ .../documents/workspace/manifests.ts | 4 --- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/save-and-publish.action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/save-and-publish.action.ts index 223602ad3c..b211cbfbaf 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/save-and-publish.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/save-and-publish.action.ts @@ -1,7 +1,32 @@ import { UMB_DOCUMENT_WORKSPACE_CONTEXT } from '../document-workspace.context-token.js'; +import { + UMB_USER_PERMISSION_DOCUMENT_PUBLISH, + UMB_USER_PERMISSION_DOCUMENT_UPDATE, +} from '../../user-permissions/constants.js'; +import { UmbDocumentUserPermissionCondition } from '../../user-permissions/document-user-permission.condition.js'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbWorkspaceActionBase } from '@umbraco-cms/backoffice/workspace'; export class UmbDocumentSaveAndPublishWorkspaceAction extends UmbWorkspaceActionBase { + constructor(host: UmbControllerHost, args: any) { + super(host, args); + + /* The action is disabled by default because the onChange callback + will first be triggered when the condition is changed to permitted */ + this.disable(); + + const condition = new UmbDocumentUserPermissionCondition(host, { + host, + config: { + alias: 'Umb.Condition.UserPermission.Document', + allOf: [UMB_USER_PERMISSION_DOCUMENT_UPDATE, UMB_USER_PERMISSION_DOCUMENT_PUBLISH], + }, + onChange: () => { + condition.permitted ? this.enable() : this.disable(); + }, + }); + } + async execute() { const workspaceContext = await this.getContext(UMB_DOCUMENT_WORKSPACE_CONTEXT); return workspaceContext.saveAndPublish(); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/manifests.ts index 0591d7ba88..65eb92d8b6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/manifests.ts @@ -106,10 +106,6 @@ const workspaceActions: Array = [ alias: 'Umb.Condition.WorkspaceAlias', match: workspace.alias, }, - { - alias: 'Umb.Condition.UserPermission.Document', - allOf: [UMB_USER_PERMISSION_DOCUMENT_UPDATE, UMB_USER_PERMISSION_DOCUMENT_PUBLISH], - }, ], }, { From da2c10327d052a1fe3f65a4175673beb9143155d Mon Sep 17 00:00:00 2001 From: leekelleher Date: Tue, 9 Apr 2024 15:41:02 +0100 Subject: [PATCH 220/280] :notebook: Updated LICENSE added Simple Icons; CC0. --- src/Umbraco.Web.UI.Client/LICENSE | 10 +++++++++- .../src/packages/core/icon-registry/LICENSE | 10 +++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/LICENSE b/src/Umbraco.Web.UI.Client/LICENSE index aaba059d33..2819c99ca7 100644 --- a/src/Umbraco.Web.UI.Client/LICENSE +++ b/src/Umbraco.Web.UI.Client/LICENSE @@ -27,10 +27,18 @@ Third-party licenses --- Lucide License -ISC License +ISC License Copyright (c) for portions of Lucide are held by Cole Bemis 2013-2022 as part of Feather (MIT). All other copyright (c) for Lucide are held by Lucide Contributors 2022. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +--- + +Simple Icons +CC0 1.0 Universal license + +The person who associated a work with this deed has dedicated the work to the public domain by waiving all of his or her rights to the work worldwide under copyright law, including all related and neighboring rights, to the extent allowed by law. +You can copy, modify, distribute and perform the work, even for commercial purposes, all without asking permission. diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/LICENSE b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/LICENSE index 4300c4cd5e..66b4696927 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/LICENSE +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/LICENSE @@ -1,8 +1,16 @@ Lucide License -ISC License +ISC License Copyright (c) for portions of Lucide are held by Cole Bemis 2013-2022 as part of Feather (MIT). All other copyright (c) for Lucide are held by Lucide Contributors 2022. Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +--- + +Simple Icons +CC0 1.0 Universal license + +The person who associated a work with this deed has dedicated the work to the public domain by waiving all of his or her rights to the work worldwide under copyright law, including all related and neighboring rights, to the extent allowed by law. +You can copy, modify, distribute and perform the work, even for commercial purposes, all without asking permission. From acab0115a5745e7747fdb7d7ebb12a984ba40902 Mon Sep 17 00:00:00 2001 From: JesmoDev <26099018+JesmoDev@users.noreply.github.com> Date: Tue, 9 Apr 2024 17:03:24 +0200 Subject: [PATCH 221/280] localizations --- .../modals/rollback/rollback-modal.element.ts | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts index 260d3a7d9d..5cf75abeff 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts @@ -181,7 +181,7 @@ export class UmbRollbackModalElement extends UmbModalBaseElement - Language + ${this.localize.term('general_language')}
`; @@ -203,12 +203,14 @@ export class UmbRollbackModalElement extends UmbModalBaseElement

${item.user}

-

${item.isCurrentlyPublishedVersion ? 'Current published version' : ''}

+

${item.isCurrentlyPublishedVersion ? this.localize.term('rollback_currentPublishedVersion') : ''}

this.#onPreventCleanup(event, item.id, !item.preventCleanup)}> - ${item.preventCleanup ? 'Enable cleanup' : 'Prevent cleanup'} + ${item.preventCleanup + ? this.localize.term('contentTypeEditor_historyCleanupEnableCleanup') + : this.localize.term('contentTypeEditor_historyCleanupPreventCleanup')} `; @@ -278,14 +280,18 @@ export class UmbRollbackModalElement extends UmbModalBaseElement
- +
${this.#renderVersions()}
${this.#renderCurrentVersion()}
- Cancel - Rollback + ${this.localize.term('general_cancel')} + ${this.localize.term('general_cancel')}
`; From 657a07561f00945a3627a575fbfb80ee05e5214f Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Tue, 9 Apr 2024 17:12:49 +0200 Subject: [PATCH 222/280] simpleicons is going to remove the twitter icon, so this is now on disk --- .../src/packages/core/icon-registry/icon-dictionary.json | 4 ---- .../src/packages/core/icon-registry/icons/icon-twitter.js | 7 ++++++- .../src/packages/core/icon-registry/icons/icons.json | 2 +- .../src/packages/core/icon-registry/svgs/icon-twitter.svg | 6 +++--- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icon-dictionary.json b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icon-dictionary.json index 1e30ae54aa..99fb107023 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icon-dictionary.json +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icon-dictionary.json @@ -2479,10 +2479,6 @@ "name": "icon-microsoft", "file": "microsoft.svg" }, - { - "name": "icon-twitter", - "file": "twitter.svg" - }, { "name": "icon-twitter-x", "file": "x.svg" diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-twitter.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-twitter.js index 5e4a5c4737..3e61a109ac 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-twitter.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-twitter.js @@ -1 +1,6 @@ -export default `Twitter`; \ No newline at end of file +export default ` + Twitter + + +`; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icons.json b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icons.json index da2d594374..1fe1f387f0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icons.json +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icons.json @@ -1 +1 @@ -[{"name":"icon-activity","path":"./icons/icon-activity.js"},{"name":"icon-add","path":"./icons/icon-add.js"},{"name":"icon-addressbook","path":"./icons/icon-addressbook.js"},{"name":"icon-alarm-clock","path":"./icons/icon-alarm-clock.js"},{"name":"icon-alert-alt","path":"./icons/icon-alert-alt.js"},{"name":"icon-alert","path":"./icons/icon-alert.js"},{"name":"icon-alt","path":"./icons/icon-alt.js"},{"name":"icon-anchor","path":"./icons/icon-anchor.js"},{"name":"icon-app","path":"./icons/icon-app.js"},{"name":"icon-application-window-alt","path":"./icons/icon-application-window-alt.js"},{"name":"icon-application-window","path":"./icons/icon-application-window.js"},{"name":"icon-arrivals","path":"./icons/icon-arrivals.js"},{"name":"icon-arrow-down","path":"./icons/icon-arrow-down.js"},{"name":"icon-arrow-left","path":"./icons/icon-arrow-left.js"},{"name":"icon-arrow-right","path":"./icons/icon-arrow-right.js"},{"name":"icon-arrow-up","path":"./icons/icon-arrow-up.js"},{"name":"icon-attachment","path":"./icons/icon-attachment.js"},{"name":"icon-autofill","path":"./icons/icon-autofill.js"},{"name":"icon-award","path":"./icons/icon-award.js"},{"name":"icon-axis-rotation-2","path":"./icons/icon-axis-rotation-2.js"},{"name":"icon-axis-rotation-3","path":"./icons/icon-axis-rotation-3.js"},{"name":"icon-axis-rotation","path":"./icons/icon-axis-rotation.js"},{"name":"icon-backspace","path":"./icons/icon-backspace.js"},{"name":"icon-badge-add","path":"./icons/icon-badge-add.js"},{"name":"icon-badge-remove","path":"./icons/icon-badge-remove.js"},{"name":"icon-badge-restricted","legacy":true,"path":"./icons/icon-badge-restricted.js"},{"name":"icon-bar-chart","path":"./icons/icon-bar-chart.js"},{"name":"icon-barcode","path":"./icons/icon-barcode.js"},{"name":"icon-bars","path":"./icons/icon-bars.js"},{"name":"icon-battery-full","path":"./icons/icon-battery-full.js"},{"name":"icon-battery-low","path":"./icons/icon-battery-low.js"},{"name":"icon-beer-glass","path":"./icons/icon-beer-glass.js"},{"name":"icon-bell-off","path":"./icons/icon-bell-off.js"},{"name":"icon-bell","path":"./icons/icon-bell.js"},{"name":"icon-binarycode","path":"./icons/icon-binarycode.js"},{"name":"icon-bird","path":"./icons/icon-bird.js"},{"name":"icon-birthday-cake","path":"./icons/icon-birthday-cake.js"},{"name":"icon-block","path":"./icons/icon-block.js"},{"name":"icon-bluetooth","path":"./icons/icon-bluetooth.js"},{"name":"icon-boat-shipping","path":"./icons/icon-boat-shipping.js"},{"name":"icon-bones","path":"./icons/icon-bones.js"},{"name":"icon-book-alt-2","path":"./icons/icon-book-alt-2.js"},{"name":"icon-book-alt","path":"./icons/icon-book-alt.js"},{"name":"icon-book","path":"./icons/icon-book.js"},{"name":"icon-bookmark","path":"./icons/icon-bookmark.js"},{"name":"icon-books","path":"./icons/icon-books.js"},{"name":"icon-box-alt","path":"./icons/icon-box-alt.js"},{"name":"icon-box-open","path":"./icons/icon-box-open.js"},{"name":"icon-box","path":"./icons/icon-box.js"},{"name":"icon-brackets","path":"./icons/icon-brackets.js"},{"name":"icon-brick","path":"./icons/icon-brick.js"},{"name":"icon-briefcase","path":"./icons/icon-briefcase.js"},{"name":"icon-browser-window","path":"./icons/icon-browser-window.js"},{"name":"icon-brush-alt-2","path":"./icons/icon-brush-alt-2.js"},{"name":"icon-brush-alt","path":"./icons/icon-brush-alt.js"},{"name":"icon-brush","path":"./icons/icon-brush.js"},{"name":"icon-bug","path":"./icons/icon-bug.js"},{"name":"icon-bulleted-list","path":"./icons/icon-bulleted-list.js"},{"name":"icon-burn","path":"./icons/icon-burn.js"},{"name":"icon-bus","path":"./icons/icon-bus.js"},{"name":"icon-calculator","path":"./icons/icon-calculator.js"},{"name":"icon-calendar-alt","path":"./icons/icon-calendar-alt.js"},{"name":"icon-calendar","path":"./icons/icon-calendar.js"},{"name":"icon-camcorder","legacy":true,"path":"./icons/icon-camcorder.js"},{"name":"icon-camera-roll","path":"./icons/icon-camera-roll.js"},{"name":"icon-candy","path":"./icons/icon-candy.js"},{"name":"icon-caps-lock","path":"./icons/icon-caps-lock.js"},{"name":"icon-car","path":"./icons/icon-car.js"},{"name":"icon-categories","path":"./icons/icon-categories.js"},{"name":"icon-certificate","path":"./icons/icon-certificate.js"},{"name":"icon-chart-curve","path":"./icons/icon-chart-curve.js"},{"name":"icon-chart","path":"./icons/icon-chart.js"},{"name":"icon-chat-active","legacy":true,"path":"./icons/icon-chat-active.js"},{"name":"icon-chat","path":"./icons/icon-chat.js"},{"name":"icon-check","path":"./icons/icon-check.js"},{"name":"icon-checkbox-dotted","path":"./icons/icon-checkbox-dotted.js"},{"name":"icon-checkbox-empty","legacy":true,"path":"./icons/icon-checkbox-empty.js"},{"name":"icon-checkbox","path":"./icons/icon-checkbox.js"},{"name":"icon-chip-alt","legacy":true,"path":"./icons/icon-chip-alt.js"},{"name":"icon-chip","path":"./icons/icon-chip.js"},{"name":"icon-cinema","path":"./icons/icon-cinema.js"},{"name":"icon-circle-dotted-active","path":"./icons/icon-circle-dotted-active.js"},{"name":"icon-circle-dotted","path":"./icons/icon-circle-dotted.js"},{"name":"icon-circuits","path":"./icons/icon-circuits.js"},{"name":"icon-client","legacy":true,"path":"./icons/icon-client.js"},{"name":"icon-cloud-drive","path":"./icons/icon-cloud-drive.js"},{"name":"icon-cloud-upload","path":"./icons/icon-cloud-upload.js"},{"name":"icon-cloud","path":"./icons/icon-cloud.js"},{"name":"icon-cloudy","path":"./icons/icon-cloudy.js"},{"name":"icon-clubs","path":"./icons/icon-clubs.js"},{"name":"icon-cocktail","path":"./icons/icon-cocktail.js"},{"name":"icon-code","path":"./icons/icon-code.js"},{"name":"icon-coffee","path":"./icons/icon-coffee.js"},{"name":"icon-coin-euro","path":"./icons/icon-coin-euro.js"},{"name":"icon-coin-yen","path":"./icons/icon-coin-yen.js"},{"name":"icon-coins-alt","legacy":true,"path":"./icons/icon-coins-alt.js"},{"name":"icon-coins","path":"./icons/icon-coins.js"},{"name":"icon-color-bucket","path":"./icons/icon-color-bucket.js"},{"name":"icon-colorpicker","path":"./icons/icon-colorpicker.js"},{"name":"icon-columns","path":"./icons/icon-columns.js"},{"name":"icon-combination-lock-open","path":"./icons/icon-combination-lock-open.js"},{"name":"icon-combination-lock","path":"./icons/icon-combination-lock.js"},{"name":"icon-command","path":"./icons/icon-command.js"},{"name":"icon-company","path":"./icons/icon-company.js"},{"name":"icon-compress","path":"./icons/icon-compress.js"},{"name":"icon-connection","path":"./icons/icon-connection.js"},{"name":"icon-console","path":"./icons/icon-console.js"},{"name":"icon-contrast","path":"./icons/icon-contrast.js"},{"name":"icon-conversation-alt","path":"./icons/icon-conversation-alt.js"},{"name":"icon-conversation","legacy":true,"path":"./icons/icon-conversation.js"},{"name":"icon-coverflow","path":"./icons/icon-coverflow.js"},{"name":"icon-credit-card-alt","legacy":true,"path":"./icons/icon-credit-card-alt.js"},{"name":"icon-credit-card","path":"./icons/icon-credit-card.js"},{"name":"icon-crop","path":"./icons/icon-crop.js"},{"name":"icon-crosshair","path":"./icons/icon-crosshair.js"},{"name":"icon-crown-alt","legacy":true,"path":"./icons/icon-crown-alt.js"},{"name":"icon-crown","path":"./icons/icon-crown.js"},{"name":"icon-cupcake","legacy":true,"path":"./icons/icon-cupcake.js"},{"name":"icon-curve","path":"./icons/icon-curve.js"},{"name":"icon-cut","path":"./icons/icon-cut.js"},{"name":"icon-dashboard","path":"./icons/icon-dashboard.js"},{"name":"icon-defrag","path":"./icons/icon-defrag.js"},{"name":"icon-delete-key","path":"./icons/icon-delete-key.js"},{"name":"icon-delete","path":"./icons/icon-delete.js"},{"name":"icon-departure","path":"./icons/icon-departure.js"},{"name":"icon-desktop","legacy":true,"path":"./icons/icon-desktop.js"},{"name":"icon-diagnostics","path":"./icons/icon-diagnostics.js"},{"name":"icon-diagonal-arrow-alt","path":"./icons/icon-diagonal-arrow-alt.js"},{"name":"icon-diagonal-arrow","path":"./icons/icon-diagonal-arrow.js"},{"name":"icon-diamond","path":"./icons/icon-diamond.js"},{"name":"icon-diamonds","path":"./icons/icon-diamonds.js"},{"name":"icon-dice","path":"./icons/icon-dice.js"},{"name":"icon-diploma-alt","legacy":true,"path":"./icons/icon-diploma-alt.js"},{"name":"icon-diploma","path":"./icons/icon-diploma.js"},{"name":"icon-directions-alt","path":"./icons/icon-directions-alt.js"},{"name":"icon-directions","path":"./icons/icon-directions.js"},{"name":"icon-disc","path":"./icons/icon-disc.js"},{"name":"icon-disk-image","path":"./icons/icon-disk-image.js"},{"name":"icon-display","path":"./icons/icon-display.js"},{"name":"icon-dna","path":"./icons/icon-dna.js"},{"name":"icon-dock-connector","path":"./icons/icon-dock-connector.js"},{"name":"icon-document-dashed-line","path":"./icons/icon-document-dashed-line.js"},{"name":"icon-document","path":"./icons/icon-document.js"},{"name":"icon-documents","path":"./icons/icon-documents.js"},{"name":"icon-donate","legacy":true,"path":"./icons/icon-donate.js"},{"name":"icon-door-open-alt","legacy":true,"path":"./icons/icon-door-open-alt.js"},{"name":"icon-door-open","path":"./icons/icon-door-open.js"},{"name":"icon-download-alt","path":"./icons/icon-download-alt.js"},{"name":"icon-download","path":"./icons/icon-download.js"},{"name":"icon-drop","path":"./icons/icon-drop.js"},{"name":"icon-eco","path":"./icons/icon-eco.js"},{"name":"icon-economy","legacy":true,"path":"./icons/icon-economy.js"},{"name":"icon-edit","path":"./icons/icon-edit.js"},{"name":"icon-employee","legacy":true,"path":"./icons/icon-employee.js"},{"name":"icon-energy-saving-bulb","path":"./icons/icon-energy-saving-bulb.js"},{"name":"icon-enter","path":"./icons/icon-enter.js"},{"name":"icon-equalizer","path":"./icons/icon-equalizer.js"},{"name":"icon-escape","path":"./icons/icon-escape.js"},{"name":"icon-ethernet","path":"./icons/icon-ethernet.js"},{"name":"icon-eye","path":"./icons/icon-eye.js"},{"name":"icon-facebook-like","path":"./icons/icon-facebook-like.js"},{"name":"icon-factory","path":"./icons/icon-factory.js"},{"name":"icon-favorite","path":"./icons/icon-favorite.js"},{"name":"icon-file-cabinet","path":"./icons/icon-file-cabinet.js"},{"name":"icon-files","path":"./icons/icon-files.js"},{"name":"icon-filter","path":"./icons/icon-filter.js"},{"name":"icon-fingerprint","path":"./icons/icon-fingerprint.js"},{"name":"icon-fire","path":"./icons/icon-fire.js"},{"name":"icon-firewire","legacy":true,"path":"./icons/icon-firewire.js"},{"name":"icon-flag-alt","path":"./icons/icon-flag-alt.js"},{"name":"icon-flag","path":"./icons/icon-flag.js"},{"name":"icon-flash","path":"./icons/icon-flash.js"},{"name":"icon-flashlight","path":"./icons/icon-flashlight.js"},{"name":"icon-flowerpot","path":"./icons/icon-flowerpot.js"},{"name":"icon-folder","path":"./icons/icon-folder.js"},{"name":"icon-folders","path":"./icons/icon-folders.js"},{"name":"icon-font","path":"./icons/icon-font.js"},{"name":"icon-food","path":"./icons/icon-food.js"},{"name":"icon-footprints","path":"./icons/icon-footprints.js"},{"name":"icon-forking","path":"./icons/icon-forking.js"},{"name":"icon-frame-alt","legacy":true,"path":"./icons/icon-frame-alt.js"},{"name":"icon-frame","path":"./icons/icon-frame.js"},{"name":"icon-fullscreen-alt","path":"./icons/icon-fullscreen-alt.js"},{"name":"icon-fullscreen","path":"./icons/icon-fullscreen.js"},{"name":"icon-game","path":"./icons/icon-game.js"},{"name":"icon-geometry","legacy":true,"path":"./icons/icon-geometry.js"},{"name":"icon-gift","path":"./icons/icon-gift.js"},{"name":"icon-glasses","path":"./icons/icon-glasses.js"},{"name":"icon-globe-alt","path":"./icons/icon-globe-alt.js"},{"name":"icon-globe-asia","legacy":true,"path":"./icons/icon-globe-asia.js"},{"name":"icon-globe-europe-africa","legacy":true,"path":"./icons/icon-globe-europe-africa.js"},{"name":"icon-globe-inverted-america","legacy":true,"path":"./icons/icon-globe-inverted-america.js"},{"name":"icon-globe-inverted-asia","legacy":true,"path":"./icons/icon-globe-inverted-asia.js"},{"name":"icon-globe-inverted-europe-africa","legacy":true,"path":"./icons/icon-globe-inverted-europe-africa.js"},{"name":"icon-globe","path":"./icons/icon-globe.js"},{"name":"icon-gps","path":"./icons/icon-gps.js"},{"name":"icon-graduate","path":"./icons/icon-graduate.js"},{"name":"icon-grid","path":"./icons/icon-grid.js"},{"name":"icon-hammer","path":"./icons/icon-hammer.js"},{"name":"icon-hand-active-alt","legacy":true,"path":"./icons/icon-hand-active-alt.js"},{"name":"icon-hand-active","path":"./icons/icon-hand-active.js"},{"name":"icon-hand-pointer-alt","legacy":true,"path":"./icons/icon-hand-pointer-alt.js"},{"name":"icon-hand-pointer","path":"./icons/icon-hand-pointer.js"},{"name":"icon-handshake","path":"./icons/icon-handshake.js"},{"name":"icon-handtool-alt","legacy":true,"path":"./icons/icon-handtool-alt.js"},{"name":"icon-handtool","path":"./icons/icon-handtool.js"},{"name":"icon-hard-drive-alt","legacy":true,"path":"./icons/icon-hard-drive-alt.js"},{"name":"icon-hard-drive","legacy":true,"path":"./icons/icon-hard-drive.js"},{"name":"icon-headphones","path":"./icons/icon-headphones.js"},{"name":"icon-headset","legacy":true,"path":"./icons/icon-headset.js"},{"name":"icon-hearts","path":"./icons/icon-hearts.js"},{"name":"icon-height","path":"./icons/icon-height.js"},{"name":"icon-help-alt","path":"./icons/icon-help-alt.js"},{"name":"icon-help","path":"./icons/icon-help.js"},{"name":"icon-home","path":"./icons/icon-home.js"},{"name":"icon-hourglass","path":"./icons/icon-hourglass.js"},{"name":"icon-imac","legacy":true,"path":"./icons/icon-imac.js"},{"name":"icon-inbox-full","legacy":true,"path":"./icons/icon-inbox-full.js"},{"name":"icon-inbox","path":"./icons/icon-inbox.js"},{"name":"icon-indent","path":"./icons/icon-indent.js"},{"name":"icon-infinity","path":"./icons/icon-infinity.js"},{"name":"icon-info","path":"./icons/icon-info.js"},{"name":"icon-invoice","legacy":true,"path":"./icons/icon-invoice.js"},{"name":"icon-ipad","legacy":true,"path":"./icons/icon-ipad.js"},{"name":"icon-iphone","legacy":true,"path":"./icons/icon-iphone.js"},{"name":"icon-item-arrangement","legacy":true,"path":"./icons/icon-item-arrangement.js"},{"name":"icon-junk","path":"./icons/icon-junk.js"},{"name":"icon-key","path":"./icons/icon-key.js"},{"name":"icon-keyboard","path":"./icons/icon-keyboard.js"},{"name":"icon-lab","path":"./icons/icon-lab.js"},{"name":"icon-laptop","path":"./icons/icon-laptop.js"},{"name":"icon-layers-alt","legacy":true,"path":"./icons/icon-layers-alt.js"},{"name":"icon-layers","path":"./icons/icon-layers.js"},{"name":"icon-layout","path":"./icons/icon-layout.js"},{"name":"icon-left-double-arrow","path":"./icons/icon-left-double-arrow.js"},{"name":"icon-legal","path":"./icons/icon-legal.js"},{"name":"icon-lense","legacy":true,"path":"./icons/icon-lense.js"},{"name":"icon-library","path":"./icons/icon-library.js"},{"name":"icon-light-down","path":"./icons/icon-light-down.js"},{"name":"icon-light-up","path":"./icons/icon-light-up.js"},{"name":"icon-lightning","path":"./icons/icon-lightning.js"},{"name":"icon-link","path":"./icons/icon-link.js"},{"name":"icon-list","path":"./icons/icon-list.js"},{"name":"icon-load","legacy":true,"path":"./icons/icon-load.js"},{"name":"icon-loading","legacy":true,"path":"./icons/icon-loading.js"},{"name":"icon-location-nearby","path":"./icons/icon-location-nearby.js"},{"name":"icon-lock","path":"./icons/icon-lock.js"},{"name":"icon-log-out","path":"./icons/icon-log-out.js"},{"name":"icon-logout","legacy":true,"path":"./icons/icon-logout.js"},{"name":"icon-loupe","legacy":true,"path":"./icons/icon-loupe.js"},{"name":"icon-magnet","path":"./icons/icon-magnet.js"},{"name":"icon-mailbox","path":"./icons/icon-mailbox.js"},{"name":"icon-map-alt","path":"./icons/icon-map-alt.js"},{"name":"icon-map-location","legacy":true,"path":"./icons/icon-map-location.js"},{"name":"icon-map-marker","path":"./icons/icon-map-marker.js"},{"name":"icon-map","path":"./icons/icon-map.js"},{"name":"icon-medal","path":"./icons/icon-medal.js"},{"name":"icon-medical-emergency","path":"./icons/icon-medical-emergency.js"},{"name":"icon-medicine","path":"./icons/icon-medicine.js"},{"name":"icon-meeting","legacy":true,"path":"./icons/icon-meeting.js"},{"name":"icon-megaphone","path":"./icons/icon-megaphone.js"},{"name":"icon-merge","path":"./icons/icon-merge.js"},{"name":"icon-message-open","path":"./icons/icon-message-open.js"},{"name":"icon-message-unopened","legacy":true,"path":"./icons/icon-message-unopened.js"},{"name":"icon-message","path":"./icons/icon-message.js"},{"name":"icon-microscope","path":"./icons/icon-microscope.js"},{"name":"icon-mindmap","legacy":true,"path":"./icons/icon-mindmap.js"},{"name":"icon-mobile","path":"./icons/icon-mobile.js"},{"name":"icon-mountain","path":"./icons/icon-mountain.js"},{"name":"icon-mouse-cursor","path":"./icons/icon-mouse-cursor.js"},{"name":"icon-mouse","path":"./icons/icon-mouse.js"},{"name":"icon-movie-alt","path":"./icons/icon-movie-alt.js"},{"name":"icon-movie","path":"./icons/icon-movie.js"},{"name":"icon-multiple-credit-cards","path":"./icons/icon-multiple-credit-cards.js"},{"name":"icon-music","path":"./icons/icon-music.js"},{"name":"icon-name-badge","legacy":true,"path":"./icons/icon-name-badge.js"},{"name":"icon-navigation-bottom","legacy":true,"path":"./icons/icon-navigation-bottom.js"},{"name":"icon-navigation-down","legacy":true,"path":"./icons/icon-navigation-down.js"},{"name":"icon-navigation-first","legacy":true,"path":"./icons/icon-navigation-first.js"},{"name":"icon-navigation-horizontal","legacy":true,"path":"./icons/icon-navigation-horizontal.js"},{"name":"icon-navigation-last","legacy":true,"path":"./icons/icon-navigation-last.js"},{"name":"icon-navigation-left","legacy":true,"path":"./icons/icon-navigation-left.js"},{"name":"icon-navigation-right","legacy":true,"path":"./icons/icon-navigation-right.js"},{"name":"icon-navigation-road","legacy":true,"path":"./icons/icon-navigation-road.js"},{"name":"icon-navigation-up","legacy":true,"path":"./icons/icon-navigation-up.js"},{"name":"icon-navigation-vertical","legacy":true,"path":"./icons/icon-navigation-vertical.js"},{"name":"icon-navigation","legacy":true,"path":"./icons/icon-navigation.js"},{"name":"icon-navigational-arrow","path":"./icons/icon-navigational-arrow.js"},{"name":"icon-network-alt","path":"./icons/icon-network-alt.js"},{"name":"icon-newspaper-alt","legacy":true,"path":"./icons/icon-newspaper-alt.js"},{"name":"icon-newspaper","path":"./icons/icon-newspaper.js"},{"name":"icon-next-media","legacy":true,"path":"./icons/icon-next-media.js"},{"name":"icon-next","legacy":true,"path":"./icons/icon-next.js"},{"name":"icon-nodes","legacy":true,"path":"./icons/icon-nodes.js"},{"name":"icon-notepad-alt","legacy":true,"path":"./icons/icon-notepad-alt.js"},{"name":"icon-notepad","path":"./icons/icon-notepad.js"},{"name":"icon-old-key","path":"./icons/icon-old-key.js"},{"name":"icon-old-phone","legacy":true,"path":"./icons/icon-old-phone.js"},{"name":"icon-operator","path":"./icons/icon-operator.js"},{"name":"icon-ordered-list","path":"./icons/icon-ordered-list.js"},{"name":"icon-out","path":"./icons/icon-out.js"},{"name":"icon-outbox","legacy":true,"path":"./icons/icon-outbox.js"},{"name":"icon-outdent","path":"./icons/icon-outdent.js"},{"name":"icon-page-add","path":"./icons/icon-page-add.js"},{"name":"icon-page-down","path":"./icons/icon-page-down.js"},{"name":"icon-page-remove","path":"./icons/icon-page-remove.js"},{"name":"icon-page-restricted","path":"./icons/icon-page-restricted.js"},{"name":"icon-page-up","path":"./icons/icon-page-up.js"},{"name":"icon-paint-roller","legacy":true,"path":"./icons/icon-paint-roller.js"},{"name":"icon-palette","path":"./icons/icon-palette.js"},{"name":"icon-panel-show","path":"./icons/icon-panel-show.js"},{"name":"icon-pannel-close","path":"./icons/icon-pannel-close.js"},{"name":"icon-paper-bag","legacy":true,"path":"./icons/icon-paper-bag.js"},{"name":"icon-paper-plane-alt","path":"./icons/icon-paper-plane-alt.js"},{"name":"icon-paper-plane","path":"./icons/icon-paper-plane.js"},{"name":"icon-partly-cloudy","path":"./icons/icon-partly-cloudy.js"},{"name":"icon-paste-in","legacy":true,"path":"./icons/icon-paste-in.js"},{"name":"icon-pause","path":"./icons/icon-pause.js"},{"name":"icon-pc","legacy":true,"path":"./icons/icon-pc.js"},{"name":"icon-people-alt-2","legacy":true,"path":"./icons/icon-people-alt-2.js"},{"name":"icon-people-alt","legacy":true,"path":"./icons/icon-people-alt.js"},{"name":"icon-people-female","legacy":true,"path":"./icons/icon-people-female.js"},{"name":"icon-people","path":"./icons/icon-people.js"},{"name":"icon-phone-ring","path":"./icons/icon-phone-ring.js"},{"name":"icon-phone","path":"./icons/icon-phone.js"},{"name":"icon-photo-album","path":"./icons/icon-photo-album.js"},{"name":"icon-picture","path":"./icons/icon-picture.js"},{"name":"icon-pictures-alt-2","path":"./icons/icon-pictures-alt-2.js"},{"name":"icon-pictures-alt","legacy":true,"path":"./icons/icon-pictures-alt.js"},{"name":"icon-pictures","path":"./icons/icon-pictures.js"},{"name":"icon-pie-chart","path":"./icons/icon-pie-chart.js"},{"name":"icon-piggy-bank","path":"./icons/icon-piggy-bank.js"},{"name":"icon-pin-location","path":"./icons/icon-pin-location.js"},{"name":"icon-plane","path":"./icons/icon-plane.js"},{"name":"icon-planet","legacy":true,"path":"./icons/icon-planet.js"},{"name":"icon-play","path":"./icons/icon-play.js"},{"name":"icon-playing-cards","legacy":true,"path":"./icons/icon-playing-cards.js"},{"name":"icon-playlist","path":"./icons/icon-playlist.js"},{"name":"icon-plugin","path":"./icons/icon-plugin.js"},{"name":"icon-podcast","path":"./icons/icon-podcast.js"},{"name":"icon-poll","legacy":true,"path":"./icons/icon-poll.js"},{"name":"icon-post-it","path":"./icons/icon-post-it.js"},{"name":"icon-power-outlet","legacy":true,"path":"./icons/icon-power-outlet.js"},{"name":"icon-power","path":"./icons/icon-power.js"},{"name":"icon-presentation","path":"./icons/icon-presentation.js"},{"name":"icon-previous-media","path":"./icons/icon-previous-media.js"},{"name":"icon-previous","path":"./icons/icon-previous.js"},{"name":"icon-price-dollar","legacy":true,"path":"./icons/icon-price-dollar.js"},{"name":"icon-price-euro","legacy":true,"path":"./icons/icon-price-euro.js"},{"name":"icon-price-pound","legacy":true,"path":"./icons/icon-price-pound.js"},{"name":"icon-print","path":"./icons/icon-print.js"},{"name":"icon-printer-alt","legacy":true,"path":"./icons/icon-printer-alt.js"},{"name":"icon-projector","path":"./icons/icon-projector.js"},{"name":"icon-pulse","path":"./icons/icon-pulse.js"},{"name":"icon-pushpin","path":"./icons/icon-pushpin.js"},{"name":"icon-qr-code","path":"./icons/icon-qr-code.js"},{"name":"icon-quote","path":"./icons/icon-quote.js"},{"name":"icon-radio-alt","path":"./icons/icon-radio-alt.js"},{"name":"icon-radio-receiver","path":"./icons/icon-radio-receiver.js"},{"name":"icon-radio","path":"./icons/icon-radio.js"},{"name":"icon-rain","path":"./icons/icon-rain.js"},{"name":"icon-rate","legacy":true,"path":"./icons/icon-rate.js"},{"name":"icon-re-post","path":"./icons/icon-re-post.js"},{"name":"icon-readonly","legacy":true,"path":"./icons/icon-readonly.js"},{"name":"icon-receipt-alt","path":"./icons/icon-receipt-alt.js"},{"name":"icon-reception","path":"./icons/icon-reception.js"},{"name":"icon-record","legacy":true,"path":"./icons/icon-record.js"},{"name":"icon-redo","path":"./icons/icon-redo.js"},{"name":"icon-refresh","path":"./icons/icon-refresh.js"},{"name":"icon-remote","legacy":true,"path":"./icons/icon-remote.js"},{"name":"icon-remove","path":"./icons/icon-remove.js"},{"name":"icon-repeat-one","path":"./icons/icon-repeat-one.js"},{"name":"icon-repeat","path":"./icons/icon-repeat.js"},{"name":"icon-reply-arrow","path":"./icons/icon-reply-arrow.js"},{"name":"icon-return-to-top","legacy":true,"path":"./icons/icon-return-to-top.js"},{"name":"icon-right-double-arrow","legacy":true,"path":"./icons/icon-right-double-arrow.js"},{"name":"icon-roadsign","legacy":true,"path":"./icons/icon-roadsign.js"},{"name":"icon-rocket","path":"./icons/icon-rocket.js"},{"name":"icon-rss","path":"./icons/icon-rss.js"},{"name":"icon-ruler-alt","path":"./icons/icon-ruler-alt.js"},{"name":"icon-ruler","path":"./icons/icon-ruler.js"},{"name":"icon-satellite-dish","path":"./icons/icon-satellite-dish.js"},{"name":"icon-save","path":"./icons/icon-save.js"},{"name":"icon-scan","path":"./icons/icon-scan.js"},{"name":"icon-school","path":"./icons/icon-school.js"},{"name":"icon-screensharing","path":"./icons/icon-screensharing.js"},{"name":"icon-script-alt","legacy":true,"path":"./icons/icon-script-alt.js"},{"name":"icon-script","path":"./icons/icon-script.js"},{"name":"icon-scull","path":"./icons/icon-scull.js"},{"name":"icon-search","path":"./icons/icon-search.js"},{"name":"icon-sensor","path":"./icons/icon-sensor.js"},{"name":"icon-server-alt","legacy":true,"path":"./icons/icon-server-alt.js"},{"name":"icon-server","path":"./icons/icon-server.js"},{"name":"icon-settings-alt","legacy":true,"path":"./icons/icon-settings-alt.js"},{"name":"icon-settings","path":"./icons/icon-settings.js"},{"name":"icon-share-alt","path":"./icons/icon-share-alt.js"},{"name":"icon-share","path":"./icons/icon-share.js"},{"name":"icon-sharing-iphone","path":"./icons/icon-sharing-iphone.js"},{"name":"icon-shield","path":"./icons/icon-shield.js"},{"name":"icon-shift","path":"./icons/icon-shift.js"},{"name":"icon-shipping-box","path":"./icons/icon-shipping-box.js"},{"name":"icon-shipping","path":"./icons/icon-shipping.js"},{"name":"icon-shoe","path":"./icons/icon-shoe.js"},{"name":"icon-shopping-basket-alt-2","legacy":true,"path":"./icons/icon-shopping-basket-alt-2.js"},{"name":"icon-shopping-basket-alt","path":"./icons/icon-shopping-basket-alt.js"},{"name":"icon-shopping-basket","path":"./icons/icon-shopping-basket.js"},{"name":"icon-shuffle","path":"./icons/icon-shuffle.js"},{"name":"icon-sience","path":"./icons/icon-sience.js"},{"name":"icon-single-note","path":"./icons/icon-single-note.js"},{"name":"icon-sitemap","legacy":true,"path":"./icons/icon-sitemap.js"},{"name":"icon-sleep","path":"./icons/icon-sleep.js"},{"name":"icon-slideshow","legacy":true,"path":"./icons/icon-slideshow.js"},{"name":"icon-smiley-inverted","legacy":true,"path":"./icons/icon-smiley-inverted.js"},{"name":"icon-smiley","path":"./icons/icon-smiley.js"},{"name":"icon-snow","path":"./icons/icon-snow.js"},{"name":"icon-sound-low","path":"./icons/icon-sound-low.js"},{"name":"icon-sound-medium","legacy":true,"path":"./icons/icon-sound-medium.js"},{"name":"icon-sound-off","path":"./icons/icon-sound-off.js"},{"name":"icon-sound-waves","path":"./icons/icon-sound-waves.js"},{"name":"icon-sound","path":"./icons/icon-sound.js"},{"name":"icon-spades","path":"./icons/icon-spades.js"},{"name":"icon-speaker","path":"./icons/icon-speaker.js"},{"name":"icon-speed-gauge","path":"./icons/icon-speed-gauge.js"},{"name":"icon-split","path":"./icons/icon-split.js"},{"name":"icon-sprout","path":"./icons/icon-sprout.js"},{"name":"icon-squiggly-line","legacy":true,"path":"./icons/icon-squiggly-line.js"},{"name":"icon-ssd","legacy":true,"path":"./icons/icon-ssd.js"},{"name":"icon-stacked-disks","legacy":true,"path":"./icons/icon-stacked-disks.js"},{"name":"icon-stamp","legacy":true,"path":"./icons/icon-stamp.js"},{"name":"icon-stop-alt","path":"./icons/icon-stop-alt.js"},{"name":"icon-stop-hand","legacy":true,"path":"./icons/icon-stop-hand.js"},{"name":"icon-stop","path":"./icons/icon-stop.js"},{"name":"icon-store","path":"./icons/icon-store.js"},{"name":"icon-stream","legacy":true,"path":"./icons/icon-stream.js"},{"name":"icon-sunny","path":"./icons/icon-sunny.js"},{"name":"icon-sweatshirt","legacy":true,"path":"./icons/icon-sweatshirt.js"},{"name":"icon-sync","path":"./icons/icon-sync.js"},{"name":"icon-t-shirt","path":"./icons/icon-t-shirt.js"},{"name":"icon-tab-key","path":"./icons/icon-tab-key.js"},{"name":"icon-tag","path":"./icons/icon-tag.js"},{"name":"icon-tags","path":"./icons/icon-tags.js"},{"name":"icon-takeaway-cup","legacy":true,"path":"./icons/icon-takeaway-cup.js"},{"name":"icon-target","path":"./icons/icon-target.js"},{"name":"icon-temperatrure-alt","path":"./icons/icon-temperatrure-alt.js"},{"name":"icon-temperature","path":"./icons/icon-temperature.js"},{"name":"icon-terminal","path":"./icons/icon-terminal.js"},{"name":"icon-theater","path":"./icons/icon-theater.js"},{"name":"icon-thumb-down","path":"./icons/icon-thumb-down.js"},{"name":"icon-thumb-up","path":"./icons/icon-thumb-up.js"},{"name":"icon-thumbnail-list","path":"./icons/icon-thumbnail-list.js"},{"name":"icon-thumbnails-small","path":"./icons/icon-thumbnails-small.js"},{"name":"icon-thumbnails","path":"./icons/icon-thumbnails.js"},{"name":"icon-ticket","path":"./icons/icon-ticket.js"},{"name":"icon-time","path":"./icons/icon-time.js"},{"name":"icon-timer","path":"./icons/icon-timer.js"},{"name":"icon-tools","legacy":true,"path":"./icons/icon-tools.js"},{"name":"icon-top","legacy":true,"path":"./icons/icon-top.js"},{"name":"icon-traffic-alt","legacy":true,"path":"./icons/icon-traffic-alt.js"},{"name":"icon-trafic","path":"./icons/icon-trafic.js"},{"name":"icon-train","path":"./icons/icon-train.js"},{"name":"icon-trash-alt-2","legacy":true,"path":"./icons/icon-trash-alt-2.js"},{"name":"icon-trash-alt","legacy":true,"path":"./icons/icon-trash-alt.js"},{"name":"icon-trash","path":"./icons/icon-trash.js"},{"name":"icon-tree","path":"./icons/icon-tree.js"},{"name":"icon-trophy","path":"./icons/icon-trophy.js"},{"name":"icon-truck","path":"./icons/icon-truck.js"},{"name":"icon-tv-old","path":"./icons/icon-tv-old.js"},{"name":"icon-tv","path":"./icons/icon-tv.js"},{"name":"icon-umb-content","legacy":true,"path":"./icons/icon-umb-content.js"},{"name":"icon-umb-developer","legacy":true,"path":"./icons/icon-umb-developer.js"},{"name":"icon-umb-media","legacy":true,"path":"./icons/icon-umb-media.js"},{"name":"icon-umb-settings","legacy":true,"path":"./icons/icon-umb-settings.js"},{"name":"icon-umb-users","legacy":true,"path":"./icons/icon-umb-users.js"},{"name":"icon-umbrella","path":"./icons/icon-umbrella.js"},{"name":"icon-undo","path":"./icons/icon-undo.js"},{"name":"icon-unlocked","path":"./icons/icon-unlocked.js"},{"name":"icon-untitled","legacy":true,"path":"./icons/icon-untitled.js"},{"name":"icon-usb-connector","legacy":true,"path":"./icons/icon-usb-connector.js"},{"name":"icon-usb","path":"./icons/icon-usb.js"},{"name":"icon-user-female","legacy":true,"path":"./icons/icon-user-female.js"},{"name":"icon-user-females-alt","legacy":true,"path":"./icons/icon-user-females-alt.js"},{"name":"icon-user-females","legacy":true,"path":"./icons/icon-user-females.js"},{"name":"icon-user-glasses","legacy":true,"path":"./icons/icon-user-glasses.js"},{"name":"icon-user","path":"./icons/icon-user.js"},{"name":"icon-users-alt","legacy":true,"path":"./icons/icon-users-alt.js"},{"name":"icon-users","path":"./icons/icon-users.js"},{"name":"icon-utilities","path":"./icons/icon-utilities.js"},{"name":"icon-vcard","path":"./icons/icon-vcard.js"},{"name":"icon-video","path":"./icons/icon-video.js"},{"name":"icon-voice","path":"./icons/icon-voice.js"},{"name":"icon-wall-plug","path":"./icons/icon-wall-plug.js"},{"name":"icon-wallet","path":"./icons/icon-wallet.js"},{"name":"icon-wand","path":"./icons/icon-wand.js"},{"name":"icon-webhook","path":"./icons/icon-webhook.js"},{"name":"icon-weight","path":"./icons/icon-weight.js"},{"name":"icon-width","path":"./icons/icon-width.js"},{"name":"icon-wifi","path":"./icons/icon-wifi.js"},{"name":"icon-window-popin","path":"./icons/icon-window-popin.js"},{"name":"icon-window-sizes","path":"./icons/icon-window-sizes.js"},{"name":"icon-wine-glass","path":"./icons/icon-wine-glass.js"},{"name":"icon-wrench","path":"./icons/icon-wrench.js"},{"name":"icon-wrong","path":"./icons/icon-wrong.js"},{"name":"icon-zip","path":"./icons/icon-zip.js"},{"name":"icon-zom-out","legacy":true,"path":"./icons/icon-zom-out.js"},{"name":"icon-zoom-in","path":"./icons/icon-zoom-in.js"},{"name":"icon-zoom-out","path":"./icons/icon-zoom-out.js"},{"name":"icon-star","path":"./icons/icon-star.js"},{"name":"icon-database","path":"./icons/icon-database.js"},{"name":"icon-azure","path":"./icons/icon-azure.js"},{"name":"icon-facebook","path":"./icons/icon-facebook.js"},{"name":"icon-gitbook","path":"./icons/icon-gitbook.js"},{"name":"icon-github","path":"./icons/icon-github.js"},{"name":"icon-gitlab","path":"./icons/icon-gitlab.js"},{"name":"icon-google","path":"./icons/icon-google.js"},{"name":"icon-linkedin","path":"./icons/icon-linkedin.js"},{"name":"icon-mastodon","path":"./icons/icon-mastodon.js"},{"name":"icon-microsoft","path":"./icons/icon-microsoft.js"},{"name":"icon-twitter","path":"./icons/icon-twitter.js"},{"name":"icon-twitter-x","path":"./icons/icon-twitter-x.js"},{"name":"icon-umbraco","path":"./icons/icon-umbraco.js"},{"name":"icon-application-error","legacy":true,"path":"./icons/icon-application-error.js"},{"name":"icon-art-easel","legacy":true,"path":"./icons/icon-art-easel.js"},{"name":"icon-article","legacy":true,"path":"./icons/icon-article.js"},{"name":"icon-auction-hammer","legacy":true,"path":"./icons/icon-auction-hammer.js"},{"name":"icon-baby-stroller","legacy":true,"path":"./icons/icon-baby-stroller.js"},{"name":"icon-badge-count","legacy":true,"path":"./icons/icon-badge-count.js"},{"name":"icon-ball","legacy":true,"path":"./icons/icon-ball.js"},{"name":"icon-band-aid","legacy":true,"path":"./icons/icon-band-aid.js"},{"name":"icon-bill-dollar","legacy":true,"path":"./icons/icon-bill-dollar.js"},{"name":"icon-bill-euro","legacy":true,"path":"./icons/icon-bill-euro.js"},{"name":"icon-bill-pound","legacy":true,"path":"./icons/icon-bill-pound.js"},{"name":"icon-bill-yen","legacy":true,"path":"./icons/icon-bill-yen.js"},{"name":"icon-bill","legacy":true,"path":"./icons/icon-bill.js"},{"name":"icon-billboard","legacy":true,"path":"./icons/icon-billboard.js"},{"name":"icon-bills-dollar","legacy":true,"path":"./icons/icon-bills-dollar.js"},{"name":"icon-bills-euro","legacy":true,"path":"./icons/icon-bills-euro.js"},{"name":"icon-bills-pound","legacy":true,"path":"./icons/icon-bills-pound.js"},{"name":"icon-bills-yen","legacy":true,"path":"./icons/icon-bills-yen.js"},{"name":"icon-bills","legacy":true,"path":"./icons/icon-bills.js"},{"name":"icon-binoculars","legacy":true,"path":"./icons/icon-binoculars.js"},{"name":"icon-blueprint","legacy":true,"path":"./icons/icon-blueprint.js"},{"name":"icon-bomb","legacy":true,"path":"./icons/icon-bomb.js"},{"name":"icon-cash-register","legacy":true,"path":"./icons/icon-cash-register.js"},{"name":"icon-checkbox-dotted-active","legacy":true,"path":"./icons/icon-checkbox-dotted-active.js"},{"name":"icon-chess","legacy":true,"path":"./icons/icon-chess.js"},{"name":"icon-circus","legacy":true,"path":"./icons/icon-circus.js"},{"name":"icon-clothes-hanger","legacy":true,"path":"./icons/icon-clothes-hanger.js"},{"name":"icon-coin-dollar","legacy":true,"path":"./icons/icon-coin-dollar.js"},{"name":"icon-coin-pound","legacy":true,"path":"./icons/icon-coin-pound.js"},{"name":"icon-coin","legacy":true,"path":"./icons/icon-coin.js"},{"name":"icon-coins-dollar-alt","legacy":true,"path":"./icons/icon-coins-dollar-alt.js"},{"name":"icon-coins-dollar","legacy":true,"path":"./icons/icon-coins-dollar.js"},{"name":"icon-coins-euro-alt","legacy":true,"path":"./icons/icon-coins-euro-alt.js"},{"name":"icon-coins-euro","legacy":true,"path":"./icons/icon-coins-euro.js"},{"name":"icon-coins-pound-alt","legacy":true,"path":"./icons/icon-coins-pound-alt.js"},{"name":"icon-coins-pound","legacy":true,"path":"./icons/icon-coins-pound.js"},{"name":"icon-coins-yen-alt","legacy":true,"path":"./icons/icon-coins-yen-alt.js"},{"name":"icon-coins-yen","legacy":true,"path":"./icons/icon-coins-yen.js"},{"name":"icon-comb","legacy":true,"path":"./icons/icon-comb.js"},{"name":"icon-desk","legacy":true,"path":"./icons/icon-desk.js"},{"name":"icon-dollar-bag","legacy":true,"path":"./icons/icon-dollar-bag.js"},{"name":"icon-eject","legacy":true,"path":"./icons/icon-eject.js"},{"name":"icon-euro-bag","legacy":true,"path":"./icons/icon-euro-bag.js"},{"name":"icon-exit-fullscreen","legacy":true,"path":"./icons/icon-exit-fullscreen.js"},{"name":"icon-female-symbol","legacy":true,"path":"./icons/icon-female-symbol.js"},{"name":"icon-filter-arrows","legacy":true,"path":"./icons/icon-filter-arrows.js"},{"name":"icon-firewall","legacy":true,"path":"./icons/icon-firewall.js"},{"name":"icon-folder-open","legacy":true,"path":"./icons/icon-folder-open.js"},{"name":"icon-folder-outline","legacy":true,"path":"./icons/icon-folder-outline.js"},{"name":"icon-handprint","legacy":true,"path":"./icons/icon-handprint.js"},{"name":"icon-hat","legacy":true,"path":"./icons/icon-hat.js"},{"name":"icon-hd","legacy":true,"path":"./icons/icon-hd.js"},{"name":"icon-inactive-line","legacy":true,"path":"./icons/icon-inactive-line.js"},{"name":"icon-keychain","legacy":true,"path":"./icons/icon-keychain.js"},{"name":"icon-keyhole","legacy":true,"path":"./icons/icon-keyhole.js"},{"name":"icon-lightbulb-active","legacy":true,"path":"./icons/icon-lightbulb-active.js"},{"name":"icon-lightbulb","legacy":true,"path":"./icons/icon-lightbulb.js"},{"name":"icon-linux-tux","legacy":true,"path":"./icons/icon-linux-tux.js"},{"name":"icon-locate","legacy":true,"path":"./icons/icon-locate.js"},{"name":"icon-location-near-me","legacy":true,"path":"./icons/icon-location-near-me.js"},{"name":"icon-male-and-female","legacy":true,"path":"./icons/icon-male-and-female.js"},{"name":"icon-male-symbol","legacy":true,"path":"./icons/icon-male-symbol.js"},{"name":"icon-molecular-network","legacy":true,"path":"./icons/icon-molecular-network.js"},{"name":"icon-molecular","legacy":true,"path":"./icons/icon-molecular.js"},{"name":"icon-multiple-windows","legacy":true,"path":"./icons/icon-multiple-windows.js"},{"name":"icon-navigation-top","legacy":true,"path":"./icons/icon-navigation-top.js"},{"name":"icon-os-x","legacy":true,"path":"./icons/icon-os-x.js"},{"name":"icon-pants","legacy":true,"path":"./icons/icon-pants.js"},{"name":"icon-parachute-drop","legacy":true,"path":"./icons/icon-parachute-drop.js"},{"name":"icon-parental-control","legacy":true,"path":"./icons/icon-parental-control.js"},{"name":"icon-path","legacy":true,"path":"./icons/icon-path.js"},{"name":"icon-piracy","legacy":true,"path":"./icons/icon-piracy.js"},{"name":"icon-poker-chip","legacy":true,"path":"./icons/icon-poker-chip.js"},{"name":"icon-pound-bag","legacy":true,"path":"./icons/icon-pound-bag.js"},{"name":"icon-price-yen","legacy":true,"path":"./icons/icon-price-yen.js"},{"name":"icon-receipt-dollar","legacy":true,"path":"./icons/icon-receipt-dollar.js"},{"name":"icon-receipt-euro","legacy":true,"path":"./icons/icon-receipt-euro.js"},{"name":"icon-receipt-pound","legacy":true,"path":"./icons/icon-receipt-pound.js"},{"name":"icon-receipt-yen","legacy":true,"path":"./icons/icon-receipt-yen.js"},{"name":"icon-resize","legacy":true,"path":"./icons/icon-resize.js"},{"name":"icon-road","legacy":true,"path":"./icons/icon-road.js"},{"name":"icon-safe","legacy":true,"path":"./icons/icon-safe.js"},{"name":"icon-safedial","legacy":true,"path":"./icons/icon-safedial.js"},{"name":"icon-sandbox-toys","legacy":true,"path":"./icons/icon-sandbox-toys.js"},{"name":"icon-security-camera","legacy":true,"path":"./icons/icon-security-camera.js"},{"name":"icon-settings-alt-2","legacy":true,"path":"./icons/icon-settings-alt-2.js"},{"name":"icon-share-alt-2","legacy":true,"path":"./icons/icon-share-alt-2.js"},{"name":"icon-shorts","legacy":true,"path":"./icons/icon-shorts.js"},{"name":"icon-simcard","legacy":true,"path":"./icons/icon-simcard.js"},{"name":"icon-split-alt","legacy":true,"path":"./icons/icon-split-alt.js"},{"name":"icon-tab","legacy":true,"path":"./icons/icon-tab.js"},{"name":"icon-tactics","legacy":true,"path":"./icons/icon-tactics.js"},{"name":"icon-theif","legacy":true,"path":"./icons/icon-theif.js"},{"name":"icon-thought-bubble","legacy":true,"path":"./icons/icon-thought-bubble.js"},{"name":"icon-umb-contour","legacy":true,"path":"./icons/icon-umb-contour.js"},{"name":"icon-umb-deploy","legacy":true,"path":"./icons/icon-umb-deploy.js"},{"name":"icon-umb-members","legacy":true,"path":"./icons/icon-umb-members.js"},{"name":"icon-universal","legacy":true,"path":"./icons/icon-universal.js"},{"name":"icon-war","legacy":true,"path":"./icons/icon-war.js"},{"name":"icon-windows","legacy":true,"path":"./icons/icon-windows.js"},{"name":"icon-yen-bag","legacy":true,"path":"./icons/icon-yen-bag.js"}] \ No newline at end of file +[{"name":"icon-activity","path":"./icons/icon-activity.js"},{"name":"icon-add","path":"./icons/icon-add.js"},{"name":"icon-addressbook","path":"./icons/icon-addressbook.js"},{"name":"icon-alarm-clock","path":"./icons/icon-alarm-clock.js"},{"name":"icon-alert-alt","path":"./icons/icon-alert-alt.js"},{"name":"icon-alert","path":"./icons/icon-alert.js"},{"name":"icon-alt","path":"./icons/icon-alt.js"},{"name":"icon-anchor","path":"./icons/icon-anchor.js"},{"name":"icon-app","path":"./icons/icon-app.js"},{"name":"icon-application-window-alt","path":"./icons/icon-application-window-alt.js"},{"name":"icon-application-window","path":"./icons/icon-application-window.js"},{"name":"icon-arrivals","path":"./icons/icon-arrivals.js"},{"name":"icon-arrow-down","path":"./icons/icon-arrow-down.js"},{"name":"icon-arrow-left","path":"./icons/icon-arrow-left.js"},{"name":"icon-arrow-right","path":"./icons/icon-arrow-right.js"},{"name":"icon-arrow-up","path":"./icons/icon-arrow-up.js"},{"name":"icon-attachment","path":"./icons/icon-attachment.js"},{"name":"icon-autofill","path":"./icons/icon-autofill.js"},{"name":"icon-award","path":"./icons/icon-award.js"},{"name":"icon-axis-rotation-2","path":"./icons/icon-axis-rotation-2.js"},{"name":"icon-axis-rotation-3","path":"./icons/icon-axis-rotation-3.js"},{"name":"icon-axis-rotation","path":"./icons/icon-axis-rotation.js"},{"name":"icon-backspace","path":"./icons/icon-backspace.js"},{"name":"icon-badge-add","path":"./icons/icon-badge-add.js"},{"name":"icon-badge-remove","path":"./icons/icon-badge-remove.js"},{"name":"icon-badge-restricted","legacy":true,"path":"./icons/icon-badge-restricted.js"},{"name":"icon-bar-chart","path":"./icons/icon-bar-chart.js"},{"name":"icon-barcode","path":"./icons/icon-barcode.js"},{"name":"icon-bars","path":"./icons/icon-bars.js"},{"name":"icon-battery-full","path":"./icons/icon-battery-full.js"},{"name":"icon-battery-low","path":"./icons/icon-battery-low.js"},{"name":"icon-beer-glass","path":"./icons/icon-beer-glass.js"},{"name":"icon-bell-off","path":"./icons/icon-bell-off.js"},{"name":"icon-bell","path":"./icons/icon-bell.js"},{"name":"icon-binarycode","path":"./icons/icon-binarycode.js"},{"name":"icon-bird","path":"./icons/icon-bird.js"},{"name":"icon-birthday-cake","path":"./icons/icon-birthday-cake.js"},{"name":"icon-block","path":"./icons/icon-block.js"},{"name":"icon-bluetooth","path":"./icons/icon-bluetooth.js"},{"name":"icon-boat-shipping","path":"./icons/icon-boat-shipping.js"},{"name":"icon-bones","path":"./icons/icon-bones.js"},{"name":"icon-book-alt-2","path":"./icons/icon-book-alt-2.js"},{"name":"icon-book-alt","path":"./icons/icon-book-alt.js"},{"name":"icon-book","path":"./icons/icon-book.js"},{"name":"icon-bookmark","path":"./icons/icon-bookmark.js"},{"name":"icon-books","path":"./icons/icon-books.js"},{"name":"icon-box-alt","path":"./icons/icon-box-alt.js"},{"name":"icon-box-open","path":"./icons/icon-box-open.js"},{"name":"icon-box","path":"./icons/icon-box.js"},{"name":"icon-brackets","path":"./icons/icon-brackets.js"},{"name":"icon-brick","path":"./icons/icon-brick.js"},{"name":"icon-briefcase","path":"./icons/icon-briefcase.js"},{"name":"icon-browser-window","path":"./icons/icon-browser-window.js"},{"name":"icon-brush-alt-2","path":"./icons/icon-brush-alt-2.js"},{"name":"icon-brush-alt","path":"./icons/icon-brush-alt.js"},{"name":"icon-brush","path":"./icons/icon-brush.js"},{"name":"icon-bug","path":"./icons/icon-bug.js"},{"name":"icon-bulleted-list","path":"./icons/icon-bulleted-list.js"},{"name":"icon-burn","path":"./icons/icon-burn.js"},{"name":"icon-bus","path":"./icons/icon-bus.js"},{"name":"icon-calculator","path":"./icons/icon-calculator.js"},{"name":"icon-calendar-alt","path":"./icons/icon-calendar-alt.js"},{"name":"icon-calendar","path":"./icons/icon-calendar.js"},{"name":"icon-camcorder","legacy":true,"path":"./icons/icon-camcorder.js"},{"name":"icon-camera-roll","path":"./icons/icon-camera-roll.js"},{"name":"icon-candy","path":"./icons/icon-candy.js"},{"name":"icon-caps-lock","path":"./icons/icon-caps-lock.js"},{"name":"icon-car","path":"./icons/icon-car.js"},{"name":"icon-categories","path":"./icons/icon-categories.js"},{"name":"icon-certificate","path":"./icons/icon-certificate.js"},{"name":"icon-chart-curve","path":"./icons/icon-chart-curve.js"},{"name":"icon-chart","path":"./icons/icon-chart.js"},{"name":"icon-chat-active","legacy":true,"path":"./icons/icon-chat-active.js"},{"name":"icon-chat","path":"./icons/icon-chat.js"},{"name":"icon-check","path":"./icons/icon-check.js"},{"name":"icon-checkbox-dotted","path":"./icons/icon-checkbox-dotted.js"},{"name":"icon-checkbox-empty","legacy":true,"path":"./icons/icon-checkbox-empty.js"},{"name":"icon-checkbox","path":"./icons/icon-checkbox.js"},{"name":"icon-chip-alt","legacy":true,"path":"./icons/icon-chip-alt.js"},{"name":"icon-chip","path":"./icons/icon-chip.js"},{"name":"icon-cinema","path":"./icons/icon-cinema.js"},{"name":"icon-circle-dotted-active","path":"./icons/icon-circle-dotted-active.js"},{"name":"icon-circle-dotted","path":"./icons/icon-circle-dotted.js"},{"name":"icon-circuits","path":"./icons/icon-circuits.js"},{"name":"icon-client","legacy":true,"path":"./icons/icon-client.js"},{"name":"icon-cloud-drive","path":"./icons/icon-cloud-drive.js"},{"name":"icon-cloud-upload","path":"./icons/icon-cloud-upload.js"},{"name":"icon-cloud","path":"./icons/icon-cloud.js"},{"name":"icon-cloudy","path":"./icons/icon-cloudy.js"},{"name":"icon-clubs","path":"./icons/icon-clubs.js"},{"name":"icon-cocktail","path":"./icons/icon-cocktail.js"},{"name":"icon-code","path":"./icons/icon-code.js"},{"name":"icon-coffee","path":"./icons/icon-coffee.js"},{"name":"icon-coin-euro","path":"./icons/icon-coin-euro.js"},{"name":"icon-coin-yen","path":"./icons/icon-coin-yen.js"},{"name":"icon-coins-alt","legacy":true,"path":"./icons/icon-coins-alt.js"},{"name":"icon-coins","path":"./icons/icon-coins.js"},{"name":"icon-color-bucket","path":"./icons/icon-color-bucket.js"},{"name":"icon-colorpicker","path":"./icons/icon-colorpicker.js"},{"name":"icon-columns","path":"./icons/icon-columns.js"},{"name":"icon-combination-lock-open","path":"./icons/icon-combination-lock-open.js"},{"name":"icon-combination-lock","path":"./icons/icon-combination-lock.js"},{"name":"icon-command","path":"./icons/icon-command.js"},{"name":"icon-company","path":"./icons/icon-company.js"},{"name":"icon-compress","path":"./icons/icon-compress.js"},{"name":"icon-connection","path":"./icons/icon-connection.js"},{"name":"icon-console","path":"./icons/icon-console.js"},{"name":"icon-contrast","path":"./icons/icon-contrast.js"},{"name":"icon-conversation-alt","path":"./icons/icon-conversation-alt.js"},{"name":"icon-conversation","legacy":true,"path":"./icons/icon-conversation.js"},{"name":"icon-coverflow","path":"./icons/icon-coverflow.js"},{"name":"icon-credit-card-alt","legacy":true,"path":"./icons/icon-credit-card-alt.js"},{"name":"icon-credit-card","path":"./icons/icon-credit-card.js"},{"name":"icon-crop","path":"./icons/icon-crop.js"},{"name":"icon-crosshair","path":"./icons/icon-crosshair.js"},{"name":"icon-crown-alt","legacy":true,"path":"./icons/icon-crown-alt.js"},{"name":"icon-crown","path":"./icons/icon-crown.js"},{"name":"icon-cupcake","legacy":true,"path":"./icons/icon-cupcake.js"},{"name":"icon-curve","path":"./icons/icon-curve.js"},{"name":"icon-cut","path":"./icons/icon-cut.js"},{"name":"icon-dashboard","path":"./icons/icon-dashboard.js"},{"name":"icon-defrag","path":"./icons/icon-defrag.js"},{"name":"icon-delete-key","path":"./icons/icon-delete-key.js"},{"name":"icon-delete","path":"./icons/icon-delete.js"},{"name":"icon-departure","path":"./icons/icon-departure.js"},{"name":"icon-desktop","legacy":true,"path":"./icons/icon-desktop.js"},{"name":"icon-diagnostics","path":"./icons/icon-diagnostics.js"},{"name":"icon-diagonal-arrow-alt","path":"./icons/icon-diagonal-arrow-alt.js"},{"name":"icon-diagonal-arrow","path":"./icons/icon-diagonal-arrow.js"},{"name":"icon-diamond","path":"./icons/icon-diamond.js"},{"name":"icon-diamonds","path":"./icons/icon-diamonds.js"},{"name":"icon-dice","path":"./icons/icon-dice.js"},{"name":"icon-diploma-alt","legacy":true,"path":"./icons/icon-diploma-alt.js"},{"name":"icon-diploma","path":"./icons/icon-diploma.js"},{"name":"icon-directions-alt","path":"./icons/icon-directions-alt.js"},{"name":"icon-directions","path":"./icons/icon-directions.js"},{"name":"icon-disc","path":"./icons/icon-disc.js"},{"name":"icon-disk-image","path":"./icons/icon-disk-image.js"},{"name":"icon-display","path":"./icons/icon-display.js"},{"name":"icon-dna","path":"./icons/icon-dna.js"},{"name":"icon-dock-connector","path":"./icons/icon-dock-connector.js"},{"name":"icon-document-dashed-line","path":"./icons/icon-document-dashed-line.js"},{"name":"icon-document","path":"./icons/icon-document.js"},{"name":"icon-documents","path":"./icons/icon-documents.js"},{"name":"icon-donate","legacy":true,"path":"./icons/icon-donate.js"},{"name":"icon-door-open-alt","legacy":true,"path":"./icons/icon-door-open-alt.js"},{"name":"icon-door-open","path":"./icons/icon-door-open.js"},{"name":"icon-download-alt","path":"./icons/icon-download-alt.js"},{"name":"icon-download","path":"./icons/icon-download.js"},{"name":"icon-drop","path":"./icons/icon-drop.js"},{"name":"icon-eco","path":"./icons/icon-eco.js"},{"name":"icon-economy","legacy":true,"path":"./icons/icon-economy.js"},{"name":"icon-edit","path":"./icons/icon-edit.js"},{"name":"icon-employee","legacy":true,"path":"./icons/icon-employee.js"},{"name":"icon-energy-saving-bulb","path":"./icons/icon-energy-saving-bulb.js"},{"name":"icon-enter","path":"./icons/icon-enter.js"},{"name":"icon-equalizer","path":"./icons/icon-equalizer.js"},{"name":"icon-escape","path":"./icons/icon-escape.js"},{"name":"icon-ethernet","path":"./icons/icon-ethernet.js"},{"name":"icon-eye","path":"./icons/icon-eye.js"},{"name":"icon-facebook-like","path":"./icons/icon-facebook-like.js"},{"name":"icon-factory","path":"./icons/icon-factory.js"},{"name":"icon-favorite","path":"./icons/icon-favorite.js"},{"name":"icon-file-cabinet","path":"./icons/icon-file-cabinet.js"},{"name":"icon-files","path":"./icons/icon-files.js"},{"name":"icon-filter","path":"./icons/icon-filter.js"},{"name":"icon-fingerprint","path":"./icons/icon-fingerprint.js"},{"name":"icon-fire","path":"./icons/icon-fire.js"},{"name":"icon-firewire","legacy":true,"path":"./icons/icon-firewire.js"},{"name":"icon-flag-alt","path":"./icons/icon-flag-alt.js"},{"name":"icon-flag","path":"./icons/icon-flag.js"},{"name":"icon-flash","path":"./icons/icon-flash.js"},{"name":"icon-flashlight","path":"./icons/icon-flashlight.js"},{"name":"icon-flowerpot","path":"./icons/icon-flowerpot.js"},{"name":"icon-folder","path":"./icons/icon-folder.js"},{"name":"icon-folders","path":"./icons/icon-folders.js"},{"name":"icon-font","path":"./icons/icon-font.js"},{"name":"icon-food","path":"./icons/icon-food.js"},{"name":"icon-footprints","path":"./icons/icon-footprints.js"},{"name":"icon-forking","path":"./icons/icon-forking.js"},{"name":"icon-frame-alt","legacy":true,"path":"./icons/icon-frame-alt.js"},{"name":"icon-frame","path":"./icons/icon-frame.js"},{"name":"icon-fullscreen-alt","path":"./icons/icon-fullscreen-alt.js"},{"name":"icon-fullscreen","path":"./icons/icon-fullscreen.js"},{"name":"icon-game","path":"./icons/icon-game.js"},{"name":"icon-geometry","legacy":true,"path":"./icons/icon-geometry.js"},{"name":"icon-gift","path":"./icons/icon-gift.js"},{"name":"icon-glasses","path":"./icons/icon-glasses.js"},{"name":"icon-globe-alt","path":"./icons/icon-globe-alt.js"},{"name":"icon-globe-asia","legacy":true,"path":"./icons/icon-globe-asia.js"},{"name":"icon-globe-europe-africa","legacy":true,"path":"./icons/icon-globe-europe-africa.js"},{"name":"icon-globe-inverted-america","legacy":true,"path":"./icons/icon-globe-inverted-america.js"},{"name":"icon-globe-inverted-asia","legacy":true,"path":"./icons/icon-globe-inverted-asia.js"},{"name":"icon-globe-inverted-europe-africa","legacy":true,"path":"./icons/icon-globe-inverted-europe-africa.js"},{"name":"icon-globe","path":"./icons/icon-globe.js"},{"name":"icon-gps","path":"./icons/icon-gps.js"},{"name":"icon-graduate","path":"./icons/icon-graduate.js"},{"name":"icon-grid","path":"./icons/icon-grid.js"},{"name":"icon-hammer","path":"./icons/icon-hammer.js"},{"name":"icon-hand-active-alt","legacy":true,"path":"./icons/icon-hand-active-alt.js"},{"name":"icon-hand-active","path":"./icons/icon-hand-active.js"},{"name":"icon-hand-pointer-alt","legacy":true,"path":"./icons/icon-hand-pointer-alt.js"},{"name":"icon-hand-pointer","path":"./icons/icon-hand-pointer.js"},{"name":"icon-handshake","path":"./icons/icon-handshake.js"},{"name":"icon-handtool-alt","legacy":true,"path":"./icons/icon-handtool-alt.js"},{"name":"icon-handtool","path":"./icons/icon-handtool.js"},{"name":"icon-hard-drive-alt","legacy":true,"path":"./icons/icon-hard-drive-alt.js"},{"name":"icon-hard-drive","legacy":true,"path":"./icons/icon-hard-drive.js"},{"name":"icon-headphones","path":"./icons/icon-headphones.js"},{"name":"icon-headset","legacy":true,"path":"./icons/icon-headset.js"},{"name":"icon-hearts","path":"./icons/icon-hearts.js"},{"name":"icon-height","path":"./icons/icon-height.js"},{"name":"icon-help-alt","path":"./icons/icon-help-alt.js"},{"name":"icon-help","path":"./icons/icon-help.js"},{"name":"icon-home","path":"./icons/icon-home.js"},{"name":"icon-hourglass","path":"./icons/icon-hourglass.js"},{"name":"icon-imac","legacy":true,"path":"./icons/icon-imac.js"},{"name":"icon-inbox-full","legacy":true,"path":"./icons/icon-inbox-full.js"},{"name":"icon-inbox","path":"./icons/icon-inbox.js"},{"name":"icon-indent","path":"./icons/icon-indent.js"},{"name":"icon-infinity","path":"./icons/icon-infinity.js"},{"name":"icon-info","path":"./icons/icon-info.js"},{"name":"icon-invoice","legacy":true,"path":"./icons/icon-invoice.js"},{"name":"icon-ipad","legacy":true,"path":"./icons/icon-ipad.js"},{"name":"icon-iphone","legacy":true,"path":"./icons/icon-iphone.js"},{"name":"icon-item-arrangement","legacy":true,"path":"./icons/icon-item-arrangement.js"},{"name":"icon-junk","path":"./icons/icon-junk.js"},{"name":"icon-key","path":"./icons/icon-key.js"},{"name":"icon-keyboard","path":"./icons/icon-keyboard.js"},{"name":"icon-lab","path":"./icons/icon-lab.js"},{"name":"icon-laptop","path":"./icons/icon-laptop.js"},{"name":"icon-layers-alt","legacy":true,"path":"./icons/icon-layers-alt.js"},{"name":"icon-layers","path":"./icons/icon-layers.js"},{"name":"icon-layout","path":"./icons/icon-layout.js"},{"name":"icon-left-double-arrow","path":"./icons/icon-left-double-arrow.js"},{"name":"icon-legal","path":"./icons/icon-legal.js"},{"name":"icon-lense","legacy":true,"path":"./icons/icon-lense.js"},{"name":"icon-library","path":"./icons/icon-library.js"},{"name":"icon-light-down","path":"./icons/icon-light-down.js"},{"name":"icon-light-up","path":"./icons/icon-light-up.js"},{"name":"icon-lightning","path":"./icons/icon-lightning.js"},{"name":"icon-link","path":"./icons/icon-link.js"},{"name":"icon-list","path":"./icons/icon-list.js"},{"name":"icon-load","legacy":true,"path":"./icons/icon-load.js"},{"name":"icon-loading","legacy":true,"path":"./icons/icon-loading.js"},{"name":"icon-location-nearby","path":"./icons/icon-location-nearby.js"},{"name":"icon-lock","path":"./icons/icon-lock.js"},{"name":"icon-log-out","path":"./icons/icon-log-out.js"},{"name":"icon-logout","legacy":true,"path":"./icons/icon-logout.js"},{"name":"icon-loupe","legacy":true,"path":"./icons/icon-loupe.js"},{"name":"icon-magnet","path":"./icons/icon-magnet.js"},{"name":"icon-mailbox","path":"./icons/icon-mailbox.js"},{"name":"icon-map-alt","path":"./icons/icon-map-alt.js"},{"name":"icon-map-location","legacy":true,"path":"./icons/icon-map-location.js"},{"name":"icon-map-marker","path":"./icons/icon-map-marker.js"},{"name":"icon-map","path":"./icons/icon-map.js"},{"name":"icon-medal","path":"./icons/icon-medal.js"},{"name":"icon-medical-emergency","path":"./icons/icon-medical-emergency.js"},{"name":"icon-medicine","path":"./icons/icon-medicine.js"},{"name":"icon-meeting","legacy":true,"path":"./icons/icon-meeting.js"},{"name":"icon-megaphone","path":"./icons/icon-megaphone.js"},{"name":"icon-merge","path":"./icons/icon-merge.js"},{"name":"icon-message-open","path":"./icons/icon-message-open.js"},{"name":"icon-message-unopened","legacy":true,"path":"./icons/icon-message-unopened.js"},{"name":"icon-message","path":"./icons/icon-message.js"},{"name":"icon-microscope","path":"./icons/icon-microscope.js"},{"name":"icon-mindmap","legacy":true,"path":"./icons/icon-mindmap.js"},{"name":"icon-mobile","path":"./icons/icon-mobile.js"},{"name":"icon-mountain","path":"./icons/icon-mountain.js"},{"name":"icon-mouse-cursor","path":"./icons/icon-mouse-cursor.js"},{"name":"icon-mouse","path":"./icons/icon-mouse.js"},{"name":"icon-movie-alt","path":"./icons/icon-movie-alt.js"},{"name":"icon-movie","path":"./icons/icon-movie.js"},{"name":"icon-multiple-credit-cards","path":"./icons/icon-multiple-credit-cards.js"},{"name":"icon-music","path":"./icons/icon-music.js"},{"name":"icon-name-badge","legacy":true,"path":"./icons/icon-name-badge.js"},{"name":"icon-navigation-bottom","legacy":true,"path":"./icons/icon-navigation-bottom.js"},{"name":"icon-navigation-down","legacy":true,"path":"./icons/icon-navigation-down.js"},{"name":"icon-navigation-first","legacy":true,"path":"./icons/icon-navigation-first.js"},{"name":"icon-navigation-horizontal","legacy":true,"path":"./icons/icon-navigation-horizontal.js"},{"name":"icon-navigation-last","legacy":true,"path":"./icons/icon-navigation-last.js"},{"name":"icon-navigation-left","legacy":true,"path":"./icons/icon-navigation-left.js"},{"name":"icon-navigation-right","legacy":true,"path":"./icons/icon-navigation-right.js"},{"name":"icon-navigation-road","legacy":true,"path":"./icons/icon-navigation-road.js"},{"name":"icon-navigation-up","legacy":true,"path":"./icons/icon-navigation-up.js"},{"name":"icon-navigation-vertical","legacy":true,"path":"./icons/icon-navigation-vertical.js"},{"name":"icon-navigation","legacy":true,"path":"./icons/icon-navigation.js"},{"name":"icon-navigational-arrow","path":"./icons/icon-navigational-arrow.js"},{"name":"icon-network-alt","path":"./icons/icon-network-alt.js"},{"name":"icon-newspaper-alt","legacy":true,"path":"./icons/icon-newspaper-alt.js"},{"name":"icon-newspaper","path":"./icons/icon-newspaper.js"},{"name":"icon-next-media","legacy":true,"path":"./icons/icon-next-media.js"},{"name":"icon-next","legacy":true,"path":"./icons/icon-next.js"},{"name":"icon-nodes","legacy":true,"path":"./icons/icon-nodes.js"},{"name":"icon-notepad-alt","legacy":true,"path":"./icons/icon-notepad-alt.js"},{"name":"icon-notepad","path":"./icons/icon-notepad.js"},{"name":"icon-old-key","path":"./icons/icon-old-key.js"},{"name":"icon-old-phone","legacy":true,"path":"./icons/icon-old-phone.js"},{"name":"icon-operator","path":"./icons/icon-operator.js"},{"name":"icon-ordered-list","path":"./icons/icon-ordered-list.js"},{"name":"icon-out","path":"./icons/icon-out.js"},{"name":"icon-outbox","legacy":true,"path":"./icons/icon-outbox.js"},{"name":"icon-outdent","path":"./icons/icon-outdent.js"},{"name":"icon-page-add","path":"./icons/icon-page-add.js"},{"name":"icon-page-down","path":"./icons/icon-page-down.js"},{"name":"icon-page-remove","path":"./icons/icon-page-remove.js"},{"name":"icon-page-restricted","path":"./icons/icon-page-restricted.js"},{"name":"icon-page-up","path":"./icons/icon-page-up.js"},{"name":"icon-paint-roller","legacy":true,"path":"./icons/icon-paint-roller.js"},{"name":"icon-palette","path":"./icons/icon-palette.js"},{"name":"icon-panel-show","path":"./icons/icon-panel-show.js"},{"name":"icon-pannel-close","path":"./icons/icon-pannel-close.js"},{"name":"icon-paper-bag","legacy":true,"path":"./icons/icon-paper-bag.js"},{"name":"icon-paper-plane-alt","path":"./icons/icon-paper-plane-alt.js"},{"name":"icon-paper-plane","path":"./icons/icon-paper-plane.js"},{"name":"icon-partly-cloudy","path":"./icons/icon-partly-cloudy.js"},{"name":"icon-paste-in","legacy":true,"path":"./icons/icon-paste-in.js"},{"name":"icon-pause","path":"./icons/icon-pause.js"},{"name":"icon-pc","legacy":true,"path":"./icons/icon-pc.js"},{"name":"icon-people-alt-2","legacy":true,"path":"./icons/icon-people-alt-2.js"},{"name":"icon-people-alt","legacy":true,"path":"./icons/icon-people-alt.js"},{"name":"icon-people-female","legacy":true,"path":"./icons/icon-people-female.js"},{"name":"icon-people","path":"./icons/icon-people.js"},{"name":"icon-phone-ring","path":"./icons/icon-phone-ring.js"},{"name":"icon-phone","path":"./icons/icon-phone.js"},{"name":"icon-photo-album","path":"./icons/icon-photo-album.js"},{"name":"icon-picture","path":"./icons/icon-picture.js"},{"name":"icon-pictures-alt-2","path":"./icons/icon-pictures-alt-2.js"},{"name":"icon-pictures-alt","legacy":true,"path":"./icons/icon-pictures-alt.js"},{"name":"icon-pictures","path":"./icons/icon-pictures.js"},{"name":"icon-pie-chart","path":"./icons/icon-pie-chart.js"},{"name":"icon-piggy-bank","path":"./icons/icon-piggy-bank.js"},{"name":"icon-pin-location","path":"./icons/icon-pin-location.js"},{"name":"icon-plane","path":"./icons/icon-plane.js"},{"name":"icon-planet","legacy":true,"path":"./icons/icon-planet.js"},{"name":"icon-play","path":"./icons/icon-play.js"},{"name":"icon-playing-cards","legacy":true,"path":"./icons/icon-playing-cards.js"},{"name":"icon-playlist","path":"./icons/icon-playlist.js"},{"name":"icon-plugin","path":"./icons/icon-plugin.js"},{"name":"icon-podcast","path":"./icons/icon-podcast.js"},{"name":"icon-poll","legacy":true,"path":"./icons/icon-poll.js"},{"name":"icon-post-it","path":"./icons/icon-post-it.js"},{"name":"icon-power-outlet","legacy":true,"path":"./icons/icon-power-outlet.js"},{"name":"icon-power","path":"./icons/icon-power.js"},{"name":"icon-presentation","path":"./icons/icon-presentation.js"},{"name":"icon-previous-media","path":"./icons/icon-previous-media.js"},{"name":"icon-previous","path":"./icons/icon-previous.js"},{"name":"icon-price-dollar","legacy":true,"path":"./icons/icon-price-dollar.js"},{"name":"icon-price-euro","legacy":true,"path":"./icons/icon-price-euro.js"},{"name":"icon-price-pound","legacy":true,"path":"./icons/icon-price-pound.js"},{"name":"icon-print","path":"./icons/icon-print.js"},{"name":"icon-printer-alt","legacy":true,"path":"./icons/icon-printer-alt.js"},{"name":"icon-projector","path":"./icons/icon-projector.js"},{"name":"icon-pulse","path":"./icons/icon-pulse.js"},{"name":"icon-pushpin","path":"./icons/icon-pushpin.js"},{"name":"icon-qr-code","path":"./icons/icon-qr-code.js"},{"name":"icon-quote","path":"./icons/icon-quote.js"},{"name":"icon-radio-alt","path":"./icons/icon-radio-alt.js"},{"name":"icon-radio-receiver","path":"./icons/icon-radio-receiver.js"},{"name":"icon-radio","path":"./icons/icon-radio.js"},{"name":"icon-rain","path":"./icons/icon-rain.js"},{"name":"icon-rate","legacy":true,"path":"./icons/icon-rate.js"},{"name":"icon-re-post","path":"./icons/icon-re-post.js"},{"name":"icon-readonly","legacy":true,"path":"./icons/icon-readonly.js"},{"name":"icon-receipt-alt","path":"./icons/icon-receipt-alt.js"},{"name":"icon-reception","path":"./icons/icon-reception.js"},{"name":"icon-record","legacy":true,"path":"./icons/icon-record.js"},{"name":"icon-redo","path":"./icons/icon-redo.js"},{"name":"icon-refresh","path":"./icons/icon-refresh.js"},{"name":"icon-remote","legacy":true,"path":"./icons/icon-remote.js"},{"name":"icon-remove","path":"./icons/icon-remove.js"},{"name":"icon-repeat-one","path":"./icons/icon-repeat-one.js"},{"name":"icon-repeat","path":"./icons/icon-repeat.js"},{"name":"icon-reply-arrow","path":"./icons/icon-reply-arrow.js"},{"name":"icon-return-to-top","legacy":true,"path":"./icons/icon-return-to-top.js"},{"name":"icon-right-double-arrow","legacy":true,"path":"./icons/icon-right-double-arrow.js"},{"name":"icon-roadsign","legacy":true,"path":"./icons/icon-roadsign.js"},{"name":"icon-rocket","path":"./icons/icon-rocket.js"},{"name":"icon-rss","path":"./icons/icon-rss.js"},{"name":"icon-ruler-alt","path":"./icons/icon-ruler-alt.js"},{"name":"icon-ruler","path":"./icons/icon-ruler.js"},{"name":"icon-satellite-dish","path":"./icons/icon-satellite-dish.js"},{"name":"icon-save","path":"./icons/icon-save.js"},{"name":"icon-scan","path":"./icons/icon-scan.js"},{"name":"icon-school","path":"./icons/icon-school.js"},{"name":"icon-screensharing","path":"./icons/icon-screensharing.js"},{"name":"icon-script-alt","legacy":true,"path":"./icons/icon-script-alt.js"},{"name":"icon-script","path":"./icons/icon-script.js"},{"name":"icon-scull","path":"./icons/icon-scull.js"},{"name":"icon-search","path":"./icons/icon-search.js"},{"name":"icon-sensor","path":"./icons/icon-sensor.js"},{"name":"icon-server-alt","legacy":true,"path":"./icons/icon-server-alt.js"},{"name":"icon-server","path":"./icons/icon-server.js"},{"name":"icon-settings-alt","legacy":true,"path":"./icons/icon-settings-alt.js"},{"name":"icon-settings","path":"./icons/icon-settings.js"},{"name":"icon-share-alt","path":"./icons/icon-share-alt.js"},{"name":"icon-share","path":"./icons/icon-share.js"},{"name":"icon-sharing-iphone","path":"./icons/icon-sharing-iphone.js"},{"name":"icon-shield","path":"./icons/icon-shield.js"},{"name":"icon-shift","path":"./icons/icon-shift.js"},{"name":"icon-shipping-box","path":"./icons/icon-shipping-box.js"},{"name":"icon-shipping","path":"./icons/icon-shipping.js"},{"name":"icon-shoe","path":"./icons/icon-shoe.js"},{"name":"icon-shopping-basket-alt-2","legacy":true,"path":"./icons/icon-shopping-basket-alt-2.js"},{"name":"icon-shopping-basket-alt","path":"./icons/icon-shopping-basket-alt.js"},{"name":"icon-shopping-basket","path":"./icons/icon-shopping-basket.js"},{"name":"icon-shuffle","path":"./icons/icon-shuffle.js"},{"name":"icon-sience","path":"./icons/icon-sience.js"},{"name":"icon-single-note","path":"./icons/icon-single-note.js"},{"name":"icon-sitemap","legacy":true,"path":"./icons/icon-sitemap.js"},{"name":"icon-sleep","path":"./icons/icon-sleep.js"},{"name":"icon-slideshow","legacy":true,"path":"./icons/icon-slideshow.js"},{"name":"icon-smiley-inverted","legacy":true,"path":"./icons/icon-smiley-inverted.js"},{"name":"icon-smiley","path":"./icons/icon-smiley.js"},{"name":"icon-snow","path":"./icons/icon-snow.js"},{"name":"icon-sound-low","path":"./icons/icon-sound-low.js"},{"name":"icon-sound-medium","legacy":true,"path":"./icons/icon-sound-medium.js"},{"name":"icon-sound-off","path":"./icons/icon-sound-off.js"},{"name":"icon-sound-waves","path":"./icons/icon-sound-waves.js"},{"name":"icon-sound","path":"./icons/icon-sound.js"},{"name":"icon-spades","path":"./icons/icon-spades.js"},{"name":"icon-speaker","path":"./icons/icon-speaker.js"},{"name":"icon-speed-gauge","path":"./icons/icon-speed-gauge.js"},{"name":"icon-split","path":"./icons/icon-split.js"},{"name":"icon-sprout","path":"./icons/icon-sprout.js"},{"name":"icon-squiggly-line","legacy":true,"path":"./icons/icon-squiggly-line.js"},{"name":"icon-ssd","legacy":true,"path":"./icons/icon-ssd.js"},{"name":"icon-stacked-disks","legacy":true,"path":"./icons/icon-stacked-disks.js"},{"name":"icon-stamp","legacy":true,"path":"./icons/icon-stamp.js"},{"name":"icon-stop-alt","path":"./icons/icon-stop-alt.js"},{"name":"icon-stop-hand","legacy":true,"path":"./icons/icon-stop-hand.js"},{"name":"icon-stop","path":"./icons/icon-stop.js"},{"name":"icon-store","path":"./icons/icon-store.js"},{"name":"icon-stream","legacy":true,"path":"./icons/icon-stream.js"},{"name":"icon-sunny","path":"./icons/icon-sunny.js"},{"name":"icon-sweatshirt","legacy":true,"path":"./icons/icon-sweatshirt.js"},{"name":"icon-sync","path":"./icons/icon-sync.js"},{"name":"icon-t-shirt","path":"./icons/icon-t-shirt.js"},{"name":"icon-tab-key","path":"./icons/icon-tab-key.js"},{"name":"icon-tag","path":"./icons/icon-tag.js"},{"name":"icon-tags","path":"./icons/icon-tags.js"},{"name":"icon-takeaway-cup","legacy":true,"path":"./icons/icon-takeaway-cup.js"},{"name":"icon-target","path":"./icons/icon-target.js"},{"name":"icon-temperatrure-alt","path":"./icons/icon-temperatrure-alt.js"},{"name":"icon-temperature","path":"./icons/icon-temperature.js"},{"name":"icon-terminal","path":"./icons/icon-terminal.js"},{"name":"icon-theater","path":"./icons/icon-theater.js"},{"name":"icon-thumb-down","path":"./icons/icon-thumb-down.js"},{"name":"icon-thumb-up","path":"./icons/icon-thumb-up.js"},{"name":"icon-thumbnail-list","path":"./icons/icon-thumbnail-list.js"},{"name":"icon-thumbnails-small","path":"./icons/icon-thumbnails-small.js"},{"name":"icon-thumbnails","path":"./icons/icon-thumbnails.js"},{"name":"icon-ticket","path":"./icons/icon-ticket.js"},{"name":"icon-time","path":"./icons/icon-time.js"},{"name":"icon-timer","path":"./icons/icon-timer.js"},{"name":"icon-tools","legacy":true,"path":"./icons/icon-tools.js"},{"name":"icon-top","legacy":true,"path":"./icons/icon-top.js"},{"name":"icon-traffic-alt","legacy":true,"path":"./icons/icon-traffic-alt.js"},{"name":"icon-trafic","path":"./icons/icon-trafic.js"},{"name":"icon-train","path":"./icons/icon-train.js"},{"name":"icon-trash-alt-2","legacy":true,"path":"./icons/icon-trash-alt-2.js"},{"name":"icon-trash-alt","legacy":true,"path":"./icons/icon-trash-alt.js"},{"name":"icon-trash","path":"./icons/icon-trash.js"},{"name":"icon-tree","path":"./icons/icon-tree.js"},{"name":"icon-trophy","path":"./icons/icon-trophy.js"},{"name":"icon-truck","path":"./icons/icon-truck.js"},{"name":"icon-tv-old","path":"./icons/icon-tv-old.js"},{"name":"icon-tv","path":"./icons/icon-tv.js"},{"name":"icon-umb-content","legacy":true,"path":"./icons/icon-umb-content.js"},{"name":"icon-umb-developer","legacy":true,"path":"./icons/icon-umb-developer.js"},{"name":"icon-umb-media","legacy":true,"path":"./icons/icon-umb-media.js"},{"name":"icon-umb-settings","legacy":true,"path":"./icons/icon-umb-settings.js"},{"name":"icon-umb-users","legacy":true,"path":"./icons/icon-umb-users.js"},{"name":"icon-umbrella","path":"./icons/icon-umbrella.js"},{"name":"icon-undo","path":"./icons/icon-undo.js"},{"name":"icon-unlocked","path":"./icons/icon-unlocked.js"},{"name":"icon-untitled","legacy":true,"path":"./icons/icon-untitled.js"},{"name":"icon-usb-connector","legacy":true,"path":"./icons/icon-usb-connector.js"},{"name":"icon-usb","path":"./icons/icon-usb.js"},{"name":"icon-user-female","legacy":true,"path":"./icons/icon-user-female.js"},{"name":"icon-user-females-alt","legacy":true,"path":"./icons/icon-user-females-alt.js"},{"name":"icon-user-females","legacy":true,"path":"./icons/icon-user-females.js"},{"name":"icon-user-glasses","legacy":true,"path":"./icons/icon-user-glasses.js"},{"name":"icon-user","path":"./icons/icon-user.js"},{"name":"icon-users-alt","legacy":true,"path":"./icons/icon-users-alt.js"},{"name":"icon-users","path":"./icons/icon-users.js"},{"name":"icon-utilities","path":"./icons/icon-utilities.js"},{"name":"icon-vcard","path":"./icons/icon-vcard.js"},{"name":"icon-video","path":"./icons/icon-video.js"},{"name":"icon-voice","path":"./icons/icon-voice.js"},{"name":"icon-wall-plug","path":"./icons/icon-wall-plug.js"},{"name":"icon-wallet","path":"./icons/icon-wallet.js"},{"name":"icon-wand","path":"./icons/icon-wand.js"},{"name":"icon-webhook","path":"./icons/icon-webhook.js"},{"name":"icon-weight","path":"./icons/icon-weight.js"},{"name":"icon-width","path":"./icons/icon-width.js"},{"name":"icon-wifi","path":"./icons/icon-wifi.js"},{"name":"icon-window-popin","path":"./icons/icon-window-popin.js"},{"name":"icon-window-sizes","path":"./icons/icon-window-sizes.js"},{"name":"icon-wine-glass","path":"./icons/icon-wine-glass.js"},{"name":"icon-wrench","path":"./icons/icon-wrench.js"},{"name":"icon-wrong","path":"./icons/icon-wrong.js"},{"name":"icon-zip","path":"./icons/icon-zip.js"},{"name":"icon-zom-out","legacy":true,"path":"./icons/icon-zom-out.js"},{"name":"icon-zoom-in","path":"./icons/icon-zoom-in.js"},{"name":"icon-zoom-out","path":"./icons/icon-zoom-out.js"},{"name":"icon-star","path":"./icons/icon-star.js"},{"name":"icon-database","path":"./icons/icon-database.js"},{"name":"icon-azure","path":"./icons/icon-azure.js"},{"name":"icon-facebook","path":"./icons/icon-facebook.js"},{"name":"icon-gitbook","path":"./icons/icon-gitbook.js"},{"name":"icon-github","path":"./icons/icon-github.js"},{"name":"icon-gitlab","path":"./icons/icon-gitlab.js"},{"name":"icon-google","path":"./icons/icon-google.js"},{"name":"icon-linkedin","path":"./icons/icon-linkedin.js"},{"name":"icon-mastodon","path":"./icons/icon-mastodon.js"},{"name":"icon-microsoft","path":"./icons/icon-microsoft.js"},{"name":"icon-twitter-x","path":"./icons/icon-twitter-x.js"},{"name":"icon-umbraco","path":"./icons/icon-umbraco.js"},{"name":"icon-application-error","legacy":true,"path":"./icons/icon-application-error.js"},{"name":"icon-art-easel","legacy":true,"path":"./icons/icon-art-easel.js"},{"name":"icon-article","legacy":true,"path":"./icons/icon-article.js"},{"name":"icon-auction-hammer","legacy":true,"path":"./icons/icon-auction-hammer.js"},{"name":"icon-baby-stroller","legacy":true,"path":"./icons/icon-baby-stroller.js"},{"name":"icon-badge-count","legacy":true,"path":"./icons/icon-badge-count.js"},{"name":"icon-ball","legacy":true,"path":"./icons/icon-ball.js"},{"name":"icon-band-aid","legacy":true,"path":"./icons/icon-band-aid.js"},{"name":"icon-bill-dollar","legacy":true,"path":"./icons/icon-bill-dollar.js"},{"name":"icon-bill-euro","legacy":true,"path":"./icons/icon-bill-euro.js"},{"name":"icon-bill-pound","legacy":true,"path":"./icons/icon-bill-pound.js"},{"name":"icon-bill-yen","legacy":true,"path":"./icons/icon-bill-yen.js"},{"name":"icon-bill","legacy":true,"path":"./icons/icon-bill.js"},{"name":"icon-billboard","legacy":true,"path":"./icons/icon-billboard.js"},{"name":"icon-bills-dollar","legacy":true,"path":"./icons/icon-bills-dollar.js"},{"name":"icon-bills-euro","legacy":true,"path":"./icons/icon-bills-euro.js"},{"name":"icon-bills-pound","legacy":true,"path":"./icons/icon-bills-pound.js"},{"name":"icon-bills-yen","legacy":true,"path":"./icons/icon-bills-yen.js"},{"name":"icon-bills","legacy":true,"path":"./icons/icon-bills.js"},{"name":"icon-binoculars","legacy":true,"path":"./icons/icon-binoculars.js"},{"name":"icon-blueprint","legacy":true,"path":"./icons/icon-blueprint.js"},{"name":"icon-bomb","legacy":true,"path":"./icons/icon-bomb.js"},{"name":"icon-cash-register","legacy":true,"path":"./icons/icon-cash-register.js"},{"name":"icon-checkbox-dotted-active","legacy":true,"path":"./icons/icon-checkbox-dotted-active.js"},{"name":"icon-chess","legacy":true,"path":"./icons/icon-chess.js"},{"name":"icon-circus","legacy":true,"path":"./icons/icon-circus.js"},{"name":"icon-clothes-hanger","legacy":true,"path":"./icons/icon-clothes-hanger.js"},{"name":"icon-coin-dollar","legacy":true,"path":"./icons/icon-coin-dollar.js"},{"name":"icon-coin-pound","legacy":true,"path":"./icons/icon-coin-pound.js"},{"name":"icon-coin","legacy":true,"path":"./icons/icon-coin.js"},{"name":"icon-coins-dollar-alt","legacy":true,"path":"./icons/icon-coins-dollar-alt.js"},{"name":"icon-coins-dollar","legacy":true,"path":"./icons/icon-coins-dollar.js"},{"name":"icon-coins-euro-alt","legacy":true,"path":"./icons/icon-coins-euro-alt.js"},{"name":"icon-coins-euro","legacy":true,"path":"./icons/icon-coins-euro.js"},{"name":"icon-coins-pound-alt","legacy":true,"path":"./icons/icon-coins-pound-alt.js"},{"name":"icon-coins-pound","legacy":true,"path":"./icons/icon-coins-pound.js"},{"name":"icon-coins-yen-alt","legacy":true,"path":"./icons/icon-coins-yen-alt.js"},{"name":"icon-coins-yen","legacy":true,"path":"./icons/icon-coins-yen.js"},{"name":"icon-comb","legacy":true,"path":"./icons/icon-comb.js"},{"name":"icon-desk","legacy":true,"path":"./icons/icon-desk.js"},{"name":"icon-dollar-bag","legacy":true,"path":"./icons/icon-dollar-bag.js"},{"name":"icon-eject","legacy":true,"path":"./icons/icon-eject.js"},{"name":"icon-euro-bag","legacy":true,"path":"./icons/icon-euro-bag.js"},{"name":"icon-exit-fullscreen","legacy":true,"path":"./icons/icon-exit-fullscreen.js"},{"name":"icon-female-symbol","legacy":true,"path":"./icons/icon-female-symbol.js"},{"name":"icon-filter-arrows","legacy":true,"path":"./icons/icon-filter-arrows.js"},{"name":"icon-firewall","legacy":true,"path":"./icons/icon-firewall.js"},{"name":"icon-folder-open","legacy":true,"path":"./icons/icon-folder-open.js"},{"name":"icon-folder-outline","legacy":true,"path":"./icons/icon-folder-outline.js"},{"name":"icon-handprint","legacy":true,"path":"./icons/icon-handprint.js"},{"name":"icon-hat","legacy":true,"path":"./icons/icon-hat.js"},{"name":"icon-hd","legacy":true,"path":"./icons/icon-hd.js"},{"name":"icon-inactive-line","legacy":true,"path":"./icons/icon-inactive-line.js"},{"name":"icon-keychain","legacy":true,"path":"./icons/icon-keychain.js"},{"name":"icon-keyhole","legacy":true,"path":"./icons/icon-keyhole.js"},{"name":"icon-lightbulb-active","legacy":true,"path":"./icons/icon-lightbulb-active.js"},{"name":"icon-lightbulb","legacy":true,"path":"./icons/icon-lightbulb.js"},{"name":"icon-linux-tux","legacy":true,"path":"./icons/icon-linux-tux.js"},{"name":"icon-locate","legacy":true,"path":"./icons/icon-locate.js"},{"name":"icon-location-near-me","legacy":true,"path":"./icons/icon-location-near-me.js"},{"name":"icon-male-and-female","legacy":true,"path":"./icons/icon-male-and-female.js"},{"name":"icon-male-symbol","legacy":true,"path":"./icons/icon-male-symbol.js"},{"name":"icon-molecular-network","legacy":true,"path":"./icons/icon-molecular-network.js"},{"name":"icon-molecular","legacy":true,"path":"./icons/icon-molecular.js"},{"name":"icon-multiple-windows","legacy":true,"path":"./icons/icon-multiple-windows.js"},{"name":"icon-navigation-top","legacy":true,"path":"./icons/icon-navigation-top.js"},{"name":"icon-os-x","legacy":true,"path":"./icons/icon-os-x.js"},{"name":"icon-pants","legacy":true,"path":"./icons/icon-pants.js"},{"name":"icon-parachute-drop","legacy":true,"path":"./icons/icon-parachute-drop.js"},{"name":"icon-parental-control","legacy":true,"path":"./icons/icon-parental-control.js"},{"name":"icon-path","legacy":true,"path":"./icons/icon-path.js"},{"name":"icon-piracy","legacy":true,"path":"./icons/icon-piracy.js"},{"name":"icon-poker-chip","legacy":true,"path":"./icons/icon-poker-chip.js"},{"name":"icon-pound-bag","legacy":true,"path":"./icons/icon-pound-bag.js"},{"name":"icon-price-yen","legacy":true,"path":"./icons/icon-price-yen.js"},{"name":"icon-receipt-dollar","legacy":true,"path":"./icons/icon-receipt-dollar.js"},{"name":"icon-receipt-euro","legacy":true,"path":"./icons/icon-receipt-euro.js"},{"name":"icon-receipt-pound","legacy":true,"path":"./icons/icon-receipt-pound.js"},{"name":"icon-receipt-yen","legacy":true,"path":"./icons/icon-receipt-yen.js"},{"name":"icon-resize","legacy":true,"path":"./icons/icon-resize.js"},{"name":"icon-road","legacy":true,"path":"./icons/icon-road.js"},{"name":"icon-safe","legacy":true,"path":"./icons/icon-safe.js"},{"name":"icon-safedial","legacy":true,"path":"./icons/icon-safedial.js"},{"name":"icon-sandbox-toys","legacy":true,"path":"./icons/icon-sandbox-toys.js"},{"name":"icon-security-camera","legacy":true,"path":"./icons/icon-security-camera.js"},{"name":"icon-settings-alt-2","legacy":true,"path":"./icons/icon-settings-alt-2.js"},{"name":"icon-share-alt-2","legacy":true,"path":"./icons/icon-share-alt-2.js"},{"name":"icon-shorts","legacy":true,"path":"./icons/icon-shorts.js"},{"name":"icon-simcard","legacy":true,"path":"./icons/icon-simcard.js"},{"name":"icon-split-alt","legacy":true,"path":"./icons/icon-split-alt.js"},{"name":"icon-tab","legacy":true,"path":"./icons/icon-tab.js"},{"name":"icon-tactics","legacy":true,"path":"./icons/icon-tactics.js"},{"name":"icon-theif","legacy":true,"path":"./icons/icon-theif.js"},{"name":"icon-thought-bubble","legacy":true,"path":"./icons/icon-thought-bubble.js"},{"name":"icon-twitter","legacy":true,"path":"./icons/icon-twitter.js"},{"name":"icon-umb-contour","legacy":true,"path":"./icons/icon-umb-contour.js"},{"name":"icon-umb-deploy","legacy":true,"path":"./icons/icon-umb-deploy.js"},{"name":"icon-umb-members","legacy":true,"path":"./icons/icon-umb-members.js"},{"name":"icon-universal","legacy":true,"path":"./icons/icon-universal.js"},{"name":"icon-war","legacy":true,"path":"./icons/icon-war.js"},{"name":"icon-windows","legacy":true,"path":"./icons/icon-windows.js"},{"name":"icon-yen-bag","legacy":true,"path":"./icons/icon-yen-bag.js"}] \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/svgs/icon-twitter.svg b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/svgs/icon-twitter.svg index 02f6e8c48b..d332ef9a31 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/svgs/icon-twitter.svg +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/svgs/icon-twitter.svg @@ -1,5 +1,5 @@ - + + Twitter - + d="M21.543 7.104c.015.211.015.423.015.636 0 6.507-4.954 14.01-14.01 14.01v-.003A13.94 13.94 0 0 1 0 19.539a9.88 9.88 0 0 0 7.287-2.041 4.93 4.93 0 0 1-4.6-3.42 4.916 4.916 0 0 0 2.223-.084A4.926 4.926 0 0 1 .96 9.167v-.062a4.887 4.887 0 0 0 2.235.616A4.928 4.928 0 0 1 1.67 3.148 13.98 13.98 0 0 0 11.82 8.292a4.929 4.929 0 0 1 8.39-4.49 9.868 9.868 0 0 0 3.128-1.196 4.941 4.941 0 0 1-2.165 2.724A9.828 9.828 0 0 0 24 4.555a10.019 10.019 0 0 1-2.457 2.549z" /> From c77c8ee9373cca546f3721df860101afe9d9fc9e Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Tue, 9 Apr 2024 17:13:56 +0200 Subject: [PATCH 223/280] take the TS source code off of @openid/appauth and compile it manually so that we can make it into a proper esmodule --- src/Umbraco.Web.UI.Client/package-lock.json | 596 +++++++++--------- src/Umbraco.Web.UI.Client/package.json | 15 +- .../src/external/base64-js/index.ts | 1 + .../src/external/openid/LICENSE | 176 ++++++ .../external/openid/authorization_request.ts | 122 ++++ .../openid/authorization_request_handler.ts | 161 +++++ .../external/openid/authorization_response.ts | 79 +++ .../authorization_service_configuration.ts | 81 +++ .../src/external/openid/crypto_utils.ts | 98 +++ .../src/external/openid/errors.ts | 24 + .../src/external/openid/flags.ts | 21 + .../src/external/openid/index.ts | 34 +- .../src/external/openid/logger.ts | 71 +++ .../src/external/openid/query_string_utils.ts | 64 ++ .../external/openid/redirect_based_handler.ts | 147 +++++ .../external/openid/revoke_token_request.ts | 73 +++ .../src/external/openid/storage.ts | 101 +++ .../src/external/openid/token_request.ts | 96 +++ .../external/openid/token_request_handler.ts | 88 +++ .../src/external/openid/token_response.ts | 137 ++++ .../src/external/openid/types.ts | 32 + .../src/external/openid/xhr.ts | 115 ++++ src/Umbraco.Web.UI.Client/tsconfig.json | 1 + 23 files changed, 2006 insertions(+), 327 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/external/base64-js/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/external/openid/LICENSE create mode 100644 src/Umbraco.Web.UI.Client/src/external/openid/authorization_request.ts create mode 100644 src/Umbraco.Web.UI.Client/src/external/openid/authorization_request_handler.ts create mode 100644 src/Umbraco.Web.UI.Client/src/external/openid/authorization_response.ts create mode 100644 src/Umbraco.Web.UI.Client/src/external/openid/authorization_service_configuration.ts create mode 100644 src/Umbraco.Web.UI.Client/src/external/openid/crypto_utils.ts create mode 100644 src/Umbraco.Web.UI.Client/src/external/openid/errors.ts create mode 100644 src/Umbraco.Web.UI.Client/src/external/openid/flags.ts create mode 100644 src/Umbraco.Web.UI.Client/src/external/openid/logger.ts create mode 100644 src/Umbraco.Web.UI.Client/src/external/openid/query_string_utils.ts create mode 100644 src/Umbraco.Web.UI.Client/src/external/openid/redirect_based_handler.ts create mode 100644 src/Umbraco.Web.UI.Client/src/external/openid/revoke_token_request.ts create mode 100644 src/Umbraco.Web.UI.Client/src/external/openid/storage.ts create mode 100644 src/Umbraco.Web.UI.Client/src/external/openid/token_request.ts create mode 100644 src/Umbraco.Web.UI.Client/src/external/openid/token_request_handler.ts create mode 100644 src/Umbraco.Web.UI.Client/src/external/openid/token_response.ts create mode 100644 src/Umbraco.Web.UI.Client/src/external/openid/types.ts create mode 100644 src/Umbraco.Web.UI.Client/src/external/openid/xhr.ts diff --git a/src/Umbraco.Web.UI.Client/package-lock.json b/src/Umbraco.Web.UI.Client/package-lock.json index 865262002a..db9ee79f23 100644 --- a/src/Umbraco.Web.UI.Client/package-lock.json +++ b/src/Umbraco.Web.UI.Client/package-lock.json @@ -9,11 +9,11 @@ "version": "14.0.0-beta003", "license": "MIT", "dependencies": { - "@openid/appauth": "^1.3.1", "@types/dompurify": "^3.0.5", "@types/uuid": "^9.0.8", "@umbraco-ui/uui": "1.7.2", "@umbraco-ui/uui-css": "1.7.2", + "base64-js": "^1.5.1", "dompurify": "^3.0.9", "element-internals-polyfill": "^1.3.10", "lit": "^3.1.2", @@ -44,10 +44,10 @@ "@types/mocha": "^10.0.1", "@typescript-eslint/eslint-plugin": "^6.14.0", "@typescript-eslint/parser": "^7.1.0", - "@web/dev-server-esbuild": "^1.0.1", + "@web/dev-server-esbuild": "^1.0.2", "@web/dev-server-import-maps": "^0.2.0", "@web/dev-server-rollup": "^0.6.1", - "@web/test-runner": "^0.18.0", + "@web/test-runner": "^0.18.1", "@web/test-runner-playwright": "^0.11.0", "babel-loader": "^9.1.3", "eslint": "^8.56.0", @@ -68,9 +68,9 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "remark-gfm": "^3.0.1", - "rollup": "^4.12.0", - "rollup-plugin-esbuild": "^6.1.0", - "rollup-plugin-import-css": "^3.4.0", + "rollup": "^4.14.1", + "rollup-plugin-esbuild": "^6.1.1", + "rollup-plugin-import-css": "^3.5.0", "rollup-plugin-web-worker-loader": "^1.6.1", "simple-icons": "^11.11.0", "storybook": "^7.6.17", @@ -3343,19 +3343,6 @@ "lit-html": "^2.0.0 || ^3.0.0" } }, - "node_modules/@openid/appauth": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@openid/appauth/-/appauth-1.3.1.tgz", - "integrity": "sha512-e54kpi219wES2ijPzeHe1kMnT8VKH8YeTd1GAn9BzVBmutz3tBgcG1y8a4pziNr4vNjFnuD4W446Ua7ELnNDiA==", - "dependencies": { - "@types/base64-js": "^1.3.0", - "@types/jquery": "^3.5.5", - "base64-js": "^1.5.1", - "follow-redirects": "^1.13.3", - "form-data": "^4.0.0", - "opener": "^1.5.2" - } - }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -3382,52 +3369,60 @@ } }, "node_modules/@puppeteer/browsers": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.4.6.tgz", - "integrity": "sha512-x4BEjr2SjOPowNeiguzjozQbsc6h437ovD/wu+JpaenxVLm3jkgzHY2xOslMTp50HoTvQreMjiexiGQw1sqZlQ==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.2.1.tgz", + "integrity": "sha512-QSXujx4d4ogDamQA8ckkkRieFzDgZEuZuGiey9G7CuDcbnX4iINKWxTPC5Br2AEzY9ICAvcndqgAUFMMKnS/Tw==", "dev": true, "dependencies": { "debug": "4.3.4", "extract-zip": "2.0.1", "progress": "2.0.3", - "proxy-agent": "6.3.0", - "tar-fs": "3.0.4", + "proxy-agent": "6.4.0", + "semver": "7.6.0", + "tar-fs": "3.0.5", "unbzip2-stream": "1.4.3", - "yargs": "17.7.1" + "yargs": "17.7.2" }, "bin": { "browsers": "lib/cjs/main-cli.js" }, "engines": { - "node": ">=16.3.0" - }, - "peerDependencies": { - "typescript": ">= 4.7.4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">=18" } }, - "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==", + "node_modules/@puppeteer/browsers/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": { - "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" + "yallist": "^4.0.0" }, "engines": { - "node": ">=12" + "node": ">=10" } }, + "node_modules/@puppeteer/browsers/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/@puppeteer/browsers/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/@radix-ui/number": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@radix-ui/number/-/number-1.0.1.tgz", @@ -4236,9 +4231,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.12.0.tgz", - "integrity": "sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==", + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.14.1.tgz", + "integrity": "sha512-fH8/o8nSUek8ceQnT7K4EQbSiV7jgkHq81m9lWZFIXjJ7lJzpWXbQFpT/Zh6OZYnpFykvzC3fbEvEAFZu03dPA==", "cpu": [ "arm" ], @@ -4249,9 +4244,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.12.0.tgz", - "integrity": "sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==", + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.14.1.tgz", + "integrity": "sha512-Y/9OHLjzkunF+KGEoJr3heiD5X9OLa8sbT1lm0NYeKyaM3oMhhQFvPB0bNZYJwlq93j8Z6wSxh9+cyKQaxS7PQ==", "cpu": [ "arm64" ], @@ -4262,9 +4257,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.12.0.tgz", - "integrity": "sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==", + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.14.1.tgz", + "integrity": "sha512-+kecg3FY84WadgcuSVm6llrABOdQAEbNdnpi5X3UwWiFVhZIZvKgGrF7kmLguvxHNQy+UuRV66cLVl3S+Rkt+Q==", "cpu": [ "arm64" ], @@ -4275,9 +4270,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.12.0.tgz", - "integrity": "sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==", + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.14.1.tgz", + "integrity": "sha512-2pYRzEjVqq2TB/UNv47BV/8vQiXkFGVmPFwJb+1E0IFFZbIX8/jo1olxqqMbo6xCXf8kabANhp5bzCij2tFLUA==", "cpu": [ "x64" ], @@ -4288,9 +4283,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.12.0.tgz", - "integrity": "sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==", + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.14.1.tgz", + "integrity": "sha512-mS6wQ6Do6/wmrF9aTFVpIJ3/IDXhg1EZcQFYHZLHqw6AzMBjTHWnCG35HxSqUNphh0EHqSM6wRTT8HsL1C0x5g==", "cpu": [ "arm" ], @@ -4301,9 +4296,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.12.0.tgz", - "integrity": "sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==", + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.14.1.tgz", + "integrity": "sha512-p9rGKYkHdFMzhckOTFubfxgyIO1vw//7IIjBBRVzyZebWlzRLeNhqxuSaZ7kCEKVkm/kuC9fVRW9HkC/zNRG2w==", "cpu": [ "arm64" ], @@ -4314,9 +4309,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.12.0.tgz", - "integrity": "sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==", + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.14.1.tgz", + "integrity": "sha512-nDY6Yz5xS/Y4M2i9JLQd3Rofh5OR8Bn8qe3Mv/qCVpHFlwtZSBYSPaU4mrGazWkXrdQ98GB//H0BirGR/SKFSw==", "cpu": [ "arm64" ], @@ -4326,10 +4321,23 @@ "linux" ] }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.14.1.tgz", + "integrity": "sha512-im7HE4VBL+aDswvcmfx88Mp1soqL9OBsdDBU8NqDEYtkri0qV0THhQsvZtZeNNlLeCUQ16PZyv7cqutjDF35qw==", + "cpu": [ + "ppc64le" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.12.0.tgz", - "integrity": "sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==", + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.14.1.tgz", + "integrity": "sha512-RWdiHuAxWmzPJgaHJdpvUUlDz8sdQz4P2uv367T2JocdDa98iRw2UjIJ4QxSyt077mXZT2X6pKfT2iYtVEvOFw==", "cpu": [ "riscv64" ], @@ -4339,10 +4347,23 @@ "linux" ] }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.14.1.tgz", + "integrity": "sha512-VMgaGQ5zRX6ZqV/fas65/sUGc9cPmsntq2FiGmayW9KMNfWVG/j0BAqImvU4KTeOOgYSf1F+k6at1UfNONuNjA==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.12.0.tgz", - "integrity": "sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==", + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.14.1.tgz", + "integrity": "sha512-9Q7DGjZN+hTdJomaQ3Iub4m6VPu1r94bmK2z3UeWP3dGUecRC54tmVu9vKHTm1bOt3ASoYtEz6JSRLFzrysKlA==", "cpu": [ "x64" ], @@ -4353,9 +4374,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.12.0.tgz", - "integrity": "sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==", + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.14.1.tgz", + "integrity": "sha512-JNEG/Ti55413SsreTguSx0LOVKX902OfXIKVg+TCXO6Gjans/k9O6ww9q3oLGjNDaTLxM+IHFMeXy/0RXL5R/g==", "cpu": [ "x64" ], @@ -4366,9 +4387,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.12.0.tgz", - "integrity": "sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==", + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.14.1.tgz", + "integrity": "sha512-ryS22I9y0mumlLNwDFYZRDFLwWh3aKaC72CWjFcFvxK0U6v/mOkM5Up1bTbCRAhv3kEIwW2ajROegCIQViUCeA==", "cpu": [ "arm64" ], @@ -4379,9 +4400,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.12.0.tgz", - "integrity": "sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==", + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.14.1.tgz", + "integrity": "sha512-TdloItiGk+T0mTxKx7Hp279xy30LspMso+GzQvV2maYePMAWdmrzqSNZhUpPj3CGw12aGj57I026PgLCTu8CGg==", "cpu": [ "ia32" ], @@ -4392,9 +4413,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.12.0.tgz", - "integrity": "sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==", + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.14.1.tgz", + "integrity": "sha512-wQGI+LY/Py20zdUPq+XCem7JcPOyzIJBm3dli+56DJsQOHbnXZFEwgmnC6el1TPAfC8lBT3m+z69RmLykNUbew==", "cpu": [ "x64" ], @@ -5905,11 +5926,6 @@ "@babel/types": "^7.20.7" } }, - "node_modules/@types/base64-js": { - "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.5", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", @@ -6127,14 +6143,6 @@ "@types/istanbul-lib-report": "*" } }, - "node_modules/@types/jquery": { - "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.3", "resolved": "https://registry.npmjs.org/@types/js-levenshtein/-/js-levenshtein-1.1.3.tgz", @@ -6368,11 +6376,6 @@ "integrity": "sha512-mQkU2jY8jJEF7YHjHvsQO8+3ughTL1mcnn96igfhONmR+fUPSKIkefQYpSe8bsly2Ep7oQbn/6VG5/9/0qcArQ==", "dev": true }, - "node_modules/@types/sizzle": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.8.tgz", - "integrity": "sha512-0vWLNK2D5MT9dg0iOo8GlKguPAU02QjmZitPEsXRuJXU/OGIOt9vT9Fc26wtYuavLxtO45v9PGleoL9Z0k1LHg==" - }, "node_modules/@types/trusted-types": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", @@ -8213,15 +8216,15 @@ } }, "node_modules/@web/test-runner": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/@web/test-runner/-/test-runner-0.18.0.tgz", - "integrity": "sha512-aAlQrdSqwCie1mxuSK5kM0RYDJZL4Q0Hd5LeXn1on3OtHLtgztL4dZzzNSuAWablR2/Vuve3ChwDDxmYSTqXRg==", + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/@web/test-runner/-/test-runner-0.18.1.tgz", + "integrity": "sha512-jB/9vrpGVtcLY6/7sPpKpSheQ3wWY9P5aQcz2SK2gMHTq3gNpa51NAyec0Al7EFpHvJ1wKYTGRLB2gPyEoJeDg==", "dev": true, "dependencies": { "@web/browser-logs": "^0.4.0", "@web/config-loader": "^0.3.0", "@web/dev-server": "^0.4.0", - "@web/test-runner-chrome": "^0.15.0", + "@web/test-runner-chrome": "^0.16.0", "@web/test-runner-commands": "^0.9.0", "@web/test-runner-core": "^0.13.0", "@web/test-runner-mocha": "^0.9.0", @@ -8244,16 +8247,16 @@ } }, "node_modules/@web/test-runner-chrome": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@web/test-runner-chrome/-/test-runner-chrome-0.15.0.tgz", - "integrity": "sha512-ZqkTJGQ57FDz3lWw+9CKfHuTV64S9GzBy5+0siSQulEVPfGiTzpksx9DohtA3BCLXdbEq4OHg40/XIQJomlc9w==", + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@web/test-runner-chrome/-/test-runner-chrome-0.16.0.tgz", + "integrity": "sha512-Edc6Y49aVB6k18S5IOj9OCX3rEf8F3jptIu0p95+imqxmcutFEh1GNmlAk2bQGnXS0U6uVY7Xbf61fiaXUQqhg==", "dev": true, "dependencies": { "@web/test-runner-core": "^0.13.0", "@web/test-runner-coverage-v8": "^0.8.0", "async-mutex": "0.4.0", "chrome-launcher": "^0.15.0", - "puppeteer-core": "^20.0.0" + "puppeteer-core": "^22.0.0" }, "engines": { "node": ">=18.0.0" @@ -8488,9 +8491,9 @@ } }, "node_modules/agent-base": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.0.tgz", - "integrity": "sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", "dev": true, "dependencies": { "debug": "^4.3.4" @@ -8916,7 +8919,8 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "dev": true }, "node_modules/available-typed-arrays": { "version": "1.0.6", @@ -8946,9 +8950,9 @@ "dev": true }, "node_modules/b4a": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz", - "integrity": "sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==", + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz", + "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==", "dev": true }, "node_modules/babel-core": { @@ -9161,6 +9165,42 @@ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, + "node_modules/bare-events": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.2.2.tgz", + "integrity": "sha512-h7z00dWdG0PYOQEvChhOSWvOfkIKsdZGkWr083FgN/HyoQuebSew/cgirYqh9SCuy/hRvxc5Vy6Fw8xAmYHLkQ==", + "dev": true, + "optional": true + }, + "node_modules/bare-fs": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.2.3.tgz", + "integrity": "sha512-amG72llr9pstfXOBOHve1WjiuKKAMnebcmMbPWDZ7BCevAoJLpugjuAPRsDINEyjT0a6tbaVx3DctkXIRbLuJw==", + "dev": true, + "optional": true, + "dependencies": { + "bare-events": "^2.0.0", + "bare-path": "^2.0.0", + "streamx": "^2.13.0" + } + }, + "node_modules/bare-os": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.2.1.tgz", + "integrity": "sha512-OwPyHgBBMkhC29Hl3O4/YfxW9n7mdTr2+SsO29XBWKKJsbgj3mnorDB80r5TiCQgQstgE5ga1qNYrpes6NvX2w==", + "dev": true, + "optional": true + }, + "node_modules/bare-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.1.tgz", + "integrity": "sha512-OHM+iwRDRMDBsSW7kl3dO62JyHdBKO3B25FB9vNQBPcGHMo4+eA8Yj41Lfbk3pS/seDY+siNge0LdRTulAau/A==", + "dev": true, + "optional": true, + "dependencies": { + "bare-os": "^2.1.0" + } + }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -9181,9 +9221,9 @@ ] }, "node_modules/basic-ftp": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.4.tgz", - "integrity": "sha512-8PzkB0arJFV4jJWSGOYR+OEic6aeKMu/osRhBULN6RY0ykby6LKhbmuQ5ublvaas5BOwboah5D87nrHyuh8PPA==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", + "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", "dev": true, "engines": { "node": ">=10.0.0" @@ -9704,12 +9744,14 @@ } }, "node_modules/chromium-bidi": { - "version": "0.4.16", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.16.tgz", - "integrity": "sha512-7ZbXdWERxRxSwo3txsBjjmc/NLxqb1Bk30mRb0BMS4YIaiV6zvKZqL/UAH+DdqcDYayDWk2n/y8klkBDODrPvA==", + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.5.16.tgz", + "integrity": "sha512-IT5lnR44h/qZQ4GaCHvBxYIl4cQL2i9UvFyYeRyVdcpY04hx5H720HQfe/7Oz7ndxaYVLQFGpCO71J4X2Ye/Gw==", "dev": true, "dependencies": { - "mitt": "3.0.0" + "mitt": "3.0.1", + "urlpattern-polyfill": "10.0.0", + "zod": "3.22.4" }, "peerDependencies": { "devtools-protocol": "*" @@ -9914,6 +9956,7 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dev": true, "dependencies": { "delayed-stream": "~1.0.0" }, @@ -10195,15 +10238,6 @@ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true }, - "node_modules/cross-fetch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", - "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", - "dev": true, - "dependencies": { - "node-fetch": "^2.6.12" - } - }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -10234,9 +10268,9 @@ "dev": true }, "node_modules/data-uri-to-buffer": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.1.tgz", - "integrity": "sha512-MZd3VlchQkp8rdend6vrx7MmVDJzSNTBvghvKjirLkD+WTChA3KUf0jkE68Q4UyctNqI11zZO9/x2Yx+ub5Cvg==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", "dev": true, "engines": { "node": ">= 14" @@ -10423,6 +10457,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "dev": true, "engines": { "node": ">=0.4.0" } @@ -10512,9 +10547,9 @@ } }, "node_modules/devtools-protocol": { - "version": "0.0.1147663", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1147663.tgz", - "integrity": "sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ==", + "version": "0.0.1262051", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1262051.tgz", + "integrity": "sha512-YJe4CT5SA8on3Spa+UDtNhEqtuV6Epwz3OZ4HQVLhlRccpZ9/PAYk0/cy/oKxFKRrZPBUPyxympQci4yWNWZ9g==", "dev": true }, "node_modules/diff": { @@ -12236,25 +12271,6 @@ "node": ">=0.4.0" } }, - "node_modules/follow-redirects": { - "version": "1.15.6", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", - "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, "node_modules/for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", @@ -12296,6 +12312,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -12546,52 +12563,20 @@ } }, "node_modules/get-uri": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.2.tgz", - "integrity": "sha512-5KLucCJobh8vBY1K07EFV4+cPZH3mrV9YeAruUseCQKHB58SGjjT2l9/eA9LD082IiuMjSlFJEcdJ27TXvbZNw==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.3.tgz", + "integrity": "sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==", "dev": true, "dependencies": { "basic-ftp": "^5.0.2", - "data-uri-to-buffer": "^6.0.0", + "data-uri-to-buffer": "^6.0.2", "debug": "^4.3.4", - "fs-extra": "^8.1.0" + "fs-extra": "^11.2.0" }, "engines": { "node": ">= 14" } }, - "node_modules/get-uri/node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/get-uri/node_modules/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "dev": true, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/get-uri/node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "dev": true, - "engines": { - "node": ">= 4.0.0" - } - }, "node_modules/giget": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/giget/-/giget-1.2.1.tgz", @@ -12956,9 +12941,9 @@ } }, "node_modules/http-proxy-agent": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz", - "integrity": "sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, "dependencies": { "agent-base": "^7.1.0", @@ -12969,9 +12954,9 @@ } }, "node_modules/https-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz", - "integrity": "sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", + "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", "dev": true, "dependencies": { "agent-base": "^7.0.2", @@ -13206,6 +13191,25 @@ "integrity": "sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==", "dev": true }, + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dev": true, + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/ip-address/node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true + }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -14154,6 +14158,12 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "dev": true + }, "node_modules/jscodeshift": { "version": "0.15.2", "resolved": "https://registry.npmjs.org/jscodeshift/-/jscodeshift-0.15.2.tgz", @@ -15775,6 +15785,7 @@ "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "dev": true, "engines": { "node": ">= 0.6" } @@ -15783,6 +15794,7 @@ "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dev": true, "dependencies": { "mime-db": "1.52.0" }, @@ -15864,9 +15876,9 @@ "dev": true }, "node_modules/mitt": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.0.tgz", - "integrity": "sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", "dev": true }, "node_modules/mkdirp": { @@ -16570,14 +16582,6 @@ "openapi": "bin/index.js" } }, - "node_modules/opener": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", - "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", - "bin": { - "opener": "bin/opener-bin.js" - } - }, "node_modules/optionator": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", @@ -16759,25 +16763,18 @@ } }, "node_modules/pac-resolver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.0.tgz", - "integrity": "sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", "dev": true, "dependencies": { "degenerator": "^5.0.0", - "ip": "^1.1.8", "netmask": "^2.0.2" }, "engines": { "node": ">= 14" } }, - "node_modules/pac-resolver/node_modules/ip": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.9.tgz", - "integrity": "sha512-cyRxvOEpNHNtchU3Ln9KC/auJgup87llfQpQ+t5ghoC/UhL16SWzbueiCsdTnWmqAWl7LadfuwhlqmtOaqMHdQ==", - "dev": true - }, "node_modules/pako": { "version": "0.2.9", "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", @@ -17244,19 +17241,19 @@ } }, "node_modules/proxy-agent": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.3.0.tgz", - "integrity": "sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og==", + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", + "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==", "dev": true, "dependencies": { "agent-base": "^7.0.2", "debug": "^4.3.4", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.0", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.3", "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.0.0", + "pac-proxy-agent": "^7.0.1", "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.1" + "socks-proxy-agent": "^8.0.2" }, "engines": { "node": ">= 14" @@ -17318,49 +17315,19 @@ } }, "node_modules/puppeteer-core": { - "version": "20.9.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-20.9.0.tgz", - "integrity": "sha512-H9fYZQzMTRrkboEfPmf7m3CLDN6JvbxXA3qTtS+dFt27tR+CsFHzPsT6pzp6lYL6bJbAPaR0HaPO6uSi+F94Pg==", + "version": "22.6.3", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-22.6.3.tgz", + "integrity": "sha512-YrTAak5zCTWVTnVaCK1b7FD1qFCCT9bSvQhLzamnIsJ57/tfuXiT8ZvPJR2SBfahyFTYFCcaZAd/Npow3lmDGA==", "dev": true, "dependencies": { - "@puppeteer/browsers": "1.4.6", - "chromium-bidi": "0.4.16", - "cross-fetch": "4.0.0", + "@puppeteer/browsers": "2.2.1", + "chromium-bidi": "0.5.16", "debug": "4.3.4", - "devtools-protocol": "0.0.1147663", - "ws": "8.13.0" + "devtools-protocol": "0.0.1262051", + "ws": "8.16.0" }, "engines": { - "node": ">=16.3.0" - }, - "peerDependencies": { - "typescript": ">= 4.7.4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "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": ">=18" } }, "node_modules/qs": { @@ -18073,9 +18040,9 @@ } }, "node_modules/rollup": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.12.0.tgz", - "integrity": "sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==", + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.14.1.tgz", + "integrity": "sha512-4LnHSdd3QK2pa1J6dFbfm1HN0D7vSK/ZuZTsdyUAlA6Rr1yTouUTL13HaDOGJVgby461AhrNGBS7sCGXXtT+SA==", "dev": true, "dependencies": { "@types/estree": "1.0.5" @@ -18088,19 +18055,21 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.12.0", - "@rollup/rollup-android-arm64": "4.12.0", - "@rollup/rollup-darwin-arm64": "4.12.0", - "@rollup/rollup-darwin-x64": "4.12.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.12.0", - "@rollup/rollup-linux-arm64-gnu": "4.12.0", - "@rollup/rollup-linux-arm64-musl": "4.12.0", - "@rollup/rollup-linux-riscv64-gnu": "4.12.0", - "@rollup/rollup-linux-x64-gnu": "4.12.0", - "@rollup/rollup-linux-x64-musl": "4.12.0", - "@rollup/rollup-win32-arm64-msvc": "4.12.0", - "@rollup/rollup-win32-ia32-msvc": "4.12.0", - "@rollup/rollup-win32-x64-msvc": "4.12.0", + "@rollup/rollup-android-arm-eabi": "4.14.1", + "@rollup/rollup-android-arm64": "4.14.1", + "@rollup/rollup-darwin-arm64": "4.14.1", + "@rollup/rollup-darwin-x64": "4.14.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.14.1", + "@rollup/rollup-linux-arm64-gnu": "4.14.1", + "@rollup/rollup-linux-arm64-musl": "4.14.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.14.1", + "@rollup/rollup-linux-riscv64-gnu": "4.14.1", + "@rollup/rollup-linux-s390x-gnu": "4.14.1", + "@rollup/rollup-linux-x64-gnu": "4.14.1", + "@rollup/rollup-linux-x64-musl": "4.14.1", + "@rollup/rollup-win32-arm64-msvc": "4.14.1", + "@rollup/rollup-win32-ia32-msvc": "4.14.1", + "@rollup/rollup-win32-x64-msvc": "4.14.1", "fsevents": "~2.3.2" } }, @@ -18130,9 +18099,9 @@ "dev": true }, "node_modules/rollup-plugin-import-css": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-import-css/-/rollup-plugin-import-css-3.4.0.tgz", - "integrity": "sha512-997dJi7M7yYFn7tZer/UVt72mh4GH/hHBv48j3V4jsGSg+1DdYUXn+QB9SMMCNKF99pSv6QXmIOLTyeuijIsgg==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/rollup-plugin-import-css/-/rollup-plugin-import-css-3.5.0.tgz", + "integrity": "sha512-JOVow6n00qt2C/NnsqPmIjFOfxIAudwWqC5SaC84CodMGiMFaP1gPAdgnJ8g8hcG+P85TCYp2kI98grYCEt5pg==", "dev": true, "dependencies": { "@rollup/pluginutils": "^5.0.4" @@ -18559,26 +18528,26 @@ } }, "node_modules/socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.1.tgz", + "integrity": "sha512-B6w7tkwNid7ToxjZ08rQMT8M9BJAf8DKx8Ft4NivzH0zBUfd6jldGcisJn/RLgxcX3FPNDdNQCUEMMT79b+oCQ==", "dev": true, "dependencies": { - "ip": "^2.0.0", + "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" }, "engines": { - "node": ">= 10.13.0", + "node": ">= 10.0.0", "npm": ">= 3.0.0" } }, "node_modules/socks-proxy-agent": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz", - "integrity": "sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==", + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.3.tgz", + "integrity": "sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A==", "dev": true, "dependencies": { - "agent-base": "^7.0.2", + "agent-base": "^7.1.1", "debug": "^4.3.4", "socks": "^2.7.1" }, @@ -18719,13 +18688,16 @@ "dev": true }, "node_modules/streamx": { - "version": "2.15.7", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.7.tgz", - "integrity": "sha512-NPEKS5+yjyo597eafGbKW5ujh7Sm6lDLHZQd/lRSz6S0VarpADBJItqfB4PnwpS+472oob1GX5cCY9vzfJpHUA==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.16.1.tgz", + "integrity": "sha512-m9QYj6WygWyWa3H1YY69amr4nVgy61xfjys7xO7kviL5rfIEc2naf+ewFiOA+aEJD7y0JO3h2GoiUv4TDwEGzQ==", "dev": true, "dependencies": { "fast-fifo": "^1.1.0", "queue-tick": "^1.0.1" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" } }, "node_modules/strict-event-emitter": { @@ -19000,14 +18972,17 @@ } }, "node_modules/tar-fs": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz", - "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.5.tgz", + "integrity": "sha512-JOgGAmZyMgbqpLwct7ZV8VzkEB6pxXFBVErLtb+XCOqzc6w1xiWKI9GVd6bwk68EX7eJ4DWmfXVmq8K2ziZTGg==", "dev": true, "dependencies": { - "mkdirp-classic": "^0.5.2", "pump": "^3.0.0", "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^2.1.1", + "bare-path": "^2.1.0" } }, "node_modules/tar-stream": { @@ -20080,6 +20055,12 @@ "punycode": "^2.1.0" } }, + "node_modules/urlpattern-polyfill": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", + "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==", + "dev": true + }, "node_modules/use-callback-ref": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.1.tgz", @@ -21133,6 +21114,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/zod": { + "version": "3.22.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", + "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, "node_modules/zwitch": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", diff --git a/src/Umbraco.Web.UI.Client/package.json b/src/Umbraco.Web.UI.Client/package.json index 929d6ea64c..f6339dca28 100644 --- a/src/Umbraco.Web.UI.Client/package.json +++ b/src/Umbraco.Web.UI.Client/package.json @@ -88,6 +88,7 @@ "./webhook": "./dist-cms/packages/webhook/index.js", "./workspace": "./dist-cms/packages/core/workspace/index.js", "./external/backend-api": "./dist-cms/external/backend-api/index.js", + "./external/base64-js": "./dist-cms/external/base64-js/index.js", "./external/dompurify": "./dist-cms/external/dompurify/index.js", "./external/lit": "./dist-cms/external/lit/index.js", "./external/marked": "./dist-cms/external/marked/index.js", @@ -162,11 +163,11 @@ "npm": ">=10.1 < 11" }, "dependencies": { - "@openid/appauth": "^1.3.1", "@types/dompurify": "^3.0.5", "@types/uuid": "^9.0.8", "@umbraco-ui/uui": "1.7.2", "@umbraco-ui/uui-css": "1.7.2", + "base64-js": "^1.5.1", "dompurify": "^3.0.9", "element-internals-polyfill": "^1.3.10", "lit": "^3.1.2", @@ -197,10 +198,10 @@ "@types/mocha": "^10.0.1", "@typescript-eslint/eslint-plugin": "^6.14.0", "@typescript-eslint/parser": "^7.1.0", - "@web/dev-server-esbuild": "^1.0.1", + "@web/dev-server-esbuild": "^1.0.2", "@web/dev-server-import-maps": "^0.2.0", "@web/dev-server-rollup": "^0.6.1", - "@web/test-runner": "^0.18.0", + "@web/test-runner": "^0.18.1", "@web/test-runner-playwright": "^0.11.0", "babel-loader": "^9.1.3", "eslint": "^8.56.0", @@ -221,12 +222,12 @@ "react": "^18.2.0", "react-dom": "^18.2.0", "remark-gfm": "^3.0.1", - "rollup": "^4.12.0", - "rollup-plugin-esbuild": "^6.1.0", - "rollup-plugin-import-css": "^3.4.0", + "rollup": "^4.14.1", + "rollup-plugin-esbuild": "^6.1.1", + "rollup-plugin-import-css": "^3.5.0", "rollup-plugin-web-worker-loader": "^1.6.1", - "storybook": "^7.6.17", "simple-icons": "^11.11.0", + "storybook": "^7.6.17", "tiny-glob": "^0.2.9", "tsc-alias": "^1.8.8", "typedoc": "^0.25.10", diff --git a/src/Umbraco.Web.UI.Client/src/external/base64-js/index.ts b/src/Umbraco.Web.UI.Client/src/external/base64-js/index.ts new file mode 100644 index 0000000000..d8a192ebba --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/base64-js/index.ts @@ -0,0 +1 @@ +export { fromByteArray } from 'base64-js'; diff --git a/src/Umbraco.Web.UI.Client/src/external/openid/LICENSE b/src/Umbraco.Web.UI.Client/src/external/openid/LICENSE new file mode 100644 index 0000000000..d9a10c0d8e --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/openid/LICENSE @@ -0,0 +1,176 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS diff --git a/src/Umbraco.Web.UI.Client/src/external/openid/authorization_request.ts b/src/Umbraco.Web.UI.Client/src/external/openid/authorization_request.ts new file mode 100644 index 0000000000..668082c472 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/openid/authorization_request.ts @@ -0,0 +1,122 @@ +/* eslint-disable local-rules/umb-class-prefix */ +/* + * Copyright 2017 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { DefaultCrypto } from './crypto_utils.js'; +import type { Crypto } from './crypto_utils.js'; +import { log } from './logger.js'; +import type { StringMap } from './types.js'; + +/** + * Represents an AuthorizationRequest as JSON. + */ +export interface AuthorizationRequestJson { + response_type: string; + client_id: string; + redirect_uri: string; + scope: string; + state?: string; + extras?: StringMap; + internal?: StringMap; +} + +/** + * Generates a cryptographically random new state. Useful for CSRF protection. + */ +const SIZE = 10; // 10 bytes +const newState = function (crypto: Crypto): string { + return crypto.generateRandom(SIZE); +}; + +/** + * Represents the AuthorizationRequest. + * For more information look at + * https://tools.ietf.org/html/rfc6749#section-4.1.1 + */ +export class AuthorizationRequest { + static RESPONSE_TYPE_TOKEN = 'token'; + static RESPONSE_TYPE_CODE = 'code'; + + // NOTE: + // Both redirect_uri and state are actually optional. + // However AppAuth is more opionionated, and requires you to use both. + + clientId: string; + redirectUri: string; + scope: string; + responseType: string; + state: string; + extras?: StringMap; + internal?: StringMap; + /** + * Constructs a new AuthorizationRequest. + * Use a `undefined` value for the `state` parameter, to generate a random + * state for CSRF protection. + */ + constructor( + request: AuthorizationRequestJson, + private crypto: Crypto = new DefaultCrypto(), + private usePkce: boolean = true, + ) { + this.clientId = request.client_id; + this.redirectUri = request.redirect_uri; + this.scope = request.scope; + this.responseType = request.response_type || AuthorizationRequest.RESPONSE_TYPE_CODE; + this.state = request.state || newState(crypto); + this.extras = request.extras; + // read internal properties if available + this.internal = request.internal; + } + + setupCodeVerifier(): Promise { + if (!this.usePkce) { + return Promise.resolve(); + } else { + const codeVerifier = this.crypto.generateRandom(128); + const challenge: Promise = this.crypto.deriveChallenge(codeVerifier).catch((error) => { + log('Unable to generate PKCE challenge. Not using PKCE', error); + return undefined; + }); + return challenge.then((result) => { + if (result) { + // keep track of the code used. + this.internal = this.internal || {}; + this.internal['code_verifier'] = codeVerifier; + this.extras = this.extras || {}; + this.extras['code_challenge'] = result; + // We always use S256. Plain is not good enough. + this.extras['code_challenge_method'] = 'S256'; + } + }); + } + } + + /** + * Serializes the AuthorizationRequest to a JavaScript Object. + */ + toJson(): Promise { + // Always make sure that the code verifier is setup when toJson() is called. + return this.setupCodeVerifier().then(() => { + return { + response_type: this.responseType, + client_id: this.clientId, + redirect_uri: this.redirectUri, + scope: this.scope, + state: this.state, + extras: this.extras, + internal: this.internal, + }; + }); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/external/openid/authorization_request_handler.ts b/src/Umbraco.Web.UI.Client/src/external/openid/authorization_request_handler.ts new file mode 100644 index 0000000000..90eb72b171 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/openid/authorization_request_handler.ts @@ -0,0 +1,161 @@ +/* eslint-disable local-rules/umb-class-prefix */ +/* + * Copyright 2017 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { AuthorizationRequest } from './authorization_request.js'; +import type { AuthorizationError, AuthorizationResponse } from './authorization_response.js'; +import type { AuthorizationServiceConfiguration } from './authorization_service_configuration.js'; +import type { Crypto } from './crypto_utils.js'; +import { log } from './logger.js'; +import type { QueryStringUtils } from './query_string_utils.js'; +import type { StringMap } from './types.js'; + +/** + * This type represents a lambda that can take an AuthorizationRequest, + * and an AuthorizationResponse as arguments. + */ +export type AuthorizationListener = ( + request: AuthorizationRequest, + response: AuthorizationResponse | null, + error: AuthorizationError | null, +) => void; + +/** + * Represents a structural type holding both authorization request and response. + */ +export interface AuthorizationRequestResponse { + request: AuthorizationRequest; + response: AuthorizationResponse | null; + error: AuthorizationError | null; +} + +/** + * Authorization Service notifier. + * This manages the communication of the AuthorizationResponse to the 3p client. + */ +export class AuthorizationNotifier { + private listener: AuthorizationListener | null = null; + + setAuthorizationListener(listener: AuthorizationListener) { + this.listener = listener; + } + + /** + * The authorization complete callback. + */ + onAuthorizationComplete( + request: AuthorizationRequest, + response: AuthorizationResponse | null, + error: AuthorizationError | null, + ): void { + if (this.listener) { + // complete authorization request + this.listener(request, response, error); + } + } +} + +// TODO(rahulrav@): add more built in parameters. +/* built in parameters. */ +export const BUILT_IN_PARAMETERS = ['redirect_uri', 'client_id', 'response_type', 'state', 'scope']; + +/** + * Defines the interface which is capable of handling an authorization request + * using various methods (iframe / popup / different process etc.). + */ +export abstract class AuthorizationRequestHandler { + constructor( + public utils: QueryStringUtils, + protected crypto: Crypto, + ) {} + + // notifier send the response back to the client. + protected notifier: AuthorizationNotifier | null = null; + + /** + * A utility method to be able to build the authorization request URL. + */ + protected buildRequestUrl(configuration: AuthorizationServiceConfiguration, request: AuthorizationRequest) { + // build the query string + // coerce to any type for convenience + const requestMap: StringMap = { + redirect_uri: request.redirectUri, + client_id: request.clientId, + response_type: request.responseType, + state: request.state, + scope: request.scope, + }; + + // copy over extras + if (request.extras) { + for (const extra in request.extras) { + if (Object.prototype.hasOwnProperty.call(request.extras, extra)) { + // check before inserting to requestMap + if (BUILT_IN_PARAMETERS.indexOf(extra) < 0) { + requestMap[extra] = request.extras[extra]; + } + } + } + } + + const query = this.utils.stringify(requestMap); + const baseUrl = configuration.authorizationEndpoint; + const url = `${baseUrl}?${query}`; + return url; + } + + /** + * Completes the authorization request if necessary & when possible. + */ + completeAuthorizationRequestIfPossible(): Promise { + // call complete authorization if possible to see there might + // be a response that needs to be delivered. + log(`Checking to see if there is an authorization response to be delivered.`); + if (!this.notifier) { + log(`Notifier is not present on AuthorizationRequest handler. + No delivery of result will be possible`); + } + return this.completeAuthorizationRequest().then((result) => { + if (!result) { + log(`No result is available yet.`); + } + if (result && this.notifier) { + this.notifier.onAuthorizationComplete(result.request, result.response, result.error); + } + }); + } + + /** + * Sets the default Authorization Service notifier. + */ + setAuthorizationNotifier(notifier: AuthorizationNotifier): AuthorizationRequestHandler { + this.notifier = notifier; + return this; + } + + /** + * Makes an authorization request. + */ + abstract performAuthorizationRequest( + configuration: AuthorizationServiceConfiguration, + request: AuthorizationRequest, + ): void; + + /** + * Checks if an authorization flow can be completed, and completes it. + * The handler returns a `Promise` if ready, or a `Promise` + * if not ready. + */ + protected abstract completeAuthorizationRequest(): Promise; +} diff --git a/src/Umbraco.Web.UI.Client/src/external/openid/authorization_response.ts b/src/Umbraco.Web.UI.Client/src/external/openid/authorization_response.ts new file mode 100644 index 0000000000..ac074fca30 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/openid/authorization_response.ts @@ -0,0 +1,79 @@ +/* eslint-disable local-rules/umb-class-prefix */ +/* + * Copyright 2017 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Represents the AuthorizationResponse as a JSON object. + */ +export interface AuthorizationResponseJson { + code: string; + state: string; +} + +/** + * Represents the AuthorizationError as a JSON object. + */ +export interface AuthorizationErrorJson { + error: string; + error_description?: string; + error_uri?: string; + state?: string; +} + +/** + * Represents the Authorization Response type. + * For more information look at + * https://tools.ietf.org/html/rfc6749#section-4.1.2 + */ +export class AuthorizationResponse { + code: string; + state: string; + + constructor(response: AuthorizationResponseJson) { + this.code = response.code; + this.state = response.state; + } + + toJson(): AuthorizationResponseJson { + return { code: this.code, state: this.state }; + } +} + +/** + * Represents the Authorization error response. + * For more information look at: + * https://tools.ietf.org/html/rfc6749#section-4.1.2.1 + */ +export class AuthorizationError { + error: string; + errorDescription?: string; + errorUri?: string; + state?: string; + + constructor(error: AuthorizationErrorJson) { + this.error = error.error; + this.errorDescription = error.error_description; + this.errorUri = error.error_uri; + this.state = error.state; + } + + toJson(): AuthorizationErrorJson { + return { + error: this.error, + error_description: this.errorDescription, + error_uri: this.errorUri, + state: this.state, + }; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/external/openid/authorization_service_configuration.ts b/src/Umbraco.Web.UI.Client/src/external/openid/authorization_service_configuration.ts new file mode 100644 index 0000000000..b532d7f2a4 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/openid/authorization_service_configuration.ts @@ -0,0 +1,81 @@ +/* eslint-disable local-rules/umb-class-prefix */ +/* + * Copyright 2017 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { Requestor } from './xhr.js'; +import { JQueryRequestor } from './xhr.js'; + +/** + * Represents AuthorizationServiceConfiguration as a JSON object. + */ +export interface AuthorizationServiceConfigurationJson { + authorization_endpoint: string; + token_endpoint: string; + revocation_endpoint: string; + end_session_endpoint?: string; + userinfo_endpoint?: string; +} + +/** + * The standard base path for well-known resources on domains. + * See https://tools.ietf.org/html/rfc5785 for more information. + */ +const WELL_KNOWN_PATH = '.well-known'; + +/** + * The standard resource under the well known path at which an OpenID Connect + * discovery document can be found under an issuer's base URI. + */ +const OPENID_CONFIGURATION = 'openid-configuration'; + +/** + * Configuration details required to interact with an authorization service. + * + * More information at https://openid.net/specs/openid-connect-discovery-1_0-17.html + */ +export class AuthorizationServiceConfiguration { + authorizationEndpoint: string; + tokenEndpoint: string; + revocationEndpoint: string; + userInfoEndpoint?: string; + endSessionEndpoint?: string; + + constructor(request: AuthorizationServiceConfigurationJson) { + this.authorizationEndpoint = request.authorization_endpoint; + this.tokenEndpoint = request.token_endpoint; + this.revocationEndpoint = request.revocation_endpoint; + this.userInfoEndpoint = request.userinfo_endpoint; + this.endSessionEndpoint = request.end_session_endpoint; + } + + toJson() { + return { + authorization_endpoint: this.authorizationEndpoint, + token_endpoint: this.tokenEndpoint, + revocation_endpoint: this.revocationEndpoint, + end_session_endpoint: this.endSessionEndpoint, + userinfo_endpoint: this.userInfoEndpoint, + }; + } + + static fetchFromIssuer(openIdIssuerUrl: string, requestor?: Requestor): Promise { + const fullUrl = `${openIdIssuerUrl}/${WELL_KNOWN_PATH}/${OPENID_CONFIGURATION}`; + + const requestorToUse = requestor || new JQueryRequestor(); + + return requestorToUse + .xhr({ url: fullUrl, dataType: 'json', method: 'GET' }) + .then((json) => new AuthorizationServiceConfiguration(json)); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/external/openid/crypto_utils.ts b/src/Umbraco.Web.UI.Client/src/external/openid/crypto_utils.ts new file mode 100644 index 0000000000..9ee6c84ac1 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/openid/crypto_utils.ts @@ -0,0 +1,98 @@ +/* eslint-disable local-rules/umb-class-prefix */ +/* + * Copyright 2017 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +import * as base64 from '@umbraco-cms/backoffice/external/base64-js'; + +import { AppAuthError } from './errors.js'; + +const HAS_CRYPTO = typeof window !== 'undefined' && !!(window.crypto as any); +const HAS_SUBTLE_CRYPTO = HAS_CRYPTO && !!(window.crypto.subtle as any); +const CHARSET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + +export function bufferToString(buffer: Uint8Array) { + const state = []; + for (let i = 0; i < buffer.byteLength; i += 1) { + const index = buffer[i] % CHARSET.length; + state.push(CHARSET[index]); + } + return state.join(''); +} + +export function urlSafe(buffer: Uint8Array): string { + const encoded = base64.fromByteArray(new Uint8Array(buffer)); + return encoded.replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, ''); +} + +// adapted from source: http://stackoverflow.com/a/11058858 +// this is used in place of TextEncode as the api is not yet +// well supported: https://caniuse.com/#search=TextEncoder +export function textEncodeLite(str: string) { + const buf = new ArrayBuffer(str.length); + const bufView = new Uint8Array(buf); + + for (let i = 0; i < str.length; i++) { + bufView[i] = str.charCodeAt(i); + } + return bufView; +} + +export interface Crypto { + /** + * Generate a random string + */ + generateRandom(size: number): string; + /** + * Compute the SHA256 of a given code. + * This is useful when using PKCE. + */ + deriveChallenge(code: string): Promise; +} + +/** + * The default implementation of the `Crypto` interface. + * This uses the capabilities of the browser. + */ +export class DefaultCrypto implements Crypto { + generateRandom(size: number) { + const buffer = new Uint8Array(size); + if (HAS_CRYPTO) { + window.crypto.getRandomValues(buffer); + } else { + // fall back to Math.random() if nothing else is available + for (let i = 0; i < size; i += 1) { + buffer[i] = (Math.random() * CHARSET.length) | 0; + } + } + return bufferToString(buffer); + } + + deriveChallenge(code: string): Promise { + if (code.length < 43 || code.length > 128) { + return Promise.reject(new AppAuthError('Invalid code length.')); + } + if (!HAS_SUBTLE_CRYPTO) { + return Promise.reject(new AppAuthError('window.crypto.subtle is unavailable.')); + } + + return new Promise((resolve, reject) => { + crypto.subtle.digest('SHA-256', textEncodeLite(code)).then( + (buffer) => { + return resolve(urlSafe(new Uint8Array(buffer))); + }, + (error) => reject(error), + ); + }); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/external/openid/errors.ts b/src/Umbraco.Web.UI.Client/src/external/openid/errors.ts new file mode 100644 index 0000000000..a37305b800 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/openid/errors.ts @@ -0,0 +1,24 @@ +/* eslint-disable local-rules/umb-class-prefix */ +/* + * Copyright 2017 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Represents the AppAuthError type. + */ +export class AppAuthError { + constructor( + public message: string, + public extras?: any, + ) {} +} diff --git a/src/Umbraco.Web.UI.Client/src/external/openid/flags.ts b/src/Umbraco.Web.UI.Client/src/external/openid/flags.ts new file mode 100644 index 0000000000..8a278c6c06 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/openid/flags.ts @@ -0,0 +1,21 @@ +/* + * Copyright 2017 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* Global flags that control the behavior of App Auth JS. */ + +/* Logging turned on ? */ +export const IS_LOG = true; + +/* Profiling turned on ? */ +export const IS_PROFILE = false; diff --git a/src/Umbraco.Web.UI.Client/src/external/openid/index.ts b/src/Umbraco.Web.UI.Client/src/external/openid/index.ts index 5d92bc1f8c..108f5e5134 100644 --- a/src/Umbraco.Web.UI.Client/src/external/openid/index.ts +++ b/src/Umbraco.Web.UI.Client/src/external/openid/index.ts @@ -1,17 +1,17 @@ -export { - AuthorizationNotifier, - AuthorizationRequest, - AuthorizationServiceConfiguration, - BaseTokenRequestHandler, - FetchRequestor, - BasicQueryStringUtils, - LocalStorageBackend, - RedirectRequestHandler, - TokenRequest, - TokenResponse, - RevokeTokenRequest, - GRANT_TYPE_AUTHORIZATION_CODE, - GRANT_TYPE_REFRESH_TOKEN, -} from '@openid/appauth'; - -export type { LocationLike, StringMap } from '@openid/appauth'; +export * from './authorization_request.js'; +export * from './authorization_request_handler.js'; +export * from './authorization_response.js'; +export * from './authorization_service_configuration.js'; +export * from './crypto_utils.js'; +export * from './errors.js'; +export * from './flags.js'; +export * from './logger.js'; +export * from './query_string_utils.js'; +export * from './redirect_based_handler.js'; +export * from './revoke_token_request.js'; +export * from './storage.js'; +export * from './token_request.js'; +export * from './token_request_handler.js'; +export * from './token_response.js'; +export type * from './types.js'; +export * from './xhr.js'; diff --git a/src/Umbraco.Web.UI.Client/src/external/openid/logger.ts b/src/Umbraco.Web.UI.Client/src/external/openid/logger.ts new file mode 100644 index 0000000000..9f31c83d79 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/openid/logger.ts @@ -0,0 +1,71 @@ +/* + * Copyright 2017 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { IS_LOG, IS_PROFILE } from './flags.js'; + +export function log(message: string, ...args: any[]) { + if (IS_LOG) { + const length = args ? args.length : 0; + if (length > 0) { + console.log(message, ...args); + } else { + console.log(message); + } + } +} + +// check to see if native support for profiling is available. +const NATIVE_PROFILE_SUPPORT = typeof window !== 'undefined' && !!window.performance && !!console.profile; + +/** + * A decorator that can profile a function. + */ +export function profile(target: any, propertyKey: string, descriptor: PropertyDescriptor) { + if (IS_PROFILE) { + return performProfile(target, propertyKey, descriptor); + } else { + // return as-is + return descriptor; + } +} + +function performProfile(target: any, propertyKey: string, descriptor: PropertyDescriptor): PropertyDescriptor { + const originalCallable = descriptor.value; + // name must exist + let name = originalCallable.name; + if (!name) { + name = 'anonymous function'; + } + if (NATIVE_PROFILE_SUPPORT) { + descriptor.value = function (args: any[]) { + console.profile(name); + const startTime = window.performance.now(); + const result = originalCallable.call(this || window, ...args); + const duration = window.performance.now() - startTime; + console.log(`${name} took ${duration} ms`); + console.profileEnd(); + return result; + }; + } else { + descriptor.value = function (args: any[]) { + log(`Profile start ${name}`); + const start = Date.now(); + const result = originalCallable.call(this || window, ...args); + const duration = Date.now() - start; + log(`Profile end ${name} took ${duration} ms.`); + return result; + }; + } + return descriptor; +} diff --git a/src/Umbraco.Web.UI.Client/src/external/openid/query_string_utils.ts b/src/Umbraco.Web.UI.Client/src/external/openid/query_string_utils.ts new file mode 100644 index 0000000000..eb88ce5c13 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/openid/query_string_utils.ts @@ -0,0 +1,64 @@ +/* eslint-disable local-rules/umb-class-prefix */ +/* + * Copyright 2017 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { LocationLike, StringMap } from './types.js'; + +/** + * Query String Utilities. + */ +export interface QueryStringUtils { + stringify(input: StringMap): string; + parse(query: LocationLike, useHash?: boolean): StringMap; + parseQueryString(query: string): StringMap; +} + +export class BasicQueryStringUtils implements QueryStringUtils { + parse(input: LocationLike, useHash?: boolean) { + if (useHash) { + return this.parseQueryString(input.hash); + } else { + return this.parseQueryString(input.search); + } + } + + parseQueryString(query: string): StringMap { + const result: StringMap = {}; + // if anything starts with ?, # or & remove it + query = query.trim().replace(/^(\?|#|&)/, ''); + const params = query.split('&'); + for (let i = 0; i < params.length; i += 1) { + const param = params[i]; // looks something like a=b + const parts = param.split('='); + if (parts.length >= 2) { + const key = decodeURIComponent(parts.shift()!); + const value = parts.length > 0 ? parts.join('=') : null; + if (value) { + result[key] = decodeURIComponent(value); + } + } + } + return result; + } + + stringify(input: StringMap) { + const encoded: string[] = []; + for (const key in input) { + if (Object.prototype.hasOwnProperty.call(input, key) && input[key]) { + encoded.push(`${encodeURIComponent(key)}=${encodeURIComponent(input[key])}`); + } + } + return encoded.join('&'); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/external/openid/redirect_based_handler.ts b/src/Umbraco.Web.UI.Client/src/external/openid/redirect_based_handler.ts new file mode 100644 index 0000000000..7a5f7eafc9 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/openid/redirect_based_handler.ts @@ -0,0 +1,147 @@ +/* + * Copyright 2017 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +import {AuthorizationRequest} from './authorization_request'; +import {AuthorizationRequestHandler, AuthorizationRequestResponse} from './authorization_request_handler'; +import {AuthorizationError, AuthorizationResponse} from './authorization_response' +import {AuthorizationServiceConfiguration} from './authorization_service_configuration'; +import {Crypto, DefaultCrypto} from './crypto_utils'; +import {log} from './logger'; +import {BasicQueryStringUtils} from './query_string_utils'; +import {LocalStorageBackend, StorageBackend} from './storage'; +import {LocationLike} from './types'; + + +/** key for authorization request. */ +const authorizationRequestKey = + (handle: string) => { + return `${handle}_appauth_authorization_request`; + } + +/** key for authorization service configuration */ +const authorizationServiceConfigurationKey = + (handle: string) => { + return `${handle}_appauth_authorization_service_configuration`; + } + +/** key in local storage which represents the current authorization request. */ +const AUTHORIZATION_REQUEST_HANDLE_KEY = 'appauth_current_authorization_request'; + +/** + * Represents an AuthorizationRequestHandler which uses a standard + * redirect based code flow. + */ +export class RedirectRequestHandler extends AuthorizationRequestHandler { + constructor( + // use the provided storage backend + // or initialize local storage with the default storage backend which + // uses window.localStorage + public storageBackend: StorageBackend = new LocalStorageBackend(), + utils = new BasicQueryStringUtils(), + public locationLike: LocationLike = window.location, + crypto: Crypto = new DefaultCrypto()) { + super(utils, crypto); + } + + performAuthorizationRequest( + configuration: AuthorizationServiceConfiguration, + request: AuthorizationRequest) { + const handle = this.crypto.generateRandom(10); + + // before you make request, persist all request related data in local storage. + const persisted = Promise.all([ + this.storageBackend.setItem(AUTHORIZATION_REQUEST_HANDLE_KEY, handle), + // Calling toJson() adds in the code & challenge when possible + request.toJson().then( + result => + this.storageBackend.setItem(authorizationRequestKey(handle), JSON.stringify(result))), + this.storageBackend.setItem( + authorizationServiceConfigurationKey(handle), JSON.stringify(configuration.toJson())), + ]); + + persisted.then(() => { + // make the redirect request + let url = this.buildRequestUrl(configuration, request); + log('Making a request to ', request, url); + this.locationLike.assign(url); + }); + } + + /** + * Attempts to introspect the contents of storage backend and completes the + * request. + */ + protected completeAuthorizationRequest(): Promise { + // TODO(rahulrav@): handle authorization errors. + return this.storageBackend.getItem(AUTHORIZATION_REQUEST_HANDLE_KEY).then(handle => { + if (handle) { + // we have a pending request. + // fetch authorization request, and check state + return this.storageBackend + .getItem(authorizationRequestKey(handle)) + // requires a corresponding instance of result + // TODO(rahulrav@): check for inconsitent state here + .then(result => JSON.parse(result!)) + .then(json => new AuthorizationRequest(json)) + .then(request => { + // check redirect_uri and state + let currentUri = `${this.locationLike.origin}${this.locationLike.pathname}`; + let queryParams = this.utils.parse(this.locationLike, true /* use hash */); + let state: string|undefined = queryParams['state']; + let code: string|undefined = queryParams['code']; + let error: string|undefined = queryParams['error']; + log('Potential authorization request ', currentUri, queryParams, state, code, error); + let shouldNotify = state === request.state; + let authorizationResponse: AuthorizationResponse|null = null; + let authorizationError: AuthorizationError|null = null; + if (shouldNotify) { + if (error) { + // get additional optional info. + let errorUri = queryParams['error_uri']; + let errorDescription = queryParams['error_description']; + authorizationError = new AuthorizationError({ + error: error, + error_description: errorDescription, + error_uri: errorUri, + state: state + }); + } else { + authorizationResponse = new AuthorizationResponse({code: code, state: state}); + } + // cleanup state + return Promise + .all([ + this.storageBackend.removeItem(AUTHORIZATION_REQUEST_HANDLE_KEY), + this.storageBackend.removeItem(authorizationRequestKey(handle)), + this.storageBackend.removeItem(authorizationServiceConfigurationKey(handle)) + ]) + .then(() => { + log('Delivering authorization response'); + return { + request: request, + response: authorizationResponse, + error: authorizationError + } as AuthorizationRequestResponse; + }); + } else { + log('Mismatched request (state and request_uri) dont match.'); + return Promise.resolve(null); + } + }); + } else { + return null; + } + }); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/external/openid/revoke_token_request.ts b/src/Umbraco.Web.UI.Client/src/external/openid/revoke_token_request.ts new file mode 100644 index 0000000000..97e21f1bec --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/openid/revoke_token_request.ts @@ -0,0 +1,73 @@ +/* eslint-disable local-rules/umb-class-prefix */ +import type { StringMap } from './types.js'; + +/* + * Copyright 2017 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Supported token types + */ +export type TokenTypeHint = 'refresh_token' | 'access_token'; + +/** + * Represents the Token Request as JSON. + */ +export interface RevokeTokenRequestJson { + token: string; + token_type_hint?: TokenTypeHint; + client_id?: string; + client_secret?: string; +} + +/** + * Represents a revoke token request. + * For more information look at: + * https://tools.ietf.org/html/rfc7009#section-2.1 + */ +export class RevokeTokenRequest { + token: string; + tokenTypeHint: TokenTypeHint | undefined; + clientId: string | undefined; + clientSecret: string | undefined; + + constructor(request: RevokeTokenRequestJson) { + this.token = request.token; + this.tokenTypeHint = request.token_type_hint; + this.clientId = request.client_id; + this.clientSecret = request.client_secret; + } + + /** + * Serializes a TokenRequest to a JavaScript object. + */ + toJson(): RevokeTokenRequestJson { + const json: RevokeTokenRequestJson = { token: this.token }; + if (this.tokenTypeHint) { + json['token_type_hint'] = this.tokenTypeHint; + } + if (this.clientId) { + json['client_id'] = this.clientId; + } + if (this.clientSecret) { + json['client_secret'] = this.clientSecret; + } + return json; + } + + toStringMap(): StringMap { + const json = this.toJson(); + // :( + return json as any; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/external/openid/storage.ts b/src/Umbraco.Web.UI.Client/src/external/openid/storage.ts new file mode 100644 index 0000000000..a33c5dfcad --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/openid/storage.ts @@ -0,0 +1,101 @@ +/* eslint-disable local-rules/umb-class-prefix */ +/* + * Copyright 2017 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * A subset of the `Storage` interface which we need for the backends to work. + * + * Essentially removes the indexable properties and readonly properties from + * `Storage` in lib.dom.d.ts. This is so that a custom type can extend it for + * testing. + */ +export interface UnderlyingStorage { + readonly length: number; + clear(): void; + getItem(key: string): string | null; + removeItem(key: string): void; + setItem(key: string, data: string): void; +} + +/** + * Asynchronous storage APIs. All methods return a `Promise`. + * All methods take the `DOMString` + * IDL type (as it is the lowest common denominator). + */ +export abstract class StorageBackend { + /** + * When passed a key `name`, will return that key's value. + */ + public abstract getItem(name: string): Promise; + + /** + * When passed a key `name`, will remove that key from the storage. + */ + public abstract removeItem(name: string): Promise; + + /** + * When invoked, will empty all keys out of the storage. + */ + public abstract clear(): Promise; + + /** + * The setItem() method of the `StorageBackend` interface, + * when passed a key name and value, will add that key to the storage, + * or update that key's value if it already exists. + */ + public abstract setItem(name: string, value: string): Promise; +} + +/** + * A `StorageBackend` backed by `localstorage`. + */ +export class LocalStorageBackend extends StorageBackend { + private storage: UnderlyingStorage; + constructor(storage?: UnderlyingStorage) { + super(); + this.storage = storage || window.localStorage; + } + + public getItem(name: string): Promise { + return new Promise((resolve, reject) => { + const value = this.storage.getItem(name); + if (value) { + resolve(value); + } else { + resolve(null); + } + }); + } + + public removeItem(name: string): Promise { + return new Promise((resolve, reject) => { + this.storage.removeItem(name); + resolve(); + }); + } + + public clear(): Promise { + return new Promise((resolve, reject) => { + this.storage.clear(); + resolve(); + }); + } + + public setItem(name: string, value: string): Promise { + return new Promise((resolve, reject) => { + this.storage.setItem(name, value); + resolve(); + }); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/external/openid/token_request.ts b/src/Umbraco.Web.UI.Client/src/external/openid/token_request.ts new file mode 100644 index 0000000000..9ee6a209ce --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/openid/token_request.ts @@ -0,0 +1,96 @@ +/* eslint-disable local-rules/umb-class-prefix */ +/* eslint-disable local-rules/exported-string-constant-naming */ +/* + * Copyright 2017 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { StringMap } from './types.js'; + +export const GRANT_TYPE_AUTHORIZATION_CODE = 'authorization_code'; +export const GRANT_TYPE_REFRESH_TOKEN = 'refresh_token'; + +/** + * Represents the Token Request as JSON. + */ +export interface TokenRequestJson { + grant_type: string; + code?: string; + refresh_token?: string; + redirect_uri: string; + client_id: string; + extras?: StringMap; +} + +/** + * Represents an Access Token request. + * For more information look at: + * https://tools.ietf.org/html/rfc6749#section-4.1.3 + */ +export class TokenRequest { + clientId: string; + redirectUri: string; + grantType: string; + code: string | undefined; + refreshToken: string | undefined; + extras: StringMap | undefined; + + constructor(request: TokenRequestJson) { + this.clientId = request.client_id; + this.redirectUri = request.redirect_uri; + this.grantType = request.grant_type; + this.code = request.code; + this.refreshToken = request.refresh_token; + this.extras = request.extras; + } + + /** + * Serializes a TokenRequest to a JavaScript object. + */ + toJson(): TokenRequestJson { + return { + grant_type: this.grantType, + code: this.code, + refresh_token: this.refreshToken, + redirect_uri: this.redirectUri, + client_id: this.clientId, + extras: this.extras, + }; + } + + toStringMap(): StringMap { + const map: StringMap = { + grant_type: this.grantType, + client_id: this.clientId, + redirect_uri: this.redirectUri, + }; + + if (this.code) { + map['code'] = this.code; + } + + if (this.refreshToken) { + map['refresh_token'] = this.refreshToken; + } + + // copy over extras + if (this.extras) { + for (const extra in this.extras) { + if (Object.prototype.hasOwnProperty.call(this.extras, extra) && !map.hasOwnProperty(extra)) { + // check before inserting to requestMap + map[extra] = this.extras[extra]; + } + } + } + return map; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/external/openid/token_request_handler.ts b/src/Umbraco.Web.UI.Client/src/external/openid/token_request_handler.ts new file mode 100644 index 0000000000..99ae687a39 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/openid/token_request_handler.ts @@ -0,0 +1,88 @@ +/* eslint-disable local-rules/umb-class-prefix */ +/* + * Copyright 2017 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { AuthorizationServiceConfiguration } from './authorization_service_configuration.js'; +import { AppAuthError } from './errors.js'; +import { BasicQueryStringUtils } from './query_string_utils.js'; +import type { QueryStringUtils } from './query_string_utils.js'; +import type { RevokeTokenRequest } from './revoke_token_request.js'; +import type { TokenRequest } from './token_request.js'; +import { TokenError, TokenResponse } from './token_response.js'; +import type { TokenErrorJson, TokenResponseJson } from './token_response.js'; +import { JQueryRequestor } from './xhr.js'; +import type { Requestor } from './xhr.js'; + +/** + * Represents an interface which can make a token request. + */ +export interface TokenRequestHandler { + /** + * Performs the token request, given the service configuration. + */ + performTokenRequest(configuration: AuthorizationServiceConfiguration, request: TokenRequest): Promise; + + performRevokeTokenRequest( + configuration: AuthorizationServiceConfiguration, + request: RevokeTokenRequest, + ): Promise; +} + +/** + * The default token request handler. + */ +export class BaseTokenRequestHandler implements TokenRequestHandler { + constructor( + public readonly requestor: Requestor = new JQueryRequestor(), + public readonly utils: QueryStringUtils = new BasicQueryStringUtils(), + ) {} + + private isTokenResponse(response: TokenResponseJson | TokenErrorJson): response is TokenResponseJson { + return (response as TokenErrorJson).error === undefined; + } + + performRevokeTokenRequest( + configuration: AuthorizationServiceConfiguration, + request: RevokeTokenRequest, + ): Promise { + const revokeTokenResponse = this.requestor.xhr({ + url: configuration.revocationEndpoint, + method: 'POST', + headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, + data: this.utils.stringify(request.toStringMap()), + }); + + return revokeTokenResponse.then((response) => { + return true; + }); + } + + performTokenRequest(configuration: AuthorizationServiceConfiguration, request: TokenRequest): Promise { + const tokenResponse = this.requestor.xhr({ + url: configuration.tokenEndpoint, + method: 'POST', + dataType: 'json', // adding implicit dataType + headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, + data: this.utils.stringify(request.toStringMap()), + }); + + return tokenResponse.then((response) => { + if (this.isTokenResponse(response)) { + return new TokenResponse(response); + } else { + return Promise.reject(new AppAuthError(response.error, new TokenError(response))); + } + }); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/external/openid/token_response.ts b/src/Umbraco.Web.UI.Client/src/external/openid/token_response.ts new file mode 100644 index 0000000000..3afbf101d7 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/openid/token_response.ts @@ -0,0 +1,137 @@ +/* eslint-disable local-rules/umb-class-prefix */ +/* + * Copyright 2017 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * Represents the access token types. + * For more information see: + * https://tools.ietf.org/html/rfc6749#section-7.1 + */ +export type TokenType = 'bearer' | 'mac'; + +/** + * Represents the TokenResponse as a JSON Object. + */ +export interface TokenResponseJson { + access_token: string; + token_type?: TokenType /* treating token type as optional, as its going to be inferred. */; + expires_in?: string /* lifetime in seconds. */; + refresh_token?: string; + scope?: string; + id_token?: string /* https://openid.net/specs/openid-connect-core-1_0.html#TokenResponse */; + issued_at?: number /* when was it issued ? */; +} + +/** + * Represents the possible error codes from the token endpoint. + * For more information look at: + * https://tools.ietf.org/html/rfc6749#section-5.2 + */ +export type ErrorType = + | 'invalid_request' + | 'invalid_client' + | 'invalid_grant' + | 'unauthorized_client' + | 'unsupported_grant_type' + | 'invalid_scope'; + +/** + * Represents the TokenError as a JSON Object. + */ +export interface TokenErrorJson { + error: ErrorType; + error_description?: string; + error_uri?: string; +} + +// constants +const AUTH_EXPIRY_BUFFER = 10 * 60 * -1; // 10 mins in seconds + +/** + * Returns the instant of time in seconds. + */ +export const nowInSeconds = () => Math.round(new Date().getTime() / 1000); + +/** + * Represents the Token Response type. + * For more information look at: + * https://tools.ietf.org/html/rfc6749#section-5.1 + */ +export class TokenResponse { + accessToken: string; + tokenType: TokenType; + expiresIn: number | undefined; + refreshToken: string | undefined; + scope: string | undefined; + idToken: string | undefined; + issuedAt: number; + + constructor(response: TokenResponseJson) { + this.accessToken = response.access_token; + this.tokenType = response.token_type || 'bearer'; + if (response.expires_in) { + this.expiresIn = parseInt(response.expires_in, 10); + } + this.refreshToken = response.refresh_token; + this.scope = response.scope; + this.idToken = response.id_token; + this.issuedAt = response.issued_at || nowInSeconds(); + } + + toJson(): TokenResponseJson { + return { + access_token: this.accessToken, + id_token: this.idToken, + refresh_token: this.refreshToken, + scope: this.scope, + token_type: this.tokenType, + issued_at: this.issuedAt, + expires_in: this.expiresIn?.toString(), + }; + } + + isValid(buffer: number = AUTH_EXPIRY_BUFFER): boolean { + if (this.expiresIn) { + const now = nowInSeconds(); + return now < this.issuedAt + this.expiresIn + buffer; + } else { + return true; + } + } +} + +/** + * Represents the Token Error type. + * For more information look at: + * https://tools.ietf.org/html/rfc6749#section-5.2 + */ +export class TokenError { + error: ErrorType; + errorDescription: string | undefined; + errorUri: string | undefined; + + constructor(tokenError: TokenErrorJson) { + this.error = tokenError.error; + this.errorDescription = tokenError.error_description; + this.errorUri = tokenError.error_uri; + } + + toJson(): TokenErrorJson { + return { + error: this.error, + error_description: this.errorDescription, + error_uri: this.errorUri, + }; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/external/openid/types.ts b/src/Umbraco.Web.UI.Client/src/external/openid/types.ts new file mode 100644 index 0000000000..3af235a085 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/openid/types.ts @@ -0,0 +1,32 @@ +/* + * Copyright 2017 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +export interface StringMap { + [key: string]: string; +} + +/** + * Represents a window.location like object. + */ +export interface LocationLike { + hash: string; + host: string; + origin: string; + hostname: string; + pathname: string; + port: string; + protocol: string; + search: string; + assign(url: string): void; +} diff --git a/src/Umbraco.Web.UI.Client/src/external/openid/xhr.ts b/src/Umbraco.Web.UI.Client/src/external/openid/xhr.ts new file mode 100644 index 0000000000..96bd2c82c8 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/openid/xhr.ts @@ -0,0 +1,115 @@ +/* eslint-disable local-rules/umb-class-prefix */ +/* + * Copyright 2017 Google Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except + * in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either + * express or implied. See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { AppAuthError } from './errors.js'; + +/** + * An class that abstracts away the ability to make an XMLHttpRequest. + */ +export abstract class Requestor { + abstract xhr(settings: JQueryAjaxSettings): Promise; +} + +/** + * Uses $.ajax to makes the Ajax requests. + */ +export class JQueryRequestor extends Requestor { + xhr(settings: JQueryAjaxSettings): Promise { + // NOTE: using jquery to make XHR's as whatwg-fetch requires + // that I target ES6. + const xhr = $.ajax(settings); + return new Promise((resolve, reject) => { + xhr.then( + (data, textStatus, jqXhr) => { + resolve(data as T); + }, + (jqXhr, textStatus, error) => { + reject(new AppAuthError(error)); + }, + ); + }); + } +} + +/** + * Uses fetch API to make Ajax requests + */ +export class FetchRequestor extends Requestor { + xhr(settings: JQueryAjaxSettings): Promise { + if (!settings.url) { + return Promise.reject(new AppAuthError('A URL must be provided.')); + } + const url: URL = new URL(settings.url); + const requestInit: RequestInit = {}; + requestInit.method = settings.method; + requestInit.mode = 'cors'; + + if (settings.data) { + if (settings.method && settings.method.toUpperCase() === 'POST') { + requestInit.body = settings.data; + } else { + const searchParams = new URLSearchParams(settings.data); + searchParams.forEach((value, key) => { + url.searchParams.append(key, value); + }); + } + } + + // Set the request headers + requestInit.headers = {}; + if (settings.headers) { + for (const i in settings.headers) { + if (Object.prototype.hasOwnProperty.call(settings.headers, i)) { + requestInit.headers[i] = settings.headers[i]; + } + } + } + + const isJsonDataType = settings.dataType && settings.dataType.toLowerCase() === 'json'; + + // Set 'Accept' header value for json requests (Taken from + // https://github.com/jquery/jquery/blob/e0d941156900a6bff7c098c8ea7290528e468cf8/src/ajax.js#L644 + // ) + if (isJsonDataType) { + requestInit.headers['Accept'] = 'application/json, text/javascript, */*; q=0.01'; + } + + return fetch(url.toString(), requestInit).then((response) => { + if (response.status >= 200 && response.status < 300) { + const contentType = response.headers.get('content-type'); + if (isJsonDataType || (contentType && contentType.indexOf('application/json') !== -1)) { + return response.json(); + } else { + return response.text(); + } + } else { + return Promise.reject(new AppAuthError(response.status.toString(), response.statusText)); + } + }); + } +} + +/** + * Should be used only in the context of testing. Just uses the underlying + * Promise to mock the behavior of the Requestor. + */ +export class TestRequestor extends Requestor { + constructor(public promise: Promise) { + super(); + } + xhr(settings: JQueryAjaxSettings): Promise { + return this.promise; // unsafe cast + } +} diff --git a/src/Umbraco.Web.UI.Client/tsconfig.json b/src/Umbraco.Web.UI.Client/tsconfig.json index 33bf53145e..a3a4e7e517 100644 --- a/src/Umbraco.Web.UI.Client/tsconfig.json +++ b/src/Umbraco.Web.UI.Client/tsconfig.json @@ -106,6 +106,7 @@ "@umbraco-cms/backoffice/webhook": ["./src/packages/webhook/index.ts"], "@umbraco-cms/backoffice/workspace": ["./src/packages/core/workspace/index.ts"], "@umbraco-cms/backoffice/external/backend-api": ["./src/external/backend-api/index.ts"], + "@umbraco-cms/backoffice/external/base64-js": ["./src/external/base64-js/index.ts"], "@umbraco-cms/backoffice/external/dompurify": ["./src/external/dompurify/index.ts"], "@umbraco-cms/backoffice/external/lit": ["./src/external/lit/index.ts"], "@umbraco-cms/backoffice/external/marked": ["./src/external/marked/index.ts"], From 052632c4648f10680fb683c544b59db3c967536e Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Tue, 9 Apr 2024 17:16:52 +0200 Subject: [PATCH 224/280] revamp web/test-runner config so that commonjs() is being run before esbuild but only on the modules that are actually only exported as CJS --- src/Umbraco.Web.UI.Client/web-test-runner.config.mjs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 832c831714..23006d64e2 100644 --- a/src/Umbraco.Web.UI.Client/web-test-runner.config.mjs +++ b/src/Umbraco.Web.UI.Client/web-test-runner.config.mjs @@ -22,7 +22,6 @@ export default { reporters: ['lcovonly', 'text-summary'], }, plugins: [ - esbuildPlugin({ ts: true, tsconfig: './tsconfig.json', target: 'auto', json: true }), importMapsPlugin({ inject: { importMap: createImportMap({ @@ -35,8 +34,9 @@ export default { }, }), commonjs({ - include: [/node_modules/], + include: ['node_modules/base64-js/**/*', 'node_modules/tinymce/**/*'] }), + esbuildPlugin({ ts: true, tsconfig: './tsconfig.json', target: 'auto', json: true }), ], testRunnerHtml: (testFramework, devMode) => ` From fd81faee01b46ca85fa66027c31b2a10f8f4e9e5 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Tue, 9 Apr 2024 17:25:47 +0200 Subject: [PATCH 225/280] correct eslint errors --- .../external/openid/redirect_based_handler.ts | 229 +++++++++--------- .../src/external/openid/token_request.ts | 5 +- 2 files changed, 118 insertions(+), 116 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/external/openid/redirect_based_handler.ts b/src/Umbraco.Web.UI.Client/src/external/openid/redirect_based_handler.ts index 7a5f7eafc9..8344c28cf2 100644 --- a/src/Umbraco.Web.UI.Client/src/external/openid/redirect_based_handler.ts +++ b/src/Umbraco.Web.UI.Client/src/external/openid/redirect_based_handler.ts @@ -1,3 +1,4 @@ +/* eslint-disable local-rules/umb-class-prefix */ /* * Copyright 2017 Google Inc. * @@ -12,28 +13,28 @@ * limitations under the License. */ -import {AuthorizationRequest} from './authorization_request'; -import {AuthorizationRequestHandler, AuthorizationRequestResponse} from './authorization_request_handler'; -import {AuthorizationError, AuthorizationResponse} from './authorization_response' -import {AuthorizationServiceConfiguration} from './authorization_service_configuration'; -import {Crypto, DefaultCrypto} from './crypto_utils'; -import {log} from './logger'; -import {BasicQueryStringUtils} from './query_string_utils'; -import {LocalStorageBackend, StorageBackend} from './storage'; -import {LocationLike} from './types'; - +import { AuthorizationRequest } from './authorization_request.js'; +import type { AuthorizationRequestResponse } from './authorization_request_handler.js'; +import { AuthorizationRequestHandler } from './authorization_request_handler.js'; +import { AuthorizationError, AuthorizationResponse } from './authorization_response.js'; +import type { AuthorizationServiceConfiguration } from './authorization_service_configuration.js'; +import type { Crypto } from './crypto_utils.js'; +import { DefaultCrypto } from './crypto_utils.js'; +import { log } from './logger.js'; +import { BasicQueryStringUtils } from './query_string_utils.js'; +import type { StorageBackend } from './storage.js'; +import { LocalStorageBackend } from './storage.js'; +import type { LocationLike } from './types.js'; /** key for authorization request. */ -const authorizationRequestKey = - (handle: string) => { - return `${handle}_appauth_authorization_request`; - } +const authorizationRequestKey = (handle: string) => { + return `${handle}_appauth_authorization_request`; +}; /** key for authorization service configuration */ -const authorizationServiceConfigurationKey = - (handle: string) => { - return `${handle}_appauth_authorization_service_configuration`; - } +const authorizationServiceConfigurationKey = (handle: string) => { + return `${handle}_appauth_authorization_service_configuration`; +}; /** key in local storage which represents the current authorization request. */ const AUTHORIZATION_REQUEST_HANDLE_KEY = 'appauth_current_authorization_request'; @@ -43,105 +44,103 @@ const AUTHORIZATION_REQUEST_HANDLE_KEY = 'appauth_current_authorization_request' * redirect based code flow. */ export class RedirectRequestHandler extends AuthorizationRequestHandler { - constructor( - // use the provided storage backend - // or initialize local storage with the default storage backend which - // uses window.localStorage - public storageBackend: StorageBackend = new LocalStorageBackend(), - utils = new BasicQueryStringUtils(), - public locationLike: LocationLike = window.location, - crypto: Crypto = new DefaultCrypto()) { - super(utils, crypto); - } + constructor( + // use the provided storage backend + // or initialize local storage with the default storage backend which + // uses window.localStorage + public storageBackend: StorageBackend = new LocalStorageBackend(), + utils = new BasicQueryStringUtils(), + public locationLike: LocationLike = window.location, + crypto: Crypto = new DefaultCrypto(), + ) { + super(utils, crypto); + } - performAuthorizationRequest( - configuration: AuthorizationServiceConfiguration, - request: AuthorizationRequest) { - const handle = this.crypto.generateRandom(10); + performAuthorizationRequest(configuration: AuthorizationServiceConfiguration, request: AuthorizationRequest) { + const handle = this.crypto.generateRandom(10); - // before you make request, persist all request related data in local storage. - const persisted = Promise.all([ - this.storageBackend.setItem(AUTHORIZATION_REQUEST_HANDLE_KEY, handle), - // Calling toJson() adds in the code & challenge when possible - request.toJson().then( - result => - this.storageBackend.setItem(authorizationRequestKey(handle), JSON.stringify(result))), - this.storageBackend.setItem( - authorizationServiceConfigurationKey(handle), JSON.stringify(configuration.toJson())), - ]); + // before you make request, persist all request related data in local storage. + const persisted = Promise.all([ + this.storageBackend.setItem(AUTHORIZATION_REQUEST_HANDLE_KEY, handle), + // Calling toJson() adds in the code & challenge when possible + request + .toJson() + .then((result) => this.storageBackend.setItem(authorizationRequestKey(handle), JSON.stringify(result))), + this.storageBackend.setItem(authorizationServiceConfigurationKey(handle), JSON.stringify(configuration.toJson())), + ]); - persisted.then(() => { - // make the redirect request - let url = this.buildRequestUrl(configuration, request); - log('Making a request to ', request, url); - this.locationLike.assign(url); - }); - } + persisted.then(() => { + // make the redirect request + const url = this.buildRequestUrl(configuration, request); + log('Making a request to ', request, url); + this.locationLike.assign(url); + }); + } - /** - * Attempts to introspect the contents of storage backend and completes the - * request. - */ - protected completeAuthorizationRequest(): Promise { - // TODO(rahulrav@): handle authorization errors. - return this.storageBackend.getItem(AUTHORIZATION_REQUEST_HANDLE_KEY).then(handle => { - if (handle) { - // we have a pending request. - // fetch authorization request, and check state - return this.storageBackend - .getItem(authorizationRequestKey(handle)) - // requires a corresponding instance of result - // TODO(rahulrav@): check for inconsitent state here - .then(result => JSON.parse(result!)) - .then(json => new AuthorizationRequest(json)) - .then(request => { - // check redirect_uri and state - let currentUri = `${this.locationLike.origin}${this.locationLike.pathname}`; - let queryParams = this.utils.parse(this.locationLike, true /* use hash */); - let state: string|undefined = queryParams['state']; - let code: string|undefined = queryParams['code']; - let error: string|undefined = queryParams['error']; - log('Potential authorization request ', currentUri, queryParams, state, code, error); - let shouldNotify = state === request.state; - let authorizationResponse: AuthorizationResponse|null = null; - let authorizationError: AuthorizationError|null = null; - if (shouldNotify) { - if (error) { - // get additional optional info. - let errorUri = queryParams['error_uri']; - let errorDescription = queryParams['error_description']; - authorizationError = new AuthorizationError({ - error: error, - error_description: errorDescription, - error_uri: errorUri, - state: state - }); - } else { - authorizationResponse = new AuthorizationResponse({code: code, state: state}); - } - // cleanup state - return Promise - .all([ - this.storageBackend.removeItem(AUTHORIZATION_REQUEST_HANDLE_KEY), - this.storageBackend.removeItem(authorizationRequestKey(handle)), - this.storageBackend.removeItem(authorizationServiceConfigurationKey(handle)) - ]) - .then(() => { - log('Delivering authorization response'); - return { - request: request, - response: authorizationResponse, - error: authorizationError - } as AuthorizationRequestResponse; - }); - } else { - log('Mismatched request (state and request_uri) dont match.'); - return Promise.resolve(null); - } - }); - } else { - return null; - } - }); - } + /** + * Attempts to introspect the contents of storage backend and completes the + * request. + */ + protected completeAuthorizationRequest(): Promise { + // TODO(rahulrav@): handle authorization errors. + return this.storageBackend.getItem(AUTHORIZATION_REQUEST_HANDLE_KEY).then((handle) => { + if (handle) { + // we have a pending request. + // fetch authorization request, and check state + return ( + this.storageBackend + .getItem(authorizationRequestKey(handle)) + // requires a corresponding instance of result + // TODO(rahulrav@): check for inconsitent state here + .then((result) => JSON.parse(result!)) + .then((json) => new AuthorizationRequest(json)) + .then((request) => { + // check redirect_uri and state + const currentUri = `${this.locationLike.origin}${this.locationLike.pathname}`; + const queryParams = this.utils.parse(this.locationLike, true /* use hash */); + const state: string | undefined = queryParams['state']; + const code: string | undefined = queryParams['code']; + const error: string | undefined = queryParams['error']; + log('Potential authorization request ', currentUri, queryParams, state, code, error); + const shouldNotify = state === request.state; + let authorizationResponse: AuthorizationResponse | null = null; + let authorizationError: AuthorizationError | null = null; + if (shouldNotify) { + if (error) { + // get additional optional info. + const errorUri = queryParams['error_uri']; + const errorDescription = queryParams['error_description']; + authorizationError = new AuthorizationError({ + error: error, + error_description: errorDescription, + error_uri: errorUri, + state: state, + }); + } else { + authorizationResponse = new AuthorizationResponse({ code: code, state: state }); + } + // cleanup state + return Promise.all([ + this.storageBackend.removeItem(AUTHORIZATION_REQUEST_HANDLE_KEY), + this.storageBackend.removeItem(authorizationRequestKey(handle)), + this.storageBackend.removeItem(authorizationServiceConfigurationKey(handle)), + ]).then(() => { + log('Delivering authorization response'); + return { + request: request, + response: authorizationResponse, + error: authorizationError, + } as AuthorizationRequestResponse; + }); + } else { + log('Mismatched request (state and request_uri) dont match.'); + return Promise.resolve(null); + } + }) + ); + } else { + return null; + } + }); + } } diff --git a/src/Umbraco.Web.UI.Client/src/external/openid/token_request.ts b/src/Umbraco.Web.UI.Client/src/external/openid/token_request.ts index 9ee6a209ce..9cf5978d63 100644 --- a/src/Umbraco.Web.UI.Client/src/external/openid/token_request.ts +++ b/src/Umbraco.Web.UI.Client/src/external/openid/token_request.ts @@ -85,7 +85,10 @@ export class TokenRequest { // copy over extras if (this.extras) { for (const extra in this.extras) { - if (Object.prototype.hasOwnProperty.call(this.extras, extra) && !map.hasOwnProperty(extra)) { + if ( + Object.prototype.hasOwnProperty.call(this.extras, extra) && + !Object.prototype.hasOwnProperty.call(map, extra) + ) { // check before inserting to requestMap map[extra] = this.extras[extra]; } From cd3c657f8b839354ad0601702c9b166898153141 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Tue, 9 Apr 2024 17:36:56 +0200 Subject: [PATCH 226/280] fix build errors and remove traces of jquer --- .../authorization_service_configuration.ts | 4 +- .../external/openid/token_request_handler.ts | 5 +- .../src/external/openid/types.ts | 26 ++++++---- .../src/external/openid/xhr.ts | 47 ++----------------- 4 files changed, 25 insertions(+), 57 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/external/openid/authorization_service_configuration.ts b/src/Umbraco.Web.UI.Client/src/external/openid/authorization_service_configuration.ts index b532d7f2a4..3fd30c663f 100644 --- a/src/Umbraco.Web.UI.Client/src/external/openid/authorization_service_configuration.ts +++ b/src/Umbraco.Web.UI.Client/src/external/openid/authorization_service_configuration.ts @@ -14,7 +14,7 @@ */ import type { Requestor } from './xhr.js'; -import { JQueryRequestor } from './xhr.js'; +import { FetchRequestor } from './xhr.js'; /** * Represents AuthorizationServiceConfiguration as a JSON object. @@ -72,7 +72,7 @@ export class AuthorizationServiceConfiguration { static fetchFromIssuer(openIdIssuerUrl: string, requestor?: Requestor): Promise { const fullUrl = `${openIdIssuerUrl}/${WELL_KNOWN_PATH}/${OPENID_CONFIGURATION}`; - const requestorToUse = requestor || new JQueryRequestor(); + const requestorToUse = requestor || new FetchRequestor(); return requestorToUse .xhr({ url: fullUrl, dataType: 'json', method: 'GET' }) diff --git a/src/Umbraco.Web.UI.Client/src/external/openid/token_request_handler.ts b/src/Umbraco.Web.UI.Client/src/external/openid/token_request_handler.ts index 99ae687a39..b4bc6f12e4 100644 --- a/src/Umbraco.Web.UI.Client/src/external/openid/token_request_handler.ts +++ b/src/Umbraco.Web.UI.Client/src/external/openid/token_request_handler.ts @@ -21,8 +21,7 @@ import type { RevokeTokenRequest } from './revoke_token_request.js'; import type { TokenRequest } from './token_request.js'; import { TokenError, TokenResponse } from './token_response.js'; import type { TokenErrorJson, TokenResponseJson } from './token_response.js'; -import { JQueryRequestor } from './xhr.js'; -import type { Requestor } from './xhr.js'; +import { FetchRequestor, type Requestor } from './xhr.js'; /** * Represents an interface which can make a token request. @@ -44,7 +43,7 @@ export interface TokenRequestHandler { */ export class BaseTokenRequestHandler implements TokenRequestHandler { constructor( - public readonly requestor: Requestor = new JQueryRequestor(), + public readonly requestor: Requestor = new FetchRequestor(), public readonly utils: QueryStringUtils = new BasicQueryStringUtils(), ) {} diff --git a/src/Umbraco.Web.UI.Client/src/external/openid/types.ts b/src/Umbraco.Web.UI.Client/src/external/openid/types.ts index 3af235a085..b6fb853dad 100644 --- a/src/Umbraco.Web.UI.Client/src/external/openid/types.ts +++ b/src/Umbraco.Web.UI.Client/src/external/openid/types.ts @@ -13,20 +13,26 @@ */ export interface StringMap { - [key: string]: string; + [key: string]: string; } /** * Represents a window.location like object. */ export interface LocationLike { - hash: string; - host: string; - origin: string; - hostname: string; - pathname: string; - port: string; - protocol: string; - search: string; - assign(url: string): void; + hash: string; + host: string; + origin: string; + hostname: string; + pathname: string; + port: string; + protocol: string; + search: string; + assign(url: string): void; +} + +export interface XhrRequestInit extends RequestInit { + url: string; + dataType?: string; + data?: any; } diff --git a/src/Umbraco.Web.UI.Client/src/external/openid/xhr.ts b/src/Umbraco.Web.UI.Client/src/external/openid/xhr.ts index 96bd2c82c8..fc32dbf8cb 100644 --- a/src/Umbraco.Web.UI.Client/src/external/openid/xhr.ts +++ b/src/Umbraco.Web.UI.Client/src/external/openid/xhr.ts @@ -14,40 +14,20 @@ */ import { AppAuthError } from './errors.js'; +import type { XhrRequestInit } from './types.js'; /** * An class that abstracts away the ability to make an XMLHttpRequest. */ export abstract class Requestor { - abstract xhr(settings: JQueryAjaxSettings): Promise; -} - -/** - * Uses $.ajax to makes the Ajax requests. - */ -export class JQueryRequestor extends Requestor { - xhr(settings: JQueryAjaxSettings): Promise { - // NOTE: using jquery to make XHR's as whatwg-fetch requires - // that I target ES6. - const xhr = $.ajax(settings); - return new Promise((resolve, reject) => { - xhr.then( - (data, textStatus, jqXhr) => { - resolve(data as T); - }, - (jqXhr, textStatus, error) => { - reject(new AppAuthError(error)); - }, - ); - }); - } + abstract xhr(settings: unknown): Promise; } /** * Uses fetch API to make Ajax requests */ export class FetchRequestor extends Requestor { - xhr(settings: JQueryAjaxSettings): Promise { + xhr(settings: XhrRequestInit): Promise { if (!settings.url) { return Promise.reject(new AppAuthError('A URL must be provided.')); } @@ -70,11 +50,7 @@ export class FetchRequestor extends Requestor { // Set the request headers requestInit.headers = {}; if (settings.headers) { - for (const i in settings.headers) { - if (Object.prototype.hasOwnProperty.call(settings.headers, i)) { - requestInit.headers[i] = settings.headers[i]; - } - } + requestInit.headers = settings.headers; } const isJsonDataType = settings.dataType && settings.dataType.toLowerCase() === 'json'; @@ -83,7 +59,7 @@ export class FetchRequestor extends Requestor { // https://github.com/jquery/jquery/blob/e0d941156900a6bff7c098c8ea7290528e468cf8/src/ajax.js#L644 // ) if (isJsonDataType) { - requestInit.headers['Accept'] = 'application/json, text/javascript, */*; q=0.01'; + (requestInit.headers as any).Accept = 'application/json, text/javascript, */*; q=0.01'; } return fetch(url.toString(), requestInit).then((response) => { @@ -100,16 +76,3 @@ export class FetchRequestor extends Requestor { }); } } - -/** - * Should be used only in the context of testing. Just uses the underlying - * Promise to mock the behavior of the Requestor. - */ -export class TestRequestor extends Requestor { - constructor(public promise: Promise) { - super(); - } - xhr(settings: JQueryAjaxSettings): Promise { - return this.promise; // unsafe cast - } -} From 88ebf5a26f4ca0b649c1f8b61dc8ab930a16aa22 Mon Sep 17 00:00:00 2001 From: leekelleher Date: Tue, 9 Apr 2024 16:47:39 +0100 Subject: [PATCH 227/280] Changed workspace to be a "routable" kind Removed "document-blueprint-workspace.element.ts" as the routes are defined in the Workspace Context. Removed the `#getDataPromise` field for the moment. (Whilst we work out any data loading issues) --- .../document-blueprints/manifests.ts | 1 - ...ument-blueprint-workspace.context-token.ts | 6 +- .../document-blueprint-workspace.context.ts | 76 ++++++++++--------- .../document-blueprint-workspace.element.ts | 66 ---------------- .../workspace/manifests.ts | 3 +- 5 files changed, 45 insertions(+), 107 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.element.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/manifests.ts index 7cfe9c73e2..cd0755cc73 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/manifests.ts @@ -1,6 +1,5 @@ import { manifests as entityActionManifests } from './entity-actions/manifests.js'; import { manifests as menuItemManifests } from './menu-item/manifests.js'; - import { manifests as repositoryManifests } from './repository/manifests.js'; import { manifests as treeManifests } from './tree/manifests.js'; import { manifests as workspaceManifests } from './workspace/manifests.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.context-token.ts index 0bf889c505..ae5d2144e2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.context-token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.context-token.ts @@ -1,13 +1,13 @@ import { UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE } from '../entity.js'; import type { UmbDocumentBlueprintWorkspaceContext } from './document-blueprint-workspace.context.js'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -import type { UmbSaveableWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; +import type { UmbSubmittableWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; export const UMB_DOCUMENT_BLUEPRINT_WORKSPACE_CONTEXT = new UmbContextToken< - UmbSaveableWorkspaceContextInterface, + UmbSubmittableWorkspaceContext, UmbDocumentBlueprintWorkspaceContext >( - 'UmbWorkspaceBlueprintContext', + 'UmbWorkspaceContext', undefined, (context): context is UmbDocumentBlueprintWorkspaceContext => context.getEntityType?.() === UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.context.ts index 061e1aa23f..82f08e8640 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.context.ts @@ -1,4 +1,3 @@ -import { UmbDocumentPropertyDataContext } from '../../documents/property-dataset-context/document-property-dataset-context.js'; import { UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE } from '../entity.js'; import { UmbDocumentBlueprintDetailRepository } from '../repository/index.js'; import type { @@ -6,31 +5,39 @@ import type { UmbDocumentBlueprintVariantModel, UmbDocumentBlueprintVariantOptionModel, } from '../types.js'; -import { UmbContentTypeStructureManager } from '@umbraco-cms/backoffice/content-type'; -import { - UmbSubmittableWorkspaceContextBase, - UmbWorkspaceIsNewRedirectController, - UmbWorkspaceRouteManager, - UmbWorkspaceSplitViewManager, -} from '@umbraco-cms/backoffice/workspace'; +import { UmbDocumentPropertyDataContext } from '../../documents/property-dataset-context/document-property-dataset-context.js'; import { appendToFrozenArray, mergeObservables, UmbArrayState, UmbObjectState, } from '@umbraco-cms/backoffice/observable-api'; -import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import { UmbLanguageCollectionRepository, type UmbLanguageDetailModel } from '@umbraco-cms/backoffice/language'; -import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; +import { + UmbSubmittableWorkspaceContextBase, + UmbWorkspaceIsNewRedirectController, + UmbWorkspaceRouteManager, + UmbWorkspaceSplitViewManager, +} from '@umbraco-cms/backoffice/workspace'; +import { UmbContentTypeStructureManager } from '@umbraco-cms/backoffice/content-type'; +import { UmbDocumentTypeDetailRepository } from '@umbraco-cms/backoffice/document-type'; +import { UmbLanguageCollectionRepository } from '@umbraco-cms/backoffice/language'; import { UmbRequestReloadTreeItemChildrenEvent } from '@umbraco-cms/backoffice/tree'; import { UmbRequestReloadStructureForEntityEvent } from '@umbraco-cms/backoffice/entity-action'; -import { UmbDocumentTypeDetailRepository } from '@umbraco-cms/backoffice/document-type'; +import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; import { UMB_INVARIANT_CULTURE, UmbVariantId } from '@umbraco-cms/backoffice/variant'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import type { UmbLanguageDetailModel } from '@umbraco-cms/backoffice/language'; +import type { UmbRoutableWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; +import { UmbDocumentWorkspaceContext } from '@umbraco-cms/backoffice/document'; type EntityType = UmbDocumentBlueprintDetailModel; -export class UmbDocumentBlueprintWorkspaceContext extends UmbSubmittableWorkspaceContextBase { + +export class UmbDocumentBlueprintWorkspaceContext + extends UmbSubmittableWorkspaceContextBase + implements UmbRoutableWorkspaceContext +{ // - public readonly repository = new UmbDocumentBlueprintDetailRepository(this); + readonly repository = new UmbDocumentBlueprintDetailRepository(this); #parent = new UmbObjectState<{ entityType: string; unique: string | null } | undefined>(undefined); readonly parentUnique = this.#parent.asObservablePart((parent) => (parent ? parent.unique : undefined)); @@ -38,24 +45,20 @@ export class UmbDocumentBlueprintWorkspaceContext extends UmbSubmittableWorkspac /** */ #persistedData = new UmbObjectState(undefined); + #currentData = new UmbObjectState(undefined); - #getDataPromise?: Promise; + // TODo: Optimize this so it uses either a App Language Context? [NL] #languageRepository = new UmbLanguageCollectionRepository(this); #languages = new UmbArrayState([], (x) => x.unique); public readonly languages = this.#languages.asObservable(); - public isLoaded() { - return this.#getDataPromise; - } - readonly unique = this.#currentData.asObservablePart((data) => data?.unique); readonly contentTypeUnique = this.#currentData.asObservablePart((data) => data?.documentType.unique); - readonly contentTypeHasCollection = this.#currentData.asObservablePart((data) => !!data?.documentType.collection); readonly variants = this.#currentData.asObservablePart((data) => data?.variants || []); - readonly urls = this.#currentData.asObservablePart((data) => data?.urls || []); + //readonly urls = this.#currentData.asObservablePart((data) => data?.urls || []); readonly structure = new UmbContentTypeStructureManager(this, new UmbDocumentTypeDetailRepository(this)); readonly variesByCulture = this.structure.ownerContentTypePart((x) => x?.variesByCulture); @@ -102,7 +105,7 @@ export class UmbDocumentBlueprintWorkspaceContext extends UmbSubmittableWorkspac ); constructor(host: UmbControllerHost) { - super(host, 'Umb.Workspace.Media'); + super(host, 'Umb.Workspace.DocumentBlueprint'); this.observe(this.contentTypeUnique, (unique) => this.structure.loadType(unique)); this.observe(this.varies, (varies) => (this.#varies = varies)); @@ -130,6 +133,7 @@ export class UmbDocumentBlueprintWorkspaceContext extends UmbSubmittableWorkspac path: 'edit/:unique', component: () => import('./document-blueprint-workspace-editor.element.js'), setup: (_component, info) => { + this.removeUmbControllerByAlias('isNewRedirectController'); const unique = info.match.params.unique; this.load(unique); }, @@ -151,9 +155,8 @@ export class UmbDocumentBlueprintWorkspaceContext extends UmbSubmittableWorkspac async load(unique: string) { this.resetState(); - this.#getDataPromise = this.repository.requestByUnique(unique); - type GetDataType = Awaited>; - const { data, asObservable } = (await this.#getDataPromise) as GetDataType; + + const { data, asObservable } = await this.repository.requestByUnique(unique); if (data) { this.setIsNew(false); @@ -161,23 +164,26 @@ export class UmbDocumentBlueprintWorkspaceContext extends UmbSubmittableWorkspac this.#currentData.update(data); } - this.observe(asObservable(), (entity) => this.#onStoreChange(entity), 'UmbDocumentBlueprintStoreObserver'); + if (asObservable) { + this.observe(asObservable(), (entity) => this.#onStoreChange(entity), 'UmbDocumentBlueprintStoreObserver'); + } } #onStoreChange(entity: EntityType | undefined) { if (!entity) { //TODO: This solution is alright for now. But reconsider when we introduce signal-r - history.pushState(null, '', 'section/media'); + history.pushState(null, '', 'section/document-blueprint'); } } async create(parent: { entityType: string; unique: string | null }, documentTypeUnique: string) { this.resetState(); this.#parent.setValue(parent); - this.#getDataPromise = this.repository.createScaffold({ + + const { data } = await this.repository.createScaffold({ documentType: { unique: documentTypeUnique, collection: null }, }); - const { data } = await this.#getDataPromise; + if (!data) return undefined; this.setIsNew(true); @@ -186,10 +192,6 @@ export class UmbDocumentBlueprintWorkspaceContext extends UmbSubmittableWorkspac return data; } - getCollectionAlias() { - return 'Umb.Collection.Media'; - } - getData() { return this.#currentData.getValue(); } @@ -422,10 +424,12 @@ export class UmbDocumentBlueprintWorkspaceContext extends UmbSubmittableWorkspac } */ - /* + public createPropertyDatasetContext(host: UmbControllerHost, variantId: UmbVariantId) { - return new UmbDocumentPropertyDataContext(host, this, variantId); - }*/ + // TODO: [LK] Temporary workaround/hack to get the workspace to load. + const docCxt = new UmbDocumentWorkspaceContext(host); + return new UmbDocumentPropertyDataContext(host, docCxt, variantId); + } public destroy(): void { this.#persistedData.destroy(); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.element.ts deleted file mode 100644 index a31cf9b80b..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.element.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { UmbDocumentBlueprintWorkspaceContext } from './document-blueprint-workspace.context.js'; -import { UmbDocumentBlueprintWorkspaceEditorElement } from './document-blueprint-workspace-editor.element.js'; -import { UmbDocumentBlueprintRootWorkspaceElement } from './document-blueprint-root-workspace.element.js'; -import { html, customElement, css, state } from '@umbraco-cms/backoffice/external/lit'; -import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import { type UmbApi, createExtensionApi, UmbExtensionsApiInitializer } from '@umbraco-cms/backoffice/extension-api'; -import { umbExtensionsRegistry, type ManifestWorkspace } from '@umbraco-cms/backoffice/extension-registry'; - -import type { UmbRoute } from '@umbraco-cms/backoffice/router'; -import { UmbWorkspaceIsNewRedirectController } from '@umbraco-cms/backoffice/workspace'; - -@customElement('umb-document-blueprint-workspace') -export class UmbDocumentBlueprintWorkspaceElement extends UmbLitElement { - #workspaceContext = new UmbDocumentBlueprintWorkspaceContext(this); - #editorElement = () => new UmbDocumentBlueprintWorkspaceEditorElement(); - #rootElement = () => new UmbDocumentBlueprintRootWorkspaceElement(); - - @state() - _routes: UmbRoute[] = [ - { - path: 'create/parent/:entityType/:parentUnique/:documentTypeUnique', - component: this.#editorElement, - setup: (_component, info) => { - const parentEntityType = info.match.params.entityType; - const parentUnique = info.match.params.parentUnique === 'null' ? null : info.match.params.parentUnique; - const documentTypeUnique = info.match.params.documentTypeUnique; - this.#workspaceContext.create({ entityType: parentEntityType, unique: parentUnique }, documentTypeUnique); - - new UmbWorkspaceIsNewRedirectController( - this, - this.#workspaceContext, - this.shadowRoot!.querySelector('umb-router-slot')!, - ); - }, - }, - { - path: 'edit/:unique', - component: this.#editorElement, - setup: (_component, info) => { - this.removeUmbControllerByAlias('isNewRedirectController'); - const unique = info.match.params.unique; - this.#workspaceContext.load(unique); - }, - }, - ]; - - render() { - return html``; - } - - static styles = [ - css` - #wrapper { - margin: var(--uui-size-layout-1); - } - `, - ]; -} - -export default UmbDocumentBlueprintWorkspaceElement; - -declare global { - interface HTMLElementTagNameMap { - 'umb-document-blueprint-workspace': UmbDocumentBlueprintWorkspaceElement; - } -} diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/manifests.ts index d77dd06dc4..9427a1084f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/manifests.ts @@ -6,9 +6,10 @@ export const UMB_DOCUMENT_BLUEPRINT_WORKSPACE_ALIAS = 'Umb.Workspace.DocumentBlu const workspace: ManifestWorkspace = { type: 'workspace', + kind: 'routable', alias: UMB_DOCUMENT_BLUEPRINT_WORKSPACE_ALIAS, name: 'Document Blueprint Workspace', - js: () => import('./document-blueprint-workspace.element.js'), + api: () => import('./document-blueprint-workspace.context.js'), meta: { entityType: UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE, }, From 1f97bb5fbbe589432160400997462e856484eb20 Mon Sep 17 00:00:00 2001 From: leekelleher Date: Tue, 9 Apr 2024 16:48:27 +0100 Subject: [PATCH 228/280] Wired up the Document Blueprint root route --- .../document-blueprint-tree.server.data-source.ts | 11 ++++++++++- .../documents/document-blueprints/tree/types.ts | 2 ++ .../document-blueprint-root-workspace.element.ts | 2 +- .../workspace/document-blueprint-workspace.context.ts | 4 ++++ 4 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/document-blueprint-tree.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/document-blueprint-tree.server.data-source.ts index da3f6f406e..f2b8fdb50c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/document-blueprint-tree.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/document-blueprint-tree.server.data-source.ts @@ -1,6 +1,10 @@ import { UMB_DOCUMENT_BLUEPRINT_ENTITY_TYPE } from '../entity.js'; import type { UmbDocumentBlueprintTreeItemModel } from './types.js'; -import type { UmbTreeChildrenOfRequestArgs, UmbTreeRootItemsRequestArgs } from '@umbraco-cms/backoffice/tree'; +import type { + UmbTreeAncestorsOfRequestArgs, + UmbTreeChildrenOfRequestArgs, + UmbTreeRootItemsRequestArgs, +} from '@umbraco-cms/backoffice/tree'; import { UmbTreeServerDataSourceBase } from '@umbraco-cms/backoffice/tree'; import type { DocumentBlueprintTreeItemResponseModel, @@ -28,6 +32,7 @@ export class UmbDocumentBlueprintTreeServerDataSource extends UmbTreeServerDataS super(host, { getRootItems, getChildrenOf, + getAncestorsOf, mapper, }); } @@ -51,6 +56,10 @@ const getChildrenOf = (args: UmbTreeChildrenOfRequestArgs) => { } }; +const getAncestorsOf = (args: UmbTreeAncestorsOfRequestArgs) => { + throw new Error('Not implemented'); +}; + const mapper = (item: DocumentBlueprintTreeItemResponseModel): UmbDocumentBlueprintTreeItemModel => { //TODO remove temp hack when api endpoints are fixed const hack = item as Partial; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/types.ts index c5ede67df1..fbe951351d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/tree/types.ts @@ -1,6 +1,8 @@ import type { UmbDocumentBlueprintEntityType, UmbDocumentBlueprintFolderEntityType } from '../entity.js'; import type { UmbUniqueTreeItemModel, UmbUniqueTreeRootModel } from '@umbraco-cms/backoffice/tree'; +export interface UmbDocumentBlueprintTreeRootModel extends UmbUniqueTreeRootModel {} + export interface UmbDocumentBlueprintTreeItemModel extends UmbUniqueTreeItemModel { entityType: UmbDocumentBlueprintEntityType | UmbDocumentBlueprintFolderEntityType; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-root-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-root-workspace.element.ts index cd8819af72..a2595863dd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-root-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-root-workspace.element.ts @@ -54,7 +54,7 @@ export class UmbDocumentBlueprintRootWorkspaceElement extends UmbLitElement { ]; } -export { UmbDocumentBlueprintRootWorkspaceElement as element }; +export default UmbDocumentBlueprintRootWorkspaceElement; declare global { interface HTMLElementTagNameMap { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.context.ts index 82f08e8640..49024a6b9a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/workspace/document-blueprint-workspace.context.ts @@ -129,6 +129,10 @@ export class UmbDocumentBlueprintWorkspaceContext ); }, }, + { + path: 'edit/null', + component: () => import('./document-blueprint-root-workspace.element.js'), + }, { path: 'edit/:unique', component: () => import('./document-blueprint-workspace-editor.element.js'), From a0a76306edbad1798ac0864e36074409b6ec61e8 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 9 Apr 2024 19:49:26 +0200 Subject: [PATCH 229/280] add save and preview button --- .../src/packages/documents/documents/workspace/manifests.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/manifests.ts index 65eb92d8b6..0301e6e345 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/manifests.ts @@ -15,6 +15,7 @@ import type { ManifestWorkspaceActionMenuItem, ManifestWorkspaceView, } from '@umbraco-cms/backoffice/extension-registry'; +import { UmbDocumentSaveAndPreviewWorkspaceAction } from './actions/save-and-preview.action.js'; export const UMB_DOCUMENT_WORKSPACE_ALIAS = 'Umb.Workspace.Document'; @@ -131,9 +132,9 @@ const workspaceActions: Array = [ }, ], }, - /* { type: 'workspaceAction', + kind: 'default', alias: 'Umb.WorkspaceAction.Document.SaveAndPreview', name: 'Save And Preview Document Workspace Action', weight: 90, @@ -148,7 +149,6 @@ const workspaceActions: Array = [ }, ], }, - */ ]; const workspaceActionMenuItems: Array = [ From b6fb7363eb9e08d2ec800a1dbcef32548850a9f6 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 9 Apr 2024 19:49:35 +0200 Subject: [PATCH 230/280] export as api --- .../reload-tree-item-children.action.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/reload-tree-item-children/reload-tree-item-children.action.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/reload-tree-item-children/reload-tree-item-children.action.ts index 16b21e69e3..d28f261947 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/reload-tree-item-children/reload-tree-item-children.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/reload-tree-item-children/reload-tree-item-children.action.ts @@ -21,4 +21,5 @@ export class UmbReloadTreeItemChildrenEntityAction extends UmbEntityActionBase Date: Tue, 9 Apr 2024 19:50:00 +0200 Subject: [PATCH 231/280] disable save and publish button when not allowed --- .../actions/save-and-preview.action.ts | 30 ++++++++++++++----- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/save-and-preview.action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/save-and-preview.action.ts index 67fea0b564..b6c2596618 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/save-and-preview.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/save-and-preview.action.ts @@ -1,13 +1,29 @@ -import { UMB_DOCUMENT_WORKSPACE_CONTEXT } from '../document-workspace.context-token.js'; +import { UmbDocumentUserPermissionCondition } from '../../user-permissions/document-user-permission.condition.js'; +import { UMB_USER_PERMISSION_DOCUMENT_UPDATE } from '../../user-permissions/index.js'; import { UmbWorkspaceActionBase } from '@umbraco-cms/backoffice/workspace'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; export class UmbDocumentSaveAndPreviewWorkspaceAction extends UmbWorkspaceActionBase { + constructor(host: UmbControllerHost, args: any) { + super(host, args); + + /* The action is disabled by default because the onChange callback + will first be triggered when the condition is changed to permitted */ + this.disable(); + + const condition = new UmbDocumentUserPermissionCondition(host, { + host, + config: { + alias: 'Umb.Condition.UserPermission.Document', + allOf: [UMB_USER_PERMISSION_DOCUMENT_UPDATE], + }, + onChange: () => { + condition.permitted ? this.enable() : this.disable(); + }, + }); + } + async execute() { - const workspaceContext = await this.getContext(UMB_DOCUMENT_WORKSPACE_CONTEXT); - //const document = workspaceContext.getData(); - // TODO: handle errors - //if (!document) return; - //this.workspaceContext.repository?.saveAndPreview(); - //Remember to return a promise. + alert('Save and preview'); } } From f36b09bccb6aebd9f3ef5d593d5bd8335902595d Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 9 Apr 2024 19:50:37 +0200 Subject: [PATCH 232/280] use extension initializer --- .../entity-actions-bundle.element.ts | 32 +++++++++++++------ 1 file changed, 22 insertions(+), 10 deletions(-) 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 c696d25743..a9f1b10729 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 @@ -4,9 +4,10 @@ import { html, nothing, customElement, property, state, ifDefined } from '@umbra import type { UmbSectionSidebarContext } from '@umbraco-cms/backoffice/section'; import { UMB_SECTION_SIDEBAR_CONTEXT } from '@umbraco-cms/backoffice/section'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import type { ManifestEntityActionDefaultKind } from '@umbraco-cms/backoffice/extension-registry'; +import type { ManifestEntityAction, ManifestEntityActionDefaultKind } from '@umbraco-cms/backoffice/extension-registry'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; -import { createExtensionApi } from '@umbraco-cms/backoffice/extension-api'; +import { UmbExtensionsManifestInitializer, createExtensionApi } from '@umbraco-cms/backoffice/extension-api'; +import { UmbEntityContext } from '../../entity/entity.context'; @customElement('umb-entity-actions-bundle') export class UmbEntityActionsBundleElement extends UmbLitElement { @@ -30,6 +31,8 @@ export class UmbEntityActionsBundleElement extends UmbLitElement { #sectionSidebarContext?: UmbSectionSidebarContext; + #entityContext = new UmbEntityContext(this); + constructor() { super(); @@ -40,26 +43,35 @@ export class UmbEntityActionsBundleElement extends UmbLitElement { protected updated(_changedProperties: PropertyValueMap | Map): void { if (_changedProperties.has('entityType') && _changedProperties.has('unique')) { + this.#entityContext.setEntityType(this.entityType); + this.#entityContext.setUnique(this.unique); this.#observeEntityActions(); } } #observeEntityActions() { - this.observe( - umbExtensionsRegistry.byTypeAndFilter('entityAction', (ext) => ext.forEntityTypes.includes(this.entityType!)), + new UmbExtensionsManifestInitializer( + this, + umbExtensionsRegistry, + 'entityAction', + (ext) => ext.forEntityTypes.includes(this.entityType!), async (actions) => { this._numberOfActions = actions.length; this._firstActionManifest = - this._numberOfActions > 0 ? (actions[0] as ManifestEntityActionDefaultKind) : undefined; - if (!this._firstActionManifest) return; - this._firstActionApi = await createExtensionApi(this, this._firstActionManifest, [ - { unique: this.unique, entityType: this.entityType, meta: this._firstActionManifest.meta }, - ]); + this._numberOfActions > 0 ? (actions[0].manifest as ManifestEntityActionDefaultKind) : undefined; + this.#createFirstActionApi(); }, 'umbEntityActionsObserver', ); } + async #createFirstActionApi() { + if (!this._firstActionManifest) return; + this._firstActionApi = await createExtensionApi(this, this._firstActionManifest, [ + { unique: this.unique, entityType: this.entityType, meta: this._firstActionManifest.meta }, + ]); + } + #openContextMenu() { if (!this.entityType) throw new Error('Entity type is not defined'); if (this.unique === undefined) throw new Error('Unique is not defined'); @@ -73,7 +85,7 @@ export class UmbEntityActionsBundleElement extends UmbLitElement { render() { if (this._numberOfActions === 0) return nothing; - return html` ${this.#renderFirstAction()} ${this.#renderMore()} `; + return html`${this.#renderMore()} ${this.#renderFirstAction()} `; } #renderMore() { From d4330a122d5e77c7f1095e9c06ebcd8013ce5e44 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 9 Apr 2024 20:15:28 +0200 Subject: [PATCH 233/280] add save action --- .../common/submit/submit.action.ts | 4 +-- .../workspace/actions/save.action.ts | 27 +++++++++++++++++++ .../documents/workspace/manifests.ts | 7 ++--- 3 files changed, 30 insertions(+), 8 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/save.action.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-action/common/submit/submit.action.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-action/common/submit/submit.action.ts index 3801e4c0f0..d44d4f9e0e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-action/common/submit/submit.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-action/common/submit/submit.action.ts @@ -22,9 +22,7 @@ export class UmbSubmitWorkspaceAction extends UmbWorkspaceActionBase { // We can't save if we don't have a unique if (unique === undefined) { - this._isDisabled.setValue(true); - } else { - this._isDisabled.setValue(false); + this.disable(); } }, 'saveWorkspaceActionUniqueObserver', diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/save.action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/save.action.ts new file mode 100644 index 0000000000..d72a6668a2 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/save.action.ts @@ -0,0 +1,27 @@ +import { UMB_USER_PERMISSION_DOCUMENT_UPDATE } from '../../user-permissions/constants.js'; +import { UmbDocumentUserPermissionCondition } from '../../user-permissions/document-user-permission.condition.js'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { UmbSubmitWorkspaceAction } from '@umbraco-cms/backoffice/workspace'; + +export class UmbDocumentSaveWorkspaceAction extends UmbSubmitWorkspaceAction { + constructor(host: UmbControllerHost, args: any) { + super(host, args); + + /* The action is disabled by default because the onChange callback + will first be triggered when the condition is changed to permitted */ + this.disable(); + + const condition = new UmbDocumentUserPermissionCondition(host, { + host, + config: { + alias: 'Umb.Condition.UserPermission.Document', + allOf: [UMB_USER_PERMISSION_DOCUMENT_UPDATE], + }, + onChange: () => { + condition.permitted ? this.enable() : this.disable(); + }, + }); + } +} + +export { UmbDocumentSaveWorkspaceAction as api }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/manifests.ts index 0301e6e345..3158945b92 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/manifests.ts @@ -16,6 +16,7 @@ import type { ManifestWorkspaceView, } from '@umbraco-cms/backoffice/extension-registry'; import { UmbDocumentSaveAndPreviewWorkspaceAction } from './actions/save-and-preview.action.js'; +import { UmbDocumentSaveWorkspaceAction } from './actions/save.action.js'; export const UMB_DOCUMENT_WORKSPACE_ALIAS = 'Umb.Workspace.Document'; @@ -115,7 +116,7 @@ const workspaceActions: Array = [ alias: 'Umb.WorkspaceAction.Document.Save', name: 'Save Document Workspace Action', weight: 80, - api: UmbSubmitWorkspaceAction, + api: () => import('./actions/save.action.js'), meta: { label: 'Save', look: 'secondary', @@ -126,10 +127,6 @@ const workspaceActions: Array = [ alias: 'Umb.Condition.WorkspaceAlias', match: workspace.alias, }, - { - alias: 'Umb.Condition.UserPermission.Document', - allOf: [UMB_USER_PERMISSION_DOCUMENT_UPDATE], - }, ], }, { From 4b088db92517749e217b71496169acc981e15f3d Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 9 Apr 2024 20:26:53 +0200 Subject: [PATCH 234/280] lazy load all document workspace actions --- .../actions/publish-with-descendants.action.ts | 2 ++ .../actions/save-and-preview.action.ts | 2 ++ .../actions/save-and-publish.action.ts | 2 ++ .../actions/save-and-schedule.action.ts | 2 ++ .../workspace/actions/unpublish.action.ts | 2 ++ .../documents/documents/workspace/manifests.ts | 17 +++++------------ 6 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/publish-with-descendants.action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/publish-with-descendants.action.ts index f1c1fe9fe3..1476c21406 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/publish-with-descendants.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/publish-with-descendants.action.ts @@ -7,3 +7,5 @@ export class UmbDocumentPublishWithDescendantsWorkspaceAction extends UmbWorkspa return workspaceContext.publishWithDescendants(); } } + +export { UmbDocumentPublishWithDescendantsWorkspaceAction as api }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/save-and-preview.action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/save-and-preview.action.ts index b6c2596618..0b7bd4f7e3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/save-and-preview.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/save-and-preview.action.ts @@ -27,3 +27,5 @@ export class UmbDocumentSaveAndPreviewWorkspaceAction extends UmbWorkspaceAction alert('Save and preview'); } } + +export { UmbDocumentSaveAndPreviewWorkspaceAction as api }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/save-and-publish.action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/save-and-publish.action.ts index b211cbfbaf..8b63be05bc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/save-and-publish.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/save-and-publish.action.ts @@ -32,3 +32,5 @@ export class UmbDocumentSaveAndPublishWorkspaceAction extends UmbWorkspaceAction return workspaceContext.saveAndPublish(); } } + +export { UmbDocumentSaveAndPublishWorkspaceAction as api }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/save-and-schedule.action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/save-and-schedule.action.ts index 6419b22d54..2220f006ff 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/save-and-schedule.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/save-and-schedule.action.ts @@ -7,3 +7,5 @@ export class UmbDocumentSaveAndScheduleWorkspaceAction extends UmbWorkspaceActio return workspaceContext.schedule(); } } + +export { UmbDocumentSaveAndScheduleWorkspaceAction as api }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/unpublish.action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/unpublish.action.ts index dd07517d21..b74b5713b2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/unpublish.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/unpublish.action.ts @@ -7,3 +7,5 @@ export class UmbDocumentUnpublishWorkspaceAction extends UmbWorkspaceActionBase return workspaceContext.unpublish(); } } + +export { UmbDocumentUnpublishWorkspaceAction as api }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/manifests.ts index 3158945b92..db840a25bb 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/manifests.ts @@ -4,19 +4,12 @@ import { UMB_USER_PERMISSION_DOCUMENT_UPDATE, UMB_USER_PERMISSION_DOCUMENT_PUBLISH, } from '../user-permissions/index.js'; -import { UmbDocumentSaveAndScheduleWorkspaceAction } from './actions/save-and-schedule.action.js'; -import { UmbDocumentUnpublishWorkspaceAction } from './actions/unpublish.action.js'; -import { UmbDocumentSaveAndPublishWorkspaceAction } from './actions/save-and-publish.action.js'; -import { UmbDocumentPublishWithDescendantsWorkspaceAction } from './actions/publish-with-descendants.action.js'; -import { UmbSubmitWorkspaceAction } from '@umbraco-cms/backoffice/workspace'; import type { ManifestWorkspaces, ManifestWorkspaceActions, ManifestWorkspaceActionMenuItem, ManifestWorkspaceView, } from '@umbraco-cms/backoffice/extension-registry'; -import { UmbDocumentSaveAndPreviewWorkspaceAction } from './actions/save-and-preview.action.js'; -import { UmbDocumentSaveWorkspaceAction } from './actions/save.action.js'; export const UMB_DOCUMENT_WORKSPACE_ALIAS = 'Umb.Workspace.Document'; @@ -97,7 +90,7 @@ const workspaceActions: Array = [ alias: 'Umb.WorkspaceAction.Document.SaveAndPublish', name: 'Save And Publish Document Workspace Action', weight: 70, - api: UmbDocumentSaveAndPublishWorkspaceAction, + api: () => import('./actions/save-and-publish.action.js'), meta: { label: 'Save And Publish', look: 'primary', @@ -135,7 +128,7 @@ const workspaceActions: Array = [ alias: 'Umb.WorkspaceAction.Document.SaveAndPreview', name: 'Save And Preview Document Workspace Action', weight: 90, - api: UmbDocumentSaveAndPreviewWorkspaceAction, + api: () => import('./actions/save-and-preview.action.js'), meta: { label: 'Save And Preview', }, @@ -155,7 +148,7 @@ const workspaceActionMenuItems: Array = [ alias: 'Umb.Document.WorkspaceActionMenuItem.Unpublish', name: 'Unpublish', weight: 0, - api: UmbDocumentUnpublishWorkspaceAction, + api: () => import('./actions/unpublish.action.js'), forWorkspaceActions: 'Umb.WorkspaceAction.Document.SaveAndPublish', meta: { label: 'Unpublish...', @@ -174,7 +167,7 @@ const workspaceActionMenuItems: Array = [ alias: 'Umb.Document.WorkspaceActionMenuItem.PublishWithDescendants', name: 'Publish with descendants', weight: 10, - api: UmbDocumentPublishWithDescendantsWorkspaceAction, + api: () => import('./actions/publish-with-descendants.action.js'), forWorkspaceActions: 'Umb.WorkspaceAction.Document.SaveAndPublish', meta: { label: 'Publish with descendants...', @@ -193,7 +186,7 @@ const workspaceActionMenuItems: Array = [ alias: 'Umb.Document.WorkspaceActionMenuItem.SchedulePublishing', name: 'Schedule publishing', weight: 20, - api: UmbDocumentSaveAndScheduleWorkspaceAction, + api: () => import('./actions/save-and-schedule.action.js'), forWorkspaceActions: 'Umb.WorkspaceAction.Document.SaveAndPublish', meta: { label: 'Schedule...', From fda38a8f3f98413bbc1194f506bb0b47eafa5ba1 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 9 Apr 2024 22:01:39 +0200 Subject: [PATCH 235/280] use fallback permissions correctly --- .../document-user-permission.condition.ts | 27 ++++++++++++++----- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-user-permission.condition.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-user-permission.condition.ts index 91a0e19528..9114748e2f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-user-permission.condition.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-user-permission.condition.ts @@ -58,18 +58,31 @@ export class UmbDocumentUserPermissionCondition if (!this.#entityType) return; if (this.#unique === undefined) return; - let verbs: Array = this.#fallbackPermissions; + const hasDocumentPermissions = this.#documentPermissions.length > 0; - if (this.#documentPermissions) { + // if there is no permissions for any documents we use the fallback permissions + if (!hasDocumentPermissions) { + this.#check(this.#fallbackPermissions); + return; + } + + if (hasDocumentPermissions) { const permissionsForCurrentDocument = this.#documentPermissions.find( (permission) => permission.document.id === this.#unique, ); - const currentDocumentVerbs = permissionsForCurrentDocument ? permissionsForCurrentDocument.verbs : []; - verbs = verbs.concat(currentDocumentVerbs); - } - const uniqueVerbs = [...new Set(verbs)]; - this.permitted = this.config.allOf.every((verb) => uniqueVerbs.includes(verb)); + // no permissions for the current document - use the fallback permissions + if (!permissionsForCurrentDocument) { + this.#check(this.#fallbackPermissions); + return; + } + + this.#check(permissionsForCurrentDocument.verbs); + } + } + + #check(verbs: Array) { + this.permitted = this.config.allOf.every((verb) => verbs.includes(verb)); } } From c34790d4099a6d47bdb403dd86784fff43a937a6 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 9 Apr 2024 22:01:53 +0200 Subject: [PATCH 236/280] set entity context after load and create --- .../documents/workspace/document-workspace.context.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts index c017ba460c..1ab4c387a1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/document-workspace.context.ts @@ -166,8 +166,6 @@ export class UmbDocumentWorkspaceContext component: () => import('./document-workspace-editor.element.js'), setup: (_component, info) => { const unique = info.match.params.unique; - this.#entityContext.setEntityType(UMB_DOCUMENT_ENTITY_TYPE); - this.#entityContext.setUnique(unique); this.load(unique); }, }, @@ -193,6 +191,8 @@ export class UmbDocumentWorkspaceContext const { data, asObservable } = (await this.#getDataPromise) as GetDataType; if (data) { + this.#entityContext.setEntityType(UMB_DOCUMENT_ENTITY_TYPE); + this.#entityContext.setUnique(unique); this.setIsNew(false); this.#persistedData.setValue(data); this.#currentData.setValue(data); @@ -220,6 +220,8 @@ export class UmbDocumentWorkspaceContext const { data } = await this.#getDataPromise; if (!data) return undefined; + this.#entityContext.setEntityType(UMB_DOCUMENT_ENTITY_TYPE); + this.#entityContext.setUnique(data.unique); this.setIsNew(true); this.#persistedData.setValue(undefined); this.#currentData.setValue(data); From ee2f393030f70c7df8e2aa217bc8b5ede310dd5d Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 10 Apr 2024 08:45:42 +0200 Subject: [PATCH 237/280] don't add to the permission list if the last modal is rejected --- ...cument-granular-user-permission.element.ts | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/input-document-granular-user-permission/input-document-granular-user-permission.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/input-document-granular-user-permission/input-document-granular-user-permission.element.ts index 7eb0367957..f407672201 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/input-document-granular-user-permission/input-document-granular-user-permission.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/input-document-granular-user-permission/input-document-granular-user-permission.element.ts @@ -10,6 +10,7 @@ import { UmbChangeEvent, UmbSelectedEvent } from '@umbraco-cms/backoffice/event' import type { ManifestEntityUserPermission } from '@umbraco-cms/backoffice/extension-registry'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; +import { c } from 'node_modules/msw/lib/glossary-de6278a9.js'; @customElement('umb-input-document-granular-user-permission') export class UmbInputDocumentGranularUserPermissionElement extends FormControlMixin(UmbLitElement) { @@ -66,7 +67,7 @@ export class UmbInputDocumentGranularUserPermissionElement extends FormControlMi this.dispatchEvent(new UmbChangeEvent()); } - #addGranularPermission() { + async #addGranularPermission() { this.#documentPickerModalContext = this.#modalManagerContext?.open(this, UMB_DOCUMENT_PICKER_MODAL, { data: { hideTreeRoot: true, @@ -83,17 +84,24 @@ export class UmbInputDocumentGranularUserPermissionElement extends FormControlMi if (!unique) return; const documentItem = await this.#requestDocumentItem(unique); - const result = await this.#selectEntityUserPermissionsForDocument(documentItem); - this.#documentPickerModalContext?.reject(); - const permissionItem: UmbDocumentUserPermissionModel = { - $type: 'DocumentPermissionPresentationModel', - document: { id: unique }, - verbs: result, - }; + this.#selectEntityUserPermissionsForDocument(documentItem).then( + (result) => { + this.#documentPickerModalContext?.reject(); - this.permissions = [...this._permissions, permissionItem]; - this.dispatchEvent(new UmbChangeEvent()); + const permissionItem: UmbDocumentUserPermissionModel = { + $type: 'DocumentPermissionPresentationModel', + document: { id: unique }, + verbs: result, + }; + + this.permissions = [...this._permissions, permissionItem]; + this.dispatchEvent(new UmbChangeEvent()); + }, + () => { + this.#documentPickerModalContext?.reject(); + }, + ); }); } @@ -127,7 +135,7 @@ export class UmbInputDocumentGranularUserPermissionElement extends FormControlMi const value = await this.#entityUserPermissionModalContext?.onSubmit(); return value?.allowedVerbs; } catch (error) { - return allowedVerbs; + throw new Error(); } } From efd514bc09b5c2e10ba2505ea459c88f7eed5842 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 10 Apr 2024 10:51:44 +0200 Subject: [PATCH 238/280] allow for both allOf and oneOf in the condition --- .../document-user-permission.condition.ts | 27 ++++++++++++++++--- .../workspace/actions/save.action.ts | 7 +++-- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-user-permission.condition.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-user-permission.condition.ts index 9114748e2f..5c83f3e25d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-user-permission.condition.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-user-permission.condition.ts @@ -82,19 +82,40 @@ export class UmbDocumentUserPermissionCondition } #check(verbs: Array) { - this.permitted = this.config.allOf.every((verb) => verbs.includes(verb)); + /* we default to true se we don't require both allOf and oneOf to be defined + but they can be combined for more complex scenarios */ + let allOfPermitted = true; + let oneOfPermitted = true; + + if (this.config.allOf?.length) { + allOfPermitted = this.config.allOf.every((verb) => verbs.includes(verb)); + } + + if (this.config.oneOf?.length) { + oneOfPermitted = this.config.oneOf.some((verb) => verbs.includes(verb)); + } + + this.permitted = allOfPermitted && oneOfPermitted; } } export type UmbDocumentUserPermissionConditionConfig = UmbConditionConfigBase<'Umb.Condition.UserPermission.Document'> & { /** - * + * The user must have all of the permissions in this array for the condition to be met. * * @example * ["Umb.Document.Save", "Umb.Document.Publish"] */ - allOf: Array; + allOf?: Array; + + /** + * The user must have at least one of the permissions in this array for the condition to be met. + * + * @example + * ["Umb.Document.Save", "Umb.Document.Publish"] + */ + oneOf?: Array; }; export const manifest: ManifestCondition = { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/save.action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/save.action.ts index d72a6668a2..f49852254f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/save.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/save.action.ts @@ -1,4 +1,7 @@ -import { UMB_USER_PERMISSION_DOCUMENT_UPDATE } from '../../user-permissions/constants.js'; +import { + UMB_USER_PERMISSION_DOCUMENT_CREATE, + UMB_USER_PERMISSION_DOCUMENT_UPDATE, +} from '../../user-permissions/constants.js'; import { UmbDocumentUserPermissionCondition } from '../../user-permissions/document-user-permission.condition.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbSubmitWorkspaceAction } from '@umbraco-cms/backoffice/workspace'; @@ -15,7 +18,7 @@ export class UmbDocumentSaveWorkspaceAction extends UmbSubmitWorkspaceAction { host, config: { alias: 'Umb.Condition.UserPermission.Document', - allOf: [UMB_USER_PERMISSION_DOCUMENT_UPDATE], + oneOf: [UMB_USER_PERMISSION_DOCUMENT_CREATE, UMB_USER_PERMISSION_DOCUMENT_UPDATE], }, onChange: () => { condition.permitted ? this.enable() : this.disable(); From 67d29c6612f4283b0f5190fb667fe98007723085 Mon Sep 17 00:00:00 2001 From: Lone Iversen <108085781+loivsen@users.noreply.github.com> Date: Wed, 10 Apr 2024 10:53:39 +0200 Subject: [PATCH 239/280] ops --- .../documents/entity-actions/create-blueprint/manifests.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/manifests.ts index 3de8559c0a..a57d713a64 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/create-blueprint/manifests.ts @@ -12,7 +12,7 @@ const entityActions: Array = [ forEntityTypes: [UMB_DOCUMENT_ENTITY_TYPE], meta: { icon: 'icon-blueprint', - label: 'Create Content Template', + label: '#actions_createblueprint', }, }, ]; From 9faa317e9df373b0875321f556cd31788b8e0191 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 10 Apr 2024 11:14:54 +0200 Subject: [PATCH 240/280] clean up --- .../document-user-permission.condition.ts | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-user-permission.condition.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-user-permission.condition.ts index 5c83f3e25d..607ac7f761 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-user-permission.condition.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/document-user-permission.condition.ts @@ -33,7 +33,7 @@ export class UmbDocumentUserPermissionCondition (currentUser) => { this.#documentPermissions = currentUser?.permissions?.filter(isDocumentUserPermission) || []; this.#fallbackPermissions = currentUser?.fallbackPermissions || []; - this.#isAllowed(); + this.#checkPermissions(); }, 'umbUserPermissionConditionObserver', ); @@ -47,14 +47,14 @@ export class UmbDocumentUserPermissionCondition ([entityType, unique]) => { this.#entityType = entityType; this.#unique = unique; - this.#isAllowed(); + this.#checkPermissions(); }, 'umbUserPermissionEntityContextObserver', ); }); } - #isAllowed() { + #checkPermissions() { if (!this.#entityType) return; if (this.#unique === undefined) return; @@ -66,6 +66,8 @@ export class UmbDocumentUserPermissionCondition return; } + /* If there are document permission we check if there are permissions for the current document + If there aren't we use the fallback permissions */ if (hasDocumentPermissions) { const permissionsForCurrentDocument = this.#documentPermissions.find( (permission) => permission.document.id === this.#unique, @@ -77,6 +79,7 @@ export class UmbDocumentUserPermissionCondition return; } + // we found permissions for the current document - check them this.#check(permissionsForCurrentDocument.verbs); } } @@ -87,14 +90,22 @@ export class UmbDocumentUserPermissionCondition let allOfPermitted = true; let oneOfPermitted = true; + // check if all of the verbs are present if (this.config.allOf?.length) { allOfPermitted = this.config.allOf.every((verb) => verbs.includes(verb)); } + // check if at least one of the verbs is present if (this.config.oneOf?.length) { oneOfPermitted = this.config.oneOf.some((verb) => verbs.includes(verb)); } + // if neither allOf or oneOf is defined we default to false + if (!allOfPermitted && !oneOfPermitted) { + allOfPermitted = false; + oneOfPermitted = false; + } + this.permitted = allOfPermitted && oneOfPermitted; } } From a499bfe6971e7a52bc0e9f42b4c2d53a7edb75cb Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 10 Apr 2024 11:19:10 +0200 Subject: [PATCH 241/280] add TODO --- .../documents/documents/workspace/actions/save.action.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/save.action.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/save.action.ts index f49852254f..385b7e565c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/save.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/actions/save.action.ts @@ -14,6 +14,10 @@ export class UmbDocumentSaveWorkspaceAction extends UmbSubmitWorkspaceAction { will first be triggered when the condition is changed to permitted */ this.disable(); + // TODO: this check is not sufficient. It will show the save button if a use + // has only create options. The best solution would be to split the two buttons into two separate actions + // with a condition on isNew to show/hide them + // The server will throw a permission error if this scenario happens const condition = new UmbDocumentUserPermissionCondition(host, { host, config: { From b7f8c609ac4bbc0bbad2d8b26f7075a015957cfb Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 10 Apr 2024 11:37:58 +0200 Subject: [PATCH 242/280] remove import --- .../input-document-granular-user-permission.element.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/input-document-granular-user-permission/input-document-granular-user-permission.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/input-document-granular-user-permission/input-document-granular-user-permission.element.ts index f407672201..8640f65ef9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/input-document-granular-user-permission/input-document-granular-user-permission.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/user-permissions/input-document-granular-user-permission/input-document-granular-user-permission.element.ts @@ -10,7 +10,6 @@ import { UmbChangeEvent, UmbSelectedEvent } from '@umbraco-cms/backoffice/event' import type { ManifestEntityUserPermission } from '@umbraco-cms/backoffice/extension-registry'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; -import { c } from 'node_modules/msw/lib/glossary-de6278a9.js'; @customElement('umb-input-document-granular-user-permission') export class UmbInputDocumentGranularUserPermissionElement extends FormControlMixin(UmbLitElement) { From 78e9a0c8ce7e8e78bde4e511aa0675d23aec5759 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Wed, 10 Apr 2024 11:56:25 +0200 Subject: [PATCH 243/280] give the auth modal a key and remove it before trying to open a new (it may already be opened in another state) --- src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts b/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts index 2e3bb77d9b..baaceaf0a0 100644 --- a/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/apps/app/app-auth.controller.ts @@ -134,12 +134,14 @@ export class UmbAppAuthController extends UmbControllerBase { // Show the provider selection screen const modalManager = await this.getContext(UMB_MODAL_MANAGER_CONTEXT); + modalManager.remove('umbAuthModal'); const selected = await modalManager .open(this._host, UMB_MODAL_APP_AUTH, { data: { userLoginState, }, modal: { + key: 'umbAuthModal', backdropBackground: this.#firstTimeLoggingIn ? 'var(--umb-auth-backdrop, url("/umbraco/backoffice/assets/umbraco_logo_white.svg") 20px 20px / 200px no-repeat, radial-gradient(circle, rgba(2,0,36,1) 0%, rgba(40,58,151,.9) 50%, rgba(0,212,255,1) 100%))' : 'var(--umb-auth-backdrop-timedout, rgba(0,0,0,0.75))', From dc7b36bd92394ffe28366c6f49d5c5db40475720 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 10 Apr 2024 12:04:58 +0200 Subject: [PATCH 244/280] fix import --- .../entity-actions-bundle/entity-actions-bundle.element.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 a9f1b10729..98b3c13bea 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,13 +1,13 @@ +import { UmbEntityContext } from '../../entity/entity.context.js'; import type { UmbEntityAction } from '@umbraco-cms/backoffice/entity-action'; import type { PropertyValueMap } from '@umbraco-cms/backoffice/external/lit'; import { html, nothing, customElement, property, state, ifDefined } from '@umbraco-cms/backoffice/external/lit'; import type { UmbSectionSidebarContext } from '@umbraco-cms/backoffice/section'; import { UMB_SECTION_SIDEBAR_CONTEXT } from '@umbraco-cms/backoffice/section'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import type { ManifestEntityAction, ManifestEntityActionDefaultKind } from '@umbraco-cms/backoffice/extension-registry'; +import type { ManifestEntityActionDefaultKind } from '@umbraco-cms/backoffice/extension-registry'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; import { UmbExtensionsManifestInitializer, createExtensionApi } from '@umbraco-cms/backoffice/extension-api'; -import { UmbEntityContext } from '../../entity/entity.context'; @customElement('umb-entity-actions-bundle') export class UmbEntityActionsBundleElement extends UmbLitElement { From 9a436f3d8dc071c93da95dd5644da3e302a0e23c Mon Sep 17 00:00:00 2001 From: JesmoDev <26099018+JesmoDev@users.noreply.github.com> Date: Wed, 10 Apr 2024 13:44:42 +0200 Subject: [PATCH 245/280] small fixes --- .../src/assets/lang/da-dk.ts | 1 + .../src/assets/lang/en-us.ts | 1 + .../modals/rollback/rollback-modal.element.ts | 19 ++++++++++++------- ...ent-workspace-view-info-history.element.ts | 11 +++++------ 4 files changed, 19 insertions(+), 13 deletions(-) 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 0d96709dcf..e883fdf02f 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 @@ -834,6 +834,7 @@ export default { submit: 'Indsend', type: 'Type', typeToSearch: 'Skriv for at søge...', + unknownUser: 'Ukendt bruger', under: 'under', up: 'Op', update: 'Opdatér', 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 40987bee26..134793b2f5 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 @@ -842,6 +842,7 @@ export default { type: 'Type', typeName: 'Type Name', typeToSearch: 'Type to search...', + unknownUser: 'Unknown user', under: 'under', up: 'Up', update: 'Update', diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts index 5cf75abeff..bb44d9365d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts @@ -98,7 +98,8 @@ export class UmbRollbackModalElement extends UmbModalBaseElement { tempItems.push({ date: item.versionDate, - user: userItems?.find((user) => user.unique === item.user.id)?.name || 'Unknown user', + user: + userItems?.find((user) => user.unique === item.user.id)?.name || this.localize.term('general_unknownUser'), isCurrentlyPublishedVersion: item.isCurrentPublishedVersion, id: item.id, preventCleanup: item.preventCleanup, @@ -286,12 +287,16 @@ export class UmbRollbackModalElement extends UmbModalBaseElement ${this.#renderCurrentVersion()}
- ${this.localize.term('general_cancel')} - ${this.localize.term('general_cancel')} + + `; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info-history.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info-history.element.ts index 36c6aee92e..216c381979 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info-history.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/workspace/views/info/document-workspace-view-info-history.element.ts @@ -17,6 +17,7 @@ import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import type { AuditLogWithUsernameResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; import { DirectionModel } from '@umbraco-cms/backoffice/external/backend-api'; import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; +import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification'; @customElement('umb-document-workspace-view-info-history') export class UmbDocumentWorkspaceViewInfoHistoryElement extends UmbLitElement { @@ -94,11 +95,10 @@ export class UmbDocumentWorkspaceViewInfoHistoryElement extends UmbLitElement { const modalManagerContext = await this.getContext(UMB_MODAL_MANAGER_CONTEXT); const modalContext = modalManagerContext.open(this, UMB_ROLLBACK_MODAL, {}); - if (!modalContext) return; - - modalContext.onSubmit().then(() => { - console.log('Rollback modal submitted'); - }); + await modalContext.onSubmit(); + // TODO: This notification won't actually show at the moment because we perform a full page reload after rollback. However, when we can do it without a full page reload, this should be used. + const notificationContext = await this.getContext(UMB_NOTIFICATION_CONTEXT); + notificationContext.peek('positive', { data: { message: this.localize.term('rollback_documentRolledBack') } }); }; render() { @@ -111,7 +111,6 @@ export class UmbDocumentWorkspaceViewInfoHistoryElement extends UmbLitElement { slot="actions" @click=${this.#onRollbackModalOpen}> - ${this._items ? this.#renderHistory() : html` `} From 4468a9cdac6305b4e280964443e410f469ae668b Mon Sep 17 00:00:00 2001 From: JesmoDev <26099018+JesmoDev@users.noreply.github.com> Date: Wed, 10 Apr 2024 13:47:16 +0200 Subject: [PATCH 246/280] button --- .../documents/modals/rollback/rollback-modal.element.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts index bb44d9365d..4bff0c9cac 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/rollback-modal.element.ts @@ -208,10 +208,10 @@ export class UmbRollbackModalElement extends UmbModalBaseElement this.#onPreventCleanup(event, item.id, !item.preventCleanup)}> - ${item.preventCleanup + @click=${(event: Event) => this.#onPreventCleanup(event, item.id, !item.preventCleanup)} + label=${item.preventCleanup ? this.localize.term('contentTypeEditor_historyCleanupEnableCleanup') - : this.localize.term('contentTypeEditor_historyCleanupPreventCleanup')} + : this.localize.term('contentTypeEditor_historyCleanupPreventCleanup')}> `; From d71aa7ff969c1c3793489d4be5b0c194fc015190 Mon Sep 17 00:00:00 2001 From: JesmoDev <26099018+JesmoDev@users.noreply.github.com> Date: Wed, 10 Apr 2024 13:50:23 +0200 Subject: [PATCH 247/280] package lock --- src/Umbraco.Web.UI.Client/package-lock.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/package-lock.json b/src/Umbraco.Web.UI.Client/package-lock.json index 5b8e3705f4..e4f5f39bfd 100644 --- a/src/Umbraco.Web.UI.Client/package-lock.json +++ b/src/Umbraco.Web.UI.Client/package-lock.json @@ -9,11 +9,13 @@ "version": "14.0.0-beta003", "license": "MIT", "dependencies": { + "@types/diff": "^5.0.9", "@types/dompurify": "^3.0.5", "@types/uuid": "^9.0.8", "@umbraco-ui/uui": "1.7.2", "@umbraco-ui/uui-css": "1.7.2", "base64-js": "^1.5.1", + "diff": "^5.2.0", "dompurify": "^3.0.9", "element-internals-polyfill": "^1.3.10", "lit": "^3.1.2", From 86eb21b3621cc26539b05ed8eef8f4ae68c8d5d4 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 10 Apr 2024 14:07:43 +0200 Subject: [PATCH 248/280] make new controller when constructor args changes --- .../extension-with-api-slot.element.ts | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/extension-with-api-slot/extension-with-api-slot.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/extension-with-api-slot/extension-with-api-slot.element.ts index 40f8e76d69..a9ea9b08dd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/extension-with-api-slot/extension-with-api-slot.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/extension-with-api-slot/extension-with-api-slot.element.ts @@ -46,7 +46,7 @@ export class UmbExtensionWithApiSlotElement extends UmbLitElement { if (value === this.#type) return; this.#type = value; if (this.#attached) { - this._observeExtensions(); + this.#observeExtensions(); } } #type?: string | string[] | undefined; @@ -68,7 +68,7 @@ export class UmbExtensionWithApiSlotElement extends UmbLitElement { if (value === this.#filter) return; this.#filter = value; if (this.#attached) { - this._observeExtensions(); + this.#observeExtensions(); } } #filter: (manifest: any) => boolean = () => true; @@ -107,8 +107,9 @@ export class UmbExtensionWithApiSlotElement extends UmbLitElement { return this.#constructorArgs; } set apiArgs(newVal: Array | UmbApiConstructorArgumentsMethodType | undefined) { - // TODO, compare changes since last time. only reset the ones that changed. This might be better done by the controller is self: + if (newVal === this.#constructorArgs) return; this.#constructorArgs = newVal; + this.#observeExtensions(); } #constructorArgs?: Array | UmbApiConstructorArgumentsMethodType = []; @@ -146,11 +147,11 @@ export class UmbExtensionWithApiSlotElement extends UmbLitElement { connectedCallback(): void { super.connectedCallback(); - this._observeExtensions(); + this.#observeExtensions(); this.#attached = true; } - private _observeExtensions(): void { + #observeExtensions(): void { this.#extensionsController?.destroy(); if (this.#type) { this.#extensionsController = new UmbExtensionsElementAndApiInitializer( From f4c0a7767f190b303bb7a66237b742af03894153 Mon Sep 17 00:00:00 2001 From: leekelleher Date: Wed, 10 Apr 2024 10:10:09 +0100 Subject: [PATCH 249/280] Installed `@hey-api/openapi-ts` --- src/Umbraco.Web.UI.Client/package-lock.json | 174 +++++++++++++++++++- src/Umbraco.Web.UI.Client/package.json | 4 +- 2 files changed, 168 insertions(+), 10 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/package-lock.json b/src/Umbraco.Web.UI.Client/package-lock.json index db9ee79f23..7c065f65e4 100644 --- a/src/Umbraco.Web.UI.Client/package-lock.json +++ b/src/Umbraco.Web.UI.Client/package-lock.json @@ -26,6 +26,7 @@ }, "devDependencies": { "@babel/core": "^7.24.3", + "@hey-api/openapi-ts": "^0.37.3", "@mdx-js/react": "^3.0.0", "@open-wc/testing": "^4.0.0", "@playwright/test": "^1.41.1", @@ -2667,6 +2668,84 @@ "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==", "dev": true }, + "node_modules/@hey-api/openapi-ts": { + "version": "0.37.3", + "resolved": "https://registry.npmjs.org/@hey-api/openapi-ts/-/openapi-ts-0.37.3.tgz", + "integrity": "sha512-bqadMe9YpzwO9nkpCK+XEwbom9V/WNcUSOYKp8lBJbe/Rve/eSnTjANmll65SU/uoc/5kgrnkD0Eh4hcPqSYrA==", + "dev": true, + "dependencies": { + "@apidevtools/json-schema-ref-parser": "11.5.4", + "c12": "1.10.0", + "camelcase": "8.0.0", + "commander": "12.0.0", + "handlebars": "4.7.8" + }, + "bin": { + "openapi-ts": "bin/index.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "typescript": "^5.x" + } + }, + "node_modules/@hey-api/openapi-ts/node_modules/@apidevtools/json-schema-ref-parser": { + "version": "11.5.4", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.5.4.tgz", + "integrity": "sha512-o2fsypTGU0WxRxbax8zQoHiIB4dyrkwYfcm8TxZ+bx9pCzcWZbQtiMqpgBvWA/nJ2TrGjK5adCLfTH8wUeU/Wg==", + "dev": true, + "dependencies": { + "@jsdevtools/ono": "^7.1.3", + "@types/json-schema": "^7.0.15", + "js-yaml": "^4.1.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/philsturgeon" + } + }, + "node_modules/@hey-api/openapi-ts/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/@hey-api/openapi-ts/node_modules/camelcase": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-8.0.0.tgz", + "integrity": "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@hey-api/openapi-ts/node_modules/commander": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.0.0.tgz", + "integrity": "sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@hey-api/openapi-ts/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.14", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", @@ -9482,6 +9561,26 @@ "node": ">= 0.8" } }, + "node_modules/c12": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/c12/-/c12-1.10.0.tgz", + "integrity": "sha512-0SsG7UDhoRWcuSvKWHaXmu5uNjDCDN3nkQLRL4Q42IlFy+ze58FcCoI3uPwINXinkz7ZinbhEgyzYFw9u9ZV8g==", + "dev": true, + "dependencies": { + "chokidar": "^3.6.0", + "confbox": "^0.1.3", + "defu": "^6.1.4", + "dotenv": "^16.4.5", + "giget": "^1.2.1", + "jiti": "^1.21.0", + "mlly": "^1.6.1", + "ohash": "^1.1.3", + "pathe": "^1.1.2", + "perfect-debounce": "^1.0.0", + "pkg-types": "^1.0.3", + "rc9": "^2.1.1" + } + }, "node_modules/cache-content-type": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", @@ -9678,16 +9777,10 @@ "dev": true }, "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -9700,6 +9793,9 @@ "engines": { "node": ">= 8.10.0" }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, "optionalDependencies": { "fsevents": "~2.3.2" } @@ -10129,6 +10225,12 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/confbox": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.3.tgz", + "integrity": "sha512-eH3ZxAihl1PhKfpr4VfEN6/vUd87fmgb6JkldHgg/YR6aEBhW63qUDgzP2Y6WM0UumdsYp5H3kibalXAdHfbgg==", + "dev": true + }, "node_modules/consola": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", @@ -10495,6 +10597,12 @@ "node": ">=6" } }, + "node_modules/destr": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.3.tgz", + "integrity": "sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==", + "dev": true + }, "node_modules/destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", @@ -14124,6 +14232,15 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, "node_modules/js-levenshtein": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz", @@ -15899,6 +16016,18 @@ "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", "dev": true }, + "node_modules/mlly": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.6.1.tgz", + "integrity": "sha512-vLgaHvaeunuOXHSmEbZ9izxPx3USsk8KCQ8iC+aTlp5sKRSoZvwhHh5L9VbKSaVC6sJDqbyohIS76E2VmHIPAA==", + "dev": true, + "dependencies": { + "acorn": "^8.11.3", + "pathe": "^1.1.2", + "pkg-types": "^1.0.3", + "ufo": "^1.3.2" + } + }, "node_modules/monaco-editor": { "version": "0.46.0", "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.46.0.tgz", @@ -16937,6 +17066,12 @@ "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", "dev": true }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "dev": true + }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", @@ -16985,6 +17120,17 @@ "node": ">=10" } }, + "node_modules/pkg-types": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", + "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", + "dev": true, + "dependencies": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" + } + }, "node_modules/playwright": { "version": "1.41.2", "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.41.2.tgz", @@ -17423,6 +17569,16 @@ "node": ">= 0.8" } }, + "node_modules/rc9": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.2.tgz", + "integrity": "sha512-btXCnMmRIBINM2LDZoEmOogIZU7Qe7zn4BpomSKZ/ykbLObuBdvG+mFq11DL6fjH1DRwHhrlgtYWG96bJiC7Cg==", + "dev": true, + "dependencies": { + "defu": "^6.1.4", + "destr": "^2.0.3" + } + }, "node_modules/react": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", diff --git a/src/Umbraco.Web.UI.Client/package.json b/src/Umbraco.Web.UI.Client/package.json index 8dc7c5c510..b3c6a35feb 100644 --- a/src/Umbraco.Web.UI.Client/package.json +++ b/src/Umbraco.Web.UI.Client/package.json @@ -158,7 +158,8 @@ "generate:tsconfig": "node ./devops/tsconfig/index.js", "generate:manifest": "node ./devops/build/create-umbraco-package.js", "package:validate": "node ./devops/package/validate-exports.js", - "generate:ui-api-docs": "typedoc --options typedoc.config.js" + "generate:ui-api-docs": "typedoc --options typedoc.config.js", + "openapi-ts": "openapi-ts --input https://raw.githubusercontent.com/umbraco/Umbraco-CMS/v14/dev/src/Umbraco.Cms.Api.Management/OpenApi.json --output src/external/backend-api/src --debug true --enums typescript --lint true --postfixServices Resource --schemas false" }, "engines": { "node": ">=20.9 <21", @@ -182,6 +183,7 @@ }, "devDependencies": { "@babel/core": "^7.24.3", + "@hey-api/openapi-ts": "^0.37.3", "@mdx-js/react": "^3.0.0", "@open-wc/testing": "^4.0.0", "@playwright/test": "^1.41.1", From ce1cecd900482075b75dd70d2116786876a0633d Mon Sep 17 00:00:00 2001 From: leekelleher Date: Wed, 10 Apr 2024 12:02:40 +0100 Subject: [PATCH 250/280] Generated server models with new tool --- .../external/backend-api/src/core/ApiError.ts | 38 +- .../backend-api/src/core/ApiRequestOptions.ts | 28 +- .../backend-api/src/core/ApiResult.ts | 18 +- .../backend-api/src/core/CancelablePromise.ts | 211 +- .../external/backend-api/src/core/OpenAPI.ts | 73 +- .../external/backend-api/src/core/request.ts | 505 +- .../src/external/backend-api/src/index.ts | 449 +- .../src/external/backend-api/src/models.ts | 5153 ++++++++++ .../src/models/AllowedDocumentTypeModel.ts | 12 - .../src/models/AllowedMediaTypeModel.ts | 12 - .../src/models/AuditLogEntityModel.ts | 10 - .../src/models/AuditLogResponseModel.ts | 18 - .../AuditLogWithUsernameResponseModel.ts | 20 - .../backend-api/src/models/AuditTypeModel.ts | 31 - ...bleDocumentTypeCompositionResponseModel.ts | 13 - ...ilableMediaTypeCompositionResponseModel.ts | 13 - ...lableMemberTypeCompositionResponseModel.ts | 13 - .../ChangePasswordCurrentUserRequestModel.ts | 10 - .../models/ChangePasswordUserRequestModel.ts | 9 - .../src/models/CompositionTypeModel.ts | 9 - .../models/ConsentLevelPresentationModel.ts | 12 - .../src/models/CopyDataTypeRequestModel.ts | 11 - .../src/models/CopyDocumentRequestModel.ts | 13 - .../models/CopyDocumentTypeRequestModel.ts | 11 - .../src/models/CopyMediaTypeRequestModel.ts | 11 - .../src/models/CreateDataTypeRequestModel.ts | 17 - .../CreateDictionaryItemRequestModel.ts | 15 - ...cumentBlueprintFromDocumentRequestModel.ts | 14 - .../CreateDocumentBlueprintRequestModel.ts | 17 - .../src/models/CreateDocumentRequestModel.ts | 18 - ...ntTypePropertyTypeContainerRequestModel.ts | 15 - ...ateDocumentTypePropertyTypeRequestModel.ts | 23 - .../models/CreateDocumentTypeRequestModel.ts | 33 - .../src/models/CreateFolderRequestModel.ts | 13 - .../CreateInitialPasswordUserRequestModel.ts | 13 - .../src/models/CreateLanguageRequestModel.ts | 13 - .../src/models/CreateMediaRequestModel.ts | 17 - ...iaTypePropertyTypeContainerRequestModel.ts | 15 - ...CreateMediaTypePropertyTypeRequestModel.ts | 23 - .../src/models/CreateMediaTypeRequestModel.ts | 29 - .../models/CreateMemberGroupRequestModel.ts | 10 - .../src/models/CreateMemberRequestModel.ts | 21 - ...erTypePropertyTypeContainerRequestModel.ts | 15 - ...reateMemberTypePropertyTypeRequestModel.ts | 26 - .../models/CreateMemberTypeRequestModel.ts | 26 - .../src/models/CreatePackageRequestModel.ts | 22 - .../CreatePartialViewFolderRequestModel.ts | 12 - .../models/CreatePartialViewRequestModel.ts | 13 - .../models/CreateScriptFolderRequestModel.ts | 12 - .../src/models/CreateScriptRequestModel.ts | 13 - .../CreateStylesheetFolderRequestModel.ts | 12 - .../models/CreateStylesheetRequestModel.ts | 13 - .../src/models/CreateTemplateRequestModel.ts | 12 - .../src/models/CreateUserGroupRequestModel.ts | 23 - .../src/models/CreateUserRequestModel.ts | 13 - .../src/models/CreateWebhookRequestModel.ts | 14 - .../models/CultureAndScheduleRequestModel.ts | 12 - .../src/models/CultureReponseModel.ts | 10 - .../CurrenUserConfigurationResponseModel.ts | 13 - .../src/models/CurrentUserResponseModel.ts | 26 - .../src/models/DataTypeChangeModeModel.ts | 10 - .../src/models/DataTypeItemResponseModel.ts | 12 - .../DataTypePropertyPresentationModel.ts | 10 - .../models/DataTypePropertyReferenceModel.ts | 10 - .../models/DataTypeReferenceResponseModel.ts | 13 - .../src/models/DataTypeResponseModel.ts | 17 - .../models/DataTypeTreeItemResponseModel.ts | 17 - .../src/models/DatabaseInstallRequestModel.ts | 17 - .../DatabaseSettingsPresentationModel.ts | 19 - .../DatatypeConfigurationResponseModel.ts | 14 - .../models/DefaultReferenceResponseModel.ts | 12 - .../models/DeleteUserGroupsRequestModel.ts | 9 - .../src/models/DeleteUsersRequestModel.ts | 9 - .../models/DictionaryItemItemResponseModel.ts | 10 - .../src/models/DictionaryItemResponseModel.ts | 13 - .../models/DictionaryItemTranslationModel.ts | 10 - .../models/DictionaryOverviewResponseModel.ts | 14 - .../backend-api/src/models/DirectionModel.ts | 9 - .../src/models/DisableUserRequestModel.ts | 9 - .../DocumentBlueprintItemResponseModel.ts | 13 - .../models/DocumentBlueprintResponseModel.ts | 16 - .../DocumentBlueprintTreeItemResponseModel.ts | 17 - .../models/DocumentCollectionResponseModel.ts | 19 - .../DocumentConfigurationResponseModel.ts | 14 - .../src/models/DocumentItemResponseModel.ts | 16 - .../DocumentNotificationResponseModel.ts | 10 - .../DocumentPermissionPresentationModel.ts | 13 - .../DocumentRecycleBinItemResponseModel.ts | 17 - .../models/DocumentReferenceResponseModel.ts | 14 - .../src/models/DocumentResponseModel.ts | 21 - .../models/DocumentTreeItemResponseModel.ts | 20 - .../src/models/DocumentTypeCleanupModel.ts | 11 - ...entTypeCollectionReferenceResponseModel.ts | 11 - .../models/DocumentTypeCompositionModel.ts | 13 - .../DocumentTypeCompositionRequestModel.ts | 12 - .../DocumentTypeCompositionResponseModel.ts | 11 - .../DocumentTypeConfigurationResponseModel.ts | 13 - .../models/DocumentTypeItemResponseModel.ts | 12 - ...tTypePropertyTypeContainerResponseModel.ts | 15 - .../DocumentTypePropertyTypeResponseModel.ts | 23 - .../DocumentTypeReferenceResponseModel.ts | 13 - .../src/models/DocumentTypeResponseModel.ts | 32 - .../src/models/DocumentTypeSortModel.ts | 12 - .../DocumentTypeTreeItemResponseModel.ts | 17 - .../src/models/DocumentUrlInfoModel.ts | 10 - .../src/models/DocumentValueModel.ts | 12 - .../DocumentVariantItemResponseModel.ts | 13 - .../src/models/DocumentVariantRequestModel.ts | 11 - .../models/DocumentVariantResponseModel.ts | 17 - .../src/models/DocumentVariantStateModel.ts | 11 - .../DocumentVersionItemResponseModel.ts | 18 - .../models/DocumentVersionResponseModel.ts | 18 - .../src/models/DomainPresentationModel.ts | 10 - .../src/models/DomainsResponseModel.ts | 12 - .../models/DynamicRootContextRequestModel.ts | 14 - .../DynamicRootQueryOriginRequestModel.ts | 10 - .../models/DynamicRootQueryRequestModel.ts | 13 - .../DynamicRootQueryStepRequestModel.ts | 10 - .../src/models/DynamicRootRequestModel.ts | 13 - .../src/models/DynamicRootResponseModel.ts | 9 - .../src/models/EnableTwoFactorRequestModel.ts | 10 - .../src/models/EnableUserRequestModel.ts | 9 - .../src/models/EventMessageTypeModel.ts | 12 - .../src/models/FieldPresentationModel.ts | 10 - .../src/models/FileSystemFolderModel.ts | 9 - .../FileSystemTreeItemPresentationModel.ts | 15 - .../src/models/FolderResponseModel.ts | 10 - .../models/HealthCheckActionRequestModel.ts | 18 - .../HealthCheckGroupPresentationModel.ts | 12 - .../models/HealthCheckGroupResponseModel.ts | 9 - ...HealthCheckGroupWithResultResponseModel.ts | 11 - .../src/models/HealthCheckModel.ts | 11 - .../models/HealthCheckResultResponseModel.ts | 15 - .../HealthCheckWithResultPresentationModel.ts | 12 - .../src/models/HealthStatusModel.ts | 10 - .../src/models/HelpPageResponseModel.ts | 12 - .../models/ImportDictionaryRequestModel.ts | 12 - .../src/models/IndexResponseModel.ts | 17 - .../src/models/InstallRequestModel.ts | 15 - .../models/InstallSettingsResponseModel.ts | 13 - .../src/models/InviteUserRequestModel.ts | 14 - .../models/ItemReferenceByIdResponseModel.ts | 9 - .../src/models/ItemSortingRequestModel.ts | 10 - .../src/models/LanguageItemResponseModel.ts | 10 - .../src/models/LanguageResponseModel.ts | 13 - .../src/models/LinkedLoginModel.ts | 10 - .../src/models/LinkedLoginsRequestModel.ts | 11 - .../src/models/LogLevelCountsReponseModel.ts | 13 - .../backend-api/src/models/LogLevelModel.ts | 13 - .../LogMessagePropertyPresentationModel.ts | 10 - .../src/models/LogMessageResponseModel.ts | 17 - .../src/models/LogTemplateResponseModel.ts | 10 - .../src/models/LoggerResponseModel.ts | 12 - .../src/models/ManifestResponseModel.ts | 11 - .../models/MediaCollectionResponseModel.ts | 18 - .../models/MediaConfigurationResponseModel.ts | 12 - .../src/models/MediaItemResponseModel.ts | 15 - .../MediaRecycleBinItemResponseModel.ts | 17 - .../src/models/MediaReferenceResponseModel.ts | 13 - .../src/models/MediaResponseModel.ts | 19 - .../src/models/MediaTreeItemResponseModel.ts | 19 - ...diaTypeCollectionReferenceResponseModel.ts | 11 - .../src/models/MediaTypeCompositionModel.ts | 13 - .../MediaTypeCompositionRequestModel.ts | 11 - .../MediaTypeCompositionResponseModel.ts | 11 - .../src/models/MediaTypeItemResponseModel.ts | 11 - ...aTypePropertyTypeContainerResponseModel.ts | 15 - .../MediaTypePropertyTypeResponseModel.ts | 23 - .../models/MediaTypeReferenceResponseModel.ts | 13 - .../src/models/MediaTypeResponseModel.ts | 28 - .../src/models/MediaTypeSortModel.ts | 12 - .../models/MediaTypeTreeItemResponseModel.ts | 16 - .../src/models/MediaUrlInfoModel.ts | 10 - .../backend-api/src/models/MediaValueModel.ts | 12 - .../src/models/MediaVariantRequestModel.ts | 11 - .../src/models/MediaVariantResponseModel.ts | 13 - .../MemberConfigurationResponseModel.ts | 9 - .../models/MemberGroupItemResponseModel.ts | 10 - .../src/models/MemberGroupResponseModel.ts | 10 - .../src/models/MemberItemResponseModel.ts | 14 - .../src/models/MemberResponseModel.ts | 26 - .../src/models/MemberTypeCompositionModel.ts | 13 - .../MemberTypeCompositionRequestModel.ts | 11 - .../MemberTypeCompositionResponseModel.ts | 11 - .../src/models/MemberTypeItemResponseModel.ts | 11 - ...rTypePropertyTypeContainerResponseModel.ts | 15 - .../MemberTypePropertyTypeResponseModel.ts | 26 - .../MemberTypePropertyTypeVisibilityModel.ts | 10 - .../MemberTypeReferenceResponseModel.ts | 13 - .../src/models/MemberTypeResponseModel.ts | 26 - .../src/models/MemberValueModel.ts | 12 - .../src/models/MemberVariantRequestModel.ts | 11 - .../src/models/MemberVariantResponseModel.ts | 13 - .../src/models/ModelsBuilderResponseModel.ts | 17 - .../backend-api/src/models/ModelsModeModel.ts | 11 - .../src/models/MoveDataTypeRequestModel.ts | 11 - .../src/models/MoveDictionaryRequestModel.ts | 11 - .../MoveDocumentBlueprintRequestModel.ts | 11 - .../src/models/MoveDocumentRequestModel.ts | 11 - .../models/MoveDocumentTypeRequestModel.ts | 11 - .../src/models/MoveMediaRequestModel.ts | 11 - .../src/models/MoveMediaTypeRequestModel.ts | 11 - .../NamedEntityTreeItemResponseModel.ts | 14 - .../src/models/NoopSetupTwoFactorModel.ts | 6 - .../src/models/NotificationHeaderModel.ts | 13 - .../src/models/ObjectTypeResponseModel.ts | 10 - .../backend-api/src/models/OperatorModel.ts | 15 - .../models/OutOfDateStatusResponseModel.ts | 11 - .../src/models/OutOfDateTypeModel.ts | 10 - .../PackageConfigurationResponseModel.ts | 9 - .../models/PackageDefinitionResponseModel.ts | 24 - .../PackageMigrationStatusResponseModel.ts | 10 - .../models/PagedAllowedDocumentTypeModel.ts | 12 - .../src/models/PagedAllowedMediaTypeModel.ts | 12 - .../src/models/PagedAuditLogResponseModel.ts | 12 - .../PagedAuditLogWithUsernameResponseModel.ts | 12 - .../src/models/PagedCultureReponseModel.ts | 12 - .../models/PagedDataTypeItemResponseModel.ts | 12 - .../PagedDataTypeTreeItemResponseModel.ts | 12 - .../PagedDictionaryOverviewResponseModel.ts | 12 - ...dDocumentBlueprintTreeItemResponseModel.ts | 12 - .../PagedDocumentCollectionResponseModel.ts | 12 - ...agedDocumentRecycleBinItemResponseModel.ts | 12 - .../PagedDocumentTreeItemResponseModel.ts | 12 - .../PagedDocumentTypeTreeItemResponseModel.ts | 12 - .../PagedDocumentVersionItemResponseModel.ts | 12 - ...agedFileSystemTreeItemPresentationModel.ts | 12 - .../PagedHealthCheckGroupResponseModel.ts | 12 - .../src/models/PagedHelpPageResponseModel.ts | 12 - .../models/PagedIReferenceResponseModel.ts | 14 - .../src/models/PagedIndexResponseModel.ts | 12 - .../src/models/PagedLanguageResponseModel.ts | 12 - .../models/PagedLogMessageResponseModel.ts | 12 - .../models/PagedLogTemplateResponseModel.ts | 12 - .../src/models/PagedLoggerResponseModel.ts | 12 - .../PagedMediaCollectionResponseModel.ts | 12 - .../PagedMediaRecycleBinItemResponseModel.ts | 12 - .../models/PagedMediaTreeItemResponseModel.ts | 12 - .../PagedMediaTypeTreeItemResponseModel.ts | 12 - .../models/PagedMemberGroupResponseModel.ts | 12 - .../src/models/PagedMemberResponseModel.ts | 12 - .../PagedModelDataTypeItemResponseModel.ts | 12 - .../PagedModelDocumentItemResponseModel.ts | 12 - ...PagedModelDocumentTypeItemResponseModel.ts | 12 - .../PagedModelMediaItemResponseModel.ts | 12 - .../PagedModelMediaTypeItemResponseModel.ts | 12 - .../PagedModelMemberItemResponseModel.ts | 12 - .../PagedModelMemberTypeItemResponseModel.ts | 12 - .../PagedModelTemplateItemResponseModel.ts | 12 - .../PagedNamedEntityTreeItemResponseModel.ts | 12 - .../models/PagedObjectTypeResponseModel.ts | 12 - .../PagedPackageDefinitionResponseModel.ts | 12 - ...agedPackageMigrationStatusResponseModel.ts | 12 - ...agedPartialViewSnippetItemResponseModel.ts | 12 - .../src/models/PagedProblemDetailsModel.ts | 12 - .../models/PagedRedirectUrlResponseModel.ts | 12 - .../src/models/PagedReferenceByIdModel.ts | 12 - .../src/models/PagedRelationResponseModel.ts | 12 - .../models/PagedRelationTypeResponseModel.ts | 12 - .../PagedSavedLogSearchResponseModel.ts | 12 - .../models/PagedSearchResultResponseModel.ts | 12 - .../src/models/PagedSearcherResponseModel.ts | 12 - .../src/models/PagedTagResponseModel.ts | 12 - .../src/models/PagedTelemetryResponseModel.ts | 12 - .../src/models/PagedUserGroupResponseModel.ts | 12 - .../src/models/PagedUserResponseModel.ts | 12 - .../src/models/PagedWebhookResponseModel.ts | 12 - .../models/PartialViewFolderResponseModel.ts | 13 - .../models/PartialViewItemResponseModel.ts | 14 - .../src/models/PartialViewResponseModel.ts | 14 - .../PartialViewSnippetItemResponseModel.ts | 10 - .../models/PartialViewSnippetResponseModel.ts | 11 - .../PasswordConfigurationResponseModel.ts | 13 - .../backend-api/src/models/ProblemDetails.ts | 6 - .../src/models/ProblemDetailsBuilderModel.ts | 6 - .../src/models/ProfilingStatusRequestModel.ts | 9 - .../models/ProfilingStatusResponseModel.ts | 9 - .../src/models/PropertyTypeAppearanceModel.ts | 9 - .../src/models/PropertyTypeValidationModel.ts | 12 - .../src/models/PublicAccessRequestModel.ts | 14 - .../src/models/PublishDocumentRequestModel.ts | 11 - ...lishDocumentWithDescendantsRequestModel.ts | 10 - .../src/models/RedirectStatusModel.ts | 9 - .../src/models/RedirectUrlResponseModel.ts | 16 - .../models/RedirectUrlStatusResponseModel.ts | 12 - .../src/models/ReferenceByIdModel.ts | 9 - .../src/models/RelationReferenceModel.ts | 10 - .../src/models/RelationResponseModel.ts | 17 - .../models/RelationTypeItemResponseModel.ts | 11 - .../src/models/RelationTypeResponseModel.ts | 17 - .../models/RenamePartialViewRequestModel.ts | 9 - .../src/models/RenameScriptRequestModel.ts | 9 - .../models/RenameStylesheetRequestModel.ts | 9 - .../models/ResendInviteUserRequestModel.ts | 12 - .../src/models/ResetPasswordRequestModel.ts | 9 - .../models/ResetPasswordTokenRequestModel.ts | 13 - .../models/ResetPasswordUserResponseModel.ts | 9 - .../src/models/RuntimeLevelModel.ts | 13 - .../src/models/RuntimeModeModel.ts | 10 - .../src/models/SavedLogSearchRequestModel.ts | 10 - .../src/models/SavedLogSearchResponseModel.ts | 10 - .../src/models/ScheduleRequestModel.ts | 10 - .../src/models/ScriptFolderResponseModel.ts | 13 - .../src/models/ScriptItemResponseModel.ts | 14 - .../src/models/ScriptResponseModel.ts | 14 - .../src/models/SearchResultResponseModel.ts | 14 - .../src/models/SearcherResponseModel.ts | 9 - .../SecurityConfigurationResponseModel.ts | 11 - .../ServerConfigurationItemResponseModel.ts | 10 - .../ServerConfigurationResponseModel.ts | 9 - .../models/ServerInformationResponseModel.ts | 14 - .../src/models/ServerStatusResponseModel.ts | 11 - .../ServerTroubleshootingResponseModel.ts | 11 - .../src/models/SetAvatarRequestModel.ts | 11 - .../src/models/SetTourStatusRequestModel.ts | 11 - .../src/models/SortingRequestModel.ts | 13 - .../src/models/StaticFileItemResponseModel.ts | 14 - .../src/models/StatusResultTypeModel.ts | 11 - .../models/StylesheetFolderResponseModel.ts | 13 - .../src/models/StylesheetItemResponseModel.ts | 14 - .../src/models/StylesheetResponseModel.ts | 14 - .../src/models/TagResponseModel.ts | 12 - .../src/models/TelemetryLevelModel.ts | 10 - .../src/models/TelemetryRequestModel.ts | 11 - .../src/models/TelemetryResponseModel.ts | 11 - .../TemplateConfigurationResponseModel.ts | 9 - .../src/models/TemplateItemResponseModel.ts | 11 - ...lateQueryExecuteFilterPresentationModel.ts | 13 - .../src/models/TemplateQueryExecuteModel.ts | 17 - .../models/TemplateQueryExecuteSortModel.ts | 10 - .../src/models/TemplateQueryOperatorModel.ts | 13 - .../TemplateQueryPropertyPresentationModel.ts | 12 - .../models/TemplateQueryPropertyTypeModel.ts | 10 - ...emplateQueryResultItemPresentationModel.ts | 10 - .../TemplateQueryResultResponseModel.ts | 14 - .../TemplateQuerySettingsResponseModel.ts | 14 - .../src/models/TemplateResponseModel.ts | 15 - ...TemporaryFileConfigurationResponseModel.ts | 12 - .../src/models/TemporaryFileResponseModel.ts | 11 - .../backend-api/src/models/TourStatusModel.ts | 11 - .../TrackedReferenceDocumentTypeModel.ts | 11 - .../models/TrackedReferenceMediaTypeModel.ts | 11 - .../UnknownTypePermissionPresentationModel.ts | 11 - .../src/models/UnlockUsersRequestModel.ts | 9 - .../models/UnpublishDocumentRequestModel.ts | 9 - .../src/models/UpdateDataTypeRequestModel.ts | 14 - .../UpdateDictionaryItemRequestModel.ts | 12 - .../UpdateDocumentBlueprintRequestModel.ts | 13 - ...UpdateDocumentNotificationsRequestModel.ts | 9 - .../src/models/UpdateDocumentRequestModel.ts | 15 - ...ntTypePropertyTypeContainerRequestModel.ts | 15 - ...ateDocumentTypePropertyTypeRequestModel.ts | 23 - .../models/UpdateDocumentTypeRequestModel.ts | 31 - .../src/models/UpdateDomainsRequestModel.ts | 12 - .../src/models/UpdateFolderResponseModel.ts | 9 - .../src/models/UpdateLanguageRequestModel.ts | 12 - .../src/models/UpdateMediaRequestModel.ts | 13 - ...iaTypePropertyTypeContainerRequestModel.ts | 15 - ...UpdateMediaTypePropertyTypeRequestModel.ts | 23 - .../src/models/UpdateMediaTypeRequestModel.ts | 27 - .../models/UpdateMemberGroupRequestModel.ts | 9 - .../src/models/UpdateMemberRequestModel.ts | 21 - ...erTypePropertyTypeContainerRequestModel.ts | 15 - ...pdateMemberTypePropertyTypeRequestModel.ts | 26 - .../models/UpdateMemberTypeRequestModel.ts | 25 - .../src/models/UpdatePackageRequestModel.ts | 23 - .../models/UpdatePartialViewRequestModel.ts | 9 - .../src/models/UpdateScriptRequestModel.ts | 9 - .../models/UpdateStylesheetRequestModel.ts | 9 - .../src/models/UpdateTemplateRequestModel.ts | 11 - .../src/models/UpdateUserGroupRequestModel.ts | 23 - .../UpdateUserGroupsOnUserRequestModel.ts | 10 - .../src/models/UpdateUserRequestModel.ts | 15 - .../src/models/UpdateWebhookRequestModel.ts | 13 - .../models/UpgradeSettingsResponseModel.ts | 13 - .../models/UserConfigurationResponseModel.ts | 12 - .../src/models/UserGroupItemResponseModel.ts | 11 - .../src/models/UserGroupResponseModel.ts | 25 - .../src/models/UserInstallRequestModel.ts | 12 - .../src/models/UserItemResponseModel.ts | 10 - .../backend-api/src/models/UserOrderModel.ts | 17 - .../src/models/UserPermissionModel.ts | 10 - .../models/UserPermissionsResponseModel.ts | 11 - .../src/models/UserResponseModel.ts | 27 - .../models/UserSettingsPresentationModel.ts | 13 - .../backend-api/src/models/UserStateModel.ts | 13 - .../models/UserTourStatusesResponseModel.ts | 11 - .../src/models/UserTwoFactorProviderModel.ts | 10 - .../src/models/VariantItemResponseModel.ts | 10 - .../models/VerifyInviteUserRequestModel.ts | 12 - .../models/VerifyInviteUserResponseModel.ts | 11 - .../VerifyResetPasswordResponseModel.ts | 11 - .../VerifyResetPasswordTokenRequestModel.ts | 12 - .../src/models/WebhookEventResponseModel.ts | 11 - .../src/models/WebhookItemResponseModel.ts | 13 - .../src/models/WebhookResponseModel.ts | 16 - .../src/external/backend-api/src/services.ts | 8623 +++++++++++++++++ .../src/services/AuditLogResource.ts | 113 - .../src/services/CultureResource.ts | 37 - .../src/services/DataTypeResource.ts | 492 - .../src/services/DictionaryResource.ts | 319 - .../src/services/DocumentBlueprintResource.ts | 344 - .../src/services/DocumentResource.ts | 1005 -- .../src/services/DocumentTypeResource.ts | 515 - .../src/services/DocumentVersionResource.ts | 127 - .../src/services/DynamicRootResource.ts | 48 - .../src/services/HealthCheckResource.ts | 106 - .../backend-api/src/services/HelpResource.ts | 47 - .../src/services/IndexerResource.ts | 85 - .../src/services/InstallResource.ts | 71 - .../src/services/LanguageResource.ts | 159 - .../src/services/LogViewerResource.ts | 256 - .../src/services/ManifestResource.ts | 52 - .../backend-api/src/services/MediaResource.ts | 671 -- .../src/services/MediaTypeResource.ts | 500 - .../src/services/MemberGroupResource.ts | 181 - .../src/services/MemberResource.ts | 276 - .../src/services/MemberTypeResource.ts | 256 - .../src/services/ModelsBuilderResource.ts | 58 - .../src/services/ObjectTypesResource.ts | 37 - .../src/services/PackageResource.ts | 221 - .../src/services/PartialViewResource.ts | 356 - .../src/services/PreviewResource.ts | 41 - .../src/services/ProfilingResource.ts | 49 - .../src/services/PropertyTypeResource.ts | 36 - .../src/services/PublishedCacheResource.ts | 70 - .../services/RedirectManagementResource.ts | 130 - .../src/services/RelationResource.ts | 43 - .../src/services/RelationTypeResource.ts | 82 - .../src/services/ScriptResource.ts | 308 - .../src/services/SearcherResource.ts | 71 - .../src/services/SecurityResource.ts | 96 - .../src/services/ServerResource.ts | 72 - .../src/services/StaticFileResource.ts | 108 - .../src/services/StylesheetResource.ts | 308 - .../backend-api/src/services/TagResource.ts | 46 - .../src/services/TelemetryResource.ts | 75 - .../src/services/TemplateResource.ts | 288 - .../src/services/TemporaryFileResource.ts | 100 - .../backend-api/src/services/TourResource.ts | 49 - .../src/services/UpgradeResource.ts | 45 - .../src/services/UserGroupResource.ts | 238 - .../backend-api/src/services/UserResource.ts | 853 -- .../src/services/WebhookResource.ts | 159 - 444 files changed, 14230 insertions(+), 15611 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/AllowedDocumentTypeModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/AllowedMediaTypeModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/AuditLogEntityModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/AuditLogResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/AuditLogWithUsernameResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/AuditTypeModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/AvailableDocumentTypeCompositionResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/AvailableMediaTypeCompositionResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/AvailableMemberTypeCompositionResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ChangePasswordCurrentUserRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ChangePasswordUserRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CompositionTypeModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ConsentLevelPresentationModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CopyDataTypeRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CopyDocumentRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CopyDocumentTypeRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CopyMediaTypeRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateDataTypeRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateDictionaryItemRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateDocumentBlueprintFromDocumentRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateDocumentBlueprintRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateDocumentRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateDocumentTypePropertyTypeContainerRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateDocumentTypePropertyTypeRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateDocumentTypeRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateFolderRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateInitialPasswordUserRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateLanguageRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateMediaRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateMediaTypePropertyTypeContainerRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateMediaTypePropertyTypeRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateMediaTypeRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateMemberGroupRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateMemberRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateMemberTypePropertyTypeContainerRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateMemberTypePropertyTypeRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateMemberTypeRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreatePackageRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreatePartialViewFolderRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreatePartialViewRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateScriptFolderRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateScriptRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateStylesheetFolderRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateStylesheetRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateTemplateRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateUserGroupRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateUserRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateWebhookRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CultureAndScheduleRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CultureReponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CurrenUserConfigurationResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CurrentUserResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DataTypeChangeModeModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DataTypeItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DataTypePropertyPresentationModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DataTypePropertyReferenceModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DataTypeReferenceResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DataTypeResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DataTypeTreeItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DatabaseInstallRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DatabaseSettingsPresentationModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DatatypeConfigurationResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DefaultReferenceResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DeleteUserGroupsRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DeleteUsersRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DictionaryItemItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DictionaryItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DictionaryItemTranslationModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DictionaryOverviewResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DirectionModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DisableUserRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentBlueprintItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentBlueprintResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentBlueprintTreeItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentCollectionResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentConfigurationResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentNotificationResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentPermissionPresentationModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentRecycleBinItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentReferenceResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTreeItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypeCleanupModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypeCollectionReferenceResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypeCompositionModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypeCompositionRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypeCompositionResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypeConfigurationResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypeItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypePropertyTypeContainerResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypePropertyTypeResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypeReferenceResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypeResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypeSortModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypeTreeItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentUrlInfoModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentValueModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentVariantItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentVariantRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentVariantResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentVariantStateModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentVersionItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentVersionResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DomainPresentationModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DomainsResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DynamicRootContextRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DynamicRootQueryOriginRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DynamicRootQueryRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DynamicRootQueryStepRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DynamicRootRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DynamicRootResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/EnableTwoFactorRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/EnableUserRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/EventMessageTypeModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FieldPresentationModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FileSystemFolderModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FileSystemTreeItemPresentationModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FolderResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/HealthCheckActionRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/HealthCheckGroupPresentationModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/HealthCheckGroupResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/HealthCheckGroupWithResultResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/HealthCheckModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/HealthCheckResultResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/HealthCheckWithResultPresentationModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/HealthStatusModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/HelpPageResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ImportDictionaryRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/IndexResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/InstallRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/InstallSettingsResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/InviteUserRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ItemReferenceByIdResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ItemSortingRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/LanguageItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/LanguageResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/LinkedLoginModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/LinkedLoginsRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/LogLevelCountsReponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/LogLevelModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/LogMessagePropertyPresentationModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/LogMessageResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/LogTemplateResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/LoggerResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ManifestResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaCollectionResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaConfigurationResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaRecycleBinItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaReferenceResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTreeItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTypeCollectionReferenceResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTypeCompositionModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTypeCompositionRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTypeCompositionResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTypeItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTypePropertyTypeContainerResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTypePropertyTypeResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTypeReferenceResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTypeResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTypeSortModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTypeTreeItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaUrlInfoModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaValueModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaVariantRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaVariantResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberConfigurationResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberGroupItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberGroupResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberTypeCompositionModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberTypeCompositionRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberTypeCompositionResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberTypeItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberTypePropertyTypeContainerResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberTypePropertyTypeResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberTypePropertyTypeVisibilityModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberTypeReferenceResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberTypeResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberValueModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberVariantRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberVariantResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ModelsBuilderResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ModelsModeModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MoveDataTypeRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MoveDictionaryRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MoveDocumentBlueprintRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MoveDocumentRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MoveDocumentTypeRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MoveMediaRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MoveMediaTypeRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/NamedEntityTreeItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/NoopSetupTwoFactorModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/NotificationHeaderModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ObjectTypeResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/OperatorModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/OutOfDateStatusResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/OutOfDateTypeModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PackageConfigurationResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PackageDefinitionResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PackageMigrationStatusResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedAllowedDocumentTypeModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedAllowedMediaTypeModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedAuditLogResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedAuditLogWithUsernameResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedCultureReponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedDataTypeItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedDataTypeTreeItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedDictionaryOverviewResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedDocumentBlueprintTreeItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedDocumentCollectionResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedDocumentRecycleBinItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedDocumentTreeItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedDocumentTypeTreeItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedDocumentVersionItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedFileSystemTreeItemPresentationModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedHealthCheckGroupResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedHelpPageResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedIReferenceResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedIndexResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedLanguageResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedLogMessageResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedLogTemplateResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedLoggerResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedMediaCollectionResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedMediaRecycleBinItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedMediaTreeItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedMediaTypeTreeItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedMemberGroupResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedMemberResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedModelDataTypeItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedModelDocumentItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedModelDocumentTypeItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedModelMediaItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedModelMediaTypeItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedModelMemberItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedModelMemberTypeItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedModelTemplateItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedNamedEntityTreeItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedObjectTypeResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedPackageDefinitionResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedPackageMigrationStatusResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedPartialViewSnippetItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedProblemDetailsModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedRedirectUrlResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedReferenceByIdModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedRelationResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedRelationTypeResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedSavedLogSearchResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedSearchResultResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedSearcherResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedTagResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedTelemetryResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedUserGroupResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedUserResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedWebhookResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PartialViewFolderResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PartialViewItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PartialViewResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PartialViewSnippetItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PartialViewSnippetResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PasswordConfigurationResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ProblemDetails.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ProblemDetailsBuilderModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ProfilingStatusRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ProfilingStatusResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PropertyTypeAppearanceModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PropertyTypeValidationModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PublicAccessRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PublishDocumentRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PublishDocumentWithDescendantsRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RedirectStatusModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RedirectUrlResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RedirectUrlStatusResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ReferenceByIdModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RelationReferenceModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RelationResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RelationTypeItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RelationTypeResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RenamePartialViewRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RenameScriptRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RenameStylesheetRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ResendInviteUserRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ResetPasswordRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ResetPasswordTokenRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ResetPasswordUserResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RuntimeLevelModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RuntimeModeModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/SavedLogSearchRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/SavedLogSearchResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ScheduleRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ScriptFolderResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ScriptItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ScriptResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/SearchResultResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/SearcherResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/SecurityConfigurationResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ServerConfigurationItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ServerConfigurationResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ServerInformationResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ServerStatusResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ServerTroubleshootingResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/SetAvatarRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/SetTourStatusRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/SortingRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/StaticFileItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/StatusResultTypeModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/StylesheetFolderResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/StylesheetItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/StylesheetResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TagResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TelemetryLevelModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TelemetryRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TelemetryResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemplateConfigurationResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemplateItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemplateQueryExecuteFilterPresentationModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemplateQueryExecuteModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemplateQueryExecuteSortModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemplateQueryOperatorModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemplateQueryPropertyPresentationModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemplateQueryPropertyTypeModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemplateQueryResultItemPresentationModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemplateQueryResultResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemplateQuerySettingsResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemplateResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemporaryFileConfigurationResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemporaryFileResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TourStatusModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TrackedReferenceDocumentTypeModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TrackedReferenceMediaTypeModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UnknownTypePermissionPresentationModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UnlockUsersRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UnpublishDocumentRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateDataTypeRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateDictionaryItemRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateDocumentBlueprintRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateDocumentNotificationsRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateDocumentRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateDocumentTypePropertyTypeContainerRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateDocumentTypePropertyTypeRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateDocumentTypeRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateDomainsRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateFolderResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateLanguageRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateMediaRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateMediaTypePropertyTypeContainerRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateMediaTypePropertyTypeRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateMediaTypeRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateMemberGroupRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateMemberRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateMemberTypePropertyTypeContainerRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateMemberTypePropertyTypeRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateMemberTypeRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdatePackageRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdatePartialViewRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateScriptRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateStylesheetRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateTemplateRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateUserGroupRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateUserGroupsOnUserRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateUserRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateWebhookRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpgradeSettingsResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserConfigurationResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserGroupItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserGroupResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserInstallRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserOrderModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserPermissionModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserPermissionsResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserSettingsPresentationModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserStateModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserTourStatusesResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserTwoFactorProviderModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/VariantItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/VerifyInviteUserRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/VerifyInviteUserResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/VerifyResetPasswordResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/VerifyResetPasswordTokenRequestModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/WebhookEventResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/WebhookItemResponseModel.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/WebhookResponseModel.ts create mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/services.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/AuditLogResource.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/CultureResource.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/DataTypeResource.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/DictionaryResource.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/DocumentBlueprintResource.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/DocumentResource.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/DocumentTypeResource.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/DocumentVersionResource.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/DynamicRootResource.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/HealthCheckResource.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/HelpResource.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/IndexerResource.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/InstallResource.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/LanguageResource.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/LogViewerResource.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/ManifestResource.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/MediaResource.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/MediaTypeResource.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/MemberGroupResource.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/MemberResource.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/MemberTypeResource.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/ModelsBuilderResource.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/ObjectTypesResource.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/PackageResource.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/PartialViewResource.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/PreviewResource.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/ProfilingResource.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/PropertyTypeResource.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/PublishedCacheResource.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/RedirectManagementResource.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/RelationResource.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/RelationTypeResource.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/ScriptResource.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/SearcherResource.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/SecurityResource.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/ServerResource.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/StaticFileResource.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/StylesheetResource.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/TagResource.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/TelemetryResource.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/TemplateResource.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/TemporaryFileResource.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/TourResource.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/UpgradeResource.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/UserGroupResource.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/UserResource.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/WebhookResource.ts diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/core/ApiError.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/core/ApiError.ts index d6b8fcc3ad..b64ebf10f0 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/core/ApiError.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/core/ApiError.ts @@ -1,25 +1,21 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -import type { ApiRequestOptions } from './ApiRequestOptions'; -import type { ApiResult } from './ApiResult'; +import type { ApiRequestOptions } from './ApiRequestOptions.js'; +import type { ApiResult } from './ApiResult.js'; export class ApiError extends Error { - public readonly url: string; - public readonly status: number; - public readonly statusText: string; - public readonly body: any; - public readonly request: ApiRequestOptions; + public readonly url: string; + public readonly status: number; + public readonly statusText: string; + public readonly body: unknown; + public readonly request: ApiRequestOptions; - constructor(request: ApiRequestOptions, response: ApiResult, message: string) { - super(message); + constructor(request: ApiRequestOptions, response: ApiResult, message: string) { + super(message); - this.name = 'ApiError'; - this.url = response.url; - this.status = response.status; - this.statusText = response.statusText; - this.body = response.body; - this.request = request; - } -} + this.name = 'ApiError'; + this.url = response.url; + this.status = response.status; + this.statusText = response.statusText; + this.body = response.body; + this.request = request; + } +} \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/core/ApiRequestOptions.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/core/ApiRequestOptions.ts index c19adcc94d..8f8d4d159e 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/core/ApiRequestOptions.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/core/ApiRequestOptions.ts @@ -1,17 +1,13 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ export type ApiRequestOptions = { - readonly method: 'GET' | 'PUT' | 'POST' | 'DELETE' | 'OPTIONS' | 'HEAD' | 'PATCH'; - readonly url: string; - readonly path?: Record; - readonly cookies?: Record; - readonly headers?: Record; - readonly query?: Record; - readonly formData?: Record; - readonly body?: any; - readonly mediaType?: string; - readonly responseHeader?: string; - readonly errors?: Record; -}; + readonly method: 'GET' | 'PUT' | 'POST' | 'DELETE' | 'OPTIONS' | 'HEAD' | 'PATCH'; + readonly url: string; + readonly path?: Record; + readonly cookies?: Record; + readonly headers?: Record; + readonly query?: Record; + readonly formData?: Record; + readonly body?: any; + readonly mediaType?: string; + readonly responseHeader?: string; + readonly errors?: Record; +}; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/core/ApiResult.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/core/ApiResult.ts index ad8fef2bc3..4c58e39138 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/core/ApiResult.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/core/ApiResult.ts @@ -1,11 +1,7 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -export type ApiResult = { - readonly url: string; - readonly ok: boolean; - readonly status: number; - readonly statusText: string; - readonly body: any; -}; +export type ApiResult = { + readonly body: TData; + readonly ok: boolean; + readonly status: number; + readonly statusText: string; + readonly url: string; +}; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/core/CancelablePromise.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/core/CancelablePromise.ts index 55fef85172..ccc082e8f2 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/core/CancelablePromise.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/core/CancelablePromise.ts @@ -1,131 +1,126 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ export class CancelError extends Error { + constructor(message: string) { + super(message); + this.name = 'CancelError'; + } - constructor(message: string) { - super(message); - this.name = 'CancelError'; - } - - public get isCancelled(): boolean { - return true; - } + public get isCancelled(): boolean { + return true; + } } export interface OnCancel { - readonly isResolved: boolean; - readonly isRejected: boolean; - readonly isCancelled: boolean; + readonly isResolved: boolean; + readonly isRejected: boolean; + readonly isCancelled: boolean; - (cancelHandler: () => void): void; + (cancelHandler: () => void): void; } export class CancelablePromise implements Promise { - #isResolved: boolean; - #isRejected: boolean; - #isCancelled: boolean; - readonly #cancelHandlers: (() => void)[]; - readonly #promise: Promise; - #resolve?: (value: T | PromiseLike) => void; - #reject?: (reason?: any) => void; + private _isResolved: boolean; + private _isRejected: boolean; + private _isCancelled: boolean; + readonly cancelHandlers: (() => void)[]; + readonly promise: Promise; + private _resolve?: (value: T | PromiseLike) => void; + private _reject?: (reason?: unknown) => void; - constructor( - executor: ( - resolve: (value: T | PromiseLike) => void, - reject: (reason?: any) => void, - onCancel: OnCancel - ) => void - ) { - this.#isResolved = false; - this.#isRejected = false; - this.#isCancelled = false; - this.#cancelHandlers = []; - this.#promise = new Promise((resolve, reject) => { - this.#resolve = resolve; - this.#reject = reject; + constructor( + executor: ( + resolve: (value: T | PromiseLike) => void, + reject: (reason?: unknown) => void, + onCancel: OnCancel + ) => void + ) { + this._isResolved = false; + this._isRejected = false; + this._isCancelled = false; + this.cancelHandlers = []; + this.promise = new Promise((resolve, reject) => { + this._resolve = resolve; + this._reject = reject; - const onResolve = (value: T | PromiseLike): void => { - if (this.#isResolved || this.#isRejected || this.#isCancelled) { - return; - } - this.#isResolved = true; - this.#resolve?.(value); - }; + const onResolve = (value: T | PromiseLike): void => { + if (this._isResolved || this._isRejected || this._isCancelled) { + return; + } + this._isResolved = true; + if (this._resolve) this._resolve(value); + }; - const onReject = (reason?: any): void => { - if (this.#isResolved || this.#isRejected || this.#isCancelled) { - return; - } - this.#isRejected = true; - this.#reject?.(reason); - }; + const onReject = (reason?: unknown): void => { + if (this._isResolved || this._isRejected || this._isCancelled) { + return; + } + this._isRejected = true; + if (this._reject) this._reject(reason); + }; - const onCancel = (cancelHandler: () => void): void => { - if (this.#isResolved || this.#isRejected || this.#isCancelled) { - return; - } - this.#cancelHandlers.push(cancelHandler); - }; + const onCancel = (cancelHandler: () => void): void => { + if (this._isResolved || this._isRejected || this._isCancelled) { + return; + } + this.cancelHandlers.push(cancelHandler); + }; - Object.defineProperty(onCancel, 'isResolved', { - get: (): boolean => this.#isResolved, - }); + Object.defineProperty(onCancel, 'isResolved', { + get: (): boolean => this._isResolved, + }); - Object.defineProperty(onCancel, 'isRejected', { - get: (): boolean => this.#isRejected, - }); + Object.defineProperty(onCancel, 'isRejected', { + get: (): boolean => this._isRejected, + }); - Object.defineProperty(onCancel, 'isCancelled', { - get: (): boolean => this.#isCancelled, - }); + Object.defineProperty(onCancel, 'isCancelled', { + get: (): boolean => this._isCancelled, + }); - return executor(onResolve, onReject, onCancel as OnCancel); - }); - } + return executor(onResolve, onReject, onCancel as OnCancel); + }); + } - get [Symbol.toStringTag]() { - return "Cancellable Promise"; - } + get [Symbol.toStringTag]() { + return "Cancellable Promise"; + } - public then( - onFulfilled?: ((value: T) => TResult1 | PromiseLike) | null, - onRejected?: ((reason: any) => TResult2 | PromiseLike) | null - ): Promise { - return this.#promise.then(onFulfilled, onRejected); - } + public then( + onFulfilled?: ((value: T) => TResult1 | PromiseLike) | null, + onRejected?: ((reason: unknown) => TResult2 | PromiseLike) | null + ): Promise { + return this.promise.then(onFulfilled, onRejected); + } - public catch( - onRejected?: ((reason: any) => TResult | PromiseLike) | null - ): Promise { - return this.#promise.catch(onRejected); - } + public catch( + onRejected?: ((reason: unknown) => TResult | PromiseLike) | null + ): Promise { + return this.promise.catch(onRejected); + } - public finally(onFinally?: (() => void) | null): Promise { - return this.#promise.finally(onFinally); - } + public finally(onFinally?: (() => void) | null): Promise { + return this.promise.finally(onFinally); + } - public cancel(): void { - if (this.#isResolved || this.#isRejected || this.#isCancelled) { - return; - } - this.#isCancelled = true; - if (this.#cancelHandlers.length) { - try { - for (const cancelHandler of this.#cancelHandlers) { - cancelHandler(); - } - } catch (error) { - console.warn('Cancellation threw an error', error); - return; - } - } - this.#cancelHandlers.length = 0; - this.#reject?.(new CancelError('Request aborted')); - } + public cancel(): void { + if (this._isResolved || this._isRejected || this._isCancelled) { + return; + } + this._isCancelled = true; + if (this.cancelHandlers.length) { + try { + for (const cancelHandler of this.cancelHandlers) { + cancelHandler(); + } + } catch (error) { + console.warn('Cancellation threw an error', error); + return; + } + } + this.cancelHandlers.length = 0; + if (this._reject) this._reject(new CancelError('Request aborted')); + } - public get isCancelled(): boolean { - return this.#isCancelled; - } -} + public get isCancelled(): boolean { + return this._isCancelled; + } +} \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/core/OpenAPI.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/core/OpenAPI.ts index 3066e98b2b..ae55b09447 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/core/OpenAPI.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/core/OpenAPI.ts @@ -1,32 +1,55 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -import type { ApiRequestOptions } from './ApiRequestOptions'; +import type { ApiRequestOptions } from './ApiRequestOptions.js'; -type Resolver = (options: ApiRequestOptions) => Promise; type Headers = Record; +type Middleware = (value: T) => T | Promise; +type Resolver = (options: ApiRequestOptions) => Promise; + +export class Interceptors { + _fns: Middleware[]; + + constructor() { + this._fns = []; + } + + eject(fn: Middleware) { + const index = this._fns.indexOf(fn); + if (index !== -1) { + this._fns = [ + ...this._fns.slice(0, index), + ...this._fns.slice(index + 1), + ]; + } + } + + use(fn: Middleware) { + this._fns = [...this._fns, fn]; + } +} export type OpenAPIConfig = { - BASE: string; - VERSION: string; - WITH_CREDENTIALS: boolean; - CREDENTIALS: 'include' | 'omit' | 'same-origin'; - TOKEN?: string | Resolver | undefined; - USERNAME?: string | Resolver | undefined; - PASSWORD?: string | Resolver | undefined; - HEADERS?: Headers | Resolver | undefined; - ENCODE_PATH?: ((path: string) => string) | undefined; + BASE: string; + CREDENTIALS: 'include' | 'omit' | 'same-origin'; + ENCODE_PATH?: ((path: string) => string) | undefined; + HEADERS?: Headers | Resolver | undefined; + PASSWORD?: string | Resolver | undefined; + TOKEN?: string | Resolver | undefined; + USERNAME?: string | Resolver | undefined; + VERSION: string; + WITH_CREDENTIALS: boolean; + interceptors: {request: Interceptors; + response: Interceptors;}; }; export const OpenAPI: OpenAPIConfig = { - BASE: '', - VERSION: 'Latest', - WITH_CREDENTIALS: false, - CREDENTIALS: 'include', - TOKEN: undefined, - USERNAME: undefined, - PASSWORD: undefined, - HEADERS: undefined, - ENCODE_PATH: undefined, -}; + BASE: '', + CREDENTIALS: 'include', + ENCODE_PATH: undefined, + HEADERS: undefined, + PASSWORD: undefined, + TOKEN: undefined, + USERNAME: undefined, + VERSION: 'Latest', + WITH_CREDENTIALS: false, + interceptors: {request: new Interceptors(),response: new Interceptors(), + }, +}; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/core/request.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/core/request.ts index b018a07cae..9244bb611f 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/core/request.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/core/request.ts @@ -1,284 +1,298 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -import { ApiError } from './ApiError'; -import type { ApiRequestOptions } from './ApiRequestOptions'; -import type { ApiResult } from './ApiResult'; -import { CancelablePromise } from './CancelablePromise'; -import type { OnCancel } from './CancelablePromise'; -import type { OpenAPIConfig } from './OpenAPI'; +import { ApiError } from './ApiError.js'; +import type { ApiRequestOptions } from './ApiRequestOptions.js'; +import type { ApiResult } from './ApiResult.js'; +import { CancelablePromise } from './CancelablePromise.js'; +import type { OnCancel } from './CancelablePromise.js'; +import type { OpenAPIConfig } from './OpenAPI.js'; -export const isDefined = (value: T | null | undefined): value is Exclude => { - return value !== undefined && value !== null; +export const isString = (value: unknown): value is string => { + return typeof value === 'string'; }; -export const isString = (value: any): value is string => { - return typeof value === 'string'; -}; - -export const isStringWithValue = (value: any): value is string => { - return isString(value) && value !== ''; +export const isStringWithValue = (value: unknown): value is string => { + return isString(value) && value !== ''; }; export const isBlob = (value: any): value is Blob => { - return ( - typeof value === 'object' && - typeof value.type === 'string' && - typeof value.stream === 'function' && - typeof value.arrayBuffer === 'function' && - typeof value.constructor === 'function' && - typeof value.constructor.name === 'string' && - /^(Blob|File)$/.test(value.constructor.name) && - /^(Blob|File)$/.test(value[Symbol.toStringTag]) - ); + return value instanceof Blob; }; -export const isFormData = (value: any): value is FormData => { - return value instanceof FormData; +export const isFormData = (value: unknown): value is FormData => { + return value instanceof FormData; }; export const base64 = (str: string): string => { - try { - return btoa(str); - } catch (err) { - // @ts-ignore - return Buffer.from(str).toString('base64'); - } + try { + return btoa(str); + } catch (err) { + // @ts-ignore + return Buffer.from(str).toString('base64'); + } }; -export const getQueryString = (params: Record): string => { - const qs: string[] = []; +export const getQueryString = (params: Record): string => { + const qs: string[] = []; - const append = (key: string, value: any) => { - qs.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`); - }; + const append = (key: string, value: unknown) => { + qs.push(`${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`); + }; - const process = (key: string, value: any) => { - if (isDefined(value)) { - if (Array.isArray(value)) { - value.forEach(v => { - process(key, v); - }); - } else if (typeof value === 'object') { - Object.entries(value).forEach(([k, v]) => { - process(`${key}[${k}]`, v); - }); - } else { - append(key, value); - } - } - }; + const encodePair = (key: string, value: unknown) => { + if (value === undefined || value === null) { + return; + } - Object.entries(params).forEach(([key, value]) => { - process(key, value); - }); + if (Array.isArray(value)) { + value.forEach(v => encodePair(key, v)); + } else if (typeof value === 'object') { + Object.entries(value).forEach(([k, v]) => encodePair(`${key}[${k}]`, v)); + } else { + append(key, value); + } + }; - if (qs.length > 0) { - return `?${qs.join('&')}`; - } + Object.entries(params).forEach(([key, value]) => encodePair(key, value)); - return ''; + return qs.length ? `?${qs.join('&')}` : ''; }; const getUrl = (config: OpenAPIConfig, options: ApiRequestOptions): string => { - const encoder = config.ENCODE_PATH || encodeURI; + const encoder = config.ENCODE_PATH || encodeURI; - const path = options.url - .replace('{api-version}', config.VERSION) - .replace(/{(.*?)}/g, (substring: string, group: string) => { - if (options.path?.hasOwnProperty(group)) { - return encoder(String(options.path[group])); - } - return substring; - }); + const path = options.url + .replace('{api-version}', config.VERSION) + .replace(/{(.*?)}/g, (substring: string, group: string) => { + if (options.path?.hasOwnProperty(group)) { + return encoder(String(options.path[group])); + } + return substring; + }); - const url = `${config.BASE}${path}`; - if (options.query) { - return `${url}${getQueryString(options.query)}`; - } - return url; + const url = config.BASE + path; + return options.query ? url + getQueryString(options.query) : url; }; export const getFormData = (options: ApiRequestOptions): FormData | undefined => { - if (options.formData) { - const formData = new FormData(); + if (options.formData) { + const formData = new FormData(); - const process = (key: string, value: any) => { - if (isString(value) || isBlob(value)) { - formData.append(key, value); - } else { - formData.append(key, JSON.stringify(value)); - } - }; + const process = (key: string, value: unknown) => { + if (isString(value) || isBlob(value)) { + formData.append(key, value); + } else { + formData.append(key, JSON.stringify(value)); + } + }; - Object.entries(options.formData) - .filter(([_, value]) => isDefined(value)) - .forEach(([key, value]) => { - if (Array.isArray(value)) { - value.forEach(v => process(key, v)); - } else { - process(key, value); - } - }); + Object.entries(options.formData) + .filter(([, value]) => value !== undefined && value !== null) + .forEach(([key, value]) => { + if (Array.isArray(value)) { + value.forEach(v => process(key, v)); + } else { + process(key, value); + } + }); - return formData; - } - return undefined; + return formData; + } + return undefined; }; type Resolver = (options: ApiRequestOptions) => Promise; export const resolve = async (options: ApiRequestOptions, resolver?: T | Resolver): Promise => { - if (typeof resolver === 'function') { - return (resolver as Resolver)(options); - } - return resolver; + if (typeof resolver === 'function') { + return (resolver as Resolver)(options); + } + return resolver; }; export const getHeaders = async (config: OpenAPIConfig, options: ApiRequestOptions): Promise => { - const token = await resolve(options, config.TOKEN); - const username = await resolve(options, config.USERNAME); - const password = await resolve(options, config.PASSWORD); - const additionalHeaders = await resolve(options, config.HEADERS); + const [token, username, password, additionalHeaders] = await Promise.all([ + resolve(options, config.TOKEN), + resolve(options, config.USERNAME), + resolve(options, config.PASSWORD), + resolve(options, config.HEADERS), + ]); - const headers = Object.entries({ - Accept: 'application/json', - ...additionalHeaders, - ...options.headers, - }) - .filter(([_, value]) => isDefined(value)) - .reduce((headers, [key, value]) => ({ - ...headers, - [key]: String(value), - }), {} as Record); + const headers = Object.entries({ + Accept: 'application/json', + ...additionalHeaders, + ...options.headers, + }) + .filter(([, value]) => value !== undefined && value !== null) + .reduce((headers, [key, value]) => ({ + ...headers, + [key]: String(value), + }), {} as Record); - if (isStringWithValue(token)) { - headers['Authorization'] = `Bearer ${token}`; - } + if (isStringWithValue(token)) { + headers['Authorization'] = `Bearer ${token}`; + } - if (isStringWithValue(username) && isStringWithValue(password)) { - const credentials = base64(`${username}:${password}`); - headers['Authorization'] = `Basic ${credentials}`; - } + if (isStringWithValue(username) && isStringWithValue(password)) { + const credentials = base64(`${username}:${password}`); + headers['Authorization'] = `Basic ${credentials}`; + } - if (options.body) { - if (options.mediaType) { - headers['Content-Type'] = options.mediaType; - } else if (isBlob(options.body)) { - headers['Content-Type'] = options.body.type || 'application/octet-stream'; - } else if (isString(options.body)) { - headers['Content-Type'] = 'text/plain'; - } else if (!isFormData(options.body)) { - headers['Content-Type'] = 'application/json'; - } - } + if (options.body !== undefined) { + if (options.mediaType) { + headers['Content-Type'] = options.mediaType; + } else if (isBlob(options.body)) { + headers['Content-Type'] = options.body.type || 'application/octet-stream'; + } else if (isString(options.body)) { + headers['Content-Type'] = 'text/plain'; + } else if (!isFormData(options.body)) { + headers['Content-Type'] = 'application/json'; + } + } - return new Headers(headers); + return new Headers(headers); }; -export const getRequestBody = (options: ApiRequestOptions): any => { - if (options.body !== undefined) { - if (options.mediaType?.includes('/json')) { - return JSON.stringify(options.body) - } else if (isString(options.body) || isBlob(options.body) || isFormData(options.body)) { - return options.body; - } else { - return JSON.stringify(options.body); - } - } - return undefined; +export const getRequestBody = (options: ApiRequestOptions): unknown => { + if (options.body !== undefined) { + if (options.mediaType?.includes('application/json') || options.mediaType?.includes('+json')) { + return JSON.stringify(options.body) + } else if (isString(options.body) || isBlob(options.body) || isFormData(options.body)) { + return options.body; + } else { + return JSON.stringify(options.body); + } + } + return undefined; }; export const sendRequest = async ( - config: OpenAPIConfig, - options: ApiRequestOptions, - url: string, - body: any, - formData: FormData | undefined, - headers: Headers, - onCancel: OnCancel + config: OpenAPIConfig, + options: ApiRequestOptions, + url: string, + body: any, + formData: FormData | undefined, + headers: Headers, + onCancel: OnCancel ): Promise => { - const controller = new AbortController(); + const controller = new AbortController(); - const request: RequestInit = { - headers, - body: body ?? formData, - method: options.method, - signal: controller.signal, - }; + let request: RequestInit = { + headers, + body: body ?? formData, + method: options.method, + signal: controller.signal, + }; - if (config.WITH_CREDENTIALS) { - request.credentials = config.CREDENTIALS; - } + if (config.WITH_CREDENTIALS) { + request.credentials = config.CREDENTIALS; + } - onCancel(() => controller.abort()); + for (const fn of config.interceptors.request._fns) { + request = await fn(request) + } - return await fetch(url, request); + onCancel(() => controller.abort()); + + return await fetch(url, request); }; export const getResponseHeader = (response: Response, responseHeader?: string): string | undefined => { - if (responseHeader) { - const content = response.headers.get(responseHeader); - if (isString(content)) { - return content; - } - } - return undefined; + if (responseHeader) { + const content = response.headers.get(responseHeader); + if (isString(content)) { + return content; + } + } + return undefined; }; -export const getResponseBody = async (response: Response): Promise => { - if (response.status !== 204) { - try { - const contentType = response.headers.get('Content-Type'); - if (contentType) { - const jsonTypes = ['application/json', 'application/problem+json'] - const isJSON = jsonTypes.some(type => contentType.toLowerCase().startsWith(type)); - if (isJSON) { - return await response.json(); - } else { - return await response.text(); - } - } - } catch (error) { - console.error(error); - } - } - return undefined; +export const getResponseBody = async (response: Response): Promise => { + if (response.status !== 204) { + try { + const contentType = response.headers.get('Content-Type'); + if (contentType) { + const binaryTypes = ['application/octet-stream', 'application/pdf', 'application/zip', 'audio/', 'image/', 'video/']; + if (contentType.includes('application/json') || contentType.includes('+json')) { + return await response.json(); + } else if (binaryTypes.some(type => contentType.includes(type))) { + return await response.blob(); + } else if (contentType.includes('multipart/form-data')) { + return await response.formData(); + } else if (contentType.includes('text/')) { + return await response.text(); + } + } + } catch (error) { + console.error(error); + } + } + return undefined; }; export const catchErrorCodes = (options: ApiRequestOptions, result: ApiResult): void => { - const errors: Record = { - 400: 'Bad Request', - 401: 'Unauthorized', - 403: 'Forbidden', - 404: 'Not Found', - 500: 'Internal Server Error', - 502: 'Bad Gateway', - 503: 'Service Unavailable', - ...options.errors, - } + const errors: Record = { + 400: 'Bad Request', + 401: 'Unauthorized', + 402: 'Payment Required', + 403: 'Forbidden', + 404: 'Not Found', + 405: 'Method Not Allowed', + 406: 'Not Acceptable', + 407: 'Proxy Authentication Required', + 408: 'Request Timeout', + 409: 'Conflict', + 410: 'Gone', + 411: 'Length Required', + 412: 'Precondition Failed', + 413: 'Payload Too Large', + 414: 'URI Too Long', + 415: 'Unsupported Media Type', + 416: 'Range Not Satisfiable', + 417: 'Expectation Failed', + 418: 'Im a teapot', + 421: 'Misdirected Request', + 422: 'Unprocessable Content', + 423: 'Locked', + 424: 'Failed Dependency', + 425: 'Too Early', + 426: 'Upgrade Required', + 428: 'Precondition Required', + 429: 'Too Many Requests', + 431: 'Request Header Fields Too Large', + 451: 'Unavailable For Legal Reasons', + 500: 'Internal Server Error', + 501: 'Not Implemented', + 502: 'Bad Gateway', + 503: 'Service Unavailable', + 504: 'Gateway Timeout', + 505: 'HTTP Version Not Supported', + 506: 'Variant Also Negotiates', + 507: 'Insufficient Storage', + 508: 'Loop Detected', + 510: 'Not Extended', + 511: 'Network Authentication Required', + ...options.errors, + } - const error = errors[result.status]; - if (error) { - throw new ApiError(options, result, error); - } + const error = errors[result.status]; + if (error) { + throw new ApiError(options, result, error); + } - if (!result.ok) { - const errorStatus = result.status ?? 'unknown'; - const errorStatusText = result.statusText ?? 'unknown'; - const errorBody = (() => { - try { - return JSON.stringify(result.body, null, 2); - } catch (e) { - return undefined; - } - })(); + if (!result.ok) { + const errorStatus = result.status ?? 'unknown'; + const errorStatusText = result.statusText ?? 'unknown'; + const errorBody = (() => { + try { + return JSON.stringify(result.body, null, 2); + } catch (e) { + return undefined; + } + })(); - throw new ApiError(options, result, - `Generic Error: status: ${errorStatus}; status text: ${errorStatusText}; body: ${errorBody}` - ); - } + throw new ApiError(options, result, + `Generic Error: status: ${errorStatus}; status text: ${errorStatusText}; body: ${errorBody}` + ); + } }; /** @@ -289,32 +303,37 @@ export const catchErrorCodes = (options: ApiRequestOptions, result: ApiResult): * @throws ApiError */ export const request = (config: OpenAPIConfig, options: ApiRequestOptions): CancelablePromise => { - return new CancelablePromise(async (resolve, reject, onCancel) => { - try { - const url = getUrl(config, options); - const formData = getFormData(options); - const body = getRequestBody(options); - const headers = await getHeaders(config, options); + return new CancelablePromise(async (resolve, reject, onCancel) => { + try { + const url = getUrl(config, options); + const formData = getFormData(options); + const body = getRequestBody(options); + const headers = await getHeaders(config, options); - if (!onCancel.isCancelled) { - const response = await sendRequest(config, options, url, body, formData, headers, onCancel); - const responseBody = await getResponseBody(response); - const responseHeader = getResponseHeader(response, options.responseHeader); + if (!onCancel.isCancelled) { + let response = await sendRequest(config, options, url, body, formData, headers, onCancel); - const result: ApiResult = { - url, - ok: response.ok, - status: response.status, - statusText: response.statusText, - body: responseHeader ?? responseBody, - }; + for (const fn of config.interceptors.response._fns) { + response = await fn(response) + } - catchErrorCodes(options, result); + const responseBody = await getResponseBody(response); + const responseHeader = getResponseHeader(response, options.responseHeader); - resolve(result.body); - } - } catch (error) { - reject(error); - } - }); -}; + const result: ApiResult = { + url, + ok: response.ok, + status: response.status, + statusText: response.statusText, + body: responseHeader ?? responseBody, + }; + + catchErrorCodes(options, result); + + resolve(result.body); + } + } catch (error) { + reject(error); + } + }); +}; \ No newline at end of file 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 42633b3570..9f146905e1 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 @@ -1,445 +1,6 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -export { ApiError } from './core/ApiError'; -export { CancelablePromise, CancelError } from './core/CancelablePromise'; -export { OpenAPI } from './core/OpenAPI'; -export type { OpenAPIConfig } from './core/OpenAPI'; -export type { AllowedDocumentTypeModel } from './models/AllowedDocumentTypeModel'; -export type { AllowedMediaTypeModel } from './models/AllowedMediaTypeModel'; -export type { AuditLogEntityModel } from './models/AuditLogEntityModel'; -export type { AuditLogResponseModel } from './models/AuditLogResponseModel'; -export type { AuditLogWithUsernameResponseModel } from './models/AuditLogWithUsernameResponseModel'; -export { AuditTypeModel } from './models/AuditTypeModel'; -export type { AvailableDocumentTypeCompositionResponseModel } from './models/AvailableDocumentTypeCompositionResponseModel'; -export type { AvailableMediaTypeCompositionResponseModel } from './models/AvailableMediaTypeCompositionResponseModel'; -export type { AvailableMemberTypeCompositionResponseModel } from './models/AvailableMemberTypeCompositionResponseModel'; -export type { ChangePasswordCurrentUserRequestModel } from './models/ChangePasswordCurrentUserRequestModel'; -export type { ChangePasswordUserRequestModel } from './models/ChangePasswordUserRequestModel'; -export { CompositionTypeModel } from './models/CompositionTypeModel'; -export type { ConsentLevelPresentationModel } from './models/ConsentLevelPresentationModel'; -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 { CreateDataTypeRequestModel } from './models/CreateDataTypeRequestModel'; -export type { CreateDictionaryItemRequestModel } from './models/CreateDictionaryItemRequestModel'; -export type { CreateDocumentBlueprintFromDocumentRequestModel } from './models/CreateDocumentBlueprintFromDocumentRequestModel'; -export type { CreateDocumentBlueprintRequestModel } from './models/CreateDocumentBlueprintRequestModel'; -export type { CreateDocumentRequestModel } from './models/CreateDocumentRequestModel'; -export type { CreateDocumentTypePropertyTypeContainerRequestModel } from './models/CreateDocumentTypePropertyTypeContainerRequestModel'; -export type { CreateDocumentTypePropertyTypeRequestModel } from './models/CreateDocumentTypePropertyTypeRequestModel'; -export type { CreateDocumentTypeRequestModel } from './models/CreateDocumentTypeRequestModel'; -export type { CreateFolderRequestModel } from './models/CreateFolderRequestModel'; -export type { CreateInitialPasswordUserRequestModel } from './models/CreateInitialPasswordUserRequestModel'; -export type { CreateLanguageRequestModel } from './models/CreateLanguageRequestModel'; -export type { CreateMediaRequestModel } from './models/CreateMediaRequestModel'; -export type { CreateMediaTypePropertyTypeContainerRequestModel } from './models/CreateMediaTypePropertyTypeContainerRequestModel'; -export type { CreateMediaTypePropertyTypeRequestModel } from './models/CreateMediaTypePropertyTypeRequestModel'; -export type { CreateMediaTypeRequestModel } from './models/CreateMediaTypeRequestModel'; -export type { CreateMemberGroupRequestModel } from './models/CreateMemberGroupRequestModel'; -export type { CreateMemberRequestModel } from './models/CreateMemberRequestModel'; -export type { CreateMemberTypePropertyTypeContainerRequestModel } from './models/CreateMemberTypePropertyTypeContainerRequestModel'; -export type { CreateMemberTypePropertyTypeRequestModel } from './models/CreateMemberTypePropertyTypeRequestModel'; -export type { CreateMemberTypeRequestModel } from './models/CreateMemberTypeRequestModel'; -export type { CreatePackageRequestModel } from './models/CreatePackageRequestModel'; -export type { CreatePartialViewFolderRequestModel } from './models/CreatePartialViewFolderRequestModel'; -export type { CreatePartialViewRequestModel } from './models/CreatePartialViewRequestModel'; -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 { CreateUserGroupRequestModel } from './models/CreateUserGroupRequestModel'; -export type { CreateUserRequestModel } from './models/CreateUserRequestModel'; -export type { CreateWebhookRequestModel } from './models/CreateWebhookRequestModel'; -export type { CultureAndScheduleRequestModel } from './models/CultureAndScheduleRequestModel'; -export type { CultureReponseModel } from './models/CultureReponseModel'; -export type { CurrentUserResponseModel } from './models/CurrentUserResponseModel'; -export type { CurrenUserConfigurationResponseModel } from './models/CurrenUserConfigurationResponseModel'; -export type { DatabaseInstallRequestModel } from './models/DatabaseInstallRequestModel'; -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 { DataTypePropertyPresentationModel } from './models/DataTypePropertyPresentationModel'; -export type { DataTypePropertyReferenceModel } from './models/DataTypePropertyReferenceModel'; -export type { DataTypeReferenceResponseModel } from './models/DataTypeReferenceResponseModel'; -export type { DataTypeResponseModel } from './models/DataTypeResponseModel'; -export type { DataTypeTreeItemResponseModel } from './models/DataTypeTreeItemResponseModel'; -export type { DefaultReferenceResponseModel } from './models/DefaultReferenceResponseModel'; -export type { DeleteUserGroupsRequestModel } from './models/DeleteUserGroupsRequestModel'; -export type { DeleteUsersRequestModel } from './models/DeleteUsersRequestModel'; -export type { DictionaryItemItemResponseModel } from './models/DictionaryItemItemResponseModel'; -export type { DictionaryItemResponseModel } from './models/DictionaryItemResponseModel'; -export type { DictionaryItemTranslationModel } from './models/DictionaryItemTranslationModel'; -export type { DictionaryOverviewResponseModel } from './models/DictionaryOverviewResponseModel'; -export { DirectionModel } from './models/DirectionModel'; -export type { DisableUserRequestModel } from './models/DisableUserRequestModel'; -export type { DocumentBlueprintItemResponseModel } from './models/DocumentBlueprintItemResponseModel'; -export type { DocumentBlueprintResponseModel } from './models/DocumentBlueprintResponseModel'; -export type { DocumentBlueprintTreeItemResponseModel } from './models/DocumentBlueprintTreeItemResponseModel'; -export type { DocumentCollectionResponseModel } from './models/DocumentCollectionResponseModel'; -export type { DocumentConfigurationResponseModel } from './models/DocumentConfigurationResponseModel'; -export type { DocumentItemResponseModel } from './models/DocumentItemResponseModel'; -export type { DocumentNotificationResponseModel } from './models/DocumentNotificationResponseModel'; -export type { DocumentPermissionPresentationModel } from './models/DocumentPermissionPresentationModel'; -export type { DocumentRecycleBinItemResponseModel } from './models/DocumentRecycleBinItemResponseModel'; -export type { DocumentReferenceResponseModel } from './models/DocumentReferenceResponseModel'; -export type { DocumentResponseModel } from './models/DocumentResponseModel'; -export type { DocumentTreeItemResponseModel } from './models/DocumentTreeItemResponseModel'; -export type { DocumentTypeCleanupModel } from './models/DocumentTypeCleanupModel'; -export type { DocumentTypeCollectionReferenceResponseModel } from './models/DocumentTypeCollectionReferenceResponseModel'; -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 { DocumentUrlInfoModel } from './models/DocumentUrlInfoModel'; -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 { DocumentVariantStateModel } from './models/DocumentVariantStateModel'; -export type { DocumentVersionItemResponseModel } from './models/DocumentVersionItemResponseModel'; -export type { DocumentVersionResponseModel } from './models/DocumentVersionResponseModel'; -export type { DomainPresentationModel } from './models/DomainPresentationModel'; -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 { EventMessageTypeModel } from './models/EventMessageTypeModel'; -export type { FieldPresentationModel } from './models/FieldPresentationModel'; -export type { FileSystemFolderModel } from './models/FileSystemFolderModel'; -export type { FileSystemTreeItemPresentationModel } from './models/FileSystemTreeItemPresentationModel'; -export type { FolderResponseModel } from './models/FolderResponseModel'; -export type { HealthCheckActionRequestModel } from './models/HealthCheckActionRequestModel'; -export type { HealthCheckGroupPresentationModel } from './models/HealthCheckGroupPresentationModel'; -export type { HealthCheckGroupResponseModel } from './models/HealthCheckGroupResponseModel'; -export type { HealthCheckGroupWithResultResponseModel } from './models/HealthCheckGroupWithResultResponseModel'; -export type { HealthCheckModel } from './models/HealthCheckModel'; -export type { HealthCheckResultResponseModel } from './models/HealthCheckResultResponseModel'; -export type { HealthCheckWithResultPresentationModel } from './models/HealthCheckWithResultPresentationModel'; -export { HealthStatusModel } from './models/HealthStatusModel'; -export type { HelpPageResponseModel } from './models/HelpPageResponseModel'; -export type { ImportDictionaryRequestModel } from './models/ImportDictionaryRequestModel'; -export type { IndexResponseModel } from './models/IndexResponseModel'; -export type { InstallRequestModel } from './models/InstallRequestModel'; -export type { InstallSettingsResponseModel } from './models/InstallSettingsResponseModel'; -export type { InviteUserRequestModel } from './models/InviteUserRequestModel'; -export type { ItemReferenceByIdResponseModel } from './models/ItemReferenceByIdResponseModel'; -export type { ItemSortingRequestModel } from './models/ItemSortingRequestModel'; -export type { LanguageItemResponseModel } from './models/LanguageItemResponseModel'; -export type { LanguageResponseModel } from './models/LanguageResponseModel'; -export type { LinkedLoginModel } from './models/LinkedLoginModel'; -export type { LinkedLoginsRequestModel } from './models/LinkedLoginsRequestModel'; -export type { LoggerResponseModel } from './models/LoggerResponseModel'; -export type { LogLevelCountsReponseModel } from './models/LogLevelCountsReponseModel'; -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 { ManifestResponseModel } from './models/ManifestResponseModel'; -export type { MediaCollectionResponseModel } from './models/MediaCollectionResponseModel'; -export type { MediaConfigurationResponseModel } from './models/MediaConfigurationResponseModel'; -export type { MediaItemResponseModel } from './models/MediaItemResponseModel'; -export type { MediaRecycleBinItemResponseModel } from './models/MediaRecycleBinItemResponseModel'; -export type { MediaReferenceResponseModel } from './models/MediaReferenceResponseModel'; -export type { MediaResponseModel } from './models/MediaResponseModel'; -export type { MediaTreeItemResponseModel } from './models/MediaTreeItemResponseModel'; -export type { MediaTypeCollectionReferenceResponseModel } from './models/MediaTypeCollectionReferenceResponseModel'; -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 { MediaUrlInfoModel } from './models/MediaUrlInfoModel'; -export type { MediaValueModel } from './models/MediaValueModel'; -export type { MediaVariantRequestModel } from './models/MediaVariantRequestModel'; -export type { MediaVariantResponseModel } from './models/MediaVariantResponseModel'; -export type { MemberConfigurationResponseModel } from './models/MemberConfigurationResponseModel'; -export type { MemberGroupItemResponseModel } from './models/MemberGroupItemResponseModel'; -export type { MemberGroupResponseModel } from './models/MemberGroupResponseModel'; -export type { MemberItemResponseModel } from './models/MemberItemResponseModel'; -export type { MemberResponseModel } from './models/MemberResponseModel'; -export type { MemberTypeCompositionModel } from './models/MemberTypeCompositionModel'; -export type { MemberTypeCompositionRequestModel } from './models/MemberTypeCompositionRequestModel'; -export type { MemberTypeCompositionResponseModel } from './models/MemberTypeCompositionResponseModel'; -export type { MemberTypeItemResponseModel } from './models/MemberTypeItemResponseModel'; -export type { MemberTypePropertyTypeContainerResponseModel } from './models/MemberTypePropertyTypeContainerResponseModel'; -export type { MemberTypePropertyTypeResponseModel } from './models/MemberTypePropertyTypeResponseModel'; -export type { MemberTypePropertyTypeVisibilityModel } from './models/MemberTypePropertyTypeVisibilityModel'; -export type { MemberTypeReferenceResponseModel } from './models/MemberTypeReferenceResponseModel'; -export type { MemberTypeResponseModel } from './models/MemberTypeResponseModel'; -export type { MemberValueModel } from './models/MemberValueModel'; -export type { MemberVariantRequestModel } from './models/MemberVariantRequestModel'; -export type { MemberVariantResponseModel } from './models/MemberVariantResponseModel'; -export type { ModelsBuilderResponseModel } from './models/ModelsBuilderResponseModel'; -export { ModelsModeModel } from './models/ModelsModeModel'; -export type { MoveDataTypeRequestModel } from './models/MoveDataTypeRequestModel'; -export type { MoveDictionaryRequestModel } from './models/MoveDictionaryRequestModel'; -export type { MoveDocumentBlueprintRequestModel } from './models/MoveDocumentBlueprintRequestModel'; -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 { NoopSetupTwoFactorModel } from './models/NoopSetupTwoFactorModel'; -export type { NotificationHeaderModel } from './models/NotificationHeaderModel'; -export type { ObjectTypeResponseModel } from './models/ObjectTypeResponseModel'; -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 { PackageMigrationStatusResponseModel } from './models/PackageMigrationStatusResponseModel'; -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 { PagedDataTypeItemResponseModel } from './models/PagedDataTypeItemResponseModel'; -export type { PagedDataTypeTreeItemResponseModel } from './models/PagedDataTypeTreeItemResponseModel'; -export type { PagedDictionaryOverviewResponseModel } from './models/PagedDictionaryOverviewResponseModel'; -export type { PagedDocumentBlueprintTreeItemResponseModel } from './models/PagedDocumentBlueprintTreeItemResponseModel'; -export type { PagedDocumentCollectionResponseModel } from './models/PagedDocumentCollectionResponseModel'; -export type { PagedDocumentRecycleBinItemResponseModel } from './models/PagedDocumentRecycleBinItemResponseModel'; -export type { PagedDocumentTreeItemResponseModel } from './models/PagedDocumentTreeItemResponseModel'; -export type { PagedDocumentTypeTreeItemResponseModel } from './models/PagedDocumentTypeTreeItemResponseModel'; -export type { PagedDocumentVersionItemResponseModel } from './models/PagedDocumentVersionItemResponseModel'; -export type { PagedFileSystemTreeItemPresentationModel } from './models/PagedFileSystemTreeItemPresentationModel'; -export type { PagedHealthCheckGroupResponseModel } from './models/PagedHealthCheckGroupResponseModel'; -export type { PagedHelpPageResponseModel } from './models/PagedHelpPageResponseModel'; -export type { PagedIndexResponseModel } from './models/PagedIndexResponseModel'; -export type { PagedIReferenceResponseModel } from './models/PagedIReferenceResponseModel'; -export type { PagedLanguageResponseModel } from './models/PagedLanguageResponseModel'; -export type { PagedLoggerResponseModel } from './models/PagedLoggerResponseModel'; -export type { PagedLogMessageResponseModel } from './models/PagedLogMessageResponseModel'; -export type { PagedLogTemplateResponseModel } from './models/PagedLogTemplateResponseModel'; -export type { PagedMediaCollectionResponseModel } from './models/PagedMediaCollectionResponseModel'; -export type { PagedMediaRecycleBinItemResponseModel } from './models/PagedMediaRecycleBinItemResponseModel'; -export type { PagedMediaTreeItemResponseModel } from './models/PagedMediaTreeItemResponseModel'; -export type { PagedMediaTypeTreeItemResponseModel } from './models/PagedMediaTypeTreeItemResponseModel'; -export type { PagedMemberGroupResponseModel } from './models/PagedMemberGroupResponseModel'; -export type { PagedMemberResponseModel } from './models/PagedMemberResponseModel'; -export type { PagedModelDataTypeItemResponseModel } from './models/PagedModelDataTypeItemResponseModel'; -export type { PagedModelDocumentItemResponseModel } from './models/PagedModelDocumentItemResponseModel'; -export type { PagedModelDocumentTypeItemResponseModel } from './models/PagedModelDocumentTypeItemResponseModel'; -export type { PagedModelMediaItemResponseModel } from './models/PagedModelMediaItemResponseModel'; -export type { PagedModelMediaTypeItemResponseModel } from './models/PagedModelMediaTypeItemResponseModel'; -export type { PagedModelMemberItemResponseModel } from './models/PagedModelMemberItemResponseModel'; -export type { PagedModelMemberTypeItemResponseModel } from './models/PagedModelMemberTypeItemResponseModel'; -export type { PagedModelTemplateItemResponseModel } from './models/PagedModelTemplateItemResponseModel'; -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 { PagedRedirectUrlResponseModel } from './models/PagedRedirectUrlResponseModel'; -export type { PagedReferenceByIdModel } from './models/PagedReferenceByIdModel'; -export type { PagedRelationResponseModel } from './models/PagedRelationResponseModel'; -export type { PagedRelationTypeResponseModel } from './models/PagedRelationTypeResponseModel'; -export type { PagedSavedLogSearchResponseModel } from './models/PagedSavedLogSearchResponseModel'; -export type { PagedSearcherResponseModel } from './models/PagedSearcherResponseModel'; -export type { PagedSearchResultResponseModel } from './models/PagedSearchResultResponseModel'; -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 { PagedWebhookResponseModel } from './models/PagedWebhookResponseModel'; -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 { PasswordConfigurationResponseModel } from './models/PasswordConfigurationResponseModel'; -export type { ProblemDetails } from './models/ProblemDetails'; -export type { ProblemDetailsBuilderModel } from './models/ProblemDetailsBuilderModel'; -export type { ProfilingStatusRequestModel } from './models/ProfilingStatusRequestModel'; -export type { ProfilingStatusResponseModel } from './models/ProfilingStatusResponseModel'; -export type { PropertyTypeAppearanceModel } from './models/PropertyTypeAppearanceModel'; -export type { PropertyTypeValidationModel } from './models/PropertyTypeValidationModel'; -export type { PublicAccessRequestModel } from './models/PublicAccessRequestModel'; -export type { PublishDocumentRequestModel } from './models/PublishDocumentRequestModel'; -export type { PublishDocumentWithDescendantsRequestModel } from './models/PublishDocumentWithDescendantsRequestModel'; -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 { RelationReferenceModel } from './models/RelationReferenceModel'; -export type { RelationResponseModel } from './models/RelationResponseModel'; -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 { ResetPasswordUserResponseModel } from './models/ResetPasswordUserResponseModel'; -export { RuntimeLevelModel } from './models/RuntimeLevelModel'; -export { RuntimeModeModel } from './models/RuntimeModeModel'; -export type { SavedLogSearchRequestModel } from './models/SavedLogSearchRequestModel'; -export type { SavedLogSearchResponseModel } from './models/SavedLogSearchResponseModel'; -export type { ScheduleRequestModel } from './models/ScheduleRequestModel'; -export type { ScriptFolderResponseModel } from './models/ScriptFolderResponseModel'; -export type { ScriptItemResponseModel } from './models/ScriptItemResponseModel'; -export type { ScriptResponseModel } from './models/ScriptResponseModel'; -export type { SearcherResponseModel } from './models/SearcherResponseModel'; -export type { SearchResultResponseModel } from './models/SearchResultResponseModel'; -export type { SecurityConfigurationResponseModel } from './models/SecurityConfigurationResponseModel'; -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 { 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 { StylesheetResponseModel } from './models/StylesheetResponseModel'; -export type { TagResponseModel } from './models/TagResponseModel'; -export { TelemetryLevelModel } from './models/TelemetryLevelModel'; -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 { TemplateQueryExecuteFilterPresentationModel } from './models/TemplateQueryExecuteFilterPresentationModel'; -export type { TemplateQueryExecuteModel } from './models/TemplateQueryExecuteModel'; -export type { TemplateQueryExecuteSortModel } from './models/TemplateQueryExecuteSortModel'; -export type { TemplateQueryOperatorModel } from './models/TemplateQueryOperatorModel'; -export type { TemplateQueryPropertyPresentationModel } from './models/TemplateQueryPropertyPresentationModel'; -export { TemplateQueryPropertyTypeModel } from './models/TemplateQueryPropertyTypeModel'; -export type { TemplateQueryResultItemPresentationModel } from './models/TemplateQueryResultItemPresentationModel'; -export type { TemplateQueryResultResponseModel } from './models/TemplateQueryResultResponseModel'; -export type { TemplateQuerySettingsResponseModel } from './models/TemplateQuerySettingsResponseModel'; -export type { TemplateResponseModel } from './models/TemplateResponseModel'; -export type { TemporaryFileConfigurationResponseModel } from './models/TemporaryFileConfigurationResponseModel'; -export type { TemporaryFileResponseModel } from './models/TemporaryFileResponseModel'; -export type { TourStatusModel } from './models/TourStatusModel'; -export type { TrackedReferenceDocumentTypeModel } from './models/TrackedReferenceDocumentTypeModel'; -export type { TrackedReferenceMediaTypeModel } from './models/TrackedReferenceMediaTypeModel'; -export type { UnknownTypePermissionPresentationModel } from './models/UnknownTypePermissionPresentationModel'; -export type { UnlockUsersRequestModel } from './models/UnlockUsersRequestModel'; -export type { UnpublishDocumentRequestModel } from './models/UnpublishDocumentRequestModel'; -export type { UpdateDataTypeRequestModel } from './models/UpdateDataTypeRequestModel'; -export type { UpdateDictionaryItemRequestModel } from './models/UpdateDictionaryItemRequestModel'; -export type { UpdateDocumentBlueprintRequestModel } from './models/UpdateDocumentBlueprintRequestModel'; -export type { UpdateDocumentNotificationsRequestModel } from './models/UpdateDocumentNotificationsRequestModel'; -export type { UpdateDocumentRequestModel } from './models/UpdateDocumentRequestModel'; -export type { UpdateDocumentTypePropertyTypeContainerRequestModel } from './models/UpdateDocumentTypePropertyTypeContainerRequestModel'; -export type { UpdateDocumentTypePropertyTypeRequestModel } from './models/UpdateDocumentTypePropertyTypeRequestModel'; -export type { UpdateDocumentTypeRequestModel } from './models/UpdateDocumentTypeRequestModel'; -export type { UpdateDomainsRequestModel } from './models/UpdateDomainsRequestModel'; -export type { UpdateFolderResponseModel } from './models/UpdateFolderResponseModel'; -export type { UpdateLanguageRequestModel } from './models/UpdateLanguageRequestModel'; -export type { UpdateMediaRequestModel } from './models/UpdateMediaRequestModel'; -export type { UpdateMediaTypePropertyTypeContainerRequestModel } from './models/UpdateMediaTypePropertyTypeContainerRequestModel'; -export type { UpdateMediaTypePropertyTypeRequestModel } from './models/UpdateMediaTypePropertyTypeRequestModel'; -export type { UpdateMediaTypeRequestModel } from './models/UpdateMediaTypeRequestModel'; -export type { UpdateMemberGroupRequestModel } from './models/UpdateMemberGroupRequestModel'; -export type { UpdateMemberRequestModel } from './models/UpdateMemberRequestModel'; -export type { UpdateMemberTypePropertyTypeContainerRequestModel } from './models/UpdateMemberTypePropertyTypeContainerRequestModel'; -export type { UpdateMemberTypePropertyTypeRequestModel } from './models/UpdateMemberTypePropertyTypeRequestModel'; -export type { UpdateMemberTypeRequestModel } from './models/UpdateMemberTypeRequestModel'; -export type { UpdatePackageRequestModel } from './models/UpdatePackageRequestModel'; -export type { UpdatePartialViewRequestModel } from './models/UpdatePartialViewRequestModel'; -export type { UpdateScriptRequestModel } from './models/UpdateScriptRequestModel'; -export type { UpdateStylesheetRequestModel } from './models/UpdateStylesheetRequestModel'; -export type { UpdateTemplateRequestModel } from './models/UpdateTemplateRequestModel'; -export type { UpdateUserGroupRequestModel } from './models/UpdateUserGroupRequestModel'; -export type { UpdateUserGroupsOnUserRequestModel } from './models/UpdateUserGroupsOnUserRequestModel'; -export type { UpdateUserRequestModel } from './models/UpdateUserRequestModel'; -export type { UpdateWebhookRequestModel } from './models/UpdateWebhookRequestModel'; -export type { UpgradeSettingsResponseModel } from './models/UpgradeSettingsResponseModel'; -export type { UserConfigurationResponseModel } from './models/UserConfigurationResponseModel'; -export type { UserGroupItemResponseModel } from './models/UserGroupItemResponseModel'; -export type { UserGroupResponseModel } from './models/UserGroupResponseModel'; -export type { UserInstallRequestModel } from './models/UserInstallRequestModel'; -export type { UserItemResponseModel } from './models/UserItemResponseModel'; -export { UserOrderModel } from './models/UserOrderModel'; -export type { UserPermissionModel } from './models/UserPermissionModel'; -export type { UserPermissionsResponseModel } from './models/UserPermissionsResponseModel'; -export type { UserResponseModel } from './models/UserResponseModel'; -export type { UserSettingsPresentationModel } from './models/UserSettingsPresentationModel'; -export { UserStateModel } from './models/UserStateModel'; -export type { UserTourStatusesResponseModel } from './models/UserTourStatusesResponseModel'; -export type { UserTwoFactorProviderModel } from './models/UserTwoFactorProviderModel'; -export type { VariantItemResponseModel } from './models/VariantItemResponseModel'; -export type { VerifyInviteUserRequestModel } from './models/VerifyInviteUserRequestModel'; -export type { VerifyInviteUserResponseModel } from './models/VerifyInviteUserResponseModel'; -export type { VerifyResetPasswordResponseModel } from './models/VerifyResetPasswordResponseModel'; -export type { VerifyResetPasswordTokenRequestModel } from './models/VerifyResetPasswordTokenRequestModel'; -export type { WebhookEventResponseModel } from './models/WebhookEventResponseModel'; -export type { WebhookItemResponseModel } from './models/WebhookItemResponseModel'; -export type { WebhookResponseModel } from './models/WebhookResponseModel'; - -export { AuditLogResource } from './services/AuditLogResource'; -export { CultureResource } from './services/CultureResource'; -export { DataTypeResource } from './services/DataTypeResource'; -export { DictionaryResource } from './services/DictionaryResource'; -export { DocumentResource } from './services/DocumentResource'; -export { DocumentBlueprintResource } from './services/DocumentBlueprintResource'; -export { DocumentTypeResource } from './services/DocumentTypeResource'; -export { DocumentVersionResource } from './services/DocumentVersionResource'; -export { DynamicRootResource } from './services/DynamicRootResource'; -export { HealthCheckResource } from './services/HealthCheckResource'; -export { HelpResource } from './services/HelpResource'; -export { IndexerResource } from './services/IndexerResource'; -export { InstallResource } from './services/InstallResource'; -export { LanguageResource } from './services/LanguageResource'; -export { LogViewerResource } from './services/LogViewerResource'; -export { ManifestResource } from './services/ManifestResource'; -export { MediaResource } from './services/MediaResource'; -export { MediaTypeResource } from './services/MediaTypeResource'; -export { MemberResource } from './services/MemberResource'; -export { MemberGroupResource } from './services/MemberGroupResource'; -export { MemberTypeResource } from './services/MemberTypeResource'; -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'; -export { RedirectManagementResource } from './services/RedirectManagementResource'; -export { RelationResource } from './services/RelationResource'; -export { RelationTypeResource } from './services/RelationTypeResource'; -export { ScriptResource } from './services/ScriptResource'; -export { SearcherResource } from './services/SearcherResource'; -export { SecurityResource } from './services/SecurityResource'; -export { ServerResource } from './services/ServerResource'; -export { StaticFileResource } from './services/StaticFileResource'; -export { StylesheetResource } from './services/StylesheetResource'; -export { TagResource } from './services/TagResource'; -export { TelemetryResource } from './services/TelemetryResource'; -export { TemplateResource } from './services/TemplateResource'; -export { TemporaryFileResource } from './services/TemporaryFileResource'; -export { TourResource } from './services/TourResource'; -export { UpgradeResource } from './services/UpgradeResource'; -export { UserResource } from './services/UserResource'; -export { UserGroupResource } from './services/UserGroupResource'; -export { WebhookResource } from './services/WebhookResource'; +export { ApiError } from './core/ApiError.js'; +export { CancelablePromise, CancelError } from './core/CancelablePromise.js'; +export { OpenAPI, type OpenAPIConfig } from './core/OpenAPI.js'; +export * from './models.js'; +export * from './services.js'; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models.ts new file mode 100644 index 0000000000..bb59103d75 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models.ts @@ -0,0 +1,5153 @@ + + +export type AllowedDocumentTypeModel = { + id: string +name: string +description?: string | null +icon?: string | null + }; + +export type AllowedMediaTypeModel = { + id: string +name: string +description?: string | null +icon?: string | null + }; + +export type AuditLogEntityModel = { + id?: string | null +type?: string | null + }; + +export type AuditLogResponseModel = { + user: ReferenceByIdModel +entity?: AuditLogEntityModel | null +timestamp: string +logType: AuditTypeModel +comment?: string | null +parameters?: string | null + }; + +export type AuditLogWithUsernameResponseModel = { + user: ReferenceByIdModel +entity?: AuditLogEntityModel | null +timestamp: string +logType: AuditTypeModel +comment?: string | null +parameters?: string | null +userName?: string | null +userAvatars: Array + }; + +export enum AuditTypeModel { + NEW = 'New', + SAVE = 'Save', + SAVE_VARIANT = 'SaveVariant', + OPEN = 'Open', + DELETE = 'Delete', + PUBLISH = 'Publish', + PUBLISH_VARIANT = 'PublishVariant', + SEND_TO_PUBLISH = 'SendToPublish', + SEND_TO_PUBLISH_VARIANT = 'SendToPublishVariant', + UNPUBLISH = 'Unpublish', + UNPUBLISH_VARIANT = 'UnpublishVariant', + MOVE = 'Move', + COPY = 'Copy', + ASSIGN_DOMAIN = 'AssignDomain', + PUBLIC_ACCESS = 'PublicAccess', + SORT = 'Sort', + NOTIFY = 'Notify', + SYSTEM = 'System', + ROLL_BACK = 'RollBack', + PACKAGER_INSTALL = 'PackagerInstall', + PACKAGER_UNINSTALL = 'PackagerUninstall', + CUSTOM = 'Custom', + CONTENT_VERSION_PREVENT_CLEANUP = 'ContentVersionPreventCleanup', + CONTENT_VERSION_ENABLE_CLEANUP = 'ContentVersionEnableCleanup' +} + +export type AvailableDocumentTypeCompositionResponseModel = { + id: string +name: string +icon: string +folderPath: Array +isCompatible: boolean + }; + +export type AvailableMediaTypeCompositionResponseModel = { + id: string +name: string +icon: string +folderPath: Array +isCompatible: boolean + }; + +export type AvailableMemberTypeCompositionResponseModel = { + id: string +name: string +icon: string +folderPath: Array +isCompatible: boolean + }; + +export type ChangePasswordCurrentUserRequestModel = { + newPassword: string +oldPassword?: string | null + }; + +export type ChangePasswordUserRequestModel = { + newPassword: string + }; + +export enum CompositionTypeModel { + COMPOSITION = 'Composition', + INHERITANCE = 'Inheritance' +} + +export type ConsentLevelPresentationModel = { + level: TelemetryLevelModel +description: string + }; + +export type CopyDataTypeRequestModel = { + target?: ReferenceByIdModel | null + }; + +export type CopyDocumentRequestModel = { + target?: ReferenceByIdModel | null +relateToOriginal: boolean +includeDescendants: boolean + }; + +export type CopyDocumentTypeRequestModel = { + target?: ReferenceByIdModel | null + }; + +export type CopyMediaTypeRequestModel = { + target?: ReferenceByIdModel | null + }; + +export type CreateDataTypeRequestModel = { + name: string +editorAlias: string +editorUiAlias?: string | null +values: Array +id?: string | null +parent?: ReferenceByIdModel | null + }; + +export type CreateDictionaryItemRequestModel = { + name: string +translations: Array +id?: string | null +parent?: ReferenceByIdModel | null + }; + +export type CreateDocumentBlueprintFromDocumentRequestModel = { + document: ReferenceByIdModel +id?: string | null +name: string +parent?: ReferenceByIdModel | null + }; + +export type CreateDocumentBlueprintRequestModel = { + values: Array +variants: Array +id?: string | null +parent?: ReferenceByIdModel | null +documentType: ReferenceByIdModel + }; + +export type CreateDocumentRequestModel = { + values: Array +variants: Array +id?: string | null +parent?: ReferenceByIdModel | null +documentType: ReferenceByIdModel +template?: ReferenceByIdModel | null + }; + +export type CreateDocumentTypePropertyTypeContainerRequestModel = { + id: string +parent?: ReferenceByIdModel | null +name?: string | null +type: string +sortOrder: number + }; + +export type CreateDocumentTypePropertyTypeRequestModel = { + id: string +container?: ReferenceByIdModel | null +sortOrder: number +alias: string +name: string +description?: string | null +dataType: ReferenceByIdModel +variesByCulture: boolean +variesBySegment: boolean +validation: PropertyTypeValidationModel +appearance: PropertyTypeAppearanceModel + }; + +export type CreateDocumentTypeRequestModel = { + alias: string +name: string +description?: string | null +icon: string +allowedAsRoot: boolean +variesByCulture: boolean +variesBySegment: boolean +collection?: ReferenceByIdModel | null +isElement: boolean +properties: Array +containers: Array +id?: string | null +parent?: ReferenceByIdModel | null +allowedTemplates: Array +defaultTemplate?: ReferenceByIdModel | null +cleanup: DocumentTypeCleanupModel +allowedDocumentTypes: Array +compositions: Array + }; + +export type CreateFolderRequestModel = { + name: string +id?: string | null +parent?: ReferenceByIdModel | null + }; + +export type CreateInitialPasswordUserRequestModel = { + user: ReferenceByIdModel +token: string +password: string + }; + +export type CreateLanguageRequestModel = { + name: string +isDefault: boolean +isMandatory: boolean +fallbackIsoCode?: string | null +isoCode: string + }; + +export type CreateMediaRequestModel = { + values: Array +variants: Array +id?: string | null +parent?: ReferenceByIdModel | null +mediaType: ReferenceByIdModel + }; + +export type CreateMediaTypePropertyTypeContainerRequestModel = { + id: string +parent?: ReferenceByIdModel | null +name?: string | null +type: string +sortOrder: number + }; + +export type CreateMediaTypePropertyTypeRequestModel = { + id: string +container?: ReferenceByIdModel | null +sortOrder: number +alias: string +name: string +description?: string | null +dataType: ReferenceByIdModel +variesByCulture: boolean +variesBySegment: boolean +validation: PropertyTypeValidationModel +appearance: PropertyTypeAppearanceModel + }; + +export type CreateMediaTypeRequestModel = { + alias: string +name: string +description?: string | null +icon: string +allowedAsRoot: boolean +variesByCulture: boolean +variesBySegment: boolean +isElement: boolean +properties: Array +containers: Array +id?: string | null +parent?: ReferenceByIdModel | null +allowedMediaTypes: Array +compositions: Array +collection?: ReferenceByIdModel | null + }; + +export type CreateMemberGroupRequestModel = { + name: string +id?: string | null + }; + +export type CreateMemberRequestModel = { + values: Array +variants: Array +id?: string | null +email: string +username: string +password: string +memberType: ReferenceByIdModel +groups?: Array | null +isApproved: boolean + }; + +export type CreateMemberTypePropertyTypeContainerRequestModel = { + id: string +parent?: ReferenceByIdModel | null +name?: string | null +type: string +sortOrder: number + }; + +export type CreateMemberTypePropertyTypeRequestModel = { + id: string +container?: ReferenceByIdModel | null +sortOrder: number +alias: string +name: string +description?: string | null +dataType: ReferenceByIdModel +variesByCulture: boolean +variesBySegment: boolean +validation: PropertyTypeValidationModel +appearance: PropertyTypeAppearanceModel +isSensitive: boolean +visibility: MemberTypePropertyTypeVisibilityModel + }; + +export type CreateMemberTypeRequestModel = { + alias: string +name: string +description?: string | null +icon: string +allowedAsRoot: boolean +variesByCulture: boolean +variesBySegment: boolean +collection?: ReferenceByIdModel | null +isElement: boolean +properties: Array +containers: Array +id?: string | null +compositions: Array + }; + +export type CreatePackageRequestModel = { + name: string +contentNodeId?: string | null +contentLoadChildNodes: boolean +mediaIds: Array +mediaLoadChildNodes: boolean +documentTypes: Array +mediaTypes: Array +dataTypes: Array +templates: Array +partialViews: Array +stylesheets: Array +scripts: Array +languages: Array +dictionaryItems: Array + }; + +export type CreatePartialViewFolderRequestModel = { + name: string +parent?: FileSystemFolderModel | null + }; + +export type CreatePartialViewRequestModel = { + name: string +parent?: FileSystemFolderModel | null +content: string + }; + +export type CreateScriptFolderRequestModel = { + name: string +parent?: FileSystemFolderModel | null + }; + +export type CreateScriptRequestModel = { + name: string +parent?: FileSystemFolderModel | null +content: string + }; + +export type CreateStylesheetFolderRequestModel = { + name: string +parent?: FileSystemFolderModel | null + }; + +export type CreateStylesheetRequestModel = { + name: string +parent?: FileSystemFolderModel | null +content: string + }; + +export type CreateTemplateRequestModel = { + name: string +alias: string +content?: string | null +id?: string | null + }; + +export type CreateUserDataRequestModel = { + group: string +identifier: string +value: string +key?: string | null + }; + +export type CreateUserGroupRequestModel = { + name: string +icon?: string | null +sections: Array +languages: Array +hasAccessToAllLanguages: boolean +documentStartNode?: ReferenceByIdModel | null +documentRootAccess: boolean +mediaStartNode?: ReferenceByIdModel | null +mediaRootAccess: boolean +fallbackPermissions: Array +permissions: Array + }; + +export type CreateUserRequestModel = { + email: string +userName: string +name: string +userGroupIds: Array +id?: string | null + }; + +export type CreateWebhookRequestModel = { + enabled: boolean +url: string +contentTypeKeys: Array +headers: Record +id?: string | null +events: Array + }; + +export type CultureAndScheduleRequestModel = { + culture?: string | null +schedule?: ScheduleRequestModel | null + }; + +export type CultureReponseModel = { + name: string +englishName: string + }; + +export type CurrenUserConfigurationResponseModel = { + keepUserLoggedIn: boolean +usernameIsEmail: boolean +passwordConfiguration: PasswordConfigurationResponseModel + }; + +export type CurrentUserResponseModel = { + id: string +email: string +userName: string +name: string +languageIsoCode?: string | null +documentStartNodeIds: Array +mediaStartNodeIds: Array +avatarUrls: Array +languages: Array +hasAccessToAllLanguages: boolean +hasAccessToSensitiveData: boolean +fallbackPermissions: Array +permissions: Array +allowedSections: Array +isAdmin: boolean + }; + +export enum DataTypeChangeModeModel { + TRUE = 'True', + FALSE = 'False', + FALSE_WITH_HELP_TEXT = 'FalseWithHelpText' +} + +export type DataTypeItemResponseModel = { + id: string +name: string +editorUiAlias?: string | null +isDeletable: boolean + }; + +export type DataTypePropertyPresentationModel = { + alias: string +value?: unknown + }; + +export type DataTypePropertyReferenceModel = { + name: string +alias: string + }; + +export type DataTypeReferenceResponseModel = { + id: string +type: string +properties: Array + }; + +export type DataTypeResponseModel = { + name: string +editorAlias: string +editorUiAlias?: string | null +values: Array +id: string +isDeletable: boolean +canIgnoreStartNodes: boolean + }; + +export type DataTypeTreeItemResponseModel = { + hasChildren: boolean +id: string +parent?: ReferenceByIdModel | null +name: string +isFolder: boolean +editorUiAlias?: string | null +isDeletable: boolean + }; + +export type DatabaseInstallRequestModel = { + id: string +providerName: string +server?: string | null +name?: string | null +username?: string | null +password?: string | null +useIntegratedAuthentication: boolean +connectionString?: string | null +trustServerCertificate: boolean + }; + +export type DatabaseSettingsPresentationModel = { + id: string +sortOrder: number +displayName: string +defaultDatabaseName: string +providerName: string +isConfigured: boolean +requiresServer: boolean +serverPlaceholder: string +requiresCredentials: boolean +supportsIntegratedAuthentication: boolean +requiresConnectionTest: boolean + }; + +export type DatatypeConfigurationResponseModel = { + canBeChanged: DataTypeChangeModeModel +documentListViewId: string +mediaListViewId: string +memberListViewId: string + }; + +export type DefaultReferenceResponseModel = { + id: string +name?: string | null +type?: string | null +icon?: string | null + }; + +export type DeleteUserGroupsRequestModel = { + userGroupIds: Array + }; + +export type DeleteUsersRequestModel = { + userIds: Array + }; + +export type DictionaryItemItemResponseModel = { + id: string +name: string + }; + +export type DictionaryItemResponseModel = { + name: string +translations: Array +id: string + }; + +export type DictionaryItemTranslationModel = { + isoCode: string +translation: string + }; + +export type DictionaryOverviewResponseModel = { + name?: string | null +id: string +parent?: ReferenceByIdModel | null +translatedIsoCodes: Array + }; + +export enum DirectionModel { + ASCENDING = 'Ascending', + DESCENDING = 'Descending' +} + +export type DisableUserRequestModel = { + userIds: Array + }; + +export type DocumentBlueprintItemResponseModel = { + id: string +name: string +documentType: DocumentTypeReferenceResponseModel + }; + +export type DocumentBlueprintResponseModel = { + values: Array +variants: Array +id: string +documentType: DocumentTypeReferenceResponseModel + }; + +export type DocumentBlueprintTreeItemResponseModel = { + hasChildren: boolean +id: string +parent?: ReferenceByIdModel | null +name: string +isFolder: boolean +documentType?: DocumentTypeReferenceResponseModel | null + }; + +export type DocumentCollectionResponseModel = { + values: Array +variants: Array +id: string +creator?: string | null +sortOrder: number +documentType: DocumentTypeCollectionReferenceResponseModel +updater?: string | null + }; + +export type DocumentConfigurationResponseModel = { + sanitizeTinyMce: boolean +disableDeleteWhenReferenced: boolean +disableUnpublishWhenReferenced: boolean +allowEditInvariantFromNonDefault: boolean +allowNonExistingSegmentsCreation: boolean +reservedFieldNames: Array + }; + +export type DocumentItemResponseModel = { + id: string +isTrashed: boolean +isProtected: boolean +documentType: DocumentTypeReferenceResponseModel +variants: Array + }; + +export type DocumentNotificationResponseModel = { + actionId: string +subscribed: boolean + }; + +export type DocumentPermissionPresentationModel = { + $type: string +document: ReferenceByIdModel +verbs: Array + }; + +export type DocumentRecycleBinItemResponseModel = { + id: string +hasChildren: boolean +parent?: ItemReferenceByIdResponseModel | null +documentType: DocumentTypeReferenceResponseModel +variants: Array + }; + +export type DocumentReferenceResponseModel = { + id: string +name?: string | null +published?: boolean | null +documentType: TrackedReferenceDocumentTypeModel + }; + +export type DocumentResponseModel = { + values: Array +variants: Array +id: string +documentType: DocumentTypeReferenceResponseModel +urls: Array +template?: ReferenceByIdModel | null +isTrashed: boolean + }; + +export type DocumentTreeItemResponseModel = { + hasChildren: boolean +parent?: ReferenceByIdModel | null +noAccess: boolean +isTrashed: boolean +id: string +isProtected: boolean +documentType: DocumentTypeReferenceResponseModel +variants: Array + }; + +export type DocumentTypeCleanupModel = { + preventCleanup: boolean +keepAllVersionsNewerThanDays?: number | null +keepLatestVersionPerDayForDays?: number | null + }; + +export type DocumentTypeCollectionReferenceResponseModel = { + id: string +alias: string +icon: string + }; + +export type DocumentTypeCompositionModel = { + documentType: ReferenceByIdModel +compositionType: CompositionTypeModel + }; + +export type DocumentTypeCompositionRequestModel = { + id?: string | null +currentPropertyAliases: Array +currentCompositeIds: Array +isElement: boolean + }; + +export type DocumentTypeCompositionResponseModel = { + id: string +name: string +icon: string + }; + +export type DocumentTypeConfigurationResponseModel = { + dataTypesCanBeChanged: DataTypeChangeModeModel +disableTemplates: boolean +useSegments: boolean + }; + +export type DocumentTypeItemResponseModel = { + id: string +name: string +isElement: boolean +icon?: string | null + }; + +export type DocumentTypePropertyTypeContainerResponseModel = { + id: string +parent?: ReferenceByIdModel | null +name?: string | null +type: string +sortOrder: number + }; + +export type DocumentTypePropertyTypeResponseModel = { + id: string +container?: ReferenceByIdModel | null +sortOrder: number +alias: string +name: string +description?: string | null +dataType: ReferenceByIdModel +variesByCulture: boolean +variesBySegment: boolean +validation: PropertyTypeValidationModel +appearance: PropertyTypeAppearanceModel + }; + +export type DocumentTypeReferenceResponseModel = { + id: string +icon: string +collection?: ReferenceByIdModel | null + }; + +export type DocumentTypeResponseModel = { + alias: string +name: string +description?: string | null +icon: string +allowedAsRoot: boolean +variesByCulture: boolean +variesBySegment: boolean +collection?: ReferenceByIdModel | null +isElement: boolean +properties: Array +containers: Array +id: string +allowedTemplates: Array +defaultTemplate?: ReferenceByIdModel | null +cleanup: DocumentTypeCleanupModel +allowedDocumentTypes: Array +compositions: Array + }; + +export type DocumentTypeSortModel = { + documentType: ReferenceByIdModel +sortOrder: number + }; + +export type DocumentTypeTreeItemResponseModel = { + hasChildren: boolean +id: string +parent?: ReferenceByIdModel | null +name: string +isFolder: boolean +isElement: boolean +icon: string + }; + +export type DocumentUrlInfoModel = { + culture?: string | null +url: string + }; + +export type DocumentValueModel = { + culture?: string | null +segment?: string | null +alias: string +value?: unknown + }; + +export type DocumentVariantItemResponseModel = { + name: string +culture?: string | null +state: DocumentVariantStateModel + }; + +export type DocumentVariantRequestModel = { + culture?: string | null +segment?: string | null +name: string + }; + +export type DocumentVariantResponseModel = { + culture?: string | null +segment?: string | null +name: string +createDate: string +updateDate: string +state: DocumentVariantStateModel +publishDate?: string | null + }; + +export enum DocumentVariantStateModel { + NOT_CREATED = 'NotCreated', + DRAFT = 'Draft', + PUBLISHED = 'Published', + PUBLISHED_PENDING_CHANGES = 'PublishedPendingChanges' +} + +export type DocumentVersionItemResponseModel = { + id: string +document: ReferenceByIdModel +documentType: ReferenceByIdModel +user: ReferenceByIdModel +versionDate: string +isCurrentPublishedVersion: boolean +isCurrentDraftVersion: boolean +preventCleanup: boolean + }; + +export type DocumentVersionResponseModel = { + values: Array +variants: Array +id: string +documentType: DocumentTypeReferenceResponseModel +document?: ReferenceByIdModel | null + }; + +export type DomainPresentationModel = { + domainName: string +isoCode: string + }; + +export type DomainsResponseModel = { + defaultIsoCode?: string | null +domains: Array + }; + +export type DynamicRootContextRequestModel = { + id?: string | null +parent: ReferenceByIdModel +culture?: string | null +segment?: string | null + }; + +export type DynamicRootQueryOriginRequestModel = { + alias: string +id?: string | null + }; + +export type DynamicRootQueryRequestModel = { + origin: DynamicRootQueryOriginRequestModel +steps: Array + }; + +export type DynamicRootQueryStepRequestModel = { + alias: string +documentTypeIds: Array + }; + +export type DynamicRootRequestModel = { + context: DynamicRootContextRequestModel +query: DynamicRootQueryRequestModel + }; + +export type DynamicRootResponseModel = { + roots: Array + }; + +export type EnableTwoFactorRequestModel = { + code: string +secret: string + }; + +export type EnableUserRequestModel = { + userIds: Array + }; + +export enum EventMessageTypeModel { + DEFAULT = 'Default', + INFO = 'Info', + ERROR = 'Error', + SUCCESS = 'Success', + WARNING = 'Warning' +} + +export type FieldPresentationModel = { + name: string +values: Array + }; + +export type FileSystemFolderModel = { + path: string + }; + +export type FileSystemTreeItemPresentationModel = { + hasChildren: boolean +name: string +path: string +parent?: FileSystemFolderModel | null +isFolder: boolean + }; + +export type FolderResponseModel = { + name: string +id: string + }; + +export type HealthCheckActionRequestModel = { + healthCheck: ReferenceByIdModel +alias?: string | null +name?: string | null +description?: string | null +valueRequired: boolean +providedValue?: string | null +providedValueValidation?: string | null +providedValueValidationRegex?: string | null + }; + +export type HealthCheckGroupPresentationModel = { + name: string +checks: Array + }; + +export type HealthCheckGroupResponseModel = { + name: string + }; + +export type HealthCheckGroupWithResultResponseModel = { + checks: Array + }; + +export type HealthCheckModel = { + id: string +name: string +description?: string | null + }; + +export type HealthCheckResultResponseModel = { + message: string +resultType: StatusResultTypeModel +actions?: Array | null +readMoreLink?: string | null + }; + +export type HealthCheckWithResultPresentationModel = { + id: string +results?: Array | null + }; + +export enum HealthStatusModel { + HEALTHY = 'Healthy', + UNHEALTHY = 'Unhealthy', + REBUILDING = 'Rebuilding' +} + +export type HelpPageResponseModel = { + name?: string | null +description?: string | null +url?: string | null +type?: string | null + }; + +export type ImportDictionaryRequestModel = { + temporaryFile: ReferenceByIdModel +parent?: ReferenceByIdModel | null + }; + +export type IndexResponseModel = { + name: string +healthStatus: HealthStatusModel +canRebuild: boolean +searcherName: string +documentCount: number +fieldCount: number +providerProperties?: Record | null + }; + +export type InstallRequestModel = { + user: UserInstallRequestModel +database: DatabaseInstallRequestModel +telemetryLevel: TelemetryLevelModel + }; + +export type InstallSettingsResponseModel = { + user: UserSettingsPresentationModel +databases: Array + }; + +export type InviteUserRequestModel = { + email: string +userName: string +name: string +userGroupIds: Array +id?: string | null +message?: string | null + }; + +export type ItemReferenceByIdResponseModel = { + id: string + }; + +export type ItemSortingRequestModel = { + id: string +sortOrder: number + }; + +export type LanguageItemResponseModel = { + name: string +isoCode: string + }; + +export type LanguageResponseModel = { + name: string +isDefault: boolean +isMandatory: boolean +fallbackIsoCode?: string | null +isoCode: string + }; + +export type LinkedLoginModel = { + providerName: string +providerKey: string + }; + +export type LinkedLoginsRequestModel = { + linkedLogins: Array + }; + +export type LogLevelCountsReponseModel = { + information: number +debug: number +warning: number +error: number +fatal: number + }; + +export enum LogLevelModel { + VERBOSE = 'Verbose', + DEBUG = 'Debug', + INFORMATION = 'Information', + WARNING = 'Warning', + ERROR = 'Error', + FATAL = 'Fatal' +} + +export type LogMessagePropertyPresentationModel = { + name: string +value?: string | null + }; + +export type LogMessageResponseModel = { + timestamp: string +level: LogLevelModel +messageTemplate?: string | null +renderedMessage?: string | null +properties: Array +exception?: string | null + }; + +export type LogTemplateResponseModel = { + messageTemplate?: string | null +count: number + }; + +export type LoggerResponseModel = { + name: string +level: LogLevelModel + }; + +export type ManifestResponseModel = { + name: string +version?: string | null +extensions: Array + }; + +export type MediaCollectionResponseModel = { + values: Array +variants: Array +id: string +creator?: string | null +sortOrder: number +mediaType: MediaTypeCollectionReferenceResponseModel + }; + +export type MediaConfigurationResponseModel = { + disableDeleteWhenReferenced: boolean +disableUnpublishWhenReferenced: boolean +sanitizeTinyMce: boolean +reservedFieldNames: Array + }; + +export type MediaItemResponseModel = { + id: string +isTrashed: boolean +mediaType: MediaTypeReferenceResponseModel +variants: Array + }; + +export type MediaRecycleBinItemResponseModel = { + id: string +hasChildren: boolean +parent?: ItemReferenceByIdResponseModel | null +mediaType: MediaTypeReferenceResponseModel +variants: Array + }; + +export type MediaReferenceResponseModel = { + id: string +name?: string | null +mediaType: TrackedReferenceMediaTypeModel + }; + +export type MediaResponseModel = { + values: Array +variants: Array +id: string +urls: Array +isTrashed: boolean +mediaType: MediaTypeReferenceResponseModel + }; + +export type MediaTreeItemResponseModel = { + hasChildren: boolean +parent?: ReferenceByIdModel | null +noAccess: boolean +isTrashed: boolean +id: string +mediaType: MediaTypeReferenceResponseModel +variants: Array + }; + +export type MediaTypeCollectionReferenceResponseModel = { + id: string +alias: string +icon: string + }; + +export type MediaTypeCompositionModel = { + mediaType: ReferenceByIdModel +compositionType: CompositionTypeModel + }; + +export type MediaTypeCompositionRequestModel = { + id?: string | null +currentPropertyAliases: Array +currentCompositeIds: Array + }; + +export type MediaTypeCompositionResponseModel = { + id: string +name: string +icon: string + }; + +export type MediaTypeItemResponseModel = { + id: string +name: string +icon?: string | null + }; + +export type MediaTypePropertyTypeContainerResponseModel = { + id: string +parent?: ReferenceByIdModel | null +name?: string | null +type: string +sortOrder: number + }; + +export type MediaTypePropertyTypeResponseModel = { + id: string +container?: ReferenceByIdModel | null +sortOrder: number +alias: string +name: string +description?: string | null +dataType: ReferenceByIdModel +variesByCulture: boolean +variesBySegment: boolean +validation: PropertyTypeValidationModel +appearance: PropertyTypeAppearanceModel + }; + +export type MediaTypeReferenceResponseModel = { + id: string +icon: string +collection?: ReferenceByIdModel | null + }; + +export type MediaTypeResponseModel = { + alias: string +name: string +description?: string | null +icon: string +allowedAsRoot: boolean +variesByCulture: boolean +variesBySegment: boolean +collection?: ReferenceByIdModel | null +isElement: boolean +properties: Array +containers: Array +id: string +allowedMediaTypes: Array +compositions: Array + }; + +export type MediaTypeSortModel = { + mediaType: ReferenceByIdModel +sortOrder: number + }; + +export type MediaTypeTreeItemResponseModel = { + hasChildren: boolean +id: string +parent?: ReferenceByIdModel | null +name: string +isFolder: boolean +icon: string + }; + +export type MediaUrlInfoModel = { + culture?: string | null +url: string + }; + +export type MediaValueModel = { + culture?: string | null +segment?: string | null +alias: string +value?: unknown + }; + +export type MediaVariantRequestModel = { + culture?: string | null +segment?: string | null +name: string + }; + +export type MediaVariantResponseModel = { + culture?: string | null +segment?: string | null +name: string +createDate: string +updateDate: string + }; + +export type MemberConfigurationResponseModel = { + reservedFieldNames: Array + }; + +export type MemberGroupItemResponseModel = { + id: string +name: string + }; + +export type MemberGroupResponseModel = { + name: string +id: string + }; + +export type MemberItemResponseModel = { + id: string +memberType: MemberTypeReferenceResponseModel +variants: Array + }; + +export type MemberResponseModel = { + values: Array +variants: Array +id: string +email: string +username: string +memberType: MemberTypeReferenceResponseModel +isApproved: boolean +isLockedOut: boolean +isTwoFactorEnabled: boolean +failedPasswordAttempts: number +lastLoginDate?: string | null +lastLockoutDate?: string | null +lastPasswordChangeDate?: string | null +groups: Array + }; + +export type MemberTypeCompositionModel = { + memberType: ReferenceByIdModel +compositionType: CompositionTypeModel + }; + +export type MemberTypeCompositionRequestModel = { + id?: string | null +currentPropertyAliases: Array +currentCompositeIds: Array + }; + +export type MemberTypeCompositionResponseModel = { + id: string +name: string +icon: string + }; + +export type MemberTypeItemResponseModel = { + id: string +name: string +icon?: string | null + }; + +export type MemberTypePropertyTypeContainerResponseModel = { + id: string +parent?: ReferenceByIdModel | null +name?: string | null +type: string +sortOrder: number + }; + +export type MemberTypePropertyTypeResponseModel = { + id: string +container?: ReferenceByIdModel | null +sortOrder: number +alias: string +name: string +description?: string | null +dataType: ReferenceByIdModel +variesByCulture: boolean +variesBySegment: boolean +validation: PropertyTypeValidationModel +appearance: PropertyTypeAppearanceModel +isSensitive: boolean +visibility: MemberTypePropertyTypeVisibilityModel + }; + +export type MemberTypePropertyTypeVisibilityModel = { + memberCanView: boolean +memberCanEdit: boolean + }; + +export type MemberTypeReferenceResponseModel = { + id: string +icon: string +collection?: ReferenceByIdModel | null + }; + +export type MemberTypeResponseModel = { + alias: string +name: string +description?: string | null +icon: string +allowedAsRoot: boolean +variesByCulture: boolean +variesBySegment: boolean +collection?: ReferenceByIdModel | null +isElement: boolean +properties: Array +containers: Array +id: string +compositions: Array + }; + +export type MemberValueModel = { + culture?: string | null +segment?: string | null +alias: string +value?: unknown + }; + +export type MemberVariantRequestModel = { + culture?: string | null +segment?: string | null +name: string + }; + +export type MemberVariantResponseModel = { + culture?: string | null +segment?: string | null +name: string +createDate: string +updateDate: string + }; + +export type ModelsBuilderResponseModel = { + mode: ModelsModeModel +canGenerate: boolean +outOfDateModels: boolean +lastError?: string | null +version?: string | null +modelsNamespace?: string | null +trackingOutOfDateModels: boolean + }; + +export enum ModelsModeModel { + NOTHING = 'Nothing', + IN_MEMORY_AUTO = 'InMemoryAuto', + SOURCE_CODE_MANUAL = 'SourceCodeManual', + SOURCE_CODE_AUTO = 'SourceCodeAuto' +} + +export type MoveDataTypeRequestModel = { + target?: ReferenceByIdModel | null + }; + +export type MoveDictionaryRequestModel = { + target?: ReferenceByIdModel | null + }; + +export type MoveDocumentBlueprintRequestModel = { + target?: ReferenceByIdModel | null + }; + +export type MoveDocumentRequestModel = { + target?: ReferenceByIdModel | null + }; + +export type MoveDocumentTypeRequestModel = { + target?: ReferenceByIdModel | null + }; + +export type MoveMediaRequestModel = { + target?: ReferenceByIdModel | null + }; + +export type MoveMediaTypeRequestModel = { + target?: ReferenceByIdModel | null + }; + +export type NamedEntityTreeItemResponseModel = { + hasChildren: boolean +id: string +parent?: ReferenceByIdModel | null +name: string + }; + +export type NoopSetupTwoFactorModel = Record; + +export type NotificationHeaderModel = { + message: string +category: string +type: EventMessageTypeModel + }; + +export type ObjectTypeResponseModel = { + name?: string | null +id: string + }; + +export enum OperatorModel { + EQUALS = 'Equals', + NOT_EQUALS = 'NotEquals', + CONTAINS = 'Contains', + NOT_CONTAINS = 'NotContains', + LESS_THAN = 'LessThan', + LESS_THAN_EQUAL_TO = 'LessThanEqualTo', + GREATER_THAN = 'GreaterThan', + GREATER_THAN_EQUAL_TO = 'GreaterThanEqualTo' +} + +export type OutOfDateStatusResponseModel = { + status: OutOfDateTypeModel + }; + +export enum OutOfDateTypeModel { + OUT_OF_DATE = 'OutOfDate', + CURRENT = 'Current', + UNKNOWN = 'Unknown' +} + +export type PackageConfigurationResponseModel = { + marketplaceUrl: string + }; + +export type PackageDefinitionResponseModel = { + name: string +contentNodeId?: string | null +contentLoadChildNodes: boolean +mediaIds: Array +mediaLoadChildNodes: boolean +documentTypes: Array +mediaTypes: Array +dataTypes: Array +templates: Array +partialViews: Array +stylesheets: Array +scripts: Array +languages: Array +dictionaryItems: Array +id: string +packagePath: string + }; + +export type PackageMigrationStatusResponseModel = { + packageName: string +hasPendingMigrations: boolean + }; + +export type PagedAllowedDocumentTypeModel = { + total: number +items: Array + }; + +export type PagedAllowedMediaTypeModel = { + total: number +items: Array + }; + +export type PagedAuditLogResponseModel = { + total: number +items: Array + }; + +export type PagedAuditLogWithUsernameResponseModel = { + total: number +items: Array + }; + +export type PagedCultureReponseModel = { + total: number +items: Array + }; + +export type PagedDataTypeItemResponseModel = { + total: number +items: Array + }; + +export type PagedDataTypeTreeItemResponseModel = { + total: number +items: Array + }; + +export type PagedDictionaryOverviewResponseModel = { + total: number +items: Array + }; + +export type PagedDocumentBlueprintTreeItemResponseModel = { + total: number +items: Array + }; + +export type PagedDocumentCollectionResponseModel = { + total: number +items: Array + }; + +export type PagedDocumentRecycleBinItemResponseModel = { + total: number +items: Array + }; + +export type PagedDocumentTreeItemResponseModel = { + total: number +items: Array + }; + +export type PagedDocumentTypeTreeItemResponseModel = { + total: number +items: Array + }; + +export type PagedDocumentVersionItemResponseModel = { + total: number +items: Array + }; + +export type PagedFileSystemTreeItemPresentationModel = { + total: number +items: Array + }; + +export type PagedHealthCheckGroupResponseModel = { + total: number +items: Array + }; + +export type PagedHelpPageResponseModel = { + total: number +items: Array + }; + +export type PagedIReferenceResponseModel = { + total: number +items: Array + }; + +export type PagedIndexResponseModel = { + total: number +items: Array + }; + +export type PagedLanguageResponseModel = { + total: number +items: Array + }; + +export type PagedLogMessageResponseModel = { + total: number +items: Array + }; + +export type PagedLogTemplateResponseModel = { + total: number +items: Array + }; + +export type PagedLoggerResponseModel = { + total: number +items: Array + }; + +export type PagedMediaCollectionResponseModel = { + total: number +items: Array + }; + +export type PagedMediaRecycleBinItemResponseModel = { + total: number +items: Array + }; + +export type PagedMediaTreeItemResponseModel = { + total: number +items: Array + }; + +export type PagedMediaTypeTreeItemResponseModel = { + total: number +items: Array + }; + +export type PagedMemberGroupResponseModel = { + total: number +items: Array + }; + +export type PagedMemberResponseModel = { + total: number +items: Array + }; + +export type PagedModelDataTypeItemResponseModel = { + items: Array +total: number + }; + +export type PagedModelDocumentItemResponseModel = { + items: Array +total: number + }; + +export type PagedModelDocumentTypeItemResponseModel = { + items: Array +total: number + }; + +export type PagedModelMediaItemResponseModel = { + items: Array +total: number + }; + +export type PagedModelMediaTypeItemResponseModel = { + items: Array +total: number + }; + +export type PagedModelMemberItemResponseModel = { + items: Array +total: number + }; + +export type PagedModelMemberTypeItemResponseModel = { + items: Array +total: number + }; + +export type PagedModelTemplateItemResponseModel = { + items: Array +total: number + }; + +export type PagedNamedEntityTreeItemResponseModel = { + total: number +items: Array + }; + +export type PagedObjectTypeResponseModel = { + total: number +items: Array + }; + +export type PagedPackageDefinitionResponseModel = { + total: number +items: Array + }; + +export type PagedPackageMigrationStatusResponseModel = { + total: number +items: Array + }; + +export type PagedPartialViewSnippetItemResponseModel = { + total: number +items: Array + }; + +export type PagedProblemDetailsModel = { + total: number +items: Array + }; + +export type PagedRedirectUrlResponseModel = { + total: number +items: Array + }; + +export type PagedReferenceByIdModel = { + total: number +items: Array + }; + +export type PagedRelationResponseModel = { + total: number +items: Array + }; + +export type PagedRelationTypeResponseModel = { + total: number +items: Array + }; + +export type PagedSavedLogSearchResponseModel = { + total: number +items: Array + }; + +export type PagedSearchResultResponseModel = { + total: number +items: Array + }; + +export type PagedSearcherResponseModel = { + total: number +items: Array + }; + +export type PagedTagResponseModel = { + total: number +items: Array + }; + +export type PagedTelemetryResponseModel = { + total: number +items: Array + }; + +export type PagedUserDataResponseModel = { + total: number +items: Array + }; + +export type PagedUserGroupResponseModel = { + total: number +items: Array + }; + +export type PagedUserResponseModel = { + total: number +items: Array + }; + +export type PagedWebhookResponseModel = { + total: number +items: Array + }; + +export type PartialViewFolderResponseModel = { + path: string +name: string +parent?: FileSystemFolderModel | null + }; + +export type PartialViewItemResponseModel = { + path: string +name: string +parent?: FileSystemFolderModel | null +isFolder: boolean + }; + +export type PartialViewResponseModel = { + path: string +name: string +parent?: FileSystemFolderModel | null +content: string + }; + +export type PartialViewSnippetItemResponseModel = { + id: string +name: string + }; + +export type PartialViewSnippetResponseModel = { + id: string +name: string +content: string + }; + +export type PasswordConfigurationResponseModel = { + minimumPasswordLength: number +requireNonLetterOrDigit: boolean +requireDigit: boolean +requireLowercase: boolean +requireUppercase: boolean + }; + +export type ProblemDetails = { + type?: string | null +title?: string | null +status?: number | null +detail?: string | null +instance?: string | null +[key: string]: unknown | undefined + }; + +export type ProblemDetailsBuilderModel = Record; + +export type ProfilingStatusRequestModel = { + enabled: boolean + }; + +export type ProfilingStatusResponseModel = { + enabled: boolean + }; + +export type PropertyTypeAppearanceModel = { + labelOnTop: boolean + }; + +export type PropertyTypeValidationModel = { + mandatory: boolean +mandatoryMessage?: string | null +regEx?: string | null +regExMessage?: string | null + }; + +export type PublicAccessRequestModel = { + loginDocument: ReferenceByIdModel +errorDocument: ReferenceByIdModel +memberUserNames: Array +memberGroupNames: Array + }; + +export type PublishDocumentRequestModel = { + publishSchedules: Array + }; + +export type PublishDocumentWithDescendantsRequestModel = { + includeUnpublishedDescendants: boolean +cultures: Array + }; + +export enum RedirectStatusModel { + ENABLED = 'Enabled', + DISABLED = 'Disabled' +} + +export type RedirectUrlResponseModel = { + id: string +originalUrl: string +destinationUrl: string +created: string +document: ReferenceByIdModel +culture?: string | null + }; + +export type RedirectUrlStatusResponseModel = { + status: RedirectStatusModel +userIsAdmin: boolean + }; + +export type ReferenceByIdModel = { + id: string + }; + +export type RelationReferenceModel = { + id: string +name?: string | null + }; + +export type RelationResponseModel = { + id: string +relationType: ReferenceByIdModel +parent: RelationReferenceModel +child: RelationReferenceModel +createDate: string +comment?: string | null + }; + +export type RelationTypeItemResponseModel = { + id: string +name: string +isDeletable: boolean + }; + +export type RelationTypeResponseModel = { + name: string +isBidirectional: boolean +isDependency: boolean +id: string +alias?: string | null +parentObject?: ObjectTypeResponseModel | null +childObject?: ObjectTypeResponseModel | null + }; + +export type RenamePartialViewRequestModel = { + name: string + }; + +export type RenameScriptRequestModel = { + name: string + }; + +export type RenameStylesheetRequestModel = { + name: string + }; + +export type ResendInviteUserRequestModel = { + user: ReferenceByIdModel +message?: string | null + }; + +export type ResetPasswordRequestModel = { + email: string + }; + +export type ResetPasswordTokenRequestModel = { + user: ReferenceByIdModel +resetCode: string +password: string + }; + +export type ResetPasswordUserResponseModel = { + resetPassword?: string | null + }; + +export enum RuntimeLevelModel { + UNKNOWN = 'Unknown', + BOOT = 'Boot', + INSTALL = 'Install', + UPGRADE = 'Upgrade', + RUN = 'Run', + BOOT_FAILED = 'BootFailed' +} + +export enum RuntimeModeModel { + BACKOFFICE_DEVELOPMENT = 'BackofficeDevelopment', + DEVELOPMENT = 'Development', + PRODUCTION = 'Production' +} + +export type SavedLogSearchRequestModel = { + name: string +query: string + }; + +export type SavedLogSearchResponseModel = { + name: string +query: string + }; + +export type ScheduleRequestModel = { + publishTime?: string | null +unpublishTime?: string | null + }; + +export type ScriptFolderResponseModel = { + path: string +name: string +parent?: FileSystemFolderModel | null + }; + +export type ScriptItemResponseModel = { + path: string +name: string +parent?: FileSystemFolderModel | null +isFolder: boolean + }; + +export type ScriptResponseModel = { + path: string +name: string +parent?: FileSystemFolderModel | null +content: string + }; + +export type SearchResultResponseModel = { + id: string +score: number +readonly fieldCount: number +fields: Array + }; + +export type SearcherResponseModel = { + name: string + }; + +export type SecurityConfigurationResponseModel = { + passwordConfiguration: PasswordConfigurationResponseModel + }; + +export type ServerConfigurationItemResponseModel = { + name: string +data: string + }; + +export type ServerConfigurationResponseModel = { + allowPasswordReset: boolean + }; + +export type ServerInformationResponseModel = { + version: string +assemblyVersion: string +baseUtcOffset: string +runtimeMode: RuntimeModeModel + }; + +export type ServerStatusResponseModel = { + serverStatus: RuntimeLevelModel + }; + +export type ServerTroubleshootingResponseModel = { + items: Array + }; + +export type SetAvatarRequestModel = { + file: ReferenceByIdModel + }; + +export type SortingRequestModel = { + parent?: ReferenceByIdModel | null +sorting: Array + }; + +export type StaticFileItemResponseModel = { + path: string +name: string +parent?: FileSystemFolderModel | null +isFolder: boolean + }; + +export enum StatusResultTypeModel { + SUCCESS = 'Success', + WARNING = 'Warning', + ERROR = 'Error', + INFO = 'Info' +} + +export type StylesheetFolderResponseModel = { + path: string +name: string +parent?: FileSystemFolderModel | null + }; + +export type StylesheetItemResponseModel = { + path: string +name: string +parent?: FileSystemFolderModel | null +isFolder: boolean + }; + +export type StylesheetResponseModel = { + path: string +name: string +parent?: FileSystemFolderModel | null +content: string + }; + +export type TagResponseModel = { + id: string +text?: string | null +group?: string | null +nodeCount: number + }; + +export enum TelemetryLevelModel { + MINIMAL = 'Minimal', + BASIC = 'Basic', + DETAILED = 'Detailed' +} + +export type TelemetryRequestModel = { + telemetryLevel: TelemetryLevelModel + }; + +export type TelemetryResponseModel = { + telemetryLevel: TelemetryLevelModel + }; + +export type TemplateConfigurationResponseModel = { + disabled: boolean + }; + +export type TemplateItemResponseModel = { + id: string +name: string +alias: string + }; + +export type TemplateQueryExecuteFilterPresentationModel = { + propertyAlias: string +constraintValue: string +operator: OperatorModel + }; + +export type TemplateQueryExecuteModel = { + rootDocument?: ReferenceByIdModel | null +documentTypeAlias?: string | null +filters?: Array | null +sort?: TemplateQueryExecuteSortModel | null +take: number + }; + +export type TemplateQueryExecuteSortModel = { + propertyAlias: string +direction?: string | null + }; + +export type TemplateQueryOperatorModel = { + operator: OperatorModel +applicableTypes: Array + }; + +export type TemplateQueryPropertyPresentationModel = { + alias: string +type: TemplateQueryPropertyTypeModel + }; + +export enum TemplateQueryPropertyTypeModel { + STRING = 'String', + DATE_TIME = 'DateTime', + INTEGER = 'Integer' +} + +export type TemplateQueryResultItemPresentationModel = { + icon: string +name: string + }; + +export type TemplateQueryResultResponseModel = { + queryExpression: string +sampleResults: Array +resultCount: number +executionTime: number + }; + +export type TemplateQuerySettingsResponseModel = { + documentTypeAliases: Array +properties: Array +operators: Array + }; + +export type TemplateResponseModel = { + name: string +alias: string +content?: string | null +id: string +masterTemplate?: ReferenceByIdModel | null + }; + +export type TemporaryFileConfigurationResponseModel = { + imageFileTypes: Array +disallowedUploadedFilesExtensions: Array +allowedUploadedFileExtensions: Array +maxFileSize?: number | null + }; + +export type TemporaryFileResponseModel = { + id: string +availableUntil?: string | null +fileName: string + }; + +export type TrackedReferenceDocumentTypeModel = { + icon?: string | null +alias?: string | null +name?: string | null + }; + +export type TrackedReferenceMediaTypeModel = { + icon?: string | null +alias?: string | null +name?: string | null + }; + +export type UnknownTypePermissionPresentationModel = { + $type: string +verbs: Array +context: string + }; + +export type UnlockUsersRequestModel = { + userIds: Array + }; + +export type UnpublishDocumentRequestModel = { + cultures?: Array | null + }; + +export type UpdateDataTypeRequestModel = { + name: string +editorAlias: string +editorUiAlias?: string | null +values: Array + }; + +export type UpdateDictionaryItemRequestModel = { + name: string +translations: Array + }; + +export type UpdateDocumentBlueprintRequestModel = { + values: Array +variants: Array + }; + +export type UpdateDocumentNotificationsRequestModel = { + subscribedActionIds: Array + }; + +export type UpdateDocumentRequestModel = { + values: Array +variants: Array +template?: ReferenceByIdModel | null + }; + +export type UpdateDocumentTypePropertyTypeContainerRequestModel = { + id: string +parent?: ReferenceByIdModel | null +name?: string | null +type: string +sortOrder: number + }; + +export type UpdateDocumentTypePropertyTypeRequestModel = { + id: string +container?: ReferenceByIdModel | null +sortOrder: number +alias: string +name: string +description?: string | null +dataType: ReferenceByIdModel +variesByCulture: boolean +variesBySegment: boolean +validation: PropertyTypeValidationModel +appearance: PropertyTypeAppearanceModel + }; + +export type UpdateDocumentTypeRequestModel = { + alias: string +name: string +description?: string | null +icon: string +allowedAsRoot: boolean +variesByCulture: boolean +variesBySegment: boolean +collection?: ReferenceByIdModel | null +isElement: boolean +properties: Array +containers: Array +allowedTemplates: Array +defaultTemplate?: ReferenceByIdModel | null +cleanup: DocumentTypeCleanupModel +allowedDocumentTypes: Array +compositions: Array + }; + +export type UpdateDomainsRequestModel = { + defaultIsoCode?: string | null +domains: Array + }; + +export type UpdateFolderResponseModel = { + name: string + }; + +export type UpdateLanguageRequestModel = { + name: string +isDefault: boolean +isMandatory: boolean +fallbackIsoCode?: string | null + }; + +export type UpdateMediaRequestModel = { + values: Array +variants: Array + }; + +export type UpdateMediaTypePropertyTypeContainerRequestModel = { + id: string +parent?: ReferenceByIdModel | null +name?: string | null +type: string +sortOrder: number + }; + +export type UpdateMediaTypePropertyTypeRequestModel = { + id: string +container?: ReferenceByIdModel | null +sortOrder: number +alias: string +name: string +description?: string | null +dataType: ReferenceByIdModel +variesByCulture: boolean +variesBySegment: boolean +validation: PropertyTypeValidationModel +appearance: PropertyTypeAppearanceModel + }; + +export type UpdateMediaTypeRequestModel = { + alias: string +name: string +description?: string | null +icon: string +allowedAsRoot: boolean +variesByCulture: boolean +variesBySegment: boolean +collection?: ReferenceByIdModel | null +isElement: boolean +properties: Array +containers: Array +allowedMediaTypes: Array +compositions: Array + }; + +export type UpdateMemberGroupRequestModel = { + name: string + }; + +export type UpdateMemberRequestModel = { + values: Array +variants: Array +email: string +username: string +oldPassword?: string | null +newPassword?: string | null +groups?: Array | null +isApproved: boolean +isLockedOut: boolean +isTwoFactorEnabled: boolean + }; + +export type UpdateMemberTypePropertyTypeContainerRequestModel = { + id: string +parent?: ReferenceByIdModel | null +name?: string | null +type: string +sortOrder: number + }; + +export type UpdateMemberTypePropertyTypeRequestModel = { + id: string +container?: ReferenceByIdModel | null +sortOrder: number +alias: string +name: string +description?: string | null +dataType: ReferenceByIdModel +variesByCulture: boolean +variesBySegment: boolean +validation: PropertyTypeValidationModel +appearance: PropertyTypeAppearanceModel +isSensitive: boolean +visibility: MemberTypePropertyTypeVisibilityModel + }; + +export type UpdateMemberTypeRequestModel = { + alias: string +name: string +description?: string | null +icon: string +allowedAsRoot: boolean +variesByCulture: boolean +variesBySegment: boolean +collection?: ReferenceByIdModel | null +isElement: boolean +properties: Array +containers: Array +compositions: Array + }; + +export type UpdatePackageRequestModel = { + name: string +contentNodeId?: string | null +contentLoadChildNodes: boolean +mediaIds: Array +mediaLoadChildNodes: boolean +documentTypes: Array +mediaTypes: Array +dataTypes: Array +templates: Array +partialViews: Array +stylesheets: Array +scripts: Array +languages: Array +dictionaryItems: Array +packagePath: string + }; + +export type UpdatePartialViewRequestModel = { + content: string + }; + +export type UpdateScriptRequestModel = { + content: string + }; + +export type UpdateStylesheetRequestModel = { + content: string + }; + +export type UpdateTemplateRequestModel = { + name: string +alias: string +content?: string | null + }; + +export type UpdateUserDataRequestModel = { + group: string +identifier: string +value: string +key: string + }; + +export type UpdateUserGroupRequestModel = { + name: string +icon?: string | null +sections: Array +languages: Array +hasAccessToAllLanguages: boolean +documentStartNode?: ReferenceByIdModel | null +documentRootAccess: boolean +mediaStartNode?: ReferenceByIdModel | null +mediaRootAccess: boolean +fallbackPermissions: Array +permissions: Array + }; + +export type UpdateUserGroupsOnUserRequestModel = { + userIds: Array +userGroupIds: Array + }; + +export type UpdateUserRequestModel = { + email: string +userName: string +name: string +userGroupIds: Array +languageIsoCode: string +documentStartNodeIds: Array +mediaStartNodeIds: Array + }; + +export type UpdateWebhookRequestModel = { + enabled: boolean +url: string +contentTypeKeys: Array +headers: Record +events: Array + }; + +export type UpgradeSettingsResponseModel = { + currentState: string +newState: string +newVersion: string +oldVersion: string +readonly reportUrl: string + }; + +export type UserConfigurationResponseModel = { + canInviteUsers: boolean +passwordConfiguration: PasswordConfigurationResponseModel + }; + +export type UserDataModel = { + group: string +identifier: string +value: string + }; + +export enum UserDataOperationStatusModel { + SUCCESS = 'Success', + NOT_FOUND = 'NotFound', + USER_NOT_FOUND = 'UserNotFound', + ALREADY_EXISTS = 'AlreadyExists' +} + +export type UserDataResponseModel = { + group: string +identifier: string +value: string +key: string + }; + +export type UserGroupItemResponseModel = { + id: string +name: string +icon?: string | null + }; + +export type UserGroupResponseModel = { + name: string +icon?: string | null +sections: Array +languages: Array +hasAccessToAllLanguages: boolean +documentStartNode?: ReferenceByIdModel | null +documentRootAccess: boolean +mediaStartNode?: ReferenceByIdModel | null +mediaRootAccess: boolean +fallbackPermissions: Array +permissions: Array +id: string +isSystemGroup: boolean + }; + +export type UserInstallRequestModel = { + name: string +email: string +password: string +readonly subscribeToNewsletter: boolean + }; + +export type UserItemResponseModel = { + id: string +name: string + }; + +export enum UserOrderModel { + USER_NAME = 'UserName', + LANGUAGE = 'Language', + NAME = 'Name', + EMAIL = 'Email', + ID = 'Id', + CREATE_DATE = 'CreateDate', + UPDATE_DATE = 'UpdateDate', + IS_APPROVED = 'IsApproved', + IS_LOCKED_OUT = 'IsLockedOut', + LAST_LOGIN_DATE = 'LastLoginDate' +} + +export type UserPermissionModel = { + nodeKey: string +permissions: Array + }; + +export type UserPermissionsResponseModel = { + permissions: Array + }; + +export type UserResponseModel = { + email: string +userName: string +name: string +userGroupIds: Array +id: string +languageIsoCode?: string | null +documentStartNodeIds: Array +mediaStartNodeIds: Array +avatarUrls: Array +state: UserStateModel +failedLoginAttempts: number +createDate: string +updateDate: string +lastLoginDate?: string | null +lastLockoutDate?: string | null +lastPasswordChangeDate?: string | null +isAdmin: boolean + }; + +export type UserSettingsPresentationModel = { + minCharLength: number +minNonAlphaNumericLength: number +consentLevels: Array + }; + +export enum UserStateModel { + ACTIVE = 'Active', + DISABLED = 'Disabled', + LOCKED_OUT = 'LockedOut', + INVITED = 'Invited', + INACTIVE = 'Inactive', + ALL = 'All' +} + +export type UserTwoFactorProviderModel = { + providerName: string +isEnabledOnUser: boolean + }; + +export type VariantItemResponseModel = { + name: string +culture?: string | null + }; + +export type VerifyInviteUserRequestModel = { + user: ReferenceByIdModel +token: string + }; + +export type VerifyInviteUserResponseModel = { + passwordConfiguration: PasswordConfigurationResponseModel + }; + +export type VerifyResetPasswordResponseModel = { + passwordConfiguration: PasswordConfigurationResponseModel + }; + +export type VerifyResetPasswordTokenRequestModel = { + user: ReferenceByIdModel +resetCode: string + }; + +export type WebhookEventResponseModel = { + eventName: string +eventType: string +alias: string + }; + +export type WebhookItemResponseModel = { + enabled: boolean +name: string +events: string +url: string +types: string + }; + +export type WebhookResponseModel = { + enabled: boolean +url: string +contentTypeKeys: Array +headers: Record +id: string +events: Array + }; + +export type AuditLogData = { + + payloads: { + GetAuditLog: { + orderDirection?: DirectionModel +sinceDate?: string +skip?: number +take?: number + + }; +GetAuditLogById: { + id: string +orderDirection?: DirectionModel +sinceDate?: string +skip?: number +take?: number + + }; +GetAuditLogTypeByLogType: { + logType: AuditTypeModel +sinceDate?: string +skip?: number +take?: number + + }; + } + + + responses: { + GetAuditLog: PagedAuditLogWithUsernameResponseModel + ,GetAuditLogById: PagedAuditLogResponseModel + ,GetAuditLogTypeByLogType: PagedAuditLogResponseModel + + } + + } + +export type CultureData = { + + payloads: { + GetCulture: { + skip?: number +take?: number + + }; + } + + + responses: { + GetCulture: PagedCultureReponseModel + + } + + } + +export type DataTypeData = { + + payloads: { + PostDataType: { + requestBody?: CreateDataTypeRequestModel + + }; +GetDataTypeById: { + id: string + + }; +DeleteDataTypeById: { + id: string + + }; +PutDataTypeById: { + id: string +requestBody?: UpdateDataTypeRequestModel + + }; +PostDataTypeByIdCopy: { + id: string +requestBody?: CopyDataTypeRequestModel + + }; +GetDataTypeByIdIsUsed: { + id: string + + }; +PutDataTypeByIdMove: { + id: string +requestBody?: MoveDataTypeRequestModel + + }; +GetDataTypeByIdReferences: { + id: string + + }; +PostDataTypeFolder: { + requestBody?: CreateFolderRequestModel + + }; +GetDataTypeFolderById: { + id: string + + }; +DeleteDataTypeFolderById: { + id: string + + }; +PutDataTypeFolderById: { + id: string +requestBody?: UpdateFolderResponseModel + + }; +GetFilterDataType: { + editorAlias?: string +editorUiAlias?: string +name?: string +skip?: number +take?: number + + }; +GetItemDataType: { + id?: Array + + }; +GetItemDataTypeSearch: { + query?: string +skip?: number +take?: number + + }; +GetTreeDataTypeAncestors: { + descendantId?: string + + }; +GetTreeDataTypeChildren: { + foldersOnly?: boolean +parentId?: string +skip?: number +take?: number + + }; +GetTreeDataTypeRoot: { + foldersOnly?: boolean +skip?: number +take?: number + + }; + } + + + responses: { + PostDataType: string + ,GetDataTypeById: DataTypeResponseModel + ,DeleteDataTypeById: string + ,PutDataTypeById: string + ,PostDataTypeByIdCopy: string + ,GetDataTypeByIdIsUsed: boolean + ,PutDataTypeByIdMove: string + ,GetDataTypeByIdReferences: Array + ,GetDataTypeConfiguration: DatatypeConfigurationResponseModel + ,PostDataTypeFolder: string + ,GetDataTypeFolderById: FolderResponseModel + ,DeleteDataTypeFolderById: string + ,PutDataTypeFolderById: string + ,GetFilterDataType: PagedDataTypeItemResponseModel + ,GetItemDataType: Array + ,GetItemDataTypeSearch: PagedModelDataTypeItemResponseModel + ,GetTreeDataTypeAncestors: Array + ,GetTreeDataTypeChildren: PagedDataTypeTreeItemResponseModel + ,GetTreeDataTypeRoot: PagedDataTypeTreeItemResponseModel + + } + + } + +export type DictionaryData = { + + payloads: { + GetDictionary: { + filter?: string +skip?: number +take?: number + + }; +PostDictionary: { + requestBody?: CreateDictionaryItemRequestModel + + }; +GetDictionaryById: { + id: string + + }; +DeleteDictionaryById: { + id: string + + }; +PutDictionaryById: { + id: string +requestBody?: UpdateDictionaryItemRequestModel + + }; +GetDictionaryByIdExport: { + id: string +includeChildren?: boolean + + }; +PutDictionaryByIdMove: { + id: string +requestBody?: MoveDictionaryRequestModel + + }; +PostDictionaryImport: { + requestBody?: ImportDictionaryRequestModel + + }; +GetItemDictionary: { + id?: Array + + }; +GetTreeDictionaryAncestors: { + descendantId?: string + + }; +GetTreeDictionaryChildren: { + parentId?: string +skip?: number +take?: number + + }; +GetTreeDictionaryRoot: { + skip?: number +take?: number + + }; + } + + + responses: { + GetDictionary: PagedDictionaryOverviewResponseModel + ,PostDictionary: string + ,GetDictionaryById: DictionaryItemResponseModel + ,DeleteDictionaryById: string + ,PutDictionaryById: string + ,GetDictionaryByIdExport: Blob | File + ,PutDictionaryByIdMove: string + ,PostDictionaryImport: string + ,GetItemDictionary: Array + ,GetTreeDictionaryAncestors: Array + ,GetTreeDictionaryChildren: PagedNamedEntityTreeItemResponseModel + ,GetTreeDictionaryRoot: PagedNamedEntityTreeItemResponseModel + + } + + } + +export type DocumentBlueprintData = { + + payloads: { + PostDocumentBlueprint: { + requestBody?: CreateDocumentBlueprintRequestModel + + }; +GetDocumentBlueprintById: { + id: string + + }; +DeleteDocumentBlueprintById: { + id: string + + }; +PutDocumentBlueprintById: { + id: string +requestBody?: UpdateDocumentBlueprintRequestModel + + }; +PutDocumentBlueprintByIdMove: { + id: string +requestBody?: MoveDocumentBlueprintRequestModel + + }; +PostDocumentBlueprintFolder: { + requestBody?: CreateFolderRequestModel + + }; +GetDocumentBlueprintFolderById: { + id: string + + }; +DeleteDocumentBlueprintFolderById: { + id: string + + }; +PutDocumentBlueprintFolderById: { + id: string +requestBody?: UpdateFolderResponseModel + + }; +PostDocumentBlueprintFromDocument: { + requestBody?: CreateDocumentBlueprintFromDocumentRequestModel + + }; +GetItemDocumentBlueprint: { + id?: Array + + }; +GetTreeDocumentBlueprintChildren: { + foldersOnly?: boolean +parentId?: string +skip?: number +take?: number + + }; +GetTreeDocumentBlueprintRoot: { + foldersOnly?: boolean +skip?: number +take?: number + + }; + } + + + responses: { + PostDocumentBlueprint: string + ,GetDocumentBlueprintById: DocumentBlueprintResponseModel + ,DeleteDocumentBlueprintById: string + ,PutDocumentBlueprintById: string + ,PutDocumentBlueprintByIdMove: string + ,PostDocumentBlueprintFolder: string + ,GetDocumentBlueprintFolderById: FolderResponseModel + ,DeleteDocumentBlueprintFolderById: string + ,PutDocumentBlueprintFolderById: string + ,PostDocumentBlueprintFromDocument: string + ,GetItemDocumentBlueprint: Array + ,GetTreeDocumentBlueprintChildren: PagedDocumentBlueprintTreeItemResponseModel + ,GetTreeDocumentBlueprintRoot: PagedDocumentBlueprintTreeItemResponseModel + + } + + } + +export type DocumentTypeData = { + + payloads: { + PostDocumentType: { + requestBody?: CreateDocumentTypeRequestModel + + }; +GetDocumentTypeById: { + id: string + + }; +DeleteDocumentTypeById: { + id: string + + }; +PutDocumentTypeById: { + id: string +requestBody?: UpdateDocumentTypeRequestModel + + }; +GetDocumentTypeByIdAllowedChildren: { + id: string +skip?: number +take?: number + + }; +GetDocumentTypeByIdCompositionReferences: { + id: string + + }; +PostDocumentTypeByIdCopy: { + id: string +requestBody?: CopyDocumentTypeRequestModel + + }; +PutDocumentTypeByIdMove: { + id: string +requestBody?: MoveDocumentTypeRequestModel + + }; +GetDocumentTypeAllowedAtRoot: { + skip?: number +take?: number + + }; +PostDocumentTypeAvailableCompositions: { + requestBody?: DocumentTypeCompositionRequestModel + + }; +PostDocumentTypeFolder: { + requestBody?: CreateFolderRequestModel + + }; +GetDocumentTypeFolderById: { + id: string + + }; +DeleteDocumentTypeFolderById: { + id: string + + }; +PutDocumentTypeFolderById: { + id: string +requestBody?: UpdateFolderResponseModel + + }; +GetItemDocumentType: { + id?: Array + + }; +GetItemDocumentTypeSearch: { + query?: string +skip?: number +take?: number + + }; +GetTreeDocumentTypeAncestors: { + descendantId?: string + + }; +GetTreeDocumentTypeChildren: { + foldersOnly?: boolean +parentId?: string +skip?: number +take?: number + + }; +GetTreeDocumentTypeRoot: { + foldersOnly?: boolean +skip?: number +take?: number + + }; + } + + + responses: { + PostDocumentType: string + ,GetDocumentTypeById: DocumentTypeResponseModel + ,DeleteDocumentTypeById: string + ,PutDocumentTypeById: string + ,GetDocumentTypeByIdAllowedChildren: PagedAllowedDocumentTypeModel + ,GetDocumentTypeByIdCompositionReferences: Array + ,PostDocumentTypeByIdCopy: string + ,PutDocumentTypeByIdMove: string + ,GetDocumentTypeAllowedAtRoot: PagedAllowedDocumentTypeModel + ,PostDocumentTypeAvailableCompositions: Array + ,GetDocumentTypeConfiguration: DocumentTypeConfigurationResponseModel + ,PostDocumentTypeFolder: string + ,GetDocumentTypeFolderById: FolderResponseModel + ,DeleteDocumentTypeFolderById: string + ,PutDocumentTypeFolderById: string + ,GetItemDocumentType: Array + ,GetItemDocumentTypeSearch: PagedModelDocumentTypeItemResponseModel + ,GetTreeDocumentTypeAncestors: Array + ,GetTreeDocumentTypeChildren: PagedDocumentTypeTreeItemResponseModel + ,GetTreeDocumentTypeRoot: PagedDocumentTypeTreeItemResponseModel + + } + + } + +export type DocumentVersionData = { + + payloads: { + GetDocumentVersion: { + culture?: string +documentId: string +skip?: number +take?: number + + }; +GetDocumentVersionById: { + id: string + + }; +PutDocumentVersionByIdPreventCleanup: { + id: string +preventCleanup?: boolean + + }; +PostDocumentVersionByIdRollback: { + culture?: string +id: string + + }; + } + + + responses: { + GetDocumentVersion: PagedDocumentVersionItemResponseModel + ,GetDocumentVersionById: DocumentVersionResponseModel + ,PutDocumentVersionByIdPreventCleanup: string + ,PostDocumentVersionByIdRollback: string + + } + + } + +export type DocumentData = { + + payloads: { + GetCollectionDocumentById: { + dataTypeId?: string +filter?: string +id: string +orderBy?: string +orderCulture?: string +orderDirection?: DirectionModel +skip?: number +take?: number + + }; +PostDocument: { + requestBody?: CreateDocumentRequestModel + + }; +GetDocumentById: { + id: string + + }; +DeleteDocumentById: { + id: string + + }; +PutDocumentById: { + id: string +requestBody?: UpdateDocumentRequestModel + + }; +PostDocumentByIdCopy: { + id: string +requestBody?: CopyDocumentRequestModel + + }; +GetDocumentByIdDomains: { + id: string + + }; +PutDocumentByIdDomains: { + id: string +requestBody?: UpdateDomainsRequestModel + + }; +PutDocumentByIdMove: { + id: string +requestBody?: MoveDocumentRequestModel + + }; +PutDocumentByIdMoveToRecycleBin: { + id: string + + }; +GetDocumentByIdNotifications: { + id: string + + }; +PutDocumentByIdNotifications: { + id: string +requestBody?: UpdateDocumentNotificationsRequestModel + + }; +PostDocumentByIdPublicAccess: { + id: string +requestBody?: PublicAccessRequestModel + + }; +DeleteDocumentByIdPublicAccess: { + id: string + + }; +GetDocumentByIdPublicAccess: { + id: string + + }; +PutDocumentByIdPublicAccess: { + id: string +requestBody?: PublicAccessRequestModel + + }; +PutDocumentByIdPublish: { + id: string +requestBody?: PublishDocumentRequestModel + + }; +PutDocumentByIdPublishWithDescendants: { + id: string +requestBody?: PublishDocumentWithDescendantsRequestModel + + }; +GetDocumentByIdReferencedBy: { + id: string +skip?: number +take?: number + + }; +GetDocumentByIdReferencedDescendants: { + id: string +skip?: number +take?: number + + }; +PutDocumentByIdUnpublish: { + id: string +requestBody?: UnpublishDocumentRequestModel + + }; +PutDocumentByIdValidate: { + id: string +requestBody?: UpdateDocumentRequestModel + + }; +GetDocumentAreReferenced: { + id?: Array +skip?: number +take?: number + + }; +PutDocumentSort: { + requestBody?: SortingRequestModel + + }; +PostDocumentValidate: { + requestBody?: CreateDocumentRequestModel + + }; +GetItemDocument: { + id?: Array + + }; +GetItemDocumentSearch: { + query?: string +skip?: number +take?: number + + }; +DeleteRecycleBinDocumentById: { + id: string + + }; +GetRecycleBinDocumentByIdOriginalParent: { + id: string + + }; +PutRecycleBinDocumentByIdRestore: { + id: string +requestBody?: MoveMediaRequestModel + + }; +GetRecycleBinDocumentChildren: { + parentId?: string +skip?: number +take?: number + + }; +GetRecycleBinDocumentRoot: { + skip?: number +take?: number + + }; +GetTreeDocumentAncestors: { + descendantId?: string + + }; +GetTreeDocumentChildren: { + dataTypeId?: string +parentId?: string +skip?: number +take?: number + + }; +GetTreeDocumentRoot: { + dataTypeId?: string +skip?: number +take?: number + + }; + } + + + responses: { + GetCollectionDocumentById: PagedDocumentCollectionResponseModel + ,PostDocument: string + ,GetDocumentById: DocumentResponseModel + ,DeleteDocumentById: string + ,PutDocumentById: string + ,PostDocumentByIdCopy: string + ,GetDocumentByIdDomains: DomainsResponseModel + ,PutDocumentByIdDomains: string + ,PutDocumentByIdMove: string + ,PutDocumentByIdMoveToRecycleBin: string + ,GetDocumentByIdNotifications: Array + ,PutDocumentByIdNotifications: string + ,PostDocumentByIdPublicAccess: string + ,DeleteDocumentByIdPublicAccess: string + ,GetDocumentByIdPublicAccess: void + ,PutDocumentByIdPublicAccess: string + ,PutDocumentByIdPublish: string + ,PutDocumentByIdPublishWithDescendants: string + ,GetDocumentByIdReferencedBy: PagedIReferenceResponseModel + ,GetDocumentByIdReferencedDescendants: PagedReferenceByIdModel + ,PutDocumentByIdUnpublish: string + ,PutDocumentByIdValidate: string + ,GetDocumentAreReferenced: PagedReferenceByIdModel + ,GetDocumentConfiguration: DocumentConfigurationResponseModel + ,PutDocumentSort: string + ,PostDocumentValidate: string + ,GetItemDocument: Array + ,GetItemDocumentSearch: PagedModelDocumentItemResponseModel + ,DeleteRecycleBinDocument: string + ,DeleteRecycleBinDocumentById: string + ,GetRecycleBinDocumentByIdOriginalParent: ReferenceByIdModel + ,PutRecycleBinDocumentByIdRestore: string + ,GetRecycleBinDocumentChildren: PagedDocumentRecycleBinItemResponseModel + ,GetRecycleBinDocumentRoot: PagedDocumentRecycleBinItemResponseModel + ,GetTreeDocumentAncestors: Array + ,GetTreeDocumentChildren: PagedDocumentTreeItemResponseModel + ,GetTreeDocumentRoot: PagedDocumentTreeItemResponseModel + + } + + } + +export type DynamicRootData = { + + payloads: { + PostDynamicRootQuery: { + requestBody?: DynamicRootRequestModel + + }; + } + + + responses: { + PostDynamicRootQuery: DynamicRootResponseModel + ,GetDynamicRootSteps: Array + + } + + } + +export type HealthCheckData = { + + payloads: { + GetHealthCheckGroup: { + skip?: number +take?: number + + }; +GetHealthCheckGroupByName: { + name: string + + }; +PostHealthCheckGroupByNameCheck: { + name: string + + }; +PostHealthCheckExecuteAction: { + requestBody?: HealthCheckActionRequestModel + + }; + } + + + responses: { + GetHealthCheckGroup: PagedHealthCheckGroupResponseModel + ,GetHealthCheckGroupByName: HealthCheckGroupPresentationModel + ,PostHealthCheckGroupByNameCheck: HealthCheckGroupWithResultResponseModel + ,PostHealthCheckExecuteAction: HealthCheckResultResponseModel + + } + + } + +export type HelpData = { + + payloads: { + GetHelp: { + baseUrl?: string +section?: string +skip?: number +take?: number +tree?: string + + }; + } + + + responses: { + GetHelp: PagedHelpPageResponseModel + + } + + } + +export type IndexerData = { + + payloads: { + GetIndexer: { + skip?: number +take?: number + + }; +GetIndexerByIndexName: { + indexName: string + + }; +PostIndexerByIndexNameRebuild: { + indexName: string + + }; + } + + + responses: { + GetIndexer: PagedIndexResponseModel + ,GetIndexerByIndexName: IndexResponseModel + ,PostIndexerByIndexNameRebuild: string + + } + + } + +export type InstallData = { + + payloads: { + PostInstallSetup: { + requestBody?: InstallRequestModel + + }; +PostInstallValidateDatabase: { + requestBody?: DatabaseInstallRequestModel + + }; + } + + + responses: { + GetInstallSettings: InstallSettingsResponseModel + ,PostInstallSetup: string + ,PostInstallValidateDatabase: string + + } + + } + +export type LanguageData = { + + payloads: { + GetItemLanguage: { + isoCode?: Array + + }; +GetLanguage: { + skip?: number +take?: number + + }; +PostLanguage: { + requestBody?: CreateLanguageRequestModel + + }; +GetLanguageByIsoCode: { + isoCode: string + + }; +DeleteLanguageByIsoCode: { + isoCode: string + + }; +PutLanguageByIsoCode: { + isoCode: string +requestBody?: UpdateLanguageRequestModel + + }; + } + + + responses: { + GetItemLanguage: Array + ,GetLanguage: PagedLanguageResponseModel + ,PostLanguage: string + ,GetLanguageByIsoCode: LanguageResponseModel + ,DeleteLanguageByIsoCode: string + ,PutLanguageByIsoCode: string + + } + + } + +export type LogViewerData = { + + payloads: { + GetLogViewerLevel: { + skip?: number +take?: number + + }; +GetLogViewerLevelCount: { + endDate?: string +startDate?: string + + }; +GetLogViewerLog: { + endDate?: string +filterExpression?: string +logLevel?: Array +orderDirection?: DirectionModel +skip?: number +startDate?: string +take?: number + + }; +GetLogViewerMessageTemplate: { + endDate?: string +skip?: number +startDate?: string +take?: number + + }; +GetLogViewerSavedSearch: { + skip?: number +take?: number + + }; +PostLogViewerSavedSearch: { + requestBody?: SavedLogSearchRequestModel + + }; +GetLogViewerSavedSearchByName: { + name: string + + }; +DeleteLogViewerSavedSearchByName: { + name: string + + }; +GetLogViewerValidateLogsSize: { + endDate?: string +startDate?: string + + }; + } + + + responses: { + GetLogViewerLevel: PagedLoggerResponseModel + ,GetLogViewerLevelCount: LogLevelCountsReponseModel + ,GetLogViewerLog: PagedLogMessageResponseModel + ,GetLogViewerMessageTemplate: PagedLogTemplateResponseModel + ,GetLogViewerSavedSearch: PagedSavedLogSearchResponseModel + ,PostLogViewerSavedSearch: string + ,GetLogViewerSavedSearchByName: SavedLogSearchResponseModel + ,DeleteLogViewerSavedSearchByName: string + ,GetLogViewerValidateLogsSize: any + + } + + } + +export type ManifestData = { + + + responses: { + GetManifestManifest: Array + ,GetManifestManifestPrivate: Array + ,GetManifestManifestPublic: Array + + } + + } + +export type MediaTypeData = { + + payloads: { + GetItemMediaType: { + id?: Array + + }; +GetItemMediaTypeSearch: { + query?: string +skip?: number +take?: number + + }; +PostMediaType: { + requestBody?: CreateMediaTypeRequestModel + + }; +GetMediaTypeById: { + id: string + + }; +DeleteMediaTypeById: { + id: string + + }; +PutMediaTypeById: { + id: string +requestBody?: UpdateMediaTypeRequestModel + + }; +GetMediaTypeByIdAllowedChildren: { + id: string +skip?: number +take?: number + + }; +GetMediaTypeByIdCompositionReferences: { + id: string + + }; +PostMediaTypeByIdCopy: { + id: string +requestBody?: CopyMediaTypeRequestModel + + }; +PutMediaTypeByIdMove: { + id: string +requestBody?: MoveMediaTypeRequestModel + + }; +GetMediaTypeAllowedAtRoot: { + skip?: number +take?: number + + }; +PostMediaTypeAvailableCompositions: { + requestBody?: MediaTypeCompositionRequestModel + + }; +PostMediaTypeFolder: { + requestBody?: CreateFolderRequestModel + + }; +GetMediaTypeFolderById: { + id: string + + }; +DeleteMediaTypeFolderById: { + id: string + + }; +PutMediaTypeFolderById: { + id: string +requestBody?: UpdateFolderResponseModel + + }; +GetTreeMediaTypeAncestors: { + descendantId?: string + + }; +GetTreeMediaTypeChildren: { + foldersOnly?: boolean +parentId?: string +skip?: number +take?: number + + }; +GetTreeMediaTypeRoot: { + foldersOnly?: boolean +skip?: number +take?: number + + }; + } + + + responses: { + GetItemMediaType: Array + ,GetItemMediaTypeSearch: PagedModelMediaTypeItemResponseModel + ,PostMediaType: string + ,GetMediaTypeById: MediaTypeResponseModel + ,DeleteMediaTypeById: string + ,PutMediaTypeById: string + ,GetMediaTypeByIdAllowedChildren: PagedAllowedMediaTypeModel + ,GetMediaTypeByIdCompositionReferences: Array + ,PostMediaTypeByIdCopy: string + ,PutMediaTypeByIdMove: string + ,GetMediaTypeAllowedAtRoot: PagedAllowedMediaTypeModel + ,PostMediaTypeAvailableCompositions: Array + ,PostMediaTypeFolder: string + ,GetMediaTypeFolderById: FolderResponseModel + ,DeleteMediaTypeFolderById: string + ,PutMediaTypeFolderById: string + ,GetTreeMediaTypeAncestors: Array + ,GetTreeMediaTypeChildren: PagedMediaTypeTreeItemResponseModel + ,GetTreeMediaTypeRoot: PagedMediaTypeTreeItemResponseModel + + } + + } + +export type MediaData = { + + payloads: { + GetCollectionMedia: { + dataTypeId?: string +filter?: string +id?: string +orderBy?: string +orderDirection?: DirectionModel +skip?: number +take?: number + + }; +GetItemMedia: { + id?: Array + + }; +GetItemMediaSearch: { + query?: string +skip?: number +take?: number + + }; +PostMedia: { + requestBody?: CreateMediaRequestModel + + }; +GetMediaById: { + id: string + + }; +DeleteMediaById: { + id: string + + }; +PutMediaById: { + id: string +requestBody?: UpdateMediaRequestModel + + }; +PutMediaByIdMove: { + id: string +requestBody?: MoveMediaRequestModel + + }; +PutMediaByIdMoveToRecycleBin: { + id: string + + }; +GetMediaByIdReferencedBy: { + id: string +skip?: number +take?: number + + }; +GetMediaByIdReferencedDescendants: { + id: string +skip?: number +take?: number + + }; +PutMediaByIdValidate: { + id: string +requestBody?: UpdateMediaRequestModel + + }; +GetMediaAreReferenced: { + id?: Array +skip?: number +take?: number + + }; +PutMediaSort: { + requestBody?: SortingRequestModel + + }; +PostMediaValidate: { + requestBody?: CreateMediaRequestModel + + }; +DeleteRecycleBinMediaById: { + id: string + + }; +GetRecycleBinMediaByIdOriginalParent: { + id: string + + }; +PutRecycleBinMediaByIdRestore: { + id: string +requestBody?: MoveMediaRequestModel + + }; +GetRecycleBinMediaChildren: { + parentId?: string +skip?: number +take?: number + + }; +GetRecycleBinMediaRoot: { + skip?: number +take?: number + + }; +GetTreeMediaAncestors: { + descendantId?: string + + }; +GetTreeMediaChildren: { + dataTypeId?: string +parentId?: string +skip?: number +take?: number + + }; +GetTreeMediaRoot: { + dataTypeId?: string +skip?: number +take?: number + + }; + } + + + responses: { + GetCollectionMedia: PagedMediaCollectionResponseModel + ,GetItemMedia: Array + ,GetItemMediaSearch: PagedModelMediaItemResponseModel + ,PostMedia: string + ,GetMediaById: MediaResponseModel + ,DeleteMediaById: string + ,PutMediaById: string + ,PutMediaByIdMove: string + ,PutMediaByIdMoveToRecycleBin: string + ,GetMediaByIdReferencedBy: PagedIReferenceResponseModel + ,GetMediaByIdReferencedDescendants: PagedReferenceByIdModel + ,PutMediaByIdValidate: string + ,GetMediaAreReferenced: PagedReferenceByIdModel + ,GetMediaConfiguration: MediaConfigurationResponseModel + ,PutMediaSort: string + ,PostMediaValidate: string + ,DeleteRecycleBinMedia: string + ,DeleteRecycleBinMediaById: string + ,GetRecycleBinMediaByIdOriginalParent: ReferenceByIdModel + ,PutRecycleBinMediaByIdRestore: string + ,GetRecycleBinMediaChildren: PagedMediaRecycleBinItemResponseModel + ,GetRecycleBinMediaRoot: PagedMediaRecycleBinItemResponseModel + ,GetTreeMediaAncestors: Array + ,GetTreeMediaChildren: PagedMediaTreeItemResponseModel + ,GetTreeMediaRoot: PagedMediaTreeItemResponseModel + + } + + } + +export type MemberGroupData = { + + payloads: { + GetItemMemberGroup: { + id?: Array + + }; +GetMemberGroup: { + skip?: number +take?: number + + }; +PostMemberGroup: { + requestBody?: CreateMemberGroupRequestModel + + }; +GetMemberGroupById: { + id: string + + }; +DeleteMemberGroupById: { + id: string + + }; +PutMemberGroupById: { + id: string +requestBody?: UpdateMemberGroupRequestModel + + }; +GetTreeMemberGroupRoot: { + skip?: number +take?: number + + }; + } + + + responses: { + GetItemMemberGroup: Array + ,GetMemberGroup: PagedMemberGroupResponseModel + ,PostMemberGroup: MemberGroupResponseModel + ,GetMemberGroupById: MemberGroupResponseModel + ,DeleteMemberGroupById: string + ,PutMemberGroupById: MemberGroupResponseModel + ,GetTreeMemberGroupRoot: PagedNamedEntityTreeItemResponseModel + + } + + } + +export type MemberTypeData = { + + payloads: { + GetItemMemberType: { + id?: Array + + }; +GetItemMemberTypeSearch: { + query?: string +skip?: number +take?: number + + }; +PostMemberType: { + requestBody?: CreateMemberTypeRequestModel + + }; +GetMemberTypeById: { + id: string + + }; +DeleteMemberTypeById: { + id: string + + }; +PutMemberTypeById: { + id: string +requestBody?: UpdateMemberTypeRequestModel + + }; +GetMemberTypeByIdCompositionReferences: { + id: string + + }; +PostMemberTypeByIdCopy: { + id: string + + }; +PostMemberTypeAvailableCompositions: { + requestBody?: MemberTypeCompositionRequestModel + + }; +GetTreeMemberTypeRoot: { + skip?: number +take?: number + + }; + } + + + responses: { + GetItemMemberType: Array + ,GetItemMemberTypeSearch: PagedModelMemberTypeItemResponseModel + ,PostMemberType: string + ,GetMemberTypeById: MemberTypeResponseModel + ,DeleteMemberTypeById: string + ,PutMemberTypeById: string + ,GetMemberTypeByIdCompositionReferences: Array + ,PostMemberTypeByIdCopy: string + ,PostMemberTypeAvailableCompositions: Array + ,GetTreeMemberTypeRoot: PagedNamedEntityTreeItemResponseModel + + } + + } + +export type MemberData = { + + payloads: { + GetFilterMember: { + filter?: string +isApproved?: boolean +isLockedOut?: boolean +memberGroupName?: string +memberTypeId?: string +orderBy?: string +orderDirection?: DirectionModel +skip?: number +take?: number + + }; +GetItemMember: { + id?: Array + + }; +GetItemMemberSearch: { + query?: string +skip?: number +take?: number + + }; +PostMember: { + requestBody?: CreateMemberRequestModel + + }; +GetMemberById: { + id: string + + }; +DeleteMemberById: { + id: string + + }; +PutMemberById: { + id: string +requestBody?: UpdateMemberRequestModel + + }; +PutMemberByIdValidate: { + id: string +requestBody?: UpdateMemberRequestModel + + }; +PostMemberValidate: { + requestBody?: CreateMemberRequestModel + + }; + } + + + responses: { + GetFilterMember: PagedMemberResponseModel + ,GetItemMember: Array + ,GetItemMemberSearch: PagedModelMemberItemResponseModel + ,PostMember: string + ,GetMemberById: MemberResponseModel + ,DeleteMemberById: string + ,PutMemberById: string + ,PutMemberByIdValidate: string + ,GetMemberConfiguration: MemberConfigurationResponseModel + ,PostMemberValidate: string + + } + + } + +export type ModelsBuilderData = { + + + responses: { + PostModelsBuilderBuild: string + ,GetModelsBuilderDashboard: ModelsBuilderResponseModel + ,GetModelsBuilderStatus: OutOfDateStatusResponseModel + + } + + } + +export type ObjectTypesData = { + + payloads: { + GetObjectTypes: { + skip?: number +take?: number + + }; + } + + + responses: { + GetObjectTypes: PagedObjectTypeResponseModel + + } + + } + +export type PackageData = { + + payloads: { + PostPackageByNameRunMigration: { + name: string + + }; +GetPackageCreated: { + skip?: number +take?: number + + }; +PostPackageCreated: { + requestBody?: CreatePackageRequestModel + + }; +GetPackageCreatedById: { + id: string + + }; +DeletePackageCreatedById: { + id: string + + }; +PutPackageCreatedById: { + id: string +requestBody?: UpdatePackageRequestModel + + }; +GetPackageCreatedByIdDownload: { + id: string + + }; +GetPackageMigrationStatus: { + skip?: number +take?: number + + }; + } + + + responses: { + PostPackageByNameRunMigration: string + ,GetPackageConfiguration: PackageConfigurationResponseModel + ,GetPackageCreated: PagedPackageDefinitionResponseModel + ,PostPackageCreated: string + ,GetPackageCreatedById: PackageDefinitionResponseModel + ,DeletePackageCreatedById: string + ,PutPackageCreatedById: string + ,GetPackageCreatedByIdDownload: Blob | File + ,GetPackageMigrationStatus: PagedPackageMigrationStatusResponseModel + + } + + } + +export type PartialViewData = { + + payloads: { + GetItemPartialView: { + path?: Array + + }; +PostPartialView: { + requestBody?: CreatePartialViewRequestModel + + }; +GetPartialViewByPath: { + path: string + + }; +DeletePartialViewByPath: { + path: string + + }; +PutPartialViewByPath: { + path: string +requestBody?: UpdatePartialViewRequestModel + + }; +PutPartialViewByPathRename: { + path: string +requestBody?: RenamePartialViewRequestModel + + }; +PostPartialViewFolder: { + requestBody?: CreatePartialViewFolderRequestModel + + }; +GetPartialViewFolderByPath: { + path: string + + }; +DeletePartialViewFolderByPath: { + path: string + + }; +GetPartialViewSnippet: { + skip?: number +take?: number + + }; +GetPartialViewSnippetById: { + id: string + + }; +GetTreePartialViewAncestors: { + descendantPath?: string + + }; +GetTreePartialViewChildren: { + parentPath?: string +skip?: number +take?: number + + }; +GetTreePartialViewRoot: { + skip?: number +take?: number + + }; + } + + + responses: { + GetItemPartialView: Array + ,PostPartialView: string + ,GetPartialViewByPath: PartialViewResponseModel + ,DeletePartialViewByPath: string + ,PutPartialViewByPath: string + ,PutPartialViewByPathRename: string + ,PostPartialViewFolder: string + ,GetPartialViewFolderByPath: PartialViewFolderResponseModel + ,DeletePartialViewFolderByPath: string + ,GetPartialViewSnippet: PagedPartialViewSnippetItemResponseModel + ,GetPartialViewSnippetById: PartialViewSnippetResponseModel + ,GetTreePartialViewAncestors: Array + ,GetTreePartialViewChildren: PagedFileSystemTreeItemPresentationModel + ,GetTreePartialViewRoot: PagedFileSystemTreeItemPresentationModel + + } + + } + +export type PreviewData = { + + + responses: { + DeletePreview: string + ,PostPreview: string + + } + + } + +export type ProfilingData = { + + payloads: { + PutProfilingStatus: { + requestBody?: ProfilingStatusRequestModel + + }; + } + + + responses: { + GetProfilingStatus: ProfilingStatusResponseModel + ,PutProfilingStatus: string + + } + + } + +export type PropertyTypeData = { + + payloads: { + GetPropertyTypeIsUsed: { + contentTypeId?: string +propertyAlias?: string + + }; + } + + + responses: { + GetPropertyTypeIsUsed: boolean + + } + + } + +export type PublishedCacheData = { + + + responses: { + PostPublishedCacheCollect: string + ,PostPublishedCacheRebuild: string + ,PostPublishedCacheReload: string + ,GetPublishedCacheStatus: string + + } + + } + +export type RedirectManagementData = { + + payloads: { + GetRedirectManagement: { + filter?: string +skip?: number +take?: number + + }; +GetRedirectManagementById: { + id: string +skip?: number +take?: number + + }; +DeleteRedirectManagementById: { + id: string + + }; +PostRedirectManagementStatus: { + status?: RedirectStatusModel + + }; + } + + + responses: { + GetRedirectManagement: PagedRedirectUrlResponseModel + ,GetRedirectManagementById: PagedRedirectUrlResponseModel + ,DeleteRedirectManagementById: string + ,GetRedirectManagementStatus: RedirectUrlStatusResponseModel + ,PostRedirectManagementStatus: string + + } + + } + +export type RelationTypeData = { + + payloads: { + GetItemRelationType: { + id?: Array + + }; +GetRelationType: { + skip?: number +take?: number + + }; +GetRelationTypeById: { + id: string + + }; + } + + + responses: { + GetItemRelationType: Array + ,GetRelationType: PagedRelationTypeResponseModel + ,GetRelationTypeById: RelationTypeResponseModel + + } + + } + +export type RelationData = { + + payloads: { + GetRelationTypeById: { + id: string +skip?: number +take?: number + + }; + } + + + responses: { + GetRelationTypeById: PagedRelationResponseModel + + } + + } + +export type ScriptData = { + + payloads: { + GetItemScript: { + path?: Array + + }; +PostScript: { + requestBody?: CreateScriptRequestModel + + }; +GetScriptByPath: { + path: string + + }; +DeleteScriptByPath: { + path: string + + }; +PutScriptByPath: { + path: string +requestBody?: UpdateScriptRequestModel + + }; +PutScriptByPathRename: { + path: string +requestBody?: RenameScriptRequestModel + + }; +PostScriptFolder: { + requestBody?: CreateScriptFolderRequestModel + + }; +GetScriptFolderByPath: { + path: string + + }; +DeleteScriptFolderByPath: { + path: string + + }; +GetTreeScriptAncestors: { + descendantPath?: string + + }; +GetTreeScriptChildren: { + parentPath?: string +skip?: number +take?: number + + }; +GetTreeScriptRoot: { + skip?: number +take?: number + + }; + } + + + responses: { + GetItemScript: Array + ,PostScript: string + ,GetScriptByPath: ScriptResponseModel + ,DeleteScriptByPath: string + ,PutScriptByPath: string + ,PutScriptByPathRename: string + ,PostScriptFolder: string + ,GetScriptFolderByPath: ScriptFolderResponseModel + ,DeleteScriptFolderByPath: string + ,GetTreeScriptAncestors: Array + ,GetTreeScriptChildren: PagedFileSystemTreeItemPresentationModel + ,GetTreeScriptRoot: PagedFileSystemTreeItemPresentationModel + + } + + } + +export type SearcherData = { + + payloads: { + GetSearcher: { + skip?: number +take?: number + + }; +GetSearcherBySearcherNameQuery: { + searcherName: string +skip?: number +take?: number +term?: string + + }; + } + + + responses: { + GetSearcher: PagedSearcherResponseModel + ,GetSearcherBySearcherNameQuery: PagedSearchResultResponseModel + + } + + } + +export type SecurityData = { + + payloads: { + PostSecurityForgotPassword: { + requestBody?: ResetPasswordRequestModel + + }; +PostSecurityForgotPasswordReset: { + requestBody?: ResetPasswordTokenRequestModel + + }; +PostSecurityForgotPasswordVerify: { + requestBody?: VerifyResetPasswordTokenRequestModel + + }; + } + + + responses: { + GetSecurityConfiguration: SecurityConfigurationResponseModel + ,PostSecurityForgotPassword: string + ,PostSecurityForgotPasswordReset: string + ,PostSecurityForgotPasswordVerify: VerifyResetPasswordResponseModel + + } + + } + +export type ServerData = { + + + responses: { + GetServerConfiguration: ServerConfigurationResponseModel + ,GetServerInformation: ServerInformationResponseModel + ,GetServerStatus: ServerStatusResponseModel + ,GetServerTroubleshooting: ServerTroubleshootingResponseModel + + } + + } + +export type StaticFileData = { + + payloads: { + GetItemStaticFile: { + path?: Array + + }; +GetTreeStaticFileAncestors: { + descendantPath?: string + + }; +GetTreeStaticFileChildren: { + parentPath?: string +skip?: number +take?: number + + }; +GetTreeStaticFileRoot: { + skip?: number +take?: number + + }; + } + + + responses: { + GetItemStaticFile: Array + ,GetTreeStaticFileAncestors: Array + ,GetTreeStaticFileChildren: PagedFileSystemTreeItemPresentationModel + ,GetTreeStaticFileRoot: PagedFileSystemTreeItemPresentationModel + + } + + } + +export type StylesheetData = { + + payloads: { + GetItemStylesheet: { + path?: Array + + }; +PostStylesheet: { + requestBody?: CreateStylesheetRequestModel + + }; +GetStylesheetByPath: { + path: string + + }; +DeleteStylesheetByPath: { + path: string + + }; +PutStylesheetByPath: { + path: string +requestBody?: UpdateStylesheetRequestModel + + }; +PutStylesheetByPathRename: { + path: string +requestBody?: RenameStylesheetRequestModel + + }; +PostStylesheetFolder: { + requestBody?: CreateStylesheetFolderRequestModel + + }; +GetStylesheetFolderByPath: { + path: string + + }; +DeleteStylesheetFolderByPath: { + path: string + + }; +GetTreeStylesheetAncestors: { + descendantPath?: string + + }; +GetTreeStylesheetChildren: { + parentPath?: string +skip?: number +take?: number + + }; +GetTreeStylesheetRoot: { + skip?: number +take?: number + + }; + } + + + responses: { + GetItemStylesheet: Array + ,PostStylesheet: string + ,GetStylesheetByPath: StylesheetResponseModel + ,DeleteStylesheetByPath: string + ,PutStylesheetByPath: string + ,PutStylesheetByPathRename: string + ,PostStylesheetFolder: string + ,GetStylesheetFolderByPath: StylesheetFolderResponseModel + ,DeleteStylesheetFolderByPath: string + ,GetTreeStylesheetAncestors: Array + ,GetTreeStylesheetChildren: PagedFileSystemTreeItemPresentationModel + ,GetTreeStylesheetRoot: PagedFileSystemTreeItemPresentationModel + + } + + } + +export type TagData = { + + payloads: { + GetTag: { + culture?: string +query?: string +skip?: number +tagGroup?: string +take?: number + + }; + } + + + responses: { + GetTag: PagedTagResponseModel + + } + + } + +export type TelemetryData = { + + payloads: { + GetTelemetry: { + skip?: number +take?: number + + }; +PostTelemetryLevel: { + requestBody?: TelemetryRequestModel + + }; + } + + + responses: { + GetTelemetry: PagedTelemetryResponseModel + ,GetTelemetryLevel: TelemetryResponseModel + ,PostTelemetryLevel: string + + } + + } + +export type TemplateData = { + + payloads: { + GetItemTemplate: { + id?: Array + + }; +GetItemTemplateSearch: { + query?: string +skip?: number +take?: number + + }; +PostTemplate: { + requestBody?: CreateTemplateRequestModel + + }; +GetTemplateById: { + id: string + + }; +DeleteTemplateById: { + id: string + + }; +PutTemplateById: { + id: string +requestBody?: UpdateTemplateRequestModel + + }; +PostTemplateQueryExecute: { + requestBody?: TemplateQueryExecuteModel + + }; +GetTreeTemplateAncestors: { + descendantId?: string + + }; +GetTreeTemplateChildren: { + parentId?: string +skip?: number +take?: number + + }; +GetTreeTemplateRoot: { + skip?: number +take?: number + + }; + } + + + responses: { + GetItemTemplate: Array + ,GetItemTemplateSearch: PagedModelTemplateItemResponseModel + ,PostTemplate: string + ,GetTemplateById: TemplateResponseModel + ,DeleteTemplateById: string + ,PutTemplateById: string + ,GetTemplateConfiguration: TemplateConfigurationResponseModel + ,PostTemplateQueryExecute: TemplateQueryResultResponseModel + ,GetTemplateQuerySettings: TemplateQuerySettingsResponseModel + ,GetTreeTemplateAncestors: Array + ,GetTreeTemplateChildren: PagedNamedEntityTreeItemResponseModel + ,GetTreeTemplateRoot: PagedNamedEntityTreeItemResponseModel + + } + + } + +export type TemporaryFileData = { + + payloads: { + PostTemporaryFile: { + formData?: { + Id?: string +File?: Blob | File + } + + }; +GetTemporaryFileById: { + id: string + + }; +DeleteTemporaryFileById: { + id: string + + }; + } + + + responses: { + PostTemporaryFile: string + ,GetTemporaryFileById: TemporaryFileResponseModel + ,DeleteTemporaryFileById: string + ,GetTemporaryFileConfiguration: TemporaryFileConfigurationResponseModel + + } + + } + +export type UpgradeData = { + + + responses: { + PostUpgradeAuthorize: string + ,GetUpgradeSettings: UpgradeSettingsResponseModel + + } + + } + +export type UserDataData = { + + payloads: { + PostUserData: { + requestBody?: CreateUserDataRequestModel + + }; +PutUserData: { + requestBody?: UpdateUserDataRequestModel + + }; +GetUserData: { + groups?: Array +identifiers?: Array +skip?: number +take?: number + + }; +GetUserDataById: { + id: string + + }; + } + + + responses: { + PostUserData: string + ,PutUserData: string + ,GetUserData: PagedUserDataResponseModel + ,GetUserDataById: UserDataModel + + } + + } + +export type UserGroupData = { + + payloads: { + GetItemUserGroup: { + id?: Array + + }; +DeleteUserGroup: { + requestBody?: DeleteUserGroupsRequestModel + + }; +PostUserGroup: { + requestBody?: CreateUserGroupRequestModel + + }; +GetUserGroup: { + skip?: number +take?: number + + }; +GetUserGroupById: { + id: string + + }; +DeleteUserGroupById: { + id: string + + }; +PutUserGroupById: { + id: string +requestBody?: UpdateUserGroupRequestModel + + }; +DeleteUserGroupByIdUsers: { + id: string +requestBody?: Array + + }; +PostUserGroupByIdUsers: { + id: string +requestBody?: Array + + }; + } + + + responses: { + GetItemUserGroup: Array + ,DeleteUserGroup: string + ,PostUserGroup: string + ,GetUserGroup: PagedUserGroupResponseModel + ,GetUserGroupById: UserGroupResponseModel + ,DeleteUserGroupById: string + ,PutUserGroupById: string + ,DeleteUserGroupByIdUsers: string + ,PostUserGroupByIdUsers: string + + } + + } + +export type UserData = { + + payloads: { + GetFilterUser: { + filter?: string +orderBy?: UserOrderModel +orderDirection?: DirectionModel +skip?: number +take?: number +userGroupIds?: Array +userStates?: Array + + }; +GetItemUser: { + id?: Array + + }; +PostUser: { + requestBody?: CreateUserRequestModel + + }; +DeleteUser: { + requestBody?: DeleteUsersRequestModel + + }; +GetUser: { + skip?: number +take?: number + + }; +GetUserById: { + id: string + + }; +DeleteUserById: { + id: string + + }; +PutUserById: { + id: string +requestBody?: UpdateUserRequestModel + + }; +GetUserById2Fa: { + id: string + + }; +DeleteUserById2FaByProviderName: { + id: string +providerName: string + + }; +PostUserByIdChangePassword: { + id: string +requestBody?: ChangePasswordUserRequestModel + + }; +PostUserByIdResetPassword: { + id: string + + }; +DeleteUserAvatarById: { + id: string + + }; +PostUserAvatarById: { + id: string +requestBody?: SetAvatarRequestModel + + }; +DeleteUserCurrent2FaByProviderName: { + code?: string +providerName: string + + }; +PostUserCurrent2FaByProviderName: { + providerName: string +requestBody?: EnableTwoFactorRequestModel + + }; +GetUserCurrent2FaByProviderName: { + providerName: string + + }; +PostUserCurrentAvatar: { + requestBody?: SetAvatarRequestModel + + }; +PostUserCurrentChangePassword: { + requestBody?: ChangePasswordCurrentUserRequestModel + + }; +GetUserCurrentPermissions: { + id?: Array + + }; +GetUserCurrentPermissionsDocument: { + id?: Array + + }; +GetUserCurrentPermissionsMedia: { + id?: Array + + }; +PostUserDisable: { + requestBody?: DisableUserRequestModel + + }; +PostUserEnable: { + requestBody?: EnableUserRequestModel + + }; +PostUserInvite: { + requestBody?: InviteUserRequestModel + + }; +PostUserInviteCreatePassword: { + requestBody?: CreateInitialPasswordUserRequestModel + + }; +PostUserInviteResend: { + requestBody?: ResendInviteUserRequestModel + + }; +PostUserInviteVerify: { + requestBody?: VerifyInviteUserRequestModel + + }; +PostUserSetUserGroups: { + requestBody?: UpdateUserGroupsOnUserRequestModel + + }; +PostUserUnlock: { + requestBody?: UnlockUsersRequestModel + + }; + } + + + responses: { + GetFilterUser: PagedUserResponseModel + ,GetItemUser: Array + ,PostUser: string + ,DeleteUser: string + ,GetUser: PagedUserResponseModel + ,GetUserById: UserResponseModel + ,DeleteUserById: string + ,PutUserById: string + ,GetUserById2Fa: Array + ,DeleteUserById2FaByProviderName: string + ,PostUserByIdChangePassword: string + ,PostUserByIdResetPassword: ResetPasswordUserResponseModel + ,DeleteUserAvatarById: string + ,PostUserAvatarById: string + ,GetUserConfiguration: UserConfigurationResponseModel + ,GetUserCurrent: CurrentUserResponseModel + ,GetUserCurrent2Fa: Array + ,DeleteUserCurrent2FaByProviderName: string + ,PostUserCurrent2FaByProviderName: NoopSetupTwoFactorModel + ,GetUserCurrent2FaByProviderName: NoopSetupTwoFactorModel + ,PostUserCurrentAvatar: string + ,PostUserCurrentChangePassword: string + ,GetUserCurrentConfiguration: CurrenUserConfigurationResponseModel + ,GetUserCurrentLogins: LinkedLoginsRequestModel + ,GetUserCurrentPermissions: UserPermissionsResponseModel + ,GetUserCurrentPermissionsDocument: Array + ,GetUserCurrentPermissionsMedia: UserPermissionsResponseModel + ,PostUserDisable: string + ,PostUserEnable: string + ,PostUserInvite: string + ,PostUserInviteCreatePassword: string + ,PostUserInviteResend: string + ,PostUserInviteVerify: VerifyInviteUserResponseModel + ,PostUserSetUserGroups: string + ,PostUserUnlock: string + + } + + } + +export type WebhookData = { + + payloads: { + GetWebhook: { + skip?: number +take?: number + + }; +PostWebhook: { + requestBody?: CreateWebhookRequestModel + + }; +GetWebhookById: { + id: string + + }; +PutWebhookById: { + id: string +requestBody?: UpdateWebhookRequestModel + + }; +DeleteWebhookById: { + id: string + + }; +GetWebhookItem: { + ids?: Array + + }; + } + + + responses: { + GetWebhook: PagedWebhookResponseModel + ,PostWebhook: string + ,GetWebhookById: WebhookResponseModel + ,PutWebhookById: string + ,DeleteWebhookById: string + ,GetWebhookItem: Array + + } + + } \ No newline at end of file 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 deleted file mode 100644 index 725f59422b..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/AllowedDocumentTypeModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type AllowedDocumentTypeModel = { - id: string; - name: string; - description?: string | null; - icon?: string | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/AllowedMediaTypeModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/AllowedMediaTypeModel.ts deleted file mode 100644 index bd575fa328..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/AllowedMediaTypeModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type AllowedMediaTypeModel = { - id: string; - name: string; - description?: string | null; - icon?: string | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/AuditLogEntityModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/AuditLogEntityModel.ts deleted file mode 100644 index 87e3a30ea8..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/AuditLogEntityModel.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type AuditLogEntityModel = { - id?: string | null; - type?: string | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/AuditLogResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/AuditLogResponseModel.ts deleted file mode 100644 index 69bb0cda07..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/AuditLogResponseModel.ts +++ /dev/null @@ -1,18 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { AuditLogEntityModel } from './AuditLogEntityModel'; -import type { AuditTypeModel } from './AuditTypeModel'; -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type AuditLogResponseModel = { - user: ReferenceByIdModel; - entity?: AuditLogEntityModel | null; - timestamp: string; - logType: AuditTypeModel; - comment?: string | null; - parameters?: string | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/AuditLogWithUsernameResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/AuditLogWithUsernameResponseModel.ts deleted file mode 100644 index 416fd4143b..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/AuditLogWithUsernameResponseModel.ts +++ /dev/null @@ -1,20 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { AuditLogEntityModel } from './AuditLogEntityModel'; -import type { AuditTypeModel } from './AuditTypeModel'; -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type AuditLogWithUsernameResponseModel = { - user: ReferenceByIdModel; - entity?: AuditLogEntityModel | null; - timestamp: string; - logType: AuditTypeModel; - comment?: string | null; - parameters?: string | null; - userName?: string | null; - userAvatars: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/AuditTypeModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/AuditTypeModel.ts deleted file mode 100644 index 32de956501..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/AuditTypeModel.ts +++ /dev/null @@ -1,31 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export enum AuditTypeModel { - NEW = 'New', - SAVE = 'Save', - SAVE_VARIANT = 'SaveVariant', - OPEN = 'Open', - DELETE = 'Delete', - PUBLISH = 'Publish', - PUBLISH_VARIANT = 'PublishVariant', - SEND_TO_PUBLISH = 'SendToPublish', - SEND_TO_PUBLISH_VARIANT = 'SendToPublishVariant', - UNPUBLISH = 'Unpublish', - UNPUBLISH_VARIANT = 'UnpublishVariant', - MOVE = 'Move', - COPY = 'Copy', - ASSIGN_DOMAIN = 'AssignDomain', - PUBLIC_ACCESS = 'PublicAccess', - SORT = 'Sort', - NOTIFY = 'Notify', - SYSTEM = 'System', - ROLL_BACK = 'RollBack', - PACKAGER_INSTALL = 'PackagerInstall', - PACKAGER_UNINSTALL = 'PackagerUninstall', - CUSTOM = 'Custom', - CONTENT_VERSION_PREVENT_CLEANUP = 'ContentVersionPreventCleanup', - CONTENT_VERSION_ENABLE_CLEANUP = 'ContentVersionEnableCleanup', -} 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 deleted file mode 100644 index f287c721e9..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/AvailableDocumentTypeCompositionResponseModel.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type AvailableDocumentTypeCompositionResponseModel = { - id: string; - name: string; - icon: string; - folderPath: Array; - isCompatible: boolean; -}; - 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 deleted file mode 100644 index a339d81430..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/AvailableMediaTypeCompositionResponseModel.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type AvailableMediaTypeCompositionResponseModel = { - id: string; - name: string; - icon: string; - folderPath: Array; - isCompatible: boolean; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/AvailableMemberTypeCompositionResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/AvailableMemberTypeCompositionResponseModel.ts deleted file mode 100644 index 8ef9fdf4af..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/AvailableMemberTypeCompositionResponseModel.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type AvailableMemberTypeCompositionResponseModel = { - id: string; - name: string; - icon: string; - folderPath: Array; - isCompatible: boolean; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ChangePasswordCurrentUserRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ChangePasswordCurrentUserRequestModel.ts deleted file mode 100644 index dd395b8d39..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ChangePasswordCurrentUserRequestModel.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type ChangePasswordCurrentUserRequestModel = { - newPassword: string; - oldPassword?: string | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ChangePasswordUserRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ChangePasswordUserRequestModel.ts deleted file mode 100644 index 19eba5db1a..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ChangePasswordUserRequestModel.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type ChangePasswordUserRequestModel = { - newPassword: string; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CompositionTypeModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CompositionTypeModel.ts deleted file mode 100644 index 63dfdae1e6..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CompositionTypeModel.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export enum CompositionTypeModel { - COMPOSITION = 'Composition', - INHERITANCE = 'Inheritance', -} diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ConsentLevelPresentationModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ConsentLevelPresentationModel.ts deleted file mode 100644 index 1df32f48de..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ConsentLevelPresentationModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { TelemetryLevelModel } from './TelemetryLevelModel'; - -export type ConsentLevelPresentationModel = { - level: TelemetryLevelModel; - description: string; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CopyDataTypeRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CopyDataTypeRequestModel.ts deleted file mode 100644 index 44660e907d..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CopyDataTypeRequestModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type CopyDataTypeRequestModel = { - target?: ReferenceByIdModel | null; -}; - 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 deleted file mode 100644 index 828849c9ac..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CopyDocumentRequestModel.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type CopyDocumentRequestModel = { - 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 deleted file mode 100644 index 346920d256..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CopyDocumentTypeRequestModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* 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 deleted file mode 100644 index 943722db52..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CopyMediaTypeRequestModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* 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/CreateDataTypeRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateDataTypeRequestModel.ts deleted file mode 100644 index 5c29779e3b..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateDataTypeRequestModel.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { DataTypePropertyPresentationModel } from './DataTypePropertyPresentationModel'; -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type CreateDataTypeRequestModel = { - name: string; - editorAlias: string; - editorUiAlias?: string | null; - values: Array; - id?: string | null; - parent?: ReferenceByIdModel | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateDictionaryItemRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateDictionaryItemRequestModel.ts deleted file mode 100644 index deb3fb7478..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateDictionaryItemRequestModel.ts +++ /dev/null @@ -1,15 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { DictionaryItemTranslationModel } from './DictionaryItemTranslationModel'; -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type CreateDictionaryItemRequestModel = { - name: string; - translations: Array; - id?: string | null; - parent?: ReferenceByIdModel | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateDocumentBlueprintFromDocumentRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateDocumentBlueprintFromDocumentRequestModel.ts deleted file mode 100644 index f5a3a63852..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateDocumentBlueprintFromDocumentRequestModel.ts +++ /dev/null @@ -1,14 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type CreateDocumentBlueprintFromDocumentRequestModel = { - document: ReferenceByIdModel; - id?: string | null; - name: string; - parent?: ReferenceByIdModel | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateDocumentBlueprintRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateDocumentBlueprintRequestModel.ts deleted file mode 100644 index cf28d637b5..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateDocumentBlueprintRequestModel.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { DocumentValueModel } from './DocumentValueModel'; -import type { DocumentVariantRequestModel } from './DocumentVariantRequestModel'; -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type CreateDocumentBlueprintRequestModel = { - values: Array; - variants: Array; - id?: string | null; - parent?: ReferenceByIdModel | null; - documentType: ReferenceByIdModel; -}; - 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 deleted file mode 100644 index a21cf5989e..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateDocumentRequestModel.ts +++ /dev/null @@ -1,18 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { DocumentValueModel } from './DocumentValueModel'; -import type { DocumentVariantRequestModel } from './DocumentVariantRequestModel'; -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type CreateDocumentRequestModel = { - values: Array; - variants: Array; - id?: string | null; - parent?: ReferenceByIdModel | null; - documentType: ReferenceByIdModel; - template?: ReferenceByIdModel | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateDocumentTypePropertyTypeContainerRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateDocumentTypePropertyTypeContainerRequestModel.ts deleted file mode 100644 index 370a87978b..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateDocumentTypePropertyTypeContainerRequestModel.ts +++ /dev/null @@ -1,15 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type CreateDocumentTypePropertyTypeContainerRequestModel = { - id: string; - parent?: ReferenceByIdModel | null; - name?: string | null; - type: string; - sortOrder: number; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateDocumentTypePropertyTypeRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateDocumentTypePropertyTypeRequestModel.ts deleted file mode 100644 index 902b96b771..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateDocumentTypePropertyTypeRequestModel.ts +++ /dev/null @@ -1,23 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { PropertyTypeAppearanceModel } from './PropertyTypeAppearanceModel'; -import type { PropertyTypeValidationModel } from './PropertyTypeValidationModel'; -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type CreateDocumentTypePropertyTypeRequestModel = { - id: string; - container?: ReferenceByIdModel | null; - sortOrder: number; - alias: string; - name: string; - description?: string | null; - dataType: ReferenceByIdModel; - variesByCulture: boolean; - variesBySegment: boolean; - validation: PropertyTypeValidationModel; - appearance: PropertyTypeAppearanceModel; -}; - 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 deleted file mode 100644 index 11d2577dd8..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateDocumentTypeRequestModel.ts +++ /dev/null @@ -1,33 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { CreateDocumentTypePropertyTypeContainerRequestModel } from './CreateDocumentTypePropertyTypeContainerRequestModel'; -import type { CreateDocumentTypePropertyTypeRequestModel } from './CreateDocumentTypePropertyTypeRequestModel'; -import type { DocumentTypeCleanupModel } from './DocumentTypeCleanupModel'; -import type { DocumentTypeCompositionModel } from './DocumentTypeCompositionModel'; -import type { DocumentTypeSortModel } from './DocumentTypeSortModel'; -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type CreateDocumentTypeRequestModel = { - alias: string; - name: string; - description?: string | null; - icon: string; - allowedAsRoot: boolean; - variesByCulture: boolean; - variesBySegment: boolean; - collection?: ReferenceByIdModel | null; - isElement: boolean; - properties: Array; - containers: Array; - id?: string | null; - parent?: ReferenceByIdModel | null; - allowedTemplates: Array; - defaultTemplate?: ReferenceByIdModel | null; - cleanup: DocumentTypeCleanupModel; - allowedDocumentTypes: Array; - compositions: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateFolderRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateFolderRequestModel.ts deleted file mode 100644 index f87cdddc18..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateFolderRequestModel.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type CreateFolderRequestModel = { - name: string; - id?: string | null; - parent?: ReferenceByIdModel | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateInitialPasswordUserRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateInitialPasswordUserRequestModel.ts deleted file mode 100644 index e62a6c6cf4..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateInitialPasswordUserRequestModel.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type CreateInitialPasswordUserRequestModel = { - user: ReferenceByIdModel; - token: string; - password: string; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateLanguageRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateLanguageRequestModel.ts deleted file mode 100644 index d1489b85d5..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateLanguageRequestModel.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type CreateLanguageRequestModel = { - name: string; - isDefault: boolean; - isMandatory: boolean; - fallbackIsoCode?: string | null; - isoCode: string; -}; - 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 deleted file mode 100644 index 1dbf12c631..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateMediaRequestModel.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { MediaValueModel } from './MediaValueModel'; -import type { MediaVariantRequestModel } from './MediaVariantRequestModel'; -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type CreateMediaRequestModel = { - values: Array; - variants: Array; - id?: string | null; - parent?: ReferenceByIdModel | null; - mediaType: ReferenceByIdModel; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateMediaTypePropertyTypeContainerRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateMediaTypePropertyTypeContainerRequestModel.ts deleted file mode 100644 index 5a8ab7d46c..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateMediaTypePropertyTypeContainerRequestModel.ts +++ /dev/null @@ -1,15 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type CreateMediaTypePropertyTypeContainerRequestModel = { - id: string; - parent?: ReferenceByIdModel | null; - name?: string | null; - type: string; - sortOrder: number; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateMediaTypePropertyTypeRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateMediaTypePropertyTypeRequestModel.ts deleted file mode 100644 index 17a5b45de7..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateMediaTypePropertyTypeRequestModel.ts +++ /dev/null @@ -1,23 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { PropertyTypeAppearanceModel } from './PropertyTypeAppearanceModel'; -import type { PropertyTypeValidationModel } from './PropertyTypeValidationModel'; -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type CreateMediaTypePropertyTypeRequestModel = { - id: string; - container?: ReferenceByIdModel | null; - sortOrder: number; - alias: string; - name: string; - description?: string | null; - dataType: ReferenceByIdModel; - variesByCulture: boolean; - variesBySegment: boolean; - validation: PropertyTypeValidationModel; - appearance: PropertyTypeAppearanceModel; -}; - 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 deleted file mode 100644 index f7c41dd1bd..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateMediaTypeRequestModel.ts +++ /dev/null @@ -1,29 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { CreateMediaTypePropertyTypeContainerRequestModel } from './CreateMediaTypePropertyTypeContainerRequestModel'; -import type { CreateMediaTypePropertyTypeRequestModel } from './CreateMediaTypePropertyTypeRequestModel'; -import type { MediaTypeCompositionModel } from './MediaTypeCompositionModel'; -import type { MediaTypeSortModel } from './MediaTypeSortModel'; -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type CreateMediaTypeRequestModel = { - alias: string; - name: string; - description?: string | null; - icon: string; - allowedAsRoot: boolean; - variesByCulture: boolean; - variesBySegment: boolean; - isElement: boolean; - properties: Array; - containers: Array; - id?: string | null; - parent?: ReferenceByIdModel | null; - allowedMediaTypes: Array; - compositions: Array; - collection?: ReferenceByIdModel | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateMemberGroupRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateMemberGroupRequestModel.ts deleted file mode 100644 index ebfbea378f..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateMemberGroupRequestModel.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type CreateMemberGroupRequestModel = { - name: string; - id?: string | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateMemberRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateMemberRequestModel.ts deleted file mode 100644 index 65add263b9..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateMemberRequestModel.ts +++ /dev/null @@ -1,21 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { MemberValueModel } from './MemberValueModel'; -import type { MemberVariantRequestModel } from './MemberVariantRequestModel'; -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type CreateMemberRequestModel = { - values: Array; - variants: Array; - id?: string | null; - email: string; - username: string; - password: string; - memberType: ReferenceByIdModel; - groups?: Array | null; - isApproved: boolean; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateMemberTypePropertyTypeContainerRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateMemberTypePropertyTypeContainerRequestModel.ts deleted file mode 100644 index 1815f05075..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateMemberTypePropertyTypeContainerRequestModel.ts +++ /dev/null @@ -1,15 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type CreateMemberTypePropertyTypeContainerRequestModel = { - id: string; - parent?: ReferenceByIdModel | null; - name?: string | null; - type: string; - sortOrder: number; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateMemberTypePropertyTypeRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateMemberTypePropertyTypeRequestModel.ts deleted file mode 100644 index f3681e28ca..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateMemberTypePropertyTypeRequestModel.ts +++ /dev/null @@ -1,26 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { MemberTypePropertyTypeVisibilityModel } from './MemberTypePropertyTypeVisibilityModel'; -import type { PropertyTypeAppearanceModel } from './PropertyTypeAppearanceModel'; -import type { PropertyTypeValidationModel } from './PropertyTypeValidationModel'; -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type CreateMemberTypePropertyTypeRequestModel = { - id: string; - container?: ReferenceByIdModel | null; - sortOrder: number; - alias: string; - name: string; - description?: string | null; - dataType: ReferenceByIdModel; - variesByCulture: boolean; - variesBySegment: boolean; - validation: PropertyTypeValidationModel; - appearance: PropertyTypeAppearanceModel; - isSensitive: boolean; - visibility: MemberTypePropertyTypeVisibilityModel; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateMemberTypeRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateMemberTypeRequestModel.ts deleted file mode 100644 index 4904e62cc0..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateMemberTypeRequestModel.ts +++ /dev/null @@ -1,26 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { CreateMemberTypePropertyTypeContainerRequestModel } from './CreateMemberTypePropertyTypeContainerRequestModel'; -import type { CreateMemberTypePropertyTypeRequestModel } from './CreateMemberTypePropertyTypeRequestModel'; -import type { MemberTypeCompositionModel } from './MemberTypeCompositionModel'; -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type CreateMemberTypeRequestModel = { - alias: string; - name: string; - description?: string | null; - icon: string; - allowedAsRoot: boolean; - variesByCulture: boolean; - variesBySegment: boolean; - collection?: ReferenceByIdModel | null; - isElement: boolean; - properties: Array; - containers: Array; - id?: string | null; - compositions: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreatePackageRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreatePackageRequestModel.ts deleted file mode 100644 index 97496f1f92..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreatePackageRequestModel.ts +++ /dev/null @@ -1,22 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type CreatePackageRequestModel = { - name: string; - contentNodeId?: string | null; - contentLoadChildNodes: boolean; - mediaIds: Array; - mediaLoadChildNodes: boolean; - documentTypes: Array; - mediaTypes: Array; - dataTypes: Array; - templates: Array; - partialViews: Array; - stylesheets: Array; - scripts: Array; - languages: Array; - dictionaryItems: 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 deleted file mode 100644 index 15282452c9..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreatePartialViewFolderRequestModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { FileSystemFolderModel } from './FileSystemFolderModel'; - -export type CreatePartialViewFolderRequestModel = { - name: string; - parent?: FileSystemFolderModel | null; -}; - 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 deleted file mode 100644 index 82139f8109..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreatePartialViewRequestModel.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { FileSystemFolderModel } from './FileSystemFolderModel'; - -export type CreatePartialViewRequestModel = { - name: string; - parent?: FileSystemFolderModel | null; - content: string; -}; - 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 deleted file mode 100644 index 54832896b3..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateScriptFolderRequestModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { FileSystemFolderModel } from './FileSystemFolderModel'; - -export type CreateScriptFolderRequestModel = { - name: string; - parent?: FileSystemFolderModel | null; -}; - 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 deleted file mode 100644 index 5e93399521..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateScriptRequestModel.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { FileSystemFolderModel } from './FileSystemFolderModel'; - -export type CreateScriptRequestModel = { - name: string; - parent?: FileSystemFolderModel | null; - content: string; -}; - 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 deleted file mode 100644 index e31be7b932..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateStylesheetFolderRequestModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { FileSystemFolderModel } from './FileSystemFolderModel'; - -export type CreateStylesheetFolderRequestModel = { - name: string; - parent?: FileSystemFolderModel | null; -}; - 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 deleted file mode 100644 index 681e36ed05..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateStylesheetRequestModel.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { FileSystemFolderModel } from './FileSystemFolderModel'; - -export type CreateStylesheetRequestModel = { - name: string; - parent?: FileSystemFolderModel | null; - content: string; -}; - 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 deleted file mode 100644 index a1997efd5e..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateTemplateRequestModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type CreateTemplateRequestModel = { - name: string; - alias: string; - content?: string | null; - id?: string | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateUserGroupRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateUserGroupRequestModel.ts deleted file mode 100644 index a7d78bca69..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateUserGroupRequestModel.ts +++ /dev/null @@ -1,23 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { DocumentPermissionPresentationModel } from './DocumentPermissionPresentationModel'; -import type { ReferenceByIdModel } from './ReferenceByIdModel'; -import type { UnknownTypePermissionPresentationModel } from './UnknownTypePermissionPresentationModel'; - -export type CreateUserGroupRequestModel = { - name: string; - icon?: string | null; - sections: Array; - languages: Array; - hasAccessToAllLanguages: boolean; - documentStartNode?: ReferenceByIdModel | null; - documentRootAccess: boolean; - mediaStartNode?: ReferenceByIdModel | null; - mediaRootAccess: boolean; - fallbackPermissions: Array; - permissions: Array<(DocumentPermissionPresentationModel | UnknownTypePermissionPresentationModel)>; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateUserRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateUserRequestModel.ts deleted file mode 100644 index 08ecdf6439..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateUserRequestModel.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type CreateUserRequestModel = { - email: string; - userName: string; - name: string; - userGroupIds: Array; - id?: string | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateWebhookRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateWebhookRequestModel.ts deleted file mode 100644 index 323b7705d7..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CreateWebhookRequestModel.ts +++ /dev/null @@ -1,14 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type CreateWebhookRequestModel = { - enabled: boolean; - url: string; - contentTypeKeys: Array; - headers: Record; - id?: string | null; - events: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CultureAndScheduleRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CultureAndScheduleRequestModel.ts deleted file mode 100644 index 8ebf39abe3..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CultureAndScheduleRequestModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ScheduleRequestModel } from './ScheduleRequestModel'; - -export type CultureAndScheduleRequestModel = { - culture?: string | null; - schedule?: ScheduleRequestModel | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CultureReponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CultureReponseModel.ts deleted file mode 100644 index 3bb48f8923..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CultureReponseModel.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type CultureReponseModel = { - name: string; - englishName: string; -}; - 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 deleted file mode 100644 index 4b398efa9d..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CurrenUserConfigurationResponseModel.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* 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/CurrentUserResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CurrentUserResponseModel.ts deleted file mode 100644 index 12fbc0ae0d..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/CurrentUserResponseModel.ts +++ /dev/null @@ -1,26 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { DocumentPermissionPresentationModel } from './DocumentPermissionPresentationModel'; -import type { UnknownTypePermissionPresentationModel } from './UnknownTypePermissionPresentationModel'; - -export type CurrentUserResponseModel = { - id: string; - email: string; - userName: string; - name: string; - languageIsoCode?: string | null; - documentStartNodeIds: Array; - mediaStartNodeIds: Array; - avatarUrls: Array; - languages: Array; - hasAccessToAllLanguages: boolean; - hasAccessToSensitiveData: boolean; - fallbackPermissions: Array; - permissions: Array<(DocumentPermissionPresentationModel | UnknownTypePermissionPresentationModel)>; - allowedSections: Array; - isAdmin: boolean; -}; - 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 deleted file mode 100644 index fe470165fb..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DataTypeChangeModeModel.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* 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 deleted file mode 100644 index 6ce59dedaa..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DataTypeItemResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type DataTypeItemResponseModel = { - id: string; - name: string; - editorUiAlias?: string | null; - isDeletable: boolean; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DataTypePropertyPresentationModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DataTypePropertyPresentationModel.ts deleted file mode 100644 index 5c6f1bf9a5..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DataTypePropertyPresentationModel.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type DataTypePropertyPresentationModel = { - alias: string; - value?: any; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DataTypePropertyReferenceModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DataTypePropertyReferenceModel.ts deleted file mode 100644 index 34599f578a..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DataTypePropertyReferenceModel.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type DataTypePropertyReferenceModel = { - name: string; - alias: string; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DataTypeReferenceResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DataTypeReferenceResponseModel.ts deleted file mode 100644 index 60b4ebf070..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DataTypeReferenceResponseModel.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { DataTypePropertyReferenceModel } from './DataTypePropertyReferenceModel'; - -export type DataTypeReferenceResponseModel = { - id: string; - type: string; - properties: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DataTypeResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DataTypeResponseModel.ts deleted file mode 100644 index 56629e41fc..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DataTypeResponseModel.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { DataTypePropertyPresentationModel } from './DataTypePropertyPresentationModel'; - -export type DataTypeResponseModel = { - name: string; - editorAlias: string; - editorUiAlias?: string | null; - values: Array; - id: string; - isDeletable: boolean; - canIgnoreStartNodes: boolean; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DataTypeTreeItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DataTypeTreeItemResponseModel.ts deleted file mode 100644 index 450ae578e0..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DataTypeTreeItemResponseModel.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type DataTypeTreeItemResponseModel = { - hasChildren: boolean; - id: string; - parent?: ReferenceByIdModel | null; - name: string; - isFolder: boolean; - editorUiAlias?: string | null; - isDeletable: boolean; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DatabaseInstallRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DatabaseInstallRequestModel.ts deleted file mode 100644 index d48d7e5551..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DatabaseInstallRequestModel.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type DatabaseInstallRequestModel = { - id: string; - providerName: string; - server?: string | null; - name?: string | null; - username?: string | null; - password?: string | null; - useIntegratedAuthentication: boolean; - connectionString?: string | null; - trustServerCertificate: boolean; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DatabaseSettingsPresentationModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DatabaseSettingsPresentationModel.ts deleted file mode 100644 index 219b792647..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DatabaseSettingsPresentationModel.ts +++ /dev/null @@ -1,19 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type DatabaseSettingsPresentationModel = { - id: string; - sortOrder: number; - displayName: string; - defaultDatabaseName: string; - providerName: string; - isConfigured: boolean; - requiresServer: boolean; - serverPlaceholder: string; - requiresCredentials: boolean; - supportsIntegratedAuthentication: boolean; - requiresConnectionTest: boolean; -}; - 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 deleted file mode 100644 index 5156cd1512..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DatatypeConfigurationResponseModel.ts +++ /dev/null @@ -1,14 +0,0 @@ -/* 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; - documentListViewId: string; - mediaListViewId: string; - memberListViewId: string; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DefaultReferenceResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DefaultReferenceResponseModel.ts deleted file mode 100644 index ee9ea849a5..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DefaultReferenceResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type DefaultReferenceResponseModel = { - id: string; - name?: string | null; - type?: string | null; - icon?: string | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DeleteUserGroupsRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DeleteUserGroupsRequestModel.ts deleted file mode 100644 index 6942407664..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DeleteUserGroupsRequestModel.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type DeleteUserGroupsRequestModel = { - userGroupIds: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DeleteUsersRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DeleteUsersRequestModel.ts deleted file mode 100644 index c6f210a95c..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DeleteUsersRequestModel.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type DeleteUsersRequestModel = { - userIds: Array; -}; - 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 deleted file mode 100644 index 04da3773ba..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DictionaryItemItemResponseModel.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type DictionaryItemItemResponseModel = { - id: string; - name: string; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DictionaryItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DictionaryItemResponseModel.ts deleted file mode 100644 index 5645077355..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DictionaryItemResponseModel.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { DictionaryItemTranslationModel } from './DictionaryItemTranslationModel'; - -export type DictionaryItemResponseModel = { - name: string; - translations: Array; - id: string; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DictionaryItemTranslationModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DictionaryItemTranslationModel.ts deleted file mode 100644 index 2016bf3674..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DictionaryItemTranslationModel.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type DictionaryItemTranslationModel = { - isoCode: string; - translation: string; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DictionaryOverviewResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DictionaryOverviewResponseModel.ts deleted file mode 100644 index c703cb41b3..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DictionaryOverviewResponseModel.ts +++ /dev/null @@ -1,14 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type DictionaryOverviewResponseModel = { - name?: string | null; - id: string; - parent?: ReferenceByIdModel | null; - translatedIsoCodes: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DirectionModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DirectionModel.ts deleted file mode 100644 index 7073765f71..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DirectionModel.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export enum DirectionModel { - ASCENDING = 'Ascending', - DESCENDING = 'Descending', -} diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DisableUserRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DisableUserRequestModel.ts deleted file mode 100644 index d761f29549..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DisableUserRequestModel.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type DisableUserRequestModel = { - userIds: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentBlueprintItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentBlueprintItemResponseModel.ts deleted file mode 100644 index f7effed27c..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentBlueprintItemResponseModel.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { DocumentTypeReferenceResponseModel } from './DocumentTypeReferenceResponseModel'; - -export type DocumentBlueprintItemResponseModel = { - id: string; - name: string; - documentType: DocumentTypeReferenceResponseModel; -}; - 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 deleted file mode 100644 index 4f6601241b..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentBlueprintResponseModel.ts +++ /dev/null @@ -1,16 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { DocumentTypeReferenceResponseModel } from './DocumentTypeReferenceResponseModel'; -import type { DocumentValueModel } from './DocumentValueModel'; -import type { DocumentVariantResponseModel } from './DocumentVariantResponseModel'; - -export type DocumentBlueprintResponseModel = { - values: Array; - variants: Array; - id: string; - documentType: DocumentTypeReferenceResponseModel; -}; - 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 deleted file mode 100644 index 3df3c06dce..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentBlueprintTreeItemResponseModel.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { DocumentTypeReferenceResponseModel } from './DocumentTypeReferenceResponseModel'; -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type DocumentBlueprintTreeItemResponseModel = { - hasChildren: boolean; - id: string; - parent?: ReferenceByIdModel | null; - name: string; - isFolder: boolean; - documentType?: DocumentTypeReferenceResponseModel | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentCollectionResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentCollectionResponseModel.ts deleted file mode 100644 index c8636e3fd1..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentCollectionResponseModel.ts +++ /dev/null @@ -1,19 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { DocumentTypeCollectionReferenceResponseModel } from './DocumentTypeCollectionReferenceResponseModel'; -import type { DocumentValueModel } from './DocumentValueModel'; -import type { DocumentVariantResponseModel } from './DocumentVariantResponseModel'; - -export type DocumentCollectionResponseModel = { - values: Array; - variants: Array; - id: string; - creator?: string | null; - sortOrder: number; - documentType: DocumentTypeCollectionReferenceResponseModel; - updater?: 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 deleted file mode 100644 index 814b141b50..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentConfigurationResponseModel.ts +++ /dev/null @@ -1,14 +0,0 @@ -/* 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; - allowNonExistingSegmentsCreation: boolean; - reservedFieldNames: Array; -}; - 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 deleted file mode 100644 index 4721077438..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentItemResponseModel.ts +++ /dev/null @@ -1,16 +0,0 @@ -/* 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'; - -export type DocumentItemResponseModel = { - id: string; - isTrashed: boolean; - isProtected: boolean; - documentType: DocumentTypeReferenceResponseModel; - variants: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentNotificationResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentNotificationResponseModel.ts deleted file mode 100644 index 72e7e8629d..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentNotificationResponseModel.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type DocumentNotificationResponseModel = { - actionId: string; - subscribed: boolean; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentPermissionPresentationModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentPermissionPresentationModel.ts deleted file mode 100644 index 420b96ec34..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentPermissionPresentationModel.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type DocumentPermissionPresentationModel = { - $type: string; - document: ReferenceByIdModel; - verbs: 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 deleted file mode 100644 index 0cbc6e3eed..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentRecycleBinItemResponseModel.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* 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 { ItemReferenceByIdResponseModel } from './ItemReferenceByIdResponseModel'; - -export type DocumentRecycleBinItemResponseModel = { - id: string; - hasChildren: boolean; - parent?: ItemReferenceByIdResponseModel | null; - documentType: DocumentTypeReferenceResponseModel; - variants: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentReferenceResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentReferenceResponseModel.ts deleted file mode 100644 index 07f70a7893..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentReferenceResponseModel.ts +++ /dev/null @@ -1,14 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { TrackedReferenceDocumentTypeModel } from './TrackedReferenceDocumentTypeModel'; - -export type DocumentReferenceResponseModel = { - id: string; - name?: string | null; - published?: boolean | null; - documentType: TrackedReferenceDocumentTypeModel; -}; - 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 deleted file mode 100644 index e748a2fa23..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentResponseModel.ts +++ /dev/null @@ -1,21 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { DocumentTypeReferenceResponseModel } from './DocumentTypeReferenceResponseModel'; -import type { DocumentUrlInfoModel } from './DocumentUrlInfoModel'; -import type { DocumentValueModel } from './DocumentValueModel'; -import type { DocumentVariantResponseModel } from './DocumentVariantResponseModel'; -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type DocumentResponseModel = { - values: Array; - variants: Array; - id: string; - documentType: DocumentTypeReferenceResponseModel; - urls: Array; - template?: ReferenceByIdModel | null; - isTrashed: boolean; -}; - 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 deleted file mode 100644 index 85c85414ce..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTreeItemResponseModel.ts +++ /dev/null @@ -1,20 +0,0 @@ -/* 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 { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type DocumentTreeItemResponseModel = { - hasChildren: boolean; - parent?: ReferenceByIdModel | null; - noAccess: boolean; - isTrashed: boolean; - id: string; - isProtected: boolean; - documentType: DocumentTypeReferenceResponseModel; - variants: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypeCleanupModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypeCleanupModel.ts deleted file mode 100644 index c6bcdef753..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypeCleanupModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type DocumentTypeCleanupModel = { - preventCleanup: boolean; - keepAllVersionsNewerThanDays?: number | null; - keepLatestVersionPerDayForDays?: number | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypeCollectionReferenceResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypeCollectionReferenceResponseModel.ts deleted file mode 100644 index 8922a1b413..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypeCollectionReferenceResponseModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type DocumentTypeCollectionReferenceResponseModel = { - id: string; - alias: string; - icon: string; -}; - 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 deleted file mode 100644 index 5cb10be1d0..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypeCompositionModel.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* 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 deleted file mode 100644 index cfd8527f75..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypeCompositionRequestModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type DocumentTypeCompositionRequestModel = { - id?: string | null; - currentPropertyAliases: Array; - currentCompositeIds: Array; - 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 deleted file mode 100644 index 77785325a6..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypeCompositionResponseModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type DocumentTypeCompositionResponseModel = { - id: string; - name: string; - icon: string; -}; - 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 deleted file mode 100644 index a0ad32119c..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypeConfigurationResponseModel.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* 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; - useSegments: 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 deleted file mode 100644 index a0c7a5c1be..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypeItemResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type DocumentTypeItemResponseModel = { - id: string; - name: string; - isElement: boolean; - icon?: string | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypePropertyTypeContainerResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypePropertyTypeContainerResponseModel.ts deleted file mode 100644 index ba1da5ed90..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypePropertyTypeContainerResponseModel.ts +++ /dev/null @@ -1,15 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type DocumentTypePropertyTypeContainerResponseModel = { - id: string; - parent?: ReferenceByIdModel | null; - name?: string | null; - type: string; - sortOrder: number; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypePropertyTypeResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypePropertyTypeResponseModel.ts deleted file mode 100644 index 8ab9019a74..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypePropertyTypeResponseModel.ts +++ /dev/null @@ -1,23 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { PropertyTypeAppearanceModel } from './PropertyTypeAppearanceModel'; -import type { PropertyTypeValidationModel } from './PropertyTypeValidationModel'; -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type DocumentTypePropertyTypeResponseModel = { - id: string; - container?: ReferenceByIdModel | null; - sortOrder: number; - alias: string; - name: string; - description?: string | null; - dataType: ReferenceByIdModel; - variesByCulture: boolean; - variesBySegment: boolean; - validation: PropertyTypeValidationModel; - appearance: PropertyTypeAppearanceModel; -}; - 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 deleted file mode 100644 index 6c330ee6bc..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypeReferenceResponseModel.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type DocumentTypeReferenceResponseModel = { - id: string; - icon: string; - collection?: ReferenceByIdModel | null; -}; - 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 deleted file mode 100644 index 59794877d0..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypeResponseModel.ts +++ /dev/null @@ -1,32 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { DocumentTypeCleanupModel } from './DocumentTypeCleanupModel'; -import type { DocumentTypeCompositionModel } from './DocumentTypeCompositionModel'; -import type { DocumentTypePropertyTypeContainerResponseModel } from './DocumentTypePropertyTypeContainerResponseModel'; -import type { DocumentTypePropertyTypeResponseModel } from './DocumentTypePropertyTypeResponseModel'; -import type { DocumentTypeSortModel } from './DocumentTypeSortModel'; -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type DocumentTypeResponseModel = { - alias: string; - name: string; - description?: string | null; - icon: string; - allowedAsRoot: boolean; - variesByCulture: boolean; - variesBySegment: boolean; - collection?: ReferenceByIdModel | null; - isElement: boolean; - properties: Array; - containers: Array; - id: string; - allowedTemplates: Array; - defaultTemplate?: ReferenceByIdModel | null; - cleanup: DocumentTypeCleanupModel; - 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 deleted file mode 100644 index 82dfba4614..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypeSortModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* 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/DocumentTypeTreeItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypeTreeItemResponseModel.ts deleted file mode 100644 index 2f19862537..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentTypeTreeItemResponseModel.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type DocumentTypeTreeItemResponseModel = { - hasChildren: boolean; - id: string; - parent?: ReferenceByIdModel | null; - name: string; - isFolder: boolean; - isElement: boolean; - icon: string; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentUrlInfoModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentUrlInfoModel.ts deleted file mode 100644 index 19abf147fb..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentUrlInfoModel.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type DocumentUrlInfoModel = { - culture?: string | null; - url: string; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentValueModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentValueModel.ts deleted file mode 100644 index 7dbb92fb62..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentValueModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type DocumentValueModel = { - culture?: string | null; - segment?: string | null; - alias: string; - value?: any; -}; - 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 deleted file mode 100644 index be8ee74fa3..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentVariantItemResponseModel.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { DocumentVariantStateModel } from './DocumentVariantStateModel'; - -export type DocumentVariantItemResponseModel = { - name: string; - culture?: string | null; - state: DocumentVariantStateModel; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentVariantRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentVariantRequestModel.ts deleted file mode 100644 index cfe9479479..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentVariantRequestModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type DocumentVariantRequestModel = { - culture?: string | null; - segment?: string | null; - name: string; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentVariantResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentVariantResponseModel.ts deleted file mode 100644 index fed5af6be7..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentVariantResponseModel.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { DocumentVariantStateModel } from './DocumentVariantStateModel'; - -export type DocumentVariantResponseModel = { - culture?: string | null; - segment?: string | null; - name: string; - createDate: string; - updateDate: string; - state: DocumentVariantStateModel; - publishDate?: string | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentVariantStateModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentVariantStateModel.ts deleted file mode 100644 index eb4077b844..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentVariantStateModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export enum DocumentVariantStateModel { - NOT_CREATED = 'NotCreated', - DRAFT = 'Draft', - PUBLISHED = 'Published', - PUBLISHED_PENDING_CHANGES = 'PublishedPendingChanges', -} diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentVersionItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentVersionItemResponseModel.ts deleted file mode 100644 index e48dfed526..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentVersionItemResponseModel.ts +++ /dev/null @@ -1,18 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type DocumentVersionItemResponseModel = { - id: string; - document: ReferenceByIdModel; - documentType: ReferenceByIdModel; - user: ReferenceByIdModel; - versionDate: string; - isCurrentPublishedVersion: boolean; - isCurrentDraftVersion: boolean; - preventCleanup: boolean; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentVersionResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentVersionResponseModel.ts deleted file mode 100644 index 10863233ba..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DocumentVersionResponseModel.ts +++ /dev/null @@ -1,18 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { DocumentTypeReferenceResponseModel } from './DocumentTypeReferenceResponseModel'; -import type { DocumentValueModel } from './DocumentValueModel'; -import type { DocumentVariantResponseModel } from './DocumentVariantResponseModel'; -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type DocumentVersionResponseModel = { - values: Array; - variants: Array; - id: string; - documentType: DocumentTypeReferenceResponseModel; - document?: ReferenceByIdModel | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DomainPresentationModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DomainPresentationModel.ts deleted file mode 100644 index 497ce2ae8e..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DomainPresentationModel.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type DomainPresentationModel = { - domainName: string; - isoCode: string; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DomainsResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DomainsResponseModel.ts deleted file mode 100644 index a9db3960b0..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DomainsResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { DomainPresentationModel } from './DomainPresentationModel'; - -export type DomainsResponseModel = { - defaultIsoCode?: string | null; - domains: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DynamicRootContextRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DynamicRootContextRequestModel.ts deleted file mode 100644 index 0bef115133..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DynamicRootContextRequestModel.ts +++ /dev/null @@ -1,14 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type DynamicRootContextRequestModel = { - id?: string | null; - parent: ReferenceByIdModel; - culture?: string | null; - 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 deleted file mode 100644 index 4d882670e7..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DynamicRootQueryOriginRequestModel.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type DynamicRootQueryOriginRequestModel = { - alias: string; - id?: 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 deleted file mode 100644 index 429c72a4d4..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DynamicRootQueryRequestModel.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* 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 deleted file mode 100644 index fad5ca362e..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DynamicRootQueryStepRequestModel.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* 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 deleted file mode 100644 index 14d3647bc1..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DynamicRootRequestModel.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* 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/DynamicRootResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DynamicRootResponseModel.ts deleted file mode 100644 index da6a956c7b..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/DynamicRootResponseModel.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -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 deleted file mode 100644 index 7c49e5b473..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/EnableTwoFactorRequestModel.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* 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/EnableUserRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/EnableUserRequestModel.ts deleted file mode 100644 index 149c8cb3b7..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/EnableUserRequestModel.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type EnableUserRequestModel = { - userIds: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/EventMessageTypeModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/EventMessageTypeModel.ts deleted file mode 100644 index 07e96dbc24..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/EventMessageTypeModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export enum EventMessageTypeModel { - DEFAULT = 'Default', - INFO = 'Info', - ERROR = 'Error', - SUCCESS = 'Success', - WARNING = 'Warning', -} diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FieldPresentationModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FieldPresentationModel.ts deleted file mode 100644 index 5a39dbab7c..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FieldPresentationModel.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type FieldPresentationModel = { - name: string; - values: Array; -}; - 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 deleted file mode 100644 index 4e3e5a8217..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FileSystemFolderModel.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type FileSystemFolderModel = { - path: string; -}; - 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 deleted file mode 100644 index 01486b96aa..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FileSystemTreeItemPresentationModel.ts +++ /dev/null @@ -1,15 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { FileSystemFolderModel } from './FileSystemFolderModel'; - -export type FileSystemTreeItemPresentationModel = { - hasChildren: boolean; - name: string; - path: string; - parent?: FileSystemFolderModel | null; - isFolder: boolean; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FolderResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FolderResponseModel.ts deleted file mode 100644 index 01664fd2e4..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/FolderResponseModel.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type FolderResponseModel = { - name: string; - id: string; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/HealthCheckActionRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/HealthCheckActionRequestModel.ts deleted file mode 100644 index cb170177ff..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/HealthCheckActionRequestModel.ts +++ /dev/null @@ -1,18 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type HealthCheckActionRequestModel = { - healthCheck: ReferenceByIdModel; - alias?: string | null; - name?: string | null; - description?: string | null; - valueRequired: boolean; - providedValue?: string | null; - providedValueValidation?: string | null; - providedValueValidationRegex?: string | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/HealthCheckGroupPresentationModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/HealthCheckGroupPresentationModel.ts deleted file mode 100644 index 08a8f79b0a..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/HealthCheckGroupPresentationModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { HealthCheckModel } from './HealthCheckModel'; - -export type HealthCheckGroupPresentationModel = { - name: string; - checks: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/HealthCheckGroupResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/HealthCheckGroupResponseModel.ts deleted file mode 100644 index d807733fbb..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/HealthCheckGroupResponseModel.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type HealthCheckGroupResponseModel = { - name: string; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/HealthCheckGroupWithResultResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/HealthCheckGroupWithResultResponseModel.ts deleted file mode 100644 index f2822cccbe..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/HealthCheckGroupWithResultResponseModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { HealthCheckWithResultPresentationModel } from './HealthCheckWithResultPresentationModel'; - -export type HealthCheckGroupWithResultResponseModel = { - checks: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/HealthCheckModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/HealthCheckModel.ts deleted file mode 100644 index 4ceadfbc4f..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/HealthCheckModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type HealthCheckModel = { - id: string; - name: string; - description?: string | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/HealthCheckResultResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/HealthCheckResultResponseModel.ts deleted file mode 100644 index 036976ee4e..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/HealthCheckResultResponseModel.ts +++ /dev/null @@ -1,15 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { HealthCheckActionRequestModel } from './HealthCheckActionRequestModel'; -import type { StatusResultTypeModel } from './StatusResultTypeModel'; - -export type HealthCheckResultResponseModel = { - message: string; - resultType: StatusResultTypeModel; - actions?: Array | null; - readMoreLink?: string | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/HealthCheckWithResultPresentationModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/HealthCheckWithResultPresentationModel.ts deleted file mode 100644 index 48b5e80b41..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/HealthCheckWithResultPresentationModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { HealthCheckResultResponseModel } from './HealthCheckResultResponseModel'; - -export type HealthCheckWithResultPresentationModel = { - id: string; - results?: Array | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/HealthStatusModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/HealthStatusModel.ts deleted file mode 100644 index 2bbbc0ecf3..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/HealthStatusModel.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export enum HealthStatusModel { - HEALTHY = 'Healthy', - UNHEALTHY = 'Unhealthy', - REBUILDING = 'Rebuilding', -} diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/HelpPageResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/HelpPageResponseModel.ts deleted file mode 100644 index d5d81e8935..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/HelpPageResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type HelpPageResponseModel = { - name?: string | null; - description?: string | null; - url?: string | null; - type?: string | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ImportDictionaryRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ImportDictionaryRequestModel.ts deleted file mode 100644 index 13e5557845..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ImportDictionaryRequestModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type ImportDictionaryRequestModel = { - temporaryFile: ReferenceByIdModel; - parent?: ReferenceByIdModel | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/IndexResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/IndexResponseModel.ts deleted file mode 100644 index 8c957644e5..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/IndexResponseModel.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { HealthStatusModel } from './HealthStatusModel'; - -export type IndexResponseModel = { - name: string; - healthStatus: HealthStatusModel; - canRebuild: boolean; - searcherName: string; - documentCount: number; - fieldCount: number; - providerProperties?: Record | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/InstallRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/InstallRequestModel.ts deleted file mode 100644 index 5b63007859..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/InstallRequestModel.ts +++ /dev/null @@ -1,15 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { DatabaseInstallRequestModel } from './DatabaseInstallRequestModel'; -import type { TelemetryLevelModel } from './TelemetryLevelModel'; -import type { UserInstallRequestModel } from './UserInstallRequestModel'; - -export type InstallRequestModel = { - user: UserInstallRequestModel; - database: DatabaseInstallRequestModel; - telemetryLevel: TelemetryLevelModel; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/InstallSettingsResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/InstallSettingsResponseModel.ts deleted file mode 100644 index f9bef5cad6..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/InstallSettingsResponseModel.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { DatabaseSettingsPresentationModel } from './DatabaseSettingsPresentationModel'; -import type { UserSettingsPresentationModel } from './UserSettingsPresentationModel'; - -export type InstallSettingsResponseModel = { - user: UserSettingsPresentationModel; - databases: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/InviteUserRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/InviteUserRequestModel.ts deleted file mode 100644 index 242f7c1dd6..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/InviteUserRequestModel.ts +++ /dev/null @@ -1,14 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type InviteUserRequestModel = { - email: string; - userName: string; - name: string; - userGroupIds: Array; - id?: string | null; - message?: string | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ItemReferenceByIdResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ItemReferenceByIdResponseModel.ts deleted file mode 100644 index 94a2eb42bc..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ItemReferenceByIdResponseModel.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type ItemReferenceByIdResponseModel = { - id: string; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ItemSortingRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ItemSortingRequestModel.ts deleted file mode 100644 index e5ef68e040..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ItemSortingRequestModel.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type ItemSortingRequestModel = { - id: string; - sortOrder: number; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/LanguageItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/LanguageItemResponseModel.ts deleted file mode 100644 index f503073ca4..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/LanguageItemResponseModel.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type LanguageItemResponseModel = { - name: string; - isoCode: string; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/LanguageResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/LanguageResponseModel.ts deleted file mode 100644 index 89e2b03c92..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/LanguageResponseModel.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type LanguageResponseModel = { - name: string; - isDefault: boolean; - isMandatory: boolean; - fallbackIsoCode?: string | null; - isoCode: string; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/LinkedLoginModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/LinkedLoginModel.ts deleted file mode 100644 index ed7be18fd3..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/LinkedLoginModel.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type LinkedLoginModel = { - providerName: string; - providerKey: string; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/LinkedLoginsRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/LinkedLoginsRequestModel.ts deleted file mode 100644 index 49f3947868..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/LinkedLoginsRequestModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { LinkedLoginModel } from './LinkedLoginModel'; - -export type LinkedLoginsRequestModel = { - linkedLogins: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/LogLevelCountsReponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/LogLevelCountsReponseModel.ts deleted file mode 100644 index d1d988ec8f..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/LogLevelCountsReponseModel.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type LogLevelCountsReponseModel = { - information: number; - debug: number; - warning: number; - error: number; - fatal: number; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/LogLevelModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/LogLevelModel.ts deleted file mode 100644 index 7de81d185c..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/LogLevelModel.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export enum LogLevelModel { - VERBOSE = 'Verbose', - DEBUG = 'Debug', - INFORMATION = 'Information', - WARNING = 'Warning', - ERROR = 'Error', - FATAL = 'Fatal', -} diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/LogMessagePropertyPresentationModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/LogMessagePropertyPresentationModel.ts deleted file mode 100644 index de18608397..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/LogMessagePropertyPresentationModel.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type LogMessagePropertyPresentationModel = { - name: string; - value?: string | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/LogMessageResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/LogMessageResponseModel.ts deleted file mode 100644 index 9a219c4245..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/LogMessageResponseModel.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { LogLevelModel } from './LogLevelModel'; -import type { LogMessagePropertyPresentationModel } from './LogMessagePropertyPresentationModel'; - -export type LogMessageResponseModel = { - timestamp: string; - level: LogLevelModel; - messageTemplate?: string | null; - renderedMessage?: string | null; - properties: Array; - exception?: string | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/LogTemplateResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/LogTemplateResponseModel.ts deleted file mode 100644 index 90ef6d4318..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/LogTemplateResponseModel.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type LogTemplateResponseModel = { - messageTemplate?: string | null; - count: number; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/LoggerResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/LoggerResponseModel.ts deleted file mode 100644 index 3c1f88ffd2..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/LoggerResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { LogLevelModel } from './LogLevelModel'; - -export type LoggerResponseModel = { - name: string; - level: LogLevelModel; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ManifestResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ManifestResponseModel.ts deleted file mode 100644 index 792e0482bb..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ManifestResponseModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type ManifestResponseModel = { - name: string; - version?: string | null; - extensions: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaCollectionResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaCollectionResponseModel.ts deleted file mode 100644 index beae6558f5..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaCollectionResponseModel.ts +++ /dev/null @@ -1,18 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { MediaTypeCollectionReferenceResponseModel } from './MediaTypeCollectionReferenceResponseModel'; -import type { MediaValueModel } from './MediaValueModel'; -import type { MediaVariantResponseModel } from './MediaVariantResponseModel'; - -export type MediaCollectionResponseModel = { - values: Array; - variants: Array; - id: string; - creator?: string | null; - sortOrder: number; - mediaType: MediaTypeCollectionReferenceResponseModel; -}; - 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 deleted file mode 100644 index 589e07ddc6..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaConfigurationResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type MediaConfigurationResponseModel = { - disableDeleteWhenReferenced: boolean; - disableUnpublishWhenReferenced: boolean; - sanitizeTinyMce: boolean; - reservedFieldNames: Array; -}; - 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 deleted file mode 100644 index 71a85946b8..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaItemResponseModel.ts +++ /dev/null @@ -1,15 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { MediaTypeReferenceResponseModel } from './MediaTypeReferenceResponseModel'; -import type { VariantItemResponseModel } from './VariantItemResponseModel'; - -export type MediaItemResponseModel = { - id: string; - 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 deleted file mode 100644 index f2c9eea412..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaRecycleBinItemResponseModel.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ItemReferenceByIdResponseModel } from './ItemReferenceByIdResponseModel'; -import type { MediaTypeReferenceResponseModel } from './MediaTypeReferenceResponseModel'; -import type { VariantItemResponseModel } from './VariantItemResponseModel'; - -export type MediaRecycleBinItemResponseModel = { - id: string; - hasChildren: boolean; - parent?: ItemReferenceByIdResponseModel | null; - mediaType: MediaTypeReferenceResponseModel; - variants: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaReferenceResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaReferenceResponseModel.ts deleted file mode 100644 index 51776bc711..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaReferenceResponseModel.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { TrackedReferenceMediaTypeModel } from './TrackedReferenceMediaTypeModel'; - -export type MediaReferenceResponseModel = { - id: string; - name?: string | null; - mediaType: TrackedReferenceMediaTypeModel; -}; - 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 deleted file mode 100644 index ce38706af1..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaResponseModel.ts +++ /dev/null @@ -1,19 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { MediaTypeReferenceResponseModel } from './MediaTypeReferenceResponseModel'; -import type { MediaUrlInfoModel } from './MediaUrlInfoModel'; -import type { MediaValueModel } from './MediaValueModel'; -import type { MediaVariantResponseModel } from './MediaVariantResponseModel'; - -export type MediaResponseModel = { - values: Array; - variants: Array; - id: string; - 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 deleted file mode 100644 index 38f5c47d32..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTreeItemResponseModel.ts +++ /dev/null @@ -1,19 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { MediaTypeReferenceResponseModel } from './MediaTypeReferenceResponseModel'; -import type { ReferenceByIdModel } from './ReferenceByIdModel'; -import type { VariantItemResponseModel } from './VariantItemResponseModel'; - -export type MediaTreeItemResponseModel = { - hasChildren: boolean; - parent?: ReferenceByIdModel | null; - noAccess: boolean; - isTrashed: boolean; - id: string; - mediaType: MediaTypeReferenceResponseModel; - variants: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTypeCollectionReferenceResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTypeCollectionReferenceResponseModel.ts deleted file mode 100644 index 18201c74bd..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTypeCollectionReferenceResponseModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type MediaTypeCollectionReferenceResponseModel = { - id: string; - alias: string; - icon: string; -}; - 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 deleted file mode 100644 index 26f74e7068..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTypeCompositionModel.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* 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 deleted file mode 100644 index 6926a4c8f0..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTypeCompositionRequestModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type MediaTypeCompositionRequestModel = { - id?: string | null; - currentPropertyAliases: Array; - currentCompositeIds: Array; -}; - 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 deleted file mode 100644 index 9f575248b3..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTypeCompositionResponseModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type MediaTypeCompositionResponseModel = { - id: string; - name: string; - icon: string; -}; - 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 deleted file mode 100644 index f06bb0c616..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTypeItemResponseModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type MediaTypeItemResponseModel = { - id: string; - name: string; - icon?: string | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTypePropertyTypeContainerResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTypePropertyTypeContainerResponseModel.ts deleted file mode 100644 index 7010d27f93..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTypePropertyTypeContainerResponseModel.ts +++ /dev/null @@ -1,15 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type MediaTypePropertyTypeContainerResponseModel = { - id: string; - parent?: ReferenceByIdModel | null; - name?: string | null; - type: string; - sortOrder: number; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTypePropertyTypeResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTypePropertyTypeResponseModel.ts deleted file mode 100644 index fce0ed3697..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTypePropertyTypeResponseModel.ts +++ /dev/null @@ -1,23 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { PropertyTypeAppearanceModel } from './PropertyTypeAppearanceModel'; -import type { PropertyTypeValidationModel } from './PropertyTypeValidationModel'; -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type MediaTypePropertyTypeResponseModel = { - id: string; - container?: ReferenceByIdModel | null; - sortOrder: number; - alias: string; - name: string; - description?: string | null; - dataType: ReferenceByIdModel; - variesByCulture: boolean; - variesBySegment: boolean; - validation: PropertyTypeValidationModel; - appearance: PropertyTypeAppearanceModel; -}; - 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 deleted file mode 100644 index 7c80250be0..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTypeReferenceResponseModel.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type MediaTypeReferenceResponseModel = { - id: string; - icon: string; - collection?: ReferenceByIdModel | null; -}; - 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 deleted file mode 100644 index a555ac9333..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTypeResponseModel.ts +++ /dev/null @@ -1,28 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { MediaTypeCompositionModel } from './MediaTypeCompositionModel'; -import type { MediaTypePropertyTypeContainerResponseModel } from './MediaTypePropertyTypeContainerResponseModel'; -import type { MediaTypePropertyTypeResponseModel } from './MediaTypePropertyTypeResponseModel'; -import type { MediaTypeSortModel } from './MediaTypeSortModel'; -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type MediaTypeResponseModel = { - alias: string; - name: string; - description?: string | null; - icon: string; - allowedAsRoot: boolean; - variesByCulture: boolean; - variesBySegment: boolean; - collection?: ReferenceByIdModel | null; - isElement: boolean; - properties: Array; - containers: Array; - id: string; - 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 deleted file mode 100644 index a6305256c5..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTypeSortModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* 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/MediaTypeTreeItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTypeTreeItemResponseModel.ts deleted file mode 100644 index 0b87665e8b..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaTypeTreeItemResponseModel.ts +++ /dev/null @@ -1,16 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type MediaTypeTreeItemResponseModel = { - hasChildren: boolean; - id: string; - parent?: ReferenceByIdModel | null; - name: string; - isFolder: boolean; - icon: string; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaUrlInfoModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaUrlInfoModel.ts deleted file mode 100644 index 59052ac8bf..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaUrlInfoModel.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type MediaUrlInfoModel = { - culture?: string | null; - url: string; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaValueModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaValueModel.ts deleted file mode 100644 index 895901a0ba..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaValueModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type MediaValueModel = { - culture?: string | null; - segment?: string | null; - alias: string; - value?: any; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaVariantRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaVariantRequestModel.ts deleted file mode 100644 index 6ca86fbd75..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaVariantRequestModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type MediaVariantRequestModel = { - culture?: string | null; - segment?: string | null; - name: string; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaVariantResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaVariantResponseModel.ts deleted file mode 100644 index fc5a78cf90..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MediaVariantResponseModel.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type MediaVariantResponseModel = { - culture?: string | null; - segment?: string | null; - name: string; - createDate: string; - updateDate: string; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberConfigurationResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberConfigurationResponseModel.ts deleted file mode 100644 index de2db5f497..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberConfigurationResponseModel.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type MemberConfigurationResponseModel = { - reservedFieldNames: Array; -}; - 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 deleted file mode 100644 index 73d64914d1..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberGroupItemResponseModel.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type MemberGroupItemResponseModel = { - id: string; - name: string; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberGroupResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberGroupResponseModel.ts deleted file mode 100644 index 6488bffe06..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberGroupResponseModel.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type MemberGroupResponseModel = { - name: string; - id: string; -}; - 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 deleted file mode 100644 index 68839f0b2e..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberItemResponseModel.ts +++ /dev/null @@ -1,14 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { MemberTypeReferenceResponseModel } from './MemberTypeReferenceResponseModel'; -import type { VariantItemResponseModel } from './VariantItemResponseModel'; - -export type MemberItemResponseModel = { - id: string; - memberType: MemberTypeReferenceResponseModel; - variants: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberResponseModel.ts deleted file mode 100644 index 96f4773ecf..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberResponseModel.ts +++ /dev/null @@ -1,26 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { MemberTypeReferenceResponseModel } from './MemberTypeReferenceResponseModel'; -import type { MemberValueModel } from './MemberValueModel'; -import type { MemberVariantResponseModel } from './MemberVariantResponseModel'; - -export type MemberResponseModel = { - values: Array; - variants: Array; - id: string; - email: string; - username: string; - memberType: MemberTypeReferenceResponseModel; - isApproved: boolean; - isLockedOut: boolean; - isTwoFactorEnabled: boolean; - failedPasswordAttempts: number; - lastLoginDate?: string | null; - lastLockoutDate?: string | null; - lastPasswordChangeDate?: string | null; - groups: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberTypeCompositionModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberTypeCompositionModel.ts deleted file mode 100644 index f6b0c3a8fa..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberTypeCompositionModel.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* 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 MemberTypeCompositionModel = { - memberType: ReferenceByIdModel; - compositionType: CompositionTypeModel; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberTypeCompositionRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberTypeCompositionRequestModel.ts deleted file mode 100644 index ec2d8e6096..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberTypeCompositionRequestModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type MemberTypeCompositionRequestModel = { - id?: string | null; - currentPropertyAliases: Array; - currentCompositeIds: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberTypeCompositionResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberTypeCompositionResponseModel.ts deleted file mode 100644 index 24766e9f04..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberTypeCompositionResponseModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type MemberTypeCompositionResponseModel = { - id: string; - name: string; - icon: string; -}; - 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 deleted file mode 100644 index 6c66cb2c50..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberTypeItemResponseModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type MemberTypeItemResponseModel = { - id: string; - name: string; - icon?: string | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberTypePropertyTypeContainerResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberTypePropertyTypeContainerResponseModel.ts deleted file mode 100644 index f71c060336..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberTypePropertyTypeContainerResponseModel.ts +++ /dev/null @@ -1,15 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type MemberTypePropertyTypeContainerResponseModel = { - id: string; - parent?: ReferenceByIdModel | null; - name?: string | null; - type: string; - sortOrder: number; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberTypePropertyTypeResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberTypePropertyTypeResponseModel.ts deleted file mode 100644 index 31eaefe421..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberTypePropertyTypeResponseModel.ts +++ /dev/null @@ -1,26 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { MemberTypePropertyTypeVisibilityModel } from './MemberTypePropertyTypeVisibilityModel'; -import type { PropertyTypeAppearanceModel } from './PropertyTypeAppearanceModel'; -import type { PropertyTypeValidationModel } from './PropertyTypeValidationModel'; -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type MemberTypePropertyTypeResponseModel = { - id: string; - container?: ReferenceByIdModel | null; - sortOrder: number; - alias: string; - name: string; - description?: string | null; - dataType: ReferenceByIdModel; - variesByCulture: boolean; - variesBySegment: boolean; - validation: PropertyTypeValidationModel; - appearance: PropertyTypeAppearanceModel; - isSensitive: boolean; - visibility: MemberTypePropertyTypeVisibilityModel; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberTypePropertyTypeVisibilityModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberTypePropertyTypeVisibilityModel.ts deleted file mode 100644 index 01e1db0fff..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberTypePropertyTypeVisibilityModel.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type MemberTypePropertyTypeVisibilityModel = { - memberCanView: boolean; - memberCanEdit: boolean; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberTypeReferenceResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberTypeReferenceResponseModel.ts deleted file mode 100644 index c475116817..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberTypeReferenceResponseModel.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type MemberTypeReferenceResponseModel = { - id: string; - icon: string; - collection?: ReferenceByIdModel | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberTypeResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberTypeResponseModel.ts deleted file mode 100644 index 1be5bcb73c..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberTypeResponseModel.ts +++ /dev/null @@ -1,26 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { MemberTypeCompositionModel } from './MemberTypeCompositionModel'; -import type { MemberTypePropertyTypeContainerResponseModel } from './MemberTypePropertyTypeContainerResponseModel'; -import type { MemberTypePropertyTypeResponseModel } from './MemberTypePropertyTypeResponseModel'; -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type MemberTypeResponseModel = { - alias: string; - name: string; - description?: string | null; - icon: string; - allowedAsRoot: boolean; - variesByCulture: boolean; - variesBySegment: boolean; - collection?: ReferenceByIdModel | null; - isElement: boolean; - properties: Array; - containers: Array; - id: string; - compositions: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberValueModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberValueModel.ts deleted file mode 100644 index 2aa8c7666e..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberValueModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type MemberValueModel = { - culture?: string | null; - segment?: string | null; - alias: string; - value?: any; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberVariantRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberVariantRequestModel.ts deleted file mode 100644 index 4cac4a6d2f..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberVariantRequestModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type MemberVariantRequestModel = { - culture?: string | null; - segment?: string | null; - name: string; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberVariantResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberVariantResponseModel.ts deleted file mode 100644 index 157c54ea08..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MemberVariantResponseModel.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type MemberVariantResponseModel = { - culture?: string | null; - segment?: string | null; - name: string; - createDate: string; - updateDate: string; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ModelsBuilderResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ModelsBuilderResponseModel.ts deleted file mode 100644 index d5e29920fa..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ModelsBuilderResponseModel.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ModelsModeModel } from './ModelsModeModel'; - -export type ModelsBuilderResponseModel = { - mode: ModelsModeModel; - canGenerate: boolean; - outOfDateModels: boolean; - lastError?: string | null; - version?: string | null; - modelsNamespace?: string | null; - trackingOutOfDateModels: boolean; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ModelsModeModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ModelsModeModel.ts deleted file mode 100644 index 42407aa100..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ModelsModeModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export enum ModelsModeModel { - NOTHING = 'Nothing', - IN_MEMORY_AUTO = 'InMemoryAuto', - SOURCE_CODE_MANUAL = 'SourceCodeManual', - SOURCE_CODE_AUTO = 'SourceCodeAuto', -} diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MoveDataTypeRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MoveDataTypeRequestModel.ts deleted file mode 100644 index db0b40b1ff..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MoveDataTypeRequestModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type MoveDataTypeRequestModel = { - target?: ReferenceByIdModel | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MoveDictionaryRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MoveDictionaryRequestModel.ts deleted file mode 100644 index 806e676efc..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MoveDictionaryRequestModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type MoveDictionaryRequestModel = { - target?: ReferenceByIdModel | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MoveDocumentBlueprintRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MoveDocumentBlueprintRequestModel.ts deleted file mode 100644 index f1df4f337e..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MoveDocumentBlueprintRequestModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type MoveDocumentBlueprintRequestModel = { - target?: ReferenceByIdModel | 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 deleted file mode 100644 index 0dd9fe3ca0..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MoveDocumentRequestModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type MoveDocumentRequestModel = { - 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 deleted file mode 100644 index b61b053f9d..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MoveDocumentTypeRequestModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* 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 deleted file mode 100644 index caea949b55..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MoveMediaRequestModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type MoveMediaRequestModel = { - 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 deleted file mode 100644 index d3b5a7c349..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/MoveMediaTypeRequestModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* 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 deleted file mode 100644 index 1deec9c6ef..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/NamedEntityTreeItemResponseModel.ts +++ /dev/null @@ -1,14 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type NamedEntityTreeItemResponseModel = { - hasChildren: boolean; - id: string; - parent?: ReferenceByIdModel | null; - name: 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 deleted file mode 100644 index f3b8fe2761..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/NoopSetupTwoFactorModel.ts +++ /dev/null @@ -1,6 +0,0 @@ -/* 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/NotificationHeaderModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/NotificationHeaderModel.ts deleted file mode 100644 index 5121f24de8..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/NotificationHeaderModel.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { EventMessageTypeModel } from './EventMessageTypeModel'; - -export type NotificationHeaderModel = { - message: string; - category: string; - type: EventMessageTypeModel; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ObjectTypeResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ObjectTypeResponseModel.ts deleted file mode 100644 index c40acbeaf2..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ObjectTypeResponseModel.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type ObjectTypeResponseModel = { - name?: string | null; - id: string; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/OperatorModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/OperatorModel.ts deleted file mode 100644 index 4e826935ff..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/OperatorModel.ts +++ /dev/null @@ -1,15 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export enum OperatorModel { - EQUALS = 'Equals', - NOT_EQUALS = 'NotEquals', - CONTAINS = 'Contains', - NOT_CONTAINS = 'NotContains', - LESS_THAN = 'LessThan', - LESS_THAN_EQUAL_TO = 'LessThanEqualTo', - GREATER_THAN = 'GreaterThan', - GREATER_THAN_EQUAL_TO = 'GreaterThanEqualTo', -} diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/OutOfDateStatusResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/OutOfDateStatusResponseModel.ts deleted file mode 100644 index 59c7d9adab..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/OutOfDateStatusResponseModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { OutOfDateTypeModel } from './OutOfDateTypeModel'; - -export type OutOfDateStatusResponseModel = { - status: OutOfDateTypeModel; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/OutOfDateTypeModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/OutOfDateTypeModel.ts deleted file mode 100644 index cfe0de4908..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/OutOfDateTypeModel.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export enum OutOfDateTypeModel { - OUT_OF_DATE = 'OutOfDate', - CURRENT = 'Current', - UNKNOWN = 'Unknown', -} 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 deleted file mode 100644 index 73634e2f42..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PackageConfigurationResponseModel.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* 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/PackageDefinitionResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PackageDefinitionResponseModel.ts deleted file mode 100644 index 87ae43326b..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PackageDefinitionResponseModel.ts +++ /dev/null @@ -1,24 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type PackageDefinitionResponseModel = { - name: string; - contentNodeId?: string | null; - contentLoadChildNodes: boolean; - mediaIds: Array; - mediaLoadChildNodes: boolean; - documentTypes: Array; - mediaTypes: Array; - dataTypes: Array; - templates: Array; - partialViews: Array; - stylesheets: Array; - scripts: Array; - languages: Array; - dictionaryItems: Array; - id: string; - packagePath: string; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PackageMigrationStatusResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PackageMigrationStatusResponseModel.ts deleted file mode 100644 index fa38491d4b..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PackageMigrationStatusResponseModel.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type PackageMigrationStatusResponseModel = { - packageName: string; - hasPendingMigrations: boolean; -}; - 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 deleted file mode 100644 index f0df413068..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedAllowedDocumentTypeModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* 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 deleted file mode 100644 index 48ca45fd60..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedAllowedMediaTypeModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* 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/PagedAuditLogResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedAuditLogResponseModel.ts deleted file mode 100644 index 9dcaf0c733..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedAuditLogResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { AuditLogResponseModel } from './AuditLogResponseModel'; - -export type PagedAuditLogResponseModel = { - total: number; - items: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedAuditLogWithUsernameResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedAuditLogWithUsernameResponseModel.ts deleted file mode 100644 index 5ff9186405..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedAuditLogWithUsernameResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { AuditLogWithUsernameResponseModel } from './AuditLogWithUsernameResponseModel'; - -export type PagedAuditLogWithUsernameResponseModel = { - total: number; - items: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedCultureReponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedCultureReponseModel.ts deleted file mode 100644 index 437ec404fa..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedCultureReponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { CultureReponseModel } from './CultureReponseModel'; - -export type PagedCultureReponseModel = { - total: number; - items: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedDataTypeItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedDataTypeItemResponseModel.ts deleted file mode 100644 index 6f06b0a81c..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedDataTypeItemResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { DataTypeItemResponseModel } from './DataTypeItemResponseModel'; - -export type PagedDataTypeItemResponseModel = { - total: number; - items: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedDataTypeTreeItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedDataTypeTreeItemResponseModel.ts deleted file mode 100644 index fd81a53b86..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedDataTypeTreeItemResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { DataTypeTreeItemResponseModel } from './DataTypeTreeItemResponseModel'; - -export type PagedDataTypeTreeItemResponseModel = { - total: number; - items: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedDictionaryOverviewResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedDictionaryOverviewResponseModel.ts deleted file mode 100644 index 7ce857aa31..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedDictionaryOverviewResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { DictionaryOverviewResponseModel } from './DictionaryOverviewResponseModel'; - -export type PagedDictionaryOverviewResponseModel = { - total: number; - items: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedDocumentBlueprintTreeItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedDocumentBlueprintTreeItemResponseModel.ts deleted file mode 100644 index 9bf8a5c863..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedDocumentBlueprintTreeItemResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { DocumentBlueprintTreeItemResponseModel } from './DocumentBlueprintTreeItemResponseModel'; - -export type PagedDocumentBlueprintTreeItemResponseModel = { - total: number; - items: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedDocumentCollectionResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedDocumentCollectionResponseModel.ts deleted file mode 100644 index b3b1a29bed..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedDocumentCollectionResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { DocumentCollectionResponseModel } from './DocumentCollectionResponseModel'; - -export type PagedDocumentCollectionResponseModel = { - 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 deleted file mode 100644 index 1a6958d31f..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedDocumentRecycleBinItemResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* 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/PagedDocumentTreeItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedDocumentTreeItemResponseModel.ts deleted file mode 100644 index 2399cfc00c..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedDocumentTreeItemResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { DocumentTreeItemResponseModel } from './DocumentTreeItemResponseModel'; - -export type PagedDocumentTreeItemResponseModel = { - total: number; - items: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedDocumentTypeTreeItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedDocumentTypeTreeItemResponseModel.ts deleted file mode 100644 index 4f40e9efe9..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedDocumentTypeTreeItemResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { DocumentTypeTreeItemResponseModel } from './DocumentTypeTreeItemResponseModel'; - -export type PagedDocumentTypeTreeItemResponseModel = { - total: number; - items: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedDocumentVersionItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedDocumentVersionItemResponseModel.ts deleted file mode 100644 index d1c818ae34..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedDocumentVersionItemResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { DocumentVersionItemResponseModel } from './DocumentVersionItemResponseModel'; - -export type PagedDocumentVersionItemResponseModel = { - total: number; - items: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedFileSystemTreeItemPresentationModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedFileSystemTreeItemPresentationModel.ts deleted file mode 100644 index 443c23df29..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedFileSystemTreeItemPresentationModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { FileSystemTreeItemPresentationModel } from './FileSystemTreeItemPresentationModel'; - -export type PagedFileSystemTreeItemPresentationModel = { - total: number; - items: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedHealthCheckGroupResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedHealthCheckGroupResponseModel.ts deleted file mode 100644 index d93685d9d4..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedHealthCheckGroupResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { HealthCheckGroupResponseModel } from './HealthCheckGroupResponseModel'; - -export type PagedHealthCheckGroupResponseModel = { - total: number; - items: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedHelpPageResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedHelpPageResponseModel.ts deleted file mode 100644 index 04c50d6e85..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedHelpPageResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { HelpPageResponseModel } from './HelpPageResponseModel'; - -export type PagedHelpPageResponseModel = { - total: number; - items: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedIReferenceResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedIReferenceResponseModel.ts deleted file mode 100644 index 4b8ea5164f..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedIReferenceResponseModel.ts +++ /dev/null @@ -1,14 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { DefaultReferenceResponseModel } from './DefaultReferenceResponseModel'; -import type { DocumentReferenceResponseModel } from './DocumentReferenceResponseModel'; -import type { MediaReferenceResponseModel } from './MediaReferenceResponseModel'; - -export type PagedIReferenceResponseModel = { - total: number; - items: Array<(DefaultReferenceResponseModel | DocumentReferenceResponseModel | MediaReferenceResponseModel)>; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedIndexResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedIndexResponseModel.ts deleted file mode 100644 index 7c0c4638c3..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedIndexResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { IndexResponseModel } from './IndexResponseModel'; - -export type PagedIndexResponseModel = { - total: number; - items: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedLanguageResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedLanguageResponseModel.ts deleted file mode 100644 index 37fe3d3913..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedLanguageResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { LanguageResponseModel } from './LanguageResponseModel'; - -export type PagedLanguageResponseModel = { - total: number; - items: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedLogMessageResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedLogMessageResponseModel.ts deleted file mode 100644 index cf4fc66449..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedLogMessageResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { LogMessageResponseModel } from './LogMessageResponseModel'; - -export type PagedLogMessageResponseModel = { - total: number; - items: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedLogTemplateResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedLogTemplateResponseModel.ts deleted file mode 100644 index 291011a872..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedLogTemplateResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { LogTemplateResponseModel } from './LogTemplateResponseModel'; - -export type PagedLogTemplateResponseModel = { - total: number; - items: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedLoggerResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedLoggerResponseModel.ts deleted file mode 100644 index 77083fc931..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedLoggerResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { LoggerResponseModel } from './LoggerResponseModel'; - -export type PagedLoggerResponseModel = { - total: number; - items: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedMediaCollectionResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedMediaCollectionResponseModel.ts deleted file mode 100644 index 3859caa0cb..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedMediaCollectionResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { MediaCollectionResponseModel } from './MediaCollectionResponseModel'; - -export type PagedMediaCollectionResponseModel = { - total: number; - items: Array; -}; - 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 deleted file mode 100644 index 1918188011..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedMediaRecycleBinItemResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* 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/PagedMediaTreeItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedMediaTreeItemResponseModel.ts deleted file mode 100644 index 864dce738f..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedMediaTreeItemResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { MediaTreeItemResponseModel } from './MediaTreeItemResponseModel'; - -export type PagedMediaTreeItemResponseModel = { - total: number; - items: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedMediaTypeTreeItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedMediaTypeTreeItemResponseModel.ts deleted file mode 100644 index d22af1c59c..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedMediaTypeTreeItemResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { MediaTypeTreeItemResponseModel } from './MediaTypeTreeItemResponseModel'; - -export type PagedMediaTypeTreeItemResponseModel = { - total: number; - items: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedMemberGroupResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedMemberGroupResponseModel.ts deleted file mode 100644 index 81fee9d58f..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedMemberGroupResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { MemberGroupResponseModel } from './MemberGroupResponseModel'; - -export type PagedMemberGroupResponseModel = { - total: number; - items: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedMemberResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedMemberResponseModel.ts deleted file mode 100644 index 06cea577ab..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedMemberResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { MemberResponseModel } from './MemberResponseModel'; - -export type PagedMemberResponseModel = { - total: number; - items: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedModelDataTypeItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedModelDataTypeItemResponseModel.ts deleted file mode 100644 index c4f9bf20f8..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedModelDataTypeItemResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { DataTypeItemResponseModel } from './DataTypeItemResponseModel'; - -export type PagedModelDataTypeItemResponseModel = { - items: Array; - total: number; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedModelDocumentItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedModelDocumentItemResponseModel.ts deleted file mode 100644 index 215f4fb67e..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedModelDocumentItemResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { DocumentItemResponseModel } from './DocumentItemResponseModel'; - -export type PagedModelDocumentItemResponseModel = { - items: Array; - total: number; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedModelDocumentTypeItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedModelDocumentTypeItemResponseModel.ts deleted file mode 100644 index 8b6218aaa8..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedModelDocumentTypeItemResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { DocumentTypeItemResponseModel } from './DocumentTypeItemResponseModel'; - -export type PagedModelDocumentTypeItemResponseModel = { - items: Array; - total: number; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedModelMediaItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedModelMediaItemResponseModel.ts deleted file mode 100644 index fa67f4fc9c..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedModelMediaItemResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { MediaItemResponseModel } from './MediaItemResponseModel'; - -export type PagedModelMediaItemResponseModel = { - items: Array; - total: number; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedModelMediaTypeItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedModelMediaTypeItemResponseModel.ts deleted file mode 100644 index 9c06d39d29..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedModelMediaTypeItemResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { MediaTypeItemResponseModel } from './MediaTypeItemResponseModel'; - -export type PagedModelMediaTypeItemResponseModel = { - items: Array; - total: number; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedModelMemberItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedModelMemberItemResponseModel.ts deleted file mode 100644 index 988df34705..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedModelMemberItemResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { MemberItemResponseModel } from './MemberItemResponseModel'; - -export type PagedModelMemberItemResponseModel = { - items: Array; - total: number; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedModelMemberTypeItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedModelMemberTypeItemResponseModel.ts deleted file mode 100644 index ef2aaf53d9..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedModelMemberTypeItemResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { MemberTypeItemResponseModel } from './MemberTypeItemResponseModel'; - -export type PagedModelMemberTypeItemResponseModel = { - items: Array; - total: number; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedModelTemplateItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedModelTemplateItemResponseModel.ts deleted file mode 100644 index bc06c40124..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedModelTemplateItemResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { TemplateItemResponseModel } from './TemplateItemResponseModel'; - -export type PagedModelTemplateItemResponseModel = { - items: Array; - total: number; -}; - 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 deleted file mode 100644 index 9e6dd22dec..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedNamedEntityTreeItemResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { NamedEntityTreeItemResponseModel } from './NamedEntityTreeItemResponseModel'; - -export type PagedNamedEntityTreeItemResponseModel = { - total: number; - items: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedObjectTypeResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedObjectTypeResponseModel.ts deleted file mode 100644 index 77d8106b39..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedObjectTypeResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ObjectTypeResponseModel } from './ObjectTypeResponseModel'; - -export type PagedObjectTypeResponseModel = { - total: number; - items: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedPackageDefinitionResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedPackageDefinitionResponseModel.ts deleted file mode 100644 index e42eb299ee..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedPackageDefinitionResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { PackageDefinitionResponseModel } from './PackageDefinitionResponseModel'; - -export type PagedPackageDefinitionResponseModel = { - total: number; - items: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedPackageMigrationStatusResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedPackageMigrationStatusResponseModel.ts deleted file mode 100644 index aa3f4f4ced..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedPackageMigrationStatusResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { PackageMigrationStatusResponseModel } from './PackageMigrationStatusResponseModel'; - -export type PagedPackageMigrationStatusResponseModel = { - total: number; - items: Array; -}; - 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 deleted file mode 100644 index 4292c1a083..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedPartialViewSnippetItemResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { PartialViewSnippetItemResponseModel } from './PartialViewSnippetItemResponseModel'; - -export type PagedPartialViewSnippetItemResponseModel = { - total: number; - items: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedProblemDetailsModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedProblemDetailsModel.ts deleted file mode 100644 index 5291741485..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedProblemDetailsModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ProblemDetails } from './ProblemDetails'; - -export type PagedProblemDetailsModel = { - total: number; - items: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedRedirectUrlResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedRedirectUrlResponseModel.ts deleted file mode 100644 index e749134ad3..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedRedirectUrlResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { RedirectUrlResponseModel } from './RedirectUrlResponseModel'; - -export type PagedRedirectUrlResponseModel = { - total: number; - items: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedReferenceByIdModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedReferenceByIdModel.ts deleted file mode 100644 index e7e20d98c6..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedReferenceByIdModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type PagedReferenceByIdModel = { - total: number; - items: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedRelationResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedRelationResponseModel.ts deleted file mode 100644 index 377517e398..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedRelationResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { RelationResponseModel } from './RelationResponseModel'; - -export type PagedRelationResponseModel = { - total: number; - items: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedRelationTypeResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedRelationTypeResponseModel.ts deleted file mode 100644 index 951e9e3873..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedRelationTypeResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { RelationTypeResponseModel } from './RelationTypeResponseModel'; - -export type PagedRelationTypeResponseModel = { - total: number; - items: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedSavedLogSearchResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedSavedLogSearchResponseModel.ts deleted file mode 100644 index 8eebf10ebc..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedSavedLogSearchResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { SavedLogSearchResponseModel } from './SavedLogSearchResponseModel'; - -export type PagedSavedLogSearchResponseModel = { - total: number; - items: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedSearchResultResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedSearchResultResponseModel.ts deleted file mode 100644 index 233891717d..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedSearchResultResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { SearchResultResponseModel } from './SearchResultResponseModel'; - -export type PagedSearchResultResponseModel = { - total: number; - items: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedSearcherResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedSearcherResponseModel.ts deleted file mode 100644 index c39bc2751e..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedSearcherResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { SearcherResponseModel } from './SearcherResponseModel'; - -export type PagedSearcherResponseModel = { - total: number; - items: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedTagResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedTagResponseModel.ts deleted file mode 100644 index 3134a3ee4f..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedTagResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { TagResponseModel } from './TagResponseModel'; - -export type PagedTagResponseModel = { - total: number; - items: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedTelemetryResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedTelemetryResponseModel.ts deleted file mode 100644 index 0bcd9b1d9a..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedTelemetryResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { TelemetryResponseModel } from './TelemetryResponseModel'; - -export type PagedTelemetryResponseModel = { - total: number; - items: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedUserGroupResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedUserGroupResponseModel.ts deleted file mode 100644 index a1bf825127..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedUserGroupResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { UserGroupResponseModel } from './UserGroupResponseModel'; - -export type PagedUserGroupResponseModel = { - total: number; - items: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedUserResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedUserResponseModel.ts deleted file mode 100644 index 06fbaf0d50..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedUserResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { UserResponseModel } from './UserResponseModel'; - -export type PagedUserResponseModel = { - total: number; - items: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedWebhookResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedWebhookResponseModel.ts deleted file mode 100644 index 1efc883d28..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PagedWebhookResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { WebhookResponseModel } from './WebhookResponseModel'; - -export type PagedWebhookResponseModel = { - 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 deleted file mode 100644 index 58729a2f6f..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PartialViewFolderResponseModel.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { FileSystemFolderModel } from './FileSystemFolderModel'; - -export type PartialViewFolderResponseModel = { - path: string; - name: string; - parent?: FileSystemFolderModel | null; -}; - 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 deleted file mode 100644 index eabd0ebafd..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PartialViewItemResponseModel.ts +++ /dev/null @@ -1,14 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { FileSystemFolderModel } from './FileSystemFolderModel'; - -export type PartialViewItemResponseModel = { - path: string; - name: string; - parent?: FileSystemFolderModel | null; - isFolder: boolean; -}; - 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 deleted file mode 100644 index 8ad71fa4a2..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PartialViewResponseModel.ts +++ /dev/null @@ -1,14 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { FileSystemFolderModel } from './FileSystemFolderModel'; - -export type PartialViewResponseModel = { - path: string; - name: string; - parent?: FileSystemFolderModel | null; - content: string; -}; - 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 deleted file mode 100644 index 0e4707e702..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PartialViewSnippetItemResponseModel.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* 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 deleted file mode 100644 index 7a9ef1d406..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PartialViewSnippetResponseModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type PartialViewSnippetResponseModel = { - id: string; - name: string; - 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 deleted file mode 100644 index 090f5de3c9..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PasswordConfigurationResponseModel.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* 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/ProblemDetails.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ProblemDetails.ts deleted file mode 100644 index d120301326..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ProblemDetails.ts +++ /dev/null @@ -1,6 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type ProblemDetails = Record; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ProblemDetailsBuilderModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ProblemDetailsBuilderModel.ts deleted file mode 100644 index 55d0ffc1e1..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ProblemDetailsBuilderModel.ts +++ /dev/null @@ -1,6 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type ProblemDetailsBuilderModel = Record; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ProfilingStatusRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ProfilingStatusRequestModel.ts deleted file mode 100644 index 5c48e0da66..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ProfilingStatusRequestModel.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type ProfilingStatusRequestModel = { - enabled: boolean; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ProfilingStatusResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ProfilingStatusResponseModel.ts deleted file mode 100644 index 8717638558..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ProfilingStatusResponseModel.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type ProfilingStatusResponseModel = { - enabled: boolean; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PropertyTypeAppearanceModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PropertyTypeAppearanceModel.ts deleted file mode 100644 index f690a3f46c..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PropertyTypeAppearanceModel.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type PropertyTypeAppearanceModel = { - labelOnTop: boolean; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PropertyTypeValidationModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PropertyTypeValidationModel.ts deleted file mode 100644 index fda613e272..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PropertyTypeValidationModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type PropertyTypeValidationModel = { - mandatory: boolean; - mandatoryMessage?: string | null; - regEx?: string | null; - regExMessage?: string | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PublicAccessRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PublicAccessRequestModel.ts deleted file mode 100644 index d0381e1f21..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PublicAccessRequestModel.ts +++ /dev/null @@ -1,14 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type PublicAccessRequestModel = { - loginDocument: ReferenceByIdModel; - errorDocument: ReferenceByIdModel; - memberUserNames: Array; - memberGroupNames: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PublishDocumentRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PublishDocumentRequestModel.ts deleted file mode 100644 index 4c08971560..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PublishDocumentRequestModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { CultureAndScheduleRequestModel } from './CultureAndScheduleRequestModel'; - -export type PublishDocumentRequestModel = { - publishSchedules: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PublishDocumentWithDescendantsRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PublishDocumentWithDescendantsRequestModel.ts deleted file mode 100644 index 9796f30e5a..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/PublishDocumentWithDescendantsRequestModel.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type PublishDocumentWithDescendantsRequestModel = { - includeUnpublishedDescendants: boolean; - cultures: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RedirectStatusModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RedirectStatusModel.ts deleted file mode 100644 index e304036fe7..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RedirectStatusModel.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export enum RedirectStatusModel { - ENABLED = 'Enabled', - DISABLED = 'Disabled', -} diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RedirectUrlResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RedirectUrlResponseModel.ts deleted file mode 100644 index 42fe5abf72..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RedirectUrlResponseModel.ts +++ /dev/null @@ -1,16 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type RedirectUrlResponseModel = { - id: string; - originalUrl: string; - destinationUrl: string; - created: string; - document: ReferenceByIdModel; - culture?: string | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RedirectUrlStatusResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RedirectUrlStatusResponseModel.ts deleted file mode 100644 index ee5065a2a0..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RedirectUrlStatusResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { RedirectStatusModel } from './RedirectStatusModel'; - -export type RedirectUrlStatusResponseModel = { - status: RedirectStatusModel; - userIsAdmin: boolean; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ReferenceByIdModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ReferenceByIdModel.ts deleted file mode 100644 index 5085db2e12..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ReferenceByIdModel.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type ReferenceByIdModel = { - id: string; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RelationReferenceModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RelationReferenceModel.ts deleted file mode 100644 index ab35e260eb..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RelationReferenceModel.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type RelationReferenceModel = { - id: string; - name?: string | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RelationResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RelationResponseModel.ts deleted file mode 100644 index 3b2eea7a75..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RelationResponseModel.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ReferenceByIdModel } from './ReferenceByIdModel'; -import type { RelationReferenceModel } from './RelationReferenceModel'; - -export type RelationResponseModel = { - id: string; - relationType: ReferenceByIdModel; - parent: RelationReferenceModel; - child: RelationReferenceModel; - createDate: string; - comment?: string | null; -}; - 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 deleted file mode 100644 index 0d0bbfd99e..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RelationTypeItemResponseModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type RelationTypeItemResponseModel = { - id: string; - name: string; - isDeletable: boolean; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RelationTypeResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RelationTypeResponseModel.ts deleted file mode 100644 index 05d5eadf9f..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RelationTypeResponseModel.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ObjectTypeResponseModel } from './ObjectTypeResponseModel'; - -export type RelationTypeResponseModel = { - name: string; - isBidirectional: boolean; - isDependency: boolean; - id: string; - alias?: string | null; - parentObject?: ObjectTypeResponseModel | null; - childObject?: ObjectTypeResponseModel | null; -}; - 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 deleted file mode 100644 index 7fc3f67271..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RenamePartialViewRequestModel.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type RenamePartialViewRequestModel = { - name: string; -}; - 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 deleted file mode 100644 index 0d7a9af13f..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RenameScriptRequestModel.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type RenameScriptRequestModel = { - name: string; -}; - 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 deleted file mode 100644 index 44165fb93e..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RenameStylesheetRequestModel.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type RenameStylesheetRequestModel = { - name: string; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ResendInviteUserRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ResendInviteUserRequestModel.ts deleted file mode 100644 index 4d9c0789a4..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ResendInviteUserRequestModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type ResendInviteUserRequestModel = { - user: ReferenceByIdModel; - message?: string | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ResetPasswordRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ResetPasswordRequestModel.ts deleted file mode 100644 index efe0818403..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ResetPasswordRequestModel.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type ResetPasswordRequestModel = { - email: string; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ResetPasswordTokenRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ResetPasswordTokenRequestModel.ts deleted file mode 100644 index e291336f61..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ResetPasswordTokenRequestModel.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type ResetPasswordTokenRequestModel = { - user: ReferenceByIdModel; - resetCode: string; - password: string; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ResetPasswordUserResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ResetPasswordUserResponseModel.ts deleted file mode 100644 index cb45c206e7..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ResetPasswordUserResponseModel.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type ResetPasswordUserResponseModel = { - resetPassword?: string | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RuntimeLevelModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RuntimeLevelModel.ts deleted file mode 100644 index 6295198db1..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RuntimeLevelModel.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export enum RuntimeLevelModel { - UNKNOWN = 'Unknown', - BOOT = 'Boot', - INSTALL = 'Install', - UPGRADE = 'Upgrade', - RUN = 'Run', - BOOT_FAILED = 'BootFailed', -} 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 deleted file mode 100644 index 0f8e601e95..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/RuntimeModeModel.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* 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/SavedLogSearchRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/SavedLogSearchRequestModel.ts deleted file mode 100644 index a9a6db7caf..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/SavedLogSearchRequestModel.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type SavedLogSearchRequestModel = { - name: string; - query: string; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/SavedLogSearchResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/SavedLogSearchResponseModel.ts deleted file mode 100644 index 7544779e07..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/SavedLogSearchResponseModel.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type SavedLogSearchResponseModel = { - name: string; - query: string; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ScheduleRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ScheduleRequestModel.ts deleted file mode 100644 index 59b83b94a6..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ScheduleRequestModel.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type ScheduleRequestModel = { - publishTime?: string | null; - unpublishTime?: string | null; -}; - 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 deleted file mode 100644 index 154bfb8359..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ScriptFolderResponseModel.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { FileSystemFolderModel } from './FileSystemFolderModel'; - -export type ScriptFolderResponseModel = { - path: string; - name: string; - parent?: FileSystemFolderModel | null; -}; - 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 deleted file mode 100644 index 6d74d3170e..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ScriptItemResponseModel.ts +++ /dev/null @@ -1,14 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { FileSystemFolderModel } from './FileSystemFolderModel'; - -export type ScriptItemResponseModel = { - path: string; - name: string; - parent?: FileSystemFolderModel | null; - isFolder: boolean; -}; - 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 deleted file mode 100644 index c55092587d..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ScriptResponseModel.ts +++ /dev/null @@ -1,14 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { FileSystemFolderModel } from './FileSystemFolderModel'; - -export type ScriptResponseModel = { - path: string; - name: string; - parent?: FileSystemFolderModel | null; - content: string; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/SearchResultResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/SearchResultResponseModel.ts deleted file mode 100644 index 4e44168a7a..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/SearchResultResponseModel.ts +++ /dev/null @@ -1,14 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { FieldPresentationModel } from './FieldPresentationModel'; - -export type SearchResultResponseModel = { - id: string; - score: number; - readonly fieldCount: number; - fields: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/SearcherResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/SearcherResponseModel.ts deleted file mode 100644 index 0515d91ea8..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/SearcherResponseModel.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type SearcherResponseModel = { - name: string; -}; - 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 deleted file mode 100644 index 560327a3a7..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/SecurityConfigurationResponseModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* 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/ServerConfigurationItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ServerConfigurationItemResponseModel.ts deleted file mode 100644 index 4e97e60583..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ServerConfigurationItemResponseModel.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -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 deleted file mode 100644 index 98eb5b3d0b..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ServerConfigurationResponseModel.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* 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 deleted file mode 100644 index 3625d63958..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ServerInformationResponseModel.ts +++ /dev/null @@ -1,14 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { RuntimeModeModel } from './RuntimeModeModel'; - -export type ServerInformationResponseModel = { - version: string; - assemblyVersion: string; - baseUtcOffset: string; - runtimeMode: RuntimeModeModel; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ServerStatusResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ServerStatusResponseModel.ts deleted file mode 100644 index 2c92b763bf..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ServerStatusResponseModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { RuntimeLevelModel } from './RuntimeLevelModel'; - -export type ServerStatusResponseModel = { - serverStatus: RuntimeLevelModel; -}; - 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 deleted file mode 100644 index 54a020dd94..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/ServerTroubleshootingResponseModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ServerConfigurationItemResponseModel } from './ServerConfigurationItemResponseModel'; - -export type ServerTroubleshootingResponseModel = { - items: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/SetAvatarRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/SetAvatarRequestModel.ts deleted file mode 100644 index f9e9fd22bd..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/SetAvatarRequestModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type SetAvatarRequestModel = { - file: ReferenceByIdModel; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/SetTourStatusRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/SetTourStatusRequestModel.ts deleted file mode 100644 index b766154055..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/SetTourStatusRequestModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type SetTourStatusRequestModel = { - alias: string; - completed: boolean; - disabled: boolean; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/SortingRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/SortingRequestModel.ts deleted file mode 100644 index 3a0561adca..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/SortingRequestModel.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ItemSortingRequestModel } from './ItemSortingRequestModel'; -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type SortingRequestModel = { - parent?: ReferenceByIdModel | null; - sorting: Array; -}; - 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 deleted file mode 100644 index 1d47aa6e4f..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/StaticFileItemResponseModel.ts +++ /dev/null @@ -1,14 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { FileSystemFolderModel } from './FileSystemFolderModel'; - -export type StaticFileItemResponseModel = { - path: string; - name: string; - parent?: FileSystemFolderModel | null; - isFolder: boolean; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/StatusResultTypeModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/StatusResultTypeModel.ts deleted file mode 100644 index a12e3ec8e4..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/StatusResultTypeModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export enum StatusResultTypeModel { - SUCCESS = 'Success', - WARNING = 'Warning', - ERROR = 'Error', - INFO = 'Info', -} 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 deleted file mode 100644 index 608989b702..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/StylesheetFolderResponseModel.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { FileSystemFolderModel } from './FileSystemFolderModel'; - -export type StylesheetFolderResponseModel = { - path: string; - name: string; - parent?: FileSystemFolderModel | null; -}; - 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 deleted file mode 100644 index 02d537cef6..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/StylesheetItemResponseModel.ts +++ /dev/null @@ -1,14 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { FileSystemFolderModel } from './FileSystemFolderModel'; - -export type StylesheetItemResponseModel = { - path: string; - name: string; - parent?: FileSystemFolderModel | null; - isFolder: boolean; -}; - 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 deleted file mode 100644 index 8ec024c10d..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/StylesheetResponseModel.ts +++ /dev/null @@ -1,14 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { FileSystemFolderModel } from './FileSystemFolderModel'; - -export type StylesheetResponseModel = { - path: string; - name: string; - parent?: FileSystemFolderModel | null; - content: string; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TagResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TagResponseModel.ts deleted file mode 100644 index 4b2b6a2bcc..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TagResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type TagResponseModel = { - id: string; - text?: string | null; - group?: string | null; - nodeCount: number; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TelemetryLevelModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TelemetryLevelModel.ts deleted file mode 100644 index cf03fe41a2..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TelemetryLevelModel.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export enum TelemetryLevelModel { - MINIMAL = 'Minimal', - BASIC = 'Basic', - DETAILED = 'Detailed', -} diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TelemetryRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TelemetryRequestModel.ts deleted file mode 100644 index 51e086f3e8..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TelemetryRequestModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { TelemetryLevelModel } from './TelemetryLevelModel'; - -export type TelemetryRequestModel = { - telemetryLevel: TelemetryLevelModel; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TelemetryResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TelemetryResponseModel.ts deleted file mode 100644 index cf83a280a0..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TelemetryResponseModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { TelemetryLevelModel } from './TelemetryLevelModel'; - -export type TelemetryResponseModel = { - telemetryLevel: TelemetryLevelModel; -}; - 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 deleted file mode 100644 index 1236e86306..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemplateConfigurationResponseModel.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* 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 deleted file mode 100644 index caab43c55f..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemplateItemResponseModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type TemplateItemResponseModel = { - id: string; - name: string; - alias: string; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemplateQueryExecuteFilterPresentationModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemplateQueryExecuteFilterPresentationModel.ts deleted file mode 100644 index fa39f4da74..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemplateQueryExecuteFilterPresentationModel.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { OperatorModel } from './OperatorModel'; - -export type TemplateQueryExecuteFilterPresentationModel = { - propertyAlias: string; - constraintValue: string; - operator: OperatorModel; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemplateQueryExecuteModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemplateQueryExecuteModel.ts deleted file mode 100644 index 5ee9d6e4e5..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemplateQueryExecuteModel.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ReferenceByIdModel } from './ReferenceByIdModel'; -import type { TemplateQueryExecuteFilterPresentationModel } from './TemplateQueryExecuteFilterPresentationModel'; -import type { TemplateQueryExecuteSortModel } from './TemplateQueryExecuteSortModel'; - -export type TemplateQueryExecuteModel = { - rootDocument?: ReferenceByIdModel | null; - documentTypeAlias?: string | null; - filters?: Array | null; - sort?: TemplateQueryExecuteSortModel | null; - take: number; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemplateQueryExecuteSortModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemplateQueryExecuteSortModel.ts deleted file mode 100644 index 7632a9c9a9..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemplateQueryExecuteSortModel.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type TemplateQueryExecuteSortModel = { - propertyAlias: string; - direction?: string | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemplateQueryOperatorModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemplateQueryOperatorModel.ts deleted file mode 100644 index 1b5dbb4fbd..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemplateQueryOperatorModel.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { OperatorModel } from './OperatorModel'; -import type { TemplateQueryPropertyTypeModel } from './TemplateQueryPropertyTypeModel'; - -export type TemplateQueryOperatorModel = { - operator: OperatorModel; - applicableTypes: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemplateQueryPropertyPresentationModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemplateQueryPropertyPresentationModel.ts deleted file mode 100644 index 7d5c5c3d80..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemplateQueryPropertyPresentationModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { TemplateQueryPropertyTypeModel } from './TemplateQueryPropertyTypeModel'; - -export type TemplateQueryPropertyPresentationModel = { - alias: string; - type: TemplateQueryPropertyTypeModel; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemplateQueryPropertyTypeModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemplateQueryPropertyTypeModel.ts deleted file mode 100644 index cb256a6ff4..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemplateQueryPropertyTypeModel.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export enum TemplateQueryPropertyTypeModel { - STRING = 'String', - DATE_TIME = 'DateTime', - INTEGER = 'Integer', -} diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemplateQueryResultItemPresentationModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemplateQueryResultItemPresentationModel.ts deleted file mode 100644 index 428789e6e3..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemplateQueryResultItemPresentationModel.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type TemplateQueryResultItemPresentationModel = { - icon: string; - name: string; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemplateQueryResultResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemplateQueryResultResponseModel.ts deleted file mode 100644 index 6031658215..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemplateQueryResultResponseModel.ts +++ /dev/null @@ -1,14 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { TemplateQueryResultItemPresentationModel } from './TemplateQueryResultItemPresentationModel'; - -export type TemplateQueryResultResponseModel = { - queryExpression: string; - sampleResults: Array; - resultCount: number; - executionTime: number; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemplateQuerySettingsResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemplateQuerySettingsResponseModel.ts deleted file mode 100644 index 9bbd602dfd..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemplateQuerySettingsResponseModel.ts +++ /dev/null @@ -1,14 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { TemplateQueryOperatorModel } from './TemplateQueryOperatorModel'; -import type { TemplateQueryPropertyPresentationModel } from './TemplateQueryPropertyPresentationModel'; - -export type TemplateQuerySettingsResponseModel = { - documentTypeAliases: Array; - properties: Array; - operators: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemplateResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemplateResponseModel.ts deleted file mode 100644 index 3f9925fa3d..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemplateResponseModel.ts +++ /dev/null @@ -1,15 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type TemplateResponseModel = { - name: string; - alias: string; - content?: string | null; - id: string; - masterTemplate?: ReferenceByIdModel | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemporaryFileConfigurationResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemporaryFileConfigurationResponseModel.ts deleted file mode 100644 index e9c57080fd..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemporaryFileConfigurationResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type TemporaryFileConfigurationResponseModel = { - imageFileTypes: Array; - disallowedUploadedFilesExtensions: Array; - allowedUploadedFileExtensions: Array; - maxFileSize?: number | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemporaryFileResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemporaryFileResponseModel.ts deleted file mode 100644 index 81b830ed48..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TemporaryFileResponseModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type TemporaryFileResponseModel = { - id: string; - availableUntil?: string | null; - fileName: string; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TourStatusModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TourStatusModel.ts deleted file mode 100644 index cc941f5b6e..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TourStatusModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type TourStatusModel = { - alias: string; - completed: boolean; - disabled: boolean; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TrackedReferenceDocumentTypeModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TrackedReferenceDocumentTypeModel.ts deleted file mode 100644 index d6db0e12e0..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TrackedReferenceDocumentTypeModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type TrackedReferenceDocumentTypeModel = { - icon?: string | null; - alias?: string | null; - name?: string | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TrackedReferenceMediaTypeModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TrackedReferenceMediaTypeModel.ts deleted file mode 100644 index 41c533bbf1..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/TrackedReferenceMediaTypeModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type TrackedReferenceMediaTypeModel = { - icon?: string | null; - alias?: string | null; - name?: string | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UnknownTypePermissionPresentationModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UnknownTypePermissionPresentationModel.ts deleted file mode 100644 index ca089bbf6f..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UnknownTypePermissionPresentationModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type UnknownTypePermissionPresentationModel = { - $type: string; - verbs: Array; - context: string; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UnlockUsersRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UnlockUsersRequestModel.ts deleted file mode 100644 index b3b7422b4d..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UnlockUsersRequestModel.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type UnlockUsersRequestModel = { - userIds: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UnpublishDocumentRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UnpublishDocumentRequestModel.ts deleted file mode 100644 index 5f6a876fbf..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UnpublishDocumentRequestModel.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type UnpublishDocumentRequestModel = { - cultures?: Array | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateDataTypeRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateDataTypeRequestModel.ts deleted file mode 100644 index 43323378ff..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateDataTypeRequestModel.ts +++ /dev/null @@ -1,14 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { DataTypePropertyPresentationModel } from './DataTypePropertyPresentationModel'; - -export type UpdateDataTypeRequestModel = { - name: string; - editorAlias: string; - editorUiAlias?: string | null; - values: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateDictionaryItemRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateDictionaryItemRequestModel.ts deleted file mode 100644 index 5381933ff4..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateDictionaryItemRequestModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { DictionaryItemTranslationModel } from './DictionaryItemTranslationModel'; - -export type UpdateDictionaryItemRequestModel = { - name: string; - translations: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateDocumentBlueprintRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateDocumentBlueprintRequestModel.ts deleted file mode 100644 index 0eb5028bac..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateDocumentBlueprintRequestModel.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { DocumentValueModel } from './DocumentValueModel'; -import type { DocumentVariantRequestModel } from './DocumentVariantRequestModel'; - -export type UpdateDocumentBlueprintRequestModel = { - values: Array; - variants: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateDocumentNotificationsRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateDocumentNotificationsRequestModel.ts deleted file mode 100644 index d8f77ed0ec..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateDocumentNotificationsRequestModel.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type UpdateDocumentNotificationsRequestModel = { - subscribedActionIds: 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 deleted file mode 100644 index 49443c7267..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateDocumentRequestModel.ts +++ /dev/null @@ -1,15 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { DocumentValueModel } from './DocumentValueModel'; -import type { DocumentVariantRequestModel } from './DocumentVariantRequestModel'; -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type UpdateDocumentRequestModel = { - values: Array; - variants: Array; - template?: ReferenceByIdModel | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateDocumentTypePropertyTypeContainerRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateDocumentTypePropertyTypeContainerRequestModel.ts deleted file mode 100644 index 31df6c2e24..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateDocumentTypePropertyTypeContainerRequestModel.ts +++ /dev/null @@ -1,15 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type UpdateDocumentTypePropertyTypeContainerRequestModel = { - id: string; - parent?: ReferenceByIdModel | null; - name?: string | null; - type: string; - sortOrder: number; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateDocumentTypePropertyTypeRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateDocumentTypePropertyTypeRequestModel.ts deleted file mode 100644 index cb01572972..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateDocumentTypePropertyTypeRequestModel.ts +++ /dev/null @@ -1,23 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { PropertyTypeAppearanceModel } from './PropertyTypeAppearanceModel'; -import type { PropertyTypeValidationModel } from './PropertyTypeValidationModel'; -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type UpdateDocumentTypePropertyTypeRequestModel = { - id: string; - container?: ReferenceByIdModel | null; - sortOrder: number; - alias: string; - name: string; - description?: string | null; - dataType: ReferenceByIdModel; - variesByCulture: boolean; - variesBySegment: boolean; - validation: PropertyTypeValidationModel; - appearance: PropertyTypeAppearanceModel; -}; - 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 deleted file mode 100644 index 1f1d8977b7..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateDocumentTypeRequestModel.ts +++ /dev/null @@ -1,31 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { DocumentTypeCleanupModel } from './DocumentTypeCleanupModel'; -import type { DocumentTypeCompositionModel } from './DocumentTypeCompositionModel'; -import type { DocumentTypeSortModel } from './DocumentTypeSortModel'; -import type { ReferenceByIdModel } from './ReferenceByIdModel'; -import type { UpdateDocumentTypePropertyTypeContainerRequestModel } from './UpdateDocumentTypePropertyTypeContainerRequestModel'; -import type { UpdateDocumentTypePropertyTypeRequestModel } from './UpdateDocumentTypePropertyTypeRequestModel'; - -export type UpdateDocumentTypeRequestModel = { - alias: string; - name: string; - description?: string | null; - icon: string; - allowedAsRoot: boolean; - variesByCulture: boolean; - variesBySegment: boolean; - collection?: ReferenceByIdModel | null; - isElement: boolean; - properties: Array; - containers: Array; - allowedTemplates: Array; - defaultTemplate?: ReferenceByIdModel | null; - cleanup: DocumentTypeCleanupModel; - allowedDocumentTypes: Array; - compositions: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateDomainsRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateDomainsRequestModel.ts deleted file mode 100644 index a5954d9801..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateDomainsRequestModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { DomainPresentationModel } from './DomainPresentationModel'; - -export type UpdateDomainsRequestModel = { - defaultIsoCode?: string | null; - domains: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateFolderResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateFolderResponseModel.ts deleted file mode 100644 index dcac13e4fd..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateFolderResponseModel.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type UpdateFolderResponseModel = { - name: string; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateLanguageRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateLanguageRequestModel.ts deleted file mode 100644 index 55a440a3c7..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateLanguageRequestModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type UpdateLanguageRequestModel = { - name: string; - isDefault: boolean; - isMandatory: boolean; - fallbackIsoCode?: string | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateMediaRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateMediaRequestModel.ts deleted file mode 100644 index 0942d3f2c5..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateMediaRequestModel.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { MediaValueModel } from './MediaValueModel'; -import type { MediaVariantRequestModel } from './MediaVariantRequestModel'; - -export type UpdateMediaRequestModel = { - values: Array; - variants: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateMediaTypePropertyTypeContainerRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateMediaTypePropertyTypeContainerRequestModel.ts deleted file mode 100644 index 79933cd4d3..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateMediaTypePropertyTypeContainerRequestModel.ts +++ /dev/null @@ -1,15 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type UpdateMediaTypePropertyTypeContainerRequestModel = { - id: string; - parent?: ReferenceByIdModel | null; - name?: string | null; - type: string; - sortOrder: number; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateMediaTypePropertyTypeRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateMediaTypePropertyTypeRequestModel.ts deleted file mode 100644 index 43734493c3..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateMediaTypePropertyTypeRequestModel.ts +++ /dev/null @@ -1,23 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { PropertyTypeAppearanceModel } from './PropertyTypeAppearanceModel'; -import type { PropertyTypeValidationModel } from './PropertyTypeValidationModel'; -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type UpdateMediaTypePropertyTypeRequestModel = { - id: string; - container?: ReferenceByIdModel | null; - sortOrder: number; - alias: string; - name: string; - description?: string | null; - dataType: ReferenceByIdModel; - variesByCulture: boolean; - variesBySegment: boolean; - validation: PropertyTypeValidationModel; - appearance: PropertyTypeAppearanceModel; -}; - 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 deleted file mode 100644 index ae89525593..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateMediaTypeRequestModel.ts +++ /dev/null @@ -1,27 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { MediaTypeCompositionModel } from './MediaTypeCompositionModel'; -import type { MediaTypeSortModel } from './MediaTypeSortModel'; -import type { ReferenceByIdModel } from './ReferenceByIdModel'; -import type { UpdateMediaTypePropertyTypeContainerRequestModel } from './UpdateMediaTypePropertyTypeContainerRequestModel'; -import type { UpdateMediaTypePropertyTypeRequestModel } from './UpdateMediaTypePropertyTypeRequestModel'; - -export type UpdateMediaTypeRequestModel = { - alias: string; - name: string; - description?: string | null; - icon: string; - allowedAsRoot: boolean; - variesByCulture: boolean; - variesBySegment: boolean; - collection?: ReferenceByIdModel | null; - isElement: boolean; - properties: Array; - containers: Array; - allowedMediaTypes: Array; - compositions: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateMemberGroupRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateMemberGroupRequestModel.ts deleted file mode 100644 index 85d416d3f6..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateMemberGroupRequestModel.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type UpdateMemberGroupRequestModel = { - name: string; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateMemberRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateMemberRequestModel.ts deleted file mode 100644 index 02bd5edebb..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateMemberRequestModel.ts +++ /dev/null @@ -1,21 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { MemberValueModel } from './MemberValueModel'; -import type { MemberVariantRequestModel } from './MemberVariantRequestModel'; - -export type UpdateMemberRequestModel = { - values: Array; - variants: Array; - email: string; - username: string; - oldPassword?: string | null; - newPassword?: string | null; - groups?: Array | null; - isApproved: boolean; - isLockedOut: boolean; - isTwoFactorEnabled: boolean; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateMemberTypePropertyTypeContainerRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateMemberTypePropertyTypeContainerRequestModel.ts deleted file mode 100644 index 051e32c2a3..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateMemberTypePropertyTypeContainerRequestModel.ts +++ /dev/null @@ -1,15 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type UpdateMemberTypePropertyTypeContainerRequestModel = { - id: string; - parent?: ReferenceByIdModel | null; - name?: string | null; - type: string; - sortOrder: number; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateMemberTypePropertyTypeRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateMemberTypePropertyTypeRequestModel.ts deleted file mode 100644 index 2c5d224e14..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateMemberTypePropertyTypeRequestModel.ts +++ /dev/null @@ -1,26 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { MemberTypePropertyTypeVisibilityModel } from './MemberTypePropertyTypeVisibilityModel'; -import type { PropertyTypeAppearanceModel } from './PropertyTypeAppearanceModel'; -import type { PropertyTypeValidationModel } from './PropertyTypeValidationModel'; -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type UpdateMemberTypePropertyTypeRequestModel = { - id: string; - container?: ReferenceByIdModel | null; - sortOrder: number; - alias: string; - name: string; - description?: string | null; - dataType: ReferenceByIdModel; - variesByCulture: boolean; - variesBySegment: boolean; - validation: PropertyTypeValidationModel; - appearance: PropertyTypeAppearanceModel; - isSensitive: boolean; - visibility: MemberTypePropertyTypeVisibilityModel; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateMemberTypeRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateMemberTypeRequestModel.ts deleted file mode 100644 index 7178cfdef1..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateMemberTypeRequestModel.ts +++ /dev/null @@ -1,25 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { MemberTypeCompositionModel } from './MemberTypeCompositionModel'; -import type { ReferenceByIdModel } from './ReferenceByIdModel'; -import type { UpdateMemberTypePropertyTypeContainerRequestModel } from './UpdateMemberTypePropertyTypeContainerRequestModel'; -import type { UpdateMemberTypePropertyTypeRequestModel } from './UpdateMemberTypePropertyTypeRequestModel'; - -export type UpdateMemberTypeRequestModel = { - alias: string; - name: string; - description?: string | null; - icon: string; - allowedAsRoot: boolean; - variesByCulture: boolean; - variesBySegment: boolean; - collection?: ReferenceByIdModel | null; - isElement: boolean; - properties: Array; - containers: Array; - compositions: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdatePackageRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdatePackageRequestModel.ts deleted file mode 100644 index 85b28a9baf..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdatePackageRequestModel.ts +++ /dev/null @@ -1,23 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type UpdatePackageRequestModel = { - name: string; - contentNodeId?: string | null; - contentLoadChildNodes: boolean; - mediaIds: Array; - mediaLoadChildNodes: boolean; - documentTypes: Array; - mediaTypes: Array; - dataTypes: Array; - templates: Array; - partialViews: Array; - stylesheets: Array; - scripts: Array; - languages: Array; - dictionaryItems: Array; - packagePath: string; -}; - 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 deleted file mode 100644 index 68b2cbdd38..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdatePartialViewRequestModel.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type UpdatePartialViewRequestModel = { - content: string; -}; - 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 deleted file mode 100644 index 7fea8d250b..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateScriptRequestModel.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type UpdateScriptRequestModel = { - content: string; -}; - 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 deleted file mode 100644 index 6e95bb058c..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateStylesheetRequestModel.ts +++ /dev/null @@ -1,9 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type UpdateStylesheetRequestModel = { - content: string; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateTemplateRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateTemplateRequestModel.ts deleted file mode 100644 index 837981d8e6..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateTemplateRequestModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type UpdateTemplateRequestModel = { - name: string; - alias: string; - content?: string | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateUserGroupRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateUserGroupRequestModel.ts deleted file mode 100644 index 7c99d56cb8..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateUserGroupRequestModel.ts +++ /dev/null @@ -1,23 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { DocumentPermissionPresentationModel } from './DocumentPermissionPresentationModel'; -import type { ReferenceByIdModel } from './ReferenceByIdModel'; -import type { UnknownTypePermissionPresentationModel } from './UnknownTypePermissionPresentationModel'; - -export type UpdateUserGroupRequestModel = { - name: string; - icon?: string | null; - sections: Array; - languages: Array; - hasAccessToAllLanguages: boolean; - documentStartNode?: ReferenceByIdModel | null; - documentRootAccess: boolean; - mediaStartNode?: ReferenceByIdModel | null; - mediaRootAccess: boolean; - fallbackPermissions: Array; - permissions: Array<(DocumentPermissionPresentationModel | UnknownTypePermissionPresentationModel)>; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateUserGroupsOnUserRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateUserGroupsOnUserRequestModel.ts deleted file mode 100644 index 181ce870fe..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateUserGroupsOnUserRequestModel.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type UpdateUserGroupsOnUserRequestModel = { - userIds: Array; - userGroupIds: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateUserRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateUserRequestModel.ts deleted file mode 100644 index acb30e4f35..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateUserRequestModel.ts +++ /dev/null @@ -1,15 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type UpdateUserRequestModel = { - email: string; - userName: string; - name: string; - userGroupIds: Array; - languageIsoCode: string; - documentStartNodeIds: Array; - mediaStartNodeIds: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateWebhookRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateWebhookRequestModel.ts deleted file mode 100644 index 476e64a89f..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpdateWebhookRequestModel.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type UpdateWebhookRequestModel = { - enabled: boolean; - url: string; - contentTypeKeys: Array; - headers: Record; - events: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpgradeSettingsResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpgradeSettingsResponseModel.ts deleted file mode 100644 index 8c003c6cc2..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UpgradeSettingsResponseModel.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type UpgradeSettingsResponseModel = { - currentState: string; - newState: string; - newVersion: string; - oldVersion: string; - readonly reportUrl: 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 deleted file mode 100644 index 03b2a5c612..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserConfigurationResponseModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* 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 deleted file mode 100644 index a048595095..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserGroupItemResponseModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type UserGroupItemResponseModel = { - id: string; - name: string; - icon?: string | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserGroupResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserGroupResponseModel.ts deleted file mode 100644 index fc3d8af015..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserGroupResponseModel.ts +++ /dev/null @@ -1,25 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { DocumentPermissionPresentationModel } from './DocumentPermissionPresentationModel'; -import type { ReferenceByIdModel } from './ReferenceByIdModel'; -import type { UnknownTypePermissionPresentationModel } from './UnknownTypePermissionPresentationModel'; - -export type UserGroupResponseModel = { - name: string; - icon?: string | null; - sections: Array; - languages: Array; - hasAccessToAllLanguages: boolean; - documentStartNode?: ReferenceByIdModel | null; - documentRootAccess: boolean; - mediaStartNode?: ReferenceByIdModel | null; - mediaRootAccess: boolean; - fallbackPermissions: Array; - permissions: Array<(DocumentPermissionPresentationModel | UnknownTypePermissionPresentationModel)>; - id: string; - isSystemGroup: boolean; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserInstallRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserInstallRequestModel.ts deleted file mode 100644 index a24cc35709..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserInstallRequestModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type UserInstallRequestModel = { - name: string; - email: string; - password: string; - readonly subscribeToNewsletter: boolean; -}; - 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 deleted file mode 100644 index e5bcc26d58..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserItemResponseModel.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type UserItemResponseModel = { - id: string; - name: string; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserOrderModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserOrderModel.ts deleted file mode 100644 index 64a7bf766e..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserOrderModel.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export enum UserOrderModel { - USER_NAME = 'UserName', - LANGUAGE = 'Language', - NAME = 'Name', - EMAIL = 'Email', - ID = 'Id', - CREATE_DATE = 'CreateDate', - UPDATE_DATE = 'UpdateDate', - IS_APPROVED = 'IsApproved', - IS_LOCKED_OUT = 'IsLockedOut', - LAST_LOGIN_DATE = 'LastLoginDate', -} diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserPermissionModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserPermissionModel.ts deleted file mode 100644 index d154d2e05d..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserPermissionModel.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type UserPermissionModel = { - nodeKey: string; - permissions: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserPermissionsResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserPermissionsResponseModel.ts deleted file mode 100644 index 7dfc2edb5a..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserPermissionsResponseModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { UserPermissionModel } from './UserPermissionModel'; - -export type UserPermissionsResponseModel = { - permissions: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserResponseModel.ts deleted file mode 100644 index 4f11202c48..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserResponseModel.ts +++ /dev/null @@ -1,27 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { UserStateModel } from './UserStateModel'; - -export type UserResponseModel = { - email: string; - userName: string; - name: string; - userGroupIds: Array; - id: string; - languageIsoCode?: string | null; - documentStartNodeIds: Array; - mediaStartNodeIds: Array; - avatarUrls: Array; - state: UserStateModel; - failedLoginAttempts: number; - createDate: string; - updateDate: string; - lastLoginDate?: string | null; - lastLockoutDate?: string | null; - lastPasswordChangeDate?: string | null; - isAdmin: boolean; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserSettingsPresentationModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserSettingsPresentationModel.ts deleted file mode 100644 index b1972008c4..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserSettingsPresentationModel.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ConsentLevelPresentationModel } from './ConsentLevelPresentationModel'; - -export type UserSettingsPresentationModel = { - minCharLength: number; - minNonAlphaNumericLength: number; - consentLevels: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserStateModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserStateModel.ts deleted file mode 100644 index 16dc3dd79b..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserStateModel.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export enum UserStateModel { - ACTIVE = 'Active', - DISABLED = 'Disabled', - LOCKED_OUT = 'LockedOut', - INVITED = 'Invited', - INACTIVE = 'Inactive', - ALL = 'All', -} diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserTourStatusesResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserTourStatusesResponseModel.ts deleted file mode 100644 index d27675704d..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserTourStatusesResponseModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { TourStatusModel } from './TourStatusModel'; - -export type UserTourStatusesResponseModel = { - tourStatuses: Array; -}; - 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 deleted file mode 100644 index be0c9fc780..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/UserTwoFactorProviderModel.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* 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 deleted file mode 100644 index eb139f6fb5..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/VariantItemResponseModel.ts +++ /dev/null @@ -1,10 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type VariantItemResponseModel = { - name: string; - culture?: string | null; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/VerifyInviteUserRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/VerifyInviteUserRequestModel.ts deleted file mode 100644 index 99c7a000b6..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/VerifyInviteUserRequestModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type VerifyInviteUserRequestModel = { - user: ReferenceByIdModel; - token: string; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/VerifyInviteUserResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/VerifyInviteUserResponseModel.ts deleted file mode 100644 index cc7f102b7f..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/VerifyInviteUserResponseModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { PasswordConfigurationResponseModel } from './PasswordConfigurationResponseModel'; - -export type VerifyInviteUserResponseModel = { - passwordConfiguration: PasswordConfigurationResponseModel; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/VerifyResetPasswordResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/VerifyResetPasswordResponseModel.ts deleted file mode 100644 index 1c80084a94..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/VerifyResetPasswordResponseModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { PasswordConfigurationResponseModel } from './PasswordConfigurationResponseModel'; - -export type VerifyResetPasswordResponseModel = { - passwordConfiguration: PasswordConfigurationResponseModel; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/VerifyResetPasswordTokenRequestModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/VerifyResetPasswordTokenRequestModel.ts deleted file mode 100644 index 3796453d71..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/VerifyResetPasswordTokenRequestModel.ts +++ /dev/null @@ -1,12 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { ReferenceByIdModel } from './ReferenceByIdModel'; - -export type VerifyResetPasswordTokenRequestModel = { - user: ReferenceByIdModel; - resetCode: string; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/WebhookEventResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/WebhookEventResponseModel.ts deleted file mode 100644 index 100b23dbe0..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/WebhookEventResponseModel.ts +++ /dev/null @@ -1,11 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type WebhookEventResponseModel = { - eventName: string; - eventType: string; - alias: string; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/WebhookItemResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/WebhookItemResponseModel.ts deleted file mode 100644 index 5dd1c9094b..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/WebhookItemResponseModel.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -export type WebhookItemResponseModel = { - enabled: boolean; - name: string; - events: string; - url: string; - types: string; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/WebhookResponseModel.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/WebhookResponseModel.ts deleted file mode 100644 index 918c92805b..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models/WebhookResponseModel.ts +++ /dev/null @@ -1,16 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ - -import type { WebhookEventResponseModel } from './WebhookEventResponseModel'; - -export type WebhookResponseModel = { - enabled: boolean; - url: string; - contentTypeKeys: Array; - headers: Record; - id: string; - events: Array; -}; - diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services.ts new file mode 100644 index 0000000000..362c9798b4 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services.ts @@ -0,0 +1,8623 @@ +import type { CancelablePromise } from './core/CancelablePromise.js'; +import { OpenAPI } from './core/OpenAPI.js'; +import { request as __request } from './core/request.js'; +import type { AuditLogData, CultureData, DataTypeData, DictionaryData, DocumentBlueprintData, DocumentTypeData, DocumentVersionData, DocumentData, DynamicRootData, HealthCheckData, HelpData, IndexerData, InstallData, LanguageData, LogViewerData, ManifestData, MediaTypeData, MediaData, MemberGroupData, MemberTypeData, MemberData, ModelsBuilderData, ObjectTypesData, PackageData, PartialViewData, PreviewData, ProfilingData, PropertyTypeData, PublishedCacheData, RedirectManagementData, RelationTypeData, RelationData, ScriptData, SearcherData, SecurityData, ServerData, StaticFileData, StylesheetData, TagData, TelemetryData, TemplateData, TemporaryFileData, UpgradeData, UserDataData, UserGroupData, UserData, WebhookData } from './models.js'; + +export class AuditLogResource { + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getAuditLog(data: AuditLogData['payloads']['GetAuditLog'] = {}): CancelablePromise { + const { + + orderDirection, +sinceDate, +skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/audit-log', + query: { + orderDirection, sinceDate, skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getAuditLogById(data: AuditLogData['payloads']['GetAuditLogById']): CancelablePromise { + const { + + id, +orderDirection, +sinceDate, +skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/audit-log/{id}', + path: { + id + }, + query: { + orderDirection, sinceDate, skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getAuditLogTypeByLogType(data: AuditLogData['payloads']['GetAuditLogTypeByLogType']): CancelablePromise { + const { + + logType, +sinceDate, +skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/audit-log/type/{logType}', + path: { + logType + }, + query: { + sinceDate, skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + +} + +export class CultureResource { + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getCulture(data: CultureData['payloads']['GetCulture'] = {}): CancelablePromise { + const { + + skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/culture', + query: { + skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + +} + +export class DataTypeResource { + + /** + * @returns string Created + * @throws ApiError + */ + public static postDataType(data: DataTypeData['payloads']['PostDataType'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/data-type', + 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 unknown Success + * @throws ApiError + */ + public static getDataTypeById(data: DataTypeData['payloads']['GetDataTypeById']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/data-type/{id}', + path: { + id + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static deleteDataTypeById(data: DataTypeData['payloads']['DeleteDataTypeById']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/data-type/{id}', + path: { + id + }, + responseHeader: 'Umb-Notifications', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static putDataTypeById(data: DataTypeData['payloads']['PutDataTypeById']): CancelablePromise { + const { + + id, +requestBody + } = data; + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/data-type/{id}', + path: { + id + }, + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Created + * @throws ApiError + */ + public static postDataTypeByIdCopy(data: DataTypeData['payloads']['PostDataTypeByIdCopy']): CancelablePromise { + const { + + id, +requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/data-type/{id}/copy', + path: { + id + }, + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Generated-Resource', + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns boolean Success + * @throws ApiError + */ + public static getDataTypeByIdIsUsed(data: DataTypeData['payloads']['GetDataTypeByIdIsUsed']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/data-type/{id}/is-used', + path: { + id + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static putDataTypeByIdMove(data: DataTypeData['payloads']['PutDataTypeByIdMove']): CancelablePromise { + const { + + id, +requestBody + } = data; + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/data-type/{id}/move', + path: { + id + }, + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getDataTypeByIdReferences(data: DataTypeData['payloads']['GetDataTypeByIdReferences']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/data-type/{id}/references', + path: { + id + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns unknown 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 + */ + public static postDataTypeFolder(data: DataTypeData['payloads']['PostDataTypeFolder'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/data-type/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`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getDataTypeFolderById(data: DataTypeData['payloads']['GetDataTypeFolderById']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/data-type/folder/{id}', + path: { + id + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static deleteDataTypeFolderById(data: DataTypeData['payloads']['DeleteDataTypeFolderById']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/data-type/folder/{id}', + path: { + id + }, + responseHeader: 'Umb-Notifications', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static putDataTypeFolderById(data: DataTypeData['payloads']['PutDataTypeFolderById']): CancelablePromise { + const { + + id, +requestBody + } = data; + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/data-type/folder/{id}', + path: { + id + }, + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getFilterDataType(data: DataTypeData['payloads']['GetFilterDataType'] = {}): CancelablePromise { + const { + + skip, +take, +name, +editorUiAlias, +editorAlias + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/filter/data-type', + query: { + skip, take, name, editorUiAlias, editorAlias + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getItemDataType(data: DataTypeData['payloads']['GetItemDataType'] = {}): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/item/data-type', + query: { + id + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getItemDataTypeSearch(data: DataTypeData['payloads']['GetItemDataTypeSearch'] = {}): CancelablePromise { + const { + + query, +skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/item/data-type/search', + query: { + query, skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getTreeDataTypeAncestors(data: DataTypeData['payloads']['GetTreeDataTypeAncestors'] = {}): CancelablePromise { + const { + + descendantId + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/tree/data-type/ancestors', + query: { + descendantId + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getTreeDataTypeChildren(data: DataTypeData['payloads']['GetTreeDataTypeChildren'] = {}): CancelablePromise { + const { + + parentId, +skip, +take, +foldersOnly + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/tree/data-type/children', + query: { + parentId, skip, take, foldersOnly + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getTreeDataTypeRoot(data: DataTypeData['payloads']['GetTreeDataTypeRoot'] = {}): CancelablePromise { + const { + + skip, +take, +foldersOnly + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/tree/data-type/root', + query: { + skip, take, foldersOnly + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + +} + +export class DictionaryResource { + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getDictionary(data: DictionaryData['payloads']['GetDictionary'] = {}): CancelablePromise { + const { + + filter, +skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/dictionary', + query: { + filter, skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns string Created + * @throws ApiError + */ + public static postDictionary(data: DictionaryData['payloads']['PostDictionary'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/dictionary', + body: requestBody, + mediaType: 'application/json', + 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`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getDictionaryById(data: DictionaryData['payloads']['GetDictionaryById']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/dictionary/{id}', + path: { + id + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static deleteDictionaryById(data: DictionaryData['payloads']['DeleteDictionaryById']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/dictionary/{id}', + path: { + id + }, + responseHeader: 'Umb-Notifications', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static putDictionaryById(data: DictionaryData['payloads']['PutDictionaryById']): CancelablePromise { + const { + + id, +requestBody + } = data; + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/dictionary/{id}', + path: { + id + }, + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + 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 unknown Success + * @throws ApiError + */ + public static getDictionaryByIdExport(data: DictionaryData['payloads']['GetDictionaryByIdExport']): CancelablePromise { + const { + + id, +includeChildren + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/dictionary/{id}/export', + path: { + id + }, + query: { + includeChildren + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static putDictionaryByIdMove(data: DictionaryData['payloads']['PutDictionaryByIdMove']): CancelablePromise { + const { + + id, +requestBody + } = data; + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/dictionary/{id}/move', + path: { + id + }, + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Created + * @throws ApiError + */ + public static postDictionaryImport(data: DictionaryData['payloads']['PostDictionaryImport'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/dictionary/import', + 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 unknown Success + * @throws ApiError + */ + public static getItemDictionary(data: DictionaryData['payloads']['GetItemDictionary'] = {}): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/item/dictionary', + query: { + id + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getTreeDictionaryAncestors(data: DictionaryData['payloads']['GetTreeDictionaryAncestors'] = {}): CancelablePromise { + const { + + descendantId + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/tree/dictionary/ancestors', + query: { + descendantId + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getTreeDictionaryChildren(data: DictionaryData['payloads']['GetTreeDictionaryChildren'] = {}): CancelablePromise { + const { + + parentId, +skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/tree/dictionary/children', + query: { + parentId, skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getTreeDictionaryRoot(data: DictionaryData['payloads']['GetTreeDictionaryRoot'] = {}): CancelablePromise { + const { + + skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/tree/dictionary/root', + query: { + skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + +} + +export class DocumentBlueprintResource { + + /** + * @returns string Created + * @throws ApiError + */ + public static postDocumentBlueprint(data: DocumentBlueprintData['payloads']['PostDocumentBlueprint'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/document-blueprint', + 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 unknown Success + * @throws ApiError + */ + public static getDocumentBlueprintById(data: DocumentBlueprintData['payloads']['GetDocumentBlueprintById']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/document-blueprint/{id}', + path: { + id + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static deleteDocumentBlueprintById(data: DocumentBlueprintData['payloads']['DeleteDocumentBlueprintById']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/document-blueprint/{id}', + path: { + id + }, + responseHeader: 'Umb-Notifications', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static putDocumentBlueprintById(data: DocumentBlueprintData['payloads']['PutDocumentBlueprintById']): CancelablePromise { + const { + + id, +requestBody + } = data; + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/document-blueprint/{id}', + path: { + id + }, + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static putDocumentBlueprintByIdMove(data: DocumentBlueprintData['payloads']['PutDocumentBlueprintByIdMove']): CancelablePromise { + const { + + id, +requestBody + } = data; + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/document-blueprint/{id}/move', + path: { + id + }, + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Created + * @throws ApiError + */ + public static postDocumentBlueprintFolder(data: DocumentBlueprintData['payloads']['PostDocumentBlueprintFolder'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/document-blueprint/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`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getDocumentBlueprintFolderById(data: DocumentBlueprintData['payloads']['GetDocumentBlueprintFolderById']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/document-blueprint/folder/{id}', + path: { + id + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static deleteDocumentBlueprintFolderById(data: DocumentBlueprintData['payloads']['DeleteDocumentBlueprintFolderById']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/document-blueprint/folder/{id}', + path: { + id + }, + responseHeader: 'Umb-Notifications', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static putDocumentBlueprintFolderById(data: DocumentBlueprintData['payloads']['PutDocumentBlueprintFolderById']): CancelablePromise { + const { + + id, +requestBody + } = data; + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/document-blueprint/folder/{id}', + path: { + id + }, + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Created + * @throws ApiError + */ + public static postDocumentBlueprintFromDocument(data: DocumentBlueprintData['payloads']['PostDocumentBlueprintFromDocument'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/document-blueprint/from-document', + body: requestBody, + mediaType: 'application/json', + 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`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getItemDocumentBlueprint(data: DocumentBlueprintData['payloads']['GetItemDocumentBlueprint'] = {}): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/item/document-blueprint', + query: { + id + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getTreeDocumentBlueprintChildren(data: DocumentBlueprintData['payloads']['GetTreeDocumentBlueprintChildren'] = {}): CancelablePromise { + const { + + parentId, +skip, +take, +foldersOnly + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/tree/document-blueprint/children', + query: { + parentId, skip, take, foldersOnly + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getTreeDocumentBlueprintRoot(data: DocumentBlueprintData['payloads']['GetTreeDocumentBlueprintRoot'] = {}): CancelablePromise { + const { + + skip, +take, +foldersOnly + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/tree/document-blueprint/root', + query: { + skip, take, foldersOnly + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + +} + +export class DocumentTypeResource { + + /** + * @returns string Created + * @throws ApiError + */ + public static postDocumentType(data: DocumentTypeData['payloads']['PostDocumentType'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/document-type', + 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 unknown Success + * @throws ApiError + */ + public static getDocumentTypeById(data: DocumentTypeData['payloads']['GetDocumentTypeById']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/document-type/{id}', + path: { + id + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static deleteDocumentTypeById(data: DocumentTypeData['payloads']['DeleteDocumentTypeById']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/document-type/{id}', + path: { + id + }, + responseHeader: 'Umb-Notifications', + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static putDocumentTypeById(data: DocumentTypeData['payloads']['PutDocumentTypeById']): CancelablePromise { + const { + + id, +requestBody + } = data; + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/document-type/{id}', + path: { + id + }, + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getDocumentTypeByIdAllowedChildren(data: DocumentTypeData['payloads']['GetDocumentTypeByIdAllowedChildren']): CancelablePromise { + const { + + id, +skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/document-type/{id}/allowed-children', + path: { + id + }, + query: { + skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getDocumentTypeByIdCompositionReferences(data: DocumentTypeData['payloads']['GetDocumentTypeByIdCompositionReferences']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/document-type/{id}/composition-references', + path: { + 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(data: DocumentTypeData['payloads']['PostDocumentTypeByIdCopy']): CancelablePromise { + const { + + id, +requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/document-type/{id}/copy', + path: { + 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 string Success + * @throws ApiError + */ + public static putDocumentTypeByIdMove(data: DocumentTypeData['payloads']['PutDocumentTypeByIdMove']): CancelablePromise { + const { + + id, +requestBody + } = data; + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/document-type/{id}/move', + path: { + id + }, + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getDocumentTypeAllowedAtRoot(data: DocumentTypeData['payloads']['GetDocumentTypeAllowedAtRoot'] = {}): CancelablePromise { + const { + + skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/document-type/allowed-at-root', + query: { + skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static postDocumentTypeAvailableCompositions(data: DocumentTypeData['payloads']['PostDocumentTypeAvailableCompositions'] = {}): CancelablePromise { + const { + + requestBody + } = data; + 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 unknown 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 + */ + public static postDocumentTypeFolder(data: DocumentTypeData['payloads']['PostDocumentTypeFolder'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/document-type/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`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getDocumentTypeFolderById(data: DocumentTypeData['payloads']['GetDocumentTypeFolderById']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/document-type/folder/{id}', + path: { + id + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static deleteDocumentTypeFolderById(data: DocumentTypeData['payloads']['DeleteDocumentTypeFolderById']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/document-type/folder/{id}', + path: { + id + }, + responseHeader: 'Umb-Notifications', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static putDocumentTypeFolderById(data: DocumentTypeData['payloads']['PutDocumentTypeFolderById']): CancelablePromise { + const { + + id, +requestBody + } = data; + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/document-type/folder/{id}', + path: { + id + }, + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getItemDocumentType(data: DocumentTypeData['payloads']['GetItemDocumentType'] = {}): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/item/document-type', + query: { + id + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getItemDocumentTypeSearch(data: DocumentTypeData['payloads']['GetItemDocumentTypeSearch'] = {}): CancelablePromise { + const { + + query, +skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/item/document-type/search', + query: { + query, skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getTreeDocumentTypeAncestors(data: DocumentTypeData['payloads']['GetTreeDocumentTypeAncestors'] = {}): CancelablePromise { + const { + + descendantId + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/tree/document-type/ancestors', + query: { + descendantId + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getTreeDocumentTypeChildren(data: DocumentTypeData['payloads']['GetTreeDocumentTypeChildren'] = {}): CancelablePromise { + const { + + parentId, +skip, +take, +foldersOnly + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/tree/document-type/children', + query: { + parentId, skip, take, foldersOnly + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getTreeDocumentTypeRoot(data: DocumentTypeData['payloads']['GetTreeDocumentTypeRoot'] = {}): CancelablePromise { + const { + + skip, +take, +foldersOnly + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/tree/document-type/root', + query: { + skip, take, foldersOnly + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + +} + +export class DocumentVersionResource { + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getDocumentVersion(data: DocumentVersionData['payloads']['GetDocumentVersion']): CancelablePromise { + const { + + documentId, +culture, +skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/document-version', + query: { + documentId, culture, skip, take + }, + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getDocumentVersionById(data: DocumentVersionData['payloads']['GetDocumentVersionById']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/document-version/{id}', + path: { + id + }, + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static putDocumentVersionByIdPreventCleanup(data: DocumentVersionData['payloads']['PutDocumentVersionByIdPreventCleanup']): CancelablePromise { + const { + + id, +preventCleanup + } = data; + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/document-version/{id}/prevent-cleanup', + path: { + id + }, + query: { + preventCleanup + }, + responseHeader: 'Umb-Notifications', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static postDocumentVersionByIdRollback(data: DocumentVersionData['payloads']['PostDocumentVersionByIdRollback']): CancelablePromise { + const { + + id, +culture + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/document-version/{id}/rollback', + path: { + id + }, + query: { + culture + }, + responseHeader: 'Umb-Notifications', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + +} + +export class DocumentResource { + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getCollectionDocumentById(data: DocumentData['payloads']['GetCollectionDocumentById']): CancelablePromise { + const { + + id, +dataTypeId, +orderBy, +orderCulture, +orderDirection, +filter, +skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/collection/document/{id}', + path: { + id + }, + query: { + dataTypeId, orderBy, orderCulture, orderDirection, filter, skip, take + }, + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Created + * @throws ApiError + */ + public static postDocument(data: DocumentData['payloads']['PostDocument'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/document', + body: requestBody, + mediaType: 'application/json', + 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`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getDocumentById(data: DocumentData['payloads']['GetDocumentById']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/document/{id}', + path: { + 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 string Success + * @throws ApiError + */ + public static deleteDocumentById(data: DocumentData['payloads']['DeleteDocumentById']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/document/{id}', + path: { + id + }, + responseHeader: 'Umb-Notifications', + 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 string Success + * @throws ApiError + */ + public static putDocumentById(data: DocumentData['payloads']['PutDocumentById']): CancelablePromise { + const { + + id, +requestBody + } = data; + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/document/{id}', + path: { + id + }, + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + 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 string Created + * @throws ApiError + */ + public static postDocumentByIdCopy(data: DocumentData['payloads']['PostDocumentByIdCopy']): CancelablePromise { + const { + + id, +requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/document/{id}/copy', + path: { + id + }, + body: requestBody, + mediaType: 'application/json', + 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`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getDocumentByIdDomains(data: DocumentData['payloads']['GetDocumentByIdDomains']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/document/{id}/domains', + path: { + id + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static putDocumentByIdDomains(data: DocumentData['payloads']['PutDocumentByIdDomains']): CancelablePromise { + const { + + id, +requestBody + } = data; + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/document/{id}/domains', + path: { + id + }, + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + 409: `Conflict`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static putDocumentByIdMove(data: DocumentData['payloads']['PutDocumentByIdMove']): CancelablePromise { + const { + + id, +requestBody + } = data; + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/document/{id}/move', + path: { + id + }, + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + 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 string Success + * @throws ApiError + */ + public static putDocumentByIdMoveToRecycleBin(data: DocumentData['payloads']['PutDocumentByIdMoveToRecycleBin']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/document/{id}/move-to-recycle-bin', + path: { + id + }, + responseHeader: 'Umb-Notifications', + 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 unknown Success + * @throws ApiError + */ + public static getDocumentByIdNotifications(data: DocumentData['payloads']['GetDocumentByIdNotifications']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/document/{id}/notifications', + path: { + 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 string Success + * @throws ApiError + */ + public static putDocumentByIdNotifications(data: DocumentData['payloads']['PutDocumentByIdNotifications']): CancelablePromise { + const { + + id, +requestBody + } = data; + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/document/{id}/notifications', + path: { + id + }, + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Created + * @throws ApiError + */ + public static postDocumentByIdPublicAccess(data: DocumentData['payloads']['PostDocumentByIdPublicAccess']): CancelablePromise { + const { + + id, +requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/document/{id}/public-access', + path: { + id + }, + body: requestBody, + mediaType: 'application/json', + 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`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static deleteDocumentByIdPublicAccess(data: DocumentData['payloads']['DeleteDocumentByIdPublicAccess']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/document/{id}/public-access', + path: { + id + }, + responseHeader: 'Umb-Notifications', + 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`, + }, + }); + } + + /** + * @throws ApiError + */ + public static getDocumentByIdPublicAccess(data: DocumentData['payloads']['GetDocumentByIdPublicAccess']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/document/{id}/public-access', + path: { + 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 string Success + * @throws ApiError + */ + public static putDocumentByIdPublicAccess(data: DocumentData['payloads']['PutDocumentByIdPublicAccess']): CancelablePromise { + const { + + id, +requestBody + } = data; + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/document/{id}/public-access', + path: { + id + }, + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + 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 string Success + * @throws ApiError + */ + public static putDocumentByIdPublish(data: DocumentData['payloads']['PutDocumentByIdPublish']): CancelablePromise { + const { + + id, +requestBody + } = data; + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/document/{id}/publish', + path: { + id + }, + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + 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 string Success + * @throws ApiError + */ + public static putDocumentByIdPublishWithDescendants(data: DocumentData['payloads']['PutDocumentByIdPublishWithDescendants']): CancelablePromise { + const { + + id, +requestBody + } = data; + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/document/{id}/publish-with-descendants', + path: { + id + }, + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + 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 unknown Success + * @throws ApiError + */ + public static getDocumentByIdReferencedBy(data: DocumentData['payloads']['GetDocumentByIdReferencedBy']): CancelablePromise { + const { + + id, +skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/document/{id}/referenced-by', + path: { + id + }, + query: { + skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getDocumentByIdReferencedDescendants(data: DocumentData['payloads']['GetDocumentByIdReferencedDescendants']): CancelablePromise { + const { + + id, +skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/document/{id}/referenced-descendants', + path: { + id + }, + query: { + skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static putDocumentByIdUnpublish(data: DocumentData['payloads']['PutDocumentByIdUnpublish']): CancelablePromise { + const { + + id, +requestBody + } = data; + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/document/{id}/unpublish', + path: { + id + }, + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + 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 string Success + * @throws ApiError + */ + public static putDocumentByIdValidate(data: DocumentData['payloads']['PutDocumentByIdValidate']): CancelablePromise { + const { + + id, +requestBody + } = data; + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/document/{id}/validate', + path: { + id + }, + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + 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 unknown Success + * @throws ApiError + */ + public static getDocumentAreReferenced(data: DocumentData['payloads']['GetDocumentAreReferenced'] = {}): CancelablePromise { + const { + + id, +skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/document/are-referenced', + query: { + id, skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getDocumentConfiguration(): CancelablePromise { + + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/document/configuration', + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static putDocumentSort(data: DocumentData['payloads']['PutDocumentSort'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/document/sort', + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + 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 string Success + * @throws ApiError + */ + public static postDocumentValidate(data: DocumentData['payloads']['PostDocumentValidate'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/document/validate', + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + 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 unknown Success + * @throws ApiError + */ + public static getItemDocument(data: DocumentData['payloads']['GetItemDocument'] = {}): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/item/document', + query: { + id + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getItemDocumentSearch(data: DocumentData['payloads']['GetItemDocumentSearch'] = {}): CancelablePromise { + const { + + query, +skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/item/document/search', + query: { + query, skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static deleteRecycleBinDocument(): CancelablePromise { + + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/recycle-bin/document', + responseHeader: 'Umb-Notifications', + 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 string Success + * @throws ApiError + */ + public static deleteRecycleBinDocumentById(data: DocumentData['payloads']['DeleteRecycleBinDocumentById']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/recycle-bin/document/{id}', + path: { + id + }, + responseHeader: 'Umb-Notifications', + 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 unknown Success + * @throws ApiError + */ + public static getRecycleBinDocumentByIdOriginalParent(data: DocumentData['payloads']['GetRecycleBinDocumentByIdOriginalParent']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/recycle-bin/document/{id}/original-parent', + path: { + 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 string Success + * @throws ApiError + */ + public static putRecycleBinDocumentByIdRestore(data: DocumentData['payloads']['PutRecycleBinDocumentByIdRestore']): CancelablePromise { + const { + + id, +requestBody + } = data; + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/recycle-bin/document/{id}/restore', + path: { + id + }, + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + 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 unknown Success + * @throws ApiError + */ + public static getRecycleBinDocumentChildren(data: DocumentData['payloads']['GetRecycleBinDocumentChildren'] = {}): CancelablePromise { + const { + + parentId, +skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/recycle-bin/document/children', + query: { + parentId, skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getRecycleBinDocumentRoot(data: DocumentData['payloads']['GetRecycleBinDocumentRoot'] = {}): CancelablePromise { + const { + + skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/recycle-bin/document/root', + query: { + skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getTreeDocumentAncestors(data: DocumentData['payloads']['GetTreeDocumentAncestors'] = {}): CancelablePromise { + const { + + descendantId + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/tree/document/ancestors', + query: { + descendantId + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getTreeDocumentChildren(data: DocumentData['payloads']['GetTreeDocumentChildren'] = {}): CancelablePromise { + const { + + parentId, +skip, +take, +dataTypeId + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/tree/document/children', + query: { + parentId, skip, take, dataTypeId + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getTreeDocumentRoot(data: DocumentData['payloads']['GetTreeDocumentRoot'] = {}): CancelablePromise { + const { + + skip, +take, +dataTypeId + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/tree/document/root', + query: { + skip, take, dataTypeId + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + +} + +export class DynamicRootResource { + + /** + * @returns unknown Success + * @throws ApiError + */ + public static postDynamicRootQuery(data: DynamicRootData['payloads']['PostDynamicRootQuery'] = {}): CancelablePromise { + const { + + requestBody + } = data; + 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`, + }, + }); + } + +} + +export class HealthCheckResource { + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getHealthCheckGroup(data: HealthCheckData['payloads']['GetHealthCheckGroup'] = {}): CancelablePromise { + const { + + skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/health-check-group', + query: { + skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getHealthCheckGroupByName(data: HealthCheckData['payloads']['GetHealthCheckGroupByName']): CancelablePromise { + const { + + name + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/health-check-group/{name}', + path: { + name + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static postHealthCheckGroupByNameCheck(data: HealthCheckData['payloads']['PostHealthCheckGroupByNameCheck']): CancelablePromise { + const { + + name + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/health-check-group/{name}/check', + path: { + name + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static postHealthCheckExecuteAction(data: HealthCheckData['payloads']['PostHealthCheckExecuteAction'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/health-check/execute-action', + body: requestBody, + mediaType: 'application/json', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + +} + +export class HelpResource { + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getHelp(data: HelpData['payloads']['GetHelp'] = {}): CancelablePromise { + const { + + section, +tree, +skip, +take, +baseUrl + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/help', + query: { + section, tree, skip, take, baseUrl + }, + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + +} + +export class IndexerResource { + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getIndexer(data: IndexerData['payloads']['GetIndexer'] = {}): CancelablePromise { + const { + + skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/indexer', + query: { + skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getIndexerByIndexName(data: IndexerData['payloads']['GetIndexerByIndexName']): CancelablePromise { + const { + + indexName + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/indexer/{indexName}', + path: { + indexName + }, + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static postIndexerByIndexNameRebuild(data: IndexerData['payloads']['PostIndexerByIndexNameRebuild']): CancelablePromise { + const { + + indexName + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/indexer/{indexName}/rebuild', + path: { + indexName + }, + responseHeader: 'Umb-Notifications', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + 409: `Conflict`, + }, + }); + } + +} + +export class InstallResource { + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getInstallSettings(): CancelablePromise { + + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/install/settings', + errors: { + 428: `Client Error`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static postInstallSetup(data: InstallData['payloads']['PostInstallSetup'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/install/setup', + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + errors: { + 428: `Client Error`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static postInstallValidateDatabase(data: InstallData['payloads']['PostInstallValidateDatabase'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/install/validate-database', + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + errors: { + 400: `Bad Request`, + }, + }); + } + +} + +export class LanguageResource { + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getItemLanguage(data: LanguageData['payloads']['GetItemLanguage'] = {}): CancelablePromise { + const { + + isoCode + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/item/language', + query: { + isoCode + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getLanguage(data: LanguageData['payloads']['GetLanguage'] = {}): CancelablePromise { + const { + + skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/language', + query: { + skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns string Created + * @throws ApiError + */ + public static postLanguage(data: LanguageData['payloads']['PostLanguage'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/language', + 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 unknown Success + * @throws ApiError + */ + public static getLanguageByIsoCode(data: LanguageData['payloads']['GetLanguageByIsoCode']): CancelablePromise { + const { + + isoCode + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/language/{isoCode}', + path: { + isoCode + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static deleteLanguageByIsoCode(data: LanguageData['payloads']['DeleteLanguageByIsoCode']): CancelablePromise { + const { + + isoCode + } = data; + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/language/{isoCode}', + path: { + isoCode + }, + responseHeader: 'Umb-Notifications', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static putLanguageByIsoCode(data: LanguageData['payloads']['PutLanguageByIsoCode']): CancelablePromise { + const { + + isoCode, +requestBody + } = data; + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/language/{isoCode}', + path: { + isoCode + }, + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + +} + +export class LogViewerResource { + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getLogViewerLevel(data: LogViewerData['payloads']['GetLogViewerLevel'] = {}): CancelablePromise { + const { + + skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/log-viewer/level', + query: { + skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getLogViewerLevelCount(data: LogViewerData['payloads']['GetLogViewerLevelCount'] = {}): CancelablePromise { + const { + + startDate, +endDate + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/log-viewer/level-count', + query: { + startDate, endDate + }, + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getLogViewerLog(data: LogViewerData['payloads']['GetLogViewerLog'] = {}): CancelablePromise { + const { + + skip, +take, +orderDirection, +filterExpression, +logLevel, +startDate, +endDate + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/log-viewer/log', + query: { + skip, take, orderDirection, filterExpression, logLevel, startDate, endDate + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getLogViewerMessageTemplate(data: LogViewerData['payloads']['GetLogViewerMessageTemplate'] = {}): CancelablePromise { + const { + + skip, +take, +startDate, +endDate + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/log-viewer/message-template', + query: { + skip, take, startDate, endDate + }, + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getLogViewerSavedSearch(data: LogViewerData['payloads']['GetLogViewerSavedSearch'] = {}): CancelablePromise { + const { + + skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/log-viewer/saved-search', + query: { + skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns string Created + * @throws ApiError + */ + public static postLogViewerSavedSearch(data: LogViewerData['payloads']['PostLogViewerSavedSearch'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/log-viewer/saved-search', + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Generated-Resource', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getLogViewerSavedSearchByName(data: LogViewerData['payloads']['GetLogViewerSavedSearchByName']): CancelablePromise { + const { + + name + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/log-viewer/saved-search/{name}', + path: { + name + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static deleteLogViewerSavedSearchByName(data: LogViewerData['payloads']['DeleteLogViewerSavedSearchByName']): CancelablePromise { + const { + + name + } = data; + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/log-viewer/saved-search/{name}', + path: { + name + }, + responseHeader: 'Umb-Notifications', + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns any Success + * @throws ApiError + */ + public static getLogViewerValidateLogsSize(data: LogViewerData['payloads']['GetLogViewerValidateLogsSize'] = {}): CancelablePromise { + const { + + startDate, +endDate + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/log-viewer/validate-logs-size', + query: { + startDate, endDate + }, + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + +} + +export class ManifestResource { + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getManifestManifest(): CancelablePromise { + + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/manifest/manifest', + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getManifestManifestPrivate(): CancelablePromise { + + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/manifest/manifest/private', + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getManifestManifestPublic(): CancelablePromise { + + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/manifest/manifest/public', + }); + } + +} + +export class MediaTypeResource { + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getItemMediaType(data: MediaTypeData['payloads']['GetItemMediaType'] = {}): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/item/media-type', + query: { + id + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getItemMediaTypeSearch(data: MediaTypeData['payloads']['GetItemMediaTypeSearch'] = {}): CancelablePromise { + const { + + query, +skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/item/media-type/search', + query: { + query, skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns string Created + * @throws ApiError + */ + public static postMediaType(data: MediaTypeData['payloads']['PostMediaType'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/media-type', + 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 unknown Success + * @throws ApiError + */ + public static getMediaTypeById(data: MediaTypeData['payloads']['GetMediaTypeById']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/media-type/{id}', + path: { + id + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static deleteMediaTypeById(data: MediaTypeData['payloads']['DeleteMediaTypeById']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/media-type/{id}', + path: { + id + }, + responseHeader: 'Umb-Notifications', + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static putMediaTypeById(data: MediaTypeData['payloads']['PutMediaTypeById']): CancelablePromise { + const { + + id, +requestBody + } = data; + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/media-type/{id}', + path: { + id + }, + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getMediaTypeByIdAllowedChildren(data: MediaTypeData['payloads']['GetMediaTypeByIdAllowedChildren']): CancelablePromise { + const { + + id, +skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/media-type/{id}/allowed-children', + path: { + id + }, + query: { + skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getMediaTypeByIdCompositionReferences(data: MediaTypeData['payloads']['GetMediaTypeByIdCompositionReferences']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/media-type/{id}/composition-references', + path: { + 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(data: MediaTypeData['payloads']['PostMediaTypeByIdCopy']): CancelablePromise { + const { + + id, +requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/media-type/{id}/copy', + path: { + 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 string Success + * @throws ApiError + */ + public static putMediaTypeByIdMove(data: MediaTypeData['payloads']['PutMediaTypeByIdMove']): CancelablePromise { + const { + + id, +requestBody + } = data; + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/media-type/{id}/move', + path: { + id + }, + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getMediaTypeAllowedAtRoot(data: MediaTypeData['payloads']['GetMediaTypeAllowedAtRoot'] = {}): CancelablePromise { + const { + + skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/media-type/allowed-at-root', + query: { + skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static postMediaTypeAvailableCompositions(data: MediaTypeData['payloads']['PostMediaTypeAvailableCompositions'] = {}): CancelablePromise { + const { + + requestBody + } = data; + 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 + */ + public static postMediaTypeFolder(data: MediaTypeData['payloads']['PostMediaTypeFolder'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/media-type/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`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getMediaTypeFolderById(data: MediaTypeData['payloads']['GetMediaTypeFolderById']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/media-type/folder/{id}', + path: { + id + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static deleteMediaTypeFolderById(data: MediaTypeData['payloads']['DeleteMediaTypeFolderById']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/media-type/folder/{id}', + path: { + id + }, + responseHeader: 'Umb-Notifications', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static putMediaTypeFolderById(data: MediaTypeData['payloads']['PutMediaTypeFolderById']): CancelablePromise { + const { + + id, +requestBody + } = data; + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/media-type/folder/{id}', + path: { + id + }, + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getTreeMediaTypeAncestors(data: MediaTypeData['payloads']['GetTreeMediaTypeAncestors'] = {}): CancelablePromise { + const { + + descendantId + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/tree/media-type/ancestors', + query: { + descendantId + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getTreeMediaTypeChildren(data: MediaTypeData['payloads']['GetTreeMediaTypeChildren'] = {}): CancelablePromise { + const { + + parentId, +skip, +take, +foldersOnly + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/tree/media-type/children', + query: { + parentId, skip, take, foldersOnly + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getTreeMediaTypeRoot(data: MediaTypeData['payloads']['GetTreeMediaTypeRoot'] = {}): CancelablePromise { + const { + + skip, +take, +foldersOnly + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/tree/media-type/root', + query: { + skip, take, foldersOnly + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + +} + +export class MediaResource { + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getCollectionMedia(data: MediaData['payloads']['GetCollectionMedia'] = {}): CancelablePromise { + const { + + id, +dataTypeId, +orderBy, +orderDirection, +filter, +skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/collection/media', + query: { + id, dataTypeId, orderBy, orderDirection, filter, skip, take + }, + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getItemMedia(data: MediaData['payloads']['GetItemMedia'] = {}): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/item/media', + query: { + id + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getItemMediaSearch(data: MediaData['payloads']['GetItemMediaSearch'] = {}): CancelablePromise { + const { + + query, +skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/item/media/search', + query: { + query, skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns string Created + * @throws ApiError + */ + public static postMedia(data: MediaData['payloads']['PostMedia'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/media', + body: requestBody, + mediaType: 'application/json', + 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`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getMediaById(data: MediaData['payloads']['GetMediaById']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/media/{id}', + path: { + 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 string Success + * @throws ApiError + */ + public static deleteMediaById(data: MediaData['payloads']['DeleteMediaById']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/media/{id}', + path: { + id + }, + responseHeader: 'Umb-Notifications', + 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 string Success + * @throws ApiError + */ + public static putMediaById(data: MediaData['payloads']['PutMediaById']): CancelablePromise { + const { + + id, +requestBody + } = data; + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/media/{id}', + path: { + id + }, + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + 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 string Success + * @throws ApiError + */ + public static putMediaByIdMove(data: MediaData['payloads']['PutMediaByIdMove']): CancelablePromise { + const { + + id, +requestBody + } = data; + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/media/{id}/move', + path: { + id + }, + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + 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 string Success + * @throws ApiError + */ + public static putMediaByIdMoveToRecycleBin(data: MediaData['payloads']['PutMediaByIdMoveToRecycleBin']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/media/{id}/move-to-recycle-bin', + path: { + id + }, + responseHeader: 'Umb-Notifications', + 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 unknown Success + * @throws ApiError + */ + public static getMediaByIdReferencedBy(data: MediaData['payloads']['GetMediaByIdReferencedBy']): CancelablePromise { + const { + + id, +skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/media/{id}/referenced-by', + path: { + id + }, + query: { + skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getMediaByIdReferencedDescendants(data: MediaData['payloads']['GetMediaByIdReferencedDescendants']): CancelablePromise { + const { + + id, +skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/media/{id}/referenced-descendants', + path: { + id + }, + query: { + skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static putMediaByIdValidate(data: MediaData['payloads']['PutMediaByIdValidate']): CancelablePromise { + const { + + id, +requestBody + } = data; + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/media/{id}/validate', + path: { + id + }, + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + 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 unknown Success + * @throws ApiError + */ + public static getMediaAreReferenced(data: MediaData['payloads']['GetMediaAreReferenced'] = {}): CancelablePromise { + const { + + id, +skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/media/are-referenced', + query: { + id, skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown 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 string Success + * @throws ApiError + */ + public static putMediaSort(data: MediaData['payloads']['PutMediaSort'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/media/sort', + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + 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 string Success + * @throws ApiError + */ + public static postMediaValidate(data: MediaData['payloads']['PostMediaValidate'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/media/validate', + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + 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 string Success + * @throws ApiError + */ + public static deleteRecycleBinMedia(): CancelablePromise { + + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/recycle-bin/media', + responseHeader: 'Umb-Notifications', + 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 string Success + * @throws ApiError + */ + public static deleteRecycleBinMediaById(data: MediaData['payloads']['DeleteRecycleBinMediaById']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/recycle-bin/media/{id}', + path: { + id + }, + responseHeader: 'Umb-Notifications', + 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 unknown Success + * @throws ApiError + */ + public static getRecycleBinMediaByIdOriginalParent(data: MediaData['payloads']['GetRecycleBinMediaByIdOriginalParent']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/recycle-bin/media/{id}/original-parent', + path: { + 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 string Success + * @throws ApiError + */ + public static putRecycleBinMediaByIdRestore(data: MediaData['payloads']['PutRecycleBinMediaByIdRestore']): CancelablePromise { + const { + + id, +requestBody + } = data; + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/recycle-bin/media/{id}/restore', + path: { + id + }, + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + 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 unknown Success + * @throws ApiError + */ + public static getRecycleBinMediaChildren(data: MediaData['payloads']['GetRecycleBinMediaChildren'] = {}): CancelablePromise { + const { + + parentId, +skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/recycle-bin/media/children', + query: { + parentId, skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getRecycleBinMediaRoot(data: MediaData['payloads']['GetRecycleBinMediaRoot'] = {}): CancelablePromise { + const { + + skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/recycle-bin/media/root', + query: { + skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getTreeMediaAncestors(data: MediaData['payloads']['GetTreeMediaAncestors'] = {}): CancelablePromise { + const { + + descendantId + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/tree/media/ancestors', + query: { + descendantId + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getTreeMediaChildren(data: MediaData['payloads']['GetTreeMediaChildren'] = {}): CancelablePromise { + const { + + parentId, +skip, +take, +dataTypeId + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/tree/media/children', + query: { + parentId, skip, take, dataTypeId + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getTreeMediaRoot(data: MediaData['payloads']['GetTreeMediaRoot'] = {}): CancelablePromise { + const { + + skip, +take, +dataTypeId + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/tree/media/root', + query: { + skip, take, dataTypeId + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + +} + +export class MemberGroupResource { + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getItemMemberGroup(data: MemberGroupData['payloads']['GetItemMemberGroup'] = {}): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/item/member-group', + query: { + id + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getMemberGroup(data: MemberGroupData['payloads']['GetMemberGroup'] = {}): CancelablePromise { + const { + + skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/member-group', + query: { + skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static postMemberGroup(data: MemberGroupData['payloads']['PostMemberGroup'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/member-group', + body: requestBody, + mediaType: 'application/json', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getMemberGroupById(data: MemberGroupData['payloads']['GetMemberGroupById']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/member-group/{id}', + path: { + id + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static deleteMemberGroupById(data: MemberGroupData['payloads']['DeleteMemberGroupById']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/member-group/{id}', + path: { + id + }, + responseHeader: 'Umb-Notifications', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static putMemberGroupById(data: MemberGroupData['payloads']['PutMemberGroupById']): CancelablePromise { + const { + + id, +requestBody + } = data; + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/member-group/{id}', + path: { + id + }, + body: requestBody, + mediaType: 'application/json', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getTreeMemberGroupRoot(data: MemberGroupData['payloads']['GetTreeMemberGroupRoot'] = {}): CancelablePromise { + const { + + skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/tree/member-group/root', + query: { + skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + +} + +export class MemberTypeResource { + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getItemMemberType(data: MemberTypeData['payloads']['GetItemMemberType'] = {}): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/item/member-type', + query: { + id + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getItemMemberTypeSearch(data: MemberTypeData['payloads']['GetItemMemberTypeSearch'] = {}): CancelablePromise { + const { + + query, +skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/item/member-type/search', + query: { + query, skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns string Created + * @throws ApiError + */ + public static postMemberType(data: MemberTypeData['payloads']['PostMemberType'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/member-type', + 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 unknown Success + * @throws ApiError + */ + public static getMemberTypeById(data: MemberTypeData['payloads']['GetMemberTypeById']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/member-type/{id}', + path: { + id + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static deleteMemberTypeById(data: MemberTypeData['payloads']['DeleteMemberTypeById']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/member-type/{id}', + path: { + id + }, + responseHeader: 'Umb-Notifications', + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static putMemberTypeById(data: MemberTypeData['payloads']['PutMemberTypeById']): CancelablePromise { + const { + + id, +requestBody + } = data; + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/member-type/{id}', + path: { + id + }, + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getMemberTypeByIdCompositionReferences(data: MemberTypeData['payloads']['GetMemberTypeByIdCompositionReferences']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/member-type/{id}/composition-references', + path: { + 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 postMemberTypeByIdCopy(data: MemberTypeData['payloads']['PostMemberTypeByIdCopy']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/member-type/{id}/copy', + path: { + id + }, + responseHeader: 'Umb-Generated-Resource', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static postMemberTypeAvailableCompositions(data: MemberTypeData['payloads']['PostMemberTypeAvailableCompositions'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/member-type/available-compositions', + body: requestBody, + mediaType: 'application/json', + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getTreeMemberTypeRoot(data: MemberTypeData['payloads']['GetTreeMemberTypeRoot'] = {}): CancelablePromise { + const { + + skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/tree/member-type/root', + query: { + skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + +} + +export class MemberResource { + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getFilterMember(data: MemberData['payloads']['GetFilterMember'] = {}): CancelablePromise { + const { + + memberTypeId, +memberGroupName, +isApproved, +isLockedOut, +orderBy, +orderDirection, +filter, +skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/filter/member', + query: { + memberTypeId, memberGroupName, isApproved, isLockedOut, orderBy, orderDirection, filter, skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getItemMember(data: MemberData['payloads']['GetItemMember'] = {}): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/item/member', + query: { + id + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getItemMemberSearch(data: MemberData['payloads']['GetItemMemberSearch'] = {}): CancelablePromise { + const { + + query, +skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/item/member/search', + query: { + query, skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns string Created + * @throws ApiError + */ + public static postMember(data: MemberData['payloads']['PostMember'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/member', + 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 unknown Success + * @throws ApiError + */ + public static getMemberById(data: MemberData['payloads']['GetMemberById']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/member/{id}', + path: { + id + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static deleteMemberById(data: MemberData['payloads']['DeleteMemberById']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/member/{id}', + path: { + id + }, + responseHeader: 'Umb-Notifications', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static putMemberById(data: MemberData['payloads']['PutMemberById']): CancelablePromise { + const { + + id, +requestBody + } = data; + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/member/{id}', + path: { + id + }, + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static putMemberByIdValidate(data: MemberData['payloads']['PutMemberByIdValidate']): CancelablePromise { + const { + + id, +requestBody + } = data; + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/member/{id}/validate', + path: { + id + }, + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getMemberConfiguration(): CancelablePromise { + + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/member/configuration', + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static postMemberValidate(data: MemberData['payloads']['PostMemberValidate'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/member/validate', + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + +} + +export class ModelsBuilderResource { + + /** + * @returns string Success + * @throws ApiError + */ + public static postModelsBuilderBuild(): CancelablePromise { + + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/models-builder/build', + responseHeader: 'Umb-Notifications', + errors: { + 401: `The resource is protected and requires an authentication token`, + 428: `Client Error`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getModelsBuilderDashboard(): CancelablePromise { + + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/models-builder/dashboard', + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getModelsBuilderStatus(): CancelablePromise { + + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/models-builder/status', + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + +} + +export class ObjectTypesResource { + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getObjectTypes(data: ObjectTypesData['payloads']['GetObjectTypes'] = {}): CancelablePromise { + const { + + skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/object-types', + query: { + skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + +} + +export class PackageResource { + + /** + * @returns string Success + * @throws ApiError + */ + public static postPackageByNameRunMigration(data: PackageData['payloads']['PostPackageByNameRunMigration']): CancelablePromise { + const { + + name + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/package/{name}/run-migration', + path: { + name + }, + responseHeader: 'Umb-Notifications', + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + 409: `Conflict`, + }, + }); + } + + /** + * @returns unknown 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 unknown Success + * @throws ApiError + */ + public static getPackageCreated(data: PackageData['payloads']['GetPackageCreated'] = {}): CancelablePromise { + const { + + skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/package/created', + query: { + skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns string Created + * @throws ApiError + */ + public static postPackageCreated(data: PackageData['payloads']['PostPackageCreated'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/package/created', + 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 unknown Success + * @throws ApiError + */ + public static getPackageCreatedById(data: PackageData['payloads']['GetPackageCreatedById']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/package/created/{id}', + path: { + id + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static deletePackageCreatedById(data: PackageData['payloads']['DeletePackageCreatedById']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/package/created/{id}', + path: { + id + }, + responseHeader: 'Umb-Notifications', + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static putPackageCreatedById(data: PackageData['payloads']['PutPackageCreatedById']): CancelablePromise { + const { + + id, +requestBody + } = data; + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/package/created/{id}', + path: { + id + }, + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getPackageCreatedByIdDownload(data: PackageData['payloads']['GetPackageCreatedByIdDownload']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/package/created/{id}/download', + path: { + id + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getPackageMigrationStatus(data: PackageData['payloads']['GetPackageMigrationStatus'] = {}): CancelablePromise { + const { + + skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/package/migration-status', + query: { + skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + +} + +export class PartialViewResource { + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getItemPartialView(data: PartialViewData['payloads']['GetItemPartialView'] = {}): CancelablePromise { + const { + + path + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/item/partial-view', + query: { + path + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns string Created + * @throws ApiError + */ + public static postPartialView(data: PartialViewData['payloads']['PostPartialView'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/partial-view', + 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 unknown Success + * @throws ApiError + */ + public static getPartialViewByPath(data: PartialViewData['payloads']['GetPartialViewByPath']): CancelablePromise { + const { + + path + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/partial-view/{path}', + path: { + path + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static deletePartialViewByPath(data: PartialViewData['payloads']['DeletePartialViewByPath']): CancelablePromise { + const { + + path + } = data; + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/partial-view/{path}', + path: { + path + }, + responseHeader: 'Umb-Notifications', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static putPartialViewByPath(data: PartialViewData['payloads']['PutPartialViewByPath']): CancelablePromise { + const { + + path, +requestBody + } = data; + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/partial-view/{path}', + path: { + path + }, + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Created + * @throws ApiError + */ + public static putPartialViewByPathRename(data: PartialViewData['payloads']['PutPartialViewByPathRename']): CancelablePromise { + const { + + path, +requestBody + } = data; + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/partial-view/{path}/rename', + 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 string Created + * @throws ApiError + */ + public static postPartialViewFolder(data: PartialViewData['payloads']['PostPartialViewFolder'] = {}): CancelablePromise { + const { + + requestBody + } = data; + 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`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getPartialViewFolderByPath(data: PartialViewData['payloads']['GetPartialViewFolderByPath']): CancelablePromise { + const { + + path + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/partial-view/folder/{path}', + path: { + path + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static deletePartialViewFolderByPath(data: PartialViewData['payloads']['DeletePartialViewFolderByPath']): CancelablePromise { + const { + + path + } = data; + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/partial-view/folder/{path}', + path: { + path + }, + responseHeader: 'Umb-Notifications', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getPartialViewSnippet(data: PartialViewData['payloads']['GetPartialViewSnippet'] = {}): CancelablePromise { + const { + + skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/partial-view/snippet', + query: { + skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getPartialViewSnippetById(data: PartialViewData['payloads']['GetPartialViewSnippetById']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/partial-view/snippet/{id}', + path: { + id + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getTreePartialViewAncestors(data: PartialViewData['payloads']['GetTreePartialViewAncestors'] = {}): CancelablePromise { + const { + + descendantPath + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/tree/partial-view/ancestors', + query: { + descendantPath + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getTreePartialViewChildren(data: PartialViewData['payloads']['GetTreePartialViewChildren'] = {}): CancelablePromise { + const { + + parentPath, +skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/tree/partial-view/children', + query: { + parentPath, skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getTreePartialViewRoot(data: PartialViewData['payloads']['GetTreePartialViewRoot'] = {}): CancelablePromise { + const { + + skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/tree/partial-view/root', + query: { + skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + +} + +export class PreviewResource { + + /** + * @returns string Success + * @throws ApiError + */ + public static deletePreview(): CancelablePromise { + + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/preview', + responseHeader: 'Umb-Notifications', + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static postPreview(): CancelablePromise { + + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/preview', + responseHeader: 'Umb-Notifications', + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + +} + +export class ProfilingResource { + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getProfilingStatus(): CancelablePromise { + + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/profiling/status', + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static putProfilingStatus(data: ProfilingData['payloads']['PutProfilingStatus'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/profiling/status', + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + +} + +export class PropertyTypeResource { + + /** + * @returns boolean Success + * @throws ApiError + */ + public static getPropertyTypeIsUsed(data: PropertyTypeData['payloads']['GetPropertyTypeIsUsed'] = {}): CancelablePromise { + const { + + contentTypeId, +propertyAlias + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/property-type/is-used', + query: { + contentTypeId, propertyAlias + }, + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + +} + +export class PublishedCacheResource { + + /** + * @returns string Success + * @throws ApiError + */ + public static postPublishedCacheCollect(): CancelablePromise { + + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/published-cache/collect', + responseHeader: 'Umb-Notifications', + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static postPublishedCacheRebuild(): CancelablePromise { + + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/published-cache/rebuild', + responseHeader: 'Umb-Notifications', + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static postPublishedCacheReload(): CancelablePromise { + + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/published-cache/reload', + responseHeader: 'Umb-Notifications', + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static getPublishedCacheStatus(): CancelablePromise { + + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/published-cache/status', + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + +} + +export class RedirectManagementResource { + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getRedirectManagement(data: RedirectManagementData['payloads']['GetRedirectManagement'] = {}): CancelablePromise { + const { + + filter, +skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/redirect-management', + query: { + filter, skip, take + }, + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getRedirectManagementById(data: RedirectManagementData['payloads']['GetRedirectManagementById']): CancelablePromise { + const { + + id, +skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/redirect-management/{id}', + path: { + id + }, + query: { + skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static deleteRedirectManagementById(data: RedirectManagementData['payloads']['DeleteRedirectManagementById']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/redirect-management/{id}', + path: { + id + }, + responseHeader: 'Umb-Notifications', + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getRedirectManagementStatus(): CancelablePromise { + + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/redirect-management/status', + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static postRedirectManagementStatus(data: RedirectManagementData['payloads']['PostRedirectManagementStatus'] = {}): CancelablePromise { + const { + + status + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/redirect-management/status', + query: { + status + }, + responseHeader: 'Umb-Notifications', + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + +} + +export class RelationTypeResource { + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getItemRelationType(data: RelationTypeData['payloads']['GetItemRelationType'] = {}): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/item/relation-type', + query: { + id + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getRelationType(data: RelationTypeData['payloads']['GetRelationType'] = {}): CancelablePromise { + const { + + skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/relation-type', + query: { + skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getRelationTypeById(data: RelationTypeData['payloads']['GetRelationTypeById']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/relation-type/{id}', + path: { + id + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + +} + +export class RelationResource { + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getRelationTypeById(data: RelationData['payloads']['GetRelationTypeById']): CancelablePromise { + const { + + id, +skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/relation/type/{id}', + path: { + id + }, + query: { + skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + +} + +export class ScriptResource { + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getItemScript(data: ScriptData['payloads']['GetItemScript'] = {}): CancelablePromise { + const { + + path + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/item/script', + query: { + path + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns string Created + * @throws ApiError + */ + public static postScript(data: ScriptData['payloads']['PostScript'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/script', + 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 unknown Success + * @throws ApiError + */ + public static getScriptByPath(data: ScriptData['payloads']['GetScriptByPath']): CancelablePromise { + const { + + path + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/script/{path}', + path: { + path + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static deleteScriptByPath(data: ScriptData['payloads']['DeleteScriptByPath']): CancelablePromise { + const { + + path + } = data; + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/script/{path}', + path: { + path + }, + responseHeader: 'Umb-Notifications', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static putScriptByPath(data: ScriptData['payloads']['PutScriptByPath']): CancelablePromise { + const { + + path, +requestBody + } = data; + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/script/{path}', + path: { + path + }, + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Created + * @throws ApiError + */ + public static putScriptByPathRename(data: ScriptData['payloads']['PutScriptByPathRename']): CancelablePromise { + const { + + path, +requestBody + } = data; + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/script/{path}/rename', + 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 string Created + * @throws ApiError + */ + public static postScriptFolder(data: ScriptData['payloads']['PostScriptFolder'] = {}): CancelablePromise { + const { + + requestBody + } = data; + 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`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getScriptFolderByPath(data: ScriptData['payloads']['GetScriptFolderByPath']): CancelablePromise { + const { + + path + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/script/folder/{path}', + path: { + path + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static deleteScriptFolderByPath(data: ScriptData['payloads']['DeleteScriptFolderByPath']): CancelablePromise { + const { + + path + } = data; + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/script/folder/{path}', + path: { + path + }, + responseHeader: 'Umb-Notifications', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getTreeScriptAncestors(data: ScriptData['payloads']['GetTreeScriptAncestors'] = {}): CancelablePromise { + const { + + descendantPath + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/tree/script/ancestors', + query: { + descendantPath + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getTreeScriptChildren(data: ScriptData['payloads']['GetTreeScriptChildren'] = {}): CancelablePromise { + const { + + parentPath, +skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/tree/script/children', + query: { + parentPath, skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getTreeScriptRoot(data: ScriptData['payloads']['GetTreeScriptRoot'] = {}): CancelablePromise { + const { + + skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/tree/script/root', + query: { + skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + +} + +export class SearcherResource { + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getSearcher(data: SearcherData['payloads']['GetSearcher'] = {}): CancelablePromise { + const { + + skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/searcher', + query: { + skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getSearcherBySearcherNameQuery(data: SearcherData['payloads']['GetSearcherBySearcherNameQuery']): CancelablePromise { + const { + + searcherName, +term, +skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/searcher/{searcherName}/query', + path: { + searcherName + }, + query: { + term, skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + +} + +export class SecurityResource { + + /** + * @returns unknown 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 string Success + * @throws ApiError + */ + public static postSecurityForgotPassword(data: SecurityData['payloads']['PostSecurityForgotPassword'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/security/forgot-password', + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns string No Content + * @throws ApiError + */ + public static postSecurityForgotPasswordReset(data: SecurityData['payloads']['PostSecurityForgotPasswordReset'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/security/forgot-password/reset', + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static postSecurityForgotPasswordVerify(data: SecurityData['payloads']['PostSecurityForgotPasswordVerify'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/security/forgot-password/verify', + body: requestBody, + mediaType: 'application/json', + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + +} + +export class ServerResource { + + /** + * @returns unknown 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 unknown Success + * @throws ApiError + */ + public static getServerInformation(): CancelablePromise { + + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/server/information', + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getServerStatus(): CancelablePromise { + + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/server/status', + errors: { + 400: `Bad Request`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getServerTroubleshooting(): CancelablePromise { + + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/server/troubleshooting', + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + +} + +export class StaticFileResource { + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getItemStaticFile(data: StaticFileData['payloads']['GetItemStaticFile'] = {}): CancelablePromise { + const { + + path + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/item/static-file', + query: { + path + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getTreeStaticFileAncestors(data: StaticFileData['payloads']['GetTreeStaticFileAncestors'] = {}): CancelablePromise { + const { + + descendantPath + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/tree/static-file/ancestors', + query: { + descendantPath + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getTreeStaticFileChildren(data: StaticFileData['payloads']['GetTreeStaticFileChildren'] = {}): CancelablePromise { + const { + + parentPath, +skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/tree/static-file/children', + query: { + parentPath, skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getTreeStaticFileRoot(data: StaticFileData['payloads']['GetTreeStaticFileRoot'] = {}): CancelablePromise { + const { + + skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/tree/static-file/root', + query: { + skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + +} + +export class StylesheetResource { + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getItemStylesheet(data: StylesheetData['payloads']['GetItemStylesheet'] = {}): CancelablePromise { + const { + + path + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/item/stylesheet', + query: { + path + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns string Created + * @throws ApiError + */ + public static postStylesheet(data: StylesheetData['payloads']['PostStylesheet'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/stylesheet', + 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 unknown Success + * @throws ApiError + */ + public static getStylesheetByPath(data: StylesheetData['payloads']['GetStylesheetByPath']): CancelablePromise { + const { + + path + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/stylesheet/{path}', + path: { + path + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static deleteStylesheetByPath(data: StylesheetData['payloads']['DeleteStylesheetByPath']): CancelablePromise { + const { + + path + } = data; + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/stylesheet/{path}', + path: { + path + }, + responseHeader: 'Umb-Notifications', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static putStylesheetByPath(data: StylesheetData['payloads']['PutStylesheetByPath']): CancelablePromise { + const { + + path, +requestBody + } = data; + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/stylesheet/{path}', + path: { + path + }, + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Created + * @throws ApiError + */ + public static putStylesheetByPathRename(data: StylesheetData['payloads']['PutStylesheetByPathRename']): CancelablePromise { + const { + + path, +requestBody + } = data; + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/stylesheet/{path}/rename', + 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 string Created + * @throws ApiError + */ + public static postStylesheetFolder(data: StylesheetData['payloads']['PostStylesheetFolder'] = {}): CancelablePromise { + const { + + requestBody + } = data; + 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`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getStylesheetFolderByPath(data: StylesheetData['payloads']['GetStylesheetFolderByPath']): CancelablePromise { + const { + + path + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/stylesheet/folder/{path}', + path: { + path + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static deleteStylesheetFolderByPath(data: StylesheetData['payloads']['DeleteStylesheetFolderByPath']): CancelablePromise { + const { + + path + } = data; + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/stylesheet/folder/{path}', + path: { + path + }, + responseHeader: 'Umb-Notifications', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getTreeStylesheetAncestors(data: StylesheetData['payloads']['GetTreeStylesheetAncestors'] = {}): CancelablePromise { + const { + + descendantPath + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/tree/stylesheet/ancestors', + query: { + descendantPath + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getTreeStylesheetChildren(data: StylesheetData['payloads']['GetTreeStylesheetChildren'] = {}): CancelablePromise { + const { + + parentPath, +skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/tree/stylesheet/children', + query: { + parentPath, skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getTreeStylesheetRoot(data: StylesheetData['payloads']['GetTreeStylesheetRoot'] = {}): CancelablePromise { + const { + + skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/tree/stylesheet/root', + query: { + skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + +} + +export class TagResource { + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getTag(data: TagData['payloads']['GetTag'] = {}): CancelablePromise { + const { + + query, +tagGroup, +culture, +skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/tag', + query: { + query, tagGroup, culture, skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + +} + +export class TelemetryResource { + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getTelemetry(data: TelemetryData['payloads']['GetTelemetry'] = {}): CancelablePromise { + const { + + skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/telemetry', + query: { + skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getTelemetryLevel(): CancelablePromise { + + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/telemetry/level', + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static postTelemetryLevel(data: TelemetryData['payloads']['PostTelemetryLevel'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/telemetry/level', + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + +} + +export class TemplateResource { + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getItemTemplate(data: TemplateData['payloads']['GetItemTemplate'] = {}): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/item/template', + query: { + id + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getItemTemplateSearch(data: TemplateData['payloads']['GetItemTemplateSearch'] = {}): CancelablePromise { + const { + + query, +skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/item/template/search', + query: { + query, skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns string Created + * @throws ApiError + */ + public static postTemplate(data: TemplateData['payloads']['PostTemplate'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/template', + 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 unknown Success + * @throws ApiError + */ + public static getTemplateById(data: TemplateData['payloads']['GetTemplateById']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/template/{id}', + path: { + id + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static deleteTemplateById(data: TemplateData['payloads']['DeleteTemplateById']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/template/{id}', + path: { + id + }, + responseHeader: 'Umb-Notifications', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static putTemplateById(data: TemplateData['payloads']['PutTemplateById']): CancelablePromise { + const { + + id, +requestBody + } = data; + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/template/{id}', + path: { + id + }, + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns unknown 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 unknown Success + * @throws ApiError + */ + public static postTemplateQueryExecute(data: TemplateData['payloads']['PostTemplateQueryExecute'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/template/query/execute', + body: requestBody, + mediaType: 'application/json', + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getTemplateQuerySettings(): CancelablePromise { + + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/template/query/settings', + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getTreeTemplateAncestors(data: TemplateData['payloads']['GetTreeTemplateAncestors'] = {}): CancelablePromise { + const { + + descendantId + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/tree/template/ancestors', + query: { + descendantId + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getTreeTemplateChildren(data: TemplateData['payloads']['GetTreeTemplateChildren'] = {}): CancelablePromise { + const { + + parentId, +skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/tree/template/children', + query: { + parentId, skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getTreeTemplateRoot(data: TemplateData['payloads']['GetTreeTemplateRoot'] = {}): CancelablePromise { + const { + + skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/tree/template/root', + query: { + skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + +} + +export class TemporaryFileResource { + + /** + * @returns string Created + * @throws ApiError + */ + public static postTemporaryFile(data: TemporaryFileData['payloads']['PostTemporaryFile'] = {}): CancelablePromise { + const { + + formData + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/temporary-file', + formData: formData, + mediaType: 'multipart/form-data', + responseHeader: 'Umb-Generated-Resource', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getTemporaryFileById(data: TemporaryFileData['payloads']['GetTemporaryFileById']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/temporary-file/{id}', + path: { + id + }, + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static deleteTemporaryFileById(data: TemporaryFileData['payloads']['DeleteTemporaryFileById']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/temporary-file/{id}', + path: { + id + }, + responseHeader: 'Umb-Notifications', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getTemporaryFileConfiguration(): CancelablePromise { + + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/temporary-file/configuration', + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + +} + +export class UpgradeResource { + + /** + * @returns string Success + * @throws ApiError + */ + public static postUpgradeAuthorize(): CancelablePromise { + + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/upgrade/authorize', + responseHeader: 'Umb-Notifications', + errors: { + 401: `The resource is protected and requires an authentication token`, + 428: `Client Error`, + 500: `Server Error`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getUpgradeSettings(): CancelablePromise { + + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/upgrade/settings', + errors: { + 401: `The resource is protected and requires an authentication token`, + 428: `Client Error`, + }, + }); + } + +} + +export class UserDataResource { + + /** + * @returns string Created + * @throws ApiError + */ + public static postUserData(data: UserDataData['payloads']['PostUserData'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/user-data', + 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 string Success + * @throws ApiError + */ + public static putUserData(data: UserDataData['payloads']['PutUserData'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/user-data', + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getUserData(data: UserDataData['payloads']['GetUserData'] = {}): CancelablePromise { + const { + + groups, +identifiers, +skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/user-data', + query: { + groups, identifiers, skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getUserDataById(data: UserDataData['payloads']['GetUserDataById']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/user-data/{id}', + path: { + id + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + +} + +export class UserGroupResource { + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getItemUserGroup(data: UserGroupData['payloads']['GetItemUserGroup'] = {}): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/item/user-group', + query: { + id + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static deleteUserGroup(data: UserGroupData['payloads']['DeleteUserGroup'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/user-group', + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + 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 string Created + * @throws ApiError + */ + public static postUserGroup(data: UserGroupData['payloads']['PostUserGroup'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/user-group', + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Generated-Resource', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getUserGroup(data: UserGroupData['payloads']['GetUserGroup'] = {}): CancelablePromise { + const { + + skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/user-group', + query: { + skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getUserGroupById(data: UserGroupData['payloads']['GetUserGroupById']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/user-group/{id}', + path: { + 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 string Success + * @throws ApiError + */ + public static deleteUserGroupById(data: UserGroupData['payloads']['DeleteUserGroupById']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/user-group/{id}', + path: { + id + }, + responseHeader: 'Umb-Notifications', + 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 string Success + * @throws ApiError + */ + public static putUserGroupById(data: UserGroupData['payloads']['PutUserGroupById']): CancelablePromise { + const { + + id, +requestBody + } = data; + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/user-group/{id}', + path: { + id + }, + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static deleteUserGroupByIdUsers(data: UserGroupData['payloads']['DeleteUserGroupByIdUsers']): CancelablePromise { + const { + + id, +requestBody + } = data; + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/user-group/{id}/users', + path: { + id + }, + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + 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 string Success + * @throws ApiError + */ + public static postUserGroupByIdUsers(data: UserGroupData['payloads']['PostUserGroupByIdUsers']): CancelablePromise { + const { + + id, +requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/user-group/{id}/users', + path: { + id + }, + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + 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`, + }, + }); + } + +} + +export class UserResource { + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getFilterUser(data: UserData['payloads']['GetFilterUser'] = {}): CancelablePromise { + const { + + skip, +take, +orderBy, +orderDirection, +userGroupIds, +userStates, +filter + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/filter/user', + query: { + skip, take, orderBy, orderDirection, userGroupIds, userStates, filter + }, + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getItemUser(data: UserData['payloads']['GetItemUser'] = {}): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/item/user', + query: { + id + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns string Created + * @throws ApiError + */ + public static postUser(data: UserData['payloads']['PostUser'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/user', + 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 string Success + * @throws ApiError + */ + public static deleteUser(data: UserData['payloads']['DeleteUser'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/user', + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + 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 unknown Success + * @throws ApiError + */ + public static getUser(data: UserData['payloads']['GetUser'] = {}): CancelablePromise { + const { + + skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/user', + query: { + skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getUserById(data: UserData['payloads']['GetUserById']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/user/{id}', + path: { + 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 string Success + * @throws ApiError + */ + public static deleteUserById(data: UserData['payloads']['DeleteUserById']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/user/{id}', + path: { + id + }, + responseHeader: 'Umb-Notifications', + 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 string Success + * @throws ApiError + */ + public static putUserById(data: UserData['payloads']['PutUserById']): CancelablePromise { + const { + + id, +requestBody + } = data; + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/user/{id}', + path: { + id + }, + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + 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 unknown Success + * @throws ApiError + */ + public static getUserById2Fa(data: UserData['payloads']['GetUserById2Fa']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/user/{id}/2fa', + path: { + 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 string Success + * @throws ApiError + */ + public static deleteUserById2FaByProviderName(data: UserData['payloads']['DeleteUserById2FaByProviderName']): CancelablePromise { + const { + + id, +providerName + } = data; + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/user/{id}/2fa/{providerName}', + path: { + id, providerName + }, + responseHeader: 'Umb-Notifications', + 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 string Success + * @throws ApiError + */ + public static postUserByIdChangePassword(data: UserData['payloads']['PostUserByIdChangePassword']): CancelablePromise { + const { + + id, +requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/user/{id}/change-password', + path: { + id + }, + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + 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 unknown Success + * @throws ApiError + */ + public static postUserByIdResetPassword(data: UserData['payloads']['PostUserByIdResetPassword']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/user/{id}/reset-password', + path: { + 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 string Success + * @throws ApiError + */ + public static deleteUserAvatarById(data: UserData['payloads']['DeleteUserAvatarById']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/user/avatar/{id}', + path: { + id + }, + responseHeader: 'Umb-Notifications', + 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 string Success + * @throws ApiError + */ + public static postUserAvatarById(data: UserData['payloads']['PostUserAvatarById']): CancelablePromise { + const { + + id, +requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/user/avatar/{id}', + path: { + id + }, + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + 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 unknown 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 unknown Success + * @throws ApiError + */ + public static getUserCurrent(): CancelablePromise { + + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/user/current', + errors: { + 401: `The resource is protected and requires an authentication token`, + 403: `The authenticated user do not have access to this resource`, + }, + }); + } + + /** + * @returns unknown 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 string Success + * @throws ApiError + */ + public static deleteUserCurrent2FaByProviderName(data: UserData['payloads']['DeleteUserCurrent2FaByProviderName']): CancelablePromise { + const { + + providerName, +code + } = data; + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/user/current/2fa/{providerName}', + path: { + providerName + }, + query: { + code + }, + responseHeader: 'Umb-Notifications', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static postUserCurrent2FaByProviderName(data: UserData['payloads']['PostUserCurrent2FaByProviderName']): CancelablePromise { + const { + + providerName, +requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/user/current/2fa/{providerName}', + path: { + providerName + }, + body: requestBody, + mediaType: 'application/json', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getUserCurrent2FaByProviderName(data: UserData['payloads']['GetUserCurrent2FaByProviderName']): CancelablePromise { + const { + + providerName + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/user/current/2fa/{providerName}', + path: { + providerName + }, + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static postUserCurrentAvatar(data: UserData['payloads']['PostUserCurrentAvatar'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/user/current/avatar', + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + 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 string Success + * @throws ApiError + */ + public static postUserCurrentChangePassword(data: UserData['payloads']['PostUserCurrentChangePassword'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/user/current/change-password', + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown 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 unknown Success + * @throws ApiError + */ + public static getUserCurrentLogins(): CancelablePromise { + + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/user/current/logins', + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getUserCurrentPermissions(data: UserData['payloads']['GetUserCurrentPermissions'] = {}): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/user/current/permissions', + query: { + id + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getUserCurrentPermissionsDocument(data: UserData['payloads']['GetUserCurrentPermissionsDocument'] = {}): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/user/current/permissions/document', + query: { + id + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getUserCurrentPermissionsMedia(data: UserData['payloads']['GetUserCurrentPermissionsMedia'] = {}): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/user/current/permissions/media', + query: { + id + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static postUserDisable(data: UserData['payloads']['PostUserDisable'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/user/disable', + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + 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 string Success + * @throws ApiError + */ + public static postUserEnable(data: UserData['payloads']['PostUserEnable'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/user/enable', + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + 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 string Created + * @throws ApiError + */ + public static postUserInvite(data: UserData['payloads']['PostUserInvite'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/user/invite', + 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 string Success + * @throws ApiError + */ + public static postUserInviteCreatePassword(data: UserData['payloads']['PostUserInviteCreatePassword'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/user/invite/create-password', + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static postUserInviteResend(data: UserData['payloads']['PostUserInviteResend'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/user/invite/resend', + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static postUserInviteVerify(data: UserData['payloads']['PostUserInviteVerify'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/user/invite/verify', + body: requestBody, + mediaType: 'application/json', + errors: { + 400: `Bad Request`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static postUserSetUserGroups(data: UserData['payloads']['PostUserSetUserGroups'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/user/set-user-groups', + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + errors: { + 401: `The resource is protected and requires an authentication token`, + 403: `The authenticated user do not have access to this resource`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static postUserUnlock(data: UserData['payloads']['PostUserUnlock'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/user/unlock', + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + 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`, + }, + }); + } + +} + +export class WebhookResource { + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getWebhook(data: WebhookData['payloads']['GetWebhook'] = {}): CancelablePromise { + const { + + skip, +take + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/webhook', + query: { + skip, take + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + + /** + * @returns string Created + * @throws ApiError + */ + public static postWebhook(data: WebhookData['payloads']['PostWebhook'] = {}): CancelablePromise { + const { + + requestBody + } = data; + return __request(OpenAPI, { + method: 'POST', + url: '/umbraco/management/api/v1/webhook', + 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 unknown Success + * @throws ApiError + */ + public static getWebhookById(data: WebhookData['payloads']['GetWebhookById']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/webhook/{id}', + path: { + id + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static putWebhookById(data: WebhookData['payloads']['PutWebhookById']): CancelablePromise { + const { + + id, +requestBody + } = data; + return __request(OpenAPI, { + method: 'PUT', + url: '/umbraco/management/api/v1/webhook/{id}', + path: { + id + }, + body: requestBody, + mediaType: 'application/json', + responseHeader: 'Umb-Notifications', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns string Success + * @throws ApiError + */ + public static deleteWebhookById(data: WebhookData['payloads']['DeleteWebhookById']): CancelablePromise { + const { + + id + } = data; + return __request(OpenAPI, { + method: 'DELETE', + url: '/umbraco/management/api/v1/webhook/{id}', + path: { + id + }, + responseHeader: 'Umb-Notifications', + errors: { + 400: `Bad Request`, + 401: `The resource is protected and requires an authentication token`, + 404: `Not Found`, + }, + }); + } + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getWebhookItem(data: WebhookData['payloads']['GetWebhookItem'] = {}): CancelablePromise { + const { + + ids + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/webhook/item', + query: { + ids + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + }, + }); + } + +} \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/AuditLogResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/AuditLogResource.ts deleted file mode 100644 index 4b35f87f78..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/AuditLogResource.ts +++ /dev/null @@ -1,113 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -import type { AuditTypeModel } from '../models/AuditTypeModel'; -import type { DirectionModel } from '../models/DirectionModel'; -import type { PagedAuditLogResponseModel } from '../models/PagedAuditLogResponseModel'; -import type { PagedAuditLogWithUsernameResponseModel } from '../models/PagedAuditLogWithUsernameResponseModel'; - -import type { CancelablePromise } from '../core/CancelablePromise'; -import { OpenAPI } from '../core/OpenAPI'; -import { request as __request } from '../core/request'; - -export class AuditLogResource { - - /** - * @returns any Success - * @throws ApiError - */ - public static getAuditLog({ - orderDirection, - sinceDate, - skip, - take = 100, - }: { - orderDirection?: DirectionModel, - sinceDate?: string, - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/audit-log', - query: { - 'orderDirection': orderDirection, - 'sinceDate': sinceDate, - 'skip': skip, - 'take': take, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getAuditLogById({ - id, - orderDirection, - sinceDate, - skip, - take = 100, - }: { - id: string, - orderDirection?: DirectionModel, - sinceDate?: string, - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/audit-log/{id}', - path: { - 'id': id, - }, - query: { - 'orderDirection': orderDirection, - 'sinceDate': sinceDate, - 'skip': skip, - 'take': take, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getAuditLogTypeByLogType({ - logType, - sinceDate, - skip, - take = 100, - }: { - logType: AuditTypeModel, - sinceDate?: string, - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/audit-log/type/{logType}', - path: { - 'logType': logType, - }, - query: { - 'sinceDate': sinceDate, - 'skip': skip, - 'take': take, - }, - 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/CultureResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/CultureResource.ts deleted file mode 100644 index 534bc8d823..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/CultureResource.ts +++ /dev/null @@ -1,37 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -import type { PagedCultureReponseModel } from '../models/PagedCultureReponseModel'; - -import type { CancelablePromise } from '../core/CancelablePromise'; -import { OpenAPI } from '../core/OpenAPI'; -import { request as __request } from '../core/request'; - -export class CultureResource { - - /** - * @returns any Success - * @throws ApiError - */ - public static getCulture({ - skip, - take = 100, - }: { - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/culture', - query: { - 'skip': skip, - 'take': take, - }, - 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/DataTypeResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/DataTypeResource.ts deleted file mode 100644 index f34c3393dd..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/DataTypeResource.ts +++ /dev/null @@ -1,492 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -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'; -import type { DataTypeTreeItemResponseModel } from '../models/DataTypeTreeItemResponseModel'; -import type { FolderResponseModel } from '../models/FolderResponseModel'; -import type { MoveDataTypeRequestModel } from '../models/MoveDataTypeRequestModel'; -import type { PagedDataTypeItemResponseModel } from '../models/PagedDataTypeItemResponseModel'; -import type { PagedDataTypeTreeItemResponseModel } from '../models/PagedDataTypeTreeItemResponseModel'; -import type { PagedModelDataTypeItemResponseModel } from '../models/PagedModelDataTypeItemResponseModel'; -import type { UpdateDataTypeRequestModel } from '../models/UpdateDataTypeRequestModel'; -import type { UpdateFolderResponseModel } from '../models/UpdateFolderResponseModel'; - -import type { CancelablePromise } from '../core/CancelablePromise'; -import { OpenAPI } from '../core/OpenAPI'; -import { request as __request } from '../core/request'; - -export class DataTypeResource { - - /** - * @returns string Created - * @throws ApiError - */ - public static postDataType({ - requestBody, - }: { - requestBody?: CreateDataTypeRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/data-type', - 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 getDataTypeById({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/data-type/{id}', - path: { - 'id': id, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static deleteDataTypeById({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/data-type/{id}', - path: { - 'id': id, - }, - responseHeader: 'Umb-Notifications', - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static putDataTypeById({ - id, - requestBody, - }: { - id: string, - requestBody?: UpdateDataTypeRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/data-type/{id}', - path: { - 'id': id, - }, - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Created - * @throws ApiError - */ - public static postDataTypeByIdCopy({ - id, - requestBody, - }: { - id: string, - requestBody?: CopyDataTypeRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/data-type/{id}/copy', - path: { - 'id': id, - }, - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Generated-Resource', - errors: { - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns boolean Success - * @throws ApiError - */ - public static getDataTypeByIdIsUsed({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/data-type/{id}/is-used', - path: { - 'id': id, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static putDataTypeByIdMove({ - id, - requestBody, - }: { - id: string, - requestBody?: MoveDataTypeRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/data-type/{id}/move', - path: { - 'id': id, - }, - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - errors: { - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getDataTypeByIdReferences({ - id, - }: { - id: string, - }): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/data-type/{id}/references', - path: { - 'id': id, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @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 - */ - public static postDataTypeFolder({ - requestBody, - }: { - requestBody?: CreateFolderRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/data-type/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`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getDataTypeFolderById({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/data-type/folder/{id}', - path: { - 'id': id, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static deleteDataTypeFolderById({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/data-type/folder/{id}', - path: { - 'id': id, - }, - responseHeader: 'Umb-Notifications', - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static putDataTypeFolderById({ - id, - requestBody, - }: { - id: string, - requestBody?: UpdateFolderResponseModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/data-type/folder/{id}', - path: { - 'id': id, - }, - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getFilterDataType({ - skip, - take = 100, - name = '', - editorUiAlias, - editorAlias, - }: { - skip?: number, - take?: number, - name?: string, - editorUiAlias?: string, - editorAlias?: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/filter/data-type', - query: { - 'skip': skip, - 'take': take, - 'name': name, - 'editorUiAlias': editorUiAlias, - 'editorAlias': editorAlias, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getItemDataType({ - id, - }: { - id?: Array, - }): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/item/data-type', - query: { - 'id': id, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getItemDataTypeSearch({ - query, - skip, - take = 100, - }: { - query?: string, - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/item/data-type/search', - query: { - 'query': query, - 'skip': skip, - 'take': take, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getTreeDataTypeAncestors({ - descendantId, - }: { - descendantId?: string, - }): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tree/data-type/ancestors', - query: { - 'descendantId': descendantId, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getTreeDataTypeChildren({ - parentId, - skip, - take = 100, - foldersOnly = false, - }: { - parentId?: string, - skip?: number, - take?: number, - foldersOnly?: boolean, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tree/data-type/children', - query: { - 'parentId': parentId, - 'skip': skip, - 'take': take, - 'foldersOnly': foldersOnly, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getTreeDataTypeRoot({ - skip, - take = 100, - foldersOnly = false, - }: { - skip?: number, - take?: number, - foldersOnly?: boolean, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tree/data-type/root', - query: { - 'skip': skip, - 'take': take, - 'foldersOnly': foldersOnly, - }, - 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/DictionaryResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/DictionaryResource.ts deleted file mode 100644 index 265fb3e886..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/DictionaryResource.ts +++ /dev/null @@ -1,319 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -import type { CreateDictionaryItemRequestModel } from '../models/CreateDictionaryItemRequestModel'; -import type { DictionaryItemItemResponseModel } from '../models/DictionaryItemItemResponseModel'; -import type { DictionaryItemResponseModel } from '../models/DictionaryItemResponseModel'; -import type { ImportDictionaryRequestModel } from '../models/ImportDictionaryRequestModel'; -import type { MoveDictionaryRequestModel } from '../models/MoveDictionaryRequestModel'; -import type { NamedEntityTreeItemResponseModel } from '../models/NamedEntityTreeItemResponseModel'; -import type { PagedDictionaryOverviewResponseModel } from '../models/PagedDictionaryOverviewResponseModel'; -import type { PagedNamedEntityTreeItemResponseModel } from '../models/PagedNamedEntityTreeItemResponseModel'; -import type { UpdateDictionaryItemRequestModel } from '../models/UpdateDictionaryItemRequestModel'; - -import type { CancelablePromise } from '../core/CancelablePromise'; -import { OpenAPI } from '../core/OpenAPI'; -import { request as __request } from '../core/request'; - -export class DictionaryResource { - - /** - * @returns any Success - * @throws ApiError - */ - public static getDictionary({ - filter, - skip, - take = 100, - }: { - filter?: string, - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/dictionary', - query: { - 'filter': filter, - 'skip': skip, - 'take': take, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns string Created - * @throws ApiError - */ - public static postDictionary({ - requestBody, - }: { - requestBody?: CreateDictionaryItemRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/dictionary', - body: requestBody, - mediaType: 'application/json', - 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`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getDictionaryById({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/dictionary/{id}', - path: { - 'id': id, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static deleteDictionaryById({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/dictionary/{id}', - path: { - 'id': id, - }, - responseHeader: 'Umb-Notifications', - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static putDictionaryById({ - id, - requestBody, - }: { - id: string, - requestBody?: UpdateDictionaryItemRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/dictionary/{id}', - path: { - 'id': id, - }, - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - 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 - */ - public static getDictionaryByIdExport({ - id, - includeChildren = false, - }: { - id: string, - includeChildren?: boolean, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/dictionary/{id}/export', - path: { - 'id': id, - }, - query: { - 'includeChildren': includeChildren, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static putDictionaryByIdMove({ - id, - requestBody, - }: { - id: string, - requestBody?: MoveDictionaryRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/dictionary/{id}/move', - path: { - 'id': id, - }, - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Created - * @throws ApiError - */ - public static postDictionaryImport({ - requestBody, - }: { - requestBody?: ImportDictionaryRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/dictionary/import', - 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 getItemDictionary({ - id, - }: { - id?: Array, - }): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/item/dictionary', - query: { - 'id': id, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getTreeDictionaryAncestors({ - descendantId, - }: { - descendantId?: string, - }): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tree/dictionary/ancestors', - query: { - 'descendantId': descendantId, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getTreeDictionaryChildren({ - parentId, - skip, - take = 100, - }: { - parentId?: string, - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tree/dictionary/children', - query: { - 'parentId': parentId, - 'skip': skip, - 'take': take, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getTreeDictionaryRoot({ - skip, - take = 100, - }: { - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tree/dictionary/root', - query: { - 'skip': skip, - 'take': take, - }, - 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/DocumentBlueprintResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/DocumentBlueprintResource.ts deleted file mode 100644 index 50837fd587..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/DocumentBlueprintResource.ts +++ /dev/null @@ -1,344 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -import type { CreateDocumentBlueprintFromDocumentRequestModel } from '../models/CreateDocumentBlueprintFromDocumentRequestModel'; -import type { CreateDocumentBlueprintRequestModel } from '../models/CreateDocumentBlueprintRequestModel'; -import type { CreateFolderRequestModel } from '../models/CreateFolderRequestModel'; -import type { DocumentBlueprintItemResponseModel } from '../models/DocumentBlueprintItemResponseModel'; -import type { DocumentBlueprintResponseModel } from '../models/DocumentBlueprintResponseModel'; -import type { FolderResponseModel } from '../models/FolderResponseModel'; -import type { MoveDocumentBlueprintRequestModel } from '../models/MoveDocumentBlueprintRequestModel'; -import type { PagedDocumentBlueprintTreeItemResponseModel } from '../models/PagedDocumentBlueprintTreeItemResponseModel'; -import type { UpdateDocumentBlueprintRequestModel } from '../models/UpdateDocumentBlueprintRequestModel'; -import type { UpdateFolderResponseModel } from '../models/UpdateFolderResponseModel'; - -import type { CancelablePromise } from '../core/CancelablePromise'; -import { OpenAPI } from '../core/OpenAPI'; -import { request as __request } from '../core/request'; - -export class DocumentBlueprintResource { - - /** - * @returns string Created - * @throws ApiError - */ - public static postDocumentBlueprint({ - requestBody, - }: { - requestBody?: CreateDocumentBlueprintRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/document-blueprint', - 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 getDocumentBlueprintById({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/document-blueprint/{id}', - path: { - 'id': id, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static deleteDocumentBlueprintById({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/document-blueprint/{id}', - path: { - 'id': id, - }, - responseHeader: 'Umb-Notifications', - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static putDocumentBlueprintById({ - id, - requestBody, - }: { - id: string, - requestBody?: UpdateDocumentBlueprintRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/document-blueprint/{id}', - path: { - 'id': id, - }, - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static putDocumentBlueprintByIdMove({ - id, - requestBody, - }: { - id: string, - requestBody?: MoveDocumentBlueprintRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/document-blueprint/{id}/move', - path: { - 'id': id, - }, - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - errors: { - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Created - * @throws ApiError - */ - public static postDocumentBlueprintFolder({ - requestBody, - }: { - requestBody?: CreateFolderRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/document-blueprint/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`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getDocumentBlueprintFolderById({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/document-blueprint/folder/{id}', - path: { - 'id': id, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static deleteDocumentBlueprintFolderById({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/document-blueprint/folder/{id}', - path: { - 'id': id, - }, - responseHeader: 'Umb-Notifications', - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static putDocumentBlueprintFolderById({ - id, - requestBody, - }: { - id: string, - requestBody?: UpdateFolderResponseModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/document-blueprint/folder/{id}', - path: { - 'id': id, - }, - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Created - * @throws ApiError - */ - public static postDocumentBlueprintFromDocument({ - requestBody, - }: { - requestBody?: CreateDocumentBlueprintFromDocumentRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/document-blueprint/from-document', - body: requestBody, - mediaType: 'application/json', - 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`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getItemDocumentBlueprint({ - id, - }: { - id?: Array, - }): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/item/document-blueprint', - query: { - 'id': id, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getTreeDocumentBlueprintChildren({ - parentId, - skip, - take = 100, - foldersOnly = false, - }: { - parentId?: string, - skip?: number, - take?: number, - foldersOnly?: boolean, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tree/document-blueprint/children', - query: { - 'parentId': parentId, - 'skip': skip, - 'take': take, - 'foldersOnly': foldersOnly, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getTreeDocumentBlueprintRoot({ - skip, - take = 100, - foldersOnly = false, - }: { - skip?: number, - take?: number, - foldersOnly?: boolean, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tree/document-blueprint/root', - query: { - 'skip': skip, - 'take': take, - 'foldersOnly': foldersOnly, - }, - 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/DocumentResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/DocumentResource.ts deleted file mode 100644 index 361f0bf34b..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/DocumentResource.ts +++ /dev/null @@ -1,1005 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -import type { CopyDocumentRequestModel } from '../models/CopyDocumentRequestModel'; -import type { CreateDocumentRequestModel } from '../models/CreateDocumentRequestModel'; -import type { DirectionModel } from '../models/DirectionModel'; -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 { DocumentTreeItemResponseModel } from '../models/DocumentTreeItemResponseModel'; -import type { DomainsResponseModel } from '../models/DomainsResponseModel'; -import type { MoveDocumentRequestModel } from '../models/MoveDocumentRequestModel'; -import type { MoveMediaRequestModel } from '../models/MoveMediaRequestModel'; -import type { PagedDocumentCollectionResponseModel } from '../models/PagedDocumentCollectionResponseModel'; -import type { PagedDocumentRecycleBinItemResponseModel } from '../models/PagedDocumentRecycleBinItemResponseModel'; -import type { PagedDocumentTreeItemResponseModel } from '../models/PagedDocumentTreeItemResponseModel'; -import type { PagedIReferenceResponseModel } from '../models/PagedIReferenceResponseModel'; -import type { PagedModelDocumentItemResponseModel } from '../models/PagedModelDocumentItemResponseModel'; -import type { PagedReferenceByIdModel } from '../models/PagedReferenceByIdModel'; -import type { PublicAccessRequestModel } from '../models/PublicAccessRequestModel'; -import type { PublishDocumentRequestModel } from '../models/PublishDocumentRequestModel'; -import type { PublishDocumentWithDescendantsRequestModel } from '../models/PublishDocumentWithDescendantsRequestModel'; -import type { ReferenceByIdModel } from '../models/ReferenceByIdModel'; -import type { SortingRequestModel } from '../models/SortingRequestModel'; -import type { UnpublishDocumentRequestModel } from '../models/UnpublishDocumentRequestModel'; -import type { UpdateDocumentNotificationsRequestModel } from '../models/UpdateDocumentNotificationsRequestModel'; -import type { UpdateDocumentRequestModel } from '../models/UpdateDocumentRequestModel'; -import type { UpdateDomainsRequestModel } from '../models/UpdateDomainsRequestModel'; - -import type { CancelablePromise } from '../core/CancelablePromise'; -import { OpenAPI } from '../core/OpenAPI'; -import { request as __request } from '../core/request'; - -export class DocumentResource { - - /** - * @returns any Success - * @throws ApiError - */ - public static getCollectionDocumentById({ - id, - dataTypeId, - orderBy = 'updateDate', - orderCulture, - orderDirection, - filter, - skip, - take = 100, - }: { - id: string, - dataTypeId?: string, - orderBy?: string, - orderCulture?: string, - orderDirection?: DirectionModel, - filter?: string, - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/collection/document/{id}', - path: { - 'id': id, - }, - query: { - 'dataTypeId': dataTypeId, - 'orderBy': orderBy, - 'orderCulture': orderCulture, - 'orderDirection': orderDirection, - 'filter': filter, - 'skip': skip, - 'take': take, - }, - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Created - * @throws ApiError - */ - public static postDocument({ - requestBody, - }: { - requestBody?: CreateDocumentRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/document', - body: requestBody, - mediaType: 'application/json', - 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`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getDocumentById({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/document/{id}', - 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 string 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, - }, - responseHeader: 'Umb-Notifications', - 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 string Success - * @throws ApiError - */ - public static putDocumentById({ - id, - requestBody, - }: { - id: string, - requestBody?: UpdateDocumentRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/document/{id}', - path: { - 'id': id, - }, - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - 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 string Created - * @throws ApiError - */ - public static postDocumentByIdCopy({ - id, - requestBody, - }: { - id: string, - requestBody?: CopyDocumentRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/document/{id}/copy', - path: { - 'id': id, - }, - body: requestBody, - mediaType: 'application/json', - 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`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getDocumentByIdDomains({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/document/{id}/domains', - path: { - 'id': id, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static putDocumentByIdDomains({ - id, - requestBody, - }: { - id: string, - requestBody?: UpdateDomainsRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/document/{id}/domains', - path: { - 'id': id, - }, - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - 409: `Conflict`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static putDocumentByIdMove({ - id, - requestBody, - }: { - id: string, - requestBody?: MoveDocumentRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/document/{id}/move', - path: { - 'id': id, - }, - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - 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 string Success - * @throws ApiError - */ - public static putDocumentByIdMoveToRecycleBin({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/document/{id}/move-to-recycle-bin', - path: { - 'id': id, - }, - responseHeader: 'Umb-Notifications', - 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 - */ - public static getDocumentByIdNotifications({ - id, - }: { - id: string, - }): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/document/{id}/notifications', - 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 string Success - * @throws ApiError - */ - public static putDocumentByIdNotifications({ - id, - requestBody, - }: { - id: string, - requestBody?: UpdateDocumentNotificationsRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/document/{id}/notifications', - path: { - 'id': id, - }, - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - errors: { - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Created - * @throws ApiError - */ - public static postDocumentByIdPublicAccess({ - id, - requestBody, - }: { - id: string, - requestBody?: PublicAccessRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/document/{id}/public-access', - path: { - 'id': id, - }, - body: requestBody, - mediaType: 'application/json', - 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`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static deleteDocumentByIdPublicAccess({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/document/{id}/public-access', - path: { - 'id': id, - }, - responseHeader: 'Umb-Notifications', - 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 void - * @throws ApiError - */ - public static getDocumentByIdPublicAccess({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/document/{id}/public-access', - 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 string Success - * @throws ApiError - */ - public static putDocumentByIdPublicAccess({ - id, - requestBody, - }: { - id: string, - requestBody?: PublicAccessRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/document/{id}/public-access', - path: { - 'id': id, - }, - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - 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 string Success - * @throws ApiError - */ - public static putDocumentByIdPublish({ - id, - requestBody, - }: { - id: string, - requestBody?: PublishDocumentRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/document/{id}/publish', - path: { - 'id': id, - }, - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - 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 string Success - * @throws ApiError - */ - public static putDocumentByIdPublishWithDescendants({ - id, - requestBody, - }: { - id: string, - requestBody?: PublishDocumentWithDescendantsRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/document/{id}/publish-with-descendants', - path: { - 'id': id, - }, - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - 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 - */ - public static getDocumentByIdReferencedBy({ - id, - skip, - take = 20, - }: { - id: string, - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/document/{id}/referenced-by', - path: { - 'id': id, - }, - query: { - 'skip': skip, - 'take': take, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getDocumentByIdReferencedDescendants({ - id, - skip, - take = 20, - }: { - id: string, - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/document/{id}/referenced-descendants', - path: { - 'id': id, - }, - query: { - 'skip': skip, - 'take': take, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static putDocumentByIdUnpublish({ - id, - requestBody, - }: { - id: string, - requestBody?: UnpublishDocumentRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/document/{id}/unpublish', - path: { - 'id': id, - }, - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - 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 string Success - * @throws ApiError - */ - public static putDocumentByIdValidate({ - id, - requestBody, - }: { - id: string, - requestBody?: UpdateDocumentRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/document/{id}/validate', - path: { - 'id': id, - }, - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - 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 - */ - public static getDocumentAreReferenced({ - id, - skip, - take = 20, - }: { - id?: Array, - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/document/are-referenced', - query: { - 'id': id, - 'skip': skip, - 'take': take, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getDocumentConfiguration(): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/document/configuration', - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static putDocumentSort({ - requestBody, - }: { - requestBody?: SortingRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/document/sort', - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - 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 string Success - * @throws ApiError - */ - public static postDocumentValidate({ - requestBody, - }: { - requestBody?: CreateDocumentRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/document/validate', - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - 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 - */ - public static getItemDocument({ - id, - }: { - id?: Array, - }): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/item/document', - query: { - 'id': id, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getItemDocumentSearch({ - query, - skip, - take = 100, - }: { - query?: string, - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/item/document/search', - query: { - 'query': query, - 'skip': skip, - 'take': take, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static deleteRecycleBinDocument(): CancelablePromise { - return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/recycle-bin/document', - responseHeader: 'Umb-Notifications', - 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 string 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, - }, - responseHeader: 'Umb-Notifications', - 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 - */ - public static getRecycleBinDocumentByIdOriginalParent({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/recycle-bin/document/{id}/original-parent', - 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 string Success - * @throws ApiError - */ - public static putRecycleBinDocumentByIdRestore({ - id, - requestBody, - }: { - id: string, - requestBody?: MoveMediaRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/recycle-bin/document/{id}/restore', - path: { - 'id': id, - }, - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - 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 - */ - public static getRecycleBinDocumentChildren({ - parentId, - skip, - take = 100, - }: { - parentId?: string, - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/recycle-bin/document/children', - query: { - 'parentId': parentId, - 'skip': skip, - 'take': take, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getRecycleBinDocumentRoot({ - skip, - take = 100, - }: { - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/recycle-bin/document/root', - query: { - 'skip': skip, - 'take': take, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getTreeDocumentAncestors({ - descendantId, - }: { - descendantId?: string, - }): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tree/document/ancestors', - query: { - 'descendantId': descendantId, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getTreeDocumentChildren({ - parentId, - skip, - take = 100, - dataTypeId, - }: { - parentId?: string, - skip?: number, - take?: number, - dataTypeId?: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tree/document/children', - query: { - 'parentId': parentId, - 'skip': skip, - 'take': take, - 'dataTypeId': dataTypeId, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getTreeDocumentRoot({ - skip, - take = 100, - dataTypeId, - }: { - skip?: number, - take?: number, - dataTypeId?: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tree/document/root', - query: { - 'skip': skip, - 'take': take, - 'dataTypeId': dataTypeId, - }, - 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 deleted file mode 100644 index a8ddaf5e7b..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/DocumentTypeResource.ts +++ /dev/null @@ -1,515 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* 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 { DocumentTypeTreeItemResponseModel } from '../models/DocumentTypeTreeItemResponseModel'; -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 { PagedModelDocumentTypeItemResponseModel } from '../models/PagedModelDocumentTypeItemResponseModel'; -import type { UpdateDocumentTypeRequestModel } from '../models/UpdateDocumentTypeRequestModel'; -import type { UpdateFolderResponseModel } from '../models/UpdateFolderResponseModel'; - -import type { CancelablePromise } from '../core/CancelablePromise'; -import { OpenAPI } from '../core/OpenAPI'; -import { request as __request } from '../core/request'; - -export class DocumentTypeResource { - - /** - * @returns string Created - * @throws ApiError - */ - public static postDocumentType({ - requestBody, - }: { - requestBody?: CreateDocumentTypeRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/document-type', - 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 getDocumentTypeById({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/document-type/{id}', - path: { - 'id': id, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static deleteDocumentTypeById({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/document-type/{id}', - path: { - 'id': id, - }, - responseHeader: 'Umb-Notifications', - errors: { - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static putDocumentTypeById({ - id, - requestBody, - }: { - id: string, - requestBody?: UpdateDocumentTypeRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/document-type/{id}', - path: { - 'id': id, - }, - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns any 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 string 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', - responseHeader: 'Umb-Notifications', - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns any 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 - */ - public static postDocumentTypeFolder({ - requestBody, - }: { - requestBody?: CreateFolderRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/document-type/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`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getDocumentTypeFolderById({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/document-type/folder/{id}', - path: { - 'id': id, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static deleteDocumentTypeFolderById({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/document-type/folder/{id}', - path: { - 'id': id, - }, - responseHeader: 'Umb-Notifications', - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static putDocumentTypeFolderById({ - id, - requestBody, - }: { - id: string, - requestBody?: UpdateFolderResponseModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/document-type/folder/{id}', - path: { - 'id': id, - }, - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getItemDocumentType({ - id, - }: { - id?: Array, - }): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/item/document-type', - query: { - 'id': id, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getItemDocumentTypeSearch({ - query, - skip, - take = 100, - }: { - query?: string, - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/item/document-type/search', - query: { - 'query': query, - 'skip': skip, - 'take': take, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getTreeDocumentTypeAncestors({ - descendantId, - }: { - descendantId?: string, - }): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tree/document-type/ancestors', - query: { - 'descendantId': descendantId, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getTreeDocumentTypeChildren({ - parentId, - skip, - take = 100, - foldersOnly = false, - }: { - parentId?: string, - skip?: number, - take?: number, - foldersOnly?: boolean, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tree/document-type/children', - query: { - 'parentId': parentId, - 'skip': skip, - 'take': take, - 'foldersOnly': foldersOnly, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getTreeDocumentTypeRoot({ - skip, - take = 100, - foldersOnly = false, - }: { - skip?: number, - take?: number, - foldersOnly?: boolean, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tree/document-type/root', - query: { - 'skip': skip, - 'take': take, - 'foldersOnly': foldersOnly, - }, - 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/DocumentVersionResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/DocumentVersionResource.ts deleted file mode 100644 index ac1c69b4bd..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/DocumentVersionResource.ts +++ /dev/null @@ -1,127 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -import type { DocumentVersionResponseModel } from '../models/DocumentVersionResponseModel'; -import type { PagedDocumentVersionItemResponseModel } from '../models/PagedDocumentVersionItemResponseModel'; - -import type { CancelablePromise } from '../core/CancelablePromise'; -import { OpenAPI } from '../core/OpenAPI'; -import { request as __request } from '../core/request'; - -export class DocumentVersionResource { - - /** - * @returns any Success - * @throws ApiError - */ - public static getDocumentVersion({ - documentId, - culture, - skip, - take = 100, - }: { - documentId: string, - culture?: string, - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/document-version', - query: { - 'documentId': documentId, - 'culture': culture, - 'skip': skip, - 'take': take, - }, - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getDocumentVersionById({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/document-version/{id}', - path: { - 'id': id, - }, - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static putDocumentVersionByIdPreventCleanup({ - id, - preventCleanup, - }: { - id: string, - preventCleanup?: boolean, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/document-version/{id}/prevent-cleanup', - path: { - 'id': id, - }, - query: { - 'preventCleanup': preventCleanup, - }, - responseHeader: 'Umb-Notifications', - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static postDocumentVersionByIdRollback({ - id, - culture, - }: { - id: string, - culture?: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/document-version/{id}/rollback', - path: { - 'id': id, - }, - query: { - 'culture': culture, - }, - responseHeader: 'Umb-Notifications', - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - -} 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 deleted file mode 100644 index 8b91f9bf26..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/DynamicRootResource.ts +++ /dev/null @@ -1,48 +0,0 @@ -/* 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/HealthCheckResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/HealthCheckResource.ts deleted file mode 100644 index c6f725d3a6..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/HealthCheckResource.ts +++ /dev/null @@ -1,106 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -import type { HealthCheckActionRequestModel } from '../models/HealthCheckActionRequestModel'; -import type { HealthCheckGroupPresentationModel } from '../models/HealthCheckGroupPresentationModel'; -import type { HealthCheckGroupWithResultResponseModel } from '../models/HealthCheckGroupWithResultResponseModel'; -import type { HealthCheckResultResponseModel } from '../models/HealthCheckResultResponseModel'; -import type { PagedHealthCheckGroupResponseModel } from '../models/PagedHealthCheckGroupResponseModel'; - -import type { CancelablePromise } from '../core/CancelablePromise'; -import { OpenAPI } from '../core/OpenAPI'; -import { request as __request } from '../core/request'; - -export class HealthCheckResource { - - /** - * @returns any Success - * @throws ApiError - */ - public static getHealthCheckGroup({ - skip, - take = 100, - }: { - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/health-check-group', - query: { - 'skip': skip, - 'take': take, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getHealthCheckGroupByName({ - name, - }: { - name: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/health-check-group/{name}', - path: { - 'name': name, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static postHealthCheckGroupByNameCheck({ - name, - }: { - name: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/health-check-group/{name}/check', - path: { - 'name': name, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static postHealthCheckExecuteAction({ - requestBody, - }: { - requestBody?: HealthCheckActionRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/health-check/execute-action', - body: requestBody, - mediaType: 'application/json', - 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/HelpResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/HelpResource.ts deleted file mode 100644 index a0e655e7af..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/HelpResource.ts +++ /dev/null @@ -1,47 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -import type { PagedHelpPageResponseModel } from '../models/PagedHelpPageResponseModel'; - -import type { CancelablePromise } from '../core/CancelablePromise'; -import { OpenAPI } from '../core/OpenAPI'; -import { request as __request } from '../core/request'; - -export class HelpResource { - - /** - * @returns any Success - * @throws ApiError - */ - public static getHelp({ - section, - tree, - skip, - take = 100, - baseUrl = 'https://our.umbraco.com', - }: { - section?: string, - tree?: string, - skip?: number, - take?: number, - baseUrl?: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/help', - query: { - 'section': section, - 'tree': tree, - 'skip': skip, - 'take': take, - 'baseUrl': baseUrl, - }, - 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/IndexerResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/IndexerResource.ts deleted file mode 100644 index 98f9a8b49b..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/IndexerResource.ts +++ /dev/null @@ -1,85 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -import type { IndexResponseModel } from '../models/IndexResponseModel'; -import type { PagedIndexResponseModel } from '../models/PagedIndexResponseModel'; - -import type { CancelablePromise } from '../core/CancelablePromise'; -import { OpenAPI } from '../core/OpenAPI'; -import { request as __request } from '../core/request'; - -export class IndexerResource { - - /** - * @returns any Success - * @throws ApiError - */ - public static getIndexer({ - skip, - take = 100, - }: { - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/indexer', - query: { - 'skip': skip, - 'take': take, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getIndexerByIndexName({ - indexName, - }: { - indexName: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/indexer/{indexName}', - path: { - 'indexName': indexName, - }, - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static postIndexerByIndexNameRebuild({ - indexName, - }: { - indexName: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/indexer/{indexName}/rebuild', - path: { - 'indexName': indexName, - }, - responseHeader: 'Umb-Notifications', - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - 409: `Conflict`, - }, - }); - } - -} diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/InstallResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/InstallResource.ts deleted file mode 100644 index cb350886f7..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/InstallResource.ts +++ /dev/null @@ -1,71 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -import type { DatabaseInstallRequestModel } from '../models/DatabaseInstallRequestModel'; -import type { InstallRequestModel } from '../models/InstallRequestModel'; -import type { InstallSettingsResponseModel } from '../models/InstallSettingsResponseModel'; - -import type { CancelablePromise } from '../core/CancelablePromise'; -import { OpenAPI } from '../core/OpenAPI'; -import { request as __request } from '../core/request'; - -export class InstallResource { - - /** - * @returns any Success - * @throws ApiError - */ - public static getInstallSettings(): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/install/settings', - errors: { - 428: `Client Error`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static postInstallSetup({ - requestBody, - }: { - requestBody?: InstallRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/install/setup', - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - errors: { - 428: `Client Error`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static postInstallValidateDatabase({ - requestBody, - }: { - requestBody?: DatabaseInstallRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/install/validate-database', - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - errors: { - 400: `Bad Request`, - }, - }); - } - -} 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 deleted file mode 100644 index 2226026620..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/LanguageResource.ts +++ /dev/null @@ -1,159 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -import type { CreateLanguageRequestModel } from '../models/CreateLanguageRequestModel'; -import type { LanguageItemResponseModel } from '../models/LanguageItemResponseModel'; -import type { LanguageResponseModel } from '../models/LanguageResponseModel'; -import type { PagedLanguageResponseModel } from '../models/PagedLanguageResponseModel'; -import type { UpdateLanguageRequestModel } from '../models/UpdateLanguageRequestModel'; - -import type { CancelablePromise } from '../core/CancelablePromise'; -import { OpenAPI } from '../core/OpenAPI'; -import { request as __request } from '../core/request'; - -export class LanguageResource { - - /** - * @returns any Success - * @throws ApiError - */ - public static getItemLanguage({ - isoCode, - }: { - isoCode?: Array, - }): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/item/language', - query: { - 'isoCode': isoCode, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getLanguage({ - skip, - take = 100, - }: { - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/language', - query: { - 'skip': skip, - 'take': take, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns string Created - * @throws ApiError - */ - public static postLanguage({ - requestBody, - }: { - requestBody?: CreateLanguageRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/language', - 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 getLanguageByIsoCode({ - isoCode, - }: { - isoCode: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/language/{isoCode}', - path: { - 'isoCode': isoCode, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static deleteLanguageByIsoCode({ - isoCode, - }: { - isoCode: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/language/{isoCode}', - path: { - 'isoCode': isoCode, - }, - responseHeader: 'Umb-Notifications', - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static putLanguageByIsoCode({ - isoCode, - requestBody, - }: { - isoCode: string, - requestBody?: UpdateLanguageRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/language/{isoCode}', - path: { - 'isoCode': isoCode, - }, - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - -} 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 deleted file mode 100644 index b7b40ca217..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/LogViewerResource.ts +++ /dev/null @@ -1,256 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -import type { DirectionModel } from '../models/DirectionModel'; -import type { LogLevelCountsReponseModel } from '../models/LogLevelCountsReponseModel'; -import type { LogLevelModel } from '../models/LogLevelModel'; -import type { PagedLoggerResponseModel } from '../models/PagedLoggerResponseModel'; -import type { PagedLogMessageResponseModel } from '../models/PagedLogMessageResponseModel'; -import type { PagedLogTemplateResponseModel } from '../models/PagedLogTemplateResponseModel'; -import type { PagedSavedLogSearchResponseModel } from '../models/PagedSavedLogSearchResponseModel'; -import type { SavedLogSearchRequestModel } from '../models/SavedLogSearchRequestModel'; -import type { SavedLogSearchResponseModel } from '../models/SavedLogSearchResponseModel'; - -import type { CancelablePromise } from '../core/CancelablePromise'; -import { OpenAPI } from '../core/OpenAPI'; -import { request as __request } from '../core/request'; - -export class LogViewerResource { - - /** - * @returns any Success - * @throws ApiError - */ - public static getLogViewerLevel({ - skip, - take = 100, - }: { - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/log-viewer/level', - query: { - 'skip': skip, - 'take': take, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getLogViewerLevelCount({ - startDate, - endDate, - }: { - startDate?: string, - endDate?: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/log-viewer/level-count', - query: { - 'startDate': startDate, - 'endDate': endDate, - }, - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getLogViewerLog({ - skip, - take = 100, - orderDirection, - filterExpression, - logLevel, - startDate, - endDate, - }: { - skip?: number, - take?: number, - orderDirection?: DirectionModel, - filterExpression?: string, - logLevel?: Array, - startDate?: string, - endDate?: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/log-viewer/log', - query: { - 'skip': skip, - 'take': take, - 'orderDirection': orderDirection, - 'filterExpression': filterExpression, - 'logLevel': logLevel, - 'startDate': startDate, - 'endDate': endDate, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getLogViewerMessageTemplate({ - skip, - take = 100, - startDate, - endDate, - }: { - skip?: number, - take?: number, - startDate?: string, - endDate?: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/log-viewer/message-template', - query: { - 'skip': skip, - 'take': take, - 'startDate': startDate, - 'endDate': endDate, - }, - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getLogViewerSavedSearch({ - skip, - take = 100, - }: { - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/log-viewer/saved-search', - query: { - 'skip': skip, - 'take': take, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns string Created - * @throws ApiError - */ - public static postLogViewerSavedSearch({ - requestBody, - }: { - requestBody?: SavedLogSearchRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/log-viewer/saved-search', - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Generated-Resource', - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getLogViewerSavedSearchByName({ - name, - }: { - name: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/log-viewer/saved-search/{name}', - path: { - 'name': name, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static deleteLogViewerSavedSearchByName({ - name, - }: { - name: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/log-viewer/saved-search/{name}', - path: { - 'name': name, - }, - responseHeader: 'Umb-Notifications', - errors: { - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getLogViewerValidateLogsSize({ - startDate, - endDate, - }: { - startDate?: string, - endDate?: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/log-viewer/validate-logs-size', - query: { - 'startDate': startDate, - 'endDate': endDate, - }, - 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/ManifestResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/ManifestResource.ts deleted file mode 100644 index a206603b17..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/ManifestResource.ts +++ /dev/null @@ -1,52 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -import type { ManifestResponseModel } from '../models/ManifestResponseModel'; - -import type { CancelablePromise } from '../core/CancelablePromise'; -import { OpenAPI } from '../core/OpenAPI'; -import { request as __request } from '../core/request'; - -export class ManifestResource { - - /** - * @returns any Success - * @throws ApiError - */ - public static getManifestManifest(): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/manifest/manifest', - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getManifestManifestPrivate(): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/manifest/manifest/private', - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getManifestManifestPublic(): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/manifest/manifest/public', - }); - } - -} 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 deleted file mode 100644 index 13e488d10b..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/MediaResource.ts +++ /dev/null @@ -1,671 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -import type { CreateMediaRequestModel } from '../models/CreateMediaRequestModel'; -import type { DirectionModel } from '../models/DirectionModel'; -import type { MediaConfigurationResponseModel } from '../models/MediaConfigurationResponseModel'; -import type { MediaItemResponseModel } from '../models/MediaItemResponseModel'; -import type { MediaResponseModel } from '../models/MediaResponseModel'; -import type { MediaTreeItemResponseModel } from '../models/MediaTreeItemResponseModel'; -import type { MoveMediaRequestModel } from '../models/MoveMediaRequestModel'; -import type { PagedIReferenceResponseModel } from '../models/PagedIReferenceResponseModel'; -import type { PagedMediaCollectionResponseModel } from '../models/PagedMediaCollectionResponseModel'; -import type { PagedMediaRecycleBinItemResponseModel } from '../models/PagedMediaRecycleBinItemResponseModel'; -import type { PagedMediaTreeItemResponseModel } from '../models/PagedMediaTreeItemResponseModel'; -import type { PagedModelMediaItemResponseModel } from '../models/PagedModelMediaItemResponseModel'; -import type { PagedReferenceByIdModel } from '../models/PagedReferenceByIdModel'; -import type { ReferenceByIdModel } from '../models/ReferenceByIdModel'; -import type { SortingRequestModel } from '../models/SortingRequestModel'; -import type { UpdateMediaRequestModel } from '../models/UpdateMediaRequestModel'; - -import type { CancelablePromise } from '../core/CancelablePromise'; -import { OpenAPI } from '../core/OpenAPI'; -import { request as __request } from '../core/request'; - -export class MediaResource { - - /** - * @returns any Success - * @throws ApiError - */ - public static getCollectionMedia({ - id, - dataTypeId, - orderBy = 'updateDate', - orderDirection, - filter, - skip, - take = 100, - }: { - id?: string, - dataTypeId?: string, - orderBy?: string, - orderDirection?: DirectionModel, - filter?: string, - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/collection/media', - query: { - 'id': id, - 'dataTypeId': dataTypeId, - 'orderBy': orderBy, - 'orderDirection': orderDirection, - 'filter': filter, - 'skip': skip, - 'take': take, - }, - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getItemMedia({ - id, - }: { - id?: Array, - }): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/item/media', - query: { - 'id': id, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getItemMediaSearch({ - query, - skip, - take = 100, - }: { - query?: string, - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/item/media/search', - query: { - 'query': query, - 'skip': skip, - 'take': take, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns string Created - * @throws ApiError - */ - public static postMedia({ - requestBody, - }: { - requestBody?: CreateMediaRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/media', - body: requestBody, - mediaType: 'application/json', - 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`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getMediaById({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/media/{id}', - 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 string Success - * @throws ApiError - */ - public static deleteMediaById({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/media/{id}', - path: { - 'id': id, - }, - responseHeader: 'Umb-Notifications', - 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 string Success - * @throws ApiError - */ - public static putMediaById({ - id, - requestBody, - }: { - id: string, - requestBody?: UpdateMediaRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/media/{id}', - path: { - 'id': id, - }, - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - 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 string Success - * @throws ApiError - */ - public static putMediaByIdMove({ - id, - requestBody, - }: { - id: string, - requestBody?: MoveMediaRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/media/{id}/move', - path: { - 'id': id, - }, - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - 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 string Success - * @throws ApiError - */ - public static putMediaByIdMoveToRecycleBin({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/media/{id}/move-to-recycle-bin', - path: { - 'id': id, - }, - responseHeader: 'Umb-Notifications', - 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 - */ - public static getMediaByIdReferencedBy({ - id, - skip, - take = 20, - }: { - id: string, - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/media/{id}/referenced-by', - path: { - 'id': id, - }, - query: { - 'skip': skip, - 'take': take, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getMediaByIdReferencedDescendants({ - id, - skip, - take = 20, - }: { - id: string, - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/media/{id}/referenced-descendants', - path: { - 'id': id, - }, - query: { - 'skip': skip, - 'take': take, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static putMediaByIdValidate({ - id, - requestBody, - }: { - id: string, - requestBody?: UpdateMediaRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/media/{id}/validate', - path: { - 'id': id, - }, - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - 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 - */ - public static getMediaAreReferenced({ - id, - skip, - take = 20, - }: { - id?: Array, - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/media/are-referenced', - query: { - 'id': id, - 'skip': skip, - 'take': take, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @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 string Success - * @throws ApiError - */ - public static putMediaSort({ - requestBody, - }: { - requestBody?: SortingRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/media/sort', - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - 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 string Success - * @throws ApiError - */ - public static postMediaValidate({ - requestBody, - }: { - requestBody?: CreateMediaRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/media/validate', - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - 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 string Success - * @throws ApiError - */ - public static deleteRecycleBinMedia(): CancelablePromise { - return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/recycle-bin/media', - responseHeader: 'Umb-Notifications', - 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 string Success - * @throws ApiError - */ - public static deleteRecycleBinMediaById({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/recycle-bin/media/{id}', - path: { - 'id': id, - }, - responseHeader: 'Umb-Notifications', - 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 - */ - public static getRecycleBinMediaByIdOriginalParent({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/recycle-bin/media/{id}/original-parent', - 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 string Success - * @throws ApiError - */ - public static putRecycleBinMediaByIdRestore({ - id, - requestBody, - }: { - id: string, - requestBody?: MoveMediaRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/recycle-bin/media/{id}/restore', - path: { - 'id': id, - }, - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - 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 - */ - public static getRecycleBinMediaChildren({ - parentId, - skip, - take = 100, - }: { - parentId?: string, - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/recycle-bin/media/children', - query: { - 'parentId': parentId, - 'skip': skip, - 'take': take, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getRecycleBinMediaRoot({ - skip, - take = 100, - }: { - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/recycle-bin/media/root', - query: { - 'skip': skip, - 'take': take, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getTreeMediaAncestors({ - descendantId, - }: { - descendantId?: string, - }): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tree/media/ancestors', - query: { - 'descendantId': descendantId, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getTreeMediaChildren({ - parentId, - skip, - take = 100, - dataTypeId, - }: { - parentId?: string, - skip?: number, - take?: number, - dataTypeId?: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tree/media/children', - query: { - 'parentId': parentId, - 'skip': skip, - 'take': take, - 'dataTypeId': dataTypeId, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getTreeMediaRoot({ - skip, - take = 100, - dataTypeId, - }: { - skip?: number, - take?: number, - dataTypeId?: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tree/media/root', - query: { - 'skip': skip, - 'take': take, - 'dataTypeId': dataTypeId, - }, - 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/MediaTypeResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/MediaTypeResource.ts deleted file mode 100644 index 3f6d2410eb..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/MediaTypeResource.ts +++ /dev/null @@ -1,500 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* 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 { MediaTypeTreeItemResponseModel } from '../models/MediaTypeTreeItemResponseModel'; -import type { MoveMediaTypeRequestModel } from '../models/MoveMediaTypeRequestModel'; -import type { PagedAllowedMediaTypeModel } from '../models/PagedAllowedMediaTypeModel'; -import type { PagedMediaTypeTreeItemResponseModel } from '../models/PagedMediaTypeTreeItemResponseModel'; -import type { PagedModelMediaTypeItemResponseModel } from '../models/PagedModelMediaTypeItemResponseModel'; -import type { UpdateFolderResponseModel } from '../models/UpdateFolderResponseModel'; -import type { UpdateMediaTypeRequestModel } from '../models/UpdateMediaTypeRequestModel'; - -import type { CancelablePromise } from '../core/CancelablePromise'; -import { OpenAPI } from '../core/OpenAPI'; -import { request as __request } from '../core/request'; - -export class MediaTypeResource { - - /** - * @returns any Success - * @throws ApiError - */ - public static getItemMediaType({ - id, - }: { - id?: Array, - }): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/item/media-type', - query: { - 'id': id, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getItemMediaTypeSearch({ - query, - skip, - take = 100, - }: { - query?: string, - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/item/media-type/search', - query: { - 'query': query, - 'skip': skip, - 'take': take, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns string Created - * @throws ApiError - */ - public static postMediaType({ - requestBody, - }: { - requestBody?: CreateMediaTypeRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/media-type', - 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 getMediaTypeById({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/media-type/{id}', - path: { - 'id': id, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static deleteMediaTypeById({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/media-type/{id}', - path: { - 'id': id, - }, - responseHeader: 'Umb-Notifications', - errors: { - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static putMediaTypeById({ - id, - requestBody, - }: { - id: string, - requestBody?: UpdateMediaTypeRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/media-type/{id}', - path: { - 'id': id, - }, - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns any 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 string 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', - responseHeader: 'Umb-Notifications', - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns any 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 - */ - public static postMediaTypeFolder({ - requestBody, - }: { - requestBody?: CreateFolderRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/media-type/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`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getMediaTypeFolderById({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/media-type/folder/{id}', - path: { - 'id': id, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static deleteMediaTypeFolderById({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/media-type/folder/{id}', - path: { - 'id': id, - }, - responseHeader: 'Umb-Notifications', - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static putMediaTypeFolderById({ - id, - requestBody, - }: { - id: string, - requestBody?: UpdateFolderResponseModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/media-type/folder/{id}', - path: { - 'id': id, - }, - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getTreeMediaTypeAncestors({ - descendantId, - }: { - descendantId?: string, - }): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tree/media-type/ancestors', - query: { - 'descendantId': descendantId, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getTreeMediaTypeChildren({ - parentId, - skip, - take = 100, - foldersOnly = false, - }: { - parentId?: string, - skip?: number, - take?: number, - foldersOnly?: boolean, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tree/media-type/children', - query: { - 'parentId': parentId, - 'skip': skip, - 'take': take, - 'foldersOnly': foldersOnly, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getTreeMediaTypeRoot({ - skip, - take = 100, - foldersOnly = false, - }: { - skip?: number, - take?: number, - foldersOnly?: boolean, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tree/media-type/root', - query: { - 'skip': skip, - 'take': take, - 'foldersOnly': foldersOnly, - }, - 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/MemberGroupResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/MemberGroupResource.ts deleted file mode 100644 index d80e275f0e..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/MemberGroupResource.ts +++ /dev/null @@ -1,181 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -import type { CreateMemberGroupRequestModel } from '../models/CreateMemberGroupRequestModel'; -import type { MemberGroupItemResponseModel } from '../models/MemberGroupItemResponseModel'; -import type { MemberGroupResponseModel } from '../models/MemberGroupResponseModel'; -import type { PagedMemberGroupResponseModel } from '../models/PagedMemberGroupResponseModel'; -import type { PagedNamedEntityTreeItemResponseModel } from '../models/PagedNamedEntityTreeItemResponseModel'; -import type { UpdateMemberGroupRequestModel } from '../models/UpdateMemberGroupRequestModel'; - -import type { CancelablePromise } from '../core/CancelablePromise'; -import { OpenAPI } from '../core/OpenAPI'; -import { request as __request } from '../core/request'; - -export class MemberGroupResource { - - /** - * @returns any Success - * @throws ApiError - */ - public static getItemMemberGroup({ - id, - }: { - id?: Array, - }): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/item/member-group', - query: { - 'id': id, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getMemberGroup({ - skip, - take = 100, - }: { - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/member-group', - query: { - 'skip': skip, - 'take': take, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static postMemberGroup({ - requestBody, - }: { - requestBody?: CreateMemberGroupRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/member-group', - body: requestBody, - mediaType: 'application/json', - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getMemberGroupById({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/member-group/{id}', - path: { - 'id': id, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static deleteMemberGroupById({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/member-group/{id}', - path: { - 'id': id, - }, - responseHeader: 'Umb-Notifications', - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static putMemberGroupById({ - id, - requestBody, - }: { - id: string, - requestBody?: UpdateMemberGroupRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/member-group/{id}', - 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 any Success - * @throws ApiError - */ - public static getTreeMemberGroupRoot({ - skip, - take = 100, - }: { - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tree/member-group/root', - query: { - 'skip': skip, - 'take': take, - }, - 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/MemberResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/MemberResource.ts deleted file mode 100644 index 3db3db8763..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/MemberResource.ts +++ /dev/null @@ -1,276 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -import type { CreateMemberRequestModel } from '../models/CreateMemberRequestModel'; -import type { DirectionModel } from '../models/DirectionModel'; -import type { MemberConfigurationResponseModel } from '../models/MemberConfigurationResponseModel'; -import type { MemberItemResponseModel } from '../models/MemberItemResponseModel'; -import type { MemberResponseModel } from '../models/MemberResponseModel'; -import type { PagedMemberResponseModel } from '../models/PagedMemberResponseModel'; -import type { PagedModelMemberItemResponseModel } from '../models/PagedModelMemberItemResponseModel'; -import type { UpdateMemberRequestModel } from '../models/UpdateMemberRequestModel'; - -import type { CancelablePromise } from '../core/CancelablePromise'; -import { OpenAPI } from '../core/OpenAPI'; -import { request as __request } from '../core/request'; - -export class MemberResource { - - /** - * @returns any Success - * @throws ApiError - */ - public static getFilterMember({ - memberTypeId, - memberGroupName, - isApproved, - isLockedOut, - orderBy = 'username', - orderDirection, - filter, - skip, - take = 100, - }: { - memberTypeId?: string, - memberGroupName?: string, - isApproved?: boolean, - isLockedOut?: boolean, - orderBy?: string, - orderDirection?: DirectionModel, - filter?: string, - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/filter/member', - query: { - 'memberTypeId': memberTypeId, - 'memberGroupName': memberGroupName, - 'isApproved': isApproved, - 'isLockedOut': isLockedOut, - 'orderBy': orderBy, - 'orderDirection': orderDirection, - 'filter': filter, - '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 getItemMember({ - id, - }: { - id?: Array, - }): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/item/member', - query: { - 'id': id, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getItemMemberSearch({ - query, - skip, - take = 100, - }: { - query?: string, - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/item/member/search', - query: { - 'query': query, - 'skip': skip, - 'take': take, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns string Created - * @throws ApiError - */ - public static postMember({ - requestBody, - }: { - requestBody?: CreateMemberRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/member', - 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 getMemberById({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/member/{id}', - path: { - 'id': id, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static deleteMemberById({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/member/{id}', - path: { - 'id': id, - }, - responseHeader: 'Umb-Notifications', - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static putMemberById({ - id, - requestBody, - }: { - id: string, - requestBody?: UpdateMemberRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/member/{id}', - path: { - 'id': id, - }, - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static putMemberByIdValidate({ - id, - requestBody, - }: { - id: string, - requestBody?: UpdateMemberRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/member/{id}/validate', - path: { - 'id': id, - }, - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getMemberConfiguration(): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/member/configuration', - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static postMemberValidate({ - requestBody, - }: { - requestBody?: CreateMemberRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/member/validate', - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - -} 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 deleted file mode 100644 index 7d1f97bdf1..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/MemberTypeResource.ts +++ /dev/null @@ -1,256 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -import type { AvailableMemberTypeCompositionResponseModel } from '../models/AvailableMemberTypeCompositionResponseModel'; -import type { CreateMemberTypeRequestModel } from '../models/CreateMemberTypeRequestModel'; -import type { MemberTypeCompositionRequestModel } from '../models/MemberTypeCompositionRequestModel'; -import type { MemberTypeCompositionResponseModel } from '../models/MemberTypeCompositionResponseModel'; -import type { MemberTypeItemResponseModel } from '../models/MemberTypeItemResponseModel'; -import type { MemberTypeResponseModel } from '../models/MemberTypeResponseModel'; -import type { PagedModelMemberTypeItemResponseModel } from '../models/PagedModelMemberTypeItemResponseModel'; -import type { PagedNamedEntityTreeItemResponseModel } from '../models/PagedNamedEntityTreeItemResponseModel'; -import type { UpdateMemberTypeRequestModel } from '../models/UpdateMemberTypeRequestModel'; - -import type { CancelablePromise } from '../core/CancelablePromise'; -import { OpenAPI } from '../core/OpenAPI'; -import { request as __request } from '../core/request'; - -export class MemberTypeResource { - - /** - * @returns any Success - * @throws ApiError - */ - public static getItemMemberType({ - id, - }: { - id?: Array, - }): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/item/member-type', - query: { - 'id': id, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getItemMemberTypeSearch({ - query, - skip, - take = 100, - }: { - query?: string, - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/item/member-type/search', - query: { - 'query': query, - 'skip': skip, - 'take': take, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns string Created - * @throws ApiError - */ - public static postMemberType({ - requestBody, - }: { - requestBody?: CreateMemberTypeRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/member-type', - 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 getMemberTypeById({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/member-type/{id}', - path: { - 'id': id, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static deleteMemberTypeById({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/member-type/{id}', - path: { - 'id': id, - }, - responseHeader: 'Umb-Notifications', - errors: { - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static putMemberTypeById({ - id, - requestBody, - }: { - id: string, - requestBody?: UpdateMemberTypeRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/member-type/{id}', - path: { - 'id': id, - }, - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getMemberTypeByIdCompositionReferences({ - id, - }: { - id: string, - }): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/member-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 postMemberTypeByIdCopy({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/member-type/{id}/copy', - path: { - 'id': id, - }, - 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 postMemberTypeAvailableCompositions({ - requestBody, - }: { - requestBody?: MemberTypeCompositionRequestModel, - }): CancelablePromise> { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/member-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 getTreeMemberTypeRoot({ - skip, - take = 100, - }: { - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tree/member-type/root', - query: { - 'skip': skip, - 'take': take, - }, - 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/ModelsBuilderResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/ModelsBuilderResource.ts deleted file mode 100644 index f1d51bc3c8..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/ModelsBuilderResource.ts +++ /dev/null @@ -1,58 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -import type { ModelsBuilderResponseModel } from '../models/ModelsBuilderResponseModel'; -import type { OutOfDateStatusResponseModel } from '../models/OutOfDateStatusResponseModel'; - -import type { CancelablePromise } from '../core/CancelablePromise'; -import { OpenAPI } from '../core/OpenAPI'; -import { request as __request } from '../core/request'; - -export class ModelsBuilderResource { - - /** - * @returns string Success - * @throws ApiError - */ - public static postModelsBuilderBuild(): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/models-builder/build', - responseHeader: 'Umb-Notifications', - errors: { - 401: `The resource is protected and requires an authentication token`, - 428: `Client Error`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getModelsBuilderDashboard(): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/models-builder/dashboard', - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getModelsBuilderStatus(): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/models-builder/status', - 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/ObjectTypesResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/ObjectTypesResource.ts deleted file mode 100644 index 00759d1852..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/ObjectTypesResource.ts +++ /dev/null @@ -1,37 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -import type { PagedObjectTypeResponseModel } from '../models/PagedObjectTypeResponseModel'; - -import type { CancelablePromise } from '../core/CancelablePromise'; -import { OpenAPI } from '../core/OpenAPI'; -import { request as __request } from '../core/request'; - -export class ObjectTypesResource { - - /** - * @returns any Success - * @throws ApiError - */ - public static getObjectTypes({ - skip, - take = 100, - }: { - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/object-types', - query: { - 'skip': skip, - 'take': take, - }, - 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/PackageResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/PackageResource.ts deleted file mode 100644 index 6698b384b0..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/PackageResource.ts +++ /dev/null @@ -1,221 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -import type { CreatePackageRequestModel } from '../models/CreatePackageRequestModel'; -import type { PackageConfigurationResponseModel } from '../models/PackageConfigurationResponseModel'; -import type { PackageDefinitionResponseModel } from '../models/PackageDefinitionResponseModel'; -import type { PagedPackageDefinitionResponseModel } from '../models/PagedPackageDefinitionResponseModel'; -import type { PagedPackageMigrationStatusResponseModel } from '../models/PagedPackageMigrationStatusResponseModel'; -import type { UpdatePackageRequestModel } from '../models/UpdatePackageRequestModel'; - -import type { CancelablePromise } from '../core/CancelablePromise'; -import { OpenAPI } from '../core/OpenAPI'; -import { request as __request } from '../core/request'; - -export class PackageResource { - - /** - * @returns string Success - * @throws ApiError - */ - public static postPackageByNameRunMigration({ - name, - }: { - name: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/package/{name}/run-migration', - path: { - 'name': name, - }, - responseHeader: 'Umb-Notifications', - errors: { - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - 409: `Conflict`, - }, - }); - } - - /** - * @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 any Success - * @throws ApiError - */ - public static getPackageCreated({ - skip, - take = 100, - }: { - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/package/created', - query: { - 'skip': skip, - 'take': take, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns string Created - * @throws ApiError - */ - public static postPackageCreated({ - requestBody, - }: { - requestBody?: CreatePackageRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/package/created', - 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 getPackageCreatedById({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/package/created/{id}', - path: { - 'id': id, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static deletePackageCreatedById({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/package/created/{id}', - path: { - 'id': id, - }, - responseHeader: 'Umb-Notifications', - errors: { - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static putPackageCreatedById({ - id, - requestBody, - }: { - id: string, - requestBody?: UpdatePackageRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/package/created/{id}', - path: { - 'id': id, - }, - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - errors: { - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getPackageCreatedByIdDownload({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/package/created/{id}/download', - path: { - 'id': id, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getPackageMigrationStatus({ - skip, - take = 100, - }: { - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/package/migration-status', - query: { - 'skip': skip, - 'take': take, - }, - 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/PartialViewResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/PartialViewResource.ts deleted file mode 100644 index 258df0ccad..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/PartialViewResource.ts +++ /dev/null @@ -1,356 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -import type { CreatePartialViewFolderRequestModel } from '../models/CreatePartialViewFolderRequestModel'; -import type { CreatePartialViewRequestModel } from '../models/CreatePartialViewRequestModel'; -import type { FileSystemTreeItemPresentationModel } from '../models/FileSystemTreeItemPresentationModel'; -import type { PagedFileSystemTreeItemPresentationModel } from '../models/PagedFileSystemTreeItemPresentationModel'; -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'; -import { OpenAPI } from '../core/OpenAPI'; -import { request as __request } from '../core/request'; - -export class PartialViewResource { - - /** - * @returns any Success - * @throws ApiError - */ - public static getItemPartialView({ - path, - }: { - path?: Array, - }): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/item/partial-view', - query: { - 'path': path, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns string Created - * @throws ApiError - */ - public static postPartialView({ - requestBody, - }: { - requestBody?: CreatePartialViewRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/partial-view', - 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 getPartialViewByPath({ - path, - }: { - path: string, - }): CancelablePromise { - return __request(OpenAPI, { - 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`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static deletePartialViewByPath({ - path, - }: { - path: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/partial-view/{path}', - path: { - 'path': path, - }, - responseHeader: 'Umb-Notifications', - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string 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/{path}', - path: { - 'path': path, - }, - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Created - * @throws ApiError - */ - public static putPartialViewByPathRename({ - path, - requestBody, - }: { - path: string, - requestBody?: RenamePartialViewRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - 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 string Created - * @throws ApiError - */ - public static postPartialViewFolder({ - requestBody, - }: { - 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`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getPartialViewFolderByPath({ - path, - }: { - path: string, - }): CancelablePromise { - return __request(OpenAPI, { - 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 string 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, - }, - responseHeader: 'Umb-Notifications', - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getPartialViewSnippet({ - skip, - take = 100, - }: { - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/partial-view/snippet', - query: { - 'skip': skip, - 'take': take, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getPartialViewSnippetById({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/partial-view/snippet/{id}', - path: { - 'id': id, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getTreePartialViewAncestors({ - descendantPath, - }: { - descendantPath?: string, - }): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tree/partial-view/ancestors', - query: { - 'descendantPath': descendantPath, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getTreePartialViewChildren({ - parentPath, - skip, - take = 100, - }: { - parentPath?: string, - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tree/partial-view/children', - query: { - 'parentPath': parentPath, - 'skip': skip, - 'take': take, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getTreePartialViewRoot({ - skip, - take = 100, - }: { - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tree/partial-view/root', - query: { - 'skip': skip, - 'take': take, - }, - 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/PreviewResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/PreviewResource.ts deleted file mode 100644 index f87491b48e..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/PreviewResource.ts +++ /dev/null @@ -1,41 +0,0 @@ -/* 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 string Success - * @throws ApiError - */ - public static deletePreview(): CancelablePromise { - return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/preview', - responseHeader: 'Umb-Notifications', - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static postPreview(): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/preview', - responseHeader: 'Umb-Notifications', - 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/ProfilingResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/ProfilingResource.ts deleted file mode 100644 index f2b9d345f4..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/ProfilingResource.ts +++ /dev/null @@ -1,49 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -import type { ProfilingStatusRequestModel } from '../models/ProfilingStatusRequestModel'; -import type { ProfilingStatusResponseModel } from '../models/ProfilingStatusResponseModel'; - -import type { CancelablePromise } from '../core/CancelablePromise'; -import { OpenAPI } from '../core/OpenAPI'; -import { request as __request } from '../core/request'; - -export class ProfilingResource { - - /** - * @returns any Success - * @throws ApiError - */ - public static getProfilingStatus(): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/profiling/status', - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static putProfilingStatus({ - requestBody, - }: { - requestBody?: ProfilingStatusRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/profiling/status', - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - 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/PropertyTypeResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/PropertyTypeResource.ts deleted file mode 100644 index 36cf7b48cc..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/PropertyTypeResource.ts +++ /dev/null @@ -1,36 +0,0 @@ -/* 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 PropertyTypeResource { - - /** - * @returns boolean Success - * @throws ApiError - */ - public static getPropertyTypeIsUsed({ - contentTypeId, - propertyAlias, - }: { - contentTypeId?: string, - propertyAlias?: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/property-type/is-used', - query: { - 'contentTypeId': contentTypeId, - 'propertyAlias': propertyAlias, - }, - 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/PublishedCacheResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/PublishedCacheResource.ts deleted file mode 100644 index e3c70690bf..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/PublishedCacheResource.ts +++ /dev/null @@ -1,70 +0,0 @@ -/* 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 PublishedCacheResource { - - /** - * @returns string Success - * @throws ApiError - */ - public static postPublishedCacheCollect(): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/published-cache/collect', - responseHeader: 'Umb-Notifications', - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static postPublishedCacheRebuild(): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/published-cache/rebuild', - responseHeader: 'Umb-Notifications', - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static postPublishedCacheReload(): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/published-cache/reload', - responseHeader: 'Umb-Notifications', - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static getPublishedCacheStatus(): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/published-cache/status', - 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/RedirectManagementResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/RedirectManagementResource.ts deleted file mode 100644 index 608b436b61..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/RedirectManagementResource.ts +++ /dev/null @@ -1,130 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -import type { PagedRedirectUrlResponseModel } from '../models/PagedRedirectUrlResponseModel'; -import type { RedirectStatusModel } from '../models/RedirectStatusModel'; -import type { RedirectUrlStatusResponseModel } from '../models/RedirectUrlStatusResponseModel'; - -import type { CancelablePromise } from '../core/CancelablePromise'; -import { OpenAPI } from '../core/OpenAPI'; -import { request as __request } from '../core/request'; - -export class RedirectManagementResource { - - /** - * @returns any Success - * @throws ApiError - */ - public static getRedirectManagement({ - filter, - skip, - take = 100, - }: { - filter?: string, - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/redirect-management', - query: { - 'filter': filter, - 'skip': skip, - 'take': take, - }, - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getRedirectManagementById({ - id, - skip, - take = 100, - }: { - id: string, - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/redirect-management/{id}', - path: { - 'id': id, - }, - query: { - 'skip': skip, - 'take': take, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static deleteRedirectManagementById({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/redirect-management/{id}', - path: { - 'id': id, - }, - responseHeader: 'Umb-Notifications', - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getRedirectManagementStatus(): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/redirect-management/status', - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static postRedirectManagementStatus({ - status, - }: { - status?: RedirectStatusModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/redirect-management/status', - query: { - 'status': status, - }, - responseHeader: 'Umb-Notifications', - 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/RelationResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/RelationResource.ts deleted file mode 100644 index 470f38ac4a..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/RelationResource.ts +++ /dev/null @@ -1,43 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -import type { PagedRelationResponseModel } from '../models/PagedRelationResponseModel'; - -import type { CancelablePromise } from '../core/CancelablePromise'; -import { OpenAPI } from '../core/OpenAPI'; -import { request as __request } from '../core/request'; - -export class RelationResource { - - /** - * @returns any Success - * @throws ApiError - */ - public static getRelationTypeById({ - id, - skip, - take = 100, - }: { - id: string, - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/relation/type/{id}', - path: { - 'id': id, - }, - query: { - 'skip': skip, - 'take': take, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - -} 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 deleted file mode 100644 index 40a2bb7c22..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/RelationTypeResource.ts +++ /dev/null @@ -1,82 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -import type { PagedRelationTypeResponseModel } from '../models/PagedRelationTypeResponseModel'; -import type { RelationTypeItemResponseModel } from '../models/RelationTypeItemResponseModel'; -import type { RelationTypeResponseModel } from '../models/RelationTypeResponseModel'; - -import type { CancelablePromise } from '../core/CancelablePromise'; -import { OpenAPI } from '../core/OpenAPI'; -import { request as __request } from '../core/request'; - -export class RelationTypeResource { - - /** - * @returns any Success - * @throws ApiError - */ - public static getItemRelationType({ - id, - }: { - id?: Array, - }): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/item/relation-type', - query: { - 'id': id, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getRelationType({ - skip, - take = 100, - }: { - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/relation-type', - query: { - 'skip': skip, - 'take': take, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getRelationTypeById({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/relation-type/{id}', - path: { - 'id': id, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - -} 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 deleted file mode 100644 index 576ac97f16..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/ScriptResource.ts +++ /dev/null @@ -1,308 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -import type { CreateScriptFolderRequestModel } from '../models/CreateScriptFolderRequestModel'; -import type { CreateScriptRequestModel } from '../models/CreateScriptRequestModel'; -import type { FileSystemTreeItemPresentationModel } from '../models/FileSystemTreeItemPresentationModel'; -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'; - -import type { CancelablePromise } from '../core/CancelablePromise'; -import { OpenAPI } from '../core/OpenAPI'; -import { request as __request } from '../core/request'; - -export class ScriptResource { - - /** - * @returns any Success - * @throws ApiError - */ - public static getItemScript({ - path, - }: { - path?: Array, - }): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/item/script', - query: { - 'path': path, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns string Created - * @throws ApiError - */ - public static postScript({ - requestBody, - }: { - requestBody?: CreateScriptRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/script', - 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 getScriptByPath({ - path, - }: { - path: string, - }): CancelablePromise { - return __request(OpenAPI, { - 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`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static deleteScriptByPath({ - path, - }: { - path: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/script/{path}', - path: { - 'path': path, - }, - responseHeader: 'Umb-Notifications', - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static putScriptByPath({ - path, - requestBody, - }: { - path: string, - requestBody?: UpdateScriptRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/script/{path}', - path: { - 'path': path, - }, - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Created - * @throws ApiError - */ - public static putScriptByPathRename({ - path, - requestBody, - }: { - path: string, - requestBody?: RenameScriptRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - 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 string Created - * @throws ApiError - */ - public static postScriptFolder({ - requestBody, - }: { - 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`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getScriptFolderByPath({ - path, - }: { - path: string, - }): CancelablePromise { - return __request(OpenAPI, { - 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 string 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, - }, - responseHeader: 'Umb-Notifications', - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getTreeScriptAncestors({ - descendantPath, - }: { - descendantPath?: string, - }): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tree/script/ancestors', - query: { - 'descendantPath': descendantPath, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getTreeScriptChildren({ - parentPath, - skip, - take = 100, - }: { - parentPath?: string, - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tree/script/children', - query: { - 'parentPath': parentPath, - 'skip': skip, - 'take': take, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getTreeScriptRoot({ - skip, - take = 100, - }: { - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tree/script/root', - query: { - 'skip': skip, - 'take': take, - }, - 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/SearcherResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/SearcherResource.ts deleted file mode 100644 index b4baa27a9d..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/SearcherResource.ts +++ /dev/null @@ -1,71 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -import type { PagedSearcherResponseModel } from '../models/PagedSearcherResponseModel'; -import type { PagedSearchResultResponseModel } from '../models/PagedSearchResultResponseModel'; - -import type { CancelablePromise } from '../core/CancelablePromise'; -import { OpenAPI } from '../core/OpenAPI'; -import { request as __request } from '../core/request'; - -export class SearcherResource { - - /** - * @returns any Success - * @throws ApiError - */ - public static getSearcher({ - skip, - take = 100, - }: { - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/searcher', - query: { - 'skip': skip, - 'take': take, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getSearcherBySearcherNameQuery({ - searcherName, - term, - skip, - take = 100, - }: { - searcherName: string, - term?: string, - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/searcher/{searcherName}/query', - path: { - 'searcherName': searcherName, - }, - query: { - 'term': term, - 'skip': skip, - 'take': take, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - -} 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 deleted file mode 100644 index 187b69ae51..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/SecurityResource.ts +++ /dev/null @@ -1,96 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -import type { ResetPasswordRequestModel } from '../models/ResetPasswordRequestModel'; -import type { ResetPasswordTokenRequestModel } from '../models/ResetPasswordTokenRequestModel'; -import type { SecurityConfigurationResponseModel } from '../models/SecurityConfigurationResponseModel'; -import type { VerifyResetPasswordResponseModel } from '../models/VerifyResetPasswordResponseModel'; -import type { VerifyResetPasswordTokenRequestModel } from '../models/VerifyResetPasswordTokenRequestModel'; - -import type { CancelablePromise } from '../core/CancelablePromise'; -import { OpenAPI } from '../core/OpenAPI'; -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 string Success - * @throws ApiError - */ - public static postSecurityForgotPassword({ - requestBody, - }: { - requestBody?: ResetPasswordRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/security/forgot-password', - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns void - * @throws ApiError - */ - public static postSecurityForgotPasswordReset({ - requestBody, - }: { - requestBody?: ResetPasswordTokenRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/security/forgot-password/reset', - 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 postSecurityForgotPasswordVerify({ - requestBody, - }: { - requestBody?: VerifyResetPasswordTokenRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/security/forgot-password/verify', - body: requestBody, - mediaType: 'application/json', - errors: { - 400: `Bad Request`, - 404: `Not Found`, - }, - }); - } - -} 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 deleted file mode 100644 index 15d61a5904..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/ServerResource.ts +++ /dev/null @@ -1,72 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* 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 { ServerTroubleshootingResponseModel } from '../models/ServerTroubleshootingResponseModel'; - -import type { CancelablePromise } from '../core/CancelablePromise'; -import { OpenAPI } from '../core/OpenAPI'; -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 - */ - public static getServerInformation(): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/server/information', - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getServerStatus(): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/server/status', - errors: { - 400: `Bad Request`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getServerTroubleshooting(): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/server/troubleshooting', - 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/StaticFileResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/StaticFileResource.ts deleted file mode 100644 index 321a4b3bb6..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/StaticFileResource.ts +++ /dev/null @@ -1,108 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -import type { FileSystemTreeItemPresentationModel } from '../models/FileSystemTreeItemPresentationModel'; -import type { PagedFileSystemTreeItemPresentationModel } from '../models/PagedFileSystemTreeItemPresentationModel'; -import type { StaticFileItemResponseModel } from '../models/StaticFileItemResponseModel'; - -import type { CancelablePromise } from '../core/CancelablePromise'; -import { OpenAPI } from '../core/OpenAPI'; -import { request as __request } from '../core/request'; - -export class StaticFileResource { - - /** - * @returns any Success - * @throws ApiError - */ - public static getItemStaticFile({ - path, - }: { - path?: Array, - }): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/item/static-file', - query: { - 'path': path, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getTreeStaticFileAncestors({ - descendantPath, - }: { - descendantPath?: string, - }): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tree/static-file/ancestors', - query: { - 'descendantPath': descendantPath, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getTreeStaticFileChildren({ - parentPath, - skip, - take = 100, - }: { - parentPath?: string, - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tree/static-file/children', - query: { - 'parentPath': parentPath, - 'skip': skip, - 'take': take, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getTreeStaticFileRoot({ - skip, - take = 100, - }: { - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tree/static-file/root', - query: { - 'skip': skip, - 'take': take, - }, - 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/StylesheetResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/StylesheetResource.ts deleted file mode 100644 index 98cd485ab7..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/StylesheetResource.ts +++ /dev/null @@ -1,308 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -import type { CreateStylesheetFolderRequestModel } from '../models/CreateStylesheetFolderRequestModel'; -import type { CreateStylesheetRequestModel } from '../models/CreateStylesheetRequestModel'; -import type { FileSystemTreeItemPresentationModel } from '../models/FileSystemTreeItemPresentationModel'; -import type { PagedFileSystemTreeItemPresentationModel } from '../models/PagedFileSystemTreeItemPresentationModel'; -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'; - -import type { CancelablePromise } from '../core/CancelablePromise'; -import { OpenAPI } from '../core/OpenAPI'; -import { request as __request } from '../core/request'; - -export class StylesheetResource { - - /** - * @returns any Success - * @throws ApiError - */ - public static getItemStylesheet({ - path, - }: { - path?: Array, - }): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/item/stylesheet', - query: { - 'path': path, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns string Created - * @throws ApiError - */ - public static postStylesheet({ - requestBody, - }: { - requestBody?: CreateStylesheetRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/stylesheet', - 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 getStylesheetByPath({ - path, - }: { - path: string, - }): CancelablePromise { - return __request(OpenAPI, { - 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`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static deleteStylesheetByPath({ - path, - }: { - path: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/stylesheet/{path}', - path: { - 'path': path, - }, - responseHeader: 'Umb-Notifications', - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static putStylesheetByPath({ - path, - requestBody, - }: { - path: string, - requestBody?: UpdateStylesheetRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/stylesheet/{path}', - path: { - 'path': path, - }, - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Created - * @throws ApiError - */ - public static putStylesheetByPathRename({ - path, - requestBody, - }: { - path: string, - requestBody?: RenameStylesheetRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - 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 string Created - * @throws ApiError - */ - public static postStylesheetFolder({ - requestBody, - }: { - 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`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getStylesheetFolderByPath({ - path, - }: { - path: string, - }): CancelablePromise { - return __request(OpenAPI, { - 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 string 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, - }, - responseHeader: 'Umb-Notifications', - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getTreeStylesheetAncestors({ - descendantPath, - }: { - descendantPath?: string, - }): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tree/stylesheet/ancestors', - query: { - 'descendantPath': descendantPath, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getTreeStylesheetChildren({ - parentPath, - skip, - take = 100, - }: { - parentPath?: string, - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tree/stylesheet/children', - query: { - 'parentPath': parentPath, - 'skip': skip, - 'take': take, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getTreeStylesheetRoot({ - skip, - take = 100, - }: { - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tree/stylesheet/root', - query: { - 'skip': skip, - 'take': take, - }, - 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/TagResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/TagResource.ts deleted file mode 100644 index 6885224f62..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/TagResource.ts +++ /dev/null @@ -1,46 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -import type { PagedTagResponseModel } from '../models/PagedTagResponseModel'; - -import type { CancelablePromise } from '../core/CancelablePromise'; -import { OpenAPI } from '../core/OpenAPI'; -import { request as __request } from '../core/request'; - -export class TagResource { - - /** - * @returns any Success - * @throws ApiError - */ - public static getTag({ - query, - tagGroup, - culture, - skip, - take = 100, - }: { - query?: string, - tagGroup?: string, - culture?: string, - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tag', - query: { - 'query': query, - 'tagGroup': tagGroup, - 'culture': culture, - 'skip': skip, - 'take': take, - }, - 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/TelemetryResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/TelemetryResource.ts deleted file mode 100644 index f87ab544c9..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/TelemetryResource.ts +++ /dev/null @@ -1,75 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -import type { PagedTelemetryResponseModel } from '../models/PagedTelemetryResponseModel'; -import type { TelemetryRequestModel } from '../models/TelemetryRequestModel'; -import type { TelemetryResponseModel } from '../models/TelemetryResponseModel'; - -import type { CancelablePromise } from '../core/CancelablePromise'; -import { OpenAPI } from '../core/OpenAPI'; -import { request as __request } from '../core/request'; - -export class TelemetryResource { - - /** - * @returns any Success - * @throws ApiError - */ - public static getTelemetry({ - skip, - take = 100, - }: { - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/telemetry', - query: { - 'skip': skip, - 'take': take, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getTelemetryLevel(): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/telemetry/level', - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static postTelemetryLevel({ - requestBody, - }: { - requestBody?: TelemetryRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/telemetry/level', - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - 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/TemplateResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/TemplateResource.ts deleted file mode 100644 index 01d5cece06..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/TemplateResource.ts +++ /dev/null @@ -1,288 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -import type { CreateTemplateRequestModel } from '../models/CreateTemplateRequestModel'; -import type { NamedEntityTreeItemResponseModel } from '../models/NamedEntityTreeItemResponseModel'; -import type { PagedModelTemplateItemResponseModel } from '../models/PagedModelTemplateItemResponseModel'; -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'; -import type { TemplateQuerySettingsResponseModel } from '../models/TemplateQuerySettingsResponseModel'; -import type { TemplateResponseModel } from '../models/TemplateResponseModel'; -import type { UpdateTemplateRequestModel } from '../models/UpdateTemplateRequestModel'; - -import type { CancelablePromise } from '../core/CancelablePromise'; -import { OpenAPI } from '../core/OpenAPI'; -import { request as __request } from '../core/request'; - -export class TemplateResource { - - /** - * @returns any Success - * @throws ApiError - */ - public static getItemTemplate({ - id, - }: { - id?: Array, - }): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/item/template', - query: { - 'id': id, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getItemTemplateSearch({ - query, - skip, - take = 100, - }: { - query?: string, - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/item/template/search', - query: { - 'query': query, - 'skip': skip, - 'take': take, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns string Created - * @throws ApiError - */ - public static postTemplate({ - requestBody, - }: { - requestBody?: CreateTemplateRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/template', - 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 getTemplateById({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/template/{id}', - path: { - 'id': id, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static deleteTemplateById({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/template/{id}', - path: { - 'id': id, - }, - responseHeader: 'Umb-Notifications', - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static putTemplateById({ - id, - requestBody, - }: { - id: string, - requestBody?: UpdateTemplateRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/template/{id}', - path: { - 'id': id, - }, - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @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 - */ - public static postTemplateQueryExecute({ - requestBody, - }: { - requestBody?: TemplateQueryExecuteModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/template/query/execute', - body: requestBody, - mediaType: 'application/json', - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getTemplateQuerySettings(): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/template/query/settings', - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getTreeTemplateAncestors({ - descendantId, - }: { - descendantId?: string, - }): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tree/template/ancestors', - query: { - 'descendantId': descendantId, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getTreeTemplateChildren({ - parentId, - skip, - take = 100, - }: { - parentId?: string, - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tree/template/children', - query: { - 'parentId': parentId, - 'skip': skip, - 'take': take, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getTreeTemplateRoot({ - skip, - take = 100, - }: { - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tree/template/root', - query: { - 'skip': skip, - 'take': take, - }, - 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/TemporaryFileResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/TemporaryFileResource.ts deleted file mode 100644 index 6d587006f9..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/TemporaryFileResource.ts +++ /dev/null @@ -1,100 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -import type { TemporaryFileConfigurationResponseModel } from '../models/TemporaryFileConfigurationResponseModel'; -import type { TemporaryFileResponseModel } from '../models/TemporaryFileResponseModel'; - -import type { CancelablePromise } from '../core/CancelablePromise'; -import { OpenAPI } from '../core/OpenAPI'; -import { request as __request } from '../core/request'; - -export class TemporaryFileResource { - - /** - * @returns string Created - * @throws ApiError - */ - public static postTemporaryFile({ - formData, - }: { - formData?: { - Id?: string; - File?: Blob; - }, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/temporary-file', - formData: formData, - mediaType: 'multipart/form-data', - responseHeader: 'Umb-Generated-Resource', - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getTemporaryFileById({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/temporary-file/{id}', - path: { - 'id': id, - }, - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static deleteTemporaryFileById({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/temporary-file/{id}', - path: { - 'id': id, - }, - responseHeader: 'Umb-Notifications', - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getTemporaryFileConfiguration(): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/temporary-file/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/TourResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/TourResource.ts deleted file mode 100644 index 06d5fe9885..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/TourResource.ts +++ /dev/null @@ -1,49 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -import type { SetTourStatusRequestModel } from '../models/SetTourStatusRequestModel'; -import type { UserTourStatusesResponseModel } from '../models/UserTourStatusesResponseModel'; - -import type { CancelablePromise } from '../core/CancelablePromise'; -import { OpenAPI } from '../core/OpenAPI'; -import { request as __request } from '../core/request'; - -export class TourResource { - - /** - * @returns any Success - * @throws ApiError - */ - public static getTour(): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/tour', - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static postTour({ - requestBody, - }: { - requestBody?: SetTourStatusRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/tour', - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - 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/UpgradeResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/UpgradeResource.ts deleted file mode 100644 index 9987c2f24f..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/UpgradeResource.ts +++ /dev/null @@ -1,45 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -import type { UpgradeSettingsResponseModel } from '../models/UpgradeSettingsResponseModel'; - -import type { CancelablePromise } from '../core/CancelablePromise'; -import { OpenAPI } from '../core/OpenAPI'; -import { request as __request } from '../core/request'; - -export class UpgradeResource { - - /** - * @returns string Success - * @throws ApiError - */ - public static postUpgradeAuthorize(): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/upgrade/authorize', - responseHeader: 'Umb-Notifications', - errors: { - 401: `The resource is protected and requires an authentication token`, - 428: `Client Error`, - 500: `Server Error`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getUpgradeSettings(): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/upgrade/settings', - errors: { - 401: `The resource is protected and requires an authentication token`, - 428: `Client Error`, - }, - }); - } - -} 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 deleted file mode 100644 index 56df5f3884..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/UserGroupResource.ts +++ /dev/null @@ -1,238 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -import type { CreateUserGroupRequestModel } from '../models/CreateUserGroupRequestModel'; -import type { DeleteUserGroupsRequestModel } from '../models/DeleteUserGroupsRequestModel'; -import type { PagedUserGroupResponseModel } from '../models/PagedUserGroupResponseModel'; -import type { UpdateUserGroupRequestModel } from '../models/UpdateUserGroupRequestModel'; -import type { UserGroupItemResponseModel } from '../models/UserGroupItemResponseModel'; -import type { UserGroupResponseModel } from '../models/UserGroupResponseModel'; - -import type { CancelablePromise } from '../core/CancelablePromise'; -import { OpenAPI } from '../core/OpenAPI'; -import { request as __request } from '../core/request'; - -export class UserGroupResource { - - /** - * @returns any Success - * @throws ApiError - */ - public static getItemUserGroup({ - id, - }: { - id?: Array, - }): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/item/user-group', - query: { - 'id': id, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static deleteUserGroup({ - requestBody, - }: { - requestBody?: DeleteUserGroupsRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/user-group', - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - 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 string Created - * @throws ApiError - */ - public static postUserGroup({ - requestBody, - }: { - requestBody?: CreateUserGroupRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/user-group', - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Generated-Resource', - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getUserGroup({ - skip, - take = 100, - }: { - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/user-group', - query: { - 'skip': skip, - 'take': take, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getUserGroupById({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/user-group/{id}', - 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 string Success - * @throws ApiError - */ - public static deleteUserGroupById({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/user-group/{id}', - path: { - 'id': id, - }, - responseHeader: 'Umb-Notifications', - 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 string Success - * @throws ApiError - */ - public static putUserGroupById({ - id, - requestBody, - }: { - id: string, - requestBody?: UpdateUserGroupRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/user-group/{id}', - path: { - 'id': id, - }, - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - errors: { - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string 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', - responseHeader: 'Umb-Notifications', - 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 string 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', - responseHeader: 'Umb-Notifications', - 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`, - }, - }); - } - -} 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 deleted file mode 100644 index afe9e48f33..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/UserResource.ts +++ /dev/null @@ -1,853 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -import type { ChangePasswordCurrentUserRequestModel } from '../models/ChangePasswordCurrentUserRequestModel'; -import type { ChangePasswordUserRequestModel } from '../models/ChangePasswordUserRequestModel'; -import type { CreateInitialPasswordUserRequestModel } from '../models/CreateInitialPasswordUserRequestModel'; -import type { CreateUserRequestModel } from '../models/CreateUserRequestModel'; -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 { ResetPasswordUserResponseModel } from '../models/ResetPasswordUserResponseModel'; -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 { VerifyInviteUserResponseModel } from '../models/VerifyInviteUserResponseModel'; - -import type { CancelablePromise } from '../core/CancelablePromise'; -import { OpenAPI } from '../core/OpenAPI'; -import { request as __request } from '../core/request'; - -export class UserResource { - - /** - * @returns any Success - * @throws ApiError - */ - public static getFilterUser({ - skip, - take = 100, - orderBy, - orderDirection, - userGroupIds, - userStates, - filter = '', - }: { - skip?: number, - take?: number, - orderBy?: UserOrderModel, - orderDirection?: DirectionModel, - userGroupIds?: Array, - userStates?: Array, - filter?: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/filter/user', - query: { - 'skip': skip, - 'take': take, - 'orderBy': orderBy, - 'orderDirection': orderDirection, - 'userGroupIds': userGroupIds, - 'userStates': userStates, - 'filter': filter, - }, - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getItemUser({ - id, - }: { - id?: Array, - }): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/item/user', - query: { - 'id': id, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns string Created - * @throws ApiError - */ - public static postUser({ - requestBody, - }: { - requestBody?: CreateUserRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/user', - 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 string Success - * @throws ApiError - */ - public static deleteUser({ - requestBody, - }: { - requestBody?: DeleteUsersRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/user', - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - 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 getUser({ - skip, - take = 100, - }: { - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/user', - 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 getUserById({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/user/{id}', - 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 string Success - * @throws ApiError - */ - public static deleteUserById({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/user/{id}', - path: { - 'id': id, - }, - responseHeader: 'Umb-Notifications', - 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 string Success - * @throws ApiError - */ - public static putUserById({ - id, - requestBody, - }: { - id: string, - requestBody?: UpdateUserRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/user/{id}', - path: { - 'id': id, - }, - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - 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 - */ - 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 string 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, - }, - responseHeader: 'Umb-Notifications', - 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 string Success - * @throws ApiError - */ - public static postUserByIdChangePassword({ - id, - requestBody, - }: { - id: string, - requestBody?: ChangePasswordUserRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/user/{id}/change-password', - path: { - 'id': id, - }, - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - 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 - */ - public static postUserByIdResetPassword({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/user/{id}/reset-password', - 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 string Success - * @throws ApiError - */ - public static deleteUserAvatarById({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/user/avatar/{id}', - path: { - 'id': id, - }, - responseHeader: 'Umb-Notifications', - 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 string Success - * @throws ApiError - */ - public static postUserAvatarById({ - id, - requestBody, - }: { - id: string, - requestBody?: SetAvatarRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/user/avatar/{id}', - path: { - 'id': id, - }, - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - 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 - */ - 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 - */ - public static getUserCurrent(): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/user/current', - errors: { - 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 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 string 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, - }, - responseHeader: 'Umb-Notifications', - 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 string Success - * @throws ApiError - */ - public static postUserCurrentAvatar({ - requestBody, - }: { - requestBody?: SetAvatarRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/user/current/avatar', - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - 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 string Success - * @throws ApiError - */ - public static postUserCurrentChangePassword({ - requestBody, - }: { - requestBody?: ChangePasswordCurrentUserRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/user/current/change-password', - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @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 - */ - public static getUserCurrentLogins(): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/user/current/logins', - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getUserCurrentPermissions({ - id, - }: { - id?: Array, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/user/current/permissions', - query: { - 'id': id, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getUserCurrentPermissionsDocument({ - id, - }: { - id?: Array, - }): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/user/current/permissions/document', - query: { - 'id': id, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getUserCurrentPermissionsMedia({ - id, - }: { - id?: Array, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/user/current/permissions/media', - query: { - 'id': id, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static postUserDisable({ - requestBody, - }: { - requestBody?: DisableUserRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/user/disable', - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - 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 string Success - * @throws ApiError - */ - public static postUserEnable({ - requestBody, - }: { - requestBody?: EnableUserRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/user/enable', - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - 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 string Created - * @throws ApiError - */ - public static postUserInvite({ - requestBody, - }: { - requestBody?: InviteUserRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/user/invite', - 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 string Success - * @throws ApiError - */ - public static postUserInviteCreatePassword({ - requestBody, - }: { - requestBody?: CreateInitialPasswordUserRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/user/invite/create-password', - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - errors: { - 400: `Bad Request`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static postUserInviteResend({ - requestBody, - }: { - requestBody?: ResendInviteUserRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/user/invite/resend', - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static postUserInviteVerify({ - requestBody, - }: { - requestBody?: VerifyInviteUserRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/user/invite/verify', - body: requestBody, - mediaType: 'application/json', - errors: { - 400: `Bad Request`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static postUserSetUserGroups({ - requestBody, - }: { - requestBody?: UpdateUserGroupsOnUserRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/user/set-user-groups', - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - errors: { - 401: `The resource is protected and requires an authentication token`, - 403: `The authenticated user do not have access to this resource`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static postUserUnlock({ - requestBody, - }: { - requestBody?: UnlockUsersRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/user/unlock', - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - 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`, - }, - }); - } - -} diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/WebhookResource.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/WebhookResource.ts deleted file mode 100644 index c0a457ea98..0000000000 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services/WebhookResource.ts +++ /dev/null @@ -1,159 +0,0 @@ -/* generated using openapi-typescript-codegen -- do no edit */ -/* istanbul ignore file */ -/* tslint:disable */ -/* eslint-disable */ -import type { CreateWebhookRequestModel } from '../models/CreateWebhookRequestModel'; -import type { PagedWebhookResponseModel } from '../models/PagedWebhookResponseModel'; -import type { UpdateWebhookRequestModel } from '../models/UpdateWebhookRequestModel'; -import type { WebhookItemResponseModel } from '../models/WebhookItemResponseModel'; -import type { WebhookResponseModel } from '../models/WebhookResponseModel'; - -import type { CancelablePromise } from '../core/CancelablePromise'; -import { OpenAPI } from '../core/OpenAPI'; -import { request as __request } from '../core/request'; - -export class WebhookResource { - - /** - * @returns any Success - * @throws ApiError - */ - public static getWebhook({ - skip, - take = 100, - }: { - skip?: number, - take?: number, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/webhook', - query: { - 'skip': skip, - 'take': take, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - - /** - * @returns string Created - * @throws ApiError - */ - public static postWebhook({ - requestBody, - }: { - requestBody?: CreateWebhookRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'POST', - url: '/umbraco/management/api/v1/webhook', - 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 getWebhookById({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/webhook/{id}', - path: { - 'id': id, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static putWebhookById({ - id, - requestBody, - }: { - id: string, - requestBody?: UpdateWebhookRequestModel, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'PUT', - url: '/umbraco/management/api/v1/webhook/{id}', - path: { - 'id': id, - }, - body: requestBody, - mediaType: 'application/json', - responseHeader: 'Umb-Notifications', - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns string Success - * @throws ApiError - */ - public static deleteWebhookById({ - id, - }: { - id: string, - }): CancelablePromise { - return __request(OpenAPI, { - method: 'DELETE', - url: '/umbraco/management/api/v1/webhook/{id}', - path: { - 'id': id, - }, - responseHeader: 'Umb-Notifications', - errors: { - 400: `Bad Request`, - 401: `The resource is protected and requires an authentication token`, - 404: `Not Found`, - }, - }); - } - - /** - * @returns any Success - * @throws ApiError - */ - public static getWebhookItem({ - ids, - }: { - ids?: Array, - }): CancelablePromise> { - return __request(OpenAPI, { - method: 'GET', - url: '/umbraco/management/api/v1/webhook/item', - query: { - 'ids': ids, - }, - errors: { - 401: `The resource is protected and requires an authentication token`, - }, - }); - } - -} From f02c747a6864752cc686338a0923ca637a6f46c8 Mon Sep 17 00:00:00 2001 From: leekelleher Date: Wed, 10 Apr 2024 12:42:09 +0100 Subject: [PATCH 251/280] Temporary fix-up of TypeScript compile errors --- .../database/installer-database.element.ts | 6 +++--- .../installer/error/installer-error.element.ts | 2 +- .../src/apps/installer/installer.context.ts | 3 ++- .../src/apps/upgrader/upgrader.element.ts | 4 ++-- .../core/repository/item/item-repository-base.ts | 4 ++-- .../core/resources/resource.controller.ts | 4 ++-- .../core/tree/data/tree-repository-base.ts | 15 ++++++++------- .../document-collection.server.data-source.ts | 2 +- .../media-collection.server.data-source.ts | 2 +- .../property-editor-ui-media-picker.element.ts | 2 +- .../telemetry/dashboard-telemetry.element.ts | 2 +- .../components/mfa-provider-default.element.ts | 6 +++--- ...ent-user-mfa-disable-provider-modal.element.ts | 2 +- 13 files changed, 28 insertions(+), 26 deletions(-) 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 2830778239..2e4409f1bb 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 @@ -170,7 +170,7 @@ export class UmbInstallerDatabaseElement extends UmbLitElement { if (error) { this._validationErrorMessage = `The server could not validate the database connection. Details: ${ - error instanceof ApiError ? error.body.detail : error.message + error instanceof ApiError ? (error.body as any).detail : error.message }`; this._installButton.state = 'failed'; return; @@ -195,10 +195,10 @@ export class UmbInstallerDatabaseElement extends UmbLitElement { this._installerContext.nextStep(); - const { error } = await tryExecute( + const { error: _error } = await tryExecute( InstallResource.postInstallSetup({ requestBody: this._installerContext.getData() }), ); - + const error = _error as ProblemDetails | undefined; if (error) { this._handleRejected(error); } else { 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 9b754b8ffe..10b2b96aa5 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 @@ -39,7 +39,7 @@ export class UmbInstallerErrorElement extends UmbLitElement { private _renderError(error: ProblemDetails) { return html`

Description: ${error.title}

- ${error.errors ? this._renderErrors(error.errors) : nothing} + ${error.errors ? this._renderErrors(error.errors as any) : nothing}

Details:

${error.detail ?? 'Unknown error'}

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 aa8d67d497..5510d4847b 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 @@ -119,7 +119,8 @@ export class UmbInstallerContext { * @memberof UmbInstallerContext */ private async _loadInstallerSettings() { - const { data, error } = await tryExecute(InstallResource.getInstallSettings()); + const { data, error: _error } = await tryExecute(InstallResource.getInstallSettings()); + const error: any = _error; if (data) { this._settings.setValue(data); } else if (error) { 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 3b1c1b35c0..54f5a14b90 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 @@ -48,7 +48,7 @@ export class UmbUpgraderElement extends UmbLitElement { if (data) { this.upgradeSettings = data; } else if (error) { - this.errorMessage = error instanceof ApiError ? error.body.detail : error.message; + this.errorMessage = error instanceof ApiError ? (error.body as any).detail : error.message; } this.fetching = false; @@ -63,7 +63,7 @@ export class UmbUpgraderElement extends UmbLitElement { if (error) { this.errorMessage = - error instanceof ApiError ? error.body.detail : error.message ?? 'Unknown error, please try again'; + error instanceof ApiError ? (error.body as any).detail : error.message ?? 'Unknown error, please try again'; } else { history.pushState(null, '', 'section/content'); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/repository/item/item-repository-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/repository/item/item-repository-base.ts index d9b083893e..8fc9b78f12 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/repository/item/item-repository-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/repository/item/item-repository-base.ts @@ -36,8 +36,8 @@ export class UmbItemRepositoryBase if (!uniques) throw new Error('Uniques are missing'); await this._init; - const { data, error } = await this.#itemSource.getItems(uniques); - + const { data, error: _error } = await this.#itemSource.getItems(uniques); + const error: any = _error; if (data) { this._itemStore!.appendItems(data); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/resources/resource.controller.ts b/src/Umbraco.Web.UI.Client/src/packages/core/resources/resource.controller.ts index edbefc578b..5e62ce0486 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/resources/resource.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/resources/resource.controller.ts @@ -57,8 +57,8 @@ export class UmbResourceController extends UmbControllerBase { * If the executor function throws an error, then show the details in a notification. */ async tryExecuteAndNotify(options?: UmbNotificationOptions): Promise> { - const { data, error } = await UmbResourceController.tryExecute(this.#promise); - + const { data, error: _error } = await UmbResourceController.tryExecute(this.#promise); + const error: any = _error; if (error) { /** * Determine if we want to show a notification or just log the error to the console. diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-repository-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-repository-base.ts index 7e2ca2ccdb..01a9abb68f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-repository-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/data/tree-repository-base.ts @@ -4,6 +4,7 @@ import type { UmbTreeRepository } from './tree-repository.interface.js'; import type { UmbTreeDataSource, UmbTreeDataSourceConstructor } from './tree-data-source.interface.js'; import type { UmbTreeAncestorsOfRequestArgs } from './types.js'; import { UmbRepositoryBase } from '@umbraco-cms/backoffice/repository'; +import type { ProblemDetails } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; import type { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; @@ -55,7 +56,7 @@ export abstract class UmbTreeRepositoryBase< * @return {*} * @memberof UmbTreeRepositoryBase */ - abstract requestTreeRoot(): Promise<{ data?: TreeRootType; error?: Error }>; + abstract requestTreeRoot(): Promise<{ data?: TreeRootType; error?: ProblemDetails }>; /** * Requests root items of a tree @@ -65,8 +66,8 @@ export abstract class UmbTreeRepositoryBase< async requestRootTreeItems(args: any) { await this._init; - const { data, error } = await this._treeSource.getRootItems(args); - + const { data, error: _error } = await this._treeSource.getRootItems(args); + const error: any = _error; if (data) { this._treeStore!.appendItems(data.items); } @@ -84,8 +85,8 @@ export abstract class UmbTreeRepositoryBase< if (args.parentUnique === undefined) throw new Error('Parent unique is missing'); await this._init; - const { data, error } = await this._treeSource.getChildrenOf(args); - + const { data, error: _error } = await this._treeSource.getChildrenOf(args); + const error: any = _error; if (data) { this._treeStore!.appendItems(data.items); } @@ -103,8 +104,8 @@ export abstract class UmbTreeRepositoryBase< if (args.descendantUnique === undefined) throw new Error('Descendant unique is missing'); await this._init; - const { data, error } = await this._treeSource.getAncestorsOf(args); - + const { data, error: _error } = await this._treeSource.getAncestorsOf(args); + const error: any = _error; // TODO: implement observable for ancestor items in the store return { data, error }; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/repository/document-collection.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/repository/document-collection.server.data-source.ts index 654f500253..1b31e47ebd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/repository/document-collection.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/repository/document-collection.server.data-source.ts @@ -46,7 +46,7 @@ export class UmbDocumentCollectionServerDataSource implements UmbCollectionDataS updateDate: new Date(variant.updateDate), updater: item.updater, values: item.values.map((item) => { - return { alias: item.alias, value: item.value }; + return { alias: item.alias, value: item.value as string }; }), }; return model; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/collection/repository/media-collection.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/collection/repository/media-collection.server.data-source.ts index cecb87e09e..14331f9dfc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/collection/repository/media-collection.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/collection/repository/media-collection.server.data-source.ts @@ -38,7 +38,7 @@ export class UmbMediaCollectionServerDataSource implements UmbCollectionDataSour name: variant.name, updateDate: new Date(variant.updateDate), values: item.values.map((item) => { - return { alias: item.alias, value: item.value }; + return { alias: item.alias, value: item.value as string }; }), }; return model; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/property-editors/media-picker/property-editor-ui-media-picker.element.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/property-editors/media-picker/property-editor-ui-media-picker.element.ts index 098cef1980..25fce15f1d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/property-editors/media-picker/property-editor-ui-media-picker.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/property-editors/media-picker/property-editor-ui-media-picker.element.ts @@ -30,7 +30,7 @@ export class UmbPropertyEditorUIMediaPickerElement extends UmbLitElement impleme const validationLimit = config?.getByAlias('validationLimit'); if (!validationLimit) return; - const minMax: Record = validationLimit.value; + const minMax: Record = validationLimit.value as any; this._limitMin = minMax.min ?? 0; this._limitMax = minMax.max ?? Infinity; diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/dashboards/telemetry/dashboard-telemetry.element.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/dashboards/telemetry/dashboard-telemetry.element.ts index 3738b33a9a..237a7e1669 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/dashboards/telemetry/dashboard-telemetry.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/dashboards/telemetry/dashboard-telemetry.element.ts @@ -47,7 +47,7 @@ export class UmbDashboardTelemetryElement extends UmbLitElement { if (error) { this._buttonState = 'failed'; - this._errorMessage = error instanceof ApiError ? error.body.detail : error.message; + this._errorMessage = error instanceof ApiError ? (error.body as any).detail : error.message; return; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/components/mfa-provider-default.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/components/mfa-provider-default.element.ts index 9c735beda3..8ac35065ef 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/components/mfa-provider-default.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/components/mfa-provider-default.element.ts @@ -61,11 +61,11 @@ export class UmbMfaProviderDefaultElement extends UmbLitElement implements UmbMf this.peek('Provider name is required', 'danger'); throw new Error('Provider name is required'); } - const { data } = await tryExecuteAndNotify( + const { data: _data } = await tryExecuteAndNotify( this, UserResource.getUserCurrent2FaByProviderName({ providerName: this.providerName }), ); - + const data: any = _data; if (!data) { this.peek('No data returned', 'danger'); throw new Error('No data returned'); @@ -184,7 +184,7 @@ export class UmbMfaProviderDefaultElement extends UmbLitElement implements UmbMf } else { this._buttonState = 'failed'; if (isApiError(error)) { - if (error.body.operationStatus === 'InvalidCode') { + if ((error.body as any).operationStatus === 'InvalidCode') { this.codeField?.setCustomValidity(this.localize.term('user_2faInvalidCode')); this.codeField?.focus(); } else { diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/modals/current-user-mfa-disable-provider/current-user-mfa-disable-provider-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/modals/current-user-mfa-disable-provider/current-user-mfa-disable-provider-modal.element.ts index 709a336d2a..dc7883c7b7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/modals/current-user-mfa-disable-provider/current-user-mfa-disable-provider-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/modals/current-user-mfa-disable-provider/current-user-mfa-disable-provider-modal.element.ts @@ -109,7 +109,7 @@ export class UmbCurrentUserMfaDisableProviderModalElement extends UmbModalBaseEl } else { this._buttonState = 'failed'; if (isApiError(error)) { - if (error.body.operationStatus === 'InvalidCode') { + if ((error.body as any).operationStatus === 'InvalidCode') { this._codeInput.setCustomValidity(this.localize.term('user_2faInvalidCode')); this._codeInput.focus(); } else { From 5d63c61f0b1ee8b3409c62389d8a1d0ca4014a08 Mon Sep 17 00:00:00 2001 From: leekelleher Date: Wed, 10 Apr 2024 12:47:27 +0100 Subject: [PATCH 252/280] Updated `package.json` Uninstalled `openapi-typescript-codegen` package. Replaced the `generate:server-api` scripts with `openapi-ts` tool. --- src/Umbraco.Web.UI.Client/package-lock.json | 75 --------------------- src/Umbraco.Web.UI.Client/package.json | 10 ++- 2 files changed, 4 insertions(+), 81 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/package-lock.json b/src/Umbraco.Web.UI.Client/package-lock.json index 7c065f65e4..ef0839d650 100644 --- a/src/Umbraco.Web.UI.Client/package-lock.json +++ b/src/Umbraco.Web.UI.Client/package-lock.json @@ -63,7 +63,6 @@ "glob": "^10.3.10", "lucide-static": "^0.290.0", "msw": "^1.3.2", - "openapi-typescript-codegen": "0.25.0", "playwright-msw": "^3.0.1", "prettier": "3.2.5", "react": "^18.2.0", @@ -134,36 +133,6 @@ "node": ">=6.0.0" } }, - "node_modules/@apidevtools/json-schema-ref-parser": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", - "integrity": "sha512-GBD2Le9w2+lVFoc4vswGI/TjkNIZSVp7+9xPf+X3uidBfWnAeUWmquteSyt0+VCrhNMWj/FTABISQrD3Z/YA+w==", - "dev": true, - "dependencies": { - "@jsdevtools/ono": "^7.1.3", - "@types/json-schema": "^7.0.6", - "call-me-maybe": "^1.0.1", - "js-yaml": "^4.1.0" - } - }, - "node_modules/@apidevtools/json-schema-ref-parser/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/@apidevtools/json-schema-ref-parser/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/@aw-web-design/x-default-browser": { "version": "1.4.126", "resolved": "https://registry.npmjs.org/@aw-web-design/x-default-browser/-/x-default-browser-1.4.126.tgz", @@ -9613,12 +9582,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/call-me-maybe": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", - "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", - "dev": true - }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -10108,15 +10071,6 @@ "node": ">=12.17" } }, - "node_modules/commander": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", - "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", - "dev": true, - "engines": { - "node": ">=16" - } - }, "node_modules/common-path-prefix": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", @@ -14407,19 +14361,6 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, - "node_modules/json-schema-ref-parser": { - "version": "9.0.9", - "resolved": "https://registry.npmjs.org/json-schema-ref-parser/-/json-schema-ref-parser-9.0.9.tgz", - "integrity": "sha512-qcP2lmGy+JUoQJ4DOQeLaZDqH9qSkeGCK3suKWxJXS82dg728Mn3j97azDMaOUmJAN4uCq91LdPx4K7E8F1a7Q==", - "deprecated": "Please switch to @apidevtools/json-schema-ref-parser", - "dev": true, - "dependencies": { - "@apidevtools/json-schema-ref-parser": "9.0.9" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -16695,22 +16636,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/openapi-typescript-codegen": { - "version": "0.25.0", - "resolved": "https://registry.npmjs.org/openapi-typescript-codegen/-/openapi-typescript-codegen-0.25.0.tgz", - "integrity": "sha512-nN/TnIcGbP58qYgwEEy5FrAAjePcYgfMaCe3tsmYyTgI3v4RR9v8os14L+LEWDvV50+CmqiyTzRkKKtJeb6Ybg==", - "dev": true, - "dependencies": { - "camelcase": "^6.3.0", - "commander": "^11.0.0", - "fs-extra": "^11.1.1", - "handlebars": "^4.7.7", - "json-schema-ref-parser": "^9.0.9" - }, - "bin": { - "openapi": "bin/index.js" - } - }, "node_modules/optionator": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", diff --git a/src/Umbraco.Web.UI.Client/package.json b/src/Umbraco.Web.UI.Client/package.json index b3c6a35feb..19d46c68c3 100644 --- a/src/Umbraco.Web.UI.Client/package.json +++ b/src/Umbraco.Web.UI.Client/package.json @@ -135,9 +135,9 @@ "example": "node ./devops/example-runner/index.js", "format:fix": "npm run format -- --write", "format": "prettier 'src/**/*.ts' -- check", - "generate:server-api-local": "openapi --input ../Umbraco.Cms.Api.Management/OpenApi.json --output src/external/backend-api/src --postfixServices Resource --useOptions", - "generate:server-api-dev": "openapi --input http://localhost:11000/umbraco/swagger/management/swagger.json --output src/external/backend-api/src --postfixServices Resource --useOptions", - "generate:server-api": "openapi --input https://raw.githubusercontent.com/umbraco/Umbraco-CMS/v14/dev/src/Umbraco.Cms.Api.Management/OpenApi.json --output src/external/backend-api/src --postfixServices Resource --useOptions", + "generate:server-api-local": "openapi-ts --input ../Umbraco.Cms.Api.Management/OpenApi.json --output src/external/backend-api/src --debug true --enums typescript --lint true --postfixServices Resource --schemas false", + "generate:server-api-dev": "openapi-ts --input http://localhost:11000/umbraco/swagger/management/swagger.json --output src/external/backend-api/src --debug true --enums typescript --lint true --postfixServices Resource --schemas false", + "generate:server-api": "openapi-ts --input https://raw.githubusercontent.com/umbraco/Umbraco-CMS/v14/dev/src/Umbraco.Cms.Api.Management/OpenApi.json --output src/external/backend-api/src --debug true --enums typescript --lint true --postfixServices Resource --schemas false", "generate:icons": "node ./devops/icons/index.js", "generate:jsonschema:dist": "typescript-json-schema --required --include \"./src/packages/core/extension-registry/umbraco-package.ts\" --out dist-cms/umbraco-package-schema.json tsconfig.json UmbracoPackage", "generate:jsonschema": "typescript-json-schema --required --include \"./src/packages/core/extension-registry/*.ts\"", @@ -158,8 +158,7 @@ "generate:tsconfig": "node ./devops/tsconfig/index.js", "generate:manifest": "node ./devops/build/create-umbraco-package.js", "package:validate": "node ./devops/package/validate-exports.js", - "generate:ui-api-docs": "typedoc --options typedoc.config.js", - "openapi-ts": "openapi-ts --input https://raw.githubusercontent.com/umbraco/Umbraco-CMS/v14/dev/src/Umbraco.Cms.Api.Management/OpenApi.json --output src/external/backend-api/src --debug true --enums typescript --lint true --postfixServices Resource --schemas false" + "generate:ui-api-docs": "typedoc --options typedoc.config.js" }, "engines": { "node": ">=20.9 <21", @@ -220,7 +219,6 @@ "glob": "^10.3.10", "lucide-static": "^0.290.0", "msw": "^1.3.2", - "openapi-typescript-codegen": "0.25.0", "playwright-msw": "^3.0.1", "prettier": "3.2.5", "react": "^18.2.0", From a4b0d3fa26bbab7272cc21a25b75a9c6a1a7eb9f Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 10 Apr 2024 13:48:41 +0200 Subject: [PATCH 253/280] eslint ignore everything in the external modules folder --- src/Umbraco.Web.UI.Client/.eslintrc.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/.eslintrc.json b/src/Umbraco.Web.UI.Client/.eslintrc.json index c4bb8ffab0..acde9551ae 100644 --- a/src/Umbraco.Web.UI.Client/.eslintrc.json +++ b/src/Umbraco.Web.UI.Client/.eslintrc.json @@ -1,5 +1,5 @@ { - "ignorePatterns": ["vite.*.ts"], + "ignorePatterns": ["vite.*.ts", "src/external/**/*.ts"], "root": true, "plugins": ["import", "eslint-plugin-local-rules"], "parserOptions": { From 9abc01af52ca87946b0fae60b66dd22371a3680c Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 10 Apr 2024 14:57:50 +0200 Subject: [PATCH 254/280] remove deprecated option to rename the classes --- src/Umbraco.Web.UI.Client/package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/package.json b/src/Umbraco.Web.UI.Client/package.json index 555717a06f..7f6b95a7ec 100644 --- a/src/Umbraco.Web.UI.Client/package.json +++ b/src/Umbraco.Web.UI.Client/package.json @@ -136,9 +136,9 @@ "example": "node ./devops/example-runner/index.js", "format:fix": "npm run format -- --write", "format": "prettier 'src/**/*.ts' -- check", - "generate:server-api-local": "openapi-ts --input ../Umbraco.Cms.Api.Management/OpenApi.json --output src/external/backend-api/src --debug true --enums typescript --lint true --postfixServices Resource --schemas false", - "generate:server-api-dev": "openapi-ts --input http://localhost:11000/umbraco/swagger/management/swagger.json --output src/external/backend-api/src --debug true --enums typescript --lint true --postfixServices Resource --schemas false", - "generate:server-api": "openapi-ts --input https://raw.githubusercontent.com/umbraco/Umbraco-CMS/v14/dev/src/Umbraco.Cms.Api.Management/OpenApi.json --output src/external/backend-api/src --debug true --enums typescript --lint true --postfixServices Resource --schemas false", + "generate:server-api-local": "openapi-ts --input ../Umbraco.Cms.Api.Management/OpenApi.json --output src/external/backend-api/src --debug true --enums typescript --lint true --schemas false", + "generate:server-api-dev": "openapi-ts --input http://localhost:11000/umbraco/swagger/management/swagger.json --output src/external/backend-api/src --debug true --enums typescript --lint true --schemas false", + "generate:server-api": "openapi-ts --input https://raw.githubusercontent.com/umbraco/Umbraco-CMS/v14/dev/src/Umbraco.Cms.Api.Management/OpenApi.json --output src/external/backend-api/src --debug true --enums typescript --lint true --schemas false", "generate:icons": "node ./devops/icons/index.js", "generate:jsonschema:dist": "typescript-json-schema --required --include \"./src/packages/core/extension-registry/umbraco-package.ts\" --out dist-cms/umbraco-package-schema.json tsconfig.json UmbracoPackage", "generate:jsonschema": "typescript-json-schema --required --include \"./src/packages/core/extension-registry/*.ts\"", From 67c32b8f849e04497eacef0a2c4c8557f3ad2128 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 10 Apr 2024 14:58:03 +0200 Subject: [PATCH 255/280] generate new models --- .../external/backend-api/src/core/ApiError.ts | 4 +- .../external/backend-api/src/core/OpenAPI.ts | 2 +- .../external/backend-api/src/core/request.ts | 12 +-- .../src/external/backend-api/src/index.ts | 10 +- .../src/external/backend-api/src/services.ts | 102 +++++++++--------- 5 files changed, 65 insertions(+), 65 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/core/ApiError.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/core/ApiError.ts index b64ebf10f0..36675d288a 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/core/ApiError.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/core/ApiError.ts @@ -1,5 +1,5 @@ -import type { ApiRequestOptions } from './ApiRequestOptions.js'; -import type { ApiResult } from './ApiResult.js'; +import type { ApiRequestOptions } from './ApiRequestOptions'; +import type { ApiResult } from './ApiResult'; export class ApiError extends Error { public readonly url: string; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/core/OpenAPI.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/core/OpenAPI.ts index ae55b09447..9b20844214 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/core/OpenAPI.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/core/OpenAPI.ts @@ -1,4 +1,4 @@ -import type { ApiRequestOptions } from './ApiRequestOptions.js'; +import type { ApiRequestOptions } from './ApiRequestOptions'; type Headers = Record; type Middleware = (value: T) => T | Promise; diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/core/request.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/core/request.ts index 9244bb611f..3f2e8c9ccb 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/core/request.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/core/request.ts @@ -1,9 +1,9 @@ -import { ApiError } from './ApiError.js'; -import type { ApiRequestOptions } from './ApiRequestOptions.js'; -import type { ApiResult } from './ApiResult.js'; -import { CancelablePromise } from './CancelablePromise.js'; -import type { OnCancel } from './CancelablePromise.js'; -import type { OpenAPIConfig } from './OpenAPI.js'; +import { ApiError } from './ApiError'; +import type { ApiRequestOptions } from './ApiRequestOptions'; +import type { ApiResult } from './ApiResult'; +import { CancelablePromise } from './CancelablePromise'; +import type { OnCancel } from './CancelablePromise'; +import type { OpenAPIConfig } from './OpenAPI'; export const isString = (value: unknown): value is string => { return typeof value === 'string'; 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 9f146905e1..ee4431c51e 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 @@ -1,6 +1,6 @@ -export { ApiError } from './core/ApiError.js'; -export { CancelablePromise, CancelError } from './core/CancelablePromise.js'; -export { OpenAPI, type OpenAPIConfig } from './core/OpenAPI.js'; -export * from './models.js'; -export * from './services.js'; \ No newline at end of file +export { ApiError } from './core/ApiError'; +export { CancelablePromise, CancelError } from './core/CancelablePromise'; +export { OpenAPI, type OpenAPIConfig } from './core/OpenAPI'; +export * from './models'; +export * from './services'; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services.ts index 362c9798b4..13a7f127f5 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services.ts @@ -1,9 +1,9 @@ -import type { CancelablePromise } from './core/CancelablePromise.js'; -import { OpenAPI } from './core/OpenAPI.js'; -import { request as __request } from './core/request.js'; -import type { AuditLogData, CultureData, DataTypeData, DictionaryData, DocumentBlueprintData, DocumentTypeData, DocumentVersionData, DocumentData, DynamicRootData, HealthCheckData, HelpData, IndexerData, InstallData, LanguageData, LogViewerData, ManifestData, MediaTypeData, MediaData, MemberGroupData, MemberTypeData, MemberData, ModelsBuilderData, ObjectTypesData, PackageData, PartialViewData, PreviewData, ProfilingData, PropertyTypeData, PublishedCacheData, RedirectManagementData, RelationTypeData, RelationData, ScriptData, SearcherData, SecurityData, ServerData, StaticFileData, StylesheetData, TagData, TelemetryData, TemplateData, TemporaryFileData, UpgradeData, UserDataData, UserGroupData, UserData, WebhookData } from './models.js'; +import type { CancelablePromise } from './core/CancelablePromise'; +import { OpenAPI } from './core/OpenAPI'; +import { request as __request } from './core/request'; +import type { AuditLogData, CultureData, DataTypeData, DictionaryData, DocumentBlueprintData, DocumentTypeData, DocumentVersionData, DocumentData, DynamicRootData, HealthCheckData, HelpData, IndexerData, InstallData, LanguageData, LogViewerData, ManifestData, MediaTypeData, MediaData, MemberGroupData, MemberTypeData, MemberData, ModelsBuilderData, ObjectTypesData, PackageData, PartialViewData, PreviewData, ProfilingData, PropertyTypeData, PublishedCacheData, RedirectManagementData, RelationTypeData, RelationData, ScriptData, SearcherData, SecurityData, ServerData, StaticFileData, StylesheetData, TagData, TelemetryData, TemplateData, TemporaryFileData, UpgradeData, UserDataData, UserGroupData, UserData, WebhookData } from './models'; -export class AuditLogResource { +export class AuditLogService { /** * @returns unknown Success @@ -86,7 +86,7 @@ take } -export class CultureResource { +export class CultureService { /** * @returns unknown Success @@ -112,7 +112,7 @@ take } -export class DataTypeResource { +export class DataTypeService { /** * @returns string Created @@ -556,7 +556,7 @@ foldersOnly } -export class DictionaryResource { +export class DictionaryService { /** * @returns unknown Success @@ -845,7 +845,7 @@ take } -export class DocumentBlueprintResource { +export class DocumentBlueprintService { /** * @returns string Created @@ -1158,7 +1158,7 @@ foldersOnly } -export class DocumentTypeResource { +export class DocumentTypeService { /** * @returns string Created @@ -1626,7 +1626,7 @@ foldersOnly } -export class DocumentVersionResource { +export class DocumentVersionService { /** * @returns unknown Success @@ -1735,7 +1735,7 @@ culture } -export class DocumentResource { +export class DocumentService { /** * @returns unknown Success @@ -2652,7 +2652,7 @@ dataTypeId } -export class DynamicRootResource { +export class DynamicRootService { /** * @returns unknown Success @@ -2691,7 +2691,7 @@ export class DynamicRootResource { } -export class HealthCheckResource { +export class HealthCheckService { /** * @returns unknown Success @@ -2782,7 +2782,7 @@ take } -export class HelpResource { +export class HelpService { /** * @returns unknown Success @@ -2812,7 +2812,7 @@ baseUrl } -export class IndexerResource { +export class IndexerService { /** * @returns unknown Success @@ -2885,7 +2885,7 @@ take } -export class InstallResource { +export class InstallService { /** * @returns unknown Success @@ -2946,7 +2946,7 @@ export class InstallResource { } -export class LanguageResource { +export class LanguageService { /** * @returns unknown Success @@ -3089,7 +3089,7 @@ requestBody } -export class LogViewerResource { +export class LogViewerService { /** * @returns unknown Success @@ -3302,7 +3302,7 @@ endDate } -export class ManifestResource { +export class ManifestService { /** * @returns unknown Success @@ -3348,7 +3348,7 @@ export class ManifestResource { } -export class MediaTypeResource { +export class MediaTypeService { /** * @returns unknown Success @@ -3801,7 +3801,7 @@ foldersOnly } -export class MediaResource { +export class MediaService { /** * @returns unknown Success @@ -4404,7 +4404,7 @@ dataTypeId } -export class MemberGroupResource { +export class MemberGroupService { /** * @returns unknown Success @@ -4566,7 +4566,7 @@ take } -export class MemberTypeResource { +export class MemberTypeService { /** * @returns unknown Success @@ -4798,7 +4798,7 @@ take } -export class MemberResource { +export class MemberService { /** * @returns unknown Success @@ -5037,7 +5037,7 @@ requestBody } -export class ModelsBuilderResource { +export class ModelsBuilderService { /** * @returns string Success @@ -5088,7 +5088,7 @@ export class ModelsBuilderResource { } -export class ObjectTypesResource { +export class ObjectTypesService { /** * @returns unknown Success @@ -5114,7 +5114,7 @@ take } -export class PackageResource { +export class PackageService { /** * @returns string Success @@ -5317,7 +5317,7 @@ take } -export class PartialViewResource { +export class PartialViewService { /** * @returns unknown Success @@ -5644,7 +5644,7 @@ take } -export class PreviewResource { +export class PreviewService { /** * @returns string Success @@ -5680,7 +5680,7 @@ export class PreviewResource { } -export class ProfilingResource { +export class ProfilingService { /** * @returns unknown Success @@ -5720,7 +5720,7 @@ export class ProfilingResource { } -export class PropertyTypeResource { +export class PropertyTypeService { /** * @returns boolean Success @@ -5747,7 +5747,7 @@ propertyAlias } -export class PublishedCacheResource { +export class PublishedCacheService { /** * @returns string Success @@ -5814,7 +5814,7 @@ export class PublishedCacheResource { } -export class RedirectManagementResource { +export class RedirectManagementService { /** * @returns unknown Success @@ -5927,7 +5927,7 @@ take } -export class RelationTypeResource { +export class RelationTypeService { /** * @returns unknown Success @@ -5996,7 +5996,7 @@ take } -export class RelationResource { +export class RelationService { /** * @returns unknown Success @@ -6027,7 +6027,7 @@ take } -export class ScriptResource { +export class ScriptService { /** * @returns unknown Success @@ -6310,7 +6310,7 @@ take } -export class SearcherResource { +export class SearcherService { /** * @returns unknown Success @@ -6364,7 +6364,7 @@ take } -export class SecurityResource { +export class SecurityService { /** * @returns unknown Success @@ -6449,7 +6449,7 @@ export class SecurityResource { } -export class ServerResource { +export class ServerService { /** * @returns unknown Success @@ -6513,7 +6513,7 @@ export class ServerResource { } -export class StaticFileResource { +export class StaticFileService { /** * @returns unknown Success @@ -6604,7 +6604,7 @@ take } -export class StylesheetResource { +export class StylesheetService { /** * @returns unknown Success @@ -6887,7 +6887,7 @@ take } -export class TagResource { +export class TagService { /** * @returns unknown Success @@ -6916,7 +6916,7 @@ take } -export class TelemetryResource { +export class TelemetryService { /** * @returns unknown Success @@ -6979,7 +6979,7 @@ take } -export class TemplateResource { +export class TemplateService { /** * @returns unknown Success @@ -7239,7 +7239,7 @@ take } -export class TemporaryFileResource { +export class TemporaryFileService { /** * @returns string Created @@ -7327,7 +7327,7 @@ export class TemporaryFileResource { } -export class UpgradeResource { +export class UpgradeService { /** * @returns string Success @@ -7365,7 +7365,7 @@ export class UpgradeResource { } -export class UserDataResource { +export class UserDataService { /** * @returns string Created @@ -7461,7 +7461,7 @@ take } -export class UserGroupResource { +export class UserGroupService { /** * @returns unknown Success @@ -7680,7 +7680,7 @@ requestBody } -export class UserResource { +export class UserService { /** * @returns unknown Success @@ -8479,7 +8479,7 @@ requestBody } -export class WebhookResource { +export class WebhookService { /** * @returns unknown Success From f53486cc7129b3ee93dcb1c85f44a2c1835a2054 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 10 Apr 2024 16:03:20 +0200 Subject: [PATCH 256/280] rename resource to service --- .../.github/CONTRIBUTING.md | 8 ++++---- .../eslint/rules/no-direct-api-import.cjs | 4 ++-- .../src/apps/app/server-connection.ts | 4 ++-- .../database/installer-database.element.ts | 6 +++--- .../src/apps/installer/installer.context.ts | 4 ++-- .../src/apps/upgrader/upgrader.element.ts | 6 +++--- ...server-extension-registrator.controller.ts | 8 ++++---- .../repository/audit-log.server.data.ts | 8 ++++---- .../repository/sources/culture.server.data.ts | 4 ++-- .../temporary-file.server.data-source.ts | 8 ++++---- ...data-type-collection.server.data-source.ts | 4 ++-- .../data-type-detail.server.data-source.ts | 10 +++++----- .../data-type-duplicate.server.data-source.ts | 4 ++-- .../item/data-type-item.server.data-source.ts | 4 ++-- .../move/data-type-move.server.data-source.ts | 4 ++-- .../tree/data-type-tree.server.data-source.ts | 8 ++++---- .../data-type-folder.server.data-source.ts | 10 +++++----- ...ictionary-collection.server.data-source.ts | 4 ++-- .../dictionary-detail.server.data-source.ts | 10 +++++----- .../dictionary-export.server.data-source.ts | 4 ++-- .../dictionary-import.server.data-source.ts | 4 ++-- .../dictionary-item.server.data-source.ts | 4 ++-- .../dictionary-tree.server.data-source.ts | 8 ++++---- .../dashboard-redirect-management.element.ts | 16 +++++++-------- ...ent-type-composition.server.data-source.ts | 6 +++--- ...document-type-detail.server.data-source.ts | 10 +++++----- .../document-type-item.server.data-source.ts | 4 ++-- ...ument-type-structure.server.data-source.ts | 6 +++--- .../document-type.tree.server.data-source.ts | 8 ++++---- ...document-type-folder.server.data-source.ts | 10 +++++----- .../document-collection.server.data-source.ts | 4 ++-- .../culture-and-hostnames.server.data.ts | 6 +++--- .../repository/public-access.server.data.ts | 10 +++++----- .../sort-children-of.server.data.ts | 4 ++-- .../document-configuration.context.ts | 7 ++----- .../repository/rollback.server.data-source.ts | 10 +++++----- ...document-recycle-bin.server.data-source.ts | 10 +++++----- ...ent-recycle-bin-tree.server.data-source.ts | 8 ++++---- .../document-reference.server.data.ts | 4 ++-- .../document-detail.server.data-source.ts | 10 +++++----- .../item/document-item.server.data-source.ts | 4 ++-- .../document-publishing.server.data-source.ts | 10 +++++----- .../tree/document-tree.server.data-source.ts | 8 ++++---- .../repository/dynamic-root.server.data.ts | 4 ++-- .../dashboard-health-check.element.ts | 4 ++-- .../health-check/health-check.context.ts | 6 +++--- .../views/health-check-action.element.ts | 4 ++-- .../language-collection.server.data-source.ts | 4 ++-- .../language-detail.server.data-source.ts | 10 +++++----- .../item/language-item.server.data-source.ts | 4 ++-- .../sources/log-viewer.server.data.ts | 20 +++++++++---------- .../media-type-detail.server.data-source.ts | 10 +++++----- .../media-type-item.server.data-source.ts | 4 ++-- ...media-type-structure.server.data-source.ts | 6 +++--- .../media-type-folder.server.data-source.ts | 10 +++++----- .../media-type-tree.server.data-source.ts | 8 ++++---- .../media-collection.server.data-source.ts | 4 ++-- .../media-recycle-bin.server.data-source.ts | 10 +++++----- ...dia-recycle-bin-tree.server.data-source.ts | 8 ++++---- .../repository/media-reference.server.data.ts | 4 ++-- .../detail/media-detail.server.data-source.ts | 10 +++++----- .../item/media-item.server.data-source.ts | 4 ++-- .../tree/media-tree.server.data-source.ts | 8 ++++---- ...ber-group-collection.server.data-source.ts | 4 ++-- .../member-group-detail.server.data-source.ts | 10 +++++----- .../member-group-item.server.data-source.ts | 4 ++-- .../member-type-detail.server.data-source.ts | 10 +++++----- .../member-type-item.server.data-source.ts | 4 ++-- .../member-type-tree.server.data-source.ts | 4 ++-- .../member-collection.server.data-source.ts | 4 ++-- .../member-detail.server.data-source.ts | 10 +++++----- .../item/member-item.server.data-source.ts | 4 ++-- .../models-builder-dashboard.element.ts | 14 ++++++------- .../object-type/object-type.repository.ts | 4 ++-- ...lled-packages-section-view-item.element.ts | 4 ++-- .../repository/sources/package.server.data.ts | 20 +++++++++---------- ...tion-type-collection.server.data-source.ts | 4 ++-- ...relation-type-detail.server.data-source.ts | 4 ++-- .../relation-collection.server.data-source.ts | 4 ++-- .../views/section-view-examine-indexers.ts | 8 ++++---- .../views/section-view-examine-overview.ts | 6 +++--- .../views/section-view-examine-searchers.ts | 10 +++++----- ...dashboard-performance-profiling.element.ts | 8 ++++---- .../dashboard-published-status.element.ts | 10 +++++----- .../telemetry/dashboard-telemetry.element.ts | 8 ++++---- .../static-file-item.server.data-source.ts | 4 ++-- .../static-file-tree.server.data-source.ts | 8 ++++---- .../repository/sources/tag.server.data.ts | 4 ++-- .../create-from-snippet-modal.ts | 4 ++-- .../rename-partial-view.server.data-source.ts | 4 ++-- .../partial-view-item.server.data-source.ts | 4 ++-- .../partial-view-detail.server.data-source.ts | 10 +++++----- .../partial-view-folder.server.data-source.ts | 8 ++++---- .../partial-view-tree.server.data-source.ts | 8 ++++---- .../partial-view-workspace.context.ts | 4 ++-- .../rename-script.server.data-source.ts | 4 ++-- .../item/script-item.server.data-source.ts | 4 ++-- .../script-detail.server.data-source.ts | 10 +++++----- .../script-folder.server.data-source.ts | 8 ++++---- .../tree/script-tree.server.data-source.ts | 8 ++++---- .../rename-stylesheet.server.data-source.ts | 4 ++-- .../stylesheet-item.server.data-source.ts | 4 ++-- .../stylesheet-detail.server.data-source.ts | 10 +++++----- .../stylesheet-folder.server.data-source.ts | 8 ++++---- .../stylesheet-tree.server.data-source.ts | 8 ++++---- .../template-detail.server.data-source.ts | 10 +++++----- .../item/template-item.server.data-source.ts | 4 ++-- .../template-query.server.data-source.ts | 6 +++--- .../tree/template-tree.server.data-source.ts | 8 ++++---- .../mfa-provider-default.element.ts | 4 ++-- .../current-user.server.data-source.ts | 10 +++++----- ...ser-group-collection.server.data-source.ts | 4 ++-- .../user-group-detail.server.data-source.ts | 10 +++++----- .../user-group-item.server.data-source.ts | 4 ++-- .../user-collection.server.data-source.ts | 4 ++-- .../invite-user-server.data-source.ts | 6 +++--- .../avatar/user-avatar.server.data-source.ts | 6 +++--- ...change-user-password.server.data-source.ts | 4 ++-- .../detail/user-detail.server.data-source.ts | 10 +++++----- .../disable-user.server.data-source.ts | 4 ++-- .../enable/enable-user.server.data-source.ts | 4 ++-- .../item/user-item.server.data-source.ts | 4 ++-- .../new-user-password.server.data-source.ts | 4 ++-- .../sources/user-mfa.server.data-source.ts | 6 +++--- .../user-set-group.server.data-source.ts | 4 ++-- .../unlock/unlock-user.server.data-source.ts | 4 ++-- .../webhook-collection.server.data-source.ts | 4 ++-- 127 files changed, 420 insertions(+), 423 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/.github/CONTRIBUTING.md b/src/Umbraco.Web.UI.Client/.github/CONTRIBUTING.md index ec8849123a..3d02d924c6 100644 --- a/src/Umbraco.Web.UI.Client/.github/CONTRIBUTING.md +++ b/src/Umbraco.Web.UI.Client/.github/CONTRIBUTING.md @@ -66,16 +66,16 @@ The simplest approach is to copy over the HTML from the old backoffice into a ne **Controller** -The old AngularJS controllers will have to be converted into modern TypeScript and will have to use our new services and stores. We try to abstract as much away as possible, and mostly you will have to make API calls and let the rest of the system handle things like error handling and so on. In the case of this dashboard, we only have a few GET and POST requests. Looking at the new Management API, we find the PublishedCacheResource, which is the new API controller to serve data to the dashboard. +The old AngularJS controllers will have to be converted into modern TypeScript and will have to use our new services and stores. We try to abstract as much away as possible, and mostly you will have to make API calls and let the rest of the system handle things like error handling and so on. In the case of this dashboard, we only have a few GET and POST requests. Looking at the new Management API, we find the PublishedCacheService, which is the new API controller to serve data to the dashboard. -To make the first button work, which simply just requests a new status from the server, we must make a call to `PublishedCacheResource.getPublishedCacheStatus()`. An additional thing here is to wrap that in a friendly function called `tryExecuteAndNotify`, which is something we make available to developers to automatically handle the responses coming from the server and additionally use the Notifications to notify of any errors: +To make the first button work, which simply just requests a new status from the server, we must make a call to `PublishedCacheService.getPublishedCacheStatus()`. An additional thing here is to wrap that in a friendly function called `tryExecuteAndNotify`, which is something we make available to developers to automatically handle the responses coming from the server and additionally use the Notifications to notify of any errors: ```typescript import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; -import { PublishedCacheResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { PublishedCacheService } from '@umbraco-cms/backoffice/external/backend-api'; private _getStatus() { - const { data: status } = await tryExecuteAndNotify(this, PublishedCacheResource.getPublishedCacheStatus()); + const { data: status } = await tryExecuteAndNotify(this, PublishedCacheService.getPublishedCacheStatus()); if (status) { // we now have the status diff --git a/src/Umbraco.Web.UI.Client/devops/eslint/rules/no-direct-api-import.cjs b/src/Umbraco.Web.UI.Client/devops/eslint/rules/no-direct-api-import.cjs index efb6e7c4b0..b051ad64fa 100644 --- a/src/Umbraco.Web.UI.Client/devops/eslint/rules/no-direct-api-import.cjs +++ b/src/Umbraco.Web.UI.Client/devops/eslint/rules/no-direct-api-import.cjs @@ -11,12 +11,12 @@ module.exports = { }, create: function (context) { return { - // If methods called on *Resource classes are not already wrapped with `await tryExecuteAndNotify()`, then we should suggest to wrap them. + // If methods called on *Service classes are not already wrapped with `await tryExecuteAndNotify()`, then we should suggest to wrap them. CallExpression: function (node) { if ( node.callee.type === 'MemberExpression' && node.callee.object.type === 'Identifier' && - node.callee.object.name.endsWith('Resource') && + node.callee.object.name.endsWith('Service') && node.callee.property.type === 'Identifier' && node.callee.property.name !== 'constructor' ) { 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 d0e53c6559..d4e24cb350 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 @@ -1,4 +1,4 @@ -import { RuntimeLevelModel, ServerResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { RuntimeLevelModel, ServerService } from '@umbraco-cms/backoffice/external/backend-api'; import { UmbBooleanState } from '@umbraco-cms/backoffice/observable-api'; import { tryExecute } from '@umbraco-cms/backoffice/resources'; @@ -51,7 +51,7 @@ export class UmbServerConnection { } async #setStatus() { - const { data, error } = await tryExecute(ServerResource.getServerStatus()); + const { data, error } = await tryExecute(ServerService.getServerStatus()); if (error) { throw error; } 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 2e4409f1bb..5747fb78c7 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 @@ -9,7 +9,7 @@ import type { DatabaseSettingsPresentationModel, ProblemDetails, } from '@umbraco-cms/backoffice/external/backend-api'; -import { ApiError, InstallResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { ApiError, InstallService } from '@umbraco-cms/backoffice/external/backend-api'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { tryExecute } from '@umbraco-cms/backoffice/resources'; @@ -165,7 +165,7 @@ export class UmbInstallerDatabaseElement extends UmbLitElement { }; const { error } = await tryExecute( - InstallResource.postInstallValidateDatabase({ requestBody: databaseDetails }), + InstallService.postInstallValidateDatabase({ requestBody: databaseDetails }), ); if (error) { @@ -196,7 +196,7 @@ export class UmbInstallerDatabaseElement extends UmbLitElement { this._installerContext.nextStep(); const { error: _error } = await tryExecute( - InstallResource.postInstallSetup({ requestBody: this._installerContext.getData() }), + InstallService.postInstallSetup({ requestBody: this._installerContext.getData() }), ); const error = _error as ProblemDetails | undefined; if (error) { 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 5510d4847b..37c76e05b0 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 @@ -4,7 +4,7 @@ import type { ProblemDetails, InstallRequestModel, } from '@umbraco-cms/backoffice/external/backend-api'; -import { InstallResource, TelemetryLevelModel } from '@umbraco-cms/backoffice/external/backend-api'; +import { InstallService, TelemetryLevelModel } from '@umbraco-cms/backoffice/external/backend-api'; import { tryExecute } from '@umbraco-cms/backoffice/resources'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { UmbObjectState, UmbNumberState } from '@umbraco-cms/backoffice/observable-api'; @@ -119,7 +119,7 @@ export class UmbInstallerContext { * @memberof UmbInstallerContext */ private async _loadInstallerSettings() { - const { data, error: _error } = await tryExecute(InstallResource.getInstallSettings()); + const { data, error: _error } = await tryExecute(InstallService.getInstallSettings()); const error: any = _error; if (data) { this._settings.setValue(data); 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 54f5a14b90..26a68ea5e6 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,6 +1,6 @@ import { html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import type { UpgradeSettingsResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; -import { UpgradeResource, ApiError } from '@umbraco-cms/backoffice/external/backend-api'; +import { UpgradeService, ApiError } from '@umbraco-cms/backoffice/external/backend-api'; import { tryExecute } from '@umbraco-cms/backoffice/resources'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; @@ -43,7 +43,7 @@ export class UmbUpgraderElement extends UmbLitElement { private async _setup() { this.fetching = true; - const { data, error } = await tryExecute(UpgradeResource.getUpgradeSettings()); + const { data, error } = await tryExecute(UpgradeService.getUpgradeSettings()); if (data) { this.upgradeSettings = data; @@ -59,7 +59,7 @@ export class UmbUpgraderElement extends UmbLitElement { this.errorMessage = ''; this.upgrading = true; - const { error } = await tryExecute(UpgradeResource.postUpgradeAuthorize()); + const { error } = await tryExecute(UpgradeService.postUpgradeAuthorize()); if (error) { this.errorMessage = diff --git a/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/server-extension-registrator.controller.ts b/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/server-extension-registrator.controller.ts index a20359fd72..d582f2f307 100644 --- a/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/server-extension-registrator.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/libs/extension-api/controller/server-extension-registrator.controller.ts @@ -1,6 +1,6 @@ import type { ManifestBase } from '../types/index.js'; import { isManifestBaseType } from '../type-guards/index.js'; -import { OpenAPI, ManifestResource, type ManifestResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; +import { OpenAPI, ManifestService, type ManifestResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import type { UmbBackofficeExtensionRegistry } from '@umbraco-cms/backoffice/extension-registry'; @@ -22,7 +22,7 @@ export class UmbServerExtensionRegistrator extends UmbControllerBase { * @remark Users must have the BACKOFFICE_ACCESS permission to access this method. */ public async registerAllExtensions() { - const { data: packages } = await tryExecuteAndNotify(this, ManifestResource.getManifestManifest()); + const { data: packages } = await tryExecuteAndNotify(this, ManifestService.getManifestManifest()); if (packages) { await this.#loadServerPackages(packages); } @@ -34,7 +34,7 @@ export class UmbServerExtensionRegistrator extends UmbControllerBase { * @remark Users must have the BACKOFFICE_ACCESS permission to access this method. */ public async registerPrivateExtensions() { - const { data: packages } = await tryExecuteAndNotify(this, ManifestResource.getManifestManifestPrivate()); + const { data: packages } = await tryExecuteAndNotify(this, ManifestService.getManifestManifestPrivate()); if (packages) { await this.#loadServerPackages(packages); } @@ -46,7 +46,7 @@ export class UmbServerExtensionRegistrator extends UmbControllerBase { * @remark Any user can access this method without any permissions. */ public async registerPublicExtensions() { - const { data: packages } = await tryExecuteAndNotify(this, ManifestResource.getManifestManifestPublic()); + const { data: packages } = await tryExecuteAndNotify(this, ManifestService.getManifestManifestPublic()); if (packages) { await this.#loadServerPackages(packages); } 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 e3e365046f..634ee8eeef 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,5 +1,5 @@ import type { DirectionModel, AuditTypeModel } from '@umbraco-cms/backoffice/external/backend-api'; -import { AuditLogResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { AuditLogService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -39,7 +39,7 @@ export class UmbAuditLogServerDataSource { }) { return await tryExecuteAndNotify( this.#host, - AuditLogResource.getAuditLog({ orderDirection, sinceDate, skip, take }), + AuditLogService.getAuditLog({ orderDirection, sinceDate, skip, take }), ); } @@ -58,7 +58,7 @@ export class UmbAuditLogServerDataSource { }) { return await tryExecuteAndNotify( this.#host, - AuditLogResource.getAuditLogById({ id, orderDirection, sinceDate, skip, take }), + AuditLogService.getAuditLogById({ id, orderDirection, sinceDate, skip, take }), ); } @@ -75,7 +75,7 @@ export class UmbAuditLogServerDataSource { }) { return await tryExecuteAndNotify( this.#host, - AuditLogResource.getAuditLogTypeByLogType({ logType, sinceDate, skip, take }), + AuditLogService.getAuditLogTypeByLogType({ logType, sinceDate, skip, take }), ); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/culture/repository/sources/culture.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/core/culture/repository/sources/culture.server.data.ts index d7cca0cc46..7ac0ac1a6f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/culture/repository/sources/culture.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/culture/repository/sources/culture.server.data.ts @@ -1,5 +1,5 @@ import type { UmbCultureDataSource } from './index.js'; -import { CultureResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { CultureService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -27,6 +27,6 @@ export class UmbCultureServerDataSource implements UmbCultureDataSource { * @memberof UmbLanguageServerDataSource */ async getCollection({ skip, take }: { skip: number; take: number }) { - return tryExecuteAndNotify(this.#host, CultureResource.getCulture({ skip, take })); + return tryExecuteAndNotify(this.#host, CultureService.getCulture({ skip, take })); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/temporary-file/temporary-file.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/core/temporary-file/temporary-file.server.data-source.ts index 02d0335653..c5393ee8ff 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/temporary-file/temporary-file.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/temporary-file/temporary-file.server.data-source.ts @@ -1,4 +1,4 @@ -import { TemporaryFileResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { TemporaryFileService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -30,7 +30,7 @@ export class UmbTemporaryFileServerDataSource { async create(id: string, file: File) { return tryExecuteAndNotify( this.#host, - TemporaryFileResource.postTemporaryFile({ + TemporaryFileService.postTemporaryFile({ formData: { Id: id, File: file, @@ -47,7 +47,7 @@ export class UmbTemporaryFileServerDataSource { */ read(id: string) { if (!id) throw new Error('Id is missing'); - return tryExecuteAndNotify(this.#host, TemporaryFileResource.getTemporaryFileById({ id })); + return tryExecuteAndNotify(this.#host, TemporaryFileService.getTemporaryFileById({ id })); } /** @@ -58,6 +58,6 @@ export class UmbTemporaryFileServerDataSource { */ delete(id: string) { if (!id) throw new Error('Id is missing'); - return tryExecuteAndNotify(this.#host, TemporaryFileResource.deleteTemporaryFileById({ id })); + return tryExecuteAndNotify(this.#host, TemporaryFileService.deleteTemporaryFileById({ id })); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/collection/repository/data-type-collection.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/collection/repository/data-type-collection.server.data-source.ts index 558131b3e8..d323766736 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/collection/repository/data-type-collection.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/collection/repository/data-type-collection.server.data-source.ts @@ -1,7 +1,7 @@ import type { UmbDataTypeCollectionFilterModel } from '../types.js'; import type { UmbDataTypeItemModel } from '../../repository/index.js'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; -import { DataTypeResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { DataTypeService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbCollectionDataSource } from '@umbraco-cms/backoffice/collection'; import type { DataTypeItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; @@ -39,7 +39,7 @@ export class UmbDataTypeCollectionServerDataSource implements UmbCollectionDataS * @DataTypeof UmbDataTypeCollectionServerDataSource */ async getCollection(filter: UmbDataTypeCollectionFilterModel) { - const { data, error } = await tryExecuteAndNotify(this.#host, DataTypeResource.getFilterDataType(filter)); + const { data, error } = await tryExecuteAndNotify(this.#host, DataTypeService.getFilterDataType(filter)); if (error) { return { error }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/detail/data-type-detail.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/detail/data-type-detail.server.data-source.ts index 67d697e9eb..0fbed19899 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/detail/data-type-detail.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/detail/data-type-detail.server.data-source.ts @@ -6,7 +6,7 @@ import type { CreateDataTypeRequestModel, UpdateDataTypeRequestModel, } from '@umbraco-cms/backoffice/external/backend-api'; -import { DataTypeResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { DataTypeService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -57,7 +57,7 @@ export class UmbDataTypeServerDataSource implements UmbDetailDataSource) => DataTypeResource.getItemDataType({ id: uniques }); +const getItems = (uniques: Array) => DataTypeService.getItemDataType({ id: uniques }); const mapper = (item: DataTypeItemResponseModel): UmbDataTypeItemModel => { return { diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/move/data-type-move.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/move/data-type-move.server.data-source.ts index bcbe3a9b25..8152c3e0c5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/move/data-type-move.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/repository/move/data-type-move.server.data-source.ts @@ -1,4 +1,4 @@ -import { DataTypeResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { DataTypeService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; import type { UmbMoveDataSource } from '@umbraco-cms/backoffice/repository'; @@ -33,7 +33,7 @@ export class UmbDataTypeMoveServerDataSource implements UmbMoveDataSource { return tryExecuteAndNotify( this.#host, - DataTypeResource.putDataTypeByIdMove({ + DataTypeService.putDataTypeByIdMove({ id: unique, requestBody: { target: targetUnique ? { id: targetUnique } : null, diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/data-type-tree.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/data-type-tree.server.data-source.ts index 8063d1407f..add7e96529 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/data-type-tree.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/data-type-tree.server.data-source.ts @@ -6,7 +6,7 @@ import type { } from '@umbraco-cms/backoffice/tree'; import { UmbTreeServerDataSourceBase } from '@umbraco-cms/backoffice/tree'; import type { DataTypeTreeItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; -import { DataTypeResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { DataTypeService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { type ManifestPropertyEditorUi, umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; @@ -45,7 +45,7 @@ export class UmbDataTypeTreeServerDataSource extends UmbTreeServerDataSourceBase const getRootItems = async (args: UmbTreeRootItemsRequestArgs) => { // eslint-disable-next-line local-rules/no-direct-api-import - return DataTypeResource.getTreeDataTypeRoot({ skip: args.skip, take: args.take }); + return DataTypeService.getTreeDataTypeRoot({ skip: args.skip, take: args.take }); }; const getChildrenOf = (args: UmbTreeChildrenOfRequestArgs) => { @@ -53,7 +53,7 @@ const getChildrenOf = (args: UmbTreeChildrenOfRequestArgs) => { return getRootItems(args); } else { // eslint-disable-next-line local-rules/no-direct-api-import - return DataTypeResource.getTreeDataTypeChildren({ + return DataTypeService.getTreeDataTypeChildren({ parentId: args.parentUnique, skip: args.skip, take: args.take, @@ -63,7 +63,7 @@ const getChildrenOf = (args: UmbTreeChildrenOfRequestArgs) => { const getAncestorsOf = (args: UmbTreeAncestorsOfRequestArgs) => // eslint-disable-next-line local-rules/no-direct-api-import - DataTypeResource.getTreeDataTypeAncestors({ + DataTypeService.getTreeDataTypeAncestors({ descendantId: args.descendantUnique, }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/folder/data-type-folder.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/folder/data-type-folder.server.data-source.ts index e5f5be8799..2068a8ac25 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/folder/data-type-folder.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/tree/folder/data-type-folder.server.data-source.ts @@ -1,5 +1,5 @@ import type { UmbCreateFolderModel, UmbFolderDataSource, UmbUpdateFolderModel } from '@umbraco-cms/backoffice/tree'; -import { DataTypeResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { DataTypeService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -32,7 +32,7 @@ export class UmbDataTypeFolderServerDataSource implements UmbFolderDataSource { const { data, error } = await tryExecuteAndNotify( this.#host, - DataTypeResource.getDataTypeFolderById({ + DataTypeService.getDataTypeFolderById({ id: unique, }), ); @@ -67,7 +67,7 @@ export class UmbDataTypeFolderServerDataSource implements UmbFolderDataSource { const { error } = await tryExecuteAndNotify( this.#host, - DataTypeResource.postDataTypeFolder({ + DataTypeService.postDataTypeFolder({ requestBody, }), ); @@ -91,7 +91,7 @@ export class UmbDataTypeFolderServerDataSource implements UmbFolderDataSource { const { error } = await tryExecuteAndNotify( this.#host, - DataTypeResource.putDataTypeFolderById({ + DataTypeService.putDataTypeFolderById({ id: args.unique, requestBody: { name: args.name }, }), @@ -114,7 +114,7 @@ export class UmbDataTypeFolderServerDataSource implements UmbFolderDataSource { if (!unique) throw new Error('Unique is missing'); return tryExecuteAndNotify( this.#host, - DataTypeResource.deleteDataTypeFolderById({ + DataTypeService.deleteDataTypeFolderById({ id: unique, }), ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/collection/repository/dictionary-collection.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/collection/repository/dictionary-collection.server.data-source.ts index f1c9e01e53..b19167af1a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/dictionary/collection/repository/dictionary-collection.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/collection/repository/dictionary-collection.server.data-source.ts @@ -1,7 +1,7 @@ import type { UmbDictionaryCollectionFilterModel, UmbDictionaryCollectionModel } from '../types.js'; import { UMB_DICTIONARY_ENTITY_TYPE } from '../../entity.js'; import type { UmbCollectionDataSource } from '@umbraco-cms/backoffice/collection'; -import { DictionaryResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { DictionaryService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -30,7 +30,7 @@ export class UmbDictionaryCollectionServerDataSource implements UmbCollectionDat * @memberof UmbDictionaryCollectionServerDataSource */ async getCollection(filter: UmbDictionaryCollectionFilterModel) { - const { data, error } = await tryExecuteAndNotify(this.#host, DictionaryResource.getDictionary(filter)); + const { data, error } = await tryExecuteAndNotify(this.#host, DictionaryService.getDictionary(filter)); if (data) { const items = data.items.map((item) => { diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/repository/detail/dictionary-detail.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/repository/detail/dictionary-detail.server.data-source.ts index a41b6389f8..e77fa63992 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/dictionary/repository/detail/dictionary-detail.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/repository/detail/dictionary-detail.server.data-source.ts @@ -6,7 +6,7 @@ import type { CreateDictionaryItemRequestModel, UpdateDictionaryItemRequestModel, } from '@umbraco-cms/backoffice/external/backend-api'; -import { DictionaryResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { DictionaryService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -53,7 +53,7 @@ export class UmbDictionaryServerDataSource implements UmbDetailDataSource) => DictionaryResource.getItemDictionary({ id: uniques }); +const getItems = (uniques: Array) => DictionaryService.getItemDictionary({ id: uniques }); const mapper = (item: DictionaryItemItemResponseModel): UmbDictionaryItemModel => { return { diff --git a/src/Umbraco.Web.UI.Client/src/packages/dictionary/tree/dictionary-tree.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/dictionary/tree/dictionary-tree.server.data-source.ts index 3cc46577e0..626ae02e76 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/dictionary/tree/dictionary-tree.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/dictionary/tree/dictionary-tree.server.data-source.ts @@ -8,7 +8,7 @@ import type { import { UmbTreeServerDataSourceBase } from '@umbraco-cms/backoffice/tree'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import type { NamedEntityTreeItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; -import { DictionaryResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { DictionaryService } from '@umbraco-cms/backoffice/external/backend-api'; /** * A data source for the Dictionary tree that fetches data from the server @@ -37,14 +37,14 @@ export class UmbDictionaryTreeServerDataSource extends UmbTreeServerDataSourceBa const getRootItems = (args: UmbTreeRootItemsRequestArgs) => // eslint-disable-next-line local-rules/no-direct-api-import - DictionaryResource.getTreeDictionaryRoot({ skip: args.skip, take: args.take }); + DictionaryService.getTreeDictionaryRoot({ skip: args.skip, take: args.take }); const getChildrenOf = (args: UmbTreeChildrenOfRequestArgs) => { if (args.parentUnique === null) { return getRootItems(args); } else { // eslint-disable-next-line local-rules/no-direct-api-import - return DictionaryResource.getTreeDictionaryChildren({ + return DictionaryService.getTreeDictionaryChildren({ parentId: args.parentUnique, skip: args.skip, take: args.take, @@ -54,7 +54,7 @@ const getChildrenOf = (args: UmbTreeChildrenOfRequestArgs) => { const getAncestorsOf = (args: UmbTreeAncestorsOfRequestArgs) => // eslint-disable-next-line local-rules/no-direct-api-import - DictionaryResource.getTreeDictionaryAncestors({ + DictionaryService.getTreeDictionaryAncestors({ descendantId: args.descendantUnique, }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/dashboards/redirect-management/dashboard-redirect-management.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/dashboards/redirect-management/dashboard-redirect-management.element.ts index 55c4451cfd..227cf67cca 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/dashboards/redirect-management/dashboard-redirect-management.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/dashboards/redirect-management/dashboard-redirect-management.element.ts @@ -3,7 +3,7 @@ import { css, html, nothing, customElement, state, query, property } from '@umbr import { umbConfirmModal } from '@umbraco-cms/backoffice/modal'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import type { RedirectUrlResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; -import { RedirectManagementResource, RedirectStatusModel } from '@umbraco-cms/backoffice/external/backend-api'; +import { RedirectManagementService, RedirectStatusModel } from '@umbraco-cms/backoffice/external/backend-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; @@ -43,7 +43,7 @@ export class UmbDashboardRedirectManagementElement extends UmbLitElement { } async #getTrackerStatus() { - const { data } = await tryExecuteAndNotify(this, RedirectManagementResource.getRedirectManagementStatus()); + const { data } = await tryExecuteAndNotify(this, RedirectManagementService.getRedirectManagementStatus()); if (data && data.status) this._trackerEnabled = data.status === RedirectStatusModel.ENABLED ? true : false; } @@ -52,7 +52,7 @@ export class UmbDashboardRedirectManagementElement extends UmbLitElement { const skip = this.page * this.itemsPerPage - this.itemsPerPage; const { data } = await tryExecuteAndNotify( this, - RedirectManagementResource.getRedirectManagement({ filter, take: this.itemsPerPage, skip }), + RedirectManagementService.getRedirectManagement({ filter, take: this.itemsPerPage, skip }), ); if (!data) return; @@ -89,7 +89,7 @@ export class UmbDashboardRedirectManagementElement extends UmbLitElement { this.#redirectDelete(data.id!); } async #redirectDelete(id: string) { - const { error } = await tryExecuteAndNotify(this, RedirectManagementResource.deleteRedirectManagementById({ id })); + const { error } = await tryExecuteAndNotify(this, RedirectManagementService.deleteRedirectManagementById({ id })); if (error) return; this._redirectData = this._redirectData?.filter((x) => x.id !== id); @@ -129,7 +129,7 @@ export class UmbDashboardRedirectManagementElement extends UmbLitElement { const status = this._trackerEnabled ? RedirectStatusModel.DISABLED : RedirectStatusModel.ENABLED; const { error } = await tryExecuteAndNotify( this, - RedirectManagementResource.postRedirectManagementStatus({ status }), + RedirectManagementService.postRedirectManagementStatus({ status }), ); if (error) return; this._trackerEnabled = !this._trackerEnabled; @@ -173,10 +173,10 @@ export class UmbDashboardRedirectManagementElement extends UmbLitElement { ${this._redirectData?.length ? html` ${this._trackerEnabled ? '' : html`
`} ${this.#renderTable()} -
` + ` : this._filter !== undefined - ? this.#renderZeroResults() - : this.#renderNoRedirects()} + ? this.#renderZeroResults() + : this.#renderNoRedirects()} ${this.#renderPagination()}`; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/composition/document-type-composition.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/composition/document-type-composition.server.data-source.ts index e49f351ddc..0422becef4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/composition/document-type-composition.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/composition/document-type-composition.server.data-source.ts @@ -5,7 +5,7 @@ import type { } from '../../types.js'; import { type DocumentTypeCompositionRequestModel, - DocumentTypeResource, + DocumentTypeService, } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -35,7 +35,7 @@ export class UmbDocumentTypeCompositionServerDataSource { async getReferences(unique: string) { const response = await tryExecuteAndNotify( this.#host, - DocumentTypeResource.getDocumentTypeByIdCompositionReferences({ id: unique }), + DocumentTypeService.getDocumentTypeByIdCompositionReferences({ id: unique }), ); const error = response.error; const data: Array | undefined = response.data?.map((reference) => { @@ -64,7 +64,7 @@ export class UmbDocumentTypeCompositionServerDataSource { const response = await tryExecuteAndNotify( this.#host, - DocumentTypeResource.postDocumentTypeAvailableCompositions({ requestBody }), + DocumentTypeService.postDocumentTypeAvailableCompositions({ requestBody }), ); const error = response.error; const data: Array | undefined = response.data?.map((composition) => { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/detail/document-type-detail.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/detail/document-type-detail.server.data-source.ts index 1d6e7f12a3..23019e7fa2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/detail/document-type-detail.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/detail/document-type-detail.server.data-source.ts @@ -6,7 +6,7 @@ import type { CreateDocumentTypeRequestModel, UpdateDocumentTypeRequestModel, } from '@umbraco-cms/backoffice/external/backend-api'; -import { DocumentTypeResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { DocumentTypeService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; import type { UmbPropertyTypeContainerModel } from '@umbraco-cms/backoffice/content-type'; @@ -76,7 +76,7 @@ export class UmbDocumentTypeDetailServerDataSource implements UmbDetailDataSourc const { data, error } = await tryExecuteAndNotify( this.#host, - DocumentTypeResource.getDocumentTypeById({ id: unique }), + DocumentTypeService.getDocumentTypeById({ id: unique }), ); if (error || !data) { @@ -190,7 +190,7 @@ export class UmbDocumentTypeDetailServerDataSource implements UmbDetailDataSourc const { data, error } = await tryExecuteAndNotify( this.#host, - DocumentTypeResource.postDocumentType({ + DocumentTypeService.postDocumentType({ requestBody, }), ); @@ -257,7 +257,7 @@ export class UmbDocumentTypeDetailServerDataSource implements UmbDetailDataSourc const { error } = await tryExecuteAndNotify( this.#host, - DocumentTypeResource.putDocumentTypeById({ + DocumentTypeService.putDocumentTypeById({ id: model.unique, requestBody, }), @@ -281,7 +281,7 @@ export class UmbDocumentTypeDetailServerDataSource implements UmbDetailDataSourc return tryExecuteAndNotify( this.#host, - DocumentTypeResource.deleteDocumentTypeById({ + DocumentTypeService.deleteDocumentTypeById({ id: unique, }), ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/item/document-type-item.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/item/document-type-item.server.data-source.ts index 608de5c6d7..3c14064764 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/item/document-type-item.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/item/document-type-item.server.data-source.ts @@ -1,7 +1,7 @@ import type { UmbDocumentTypeItemModel } from './types.js'; import { UmbItemServerDataSourceBase } from '@umbraco-cms/backoffice/repository'; import type { DocumentTypeItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; -import { DocumentTypeResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { DocumentTypeService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; /** @@ -25,7 +25,7 @@ export class UmbDocumentTypeItemServerDataSource extends UmbItemServerDataSource } /* eslint-disable local-rules/no-direct-api-import */ -const getItems = (uniques: Array) => DocumentTypeResource.getItemDocumentType({ id: uniques }); +const getItems = (uniques: Array) => DocumentTypeService.getItemDocumentType({ id: uniques }); const mapper = (item: DocumentTypeItemResponseModel): UmbDocumentTypeItemModel => { return { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/structure/document-type-structure.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/structure/document-type-structure.server.data-source.ts index 1a4dc8b280..aead8f5ff7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/structure/document-type-structure.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/repository/structure/document-type-structure.server.data-source.ts @@ -1,6 +1,6 @@ import type { UmbAllowedDocumentTypeModel } from './types.js'; import type { AllowedDocumentTypeModel } from '@umbraco-cms/backoffice/external/backend-api'; -import { DocumentTypeResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { DocumentTypeService } from '@umbraco-cms/backoffice/external/backend-api'; import { UmbContentTypeStructureServerDataSourceBase } from '@umbraco-cms/backoffice/content-type'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; @@ -22,10 +22,10 @@ export class UmbDocumentTypeStructureServerDataSource extends UmbContentTypeStru const getAllowedChildrenOf = (unique: string | null) => { if (unique) { // eslint-disable-next-line local-rules/no-direct-api-import - return DocumentTypeResource.getDocumentTypeByIdAllowedChildren({ id: unique }); + return DocumentTypeService.getDocumentTypeByIdAllowedChildren({ id: unique }); } else { // eslint-disable-next-line local-rules/no-direct-api-import - return DocumentTypeResource.getDocumentTypeAllowedAtRoot({}); + return DocumentTypeService.getDocumentTypeAllowedAtRoot({}); } }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/document-type.tree.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/document-type.tree.server.data-source.ts index 6988ebde67..f8df358f0f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/document-type.tree.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/document-type.tree.server.data-source.ts @@ -7,7 +7,7 @@ import type { } from '@umbraco-cms/backoffice/tree'; import { UmbTreeServerDataSourceBase } from '@umbraco-cms/backoffice/tree'; import type { DocumentTypeTreeItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; -import { DocumentTypeResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { DocumentTypeService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; /** @@ -37,14 +37,14 @@ export class UmbDocumentTypeTreeServerDataSource extends UmbTreeServerDataSource const getRootItems = (args: UmbTreeRootItemsRequestArgs) => // eslint-disable-next-line local-rules/no-direct-api-import - DocumentTypeResource.getTreeDocumentTypeRoot({ skip: args.skip, take: args.take }); + DocumentTypeService.getTreeDocumentTypeRoot({ skip: args.skip, take: args.take }); const getChildrenOf = (args: UmbTreeChildrenOfRequestArgs) => { if (args.parentUnique === null) { return getRootItems({ skip: args.skip, take: args.take }); } else { // eslint-disable-next-line local-rules/no-direct-api-import - return DocumentTypeResource.getTreeDocumentTypeChildren({ + return DocumentTypeService.getTreeDocumentTypeChildren({ parentId: args.parentUnique, skip: args.skip, take: args.take, @@ -54,7 +54,7 @@ const getChildrenOf = (args: UmbTreeChildrenOfRequestArgs) => { const getAncestorsOf = (args: UmbTreeAncestorsOfRequestArgs) => // eslint-disable-next-line local-rules/no-direct-api-import - DocumentTypeResource.getTreeDocumentTypeAncestors({ + DocumentTypeService.getTreeDocumentTypeAncestors({ descendantId: args.descendantUnique, }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/folder/document-type-folder.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/folder/document-type-folder.server.data-source.ts index 5371e5c03f..03d1fcee78 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/folder/document-type-folder.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/tree/folder/document-type-folder.server.data-source.ts @@ -1,5 +1,5 @@ import type { UmbCreateFolderModel, UmbFolderDataSource, UmbUpdateFolderModel } from '@umbraco-cms/backoffice/tree'; -import { DocumentTypeResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { DocumentTypeService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -32,7 +32,7 @@ export class UmbDocumentTypeFolderServerDataSource implements UmbFolderDataSourc const { data, error } = await tryExecuteAndNotify( this.#host, - DocumentTypeResource.getDocumentTypeFolderById({ + DocumentTypeService.getDocumentTypeFolderById({ id: unique, }), ); @@ -67,7 +67,7 @@ export class UmbDocumentTypeFolderServerDataSource implements UmbFolderDataSourc const { error } = await tryExecuteAndNotify( this.#host, - DocumentTypeResource.postDocumentTypeFolder({ + DocumentTypeService.postDocumentTypeFolder({ requestBody, }), ); @@ -91,7 +91,7 @@ export class UmbDocumentTypeFolderServerDataSource implements UmbFolderDataSourc const { error } = await tryExecuteAndNotify( this.#host, - DocumentTypeResource.putDocumentTypeFolderById({ + DocumentTypeService.putDocumentTypeFolderById({ id: args.unique, requestBody: { name: args.name }, }), @@ -114,7 +114,7 @@ export class UmbDocumentTypeFolderServerDataSource implements UmbFolderDataSourc if (!unique) throw new Error('Unique is missing'); return tryExecuteAndNotify( this.#host, - DocumentTypeResource.deleteDocumentTypeFolderById({ + DocumentTypeService.deleteDocumentTypeFolderById({ id: unique, }), ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/repository/document-collection.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/repository/document-collection.server.data-source.ts index 1b31e47ebd..a4e93c3b58 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/repository/document-collection.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/repository/document-collection.server.data-source.ts @@ -1,5 +1,5 @@ import type { UmbDocumentCollectionFilterModel, UmbDocumentCollectionItemModel } from '../types.js'; -import { DirectionModel, DocumentResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { DirectionModel, DocumentService } from '@umbraco-cms/backoffice/external/backend-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; import type { DocumentCollectionResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbCollectionDataSource } from '@umbraco-cms/backoffice/collection'; @@ -28,7 +28,7 @@ export class UmbDocumentCollectionServerDataSource implements UmbCollectionDataS take: query.take ?? 100, }; - const { data, error } = await tryExecuteAndNotify(this.#host, DocumentResource.getCollectionDocumentById(params)); + const { data, error } = await tryExecuteAndNotify(this.#host, DocumentService.getCollectionDocumentById(params)); if (data) { const items = data.items.map((item: DocumentCollectionResponseModel) => { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/culture-and-hostnames/repository/culture-and-hostnames.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/culture-and-hostnames/repository/culture-and-hostnames.server.data.ts index 213f6406c0..94d47ff21f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/culture-and-hostnames/repository/culture-and-hostnames.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/culture-and-hostnames/repository/culture-and-hostnames.server.data.ts @@ -1,4 +1,4 @@ -import { DocumentResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { DocumentService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UpdateDomainsRequestModel } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -28,7 +28,7 @@ export class UmbDocumentCultureAndHostnamesServerDataSource { */ async read(unique: string) { if (!unique) throw new Error('Unique is missing'); - return tryExecuteAndNotify(this.#host, DocumentResource.getDocumentByIdDomains({ id: unique })); + return tryExecuteAndNotify(this.#host, DocumentService.getDocumentByIdDomains({ id: unique })); } /** @@ -39,6 +39,6 @@ export class UmbDocumentCultureAndHostnamesServerDataSource { */ async update(unique: string, data: UpdateDomainsRequestModel) { if (!unique) throw new Error('Unique is missing'); - return tryExecuteAndNotify(this.#host, DocumentResource.putDocumentByIdDomains({ id: unique, requestBody: data })); + return tryExecuteAndNotify(this.#host, DocumentService.putDocumentByIdDomains({ id: unique, requestBody: data })); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/repository/public-access.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/repository/public-access.server.data.ts index 41e9453d94..61d9fac657 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/repository/public-access.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/repository/public-access.server.data.ts @@ -1,4 +1,4 @@ -import { DocumentResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { DocumentService } from '@umbraco-cms/backoffice/external/backend-api'; import type { PublicAccessRequestModel } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -31,7 +31,7 @@ export class UmbDocumentPublicAccessServerDataSource { if (!unique) throw new Error('unique is missing'); return tryExecuteAndNotify( this.#host, - DocumentResource.postDocumentByIdPublicAccess({ id: unique, requestBody: data }), + DocumentService.postDocumentByIdPublicAccess({ id: unique, requestBody: data }), ); } @@ -42,7 +42,7 @@ export class UmbDocumentPublicAccessServerDataSource { */ async read(unique: string) { if (!unique) throw new Error('unique is missing'); - return tryExecuteAndNotify(this.#host, DocumentResource.getDocumentByIdPublicAccess({ id: unique })); + return tryExecuteAndNotify(this.#host, DocumentService.getDocumentByIdPublicAccess({ id: unique })); } /** @@ -53,7 +53,7 @@ export class UmbDocumentPublicAccessServerDataSource { */ async update(unique: string, requestBody: PublicAccessRequestModel) { if (!unique) throw new Error('unique is missing'); - return tryExecuteAndNotify(this.#host, DocumentResource.putDocumentByIdPublicAccess({ id: unique, requestBody })); + return tryExecuteAndNotify(this.#host, DocumentService.putDocumentByIdPublicAccess({ id: unique, requestBody })); } /** @@ -63,6 +63,6 @@ export class UmbDocumentPublicAccessServerDataSource { */ async delete(unique: string) { if (!unique) throw new Error('unique is missing'); - return tryExecuteAndNotify(this.#host, DocumentResource.deleteDocumentByIdPublicAccess({ id: unique })); + return tryExecuteAndNotify(this.#host, DocumentService.deleteDocumentByIdPublicAccess({ id: unique })); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/sort-children-of/repository/sort-children-of.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/sort-children-of/repository/sort-children-of.server.data.ts index e958faa93d..d820a02ffb 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/sort-children-of/repository/sort-children-of.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/sort-children-of/repository/sort-children-of.server.data.ts @@ -1,5 +1,5 @@ import type { UmbSortChildrenOfArgs } from './types.js'; -import { DocumentResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { DocumentService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -33,7 +33,7 @@ export class UmbSortChildrenOfDocumentServerDataSource { return tryExecuteAndNotify( this.#host, - DocumentResource.putDocumentSort({ + DocumentService.putDocumentSort({ requestBody: { parent: args.unique ? { id: args.unique } : null, sorting: sortingMapping, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/global-contexts/document-configuration.context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/global-contexts/document-configuration.context.ts index c7d28e8905..b69994d8a9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/global-contexts/document-configuration.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/global-contexts/document-configuration.context.ts @@ -2,10 +2,7 @@ import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; -import { - DocumentResource, - type DocumentConfigurationResponseModel, -} from '@umbraco-cms/backoffice/external/backend-api'; +import { DocumentService, type DocumentConfigurationResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; // TODO: Turn this into a Repository with a Store that holds the cache [NL] @@ -37,7 +34,7 @@ export class UmbDocumentConfigurationContext extends UmbControllerBase implement * @returns A promise that resolves to the document configuration, or null if the configuration could not be fetched. */ async fetchDocumentConfiguration() { - const { data } = await tryExecuteAndNotify(this, DocumentResource.getDocumentConfiguration()); + const { data } = await tryExecuteAndNotify(this, DocumentService.getDocumentConfiguration()); return data ?? null; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/repository/rollback.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/repository/rollback.server.data-source.ts index 2344bdf802..9d2837a7c0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/repository/rollback.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/modals/rollback/repository/rollback.server.data-source.ts @@ -1,5 +1,5 @@ import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import { DocumentVersionResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { DocumentVersionService } from '@umbraco-cms/backoffice/external/backend-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; /** @@ -26,7 +26,7 @@ export class UmbRollbackServerDataSource { * @memberof UmbRollbackServerDataSource */ getVersionsByDocumentId(id: string, culture?: string) { - return tryExecuteAndNotify(this.#host, DocumentVersionResource.getDocumentVersion({ documentId: id, culture })); + return tryExecuteAndNotify(this.#host, DocumentVersionService.getDocumentVersion({ documentId: id, culture })); } /** @@ -35,20 +35,20 @@ export class UmbRollbackServerDataSource { * @memberof UmbRollbackServerDataSource */ getVersionById(versionId: string) { - return tryExecuteAndNotify(this.#host, DocumentVersionResource.getDocumentVersionById({ id: versionId })); + return tryExecuteAndNotify(this.#host, DocumentVersionService.getDocumentVersionById({ id: versionId })); } setPreventCleanup(versionId: string, preventCleanup: boolean) { return tryExecuteAndNotify( this.#host, - DocumentVersionResource.putDocumentVersionByIdPreventCleanup({ id: versionId, preventCleanup }), + DocumentVersionService.putDocumentVersionByIdPreventCleanup({ id: versionId, preventCleanup }), ); } rollback(versionId: string, culture?: string) { return tryExecuteAndNotify( this.#host, - DocumentVersionResource.postDocumentVersionByIdRollback({ id: versionId, culture }), + DocumentVersionService.postDocumentVersionByIdRollback({ id: versionId, culture }), ); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle-bin.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle-bin.server.data-source.ts index 7c8dda0721..4db3dbe660 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle-bin.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/repository/document-recycle-bin.server.data-source.ts @@ -5,7 +5,7 @@ import type { UmbRecycleBinOriginalParentRequestArgs, } from '@umbraco-cms/backoffice/recycle-bin'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import { DocumentResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { DocumentService } from '@umbraco-cms/backoffice/external/backend-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; export class UmbDocumentRecycleBinServerDataSource implements UmbRecycleBinDataSource { @@ -16,13 +16,13 @@ export class UmbDocumentRecycleBinServerDataSource implements UmbRecycleBinDataS } trash(args: UmbRecycleBinTrashRequestArgs) { - return tryExecuteAndNotify(this.#host, DocumentResource.putDocumentByIdMoveToRecycleBin({ id: args.unique })); + return tryExecuteAndNotify(this.#host, DocumentService.putDocumentByIdMoveToRecycleBin({ id: args.unique })); } restore(args: UmbRecycleBinRestoreRequestArgs) { return tryExecuteAndNotify( this.#host, - DocumentResource.putRecycleBinDocumentByIdRestore({ + DocumentService.putRecycleBinDocumentByIdRestore({ id: args.unique, requestBody: { target: args.destination.unique ? { id: args.destination.unique } : null, @@ -32,13 +32,13 @@ export class UmbDocumentRecycleBinServerDataSource implements UmbRecycleBinDataS } empty() { - return tryExecuteAndNotify(this.#host, DocumentResource.deleteRecycleBinDocument()); + return tryExecuteAndNotify(this.#host, DocumentService.deleteRecycleBinDocument()); } async getOriginalParent(args: UmbRecycleBinOriginalParentRequestArgs) { const { data, error } = await tryExecuteAndNotify( this.#host, - DocumentResource.getRecycleBinDocumentByIdOriginalParent({ id: args.unique }), + DocumentService.getRecycleBinDocumentByIdOriginalParent({ id: args.unique }), ); // only check for undefined because data can be null if the parent is the root diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/document-recycle-bin-tree.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/document-recycle-bin-tree.server.data-source.ts index 4fa19adbd0..45adeddff3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/document-recycle-bin-tree.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/recycle-bin/tree/document-recycle-bin-tree.server.data-source.ts @@ -1,7 +1,7 @@ import { UMB_DOCUMENT_ENTITY_TYPE } from '../../entity.js'; import type { UmbDocumentRecycleBinTreeItemModel } from './types.js'; import type { DocumentRecycleBinItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; -import { DocumentResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { DocumentService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import type { UmbTreeAncestorsOfRequestArgs, @@ -37,14 +37,14 @@ export class UmbDocumentRecycleBinTreeServerDataSource extends UmbTreeServerData const getRootItems = (args: UmbTreeRootItemsRequestArgs) => // eslint-disable-next-line local-rules/no-direct-api-import - DocumentResource.getRecycleBinDocumentRoot({ skip: args.skip, take: args.take }); + DocumentService.getRecycleBinDocumentRoot({ skip: args.skip, take: args.take }); const getChildrenOf = (args: UmbTreeChildrenOfRequestArgs) => { if (args.parentUnique === null) { return getRootItems(args); } else { // eslint-disable-next-line local-rules/no-direct-api-import - return DocumentResource.getRecycleBinDocumentChildren({ + return DocumentService.getRecycleBinDocumentChildren({ parentId: args.parentUnique, skip: args.skip, take: args.take, @@ -54,7 +54,7 @@ const getChildrenOf = (args: UmbTreeChildrenOfRequestArgs) => { const getAncestorsOf = (args: UmbTreeAncestorsOfRequestArgs) => // eslint-disable-next-line local-rules/no-direct-api-import - DocumentResource.getTreeDocumentAncestors({ + DocumentService.getTreeDocumentAncestors({ descendantId: args.descendantUnique, }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/reference/repository/document-reference.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/reference/repository/document-reference.server.data.ts index 1b8cae5e0c..2a872130a3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/reference/repository/document-reference.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/reference/repository/document-reference.server.data.ts @@ -1,4 +1,4 @@ -import { DocumentResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { DocumentService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -26,6 +26,6 @@ export class UmbDocumentReferenceServerDataSource { * @memberof UmbDocumentReferenceServerDataSource */ async getReferencedBy(id: string, skip = 0, take = 20) { - return await tryExecuteAndNotify(this.#host, DocumentResource.getDocumentByIdReferencedBy({ id, skip, take })); + return await tryExecuteAndNotify(this.#host, DocumentService.getDocumentByIdReferencedBy({ id, skip, take })); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/detail/document-detail.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/detail/document-detail.server.data-source.ts index aa8516e2b5..82913b426a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/detail/document-detail.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/detail/document-detail.server.data-source.ts @@ -6,7 +6,7 @@ import type { CreateDocumentRequestModel, UpdateDocumentRequestModel, } from '@umbraco-cms/backoffice/external/backend-api'; -import { DocumentResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { DocumentService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -80,7 +80,7 @@ export class UmbDocumentServerDataSource implements UmbDetailDataSource) => DocumentResource.getItemDocument({ id: uniques }); +const getItems = (uniques: Array) => DocumentService.getItemDocument({ id: uniques }); const mapper = (item: DocumentItemResponseModel): UmbDocumentItemModel => { return { diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/publishing/document-publishing.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/publishing/document-publishing.server.data-source.ts index 20cc82657a..af96d59a88 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/publishing/document-publishing.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/repository/publishing/document-publishing.server.data-source.ts @@ -5,7 +5,7 @@ import type { PublishDocumentWithDescendantsRequestModel, UnpublishDocumentRequestModel, } from '@umbraco-cms/backoffice/external/backend-api'; -import { DocumentResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { DocumentService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; import type { UmbVariantId } from '@umbraco-cms/backoffice/variant'; @@ -52,7 +52,7 @@ export class UmbDocumentPublishingServerDataSource { publishSchedules, }; - return tryExecuteAndNotify(this.#host, DocumentResource.putDocumentByIdPublish({ id: unique, requestBody })); + return tryExecuteAndNotify(this.#host, DocumentService.putDocumentByIdPublish({ id: unique, requestBody })); } /** @@ -75,14 +75,14 @@ export class UmbDocumentPublishingServerDataSource { cultures: null, }; - return tryExecuteAndNotify(this.#host, DocumentResource.putDocumentByIdUnpublish({ id: unique, requestBody })); + return tryExecuteAndNotify(this.#host, DocumentService.putDocumentByIdUnpublish({ id: unique, requestBody })); } const requestBody: UnpublishDocumentRequestModel = { cultures: variantIds.map((variant) => variant.toCultureString()), }; - return tryExecuteAndNotify(this.#host, DocumentResource.putDocumentByIdUnpublish({ id: unique, requestBody })); + return tryExecuteAndNotify(this.#host, DocumentService.putDocumentByIdUnpublish({ id: unique, requestBody })); } /** @@ -103,7 +103,7 @@ export class UmbDocumentPublishingServerDataSource { return tryExecuteAndNotify( this.#host, - DocumentResource.putDocumentByIdPublishWithDescendants({ id: unique, requestBody }), + DocumentService.putDocumentByIdPublishWithDescendants({ id: unique, requestBody }), ); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/document-tree.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/document-tree.server.data-source.ts index 7ca165460b..c10981c388 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/document-tree.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/tree/document-tree.server.data-source.ts @@ -7,7 +7,7 @@ import type { } from '@umbraco-cms/backoffice/tree'; import { UmbTreeServerDataSourceBase } from '@umbraco-cms/backoffice/tree'; import type { DocumentTreeItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; -import { DocumentResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { DocumentService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; /** @@ -37,14 +37,14 @@ export class UmbDocumentTreeServerDataSource extends UmbTreeServerDataSourceBase const getRootItems = (args: UmbTreeRootItemsRequestArgs) => // eslint-disable-next-line local-rules/no-direct-api-import - DocumentResource.getTreeDocumentRoot({ skip: args.skip, take: args.take }); + DocumentService.getTreeDocumentRoot({ skip: args.skip, take: args.take }); const getChildrenOf = (args: UmbTreeChildrenOfRequestArgs) => { if (args.parentUnique === null) { return getRootItems(args); } else { // eslint-disable-next-line local-rules/no-direct-api-import - return DocumentResource.getTreeDocumentChildren({ + return DocumentService.getTreeDocumentChildren({ parentId: args.parentUnique, skip: args.skip, take: args.take, @@ -54,7 +54,7 @@ const getChildrenOf = (args: UmbTreeChildrenOfRequestArgs) => { const getAncestorsOf = (args: UmbTreeAncestorsOfRequestArgs) => // eslint-disable-next-line local-rules/no-direct-api-import - DocumentResource.getTreeDocumentAncestors({ + DocumentService.getTreeDocumentAncestors({ descendantId: args.descendantUnique, }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/dynamic-root/repository/dynamic-root.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/dynamic-root/repository/dynamic-root.server.data.ts index 9553724bdc..4cd544752f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/dynamic-root/repository/dynamic-root.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/dynamic-root/repository/dynamic-root.server.data.ts @@ -1,4 +1,4 @@ -import { DynamicRootResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { DynamicRootService } from '@umbraco-cms/backoffice/external/backend-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; import type { DynamicRootRequestModel, DynamicRootResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; @@ -19,7 +19,7 @@ export class UmbDynamicRootServerDataSource { query: args.query, }; - const { data } = await tryExecuteAndNotify(this.#host, DynamicRootResource.postDynamicRootQuery({ requestBody })); + const { data } = await tryExecuteAndNotify(this.#host, DynamicRootService.postDynamicRootQuery({ requestBody })); return data; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/health-check/dashboard-health-check.element.ts b/src/Umbraco.Web.UI.Client/src/packages/health-check/dashboard-health-check.element.ts index 42455e3a5d..2b2ab13032 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/health-check/dashboard-health-check.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/health-check/dashboard-health-check.element.ts @@ -2,7 +2,7 @@ import type { UmbDashboardHealthCheckGroupElement } from './views/health-check-g import { UmbHealthCheckDashboardContext, UMB_HEALTHCHECK_DASHBOARD_CONTEXT } from './health-check-dashboard.context.js'; import { html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import type { HealthCheckGroupResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; -import { HealthCheckResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { HealthCheckService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbRoute } from '@umbraco-cms/backoffice/router'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import type { ManifestHealthCheck } from '@umbraco-cms/backoffice/extension-registry'; @@ -43,7 +43,7 @@ export class UmbDashboardHealthCheckElement extends UmbLitElement { } #registerHealthChecks = async () => { - const { data } = await tryExecuteAndNotify(this, HealthCheckResource.getHealthCheckGroup({ skip: 0, take: 9999 })); + const { data } = await tryExecuteAndNotify(this, HealthCheckService.getHealthCheckGroup({ skip: 0, take: 9999 })); if (!data) return; const manifests = this.#createManifests(data.items); this.#register(manifests); diff --git a/src/Umbraco.Web.UI.Client/src/packages/health-check/health-check.context.ts b/src/Umbraco.Web.UI.Client/src/packages/health-check/health-check.context.ts index ba0d2a3631..8c827fbade 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/health-check/health-check.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/health-check/health-check.context.ts @@ -2,7 +2,7 @@ import type { HealthCheckGroupPresentationModel, HealthCheckGroupWithResultResponseModel, } from '@umbraco-cms/backoffice/external/backend-api'; -import { HealthCheckResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { HealthCheckService } from '@umbraco-cms/backoffice/external/backend-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; @@ -17,7 +17,7 @@ export class UmbHealthCheckContext extends UmbControllerBase implements UmbApi { public readonly results = this.#results.asObservable(); async getGroupChecks(name: string) { - const { data } = await tryExecuteAndNotify(this, HealthCheckResource.getHealthCheckGroupByName({ name })); + const { data } = await tryExecuteAndNotify(this, HealthCheckService.getHealthCheckGroupByName({ name })); if (data) { this.#checks.setValue(data); @@ -27,7 +27,7 @@ export class UmbHealthCheckContext extends UmbControllerBase implements UmbApi { } async checkGroup(name: string) { - const { data } = await tryExecuteAndNotify(this, HealthCheckResource.postHealthCheckGroupByNameCheck({ name })); + const { data } = await tryExecuteAndNotify(this, HealthCheckService.postHealthCheckGroupByNameCheck({ name })); if (data) { this.#results.setValue(data); diff --git a/src/Umbraco.Web.UI.Client/src/packages/health-check/views/health-check-action.element.ts b/src/Umbraco.Web.UI.Client/src/packages/health-check/views/health-check-action.element.ts index 9165ea0ff6..33b882d25e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/health-check/views/health-check-action.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/health-check/views/health-check-action.element.ts @@ -2,7 +2,7 @@ import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import type { UUIButtonState } from '@umbraco-cms/backoffice/external/uui'; import { css, html, nothing, customElement, property, state, ifDefined } from '@umbraco-cms/backoffice/external/lit'; import type { HealthCheckActionRequestModel } from '@umbraco-cms/backoffice/external/backend-api'; -import { HealthCheckResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { HealthCheckService } from '@umbraco-cms/backoffice/external/backend-api'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -19,7 +19,7 @@ export class UmbDashboardHealthCheckActionElement extends UmbLitElement { this._buttonState = 'waiting'; const { error } = await tryExecuteAndNotify( this, - HealthCheckResource.postHealthCheckExecuteAction({ requestBody: this.action }), + HealthCheckService.postHealthCheckExecuteAction({ requestBody: this.action }), ); if (error) { diff --git a/src/Umbraco.Web.UI.Client/src/packages/language/collection/repository/language-collection.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/language/collection/repository/language-collection.server.data-source.ts index 4e79bd47bc..7b9b341661 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/language/collection/repository/language-collection.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/language/collection/repository/language-collection.server.data-source.ts @@ -2,7 +2,7 @@ import type { UmbLanguageCollectionFilterModel } from '../types.js'; import type { UmbLanguageDetailModel } from '../../types.js'; import { UMB_LANGUAGE_ENTITY_TYPE } from '../../entity.js'; import type { UmbCollectionDataSource } from '@umbraco-cms/backoffice/collection'; -import { LanguageResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { LanguageService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -31,7 +31,7 @@ export class UmbLanguageCollectionServerDataSource implements UmbCollectionDataS * @memberof UmbLanguageCollectionServerDataSource */ async getCollection(filter: UmbLanguageCollectionFilterModel) { - const { data, error } = await tryExecuteAndNotify(this.#host, LanguageResource.getLanguage(filter)); + const { data, error } = await tryExecuteAndNotify(this.#host, LanguageService.getLanguage(filter)); if (data) { const items = data.items.map((item) => { diff --git a/src/Umbraco.Web.UI.Client/src/packages/language/repository/detail/language-detail.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/language/repository/detail/language-detail.server.data-source.ts index b7c7070d0f..46d8e93d94 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/language/repository/detail/language-detail.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/language/repository/detail/language-detail.server.data-source.ts @@ -6,7 +6,7 @@ import type { CreateLanguageRequestModel, UpdateLanguageRequestModel, } from '@umbraco-cms/backoffice/external/backend-api'; -import { LanguageResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { LanguageService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -59,7 +59,7 @@ export class UmbLanguageServerDataSource implements UmbDetailDataSource) => LanguageResource.getItemLanguage({ isoCode: uniques }); +const getItems = (uniques: Array) => LanguageService.getItemLanguage({ isoCode: uniques }); const mapper = (item: LanguageItemResponseModel): UmbLanguageItemModel => { return { diff --git a/src/Umbraco.Web.UI.Client/src/packages/log-viewer/repository/sources/log-viewer.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/log-viewer/repository/sources/log-viewer.server.data.ts index 8454adbed1..402a34696a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/log-viewer/repository/sources/log-viewer.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/log-viewer/repository/sources/log-viewer.server.data.ts @@ -4,7 +4,7 @@ import type { LogLevelModel, SavedLogSearchResponseModel, } from '@umbraco-cms/backoffice/external/backend-api'; -import { LogViewerResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { LogViewerService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -34,7 +34,7 @@ export class UmbLogSearchesServerDataSource implements LogSearchDataSource { * @memberof UmbLogSearchesServerDataSource */ async getAllSavedSearches({ skip = 0, take = 100 }: { skip?: number; take?: number }) { - return await tryExecuteAndNotify(this.#host, LogViewerResource.getLogViewerSavedSearch({ skip, take })); + return await tryExecuteAndNotify(this.#host, LogViewerService.getLogViewerSavedSearch({ skip, take })); } /** * Get a log viewer saved search by name from the server @@ -44,7 +44,7 @@ export class UmbLogSearchesServerDataSource implements LogSearchDataSource { * @memberof UmbLogSearchesServerDataSource */ async getSavedSearchByName({ name }: { name: string }) { - return await tryExecuteAndNotify(this.#host, LogViewerResource.getLogViewerSavedSearchByName({ name })); + return await tryExecuteAndNotify(this.#host, LogViewerService.getLogViewerSavedSearchByName({ name })); } /** @@ -57,7 +57,7 @@ export class UmbLogSearchesServerDataSource implements LogSearchDataSource { async postLogViewerSavedSearch({ name, query }: SavedLogSearchResponseModel) { return await tryExecuteAndNotify( this.#host, - LogViewerResource.postLogViewerSavedSearch({ requestBody: { name, query } }), + LogViewerService.postLogViewerSavedSearch({ requestBody: { name, query } }), ); } /** @@ -68,7 +68,7 @@ export class UmbLogSearchesServerDataSource implements LogSearchDataSource { * @memberof UmbLogSearchesServerDataSource */ async deleteSavedSearchByName({ name }: { name: string }) { - return await tryExecuteAndNotify(this.#host, LogViewerResource.deleteLogViewerSavedSearchByName({ name })); + return await tryExecuteAndNotify(this.#host, LogViewerService.deleteLogViewerSavedSearchByName({ name })); } } /** @@ -98,7 +98,7 @@ export class UmbLogMessagesServerDataSource implements LogMessagesDataSource { * @memberof UmbLogMessagesServerDataSource */ async getLogViewerLevel({ skip = 0, take = 100 }: { skip?: number; take?: number }) { - return await tryExecuteAndNotify(this.#host, LogViewerResource.getLogViewerLevel({ skip, take })); + return await tryExecuteAndNotify(this.#host, LogViewerService.getLogViewerLevel({ skip, take })); } /** @@ -111,7 +111,7 @@ export class UmbLogMessagesServerDataSource implements LogMessagesDataSource { async getLogViewerLevelCount({ startDate, endDate }: { startDate?: string; endDate?: string }) { return await tryExecuteAndNotify( this.#host, - LogViewerResource.getLogViewerLevelCount({ + LogViewerService.getLogViewerLevelCount({ startDate, endDate, }), @@ -159,7 +159,7 @@ export class UmbLogMessagesServerDataSource implements LogMessagesDataSource { }) { return await tryExecuteAndNotify( this.#host, - LogViewerResource.getLogViewerLog({ + LogViewerService.getLogViewerLog({ skip, take, orderDirection, @@ -200,7 +200,7 @@ export class UmbLogMessagesServerDataSource implements LogMessagesDataSource { }) { return await tryExecuteAndNotify( this.#host, - LogViewerResource.getLogViewerMessageTemplate({ + LogViewerService.getLogViewerMessageTemplate({ skip, take, startDate, @@ -212,7 +212,7 @@ export class UmbLogMessagesServerDataSource implements LogMessagesDataSource { async getLogViewerValidateLogsSize({ startDate, endDate }: { startDate?: string; endDate?: string }) { return await tryExecuteAndNotify( this.#host, - LogViewerResource.getLogViewerValidateLogsSize({ + LogViewerService.getLogViewerValidateLogsSize({ startDate, endDate, }), diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/repository/detail/media-type-detail.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/repository/detail/media-type-detail.server.data-source.ts index 2254f77db9..a8908fa616 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/repository/detail/media-type-detail.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/repository/detail/media-type-detail.server.data-source.ts @@ -6,7 +6,7 @@ import type { CreateMediaTypeRequestModel, UpdateMediaTypeRequestModel, } from '@umbraco-cms/backoffice/external/backend-api'; -import { MediaTypeResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { MediaTypeService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; import type { UmbPropertyTypeContainerModel } from '@umbraco-cms/backoffice/content-type'; @@ -67,7 +67,7 @@ export class UmbMediaTypeServerDataSource implements UmbDetailDataSource) => MediaTypeResource.getItemMediaType({ id: uniques }); +const getItems = (uniques: Array) => MediaTypeService.getItemMediaType({ id: uniques }); const mapper = (item: MediaTypeItemResponseModel): UmbMediaTypeItemModel => { return { diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/repository/structure/media-type-structure.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/repository/structure/media-type-structure.server.data-source.ts index 6dc2d1767c..22b833b379 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/repository/structure/media-type-structure.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/repository/structure/media-type-structure.server.data-source.ts @@ -2,7 +2,7 @@ import type { UmbAllowedMediaTypeModel } from './types.js'; import { UmbContentTypeStructureServerDataSourceBase } from '@umbraco-cms/backoffice/content-type'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import type { AllowedMediaTypeModel } from '@umbraco-cms/backoffice/external/backend-api'; -import { MediaTypeResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { MediaTypeService } from '@umbraco-cms/backoffice/external/backend-api'; /** * @@ -22,10 +22,10 @@ export class UmbMediaTypeStructureServerDataSource extends UmbContentTypeStructu const getAllowedChildrenOf = (unique: string | null) => { if (unique) { // eslint-disable-next-line local-rules/no-direct-api-import - return MediaTypeResource.getMediaTypeByIdAllowedChildren({ id: unique }); + return MediaTypeService.getMediaTypeByIdAllowedChildren({ id: unique }); } else { // eslint-disable-next-line local-rules/no-direct-api-import - return MediaTypeResource.getMediaTypeAllowedAtRoot({}); + return MediaTypeService.getMediaTypeAllowedAtRoot({}); } }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/tree/folder/media-type-folder.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/tree/folder/media-type-folder.server.data-source.ts index 080558d0f0..a83e9ae676 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/tree/folder/media-type-folder.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/tree/folder/media-type-folder.server.data-source.ts @@ -1,5 +1,5 @@ import type { UmbCreateFolderModel, UmbFolderDataSource, UmbUpdateFolderModel } from '@umbraco-cms/backoffice/tree'; -import { MediaTypeResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { MediaTypeService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -32,7 +32,7 @@ export class UmbMediaTypeFolderServerDataSource implements UmbFolderDataSource { const { data, error } = await tryExecuteAndNotify( this.#host, - MediaTypeResource.getMediaTypeFolderById({ + MediaTypeService.getMediaTypeFolderById({ id: unique, }), ); @@ -67,7 +67,7 @@ export class UmbMediaTypeFolderServerDataSource implements UmbFolderDataSource { const { error } = await tryExecuteAndNotify( this.#host, - MediaTypeResource.postMediaTypeFolder({ + MediaTypeService.postMediaTypeFolder({ requestBody, }), ); @@ -91,7 +91,7 @@ export class UmbMediaTypeFolderServerDataSource implements UmbFolderDataSource { const { error } = await tryExecuteAndNotify( this.#host, - MediaTypeResource.putMediaTypeFolderById({ + MediaTypeService.putMediaTypeFolderById({ id: args.unique, requestBody: { name: args.name }, }), @@ -114,7 +114,7 @@ export class UmbMediaTypeFolderServerDataSource implements UmbFolderDataSource { if (!unique) throw new Error('Unique is missing'); return tryExecuteAndNotify( this.#host, - MediaTypeResource.deleteMediaTypeFolderById({ + MediaTypeService.deleteMediaTypeFolderById({ id: unique, }), ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/tree/media-type-tree.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/tree/media-type-tree.server.data-source.ts index 203056945e..45ab65334e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/tree/media-type-tree.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/tree/media-type-tree.server.data-source.ts @@ -1,7 +1,7 @@ import { UMB_MEDIA_TYPE_ENTITY_TYPE, UMB_MEDIA_TYPE_FOLDER_ENTITY_TYPE } from '../entity.js'; import type { UmbMediaTypeTreeItemModel } from './types.js'; import type { MediaTypeTreeItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; -import { MediaTypeResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { MediaTypeService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import type { UmbTreeAncestorsOfRequestArgs, @@ -37,14 +37,14 @@ export class UmbMediaTypeTreeServerDataSource extends UmbTreeServerDataSourceBas const getRootItems = (args: UmbTreeRootItemsRequestArgs) => // eslint-disable-next-line local-rules/no-direct-api-import - MediaTypeResource.getTreeMediaTypeRoot({ skip: args.skip, take: args.take }); + MediaTypeService.getTreeMediaTypeRoot({ skip: args.skip, take: args.take }); const getChildrenOf = (args: UmbTreeChildrenOfRequestArgs) => { if (args.parentUnique === null) { return getRootItems(args); } else { // eslint-disable-next-line local-rules/no-direct-api-import - return MediaTypeResource.getTreeMediaTypeChildren({ + return MediaTypeService.getTreeMediaTypeChildren({ parentId: args.parentUnique, skip: args.skip, take: args.take, @@ -54,7 +54,7 @@ const getChildrenOf = (args: UmbTreeChildrenOfRequestArgs) => { const getAncestorsOf = (args: UmbTreeAncestorsOfRequestArgs) => // eslint-disable-next-line local-rules/no-direct-api-import - MediaTypeResource.getTreeMediaTypeAncestors({ + MediaTypeService.getTreeMediaTypeAncestors({ descendantId: args.descendantUnique, }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/collection/repository/media-collection.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/collection/repository/media-collection.server.data-source.ts index 14331f9dfc..d8a243868f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/collection/repository/media-collection.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/collection/repository/media-collection.server.data-source.ts @@ -1,5 +1,5 @@ import type { UmbMediaCollectionFilterModel, UmbMediaCollectionItemModel } from '../types.js'; -import { DirectionModel, MediaResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { DirectionModel, MediaService } from '@umbraco-cms/backoffice/external/backend-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; import type { MediaCollectionResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbCollectionDataSource } from '@umbraco-cms/backoffice/collection'; @@ -23,7 +23,7 @@ export class UmbMediaCollectionServerDataSource implements UmbCollectionDataSour take: query.take ?? 100, }; - const { data, error } = await tryExecuteAndNotify(this.#host, MediaResource.getCollectionMedia(params)); + const { data, error } = await tryExecuteAndNotify(this.#host, MediaService.getCollectionMedia(params)); if (data) { const items = data.items.map((item: MediaCollectionResponseModel) => { diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/repository/media-recycle-bin.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/repository/media-recycle-bin.server.data-source.ts index 91eedae21f..6348f879fa 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/repository/media-recycle-bin.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/repository/media-recycle-bin.server.data-source.ts @@ -5,7 +5,7 @@ import type { UmbRecycleBinOriginalParentRequestArgs, } from '@umbraco-cms/backoffice/recycle-bin'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import { MediaResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { MediaService } from '@umbraco-cms/backoffice/external/backend-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; export class UmbMediaRecycleBinServerDataSource implements UmbRecycleBinDataSource { @@ -16,13 +16,13 @@ export class UmbMediaRecycleBinServerDataSource implements UmbRecycleBinDataSour } trash(args: UmbRecycleBinTrashRequestArgs) { - return tryExecuteAndNotify(this.#host, MediaResource.putMediaByIdMoveToRecycleBin({ id: args.unique })); + return tryExecuteAndNotify(this.#host, MediaService.putMediaByIdMoveToRecycleBin({ id: args.unique })); } restore(args: UmbRecycleBinRestoreRequestArgs) { return tryExecuteAndNotify( this.#host, - MediaResource.putRecycleBinMediaByIdRestore({ + MediaService.putRecycleBinMediaByIdRestore({ id: args.unique, requestBody: { target: args.destination.unique ? { id: args.destination.unique } : null, @@ -32,13 +32,13 @@ export class UmbMediaRecycleBinServerDataSource implements UmbRecycleBinDataSour } empty() { - return tryExecuteAndNotify(this.#host, MediaResource.deleteRecycleBinMedia()); + return tryExecuteAndNotify(this.#host, MediaService.deleteRecycleBinMedia()); } async getOriginalParent(args: UmbRecycleBinOriginalParentRequestArgs) { const { data, error } = await tryExecuteAndNotify( this.#host, - MediaResource.getRecycleBinMediaByIdOriginalParent({ id: args.unique }), + MediaService.getRecycleBinMediaByIdOriginalParent({ id: args.unique }), ); // only check for undefined because data can be null if the parent is the root diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/tree/media-recycle-bin-tree.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/tree/media-recycle-bin-tree.server.data-source.ts index a9fa6bdf6c..9907d34e88 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/tree/media-recycle-bin-tree.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/recycle-bin/tree/media-recycle-bin-tree.server.data-source.ts @@ -1,7 +1,7 @@ import { UMB_MEDIA_ENTITY_TYPE } from '../../entity.js'; import type { UmbMediaRecycleBinTreeItemModel } from './types.js'; import type { MediaRecycleBinItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; -import { MediaResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { MediaService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import type { UmbTreeAncestorsOfRequestArgs, @@ -37,14 +37,14 @@ export class UmbMediaRecycleBinTreeServerDataSource extends UmbTreeServerDataSou const getRootItems = (args: UmbTreeRootItemsRequestArgs) => // eslint-disable-next-line local-rules/no-direct-api-import - MediaResource.getRecycleBinMediaRoot({ skip: args.skip, take: args.take }); + MediaService.getRecycleBinMediaRoot({ skip: args.skip, take: args.take }); const getChildrenOf = (args: UmbTreeChildrenOfRequestArgs) => { if (args.parentUnique === null) { return getRootItems(args); } else { // eslint-disable-next-line local-rules/no-direct-api-import - return MediaResource.getRecycleBinMediaChildren({ + return MediaService.getRecycleBinMediaChildren({ parentId: args.parentUnique, skip: args.skip, take: args.take, @@ -54,7 +54,7 @@ const getChildrenOf = (args: UmbTreeChildrenOfRequestArgs) => { const getAncestorsOf = (args: UmbTreeAncestorsOfRequestArgs) => // eslint-disable-next-line local-rules/no-direct-api-import - MediaResource.getTreeMediaAncestors({ + MediaService.getTreeMediaAncestors({ descendantId: args.descendantUnique, }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/reference/repository/media-reference.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/reference/repository/media-reference.server.data.ts index b8f1177398..7def339e28 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/reference/repository/media-reference.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/reference/repository/media-reference.server.data.ts @@ -1,5 +1,5 @@ import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; -import { MediaResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { MediaService } from '@umbraco-cms/backoffice/external/backend-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; /** @@ -26,6 +26,6 @@ export class UmbMediaReferenceServerDataSource { * @memberof UmbMediaReferenceServerDataSource */ async getReferencedBy(id: string, skip = 0, take = 20) { - return await tryExecuteAndNotify(this.#host, MediaResource.getMediaByIdReferencedBy({ id, skip, take })); + return await tryExecuteAndNotify(this.#host, MediaService.getMediaByIdReferencedBy({ id, skip, take })); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/detail/media-detail.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/detail/media-detail.server.data-source.ts index 5aba5c5b97..29cd802d92 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/detail/media-detail.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/repository/detail/media-detail.server.data-source.ts @@ -3,7 +3,7 @@ import { UMB_MEDIA_ENTITY_TYPE } from '../../entity.js'; import { UmbId } from '@umbraco-cms/backoffice/id'; import type { UmbDetailDataSource } from '@umbraco-cms/backoffice/repository'; import type { CreateMediaRequestModel, UpdateMediaRequestModel } from '@umbraco-cms/backoffice/external/backend-api'; -import { MediaResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { MediaService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -66,7 +66,7 @@ export class UmbMediaServerDataSource implements UmbDetailDataSource) => MediaResource.getItemMedia({ id: uniques }); +const getItems = (uniques: Array) => MediaService.getItemMedia({ id: uniques }); const mapper = (item: MediaItemResponseModel): UmbMediaItemModel => { return { diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/tree/media-tree.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/tree/media-tree.server.data-source.ts index a9223242b6..3522d289fd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/tree/media-tree.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/tree/media-tree.server.data-source.ts @@ -6,7 +6,7 @@ import type { UmbTreeRootItemsRequestArgs, } from '@umbraco-cms/backoffice/tree'; import { UmbTreeServerDataSourceBase } from '@umbraco-cms/backoffice/tree'; -import { MediaResource, type MediaTreeItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; +import { MediaService, type MediaTreeItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; /** @@ -36,14 +36,14 @@ export class UmbMediaTreeServerDataSource extends UmbTreeServerDataSourceBase< const getRootItems = (args: UmbTreeRootItemsRequestArgs) => // eslint-disable-next-line local-rules/no-direct-api-import - MediaResource.getTreeMediaRoot({ skip: args.skip, take: args.take }); + MediaService.getTreeMediaRoot({ skip: args.skip, take: args.take }); const getChildrenOf = (args: UmbTreeChildrenOfRequestArgs) => { if (args.parentUnique === null) { return getRootItems(args); } else { // eslint-disable-next-line local-rules/no-direct-api-import - return MediaResource.getTreeMediaChildren({ + return MediaService.getTreeMediaChildren({ parentId: args.parentUnique, skip: args.skip, take: args.take, @@ -53,7 +53,7 @@ const getChildrenOf = (args: UmbTreeChildrenOfRequestArgs) => { const getAncestorsOf = (args: UmbTreeAncestorsOfRequestArgs) => // eslint-disable-next-line local-rules/no-direct-api-import - MediaResource.getTreeMediaAncestors({ + MediaService.getTreeMediaAncestors({ descendantId: args.descendantUnique, }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-group/collection/repository/member-group-collection.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-group/collection/repository/member-group-collection.server.data-source.ts index 4ba9a19e08..5ca4fe119d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-group/collection/repository/member-group-collection.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-group/collection/repository/member-group-collection.server.data-source.ts @@ -5,7 +5,7 @@ import type { UmbCollectionDataSource } from '@umbraco-cms/backoffice/collection import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; import type { MemberGroupResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; -import { MemberGroupResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { MemberGroupService } from '@umbraco-cms/backoffice/external/backend-api'; /** * A data source that fetches the member collection data from the server. @@ -32,7 +32,7 @@ export class UmbMemberGroupCollectionServerDataSource implements UmbCollectionDa * @memberof UmbMemberGroupCollectionServerDataSource */ async getCollection(filter: UmbMemberGroupCollectionFilterModel) { - const { data, error } = await tryExecuteAndNotify(this.#host, MemberGroupResource.getMemberGroup(filter)); + const { data, error } = await tryExecuteAndNotify(this.#host, MemberGroupService.getMemberGroup(filter)); if (error) { return { error }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-group/repository/detail/member-group-detail.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-group/repository/detail/member-group-detail.server.data-source.ts index 099082a55e..a81abc353d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-group/repository/detail/member-group-detail.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-group/repository/detail/member-group-detail.server.data-source.ts @@ -5,7 +5,7 @@ import type { UmbDetailDataSource } from '@umbraco-cms/backoffice/repository'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; import type { CreateMemberGroupRequestModel } from '@umbraco-cms/backoffice/external/backend-api'; -import { MemberGroupResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { MemberGroupService } from '@umbraco-cms/backoffice/external/backend-api'; /** * A data source for the Member Group that fetches data from the server @@ -52,7 +52,7 @@ export class UmbMemberGroupServerDataSource implements UmbDetailDataSource) => MemberGroupResource.getItemMemberGroup({ id: uniques }); +const getItems = (uniques: Array) => MemberGroupService.getItemMemberGroup({ id: uniques }); const mapper = (item: MemberGroupItemResponseModel): UmbMemberGroupItemModel => { return { diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/repository/detail/member-type-detail.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/repository/detail/member-type-detail.server.data-source.ts index cf717ef3df..aac637749c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/repository/detail/member-type-detail.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/repository/detail/member-type-detail.server.data-source.ts @@ -6,7 +6,7 @@ import type { CreateMemberTypeRequestModel, UpdateMemberTypeRequestModel, } from '@umbraco-cms/backoffice/external/backend-api'; -import { MemberTypeResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { MemberTypeService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; import type { UmbPropertyContainerTypes } from '@umbraco-cms/backoffice/content-type'; @@ -67,7 +67,7 @@ export class UmbMemberTypeServerDataSource implements UmbDetailDataSource) => MemberTypeResource.getItemMemberType({ id: uniques }); +const getItems = (uniques: Array) => MemberTypeService.getItemMemberType({ id: uniques }); const mapper = (item: MemberTypeItemResponseModel): UmbMemberTypeItemModel => { return { diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/member-type-tree.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/member-type-tree.server.data-source.ts index c593f6fa68..41be9cbe23 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/member-type-tree.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/tree/member-type-tree.server.data-source.ts @@ -3,7 +3,7 @@ import type { UmbMemberTypeTreeItemModel } from './types.js'; import type { UmbTreeChildrenOfRequestArgs, UmbTreeRootItemsRequestArgs } from '@umbraco-cms/backoffice/tree'; import { UmbTreeServerDataSourceBase } from '@umbraco-cms/backoffice/tree'; import type { NamedEntityTreeItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; -import { MemberTypeResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { MemberTypeService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; /** @@ -33,7 +33,7 @@ export class UmbMemberTypeTreeServerDataSource extends UmbTreeServerDataSourceBa const getRootItems = (args: UmbTreeRootItemsRequestArgs) => // eslint-disable-next-line local-rules/no-direct-api-import - MemberTypeResource.getTreeMemberTypeRoot({ skip: args.skip, take: args.take }); + MemberTypeService.getTreeMemberTypeRoot({ skip: args.skip, take: args.take }); const getChildrenOf = (args: UmbTreeChildrenOfRequestArgs) => { if (args.parentUnique === null) { diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member/collection/repository/member-collection.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member/collection/repository/member-collection.server.data-source.ts index d9df07980f..ca64ad7003 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member/collection/repository/member-collection.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member/collection/repository/member-collection.server.data-source.ts @@ -4,7 +4,7 @@ import type { UmbMemberCollectionFilterModel } from '../types.js'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; import type { UmbCollectionDataSource } from '@umbraco-cms/backoffice/collection'; import type { MemberResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; -import { MemberResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { MemberService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import type { UmbVariantModel } from '@umbraco-cms/backoffice/variant'; @@ -33,7 +33,7 @@ export class UmbMemberCollectionServerDataSource implements UmbCollectionDataSou * @memberof UmbMemberCollectionServerDataSource */ async getCollection(filter: UmbMemberCollectionFilterModel) { - const { data, error } = await tryExecuteAndNotify(this.#host, MemberResource.getFilterMember(filter)); + const { data, error } = await tryExecuteAndNotify(this.#host, MemberService.getFilterMember(filter)); if (error) { return { error }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member/repository/detail/member-detail.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member/repository/detail/member-detail.server.data-source.ts index 4a1a62c604..a3a123d02c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member/repository/detail/member-detail.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member/repository/detail/member-detail.server.data-source.ts @@ -3,7 +3,7 @@ import { UMB_MEMBER_ENTITY_TYPE } from '../../entity.js'; import { UmbId } from '@umbraco-cms/backoffice/id'; import type { UmbDetailDataSource } from '@umbraco-cms/backoffice/repository'; import type { CreateMemberRequestModel, UpdateMemberRequestModel } from '@umbraco-cms/backoffice/external/backend-api'; -import { MemberResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { MemberService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -73,7 +73,7 @@ export class UmbMemberServerDataSource implements UmbDetailDataSource) => MemberResource.getItemMember({ id: uniques }); +const getItems = (uniques: Array) => MemberService.getItemMember({ id: uniques }); const mapper = (item: MemberItemResponseModel): UmbMemberItemModel => { return { diff --git a/src/Umbraco.Web.UI.Client/src/packages/models-builder/models-builder-dashboard.element.ts b/src/Umbraco.Web.UI.Client/src/packages/models-builder/models-builder-dashboard.element.ts index e9f08b1220..03f5c50531 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/models-builder/models-builder-dashboard.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/models-builder/models-builder-dashboard.element.ts @@ -2,7 +2,7 @@ import type { UUIButtonState } from '@umbraco-cms/backoffice/external/uui'; import { css, html, nothing, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import type { ModelsBuilderResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; -import { ModelsBuilderResource, ModelsModeModel } from '@umbraco-cms/backoffice/external/backend-api'; +import { ModelsBuilderService, ModelsModeModel } from '@umbraco-cms/backoffice/external/backend-api'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; @@ -24,7 +24,7 @@ export class UmbModelsBuilderDashboardElement extends UmbLitElement { } private async _getDashboardData() { - const { data } = await tryExecuteAndNotify(this, ModelsBuilderResource.getModelsBuilderDashboard()); + const { data } = await tryExecuteAndNotify(this, ModelsBuilderService.getModelsBuilderDashboard()); if (data) { this._modelsBuilder = data; return true; @@ -39,7 +39,7 @@ export class UmbModelsBuilderDashboardElement extends UmbLitElement { } private async _postGenerateModels() { - const { error } = await tryExecuteAndNotify(this, ModelsBuilderResource.postModelsBuilderBuild()); + const { error } = await tryExecuteAndNotify(this, ModelsBuilderService.postModelsBuilderBuild()); if (error) { return false; } @@ -74,7 +74,7 @@ export class UmbModelsBuilderDashboardElement extends UmbLitElement { ${this._modelsBuilder?.mode ? html`
  • The ModelsMode is '${this._modelsBuilder.mode}'. ${this.renderModelsMode()} -
  • ` + ` : nothing} ${this.renderList()} @@ -90,7 +90,7 @@ export class UmbModelsBuilderDashboardElement extends UmbLitElement { label="Generate models" @click="${this._onGenerateModels}"> Generate models - ` + ` : nothing}

    ${this._modelsBuilder?.lastError @@ -109,8 +109,8 @@ export class UmbModelsBuilderDashboardElement extends UmbLitElement { ${this._modelsBuilder?.trackingOutOfDateModels === true ? html`
  • Tracking of out-of-date models is enabled.
  • ` : this._modelsBuilder?.trackingOutOfDateModels === false - ? html`
  • Tracking of out-of-date models is not enabled.
  • ` - : nothing}`; + ? html`
  • Tracking of out-of-date models is not enabled.
  • ` + : nothing}`; } return nothing; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/object-type/object-type.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/object-type/object-type.repository.ts index 7669921f21..ab9fa73ee5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/object-type/object-type.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/object-type/object-type.repository.ts @@ -1,4 +1,4 @@ -import { ObjectTypesResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { ObjectTypesService } from '@umbraco-cms/backoffice/external/backend-api'; import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; @@ -14,7 +14,7 @@ export class UmbObjectTypeRepository extends UmbControllerBase implements UmbApi } async #read() { - return tryExecuteAndNotify(this.#host, ObjectTypesResource.getObjectTypes({})); + return tryExecuteAndNotify(this.#host, ObjectTypesService.getObjectTypes({})); } async read() { diff --git a/src/Umbraco.Web.UI.Client/src/packages/packages/package-section/views/installed/installed-packages-section-view-item.element.ts b/src/Umbraco.Web.UI.Client/src/packages/packages/package-section/views/installed/installed-packages-section-view-item.element.ts index 324658656f..bf2ac4e49b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/packages/package-section/views/installed/installed-packages-section-view-item.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/packages/package-section/views/installed/installed-packages-section-view-item.element.ts @@ -1,6 +1,6 @@ import { html, css, nothing, ifDefined, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; import { createExtensionElement } from '@umbraco-cms/backoffice/extension-api'; -import { PackageResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { PackageService } from '@umbraco-cms/backoffice/external/backend-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; import { umbConfirmModal } from '@umbraco-cms/backoffice/modal'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; @@ -101,7 +101,7 @@ export class UmbInstalledPackagesSectionViewItemElement extends UmbLitElement { this._migrationButtonState = 'waiting'; const { error } = await tryExecuteAndNotify( this, - PackageResource.postPackageByNameRunMigration({ name: this.name }), + PackageService.postPackageByNameRunMigration({ name: this.name }), ); if (error) return; diff --git a/src/Umbraco.Web.UI.Client/src/packages/packages/package/repository/sources/package.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/packages/package/repository/sources/package.server.data.ts index a3e1aa7974..ae20261028 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/packages/package/repository/sources/package.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/packages/package/repository/sources/package.server.data.ts @@ -1,5 +1,5 @@ import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; -import { ManifestResource, PackageResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { ManifestService, PackageService } from '@umbraco-cms/backoffice/external/backend-api'; import type { CreatePackageRequestModel, UpdatePackageRequestModel, @@ -14,19 +14,19 @@ export class UmbPackageServerDataSource { constructor(private readonly host: UmbControllerHost) {} async deleteCreatedPackage(unique: string) { - return await tryExecuteAndNotify(this.host, PackageResource.deletePackageCreatedById({ id: unique })); + return await tryExecuteAndNotify(this.host, PackageService.deletePackageCreatedById({ id: unique })); } getCreatedPackage(unique: string) { - return tryExecuteAndNotify(this.host, PackageResource.getPackageCreatedById({ id: unique })); + return tryExecuteAndNotify(this.host, PackageService.getPackageCreatedById({ id: unique })); } getCreatedPackages({ skip, take }: { skip: number; take: number }) { - return tryExecuteAndNotify(this.host, PackageResource.getPackageCreated({ skip, take })); + return tryExecuteAndNotify(this.host, PackageService.getPackageCreated({ skip, take })); } getCreatePackageDownload(unique: string) { - return tryExecuteAndNotify(this.host, PackageResource.getPackageCreatedByIdDownload({ id: unique })); + return tryExecuteAndNotify(this.host, PackageService.getPackageCreatedByIdDownload({ id: unique })); } /** @@ -34,7 +34,7 @@ export class UmbPackageServerDataSource { * @memberof UmbPackageServerDataSource */ getRootItems() { - return tryExecuteAndNotify(this.host, ManifestResource.getManifestManifest()); + return tryExecuteAndNotify(this.host, ManifestService.getManifestManifest()); } /** @@ -42,7 +42,7 @@ export class UmbPackageServerDataSource { * @memberof UmbPackageServerDataSource */ getPackageConfiguration() { - return tryExecuteAndNotify(this.host, PackageResource.getPackageConfiguration()); + return tryExecuteAndNotify(this.host, PackageService.getPackageConfiguration()); } /** @@ -50,14 +50,14 @@ export class UmbPackageServerDataSource { * @memberof UmbPackageServerDataSource */ getPackageMigrations() { - return tryExecuteAndNotify(this.host, PackageResource.getPackageMigrationStatus({ skip: 0, take: 9999 })); + return tryExecuteAndNotify(this.host, PackageService.getPackageMigrationStatus({ skip: 0, take: 9999 })); } async saveCreatedPackage(requestBody: CreatePackageRequestModel) { - return await tryExecuteAndNotify(this.host, PackageResource.postPackageCreated({ requestBody })); + return await tryExecuteAndNotify(this.host, PackageService.postPackageCreated({ requestBody })); } async updateCreatedPackage(id: string, requestBody: UpdatePackageRequestModel) { - return await tryExecuteAndNotify(this.host, PackageResource.putPackageCreatedById({ id, requestBody })); + return await tryExecuteAndNotify(this.host, PackageService.putPackageCreatedById({ id, requestBody })); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/collection/repository/relation-type-collection.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/collection/repository/relation-type-collection.server.data-source.ts index b1fb2a947a..0759a38fbb 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/collection/repository/relation-type-collection.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/collection/repository/relation-type-collection.server.data-source.ts @@ -2,7 +2,7 @@ import type { UmbRelationTypeCollectionFilterModel } from '../types.js'; import type { UmbRelationTypeDetailModel } from '../../types.js'; import { UMB_RELATION_TYPE_ENTITY_TYPE } from '../../entity.js'; import type { UmbCollectionDataSource } from '@umbraco-cms/backoffice/collection'; -import { RelationTypeResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { RelationTypeService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -31,7 +31,7 @@ export class UmbRelationTypeCollectionServerDataSource implements UmbCollectionD * @memberof UmbRelationTypeCollectionServerDataSource */ async getCollection(filter: UmbRelationTypeCollectionFilterModel) { - const { data, error } = await tryExecuteAndNotify(this.#host, RelationTypeResource.getRelationType(filter)); + const { data, error } = await tryExecuteAndNotify(this.#host, RelationTypeService.getRelationType(filter)); if (data) { const items = data.items.map((item) => { diff --git a/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/repository/detail/relation-type-detail.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/repository/detail/relation-type-detail.server.data-source.ts index 897b3bdb28..a196655e7f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/repository/detail/relation-type-detail.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/relations/relation-types/repository/detail/relation-type-detail.server.data-source.ts @@ -1,6 +1,6 @@ import type { UmbRelationTypeDetailModel } from '../../types.js'; import { UMB_RELATION_TYPE_ENTITY_TYPE } from '../../entity.js'; -import { RelationTypeResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { RelationTypeService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; import type { UmbReadDetailDataSource } from '@umbraco-cms/backoffice/repository'; @@ -34,7 +34,7 @@ export class UmbRelationTypeDetailServerDataSource implements UmbReadDetailDataS const { data, error } = await tryExecuteAndNotify( this.#host, - RelationTypeResource.getRelationTypeById({ id: unique }), + RelationTypeService.getRelationTypeById({ id: unique }), ); if (error || !data) { diff --git a/src/Umbraco.Web.UI.Client/src/packages/relations/relations/collection/repository/relation-collection.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/relations/relations/collection/repository/relation-collection.server.data-source.ts index 48d9103712..96abd9cbc7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/relations/relations/collection/repository/relation-collection.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/relations/relations/collection/repository/relation-collection.server.data-source.ts @@ -2,7 +2,7 @@ import type { UmbRelationCollectionFilterModel } from '../types.js'; import type { UmbRelationDetailModel } from '../../types.js'; import { UMB_RELATION_ENTITY_TYPE } from '../../entity.js'; import type { UmbCollectionDataSource } from '@umbraco-cms/backoffice/collection'; -import { RelationResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { RelationService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -37,7 +37,7 @@ export class UmbRelationCollectionServerDataSource implements UmbCollectionDataS id: filter.relationType.unique, }; - const { data, error } = await tryExecuteAndNotify(this.#host, RelationResource.getRelationTypeById(requestBody)); + const { data, error } = await tryExecuteAndNotify(this.#host, RelationService.getRelationTypeById(requestBody)); if (data) { const items = data.items.map((item) => { diff --git a/src/Umbraco.Web.UI.Client/src/packages/search/examine-management-dashboard/views/section-view-examine-indexers.ts b/src/Umbraco.Web.UI.Client/src/packages/search/examine-management-dashboard/views/section-view-examine-indexers.ts index 0f0a80fa9e..9d86f91654 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/search/examine-management-dashboard/views/section-view-examine-indexers.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/search/examine-management-dashboard/views/section-view-examine-indexers.ts @@ -2,7 +2,7 @@ import type { UUIButtonState } from '@umbraco-cms/backoffice/external/uui'; import { css, html, nothing, customElement, property, state } from '@umbraco-cms/backoffice/external/lit'; import { umbConfirmModal } from '@umbraco-cms/backoffice/modal'; import type { IndexResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; -import { HealthStatusModel, IndexerResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { HealthStatusModel, IndexerService } from '@umbraco-cms/backoffice/external/backend-api'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -31,7 +31,7 @@ export class UmbDashboardExamineIndexElement extends UmbLitElement { private async _getIndexData() { const { data } = await tryExecuteAndNotify( this, - IndexerResource.getIndexerByIndexName({ indexName: this.indexName }), + IndexerService.getIndexerByIndexName({ indexName: this.indexName }), ); this._indexData = data; @@ -62,7 +62,7 @@ export class UmbDashboardExamineIndexElement extends UmbLitElement { this._buttonState = 'waiting'; const { error } = await tryExecuteAndNotify( this, - IndexerResource.postIndexerByIndexNameRebuild({ indexName: this.indexName }), + IndexerService.postIndexerByIndexNameRebuild({ indexName: this.indexName }), ); if (error) { this._buttonState = 'failed'; @@ -123,7 +123,7 @@ export class UmbDashboardExamineIndexElement extends UmbLitElement { ${entry[0]} ${entry[1]} `; - }) + }) : ''} `; diff --git a/src/Umbraco.Web.UI.Client/src/packages/search/examine-management-dashboard/views/section-view-examine-overview.ts b/src/Umbraco.Web.UI.Client/src/packages/search/examine-management-dashboard/views/section-view-examine-overview.ts index dbd33c3214..c14200b221 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/search/examine-management-dashboard/views/section-view-examine-overview.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/search/examine-management-dashboard/views/section-view-examine-overview.ts @@ -2,7 +2,7 @@ import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { css, html, nothing, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import type { IndexResponseModel, SearcherResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; -import { HealthStatusModel, IndexerResource, SearcherResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { HealthStatusModel, IndexerService, SearcherService } from '@umbraco-cms/backoffice/external/backend-api'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -28,14 +28,14 @@ export class UmbDashboardExamineOverviewElement extends UmbLitElement { private async _getIndexers() { this._loadingIndexers = true; - const { data } = await tryExecuteAndNotify(this, IndexerResource.getIndexer({ take: 9999, skip: 0 })); + const { data } = await tryExecuteAndNotify(this, IndexerService.getIndexer({ take: 9999, skip: 0 })); this._indexers = data?.items ?? []; this._loadingIndexers = false; } private async _getSearchers() { this._loadingSearchers = true; - const { data } = await tryExecuteAndNotify(this, SearcherResource.getSearcher({ take: 9999, skip: 0 })); + const { data } = await tryExecuteAndNotify(this, SearcherService.getSearcher({ take: 9999, skip: 0 })); this._searchers = data?.items ?? []; this._loadingSearchers = false; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/search/examine-management-dashboard/views/section-view-examine-searchers.ts b/src/Umbraco.Web.UI.Client/src/packages/search/examine-management-dashboard/views/section-view-examine-searchers.ts index ac6fcb3c92..05d8649b00 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/search/examine-management-dashboard/views/section-view-examine-searchers.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/search/examine-management-dashboard/views/section-view-examine-searchers.ts @@ -2,7 +2,7 @@ import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { css, html, nothing, customElement, state, query, property } from '@umbraco-cms/backoffice/external/lit'; import { UMB_MODAL_MANAGER_CONTEXT, UMB_EXAMINE_FIELDS_SETTINGS_MODAL } from '@umbraco-cms/backoffice/modal'; import type { SearchResultResponseModel, FieldPresentationModel } from '@umbraco-cms/backoffice/external/backend-api'; -import { SearcherResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { SearcherService } from '@umbraco-cms/backoffice/external/backend-api'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -46,7 +46,7 @@ export class UmbDashboardExamineSearcherElement extends UmbLitElement { const { data } = await tryExecuteAndNotify( this, - SearcherResource.getSearcherBySearcherNameQuery({ + SearcherService.getSearcherBySearcherNameQuery({ searcherName: this.searcherName, term: this._searchInput.value, take: 100, @@ -73,10 +73,10 @@ export class UmbDashboardExamineSearcherElement extends UmbLitElement { this._exposedFields = this._exposedFields ? this._exposedFields.filter((field) => { return { name: field.name, exposed: field.exposed }; - }) + }) : newFieldNames?.map((name) => { return { name, exposed: false }; - }); + }); } }); } @@ -194,7 +194,7 @@ export class UmbDashboardExamineSearcherElement extends UmbLitElement { >x - ` + ` : html``; })}`; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/dashboards/performance-profiling/dashboard-performance-profiling.element.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/dashboards/performance-profiling/dashboard-performance-profiling.element.ts index 5cb5371c94..ad9fe8097d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/dashboards/performance-profiling/dashboard-performance-profiling.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/dashboards/performance-profiling/dashboard-performance-profiling.element.ts @@ -1,7 +1,7 @@ import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { css, html, customElement, state, query, unsafeHTML } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import { ProfilingResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { ProfilingService } from '@umbraco-cms/backoffice/external/backend-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @customElement('umb-dashboard-performance-profiling') @@ -26,7 +26,7 @@ export class UmbDashboardPerformanceProfilingElement extends UmbLitElement { } private async _getProfilingStatus() { - const { data } = await tryExecuteAndNotify(this, ProfilingResource.getProfilingStatus()); + const { data } = await tryExecuteAndNotify(this, ProfilingService.getProfilingStatus()); if (!data) return; this._profilingStatus = data.enabled ?? false; @@ -35,7 +35,7 @@ export class UmbDashboardPerformanceProfilingElement extends UmbLitElement { private async _changeProfilingStatus() { const { error } = await tryExecuteAndNotify( this, - ProfilingResource.putProfilingStatus({ requestBody: { enabled: !this._profilingStatus } }), + ProfilingService.putProfilingStatus({ requestBody: { enabled: !this._profilingStatus } }), ); if (error) { @@ -60,7 +60,7 @@ export class UmbDashboardPerformanceProfilingElement extends UmbLitElement {

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

    ${unsafeHTML(this.localize.term('profiling_reminderDescription'))} - ` + ` : html` ${unsafeHTML(this.localize.term('profiling_profilerEnabledDescription'))} `; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/dashboards/published-status/dashboard-published-status.element.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/dashboards/published-status/dashboard-published-status.element.ts index 526de9e794..190b775b43 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/dashboards/published-status/dashboard-published-status.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/dashboards/published-status/dashboard-published-status.element.ts @@ -1,7 +1,7 @@ import type { UUIButtonState } from '@umbraco-cms/backoffice/external/uui'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { umbConfirmModal } from '@umbraco-cms/backoffice/modal'; -import { PublishedCacheResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { PublishedCacheService } from '@umbraco-cms/backoffice/external/backend-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; @@ -30,7 +30,7 @@ export class UmbDashboardPublishedStatusElement extends UmbLitElement { // Refresh private async _getPublishedStatus() { - const { data } = await tryExecuteAndNotify(this, PublishedCacheResource.getPublishedCacheStatus()); + const { data } = await tryExecuteAndNotify(this, PublishedCacheService.getPublishedCacheStatus()); if (data) { this._publishedStatusText = data; } @@ -46,7 +46,7 @@ export class UmbDashboardPublishedStatusElement extends UmbLitElement { private async _reloadMemoryCache() { this._buttonStateReload = 'waiting'; this._buttonState = 'waiting'; - const { error } = await tryExecuteAndNotify(this, PublishedCacheResource.postPublishedCacheReload()); + const { error } = await tryExecuteAndNotify(this, PublishedCacheService.postPublishedCacheReload()); if (error) { this._buttonStateReload = 'failed'; this._buttonState = 'failed'; @@ -70,7 +70,7 @@ export class UmbDashboardPublishedStatusElement extends UmbLitElement { // Rebuild private async _rebuildDatabaseCache() { this._buttonStateRebuild = 'waiting'; - const { error } = await tryExecuteAndNotify(this, PublishedCacheResource.postPublishedCacheRebuild()); + const { error } = await tryExecuteAndNotify(this, PublishedCacheService.postPublishedCacheRebuild()); if (error) { this._buttonStateRebuild = 'failed'; } else { @@ -92,7 +92,7 @@ export class UmbDashboardPublishedStatusElement extends UmbLitElement { //Collect private async _cacheCollect() { this._buttonStateCollect = 'waiting'; - const { error } = await tryExecuteAndNotify(this, PublishedCacheResource.postPublishedCacheCollect()); + const { error } = await tryExecuteAndNotify(this, PublishedCacheService.postPublishedCacheCollect()); if (error) { this._buttonStateCollect = 'failed'; } else { diff --git a/src/Umbraco.Web.UI.Client/src/packages/settings/dashboards/telemetry/dashboard-telemetry.element.ts b/src/Umbraco.Web.UI.Client/src/packages/settings/dashboards/telemetry/dashboard-telemetry.element.ts index 237a7e1669..d4bad8ee8d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/settings/dashboards/telemetry/dashboard-telemetry.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/settings/dashboards/telemetry/dashboard-telemetry.element.ts @@ -1,7 +1,7 @@ import { css, html, customElement, state, unsafeHTML } from '@umbraco-cms/backoffice/external/lit'; import type { UUIButtonState } from '@umbraco-cms/backoffice/external/uui'; import type { TelemetryResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; -import { TelemetryLevelModel, TelemetryResource, ApiError } from '@umbraco-cms/backoffice/external/backend-api'; +import { TelemetryLevelModel, TelemetryService, ApiError } from '@umbraco-cms/backoffice/external/backend-api'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; @@ -26,10 +26,10 @@ export class UmbDashboardTelemetryElement extends UmbLitElement { } private async _setup() { - const telemetryLevels = await tryExecuteAndNotify(this, TelemetryResource.getTelemetry({ skip: 0, take: 3 })); + const telemetryLevels = await tryExecuteAndNotify(this, TelemetryService.getTelemetry({ skip: 0, take: 3 })); this._telemetryLevels = telemetryLevels.data?.items ?? []; - const telemetryLevel = await tryExecuteAndNotify(this, TelemetryResource.getTelemetryLevel()); + const telemetryLevel = await tryExecuteAndNotify(this, TelemetryService.getTelemetryLevel()); this._telemetryFormData = telemetryLevel.data?.telemetryLevel ?? TelemetryLevelModel.BASIC; } @@ -40,7 +40,7 @@ export class UmbDashboardTelemetryElement extends UmbLitElement { const { error } = await tryExecuteAndNotify( this, - TelemetryResource.postTelemetryLevel({ + TelemetryService.postTelemetryLevel({ requestBody: { telemetryLevel: this._telemetryFormData }, }), ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/static-file/repository/item/static-file-item.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/static-file/repository/item/static-file-item.server.data-source.ts index 294314b69c..0bd42e077f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/static-file/repository/item/static-file-item.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/static-file/repository/item/static-file-item.server.data-source.ts @@ -1,7 +1,7 @@ import type { UmbStaticFileItemModel } from './types.js'; import { UmbItemServerDataSourceBase } from '@umbraco-cms/backoffice/repository'; import type { StaticFileItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; -import { StaticFileResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { StaticFileService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; /** @@ -28,7 +28,7 @@ export class UmbStaticFileItemServerDataSource extends UmbItemServerDataSourceBa } /* eslint-disable local-rules/no-direct-api-import */ -const getItems = (uniques: Array) => StaticFileResource.getItemStaticFile({ path: uniques }); +const getItems = (uniques: Array) => StaticFileService.getItemStaticFile({ path: uniques }); const mapper = (item: StaticFileItemResponseModel): UmbStaticFileItemModel => { return { diff --git a/src/Umbraco.Web.UI.Client/src/packages/static-file/tree/static-file-tree.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/static-file/tree/static-file-tree.server.data-source.ts index 0d7345bdda..53dc833a15 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/static-file/tree/static-file-tree.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/static-file/tree/static-file-tree.server.data-source.ts @@ -8,7 +8,7 @@ import type { } from '@umbraco-cms/backoffice/tree'; import { UmbTreeServerDataSourceBase } from '@umbraco-cms/backoffice/tree'; import { - StaticFileResource, + StaticFileService, type FileSystemTreeItemPresentationModel, } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; @@ -40,7 +40,7 @@ export class UmbStaticFileTreeServerDataSource extends UmbTreeServerDataSourceBa const getRootItems = (args: UmbTreeRootItemsRequestArgs) => // eslint-disable-next-line local-rules/no-direct-api-import - StaticFileResource.getTreeStaticFileRoot({ skip: args.skip, take: args.take }); + StaticFileService.getTreeStaticFileRoot({ skip: args.skip, take: args.take }); const getChildrenOf = (args: UmbTreeChildrenOfRequestArgs) => { const parentPath = new UmbServerFilePathUniqueSerializer().toServerPath(args.parentUnique); @@ -49,7 +49,7 @@ const getChildrenOf = (args: UmbTreeChildrenOfRequestArgs) => { return getRootItems(args); } else { // eslint-disable-next-line local-rules/no-direct-api-import - return StaticFileResource.getTreeStaticFileChildren({ + return StaticFileService.getTreeStaticFileChildren({ parentPath, skip: args.skip, take: args.take, @@ -59,7 +59,7 @@ const getChildrenOf = (args: UmbTreeChildrenOfRequestArgs) => { const getAncestorsOf = (args: UmbTreeAncestorsOfRequestArgs) => // eslint-disable-next-line local-rules/no-direct-api-import - StaticFileResource.getTreeStaticFileAncestors({ + StaticFileService.getTreeStaticFileAncestors({ descendantPath: args.descendantUnique, }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/tags/repository/sources/tag.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/tags/repository/sources/tag.server.data.ts index 5f88952d4b..af9a893f1d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tags/repository/sources/tag.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tags/repository/sources/tag.server.data.ts @@ -1,4 +1,4 @@ -import { TagResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { TagService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -38,6 +38,6 @@ export class UmbTagServerDataSource { tagGroup?: string; culture?: string; }) { - return tryExecuteAndNotify(this.#host, TagResource.getTag({ query, skip, take, tagGroup, culture })); + return tryExecuteAndNotify(this.#host, TagService.getTag({ query, skip, take, tagGroup, culture })); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/entity-actions/create/snippet-modal/create-from-snippet-modal.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/entity-actions/create/snippet-modal/create-from-snippet-modal.ts index 6e38934bd0..8aed2e2718 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/entity-actions/create/snippet-modal/create-from-snippet-modal.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/entity-actions/create/snippet-modal/create-from-snippet-modal.ts @@ -3,7 +3,7 @@ import { html, customElement, state } from '@umbraco-cms/backoffice/external/lit import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; import type { PartialViewSnippetItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; -import { PartialViewResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { PartialViewService } from '@umbraco-cms/backoffice/external/backend-api'; interface UmbSnippetLinkModel { name: string; @@ -25,7 +25,7 @@ export class UmbPartialViewCreateFromSnippetModalElement extends UmbModalBaseEle } protected async firstUpdated() { - const { data } = await tryExecuteAndNotify(this, PartialViewResource.getPartialViewSnippet({ take: 10000 })); + const { data } = await tryExecuteAndNotify(this, PartialViewService.getPartialViewSnippet({ take: 10000 })); if (data) { this._snippets = data.items.map((snippet) => { diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/entity-actions/rename/rename-partial-view.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/entity-actions/rename/rename-partial-view.server.data-source.ts index df91eb5c04..5f178979f4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/entity-actions/rename/rename-partial-view.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/entity-actions/rename/rename-partial-view.server.data-source.ts @@ -4,7 +4,7 @@ import { appendFileExtensionIfNeeded, } from '@umbraco-cms/backoffice/server-file-system'; import type { RenameStylesheetRequestModel } from '@umbraco-cms/backoffice/external/backend-api'; -import { PartialViewResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { PartialViewService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -38,7 +38,7 @@ export class UmbRenamePartialViewServerDataSource { const { data, error } = await tryExecuteAndNotify( this.#host, - PartialViewResource.putPartialViewByPathRename({ + PartialViewService.putPartialViewByPathRename({ path: encodeURIComponent(path), requestBody, }), diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/repository/item/partial-view-item.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/repository/item/partial-view-item.server.data-source.ts index 0dcd3f2a06..96b2840354 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/repository/item/partial-view-item.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/repository/item/partial-view-item.server.data-source.ts @@ -4,7 +4,7 @@ import { UmbServerFilePathUniqueSerializer } from '@umbraco-cms/backoffice/serve 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 { PartialViewResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { PartialViewService } from '@umbraco-cms/backoffice/external/backend-api'; /** * A data source for script items that fetches data from the server @@ -43,7 +43,7 @@ export class UmbPartialViewItemServerDataSource implements UmbItemDataSource // eslint-disable-next-line local-rules/no-direct-api-import - PartialViewResource.getTreePartialViewRoot({ skip: args.skip, take: args.take }); + PartialViewService.getTreePartialViewRoot({ skip: args.skip, take: args.take }); const getChildrenOf = (args: UmbTreeChildrenOfRequestArgs) => { const parentPath = new UmbServerFilePathUniqueSerializer().toServerPath(args.parentUnique); @@ -47,7 +47,7 @@ const getChildrenOf = (args: UmbTreeChildrenOfRequestArgs) => { return getRootItems(args); } else { // eslint-disable-next-line local-rules/no-direct-api-import - return PartialViewResource.getTreePartialViewChildren({ + return PartialViewService.getTreePartialViewChildren({ parentPath, skip: args.skip, take: args.take, @@ -60,7 +60,7 @@ const getAncestorsOf = (args: UmbTreeAncestorsOfRequestArgs) => { if (!descendantPath) throw new Error('Descendant path is not available'); // eslint-disable-next-line local-rules/no-direct-api-import - return PartialViewResource.getTreePartialViewAncestors({ + return PartialViewService.getTreePartialViewAncestors({ descendantPath, }); }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-view-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-view-workspace.context.ts index df336252cb..4015da4f95 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-view-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/partial-views/workspace/partial-view-workspace.context.ts @@ -12,7 +12,7 @@ import { } from '@umbraco-cms/backoffice/workspace'; import { loadCodeEditor } from '@umbraco-cms/backoffice/code-editor'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; -import { PartialViewResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { PartialViewService } from '@umbraco-cms/backoffice/external/backend-api'; import { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action'; import { UmbRequestReloadTreeItemChildrenEvent } from '@umbraco-cms/backoffice/tree'; import { UmbRequestReloadStructureForEntityEvent } from '@umbraco-cms/backoffice/entity-action'; @@ -205,7 +205,7 @@ export class UmbPartialViewWorkspaceContext #getSnippet(snippetId: string) { return tryExecuteAndNotify( this, - PartialViewResource.getPartialViewSnippetById({ + PartialViewService.getPartialViewSnippetById({ id: snippetId, }), ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/entity-actions/rename/rename-script.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/entity-actions/rename/rename-script.server.data-source.ts index c6b077f36b..9361984091 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/entity-actions/rename/rename-script.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/entity-actions/rename/rename-script.server.data-source.ts @@ -4,7 +4,7 @@ import { appendFileExtensionIfNeeded, } from '@umbraco-cms/backoffice/server-file-system'; import type { RenameStylesheetRequestModel } from '@umbraco-cms/backoffice/external/backend-api'; -import { ScriptResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { ScriptService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -38,7 +38,7 @@ export class UmbRenameScriptServerDataSource { const { data, error } = await tryExecuteAndNotify( this.#host, - ScriptResource.putScriptByPathRename({ + ScriptService.putScriptByPathRename({ path: encodeURIComponent(path), requestBody, }), diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/item/script-item.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/item/script-item.server.data-source.ts index be426ae292..11b9ccb95d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/item/script-item.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/scripts/repository/item/script-item.server.data-source.ts @@ -4,7 +4,7 @@ import { UmbServerFilePathUniqueSerializer } from '@umbraco-cms/backoffice/serve 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 { ScriptResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { ScriptService } from '@umbraco-cms/backoffice/external/backend-api'; /** * A data source for script items that fetches data from the server @@ -43,7 +43,7 @@ export class UmbScriptItemServerDataSource implements UmbItemDataSource // eslint-disable-next-line local-rules/no-direct-api-import - ScriptResource.getTreeScriptRoot({ skip: args.skip, take: args.take }); + ScriptService.getTreeScriptRoot({ skip: args.skip, take: args.take }); const getChildrenOf = (args: UmbTreeChildrenOfRequestArgs) => { const parentPath = new UmbServerFilePathUniqueSerializer().toServerPath(args.parentUnique); @@ -47,7 +47,7 @@ const getChildrenOf = (args: UmbTreeChildrenOfRequestArgs) => { return getRootItems(args); } else { // eslint-disable-next-line local-rules/no-direct-api-import - return ScriptResource.getTreeScriptChildren({ + return ScriptService.getTreeScriptChildren({ parentPath, skip: args.skip, take: args.take, @@ -60,7 +60,7 @@ const getAncestorsOf = (args: UmbTreeAncestorsOfRequestArgs) => { if (!descendantPath) throw new Error('Descendant path is not available'); // eslint-disable-next-line local-rules/no-direct-api-import - return ScriptResource.getTreeScriptAncestors({ + return ScriptService.getTreeScriptAncestors({ descendantPath, }); }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-actions/rename/rename-stylesheet.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-actions/rename/rename-stylesheet.server.data-source.ts index fd1425c44f..d3a8cd1698 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-actions/rename/rename-stylesheet.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/entity-actions/rename/rename-stylesheet.server.data-source.ts @@ -4,7 +4,7 @@ import { appendFileExtensionIfNeeded, } from '@umbraco-cms/backoffice/server-file-system'; import type { RenameStylesheetRequestModel } from '@umbraco-cms/backoffice/external/backend-api'; -import { StylesheetResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { StylesheetService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -38,7 +38,7 @@ export class UmbRenameStylesheetServerDataSource { const { data, error } = await tryExecuteAndNotify( this.#host, - StylesheetResource.putStylesheetByPathRename({ + StylesheetService.putStylesheetByPathRename({ path: encodeURIComponent(path), requestBody, }), diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/stylesheet-item.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/stylesheet-item.server.data-source.ts index 9fe4f6e62a..ebdb50678e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/stylesheet-item.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/stylesheets/repository/item/stylesheet-item.server.data-source.ts @@ -4,7 +4,7 @@ import { UmbServerFilePathUniqueSerializer } from '@umbraco-cms/backoffice/serve 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 { StylesheetResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { StylesheetService } from '@umbraco-cms/backoffice/external/backend-api'; /** * A data source for stylesheet items that fetches data from the server @@ -43,7 +43,7 @@ export class UmbStylesheetItemServerDataSource implements UmbItemDataSource // eslint-disable-next-line local-rules/no-direct-api-import - StylesheetResource.getTreeStylesheetRoot({ skip: args.skip, take: args.take }); + StylesheetService.getTreeStylesheetRoot({ skip: args.skip, take: args.take }); const getChildrenOf = (args: UmbTreeChildrenOfRequestArgs) => { const parentPath = new UmbServerFilePathUniqueSerializer().toServerPath(args.parentUnique); @@ -47,7 +47,7 @@ const getChildrenOf = (args: UmbTreeChildrenOfRequestArgs) => { return getRootItems(args); } else { // eslint-disable-next-line local-rules/no-direct-api-import - return StylesheetResource.getTreeStylesheetChildren({ + return StylesheetService.getTreeStylesheetChildren({ parentPath, skip: args.skip, take: args.take, @@ -60,7 +60,7 @@ const getAncestorsOf = (args: UmbTreeAncestorsOfRequestArgs) => { if (!descendantPath) throw new Error('Descendant path is not available'); // eslint-disable-next-line local-rules/no-direct-api-import - return StylesheetResource.getTreeStylesheetAncestors({ + return StylesheetService.getTreeStylesheetAncestors({ descendantPath, }); }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/repository/detail/template-detail.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/repository/detail/template-detail.server.data-source.ts index 3bf44f6deb..e119e9f8ee 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/repository/detail/template-detail.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/repository/detail/template-detail.server.data-source.ts @@ -6,7 +6,7 @@ import type { CreateTemplateRequestModel, UpdateTemplateRequestModel, } from '@umbraco-cms/backoffice/external/backend-api'; -import { TemplateResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { TemplateService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -60,7 +60,7 @@ export class UmbTemplateServerDataSource implements UmbDetailDataSource) => TemplateResource.getItemTemplate({ id: uniques }); +const getItems = (uniques: Array) => TemplateService.getItemTemplate({ id: uniques }); const mapper = (item: TemplateItemResponseModel): UmbTemplateItemModel => { return { diff --git a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/repository/query/template-query.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/repository/query/template-query.server.data-source.ts index 84dbbe7b75..ad525b57b0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/templating/templates/repository/query/template-query.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/templating/templates/repository/query/template-query.server.data-source.ts @@ -1,6 +1,6 @@ import type { UmbExecuteTemplateQueryRequestModel } from './types.js'; import type { TemplateQueryExecuteModel } from '@umbraco-cms/backoffice/external/backend-api'; -import { TemplateResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { TemplateService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -30,7 +30,7 @@ export class UmbTemplateQueryServerDataSource { * @memberof UmbTemplateQueryServerDataSource */ async getTemplateQuerySettings() { - return tryExecuteAndNotify(this.#host, TemplateResource.getTemplateQuerySettings()); + return tryExecuteAndNotify(this.#host, TemplateService.getTemplateQuerySettings()); } /** * Executes a query builder query on the server @@ -47,6 +47,6 @@ export class UmbTemplateQueryServerDataSource { take: args.take, }; - return tryExecuteAndNotify(this.#host, TemplateResource.postTemplateQueryExecute({ requestBody })); + return tryExecuteAndNotify(this.#host, TemplateService.postTemplateQueryExecute({ requestBody })); } } 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 8c8f0a8d76..9dc8e27799 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 @@ -7,7 +7,7 @@ import type { } from '@umbraco-cms/backoffice/tree'; import { UmbTreeServerDataSourceBase } from '@umbraco-cms/backoffice/tree'; import type { NamedEntityTreeItemResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; -import { TemplateResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { TemplateService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; /** @@ -37,14 +37,14 @@ export class UmbTemplateTreeServerDataSource extends UmbTreeServerDataSourceBase const getRootItems = (args: UmbTreeRootItemsRequestArgs) => // eslint-disable-next-line local-rules/no-direct-api-import - TemplateResource.getTreeTemplateRoot({ skip: args.skip, take: args.take }); + TemplateService.getTreeTemplateRoot({ skip: args.skip, take: args.take }); const getChildrenOf = (args: UmbTreeChildrenOfRequestArgs) => { if (args.parentUnique === null) { return getRootItems(args); } else { // eslint-disable-next-line local-rules/no-direct-api-import - return TemplateResource.getTreeTemplateChildren({ + return TemplateService.getTreeTemplateChildren({ parentId: args.parentUnique, skip: args.skip, take: args.take, @@ -54,7 +54,7 @@ const getChildrenOf = (args: UmbTreeChildrenOfRequestArgs) => { const getAncestorsOf = (args: UmbTreeAncestorsOfRequestArgs) => // eslint-disable-next-line local-rules/no-direct-api-import - TemplateResource.getTreeTemplateAncestors({ + TemplateService.getTreeTemplateAncestors({ descendantId: args.descendantUnique, }); diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/components/mfa-provider-default.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/components/mfa-provider-default.element.ts index 8ac35065ef..9f975cec2c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/components/mfa-provider-default.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/components/mfa-provider-default.element.ts @@ -1,5 +1,5 @@ import type { UmbMfaProviderConfigurationCallback, UmbMfaProviderConfigurationElementProps } from '../types.js'; -import { UserResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { UserService } from '@umbraco-cms/backoffice/external/backend-api'; import { css, customElement, html, property, state, query } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { isApiError, tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -63,7 +63,7 @@ export class UmbMfaProviderDefaultElement extends UmbLitElement implements UmbMf } const { data: _data } = await tryExecuteAndNotify( this, - UserResource.getUserCurrent2FaByProviderName({ providerName: this.providerName }), + UserService.getUserCurrent2FaByProviderName({ providerName: this.providerName }), ); const data: any = _data; if (!data) { diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/repository/current-user.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/repository/current-user.server.data-source.ts index 1d0fcb88aa..46bfc12a3c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/repository/current-user.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/repository/current-user.server.data-source.ts @@ -1,5 +1,5 @@ import type { UmbCurrentUserModel } from '../types.js'; -import { UserResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { UserService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecute, tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -26,7 +26,7 @@ export class UmbCurrentUserServerDataSource { * @memberof UmbCurrentUserServerDataSource */ async getCurrentUser() { - const { data, error } = await tryExecuteAndNotify(this.#host, UserResource.getUserCurrent()); + const { data, error } = await tryExecuteAndNotify(this.#host, UserService.getUserCurrent()); if (data) { const user: UmbCurrentUserModel = { @@ -56,7 +56,7 @@ export class UmbCurrentUserServerDataSource { * @memberof UmbCurrentUserServerDataSource */ async getMfaLoginProviders() { - const { data, error } = await tryExecuteAndNotify(this.#host, UserResource.getUserCurrent2Fa()); + const { data, error } = await tryExecuteAndNotify(this.#host, UserService.getUserCurrent2Fa()); if (data) { return { data }; @@ -70,7 +70,7 @@ export class UmbCurrentUserServerDataSource { */ async enableMfaProvider(providerName: string, code: string, secret: string) { const { error } = await tryExecute( - UserResource.postUserCurrent2FaByProviderName({ providerName, requestBody: { code, secret } }), + UserService.postUserCurrent2FaByProviderName({ providerName, requestBody: { code, secret } }), ); if (error) { @@ -84,7 +84,7 @@ export class UmbCurrentUserServerDataSource { * Disable an MFA provider */ async disableMfaProvider(providerName: string, code: string) { - const { error } = await tryExecute(UserResource.deleteUserCurrent2FaByProviderName({ providerName, code })); + const { error } = await tryExecute(UserService.deleteUserCurrent2FaByProviderName({ providerName, code })); if (error) { return { error }; 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 35d0a587e3..fa5f6d9b0c 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 @@ -1,7 +1,7 @@ import type { UmbUserGroupCollectionFilterModel } from '../types.js'; import type { UmbUserGroupDetailModel } from '../../types.js'; import { UMB_USER_GROUP_ENTITY_TYPE } from '../../entity.js'; -import { UserGroupResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { UserGroupService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbCollectionDataSource } from '@umbraco-cms/backoffice/collection'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -27,7 +27,7 @@ export class UmbUserGroupCollectionServerDataSource implements UmbCollectionData async getCollection(filter: UmbUserGroupCollectionFilterModel) { const { data, error } = await tryExecuteAndNotify( this.#host, - UserGroupResource.getUserGroup({ skip: filter.skip, take: filter.take }), + UserGroupService.getUserGroup({ skip: filter.skip, take: filter.take }), ); if (data) { diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/detail/user-group-detail.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/detail/user-group-detail.server.data-source.ts index 5a118326e4..15cc4b51a2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/detail/user-group-detail.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/detail/user-group-detail.server.data-source.ts @@ -4,7 +4,7 @@ import type { CreateUserGroupRequestModel, UpdateUserGroupRequestModel, } from '@umbraco-cms/backoffice/external/backend-api'; -import { UserGroupResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { UserGroupService } from '@umbraco-cms/backoffice/external/backend-api'; import { UmbId } from '@umbraco-cms/backoffice/id'; import type { UmbDetailDataSource } from '@umbraco-cms/backoffice/repository'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; @@ -64,7 +64,7 @@ export class UmbUserGroupServerDataSource implements UmbDetailDataSource) => UserGroupResource.getItemUserGroup({ id: uniques }); +const getItems = (uniques: Array) => UserGroupService.getItemUserGroup({ id: uniques }); const mapper = (item: UserGroupItemResponseModel): UmbUserGroupItemModel => { return { 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 a6aeed6726..96c87e5046 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 @@ -3,7 +3,7 @@ import { UMB_USER_ENTITY_TYPE } from '../../entity.js'; import type { UmbUserCollectionFilterModel } from '../types.js'; import type { UmbCollectionDataSource } from '@umbraco-cms/backoffice/collection'; import type { UserResponseModel } from '@umbraco-cms/backoffice/external/backend-api'; -import { UserResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { UserService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -32,7 +32,7 @@ export class UmbUserCollectionServerDataSource implements UmbCollectionDataSourc * @memberof UmbUserCollectionServerDataSource */ async getCollection(filter: UmbUserCollectionFilterModel) { - const { data, error } = await tryExecuteAndNotify(this.#host, UserResource.getFilterUser(filter)); + const { data, error } = await tryExecuteAndNotify(this.#host, UserService.getFilterUser(filter)); if (data) { const { items, total } = data; 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 8f0debf574..f78309c6c5 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,6 +1,6 @@ import { UmbUserServerDataSource } from '../../repository/detail/user-detail.server.data-source.js'; import type { UmbInviteUserDataSource, UmbInviteUserRequestModel, UmbResendUserInviteRequestModel } from './types.js'; -import { UserResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { UserService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -41,7 +41,7 @@ export class UmbInviteUserServerDataSource implements UmbInviteUserDataSource { const { data, error } = await tryExecuteAndNotify( this.#host, - UserResource.postUserInvite({ + UserService.postUserInvite({ requestBody, }), ); @@ -72,7 +72,7 @@ export class UmbInviteUserServerDataSource implements UmbInviteUserDataSource { return tryExecuteAndNotify( this.#host, - UserResource.postUserInviteResend({ + UserService.postUserInviteResend({ requestBody, }), ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/avatar/user-avatar.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/avatar/user-avatar.server.data-source.ts index 88418d929f..774d5c2365 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/avatar/user-avatar.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/avatar/user-avatar.server.data-source.ts @@ -1,5 +1,5 @@ import type { SetAvatarRequestModel } from '@umbraco-cms/backoffice/external/backend-api'; -import { UserResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { UserService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import type { UmbDataSourceErrorResponse } from '@umbraco-cms/backoffice/repository'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -25,7 +25,7 @@ export class UmbUserAvatarServerDataSource { }, }; - return tryExecuteAndNotify(this.#host, UserResource.postUserAvatarById({ id: unique, requestBody })); + return tryExecuteAndNotify(this.#host, UserService.postUserAvatarById({ id: unique, requestBody })); } /** @@ -35,6 +35,6 @@ export class UmbUserAvatarServerDataSource { * @memberof UmbUserServerDataSource */ deleteAvatar(unique: string): Promise { - return tryExecuteAndNotify(this.#host, UserResource.deleteUserAvatarById({ id: unique })); + return tryExecuteAndNotify(this.#host, UserService.deleteUserAvatarById({ id: unique })); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/change-password/change-user-password.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/change-password/change-user-password.server.data-source.ts index 0cd130fe16..a9f1a79f45 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/change-password/change-user-password.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/change-password/change-user-password.server.data-source.ts @@ -1,4 +1,4 @@ -import { UserResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { UserService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -31,7 +31,7 @@ export class UmbChangeUserPasswordServerDataSource { return tryExecuteAndNotify( this.#host, - UserResource.postUserByIdChangePassword({ + UserService.postUserByIdChangePassword({ id, requestBody: { newPassword, 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 419c410264..eef9a30525 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 @@ -3,7 +3,7 @@ import { UMB_USER_ENTITY_TYPE } from '../../entity.js'; import { UmbId } from '@umbraco-cms/backoffice/id'; import type { UmbDetailDataSource } from '@umbraco-cms/backoffice/repository'; import type { CreateUserRequestModel, UpdateUserRequestModel } from '@umbraco-cms/backoffice/external/backend-api'; -import { UserResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { UserService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -65,7 +65,7 @@ export class UmbUserServerDataSource implements UmbDetailDataSource) => UserResource.getItemUser({ id: uniques }); +const getItems = (uniques: Array) => UserService.getItemUser({ id: uniques }); const mapper = (item: UserItemResponseModel): UmbUserItemModel => { return { diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/new-password/new-user-password.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/new-password/new-user-password.server.data-source.ts index 1a62b2d7cd..511602abf5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/new-password/new-user-password.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/new-password/new-user-password.server.data-source.ts @@ -1,4 +1,4 @@ -import { UserResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { UserService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -30,7 +30,7 @@ export class UmbNewUserPasswordServerDataSource { return tryExecuteAndNotify( this.#host, - UserResource.postUserByIdResetPassword({ + UserService.postUserByIdResetPassword({ id: unique, }), ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/sources/user-mfa.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/sources/user-mfa.server.data-source.ts index 2c7b3c42f8..393b98291a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/sources/user-mfa.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/sources/user-mfa.server.data-source.ts @@ -1,4 +1,4 @@ -import { UserResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { UserService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecute, tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -29,7 +29,7 @@ export class UmbUserMfaServerDataSource { return tryExecuteAndNotify( this.#host, - UserResource.getUserById2Fa({ + UserService.getUserById2Fa({ id: unique, }), ); @@ -46,7 +46,7 @@ export class UmbUserMfaServerDataSource { if (!providerName) throw new Error('Provider is missing'); return tryExecute( - UserResource.deleteUserById2FaByProviderName({ + UserService.deleteUserById2FaByProviderName({ id: unique, providerName, }), 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 f5af122ed2..45ca8f6e5b 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 { UserResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { UserService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -31,7 +31,7 @@ export class UmbUserSetGroupsServerDataSource { return tryExecuteAndNotify( this.#host, - UserResource.postUserSetUserGroups({ + UserService.postUserSetUserGroups({ requestBody: { userIds, userGroupIds, 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 d6cc3c5d93..8383b9154b 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,5 +1,5 @@ import type { UmbUnlockUserDataSource } from './types.js'; -import { UserResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { UserService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -31,7 +31,7 @@ export class UmbUnlockUserServerDataSource implements UmbUnlockUserDataSource { return tryExecuteAndNotify( this.#host, - UserResource.postUserUnlock({ + UserService.postUserUnlock({ requestBody: { userIds, }, diff --git a/src/Umbraco.Web.UI.Client/src/packages/webhook/collection/repository/webhook-collection.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/webhook/collection/repository/webhook-collection.server.data-source.ts index 2a59759ad9..87f296bc35 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/webhook/collection/repository/webhook-collection.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/webhook/collection/repository/webhook-collection.server.data-source.ts @@ -1,7 +1,7 @@ import type { UmbWebhookCollectionFilterModel } from '../types.js'; import type { UmbWebhookDetailModel } from '../../types.js'; import { UMB_WEBHOOK_ENTITY_TYPE } from '../../entity.js'; -import { WebhookResource } from '@umbraco-cms/backoffice/external/backend-api'; +import { WebhookService } from '@umbraco-cms/backoffice/external/backend-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; @@ -30,7 +30,7 @@ export class UmbWebhookCollectionServerDataSource implements UmbWebhookCollectio * @memberof UmbWebhookCollectionServerDataSource */ async getCollection(_filter: UmbWebhookCollectionFilterModel) { - const { data, error } = await tryExecuteAndNotify(this.#host, WebhookResource.getWebhookItem({})); + const { data, error } = await tryExecuteAndNotify(this.#host, WebhookService.getWebhookItem({})); if (data) { const items = data.map((item) => { From a12b47f11f46937abce58830bd95e140ffad3318 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Wed, 10 Apr 2024 17:20:30 +0200 Subject: [PATCH 257/280] add an action with kind to show buttons in the current user modal --- .../models/current-user-action.model.ts | 73 +++++++++++++++++++ .../core/extension-registry/models/index.ts | 4 + .../action/current-user-app-button.element.ts | 66 +++++++++++++++++ .../user/current-user/action/default.kind.ts | 13 ++++ .../user/current-user/action/index.ts | 1 + .../src/packages/user/current-user/index.ts | 1 + .../packages/user/current-user/manifests.ts | 2 + 7 files changed, 160 insertions(+) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/current-user-action.model.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/user/current-user/action/current-user-app-button.element.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/user/current-user/action/default.kind.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/user/current-user/action/index.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/current-user-action.model.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/current-user-action.model.ts new file mode 100644 index 0000000000..7af684a83a --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/current-user-action.model.ts @@ -0,0 +1,73 @@ +import type { ConditionTypes } from '../conditions/types.js'; +import type { UmbAction } from '../../action/action.interface.js'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import type { ManifestElementAndApi, ManifestWithDynamicConditions } from '@umbraco-cms/backoffice/extension-api'; +import type { UUIInterfaceColor, UUIInterfaceLook } from '@umbraco-cms/backoffice/external/uui'; + +export interface UmbCurrentUserActionArgs { + meta: MetaArgsType; +} + +export interface UmbCurrentUserAction extends UmbAction> { + /** + * The href location, the action will act as a link. + * @returns {Promise} + */ + getHref(): Promise; + + /** + * The `execute` method, the action will act as a button. + * @returns {Promise} + */ + execute(): Promise; +} + +export interface ManifestCurrentUserAction + extends ManifestElementAndApi>, + ManifestWithDynamicConditions { + type: 'currentUserAction'; + meta: MetaType; +} + +export interface MetaCurrentUserAction {} + +export interface ManifestCurrentUserActionDefaultKind< + MetaType extends MetaCurrentUserActionDefaultKind = MetaCurrentUserActionDefaultKind, +> extends ManifestCurrentUserAction { + type: 'currentUserAction'; + kind: 'default'; +} + +export interface MetaCurrentUserActionDefaultKind extends MetaCurrentUserAction { + /** + * An icon to represent the action to be performed + * + * @examples [ + * "icon-box", + * "icon-grid" + * ] + */ + icon?: string; + + /** + * The friendly name of the action to perform + * + * @examples [ + * "Create", + * "Create Content Template" + * ] + */ + label: string; + + /** + * The look of the button + * @default primary + */ + look?: UUIInterfaceLook; + + /** + * The color of the button + * @default default + */ + color?: UUIInterfaceColor; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/index.ts index a997488da7..5729a909c2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/index.ts @@ -2,6 +2,7 @@ import type { ManifestAuthProvider } from './auth-provider.model.js'; import type { ManifestBlockEditorCustomView } from './block-editor-custom-view.model.js'; import type { ManifestCollection } from './collection.models.js'; import type { ManifestCollectionView } from './collection-view.model.js'; +import type { ManifestCurrentUserAction, ManifestCurrentUserActionDefaultKind } from './current-user-action.model.js'; import type { ManifestDashboard } from './dashboard.model.js'; import type { ManifestDashboardCollection } from './dashboard-collection.model.js'; import type { @@ -72,6 +73,7 @@ export type * from './block-editor-custom-view.model.js'; export type * from './collection.models.js'; export type * from './collection-action.model.js'; export type * from './collection-view.model.js'; +export type * from './current-user-action.model.js'; export type * from './dashboard-collection.model.js'; export type * from './dashboard.model.js'; export type * from './dynamic-root.model.js'; @@ -143,6 +145,8 @@ export type ManifestTypes = | ManifestCollection | ManifestCollectionView | ManifestCollectionAction + | ManifestCurrentUserAction + | ManifestCurrentUserActionDefaultKind | ManifestCondition | ManifestDashboard | ManifestDashboardCollection diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/action/current-user-app-button.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/action/current-user-app-button.element.ts new file mode 100644 index 0000000000..fd6887215a --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/action/current-user-app-button.element.ts @@ -0,0 +1,66 @@ +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; +import { html, customElement, ifDefined, state, property } from '@umbraco-cms/backoffice/external/lit'; +import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; +import type { + ManifestCurrentUserActionDefaultKind, + MetaCurrentUserActionDefaultKind, + UmbCurrentUserAction, +} from '@umbraco-cms/backoffice/extension-registry'; +import { UmbActionExecutedEvent } from '@umbraco-cms/backoffice/event'; + +@customElement('umb-current-user-app-button') +export class UmbCurrentUserAppButtonElement< + MetaType extends MetaCurrentUserActionDefaultKind = MetaCurrentUserActionDefaultKind, + ApiType extends UmbCurrentUserAction = UmbCurrentUserAction, +> extends UmbLitElement { + #api?: ApiType; + + @state() + _href?: string; + + @property({ attribute: false }) + public manifest?: ManifestCurrentUserActionDefaultKind; + + public set api(api: ApiType | undefined) { + this.#api = api; + + this.#api?.getHref?.().then((href) => { + this._href = href; + }); + } + + async #onClick(event: Event) { + if (!this._href) { + event.stopPropagation(); + await this.#api?.execute(); + } + this.dispatchEvent(new UmbActionExecutedEvent()); + } + + get label(): string | undefined { + return this.manifest?.meta.label ? this.localize.string(this.manifest.meta.label) : undefined; + } + + render() { + return html` + + ${this.manifest?.meta.icon ? html`` : ''} ${this.label} + + `; + } + + static styles = [UmbTextStyles]; +} + +export default UmbCurrentUserAppButtonElement; + +declare global { + interface HTMLElementTagNameMap { + 'umb-current-user-app-button': UmbCurrentUserAppButtonElement; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/action/default.kind.ts b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/action/default.kind.ts new file mode 100644 index 0000000000..900bd8ad36 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/action/default.kind.ts @@ -0,0 +1,13 @@ +import type { UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry'; + +export const manifest: UmbBackofficeManifestKind = { + type: 'kind', + alias: 'Umb.Kind.CurrentUserAction.Default', + matchKind: 'default', + matchType: 'currentUserAction', + manifest: { + type: 'currentUserAction', + kind: 'default', + elementName: 'umb-current-user-app-button', + }, +}; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/action/index.ts b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/action/index.ts new file mode 100644 index 0000000000..76e9e5eab0 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/action/index.ts @@ -0,0 +1 @@ +export * from './current-user-app-button.element.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/index.ts b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/index.ts index 16c179e8dc..def7620871 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/index.ts @@ -1,3 +1,4 @@ +export * from './action/index.js'; export * from './components/index.js'; export * from './history/current-user-history.store.js'; export * from './utils/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/manifests.ts index 8b2d9a3751..65509321ec 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/manifests.ts @@ -1,3 +1,4 @@ +import { manifest as actionDefaultKindManifest } from './action/default.kind.js'; import { manifests as modalManifests } from './modals/manifests.js'; import { manifests as externalLoginProviderManifests } from './external-login/manifests.js'; import { manifests as historyManifests } from './history/manifests.js'; @@ -29,6 +30,7 @@ export const headerApps: Array = [ ]; export const manifests = [ + actionDefaultKindManifest, ...externalLoginProviderManifests, ...headerApps, ...historyManifests, From 735b58f1fcd495df2decd9afd59be5462d8c5aa5 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Wed, 10 Apr 2024 17:22:23 +0200 Subject: [PATCH 258/280] add extension slot with api to the user profile app to show the buttons there --- ...rent-user-profile-user-profile-app.element.ts | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/profile/current-user-profile-user-profile-app.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/profile/current-user-profile-user-profile-app.element.ts index 0916731b84..5cc0d8e8f4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/profile/current-user-profile-user-profile-app.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/profile/current-user-profile-user-profile-app.element.ts @@ -1,7 +1,8 @@ -import { html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; +import { html, customElement, state, css } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import { UMB_CHANGE_PASSWORD_MODAL, UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; import { UMB_CURRENT_USER_CONTEXT, type UmbCurrentUserModel } from '@umbraco-cms/backoffice/current-user'; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; @customElement('umb-current-user-profile-user-profile-app') export class UmbCurrentUserProfileUserProfileAppElement extends UmbLitElement { @@ -59,9 +60,22 @@ export class UmbCurrentUserProfileUserProfileAppElement extends UmbLitElement { ${this.localize.term('general_changePassword')} + `; } + + static styles = [ + UmbTextStyles, + css` + #actions { + display: flex; + flex-wrap: wrap; + flex-direction: row; + gap: var(--uui-size-space-2); + } + `, + ]; } export default UmbCurrentUserProfileUserProfileAppElement; From abc3273af731a3658f9b0041898b1d613322f57e Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Wed, 10 Apr 2024 17:30:15 +0200 Subject: [PATCH 259/280] convert the 'configure two-factor' button into a currentUserAction and use a condition --- .../configure-mfa-providers-action.ts | 18 ++++++++++++++ .../user/current-user/mfa-login/manifests.ts | 24 ++++++++++++------- ...mfa-providers-current-user-app.element.ts} | 21 +++++++++------- 3 files changed, 46 insertions(+), 17 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/user/current-user/mfa-login/configure-mfa-providers-action.ts rename src/Umbraco.Web.UI.Client/src/packages/user/current-user/mfa-login/{mfa-providers-user-profile-app.element.ts => mfa-providers-current-user-app.element.ts} (67%) diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/mfa-login/configure-mfa-providers-action.ts b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/mfa-login/configure-mfa-providers-action.ts new file mode 100644 index 0000000000..bc644ec9bd --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/mfa-login/configure-mfa-providers-action.ts @@ -0,0 +1,18 @@ +import { UMB_CURRENT_USER_MFA_MODAL } from '../modals/current-user-mfa/current-user-mfa-modal.token.js'; +import { UmbActionBase } from '@umbraco-cms/backoffice/action'; +import type { UmbCurrentUserAction, UmbCurrentUserActionArgs } from '@umbraco-cms/backoffice/extension-registry'; +import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; + +export class UmbConfigureMfaProvidersApi + extends UmbActionBase> + implements UmbCurrentUserAction +{ + async getHref() { + return undefined; + } + + async execute() { + const modalManagerContext = await this.getContext(UMB_MODAL_MANAGER_CONTEXT); + await modalManagerContext.open(this, UMB_CURRENT_USER_MFA_MODAL).onSubmit(); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/mfa-login/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/mfa-login/manifests.ts index 1e922de8a2..e420f02f9e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/mfa-login/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/mfa-login/manifests.ts @@ -1,16 +1,24 @@ -import type { ManifestUserProfileApp } from '@umbraco-cms/backoffice/extension-registry'; +import { UmbConfigureMfaProvidersApi } from './configure-mfa-providers-action.js'; +import type { ManifestCurrentUserActionDefaultKind } from '@umbraco-cms/backoffice/extension-registry'; -export const userProfileApps: Array = [ +export const userProfileApps: Array = [ { - type: 'userProfileApp', - alias: 'Umb.UserProfileApp.CurrentUser.MfaLoginProviders', - name: 'MFA Login Providers User Profile App', - element: () => import('./mfa-providers-user-profile-app.element.js'), + type: 'currentUserAction', + kind: 'default', + alias: 'Umb.CurrentUser.App.MfaLoginProviders', + name: 'MFA Login Providers Current User App', weight: 800, + api: UmbConfigureMfaProvidersApi, meta: { - label: 'Two-Factor Authentication', - pathname: 'mfa-providers', + label: '#user_configureTwoFactor', + icon: 'lock', + look: 'secondary', }, + conditions: [ + { + alias: 'Umb.Condition.User.AllowMfaAction', + }, + ], }, ]; export const manifests = [...userProfileApps]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/mfa-login/mfa-providers-user-profile-app.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/mfa-login/mfa-providers-current-user-app.element.ts similarity index 67% rename from src/Umbraco.Web.UI.Client/src/packages/user/current-user/mfa-login/mfa-providers-user-profile-app.element.ts rename to src/Umbraco.Web.UI.Client/src/packages/user/current-user/mfa-login/mfa-providers-current-user-app.element.ts index 806f63ff9a..f48ab2e4ed 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/mfa-login/mfa-providers-user-profile-app.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/mfa-login/mfa-providers-current-user-app.element.ts @@ -6,8 +6,8 @@ import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; import { firstValueFrom } from '@umbraco-cms/backoffice/external/rxjs'; -@customElement('umb-mfa-providers-user-profile-app') -export class UmbMfaProvidersUserProfileAppElement extends UmbLitElement { +@customElement('umb-mfa-providers-current-user-app') +export class UmbMfaProvidersCurrentUserAppElement extends UmbLitElement { @state() _hasProviders = false; @@ -26,11 +26,14 @@ export class UmbMfaProvidersUserProfileAppElement extends UmbLitElement { } return html` - - - Configure Two Factor - - + + + Configure Two Factor + `; } @@ -42,10 +45,10 @@ export class UmbMfaProvidersUserProfileAppElement extends UmbLitElement { static styles = [UmbTextStyles]; } -export default UmbMfaProvidersUserProfileAppElement; +export default UmbMfaProvidersCurrentUserAppElement; declare global { interface HTMLElementTagNameMap { - 'umb-mfa-providers-user-profile-app': UmbMfaProvidersUserProfileAppElement; + 'umb-mfa-providers-current-user-app': UmbMfaProvidersCurrentUserAppElement; } } From aace91f08ad1d12a705c463efbee0812d090a629 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Wed, 10 Apr 2024 17:31:01 +0200 Subject: [PATCH 260/280] convert the 'edit' and 'change password' buttons into currentUserAction's --- .../user/current-user/current-user.context.ts | 1 + .../change-password-current-user.action.ts | 43 ++++++++++++++++++ .../profile/edit-current-user.action.ts | 38 ++++++++++++++++ .../user/current-user/profile/manifests.ts | 45 +++++++++++++++++-- 4 files changed, 124 insertions(+), 3 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/user/current-user/profile/change-password-current-user.action.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/user/current-user/profile/edit-current-user.action.ts 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 5de00944d5..2faa82b6ff 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 @@ -12,6 +12,7 @@ export class UmbCurrentUserContext extends UmbContextBase #currentUser = new UmbObjectState(undefined); readonly currentUser = this.#currentUser.asObservable(); + readonly unique = this.#currentUser.asObservablePart((user) => user?.unique); readonly languageIsoCode = this.#currentUser.asObservablePart((user) => user?.languageIsoCode); #authContext?: typeof UMB_AUTH_CONTEXT.TYPE; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/profile/change-password-current-user.action.ts b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/profile/change-password-current-user.action.ts new file mode 100644 index 0000000000..1b24d3e922 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/profile/change-password-current-user.action.ts @@ -0,0 +1,43 @@ +import { UMB_CURRENT_USER_CONTEXT } from '../current-user.context.js'; +import { UmbActionBase } from '@umbraco-cms/backoffice/action'; +import type { UmbCurrentUserAction, UmbCurrentUserActionArgs } from '@umbraco-cms/backoffice/extension-registry'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { UMB_CHANGE_PASSWORD_MODAL, UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; + +export class UmbChangePasswordCurrentUserAction + extends UmbActionBase> + implements UmbCurrentUserAction +{ + #unique?: string; + + constructor(host: UmbControllerHost, args: UmbCurrentUserActionArgs) { + super(host, args); + + this.consumeContext(UMB_CURRENT_USER_CONTEXT, (context) => { + this.observe( + context.unique, + (unique) => { + this.#unique = unique; + }, + 'umbEditCurrentUserActionObserver', + ); + }); + } + + async getHref() { + return undefined; + } + + async execute() { + if (!this.#unique) return; + + const modalManager = await this.getContext(UMB_MODAL_MANAGER_CONTEXT); + modalManager.open(this, UMB_CHANGE_PASSWORD_MODAL, { + data: { + user: { + unique: this.#unique, + }, + }, + }); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/profile/edit-current-user.action.ts b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/profile/edit-current-user.action.ts new file mode 100644 index 0000000000..ad02bc5285 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/profile/edit-current-user.action.ts @@ -0,0 +1,38 @@ +import { UMB_CURRENT_USER_CONTEXT } from '../current-user.context.js'; +import { UmbActionBase } from '@umbraco-cms/backoffice/action'; +import type { UmbCurrentUserAction, UmbCurrentUserActionArgs } from '@umbraco-cms/backoffice/extension-registry'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; + +export class UmbEditCurrentUserAction + extends UmbActionBase> + implements UmbCurrentUserAction +{ + #init; + #unique?: string; + + constructor(host: UmbControllerHost, args: UmbCurrentUserActionArgs) { + super(host, args); + + this.#init = new Promise((res) => { + this.consumeContext(UMB_CURRENT_USER_CONTEXT, (context) => { + this.observe( + context.unique, + (unique) => { + this.#unique = unique; + res(); + }, + 'umbEditCurrentUserActionObserver', + ); + }); + }); + } + + async getHref() { + await this.#init; + return `section/user-management/view/users/user/edit/${this.#unique}`; + } + + async execute() { + return; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/profile/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/profile/manifests.ts index 632490be5f..70cc917a96 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/profile/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/profile/manifests.ts @@ -1,6 +1,11 @@ -import type { ManifestUserProfileApp } from '@umbraco-cms/backoffice/extension-registry'; +import { UmbChangePasswordCurrentUserAction } from './change-password-current-user.action.js'; +import { UmbEditCurrentUserAction } from './edit-current-user.action.js'; +import type { + ManifestCurrentUserActionDefaultKind, + ManifestUserProfileApp, +} from '@umbraco-cms/backoffice/extension-registry'; -export const userProfileApps: Array = [ +const userProfileApps: Array = [ { type: 'userProfileApp', alias: 'Umb.UserProfileApp.CurrentUser.Profile', @@ -13,4 +18,38 @@ export const userProfileApps: Array = [ }, }, ]; -export const manifests = [...userProfileApps]; + +const currentUserActions: Array = [ + { + type: 'currentUserAction', + kind: 'default', + alias: 'Umb.CurrentUser.Button.Edit', + name: 'Current User Edit Button', + weight: 1000, + api: UmbEditCurrentUserAction, + meta: { + label: '#general_edit', + icon: 'edit', + }, + conditions: [ + { + alias: 'Umb.Condition.SectionUserPermission', + match: 'Umb.Section.Users', + }, + ], + }, + { + type: 'currentUserAction', + kind: 'default', + alias: 'Umb.CurrentUser.Button.ChangePassword', + name: 'Current User Change Password Button', + weight: 900, + api: UmbChangePasswordCurrentUserAction, + meta: { + label: '#general_changePassword', + icon: 'lock', + }, + }, +]; + +export const manifests = [...userProfileApps, ...currentUserActions]; From eb19b0b9afe60b1b7274ce52e0e9dbe33ae0232f Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Wed, 10 Apr 2024 17:32:48 +0200 Subject: [PATCH 261/280] remove the hardcoded 'Edit' and 'Change password' buttons --- ...t-user-profile-user-profile-app.element.ts | 55 +------------------ 1 file changed, 1 insertion(+), 54 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/profile/current-user-profile-user-profile-app.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/profile/current-user-profile-user-profile-app.element.ts index 5cc0d8e8f4..cc257c97df 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/profile/current-user-profile-user-profile-app.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/profile/current-user-profile-user-profile-app.element.ts @@ -1,65 +1,12 @@ -import { html, customElement, state, css } from '@umbraco-cms/backoffice/external/lit'; +import { html, customElement, css } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import { UMB_CHANGE_PASSWORD_MODAL, UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; -import { UMB_CURRENT_USER_CONTEXT, type UmbCurrentUserModel } from '@umbraco-cms/backoffice/current-user'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; @customElement('umb-current-user-profile-user-profile-app') export class UmbCurrentUserProfileUserProfileAppElement extends UmbLitElement { - @state() - private _currentUser?: UmbCurrentUserModel; - - #currentUserContext?: typeof UMB_CURRENT_USER_CONTEXT.TYPE; - - constructor() { - super(); - - this.consumeContext(UMB_CURRENT_USER_CONTEXT, (instance) => { - this.#currentUserContext = instance; - this._observeCurrentUser(); - }); - } - - private async _observeCurrentUser() { - if (!this.#currentUserContext) return; - - this.observe( - this.#currentUserContext.currentUser, - (currentUser) => { - this._currentUser = currentUser; - }, - 'umbCurrentUserObserver', - ); - } - - private _edit() { - if (!this._currentUser) return; - - history.pushState(null, '', 'section/user-management/view/users/user/edit/' + this._currentUser.unique); //TODO Change to a tag with href and make dynamic - //TODO Implement modal routing for the current-user-modal, so that the modal closes when navigating to the edit profile page - } - async #changePassword() { - if (!this._currentUser) throw new Error('Current User not found'); - - const modalManager = await this.getContext(UMB_MODAL_MANAGER_CONTEXT); - modalManager.open(this, UMB_CHANGE_PASSWORD_MODAL, { - data: { - user: { - unique: this._currentUser.unique, - }, - }, - }); - } - render() { return html` - - ${this.localize.term('general_edit')} - - - ${this.localize.term('general_changePassword')} - `; From b5e86c7c523aebdf30ba8ead8eb51c0ba19162ac Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Wed, 10 Apr 2024 17:35:54 +0200 Subject: [PATCH 262/280] remove 'external login' until it can be properly implemented --- ...ogin-providers-user-profile-app.element.ts | 25 ------------------- .../current-user/external-login/manifests.ts | 16 ------------ .../packages/user/current-user/manifests.ts | 2 -- 3 files changed, 43 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/user/current-user/external-login/external-login-providers-user-profile-app.element.ts delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/user/current-user/external-login/manifests.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/external-login/external-login-providers-user-profile-app.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/external-login/external-login-providers-user-profile-app.element.ts deleted file mode 100644 index 87e434b2f2..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/external-login/external-login-providers-user-profile-app.element.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { html, customElement } from '@umbraco-cms/backoffice/external/lit'; -import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; -import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; - -@customElement('umb-external-login-providers-user-profile-app') -export class UmbExternalLoginProvidersUserProfileAppElement extends UmbLitElement { - render() { - return html` - - External login providers - - - `; - } - - static styles = [UmbTextStyles]; -} - -export default UmbExternalLoginProvidersUserProfileAppElement; - -declare global { - interface HTMLElementTagNameMap { - 'umb-external-login-providers-user-profile-app': UmbExternalLoginProvidersUserProfileAppElement; - } -} diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/external-login/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/external-login/manifests.ts deleted file mode 100644 index 0d8cf09bbb..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/external-login/manifests.ts +++ /dev/null @@ -1,16 +0,0 @@ -import type { ManifestUserProfileApp } from '@umbraco-cms/backoffice/extension-registry'; - -export const userProfileApps: Array = [ - { - type: 'userProfileApp', - alias: 'Umb.UserProfileApp.CurrentUser.ExternalLoginProviders', - name: 'External Login Providers User Profile App', - element: () => import('./external-login-providers-user-profile-app.element.js'), - weight: 700, - meta: { - label: 'External Login Providers User Profile App', - pathname: 'externalLoginProviders', - }, - }, -]; -export const manifests = [...userProfileApps]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/manifests.ts index 65509321ec..e3212adbe1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/manifests.ts @@ -1,6 +1,5 @@ import { manifest as actionDefaultKindManifest } from './action/default.kind.js'; import { manifests as modalManifests } from './modals/manifests.js'; -import { manifests as externalLoginProviderManifests } from './external-login/manifests.js'; import { manifests as historyManifests } from './history/manifests.js'; import { manifests as mfaLoginProviderManifests } from './mfa-login/manifests.js'; import { manifests as profileManifests } from './profile/manifests.js'; @@ -31,7 +30,6 @@ export const headerApps: Array = [ export const manifests = [ actionDefaultKindManifest, - ...externalLoginProviderManifests, ...headerApps, ...historyManifests, ...mfaLoginProviderManifests, From de8fb32eebcbeaf69df4b333b1902aeaf0ac1805 Mon Sep 17 00:00:00 2001 From: Jacob Overgaard <752371+iOvergaard@users.noreply.github.com> Date: Wed, 10 Apr 2024 17:56:45 +0200 Subject: [PATCH 263/280] update lucide-static to 0.367.0 and remap now renamed icons --- src/Umbraco.Web.UI.Client/package-lock.json | 8 +- src/Umbraco.Web.UI.Client/package.json | 2 +- .../core/icon-registry/icon-dictionary.json | 86 ++++++++++--------- .../core/icon-registry/icons/icon-activity.js | 4 +- .../core/icon-registry/icons/icon-add.js | 4 +- .../icon-registry/icons/icon-addressbook.js | 4 +- .../icon-registry/icons/icon-alarm-clock.js | 4 +- .../icon-registry/icons/icon-alert-alt.js | 6 +- .../core/icon-registry/icons/icon-alert.js | 6 +- .../core/icon-registry/icons/icon-alt.js | 4 +- .../core/icon-registry/icons/icon-anchor.js | 8 +- .../core/icon-registry/icons/icon-app.js | 4 +- .../icons/icon-application-error.js | 16 +++- .../icons/icon-application-window-alt.js | 4 +- .../icons/icon-application-window.js | 4 +- .../core/icon-registry/icons/icon-arrivals.js | 4 +- .../icon-registry/icons/icon-arrow-down.js | 4 +- .../icon-registry/icons/icon-arrow-left.js | 4 +- .../icon-registry/icons/icon-arrow-right.js | 4 +- .../core/icon-registry/icons/icon-arrow-up.js | 4 +- .../icon-registry/icons/icon-attachment.js | 4 +- .../core/icon-registry/icons/icon-autofill.js | 14 +-- .../core/icon-registry/icons/icon-award.js | 4 +- .../icons/icon-axis-rotation-2.js | 4 +- .../icons/icon-axis-rotation-3.js | 4 +- .../icon-registry/icons/icon-axis-rotation.js | 4 +- .../icon-registry/icons/icon-backspace.js | 4 +- .../icon-registry/icons/icon-badge-add.js | 4 +- .../icon-registry/icons/icon-badge-remove.js | 4 +- .../icons/icon-badge-restricted.js | 4 +- .../core/icon-registry/icons/icon-ball.js | 18 +++- .../icon-registry/icons/icon-bar-chart.js | 4 +- .../core/icon-registry/icons/icon-barcode.js | 4 +- .../core/icon-registry/icons/icon-bars.js | 4 +- .../icon-registry/icons/icon-battery-full.js | 4 +- .../icon-registry/icons/icon-battery-low.js | 4 +- .../icon-registry/icons/icon-beer-glass.js | 4 +- .../core/icon-registry/icons/icon-bell-off.js | 4 +- .../core/icon-registry/icons/icon-bell.js | 4 +- .../icon-registry/icons/icon-binarycode.js | 4 +- .../core/icon-registry/icons/icon-bird.js | 4 +- .../icon-registry/icons/icon-birthday-cake.js | 16 ++-- .../core/icon-registry/icons/icon-block.js | 4 +- .../icon-registry/icons/icon-bluetooth.js | 4 +- .../icon-registry/icons/icon-boat-shipping.js | 4 +- .../core/icon-registry/icons/icon-bones.js | 4 +- .../icon-registry/icons/icon-book-alt-2.js | 4 +- .../core/icon-registry/icons/icon-book-alt.js | 4 +- .../core/icon-registry/icons/icon-book.js | 4 +- .../core/icon-registry/icons/icon-bookmark.js | 4 +- .../core/icon-registry/icons/icon-books.js | 4 +- .../core/icon-registry/icons/icon-box-alt.js | 4 +- .../core/icon-registry/icons/icon-box-open.js | 12 +-- .../core/icon-registry/icons/icon-box.js | 4 +- .../core/icon-registry/icons/icon-brackets.js | 4 +- .../core/icon-registry/icons/icon-brick.js | 4 +- .../icon-registry/icons/icon-briefcase.js | 8 +- .../icons/icon-browser-window.js | 4 +- .../icon-registry/icons/icon-brush-alt-2.js | 4 +- .../icon-registry/icons/icon-brush-alt.js | 4 +- .../core/icon-registry/icons/icon-brush.js | 4 +- .../core/icon-registry/icons/icon-bug.js | 4 +- .../icon-registry/icons/icon-bulleted-list.js | 4 +- .../core/icon-registry/icons/icon-burn.js | 6 +- .../core/icon-registry/icons/icon-bus.js | 4 +- .../icon-registry/icons/icon-calculator.js | 4 +- .../icon-registry/icons/icon-calendar-alt.js | 12 +-- .../core/icon-registry/icons/icon-calendar.js | 12 +-- .../icon-registry/icons/icon-camcorder.js | 8 +- .../icon-registry/icons/icon-camera-roll.js | 4 +- .../core/icon-registry/icons/icon-candy.js | 4 +- .../icon-registry/icons/icon-caps-lock.js | 4 +- .../core/icon-registry/icons/icon-car.js | 4 +- .../icon-registry/icons/icon-categories.js | 4 +- .../icon-registry/icons/icon-certificate.js | 9 +- .../icon-registry/icons/icon-chart-curve.js | 4 +- .../core/icon-registry/icons/icon-chart.js | 4 +- .../icon-registry/icons/icon-chat-active.js | 6 +- .../core/icon-registry/icons/icon-chat.js | 6 +- .../core/icon-registry/icons/icon-check.js | 6 +- .../icons/icon-checkbox-dotted.js | 4 +- .../icons/icon-checkbox-empty.js | 4 +- .../core/icon-registry/icons/icon-checkbox.js | 8 +- .../core/icon-registry/icons/icon-chip-alt.js | 8 +- .../core/icon-registry/icons/icon-chip.js | 8 +- .../core/icon-registry/icons/icon-cinema.js | 22 ++--- .../icons/icon-circle-dotted-active.js | 8 +- .../icon-registry/icons/icon-circle-dotted.js | 20 +++-- .../core/icon-registry/icons/icon-circuits.js | 4 +- .../core/icon-registry/icons/icon-client.js | 4 +- .../icon-registry/icons/icon-cloud-drive.js | 4 +- .../icon-registry/icons/icon-cloud-upload.js | 4 +- .../core/icon-registry/icons/icon-cloud.js | 4 +- .../core/icon-registry/icons/icon-cloudy.js | 4 +- .../core/icon-registry/icons/icon-clubs.js | 4 +- .../core/icon-registry/icons/icon-cocktail.js | 4 +- .../core/icon-registry/icons/icon-code.js | 4 +- .../core/icon-registry/icons/icon-coffee.js | 13 +-- .../icon-registry/icons/icon-coin-dollar.js | 16 +++- .../icon-registry/icons/icon-coin-euro.js | 4 +- .../icon-registry/icons/icon-coin-pound.js | 18 +++- .../core/icon-registry/icons/icon-coin-yen.js | 4 +- .../icon-registry/icons/icon-coins-alt.js | 4 +- .../core/icon-registry/icons/icon-coins.js | 4 +- .../icon-registry/icons/icon-color-bucket.js | 4 +- .../icon-registry/icons/icon-colorpicker.js | 4 +- .../core/icon-registry/icons/icon-columns.js | 4 +- .../icons/icon-combination-lock-open.js | 6 +- .../icons/icon-combination-lock.js | 4 +- .../core/icon-registry/icons/icon-command.js | 4 +- .../core/icon-registry/icons/icon-company.js | 4 +- .../core/icon-registry/icons/icon-compress.js | 8 +- .../icon-registry/icons/icon-connection.js | 6 +- .../core/icon-registry/icons/icon-console.js | 4 +- .../core/icon-registry/icons/icon-contrast.js | 4 +- .../icons/icon-conversation-alt.js | 6 +- .../icon-registry/icons/icon-conversation.js | 4 +- .../icon-registry/icons/icon-coverflow.js | 4 +- .../icons/icon-credit-card-alt.js | 4 +- .../icon-registry/icons/icon-credit-card.js | 4 +- .../core/icon-registry/icons/icon-crop.js | 4 +- .../icon-registry/icons/icon-crosshair.js | 4 +- .../icon-registry/icons/icon-crown-alt.js | 7 +- .../core/icon-registry/icons/icon-crown.js | 7 +- .../core/icon-registry/icons/icon-cupcake.js | 4 +- .../core/icon-registry/icons/icon-curve.js | 4 +- .../core/icon-registry/icons/icon-cut.js | 4 +- .../icon-registry/icons/icon-dashboard.js | 4 +- .../core/icon-registry/icons/icon-database.js | 4 +- .../core/icon-registry/icons/icon-defrag.js | 14 +-- .../icon-registry/icons/icon-delete-key.js | 4 +- .../core/icon-registry/icons/icon-delete.js | 4 +- .../icon-registry/icons/icon-departure.js | 4 +- .../core/icon-registry/icons/icon-desktop.js | 4 +- .../icon-registry/icons/icon-diagnostics.js | 4 +- .../icons/icon-diagonal-arrow-alt.js | 4 +- .../icons/icon-diagonal-arrow.js | 4 +- .../core/icon-registry/icons/icon-diamond.js | 4 +- .../core/icon-registry/icons/icon-diamonds.js | 4 +- .../core/icon-registry/icons/icon-dice.js | 4 +- .../icon-registry/icons/icon-diploma-alt.js | 4 +- .../core/icon-registry/icons/icon-diploma.js | 4 +- .../icons/icon-directions-alt.js | 4 +- .../icon-registry/icons/icon-directions.js | 4 +- .../core/icon-registry/icons/icon-disc.js | 4 +- .../icon-registry/icons/icon-disk-image.js | 4 +- .../core/icon-registry/icons/icon-display.js | 4 +- .../core/icon-registry/icons/icon-dna.js | 4 +- .../icons/icon-dock-connector.js | 16 ++-- .../icons/icon-document-dashed-line.js | 8 +- .../core/icon-registry/icons/icon-document.js | 8 +- .../icon-registry/icons/icon-documents.js | 10 ++- .../core/icon-registry/icons/icon-donate.js | 9 +- .../icon-registry/icons/icon-door-open-alt.js | 4 +- .../icon-registry/icons/icon-door-open.js | 4 +- .../icon-registry/icons/icon-download-alt.js | 4 +- .../core/icon-registry/icons/icon-download.js | 4 +- .../core/icon-registry/icons/icon-drop.js | 4 +- .../core/icon-registry/icons/icon-eco.js | 4 +- .../core/icon-registry/icons/icon-economy.js | 4 +- .../core/icon-registry/icons/icon-edit.js | 4 +- .../core/icon-registry/icons/icon-employee.js | 4 +- .../icons/icon-energy-saving-bulb.js | 4 +- .../core/icon-registry/icons/icon-enter.js | 4 +- .../icon-registry/icons/icon-equalizer.js | 4 +- .../core/icon-registry/icons/icon-escape.js | 4 +- .../core/icon-registry/icons/icon-ethernet.js | 4 +- .../icons/icon-exit-fullscreen.js | 18 +++- .../core/icon-registry/icons/icon-eye.js | 4 +- .../icon-registry/icons/icon-facebook-like.js | 4 +- .../core/icon-registry/icons/icon-factory.js | 4 +- .../core/icon-registry/icons/icon-favorite.js | 4 +- .../icon-registry/icons/icon-file-cabinet.js | 4 +- .../core/icon-registry/icons/icon-files.js | 8 +- .../icon-registry/icons/icon-filter-arrows.js | 19 +++- .../core/icon-registry/icons/icon-filter.js | 4 +- .../icon-registry/icons/icon-fingerprint.js | 14 +-- .../core/icon-registry/icons/icon-fire.js | 4 +- .../core/icon-registry/icons/icon-firewire.js | 4 +- .../core/icon-registry/icons/icon-flag-alt.js | 4 +- .../core/icon-registry/icons/icon-flag.js | 4 +- .../core/icon-registry/icons/icon-flash.js | 6 +- .../icon-registry/icons/icon-flashlight.js | 4 +- .../icon-registry/icons/icon-flowerpot.js | 4 +- .../core/icon-registry/icons/icon-folder.js | 4 +- .../core/icon-registry/icons/icon-folders.js | 4 +- .../core/icon-registry/icons/icon-font.js | 4 +- .../core/icon-registry/icons/icon-food.js | 4 +- .../icon-registry/icons/icon-footprints.js | 4 +- .../core/icon-registry/icons/icon-forking.js | 4 +- .../icon-registry/icons/icon-frame-alt.js | 4 +- .../core/icon-registry/icons/icon-frame.js | 4 +- .../icons/icon-fullscreen-alt.js | 4 +- .../icon-registry/icons/icon-fullscreen.js | 4 +- .../core/icon-registry/icons/icon-game.js | 4 +- .../core/icon-registry/icons/icon-geometry.js | 4 +- .../core/icon-registry/icons/icon-gift.js | 4 +- .../core/icon-registry/icons/icon-glasses.js | 4 +- .../icon-registry/icons/icon-globe-alt.js | 4 +- .../icon-registry/icons/icon-globe-asia.js | 4 +- .../icons/icon-globe-europe-africa.js | 4 +- .../icons/icon-globe-inverted-america.js | 4 +- .../icons/icon-globe-inverted-asia.js | 4 +- .../icon-globe-inverted-europe-africa.js | 4 +- .../core/icon-registry/icons/icon-globe.js | 4 +- .../core/icon-registry/icons/icon-gps.js | 4 +- .../core/icon-registry/icons/icon-graduate.js | 9 +- .../core/icon-registry/icons/icon-grid.js | 4 +- .../core/icon-registry/icons/icon-hammer.js | 10 ++- .../icons/icon-hand-active-alt.js | 4 +- .../icon-registry/icons/icon-hand-active.js | 4 +- .../icons/icon-hand-pointer-alt.js | 4 +- .../icon-registry/icons/icon-hand-pointer.js | 4 +- .../icon-registry/icons/icon-handshake.js | 4 +- .../icon-registry/icons/icon-handtool-alt.js | 4 +- .../core/icon-registry/icons/icon-handtool.js | 4 +- .../icons/icon-hard-drive-alt.js | 4 +- .../icon-registry/icons/icon-hard-drive.js | 4 +- .../icon-registry/icons/icon-headphones.js | 4 +- .../core/icon-registry/icons/icon-headset.js | 4 +- .../core/icon-registry/icons/icon-hearts.js | 4 +- .../core/icon-registry/icons/icon-height.js | 4 +- .../core/icon-registry/icons/icon-help-alt.js | 4 +- .../core/icon-registry/icons/icon-help.js | 12 +-- .../core/icon-registry/icons/icon-home.js | 4 +- .../icon-registry/icons/icon-hourglass.js | 4 +- .../core/icon-registry/icons/icon-imac.js | 4 +- .../icon-registry/icons/icon-inbox-full.js | 4 +- .../core/icon-registry/icons/icon-inbox.js | 4 +- .../core/icon-registry/icons/icon-indent.js | 4 +- .../core/icon-registry/icons/icon-infinity.js | 4 +- .../core/icon-registry/icons/icon-info.js | 4 +- .../core/icon-registry/icons/icon-invoice.js | 4 +- .../core/icon-registry/icons/icon-ipad.js | 4 +- .../core/icon-registry/icons/icon-iphone.js | 4 +- .../icons/icon-item-arrangement.js | 4 +- .../core/icon-registry/icons/icon-junk.js | 4 +- .../core/icon-registry/icons/icon-key.js | 6 +- .../core/icon-registry/icons/icon-keyboard.js | 20 +++-- .../core/icon-registry/icons/icon-lab.js | 4 +- .../core/icon-registry/icons/icon-laptop.js | 4 +- .../icon-registry/icons/icon-layers-alt.js | 4 +- .../core/icon-registry/icons/icon-layers.js | 4 +- .../core/icon-registry/icons/icon-layout.js | 11 ++- .../icons/icon-left-double-arrow.js | 4 +- .../core/icon-registry/icons/icon-legal.js | 4 +- .../core/icon-registry/icons/icon-lense.js | 4 +- .../core/icon-registry/icons/icon-library.js | 4 +- .../icon-registry/icons/icon-light-down.js | 4 +- .../core/icon-registry/icons/icon-light-up.js | 4 +- .../icons/icon-lightbulb-active.js | 17 +++- .../icon-registry/icons/icon-lightbulb.js | 19 +++- .../icon-registry/icons/icon-lightning.js | 4 +- .../core/icon-registry/icons/icon-link.js | 4 +- .../core/icon-registry/icons/icon-list.js | 4 +- .../core/icon-registry/icons/icon-load.js | 4 +- .../core/icon-registry/icons/icon-loading.js | 4 +- .../core/icon-registry/icons/icon-locate.js | 19 +++- .../icons/icon-location-near-me.js | 17 +++- .../icons/icon-location-nearby.js | 4 +- .../core/icon-registry/icons/icon-lock.js | 4 +- .../core/icon-registry/icons/icon-log-out.js | 4 +- .../core/icon-registry/icons/icon-logout.js | 4 +- .../core/icon-registry/icons/icon-loupe.js | 4 +- .../core/icon-registry/icons/icon-magnet.js | 4 +- .../core/icon-registry/icons/icon-mailbox.js | 4 +- .../core/icon-registry/icons/icon-map-alt.js | 4 +- .../icon-registry/icons/icon-map-location.js | 4 +- .../icon-registry/icons/icon-map-marker.js | 4 +- .../core/icon-registry/icons/icon-map.js | 10 ++- .../core/icon-registry/icons/icon-medal.js | 4 +- .../icons/icon-medical-emergency.js | 4 +- .../core/icon-registry/icons/icon-medicine.js | 4 +- .../core/icon-registry/icons/icon-meeting.js | 4 +- .../icon-registry/icons/icon-megaphone.js | 4 +- .../core/icon-registry/icons/icon-merge.js | 4 +- .../icon-registry/icons/icon-message-open.js | 4 +- .../icons/icon-message-unopened.js | 4 +- .../core/icon-registry/icons/icon-message.js | 4 +- .../icon-registry/icons/icon-microscope.js | 4 +- .../core/icon-registry/icons/icon-mindmap.js | 4 +- .../core/icon-registry/icons/icon-mobile.js | 4 +- .../core/icon-registry/icons/icon-mountain.js | 4 +- .../icon-registry/icons/icon-mouse-cursor.js | 4 +- .../core/icon-registry/icons/icon-mouse.js | 4 +- .../icon-registry/icons/icon-movie-alt.js | 4 +- .../core/icon-registry/icons/icon-movie.js | 4 +- .../icons/icon-multiple-credit-cards.js | 4 +- .../icons/icon-multiple-windows.js | 17 +++- .../core/icon-registry/icons/icon-music.js | 4 +- .../icon-registry/icons/icon-name-badge.js | 4 +- .../icons/icon-navigation-bottom.js | 4 +- .../icons/icon-navigation-down.js | 4 +- .../icons/icon-navigation-first.js | 4 +- .../icons/icon-navigation-horizontal.js | 4 +- .../icons/icon-navigation-last.js | 4 +- .../icons/icon-navigation-left.js | 4 +- .../icons/icon-navigation-right.js | 4 +- .../icons/icon-navigation-road.js | 4 +- .../icons/icon-navigation-top.js | 17 +++- .../icon-registry/icons/icon-navigation-up.js | 4 +- .../icons/icon-navigation-vertical.js | 4 +- .../icon-registry/icons/icon-navigation.js | 4 +- .../icons/icon-navigational-arrow.js | 4 +- .../icon-registry/icons/icon-network-alt.js | 4 +- .../icon-registry/icons/icon-newspaper-alt.js | 4 +- .../icon-registry/icons/icon-newspaper.js | 4 +- .../icon-registry/icons/icon-next-media.js | 4 +- .../core/icon-registry/icons/icon-next.js | 6 +- .../core/icon-registry/icons/icon-nodes.js | 4 +- .../icon-registry/icons/icon-notepad-alt.js | 14 +-- .../core/icon-registry/icons/icon-notepad.js | 14 +-- .../core/icon-registry/icons/icon-old-key.js | 4 +- .../icon-registry/icons/icon-old-phone.js | 4 +- .../core/icon-registry/icons/icon-operator.js | 4 +- .../icon-registry/icons/icon-ordered-list.js | 4 +- .../core/icon-registry/icons/icon-out.js | 8 +- .../core/icon-registry/icons/icon-outbox.js | 4 +- .../core/icon-registry/icons/icon-outdent.js | 4 +- .../core/icon-registry/icons/icon-page-add.js | 8 +- .../icon-registry/icons/icon-page-down.js | 4 +- .../icon-registry/icons/icon-page-remove.js | 8 +- .../icons/icon-page-restricted.js | 10 ++- .../core/icon-registry/icons/icon-page-up.js | 4 +- .../icon-registry/icons/icon-paint-roller.js | 4 +- .../core/icon-registry/icons/icon-palette.js | 12 +-- .../icon-registry/icons/icon-panel-show.js | 8 +- .../icon-registry/icons/icon-pannel-close.js | 8 +- .../icon-registry/icons/icon-paper-bag.js | 12 +-- .../icons/icon-paper-plane-alt.js | 4 +- .../icon-registry/icons/icon-paper-plane.js | 4 +- .../icon-registry/icons/icon-partly-cloudy.js | 4 +- .../core/icon-registry/icons/icon-paste-in.js | 4 +- .../core/icon-registry/icons/icon-pause.js | 8 +- .../core/icon-registry/icons/icon-pc.js | 4 +- .../icon-registry/icons/icon-people-alt-2.js | 4 +- .../icon-registry/icons/icon-people-alt.js | 4 +- .../icon-registry/icons/icon-people-female.js | 4 +- .../core/icon-registry/icons/icon-people.js | 4 +- .../icon-registry/icons/icon-phone-ring.js | 4 +- .../core/icon-registry/icons/icon-phone.js | 4 +- .../icon-registry/icons/icon-photo-album.js | 4 +- .../core/icon-registry/icons/icon-picture.js | 4 +- .../icons/icon-pictures-alt-2.js | 4 +- .../icon-registry/icons/icon-pictures-alt.js | 4 +- .../core/icon-registry/icons/icon-pictures.js | 4 +- .../icon-registry/icons/icon-pie-chart.js | 4 +- .../icon-registry/icons/icon-piggy-bank.js | 4 +- .../icon-registry/icons/icon-pin-location.js | 4 +- .../core/icon-registry/icons/icon-plane.js | 4 +- .../core/icon-registry/icons/icon-planet.js | 4 +- .../core/icon-registry/icons/icon-play.js | 6 +- .../icon-registry/icons/icon-playing-cards.js | 4 +- .../core/icon-registry/icons/icon-playlist.js | 4 +- .../core/icon-registry/icons/icon-plugin.js | 4 +- .../core/icon-registry/icons/icon-podcast.js | 10 ++- .../core/icon-registry/icons/icon-poll.js | 4 +- .../core/icon-registry/icons/icon-post-it.js | 8 +- .../icon-registry/icons/icon-power-outlet.js | 4 +- .../core/icon-registry/icons/icon-power.js | 4 +- .../icon-registry/icons/icon-presentation.js | 4 +- .../icons/icon-previous-media.js | 4 +- .../core/icon-registry/icons/icon-previous.js | 4 +- .../icon-registry/icons/icon-price-dollar.js | 4 +- .../icon-registry/icons/icon-price-euro.js | 4 +- .../icon-registry/icons/icon-price-pound.js | 4 +- .../icon-registry/icons/icon-price-yen.js | 19 +++- .../core/icon-registry/icons/icon-print.js | 4 +- .../icon-registry/icons/icon-printer-alt.js | 4 +- .../icon-registry/icons/icon-projector.js | 4 +- .../core/icon-registry/icons/icon-pulse.js | 4 +- .../core/icon-registry/icons/icon-pushpin.js | 4 +- .../core/icon-registry/icons/icon-qr-code.js | 4 +- .../core/icon-registry/icons/icon-quote.js | 4 +- .../icon-registry/icons/icon-radio-alt.js | 4 +- .../icons/icon-radio-receiver.js | 4 +- .../core/icon-registry/icons/icon-radio.js | 4 +- .../core/icon-registry/icons/icon-rain.js | 4 +- .../core/icon-registry/icons/icon-rate.js | 4 +- .../core/icon-registry/icons/icon-re-post.js | 4 +- .../core/icon-registry/icons/icon-readonly.js | 4 +- .../icon-registry/icons/icon-receipt-alt.js | 8 +- .../icon-registry/icons/icon-reception.js | 6 +- .../core/icon-registry/icons/icon-record.js | 4 +- .../icons/icon-rectangle-ellipsis.js | 17 ++++ .../core/icon-registry/icons/icon-redo.js | 4 +- .../core/icon-registry/icons/icon-refresh.js | 4 +- .../core/icon-registry/icons/icon-remote.js | 4 +- .../core/icon-registry/icons/icon-remove.js | 4 +- .../icon-registry/icons/icon-repeat-one.js | 4 +- .../core/icon-registry/icons/icon-repeat.js | 4 +- .../icon-registry/icons/icon-reply-arrow.js | 4 +- .../core/icon-registry/icons/icon-resize.js | 18 +++- .../icon-registry/icons/icon-return-to-top.js | 4 +- .../icons/icon-right-double-arrow.js | 4 +- .../core/icon-registry/icons/icon-roadsign.js | 4 +- .../core/icon-registry/icons/icon-rocket.js | 4 +- .../core/icon-registry/icons/icon-rss.js | 4 +- .../icon-registry/icons/icon-ruler-alt.js | 4 +- .../core/icon-registry/icons/icon-ruler.js | 4 +- .../icons/icon-satellite-dish.js | 4 +- .../core/icon-registry/icons/icon-save.js | 4 +- .../core/icon-registry/icons/icon-scan.js | 4 +- .../core/icon-registry/icons/icon-school.js | 17 ++-- .../icon-registry/icons/icon-screensharing.js | 4 +- .../icon-registry/icons/icon-script-alt.js | 4 +- .../core/icon-registry/icons/icon-script.js | 4 +- .../core/icon-registry/icons/icon-scull.js | 4 +- .../core/icon-registry/icons/icon-search.js | 4 +- .../core/icon-registry/icons/icon-sensor.js | 4 +- .../icon-registry/icons/icon-server-alt.js | 4 +- .../core/icon-registry/icons/icon-server.js | 4 +- .../icon-registry/icons/icon-settings-alt.js | 4 +- .../core/icon-registry/icons/icon-settings.js | 4 +- .../icon-registry/icons/icon-share-alt.js | 10 ++- .../core/icon-registry/icons/icon-share.js | 4 +- .../icons/icon-sharing-iphone.js | 4 +- .../core/icon-registry/icons/icon-shield.js | 6 +- .../core/icon-registry/icons/icon-shift.js | 4 +- .../icon-registry/icons/icon-shipping-box.js | 4 +- .../core/icon-registry/icons/icon-shipping.js | 4 +- .../core/icon-registry/icons/icon-shoe.js | 4 +- .../icons/icon-shopping-basket-alt-2.js | 12 +-- .../icons/icon-shopping-basket-alt.js | 12 +-- .../icons/icon-shopping-basket.js | 4 +- .../core/icon-registry/icons/icon-shuffle.js | 4 +- .../core/icon-registry/icons/icon-sience.js | 4 +- .../icon-registry/icons/icon-single-note.js | 4 +- .../core/icon-registry/icons/icon-sitemap.js | 4 +- .../core/icon-registry/icons/icon-sleep.js | 4 +- .../icon-registry/icons/icon-slideshow.js | 4 +- .../icons/icon-smiley-inverted.js | 4 +- .../core/icon-registry/icons/icon-smiley.js | 4 +- .../core/icon-registry/icons/icon-snow.js | 4 +- .../icon-registry/icons/icon-sound-low.js | 4 +- .../icon-registry/icons/icon-sound-medium.js | 4 +- .../icon-registry/icons/icon-sound-off.js | 4 +- .../icon-registry/icons/icon-sound-waves.js | 4 +- .../core/icon-registry/icons/icon-sound.js | 4 +- .../core/icon-registry/icons/icon-spades.js | 8 +- .../core/icon-registry/icons/icon-speaker.js | 9 +- .../icon-registry/icons/icon-speed-gauge.js | 4 +- .../icon-registry/icons/icon-split-alt.js | 17 +++- .../core/icon-registry/icons/icon-split.js | 4 +- .../core/icon-registry/icons/icon-sprout.js | 4 +- .../icon-registry/icons/icon-squiggly-line.js | 4 +- .../core/icon-registry/icons/icon-ssd.js | 4 +- .../icon-registry/icons/icon-stacked-disks.js | 4 +- .../core/icon-registry/icons/icon-stamp.js | 4 +- .../core/icon-registry/icons/icon-star.js | 4 +- .../core/icon-registry/icons/icon-stop-alt.js | 4 +- .../icon-registry/icons/icon-stop-hand.js | 4 +- .../core/icon-registry/icons/icon-stop.js | 4 +- .../core/icon-registry/icons/icon-store.js | 14 +-- .../core/icon-registry/icons/icon-stream.js | 4 +- .../core/icon-registry/icons/icon-sunny.js | 4 +- .../icon-registry/icons/icon-sweatshirt.js | 4 +- .../core/icon-registry/icons/icon-sync.js | 4 +- .../core/icon-registry/icons/icon-t-shirt.js | 4 +- .../core/icon-registry/icons/icon-tab-key.js | 4 +- .../core/icon-registry/icons/icon-tag.js | 8 +- .../core/icon-registry/icons/icon-tags.js | 8 +- .../icon-registry/icons/icon-takeaway-cup.js | 4 +- .../core/icon-registry/icons/icon-target.js | 4 +- .../icons/icon-temperatrure-alt.js | 4 +- .../icon-registry/icons/icon-temperature.js | 4 +- .../core/icon-registry/icons/icon-terminal.js | 4 +- .../core/icon-registry/icons/icon-theater.js | 20 +++-- .../icon-registry/icons/icon-thumb-down.js | 4 +- .../core/icon-registry/icons/icon-thumb-up.js | 4 +- .../icons/icon-thumbnail-list.js | 4 +- .../icons/icon-thumbnails-small.js | 4 +- .../icon-registry/icons/icon-thumbnails.js | 4 +- .../core/icon-registry/icons/icon-ticket.js | 4 +- .../core/icon-registry/icons/icon-time.js | 4 +- .../core/icon-registry/icons/icon-timer.js | 4 +- .../core/icon-registry/icons/icon-tools.js | 4 +- .../core/icon-registry/icons/icon-top.js | 4 +- .../icon-registry/icons/icon-traffic-alt.js | 4 +- .../core/icon-registry/icons/icon-trafic.js | 4 +- .../core/icon-registry/icons/icon-train.js | 4 +- .../icon-registry/icons/icon-trash-alt-2.js | 4 +- .../icon-registry/icons/icon-trash-alt.js | 4 +- .../core/icon-registry/icons/icon-trash.js | 4 +- .../core/icon-registry/icons/icon-tree.js | 6 +- .../core/icon-registry/icons/icon-trophy.js | 4 +- .../core/icon-registry/icons/icon-truck.js | 13 +-- .../core/icon-registry/icons/icon-tv-old.js | 4 +- .../core/icon-registry/icons/icon-tv.js | 4 +- .../icon-registry/icons/icon-umb-content.js | 8 +- .../icon-registry/icons/icon-umb-developer.js | 4 +- .../icon-registry/icons/icon-umb-media.js | 4 +- .../icon-registry/icons/icon-umb-settings.js | 4 +- .../icon-registry/icons/icon-umb-users.js | 4 +- .../core/icon-registry/icons/icon-umbrella.js | 4 +- .../core/icon-registry/icons/icon-undo.js | 4 +- .../core/icon-registry/icons/icon-unlocked.js | 4 +- .../core/icon-registry/icons/icon-untitled.js | 4 +- .../icon-registry/icons/icon-usb-connector.js | 16 ++-- .../core/icon-registry/icons/icon-usb.js | 4 +- .../icon-registry/icons/icon-user-female.js | 4 +- .../icons/icon-user-females-alt.js | 4 +- .../icon-registry/icons/icon-user-females.js | 4 +- .../icon-registry/icons/icon-user-glasses.js | 4 +- .../core/icon-registry/icons/icon-user.js | 4 +- .../icon-registry/icons/icon-users-alt.js | 4 +- .../core/icon-registry/icons/icon-users.js | 4 +- .../icon-registry/icons/icon-utilities.js | 4 +- .../core/icon-registry/icons/icon-vcard.js | 4 +- .../core/icon-registry/icons/icon-video.js | 8 +- .../core/icon-registry/icons/icon-voice.js | 4 +- .../icon-registry/icons/icon-wall-plug.js | 4 +- .../core/icon-registry/icons/icon-wallet.js | 9 +- .../core/icon-registry/icons/icon-wand.js | 6 +- .../core/icon-registry/icons/icon-webhook.js | 4 +- .../core/icon-registry/icons/icon-weight.js | 4 +- .../core/icon-registry/icons/icon-width.js | 4 +- .../core/icon-registry/icons/icon-wifi.js | 10 ++- .../icon-registry/icons/icon-window-popin.js | 4 +- .../icon-registry/icons/icon-window-sizes.js | 10 ++- .../icon-registry/icons/icon-wine-glass.js | 4 +- .../core/icon-registry/icons/icon-wrench.js | 4 +- .../core/icon-registry/icons/icon-wrong.js | 4 +- .../core/icon-registry/icons/icon-zip.js | 8 +- .../core/icon-registry/icons/icon-zom-out.js | 4 +- .../core/icon-registry/icons/icon-zoom-in.js | 4 +- .../core/icon-registry/icons/icon-zoom-out.js | 4 +- .../core/icon-registry/icons/icons.json | 2 +- 528 files changed, 2080 insertions(+), 809 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-rectangle-ellipsis.js diff --git a/src/Umbraco.Web.UI.Client/package-lock.json b/src/Umbraco.Web.UI.Client/package-lock.json index 036d0d08d3..e0a47af8c8 100644 --- a/src/Umbraco.Web.UI.Client/package-lock.json +++ b/src/Umbraco.Web.UI.Client/package-lock.json @@ -63,7 +63,7 @@ "eslint-plugin-storybook": "^0.6.15", "eslint-plugin-wc": "^2.0.4", "glob": "^10.3.10", - "lucide-static": "^0.290.0", + "lucide-static": "^0.367.0", "msw": "^1.3.2", "playwright-msw": "^3.0.1", "prettier": "3.2.5", @@ -14890,9 +14890,9 @@ } }, "node_modules/lucide-static": { - "version": "0.290.0", - "resolved": "https://registry.npmjs.org/lucide-static/-/lucide-static-0.290.0.tgz", - "integrity": "sha512-g2JVS1v2xVypOyMRrWH5lFhJwAftBvAn732Ig4VqS60+4MtL1F+bsbI8wVG3MM6RFhL12gT1hs5vEZufr6XbKA==", + "version": "0.367.0", + "resolved": "https://registry.npmjs.org/lucide-static/-/lucide-static-0.367.0.tgz", + "integrity": "sha512-68o8sSfBE6+4RKtMkwqTqZIrYzORlLgnT1s0nBspUWeD96SLpAcb/tbralI/YvvO7yxFe6Qd0hH3iboa2cKKXg==", "dev": true }, "node_modules/lunr": { diff --git a/src/Umbraco.Web.UI.Client/package.json b/src/Umbraco.Web.UI.Client/package.json index 7f6b95a7ec..8b9792bc73 100644 --- a/src/Umbraco.Web.UI.Client/package.json +++ b/src/Umbraco.Web.UI.Client/package.json @@ -220,7 +220,7 @@ "eslint-plugin-storybook": "^0.6.15", "eslint-plugin-wc": "^2.0.4", "glob": "^10.3.10", - "lucide-static": "^0.290.0", + "lucide-static": "^0.367.0", "msw": "^1.3.2", "playwright-msw": "^3.0.1", "prettier": "3.2.5", diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icon-dictionary.json b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icon-dictionary.json index 99fb107023..b573765d43 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icon-dictionary.json +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icon-dictionary.json @@ -18,11 +18,11 @@ }, { "name": "icon-alert-alt", - "file": "alert-triangle.svg" + "file": "triangle-alert.svg" }, { "name": "icon-alert", - "file": "alert-triangle.svg" + "file": "triangle-alert.svg" }, { "name": "icon-alt", @@ -38,7 +38,7 @@ }, { "name": "icon-application-error", - "file": "application-error.svg" + "file": "circle-x.svg" }, { "name": "icon-application-window-alt", @@ -114,7 +114,7 @@ }, { "name": "icon-badge-add", - "file": "plus-circle.svg" + "file": "circle-plus.svg" }, { "_name": "icon-badge-count", @@ -122,7 +122,7 @@ }, { "name": "icon-badge-remove", - "file": "minus-circle.svg" + "file": "circle-minus.svg" }, { "name": "icon-badge-restricted", @@ -131,7 +131,7 @@ }, { "name": "icon-ball", - "file": "dribble.svg" + "file": "dribbble.svg" }, { "_name": "icon-band-aid", @@ -410,7 +410,7 @@ }, { "name": "icon-checkbox", - "file": "check-square.svg" + "file": "square-check.svg" }, { "_name": "icon-chess", @@ -431,7 +431,7 @@ }, { "name": "icon-circle-dotted-active", - "file": "check-circle.svg" + "file": "circle-check.svg" }, { "name": "icon-circle-dotted", @@ -460,7 +460,7 @@ }, { "name": "icon-cloud-upload", - "file": "upload-cloud.svg" + "file": "cloud-upload.svg" }, { "name": "icon-cloud", @@ -488,7 +488,7 @@ }, { "name": "icon-coin-dollar", - "file": "dollar.svg" + "file": "dollar-sign.svg" }, { "name": "icon-coin-euro", @@ -496,7 +496,7 @@ }, { "name": "icon-coin-pound", - "file": "pound.svg" + "file": "pound-sterling.svg" }, { "name": "icon-coin-yen", @@ -565,7 +565,7 @@ }, { "name": "icon-combination-lock-open", - "file": "unlock-keyhole.svg" + "file": "lock-keyhole-open.svg" }, { "name": "icon-combination-lock", @@ -589,7 +589,7 @@ }, { "name": "icon-console", - "file": "terminal-square.svg" + "file": "square-terminal.svg" }, { "name": "icon-contrast", @@ -756,7 +756,7 @@ }, { "name": "icon-donate", - "file": "helping-hand.svg", + "file": "hand-helping.svg", "legacy": true }, { @@ -816,7 +816,7 @@ }, { "name": "icon-escape", - "file": "arrow-up-left-from-circle.svg" + "file": "circle-arrow-out-up-left.svg" }, { "name": "icon-ethernet", @@ -832,7 +832,7 @@ }, { "name": "icon-exit-fullscreen", - "file": "exit-fullscreen.svg" + "file": "minimize-2.svg" }, { "name": "icon-facebook-like", @@ -852,7 +852,7 @@ }, { "name": "icon-file-cabinet", - "file": "library-square.svg" + "file": "square-library.svg" }, { "name": "icon-files", @@ -860,7 +860,7 @@ }, { "name": "icon-filter-arrows", - "file": "filter-arrows.svg" + "file": "arrow-down-a-z.svg" }, { "name": "icon-filter", @@ -1090,7 +1090,7 @@ }, { "name": "icon-help-alt", - "file": "help-circle.svg" + "file": "circle-help.svg" }, { "name": "icon-help", @@ -1124,7 +1124,7 @@ }, { "name": "icon-indent", - "file": "indent.svg" + "file": "indent-increase.svg" }, { "name": "icon-infinity", @@ -1193,7 +1193,7 @@ }, { "name": "icon-layout", - "file": "layout.svg" + "file": "layout-dashboard.svg" }, { "name": "icon-left-double-arrow", @@ -1222,11 +1222,11 @@ }, { "name": "icon-lightbulb-active", - "file": "bulb.svg" + "file": "lightbulb.svg" }, { "name": "icon-lightbulb", - "file": "bulb.svg", + "file": "lightbulb-off.svg", "legacy": true }, { @@ -1257,11 +1257,11 @@ }, { "name": "icon-locate", - "file": "locate" + "file": "locate.svg" }, { "name": "icon-location-near-me", - "file": "map-pinned", + "file": "map-pinned.svg", "legacy": true }, { @@ -1404,7 +1404,7 @@ }, { "name": "icon-multiple-windows", - "file": "multiple-windows.svg" + "file": "book-copy.svg" }, { "name": "icon-music", @@ -1457,7 +1457,7 @@ }, { "name": "icon-navigation-top", - "file": "arrow-up-to-line", + "file": "arrow-up-to-line.svg", "legacy": true }, { @@ -1544,7 +1544,7 @@ }, { "name": "icon-outdent", - "file": "outdent.svg" + "file": "indent-decrease.svg" }, { "name": "icon-page-add", @@ -1715,7 +1715,7 @@ }, { "name": "icon-power-outlet", - "file": "power-square.svg", + "file": "square-power.svg", "legacy": true }, { @@ -1751,7 +1751,7 @@ }, { "name": "icon-price-yen", - "file": "badge-japanese-yen", + "file": "badge-japanese-yen.svg", "legacy": true }, { @@ -1826,6 +1826,10 @@ "file": "disc-3.svg", "legacy": true }, + { + "name": "icon-rectangle-ellipsis", + "file": "rectangle-ellipsis.svg" + }, { "name": "icon-redo", "file": "redo-2.svg" @@ -1857,7 +1861,7 @@ }, { "name": "icon-resize", - "file": "resize.svg" + "file": "scaling.svg" }, { "name": "icon-return-to-top", @@ -1904,7 +1908,7 @@ }, { "name": "icon-school", - "file": "school-2.svg" + "file": "school.svg" }, { "name": "icon-screensharing", @@ -2065,11 +2069,11 @@ }, { "name": "icon-speed-gauge", - "file": "gauge-circle.svg" + "file": "circle-gauge.svg" }, { "name": "icon-split-alt", - "file": "split-alt.svg" + "file": "square-split-horizontal.svg" }, { "name": "icon-split", @@ -2101,7 +2105,7 @@ }, { "name": "icon-stop-alt", - "file": "x-octagon.svg" + "file": "octagon-x.svg" }, { "name": "icon-stop-hand", @@ -2118,7 +2122,7 @@ }, { "name": "icon-stream", - "file": "activity-square.svg", + "file": "square-activity.svg", "legacy": true }, { @@ -2169,7 +2173,7 @@ }, { "name": "icon-terminal", - "file": "terminal-square.svg" + "file": "square-terminal.svg" }, { "name": "icon-theater", @@ -2303,7 +2307,7 @@ }, { "name": "icon-unlocked", - "file": "unlock.svg" + "file": "lock-open.svg" }, { "name": "icon-untitled", @@ -2378,7 +2382,7 @@ }, { "name": "icon-wand", - "file": "wand-2.svg" + "file": "wand-sparkles.svg" }, { "name": "icon-webhook", @@ -2398,7 +2402,7 @@ }, { "name": "icon-window-popin", - "file": "arrow-down-left-square.svg" + "file": "square-arrow-down-left.svg" }, { "name": "icon-window-sizes", @@ -2414,7 +2418,7 @@ }, { "name": "icon-wrong", - "file": "x-circle.svg" + "file": "circle-x.svg" }, { "name": "icon-zip", diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-activity.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-activity.js index b62ded23d8..62050b8a97 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-activity.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-activity.js @@ -1,4 +1,6 @@ -export default ` + + + + + - + diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-alert.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-alert.js index 57fab6a18f..5f0968705c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-alert.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-alert.js @@ -1,4 +1,6 @@ -export default ` + - + diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-alt.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-alt.js index 2159c8f7b7..bac060ec9e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-alt.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-alt.js @@ -1,4 +1,6 @@ -export default ` + + - - + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-app.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-app.js index d97cdf3c99..6e55063cc2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-app.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-app.js @@ -1,4 +1,6 @@ -export default ` + +export default ` + + + + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-application-window-alt.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-application-window-alt.js index d97cdf3c99..6e55063cc2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-application-window-alt.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-application-window-alt.js @@ -1,4 +1,6 @@ -export default ` + + + + + + + + + - - - - - + + + + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-award.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-award.js index 7b28089061..d1c66b42ea 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-award.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-award.js @@ -1,4 +1,6 @@ -export default ` + + + + + + + +`; \ No newline at end of file +export default ` + + + + + + +`; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-bar-chart.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-bar-chart.js index 109796ea9f..76b8545988 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-bar-chart.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-bar-chart.js @@ -1,4 +1,6 @@ -export default ` + + + + + + + + + + + - - - - - - + + + + + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-block.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-block.js index bfc4b9ac55..065f1a4134 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-block.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-block.js @@ -1,4 +1,6 @@ -export default ` + + + + + + + + + + + - - - - + + + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-box.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-box.js index fa62904822..89b43a0cba 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-box.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-box.js @@ -1,4 +1,6 @@ -export default ` + + + + - - + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-browser-window.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-browser-window.js index d97cdf3c99..6e55063cc2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-browser-window.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-browser-window.js @@ -1,4 +1,6 @@ -export default ` + + + + + + + - + diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-bus.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-bus.js index 897078ba71..a4d3518616 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-bus.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-bus.js @@ -1,4 +1,6 @@ -export default ` + + + - - - - + + + + diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-calendar.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-calendar.js index f93fb3cce8..3feb22d6bc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-calendar.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-calendar.js @@ -1,4 +1,6 @@ -export default ` + - - - - + + + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-camcorder.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-camcorder.js index d6bb176155..76d45da0af 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-camcorder.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-camcorder.js @@ -1,4 +1,6 @@ -export default ` + - - + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-camera-roll.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-camera-roll.js index b5e5624d6c..b166371cb5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-camera-roll.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-camera-roll.js @@ -1,4 +1,6 @@ -export default ` + + + + + + - - + + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-chart-curve.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-chart-curve.js index 8d116e0956..c4e755712d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-chart-curve.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-chart-curve.js @@ -1,4 +1,6 @@ -export default ` + + + - + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-chat.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-chat.js index 71334e73de..d085d1cf59 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-chat.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-chat.js @@ -1,4 +1,6 @@ -export default ` + - + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-check.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-check.js index 473616d01d..6c76da118c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-check.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-check.js @@ -1,4 +1,6 @@ -export default ` + - + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-checkbox-dotted.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-checkbox-dotted.js index 3a70ad0976..77cf157d2c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-checkbox-dotted.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-checkbox-dotted.js @@ -1,4 +1,6 @@ -export default ` + + + - - + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-chip-alt.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-chip-alt.js index d9f518da8c..27be8044b2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-chip-alt.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-chip-alt.js @@ -1,4 +1,6 @@ -export default ` + - - + + diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-chip.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-chip.js index d9f518da8c..27be8044b2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-chip.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-chip.js @@ -1,4 +1,6 @@ -export default ` + - - + + diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-cinema.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-cinema.js index 81a4bdbf0a..6bcc908df7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-cinema.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-cinema.js @@ -1,4 +1,6 @@ -export default ` + - - - - - - - - - + + + + + + + + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-circle-dotted-active.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-circle-dotted-active.js index 156f66bff1..17c872c8ac 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-circle-dotted-active.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-circle-dotted-active.js @@ -1,4 +1,6 @@ -export default ` + - - + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-circle-dotted.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-circle-dotted.js index aa5948bd9a..966034888a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-circle-dotted.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-circle-dotted.js @@ -1,4 +1,6 @@ -export default ` + - - - - - - - - + + + + + + + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-circuits.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-circuits.js index 1d1fdb10f1..ff26f1d336 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-circuits.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-circuits.js @@ -1,4 +1,6 @@ -export default ` + + + + + + + + + + - - - - - + + + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-coin-dollar.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-coin-dollar.js index 969b5b053a..4b7189099e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-coin-dollar.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-coin-dollar.js @@ -1 +1,15 @@ -export default ``; \ No newline at end of file +export default ` + + + + +`; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-coin-euro.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-coin-euro.js index 5c4c115ce0..37df3960ce 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-coin-euro.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-coin-euro.js @@ -1,4 +1,6 @@ -export default ` +`; \ No newline at end of file +export default ` + + + + + + +`; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-coin-yen.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-coin-yen.js index a5a5977186..4331cfee00 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-coin-yen.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-coin-yen.js @@ -1,4 +1,6 @@ -export default ` + + + + + + + - + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-combination-lock.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-combination-lock.js index 2fc74e12a0..79636c737d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-combination-lock.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-combination-lock.js @@ -1,4 +1,6 @@ -export default ` + + + + - - + + diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-connection.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-connection.js index 48ed67b71d..b2bf31044b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-connection.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-connection.js @@ -1,4 +1,6 @@ -export default ` + - + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-console.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-console.js index e6a4216529..ae37b3e434 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-console.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-console.js @@ -1,4 +1,6 @@ -export default ` + + + - + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-conversation.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-conversation.js index 2dd6429818..cbd6332dd9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-conversation.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-conversation.js @@ -1,4 +1,6 @@ -export default ` + + + + + + + - + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-crown.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-crown.js index b3e2ab035f..375d55d40a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-crown.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-crown.js @@ -1,4 +1,6 @@ -export default ` + - + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-cupcake.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-cupcake.js index 62c451b88a..495a9ed186 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-cupcake.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-cupcake.js @@ -1,4 +1,6 @@ -export default ` + + + + + + - - - - - + + + + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-delete-key.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-delete-key.js index 3468b2de32..f58e7515e2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-delete-key.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-delete-key.js @@ -1,4 +1,6 @@ -export default ` + + + + + + + + + + + + + + + + + + + - - - - - - - + + + + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-document-dashed-line.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-document-dashed-line.js index 8c9981cebe..cd8141f1e1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-document-dashed-line.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-document-dashed-line.js @@ -1,4 +1,6 @@ -export default ` + - - + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-document.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-document.js index 8c9981cebe..cd8141f1e1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-document.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-document.js @@ -1,4 +1,6 @@ -export default ` + - - + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-documents.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-documents.js index d4aabefb81..242a3c8892 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-documents.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-documents.js @@ -1,4 +1,6 @@ -export default ` + - - - + + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-donate.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-donate.js index 19bd8a54a9..4f75b4d314 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-donate.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-donate.js @@ -1,4 +1,6 @@ -export default ` + - - + + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-door-open-alt.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-door-open-alt.js index 447478feff..49142081d7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-door-open-alt.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-door-open-alt.js @@ -1,4 +1,6 @@ -export default ` + + + + + + + + + + + + + +`; \ No newline at end of file +export default ` + + + + + + +`; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-eye.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-eye.js index 155193587d..ef57913c30 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-eye.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-eye.js @@ -1,4 +1,6 @@ -export default ` + + + + + + - - + + diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-filter-arrows.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-filter-arrows.js index ea8c0be238..a2638745f3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-filter-arrows.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-filter-arrows.js @@ -1 +1,18 @@ -export default ``; \ No newline at end of file +export default ` + + + + + + + +`; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-filter.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-filter.js index ca3f618f21..3758051998 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-filter.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-filter.js @@ -1,4 +1,6 @@ -export default ` + + - - - - + + - + + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-fire.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-fire.js index 1f6aa08b9e..d0e5368b33 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-fire.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-fire.js @@ -1,4 +1,6 @@ -export default ` + + + + + - + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-flashlight.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-flashlight.js index 249703a7a9..7304c7e432 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-flashlight.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-flashlight.js @@ -1,4 +1,6 @@ -export default ` + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-grid.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-grid.js index aeea114f39..aedf88ec42 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-grid.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-grid.js @@ -1,4 +1,6 @@ -export default ` + + - - - + + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-hand-active-alt.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-hand-active-alt.js index 6a95d7be84..706be7eb43 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-hand-active-alt.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-hand-active-alt.js @@ -1,4 +1,6 @@ -export default ` + + + + + + + + + + + + + + + - - - - + + + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-home.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-home.js index cd0f80b394..1974c077bf 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-home.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-home.js @@ -1,4 +1,6 @@ -export default ` + + + + + + + + + + + + + + - + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-keyboard.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-keyboard.js index 5148588b9b..a3365d6441 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-keyboard.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-keyboard.js @@ -1,4 +1,6 @@ -export default ` + - - - - - - - - + + + + + + + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-lab.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-lab.js index 8df04b6a8a..00f456df55 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-lab.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-lab.js @@ -1,4 +1,6 @@ -export default ` + + + + + - - - + + + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-left-double-arrow.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-left-double-arrow.js index 98e0cb1644..f3e9ab9897 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-left-double-arrow.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-left-double-arrow.js @@ -1,4 +1,6 @@ -export default ` + + + + + +`; \ No newline at end of file +export default ` + + + + + +`; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-lightbulb.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-lightbulb.js index 1d3d919677..8a6fef4f60 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-lightbulb.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-lightbulb.js @@ -1 +1,18 @@ -export default ``; \ No newline at end of file +export default ` + + + + + + + +`; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-lightning.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-lightning.js index 341687ce33..022e697902 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-lightning.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-lightning.js @@ -1,4 +1,6 @@ -export default ` + + + + +`; \ No newline at end of file +export default ` + + + + + + + +`; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-location-near-me.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-location-near-me.js index 8a504041fb..051fb9c134 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-location-near-me.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-location-near-me.js @@ -1 +1,16 @@ -export default ``; \ No newline at end of file +export default ` + + + + + +`; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-location-nearby.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-location-nearby.js index c3aa71b598..051fb9c134 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-location-nearby.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-location-nearby.js @@ -1,4 +1,6 @@ -export default ` + + + + + + + + + + + - - - + + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-medal.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-medal.js index e98b04fe65..784b7b26ad 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-medal.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-medal.js @@ -1,4 +1,6 @@ -export default ` + + + + + + + + + + + + + + + + + +`; \ No newline at end of file +export default ` + + + + + +`; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-music.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-music.js index 079ec6aa06..aebc84b2c1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-music.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-music.js @@ -1,4 +1,6 @@ -export default ` + + + + + + + + + +`; \ No newline at end of file +export default ` + + + + + +`; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-navigation-up.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-navigation-up.js index b190c33903..0c279351ba 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-navigation-up.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-navigation-up.js @@ -1,4 +1,6 @@ -export default ` + + + + + + + + + - + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-nodes.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-nodes.js index 12f312c95b..00b2ef7666 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-nodes.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-nodes.js @@ -1,4 +1,6 @@ -export default ` + + - - - - - + + + + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-notepad.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-notepad.js index a55ebcfe29..1ed651b00a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-notepad.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-notepad.js @@ -1,4 +1,6 @@ -export default ` + - - - - - + + + + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-old-key.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-old-key.js index 15c3fd8918..6a9fe1fd69 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-old-key.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-old-key.js @@ -1,4 +1,6 @@ -export default ` + + + + + + + - - `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-outbox.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-outbox.js index 8acfeaa240..b52c463e63 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-outbox.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-outbox.js @@ -1,4 +1,6 @@ -export default ` + + + - - + + diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-page-down.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-page-down.js index 642c8cef2e..1c86c40b04 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-page-down.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-page-down.js @@ -1,4 +1,6 @@ -export default ` + + - - + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-page-restricted.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-page-restricted.js index 4a989a7211..7c35e29227 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-page-restricted.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-page-restricted.js @@ -1,4 +1,6 @@ -export default ` + - - - + + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-page-up.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-page-up.js index feee56f7d2..bc7fff45d8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-page-up.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-page-up.js @@ -1,4 +1,6 @@ -export default ` + + + - - - - + + + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-panel-show.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-panel-show.js index 60f726746e..0a80011c64 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-panel-show.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-panel-show.js @@ -1,4 +1,6 @@ -export default ` + - - + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-pannel-close.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-pannel-close.js index d77cf0fbd6..0c9617849b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-pannel-close.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-pannel-close.js @@ -1,4 +1,6 @@ -export default ` + - - + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-paper-bag.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-paper-bag.js index 9063c5eb6d..977a22fec4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-paper-bag.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-paper-bag.js @@ -1,4 +1,6 @@ -export default ` + - + - - + - + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-paper-plane-alt.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-paper-plane-alt.js index f0b5778aec..2bc0e4f053 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-paper-plane-alt.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-paper-plane-alt.js @@ -1,4 +1,6 @@ -export default ` + + + + + - - + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-pc.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-pc.js index 8fd5a6c4cf..4f6d4caa2a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-pc.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-pc.js @@ -1,4 +1,6 @@ -export default ` + + + + + + + + + + + + + + + + + + - + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-playing-cards.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-playing-cards.js index da7667d4ce..b635a2847d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-playing-cards.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-playing-cards.js @@ -1,4 +1,6 @@ -export default ` + + + + - - + - + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-poll.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-poll.js index 44d65f9fab..f2a8e62f0b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-poll.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-poll.js @@ -1,4 +1,6 @@ -export default ` + + - - + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-power-outlet.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-power-outlet.js index 400f9ee83b..195f503291 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-power-outlet.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-power-outlet.js @@ -1,4 +1,6 @@ -export default ` + + + + + + + +`; \ No newline at end of file +export default ` + + + + + + + +`; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-print.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-print.js index 03e53d1b9c..f3f6305ac2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-print.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-print.js @@ -1,4 +1,6 @@ -export default ` + + + + + + + + + + + + + + + - + - + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-reception.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-reception.js index 5cb25ae766..5e4718d474 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-reception.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-reception.js @@ -1,4 +1,6 @@ -export default ` + - + diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-record.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-record.js index 1070a02dc6..e3b0d8dae3 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-record.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-record.js @@ -1,4 +1,6 @@ -export default ` + + + + + + + +`; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-redo.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-redo.js index effddccaee..3ded149884 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-redo.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-redo.js @@ -1,4 +1,6 @@ -export default ` + + + + + + +`; \ No newline at end of file +export default ` + + + + + + +`; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-return-to-top.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-return-to-top.js index feee56f7d2..bc7fff45d8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-return-to-top.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-return-to-top.js @@ -1,4 +1,6 @@ -export default ` + + + + + + + + + + + - - - - - - - + + + + + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-screensharing.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-screensharing.js index 8d73a967b4..1c1f33d1d1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-screensharing.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-screensharing.js @@ -1,4 +1,6 @@ -export default ` + + + + + + + + + + + - - + - + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-share.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-share.js index b9b4a789cd..6b827171ce 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-share.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-share.js @@ -1,4 +1,6 @@ -export default ` + + + - + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-shift.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-shift.js index 1ff14b0317..bcaeedb708 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-shift.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-shift.js @@ -1,4 +1,6 @@ -export default ` + + + + + - + - - + - + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-shopping-basket-alt.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-shopping-basket-alt.js index 9063c5eb6d..977a22fec4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-shopping-basket-alt.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-shopping-basket-alt.js @@ -1,4 +1,6 @@ -export default ` + - + - - + - + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-shopping-basket.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-shopping-basket.js index 13d8e9da0b..8b165a8e83 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-shopping-basket.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-shopping-basket.js @@ -1,4 +1,6 @@ -export default ` + + + + + + + + + + + + + + + + - - + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-speaker.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-speaker.js index 1f66be4f30..6e80fb1c1a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-speaker.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-speaker.js @@ -1,4 +1,6 @@ -export default ` + - + + - + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-speed-gauge.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-speed-gauge.js index 0d4081e95e..69a710a79f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-speed-gauge.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-speed-gauge.js @@ -1,4 +1,6 @@ -export default ` +`; \ No newline at end of file +export default ` + + + + + +`; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-split.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-split.js index 8fdb764692..15b1705a60 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-split.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-split.js @@ -1,4 +1,6 @@ -export default ` + + + + + + + + + + + - - - - - + + + + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-stream.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-stream.js index da405aa047..0547f30284 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-stream.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-stream.js @@ -1,4 +1,6 @@ -export default ` + + + + + + + - - + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-tags.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-tags.js index 75d1809bf3..d8ed5c1d4e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-tags.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-tags.js @@ -1,4 +1,6 @@ -export default ` + - - + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-takeaway-cup.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-takeaway-cup.js index 0fcd567622..f2a137df1f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-takeaway-cup.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-takeaway-cup.js @@ -1,4 +1,6 @@ -export default ` + + + + + + - - - - - - - - + + + + + + + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-thumb-down.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-thumb-down.js index 2f541cbcc4..724cb7842e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-thumb-down.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-thumb-down.js @@ -1,4 +1,6 @@ -export default ` + + + + + + + + + + + + + + + + + - + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-trophy.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-trophy.js index 780a686f1c..e281a9bcc4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-trophy.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-trophy.js @@ -1,4 +1,6 @@ -export default ` + + - - - + + - -`; \ No newline at end of file + +`; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-tv-old.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-tv-old.js index 533cfd97bb..786e9631f2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-tv-old.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-tv-old.js @@ -1,4 +1,6 @@ -export default ` + + + - - + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-umb-developer.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-umb-developer.js index f48531413f..dfea179621 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-umb-developer.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-umb-developer.js @@ -1,4 +1,6 @@ -export default ` + + + + + + + + + - - - - - - - + + + + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-usb.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-usb.js index c1db3129ee..02020d222d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-usb.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-usb.js @@ -1,4 +1,6 @@ -export default ` + + + + + + + + + + + - - + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-voice.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-voice.js index 36a22721d2..d375d997d4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-voice.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-voice.js @@ -1,4 +1,6 @@ -export default ` + + + - - - + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-wand.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-wand.js index 6612df3c92..dc7a79a489 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-wand.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-wand.js @@ -1,4 +1,6 @@ -export default ` + - + diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-webhook.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-webhook.js index a9e0e0d542..65f708da6c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-webhook.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-webhook.js @@ -1,4 +1,6 @@ -export default ` + + + + - - + - + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-window-popin.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-window-popin.js index 7a5e8c2f12..58a1723833 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-window-popin.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-window-popin.js @@ -1,4 +1,6 @@ -export default ` + + - - - + + + `; \ No newline at end of file diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-wine-glass.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-wine-glass.js index 5ba02332ac..aef436cd09 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-wine-glass.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-wine-glass.js @@ -1,4 +1,6 @@ -export default ` + + + + - - + + diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-zom-out.js b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-zom-out.js index 543cbd2a87..c3acf3939a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-zom-out.js +++ b/src/Umbraco.Web.UI.Client/src/packages/core/icon-registry/icons/icon-zom-out.js @@ -1,4 +1,6 @@ -export default ` + + + Date: Wed, 10 Apr 2024 18:37:06 +0200 Subject: [PATCH 264/280] use different icon for 2fa --- .../src/packages/user/current-user/mfa-login/manifests.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/mfa-login/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/mfa-login/manifests.ts index e420f02f9e..4fec1b55f0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/mfa-login/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/mfa-login/manifests.ts @@ -11,7 +11,7 @@ export const userProfileApps: Array = [ api: UmbConfigureMfaProvidersApi, meta: { label: '#user_configureTwoFactor', - icon: 'lock', + icon: 'icon-rectangle-ellipsis', look: 'secondary', }, conditions: [ From eb6ce8496935f4a14c02b639d97c1be440b9e109 Mon Sep 17 00:00:00 2001 From: leekelleher Date: Wed, 10 Apr 2024 18:54:47 +0100 Subject: [PATCH 265/280] Updated `element`/`api` on various manifests. --- .../src/packages/core/content-type/modals/manifests.ts | 4 ++-- .../src/packages/core/debug/manifests.ts | 2 +- .../collection/repository/manifests.ts | 3 +-- .../extension-registry/collection/views/manifests.ts | 2 +- .../src/packages/core/modal/common/manifests.ts | 10 +++++----- .../restore-from-recycle-bin/manifests.ts | 2 +- .../src/packages/core/themes/manifests.ts | 2 +- .../src/packages/core/tree/tree-picker/manifests.ts | 2 +- .../data-type/entity-actions/create/manifests.ts | 2 +- .../src/packages/data-type/modals/manifests.ts | 6 +++--- .../src/packages/data-type/workspace/manifests.ts | 4 ++-- .../src/packages/documents/dashboards/manifests.ts | 2 +- .../entity-actions/create/manifests.ts | 2 +- .../documents/documents/global-contexts/manifests.ts | 2 +- .../src/packages/language/global-contexts/manifests.ts | 2 +- .../src/packages/umbraco-news/manifests.ts | 2 +- 16 files changed, 24 insertions(+), 25 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/modals/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/modals/manifests.ts index daedade274..7b6a72b557 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content-type/modals/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content-type/modals/manifests.ts @@ -5,13 +5,13 @@ const modals: Array = [ type: 'modal', alias: 'Umb.Modal.CompositionPicker', name: 'ContentType Composition Picker Modal', - js: () => import('./composition-picker/composition-picker-modal.element.js'), + element: () => import('./composition-picker/composition-picker-modal.element.js'), }, { type: 'modal', alias: 'Umb.Modal.PropertyTypeSettings', name: 'Property Type Settings Modal', - js: () => import('./property-type-settings/property-type-settings-modal.element.js'), + element: () => import('./property-type-settings/property-type-settings-modal.element.js'), }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/debug/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/debug/manifests.ts index ff35dfe66d..b38f9c2533 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/debug/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/debug/manifests.ts @@ -5,7 +5,7 @@ const modals: Array = [ type: 'modal', alias: 'Umb.Modal.ContextDebugger', name: 'Context Debugger Modal', - js: () => import('./modals/debug/debug-modal.element.js'), + element: () => import('./modals/debug/debug-modal.element.js'), }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/collection/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/collection/repository/manifests.ts index 15cf8232e5..3a929d8e79 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/collection/repository/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/collection/repository/manifests.ts @@ -1,4 +1,3 @@ -import { UmbExtensionCollectionRepository } from './extension-collection.repository.js'; import type { ManifestRepository } from '@umbraco-cms/backoffice/extension-registry'; export const UMB_EXTENSION_COLLECTION_REPOSITORY_ALIAS = 'Umb.Repository.ExtensionCollection'; @@ -7,7 +6,7 @@ const repository: ManifestRepository = { type: 'repository', alias: UMB_EXTENSION_COLLECTION_REPOSITORY_ALIAS, name: 'Extension Collection Repository', - api: UmbExtensionCollectionRepository, + api: () => import('./extension-collection.repository.js'), }; export const manifests = [repository]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/collection/views/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/collection/views/manifests.ts index b577757db8..004a05d294 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/collection/views/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/collection/views/manifests.ts @@ -7,7 +7,7 @@ const tableCollectionView: ManifestCollectionView = { type: 'collectionView', alias: UMB_EXTENSION_TABLE_COLLECTION_VIEW_ALIAS, name: 'Extension Table Collection View', - js: () => import('./table/extension-table-collection-view.element.js'), + element: () => import('./table/extension-table-collection-view.element.js'), meta: { label: 'Table', icon: 'icon-list', diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/manifests.ts index 8f79fa6818..e8c091fd3d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/manifests.ts @@ -5,31 +5,31 @@ const modals: Array = [ type: 'modal', alias: 'Umb.Modal.Confirm', name: 'Confirm Modal', - js: () => import('./confirm/confirm-modal.element.js'), + element: () => import('./confirm/confirm-modal.element.js'), }, { type: 'modal', alias: 'Umb.Modal.IconPicker', name: 'Icon Picker Modal', - js: () => import('./icon-picker/icon-picker-modal.element.js'), + element: () => import('./icon-picker/icon-picker-modal.element.js'), }, { type: 'modal', alias: 'Umb.Modal.LinkPicker', name: 'Link Picker Modal', - js: () => import('./link-picker/link-picker-modal.element.js'), + element: () => import('./link-picker/link-picker-modal.element.js'), }, { type: 'modal', alias: 'Umb.Modal.CodeEditor', name: 'Code Editor Modal', - js: () => import('./code-editor/code-editor-modal.element.js'), + element: () => import('./code-editor/code-editor-modal.element.js'), }, { type: 'modal', alias: 'Umb.Modal.EmbeddedMedia', name: 'Embedded Media Modal', - js: () => import('./embedded-media/embedded-media-modal.element.js'), + element: () => import('./embedded-media/embedded-media-modal.element.js'), }, { type: 'modal', diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/manifests.ts index 09766fef9c..04e5fa7111 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/recycle-bin/entity-action/restore-from-recycle-bin/manifests.ts @@ -6,6 +6,6 @@ export const manifests = [ type: 'modal', alias: 'Umb.Modal.RecycleBin.Restore', name: 'Restore From Recycle Bin Modal', - js: () => import('./modal/restore-from-recycle-bin-modal.element.js'), + element: () => import('./modal/restore-from-recycle-bin-modal.element.js'), }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/themes/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/themes/manifests.ts index 5491ef95e5..80de990440 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/themes/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/themes/manifests.ts @@ -5,7 +5,7 @@ export const themes: Array = [ type: 'globalContext', alias: 'Umb.GlobalContext.Theme', name: 'Theme Context', - js: () => import('./theme.context.js'), + api: () => import('./theme.context.js'), }, { type: 'theme', diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-picker/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-picker/manifests.ts index 8bbb3ffe7d..fd500d4150 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-picker/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/tree-picker/manifests.ts @@ -3,6 +3,6 @@ export const manifests = [ type: 'modal', alias: 'Umb.Modal.TreePicker', name: 'Tree Picker Modal', - js: () => import('./tree-picker-modal.element.js'), + element: () => import('./tree-picker-modal.element.js'), }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/create/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/create/manifests.ts index 69a757fac4..badd17d6a6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/create/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/entity-actions/create/manifests.ts @@ -20,7 +20,7 @@ const entityActions: Array = [ type: 'modal', alias: 'Umb.Modal.DataTypeCreateOptions', name: 'Data Type Create Options Modal', - js: () => import('./modal/data-type-create-options-modal.element.js'), + element: () => import('./modal/data-type-create-options-modal.element.js'), }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/manifests.ts index d612586eaa..43db5752e0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/modals/manifests.ts @@ -5,19 +5,19 @@ const modals: Array = [ type: 'modal', alias: 'Umb.Modal.PropertyEditorUiPicker', name: 'Property Editor UI Picker Modal', - js: () => import('./property-editor-ui-picker/property-editor-ui-picker-modal.element.js'), + element: () => import('./property-editor-ui-picker/property-editor-ui-picker-modal.element.js'), }, { type: 'modal', alias: 'Umb.Modal.DataTypePickerFlow', name: 'Data Type Picker Flow Modal', - js: () => import('./data-type-picker-flow/data-type-picker-flow-modal.element.js'), + element: () => import('./data-type-picker-flow/data-type-picker-flow-modal.element.js'), }, { type: 'modal', alias: 'Umb.Modal.DataTypePickerFlowDataTypePicker', name: 'Data Type Picker Flow UI Picker Modal', - js: () => import('./data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.js'), + element: () => import('./data-type-picker-flow/data-type-picker-flow-data-type-picker-modal.element.js'), }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/data-type/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/data-type/workspace/manifests.ts index 39b93bc9a7..86097a042e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/data-type/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/data-type/workspace/manifests.ts @@ -23,7 +23,7 @@ const workspaceViews: Array = [ type: 'workspaceView', alias: 'Umb.WorkspaceView.DataType.Edit', name: 'Data Type Workspace Edit View', - js: () => import('./views/details/data-type-details-workspace-view.element.js'), + element: () => import('./views/details/data-type-details-workspace-view.element.js'), weight: 90, meta: { label: '#general_details', @@ -41,7 +41,7 @@ const workspaceViews: Array = [ type: 'workspaceView', alias: 'Umb.WorkspaceView.DataType.Info', name: 'Data Type Workspace Info View', - js: () => import('./views/info/workspace-view-data-type-info.element.js'), + element: () => import('./views/info/workspace-view-data-type-info.element.js'), weight: 90, meta: { label: '#general_info', diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/dashboards/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/dashboards/manifests.ts index 5318ffcc8f..6455ec0e8f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/dashboards/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/dashboards/manifests.ts @@ -5,7 +5,7 @@ const dashboards: Array = [ type: 'dashboard', alias: 'Umb.Dashboard.RedirectManagement', name: 'Redirect Management Dashboard', - js: () => import('./redirect-management/dashboard-redirect-management.element.js'), + element: () => import('./redirect-management/dashboard-redirect-management.element.js'), weight: 10, meta: { label: '#dashboardTabs_contentRedirectManager', diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/manifests.ts index 1c1c7a408d..d9e8cd9a76 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-blueprints/entity-actions/create/manifests.ts @@ -5,7 +5,7 @@ const entityActions: Array = [ type: 'modal', alias: 'Umb.Modal.DocumentBlueprintCreateOptions', name: 'Document Blueprint Create Options Modal', - js: () => import('./modal/document-blueprint-create-options-modal.element.js'), + element: () => import('./modal/document-blueprint-create-options-modal.element.js'), }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/global-contexts/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/global-contexts/manifests.ts index 5d8128c423..48c16cc85b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/global-contexts/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/global-contexts/manifests.ts @@ -5,6 +5,6 @@ export const manifests: Array = [ type: 'globalContext', alias: 'Umb.GlobalContext.DocumentConfiguration', name: 'Document Configuration Context', - js: () => import('./document-configuration.context.js'), + api: () => import('./document-configuration.context.js'), }, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/language/global-contexts/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/language/global-contexts/manifests.ts index 69e33d1028..754429c362 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/language/global-contexts/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/language/global-contexts/manifests.ts @@ -5,6 +5,6 @@ export const manifests: Array = [ type: 'globalContext', alias: 'Umb.GlobalContext.AppLanguage', name: 'App Language Context', - js: () => import('./app-language.context.js'), + api: () => import('./app-language.context.js'), }, ]; 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 fea4b1dd92..9ab6011d4b 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 @@ -4,7 +4,7 @@ export const dashboard: ManifestDashboard = { type: 'dashboard', alias: 'Umb.Dashboard.UmbracoNews', name: 'Umbraco News Dashboard', - js: () => import('./umbraco-news-dashboard.element.js'), + element: () => import('./umbraco-news-dashboard.element.js'), weight: 20, meta: { label: '#dashboardTabs_contentIntro', From ed4956a4050bbdb80a1e302db5acfd62f21e22af Mon Sep 17 00:00:00 2001 From: leekelleher Date: Wed, 10 Apr 2024 18:58:36 +0100 Subject: [PATCH 266/280] Minor code tidy-up --- .../src/packages/core/components/ref-item/ref-item.element.ts | 2 +- .../core/modal/common/confirm/confirm-modal.controller.ts | 1 - .../property-editors/tags/property-editor-ui-tags.element.ts | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/ref-item/ref-item.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/ref-item/ref-item.element.ts index 04cdbaf84a..550900a7af 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/ref-item/ref-item.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/ref-item/ref-item.element.ts @@ -1,4 +1,4 @@ -import { html, customElement, css, property, when, nothing, state } from '@umbraco-cms/backoffice/external/lit'; +import { html, customElement, css, property, when, nothing } from '@umbraco-cms/backoffice/external/lit'; import { UmbElementMixin } from '@umbraco-cms/backoffice/element-api'; import { UUIRefElement, UUIRefEvent, UUIRefNodeElement } from '@umbraco-cms/backoffice/external/uui'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/confirm/confirm-modal.controller.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/confirm/confirm-modal.controller.ts index 61fb44d6a4..c950224cc1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/confirm/confirm-modal.controller.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/common/confirm/confirm-modal.controller.ts @@ -22,7 +22,6 @@ export class UmbConfirmModalController extends UmbControllerBase { // This is a one time off, so we can destroy our selfs. this.destroy(); - // Map back into UmbVariantId instances: return; } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/tags/property-editors/tags/property-editor-ui-tags.element.ts b/src/Umbraco.Web.UI.Client/src/packages/tags/property-editors/tags/property-editor-ui-tags.element.ts index 40b49ce6d6..7c25a6004f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/tags/property-editors/tags/property-editor-ui-tags.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/tags/property-editors/tags/property-editor-ui-tags.element.ts @@ -56,7 +56,7 @@ export class UmbPropertyEditorUITagsElement extends UmbLitElement implements Umb render() { return html``; From 0bdf228ac5077e7226330dbef34cb93bb5b309d5 Mon Sep 17 00:00:00 2001 From: leekelleher Date: Wed, 10 Apr 2024 19:06:46 +0100 Subject: [PATCH 267/280] ImageCropper: Consolidated button label localizations --- ...ty-editor-ui-image-crops-configuration.element.ts | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/property-editors/image-crops-configuration/property-editor-ui-image-crops-configuration.element.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/property-editors/image-crops-configuration/property-editor-ui-image-crops-configuration.element.ts index f712272b8c..d81aa7776b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/property-editors/image-crops-configuration/property-editor-ui-image-crops-configuration.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/property-editors/image-crops-configuration/property-editor-ui-image-crops-configuration.element.ts @@ -106,7 +106,7 @@ export class UmbPropertyEditorUIImageCropsConfigurationElement return html`
    -
    +
    Label
    @@ -139,8 +139,14 @@ export class UmbPropertyEditorUIImageCropsConfigurationElement ${item.label} (${item.alias}) (${item.width} x ${item.height}px)
    - this.#onEdit(item)}>Edit - this.#onRemove(item.alias)}>Remove + this.#onEdit(item)}> + this.#onRemove(item.alias)}>
    `, From 1a2a4a8dde9f17989b210ddf2e4ed64f006babef Mon Sep 17 00:00:00 2001 From: leekelleher Date: Wed, 10 Apr 2024 19:07:45 +0100 Subject: [PATCH 268/280] `umb-property`: removed the outer `html` directive as it wasn't adding any extra markup. --- .../src/packages/core/property/property/property.element.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/property/property/property.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/property/property/property.element.ts index 1bf8e3c8d2..70756c337d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/property/property/property.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/property/property/property.element.ts @@ -1,7 +1,7 @@ import { umbExtensionsRegistry, type ManifestPropertyEditorUi } from '../../extension-registry/index.js'; import { UmbPropertyContext } from './property.context.js'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; -import { css, html, customElement, property, state, ifDefined } from '@umbraco-cms/backoffice/external/lit'; +import { css, html, customElement, property, state, ifDefined, nothing } from '@umbraco-cms/backoffice/external/lit'; import { createExtensionElement } from '@umbraco-cms/backoffice/extension-api'; import type { UmbObserverController } from '@umbraco-cms/backoffice/observable-api'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; @@ -223,12 +223,12 @@ export class UmbPropertyElement extends UmbLitElement { } private _renderPropertyActionMenu() { - return html`${this._propertyEditorUiAlias + return this._propertyEditorUiAlias ? html`` - : ''}`; + : nothing; } static styles = [ From 90a6707f635e408d57c545b188bfaa93119fca4f Mon Sep 17 00:00:00 2001 From: leekelleher Date: Wed, 10 Apr 2024 19:08:47 +0100 Subject: [PATCH 269/280] Document Collection: Provisionally adds `entityType` "future-proofing" --- .../repository/document-collection.server.data-source.ts | 1 + .../src/packages/documents/documents/collection/types.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/repository/document-collection.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/repository/document-collection.server.data-source.ts index a4e93c3b58..c6899b78ed 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/repository/document-collection.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/repository/document-collection.server.data-source.ts @@ -37,6 +37,7 @@ export class UmbDocumentCollectionServerDataSource implements UmbCollectionDataS const model: UmbDocumentCollectionItemModel = { unique: item.id, + entityType: 'document', contentTypeAlias: item.documentType.alias, createDate: new Date(variant.createDate), creator: item.creator, diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/types.ts index 329f3bfb83..103dde6ac0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/collection/types.ts @@ -11,6 +11,7 @@ export interface UmbDocumentCollectionFilterModel extends UmbCollectionFilterMod export interface UmbDocumentCollectionItemModel { unique: string; + entityType: string; contentTypeAlias: string; createDate: Date; creator?: string | null; From 0981a220a709612cb1bc64bcc9b701a9c625516c Mon Sep 17 00:00:00 2001 From: leekelleher Date: Wed, 10 Apr 2024 19:19:08 +0100 Subject: [PATCH 270/280] Theme Context: refactored to use `byTypeAndFilter` --- .../src/packages/core/themes/theme.context.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/themes/theme.context.ts b/src/Umbraco.Web.UI.Client/src/packages/core/themes/theme.context.ts index f411529ebb..cdc86b88eb 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/themes/theme.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/themes/theme.context.ts @@ -34,9 +34,7 @@ export class UmbThemeContext extends UmbContextBase { if (themeAlias) { localStorage.setItem(LOCAL_STORAGE_KEY, themeAlias); this.#themeObserver = this.observe( - umbExtensionsRegistry - .byType('theme') - .pipe(map((extensions) => extensions.filter((extension) => extension.alias === themeAlias))), + umbExtensionsRegistry.byTypeAndFilter('theme', (extension) => extension.alias === themeAlias), async (themes) => { this.#styleElement?.remove(); if (themes.length > 0 && themes[0].css) { From 9225638c0c59e0b76842b0d44f82660e5ef22fd9 Mon Sep 17 00:00:00 2001 From: leekelleher Date: Wed, 10 Apr 2024 19:22:02 +0100 Subject: [PATCH 271/280] Profile Theme picker: refactor/tidy-up - Use `` instead of custom styles - Use `Option` model for the `uui-select` input - Prevent `ManifestTheme` from bleeding through --- ...ent-user-theme-user-profile-app.element.ts | 44 +++++++------------ 1 file changed, 17 insertions(+), 27 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/theme/current-user-theme-user-profile-app.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/theme/current-user-theme-user-profile-app.element.ts index c3c294372e..84e443680d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/theme/current-user-theme-user-profile-app.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/theme/current-user-theme-user-profile-app.element.ts @@ -1,10 +1,9 @@ -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 type { UUISelectEvent } from '@umbraco-cms/backoffice/external/uui'; +import { css, html, customElement, state, nothing } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import type { ManifestTheme } from '@umbraco-cms/backoffice/extension-registry'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; +import { UMB_THEME_CONTEXT } from '@umbraco-cms/backoffice/themes'; +import type { UmbThemeContext } from '@umbraco-cms/backoffice/themes'; +import type { UUISelectEvent } from '@umbraco-cms/backoffice/external/uui'; @customElement('umb-current-user-theme-user-profile-app') export class UmbCurrentUserThemeUserProfileAppElement extends UmbLitElement { @@ -14,7 +13,7 @@ export class UmbCurrentUserThemeUserProfileAppElement extends UmbLitElement { private _themeAlias: string | null = null; @state() - private _themes: Array = []; + private _themes: Array