From 9c5373fffda7629068db5a2ebd39f486d165388a Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Fri, 24 May 2024 18:37:57 +0200 Subject: [PATCH 01/20] add route entry interface --- .../src/packages/core/router/index.ts | 1 + .../src/packages/core/router/types.ts | 7 +++++++ 2 files changed, 8 insertions(+) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/router/types.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/router/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/router/index.ts index 181854001c..fc2663470f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/router/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/router/index.ts @@ -8,3 +8,4 @@ export * from './router-slot.element.js'; export * from './path-pattern.class.js'; export * from './modal-registration/modal-route-registration.interface.js'; export * from './modal-registration/modal-route-registration.controller.js'; +export * from './types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/router/types.ts b/src/Umbraco.Web.UI.Client/src/packages/core/router/types.ts new file mode 100644 index 0000000000..6fcea8d459 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/router/types.ts @@ -0,0 +1,7 @@ +import type { IRoutingInfo, PageComponent } from '@umbraco-cms/backoffice/external/router-slot'; +import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; + +export interface UmbRouteEntry extends UmbApi { + getPath?(): string; + setup?(element: PageComponent, info: IRoutingInfo): void; +} From 1473e2f5ff7442ca41e060c8ecef0ac1e4292d9f Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Fri, 24 May 2024 18:38:10 +0200 Subject: [PATCH 02/20] add new section route extension type --- .../packages/core/extension-registry/models/index.ts | 2 ++ .../extension-registry/models/section-route.model.ts | 12 ++++++++++++ 2 files changed, 14 insertions(+) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/section-route.model.ts 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 c81ff73f7f..b0aa5d38f4 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 @@ -69,6 +69,7 @@ import type { ManifestAppEntryPoint } from './app-entry-point.model.js'; import type { ManifestBackofficeEntryPoint } from './backoffice-entry-point.model.js'; import type { ManifestEntryPoint } from './entry-point.model.js'; import type { ManifestMonacoMarkdownEditorAction } from './monaco-markdown-editor-action.model.js'; +import type { ManifestSectionRoute } from './section-route.model.js'; import type { ManifestBase, ManifestBundle, ManifestCondition } from '@umbraco-cms/backoffice/extension-api'; export type * from './app-entry-point.model.js'; @@ -196,6 +197,7 @@ export type ManifestTypes = | ManifestSectionSidebarApp | ManifestSectionSidebarAppMenuKind | ManifestSectionView + | ManifestSectionRoute | ManifestStore | ManifestTheme | ManifestTinyMcePlugin diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/section-route.model.ts b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/section-route.model.ts new file mode 100644 index 0000000000..fc57b62471 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/extension-registry/models/section-route.model.ts @@ -0,0 +1,12 @@ +import type { UmbRouteEntry } from '../../router/types.js'; +import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; +import type { ManifestElementAndApi } from '@umbraco-cms/backoffice/extension-api'; + +export interface ManifestSectionRoute extends ManifestElementAndApi { + type: 'sectionRoute'; + meta: MetaSectionRoute; +} + +export interface MetaSectionRoute { + path?: string; +} From 404400d205ef4cfae465ab35686d36dab7881545 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Fri, 24 May 2024 18:38:38 +0200 Subject: [PATCH 03/20] add util to encode alias to path --- .../src/packages/core/utils/path/path-encode.function.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/utils/path/path-encode.function.ts b/src/Umbraco.Web.UI.Client/src/packages/core/utils/path/path-encode.function.ts index ef3e8b0a2b..7b7567cf74 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/utils/path/path-encode.function.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/utils/path/path-encode.function.ts @@ -1 +1,3 @@ -export const encodeFilePath = (path: string) => encodeURIComponent(path).replace('.', '-'); +export const encodeFilePath = (path: string) => encodeURIComponent(path).replaceAll('.', '-'); + +export const aliasToPath = (path: string) => encodeFilePath(path); From 7af2271b6f4ba46391037f019be8906936deb727 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Fri, 24 May 2024 18:39:05 +0200 Subject: [PATCH 04/20] handle section routes in default section element --- .../core/section/section-default.element.ts | 62 +++++++++++++++---- 1 file changed, 49 insertions(+), 13 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/section/section-default.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/section/section-default.element.ts index bfb1103f32..fca5c4c6df 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/section/section-default.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/section/section-default.element.ts @@ -1,4 +1,4 @@ -import type { UmbWorkspaceElement } from '../workspace/workspace.element.js'; +import type { ManifestSectionRoute } from '../extension-registry/models/section-route.model.js'; import type { UmbSectionMainViewElement } from './section-main-views/section-main-views.element.js'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { css, html, nothing, customElement, property, state, repeat } from '@umbraco-cms/backoffice/external/lit'; @@ -9,11 +9,14 @@ import type { UmbSectionElement, } from '@umbraco-cms/backoffice/extension-registry'; import { umbExtensionsRegistry } from '@umbraco-cms/backoffice/extension-registry'; -import type { UmbRoute } from '@umbraco-cms/backoffice/router'; +import type { IRoute, IRoutingInfo, PageComponent, UmbRoute } from '@umbraco-cms/backoffice/router'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import type { UmbExtensionElementInitializer } from '@umbraco-cms/backoffice/extension-api'; -import { UmbExtensionsElementInitializer } from '@umbraco-cms/backoffice/extension-api'; -import { UMB_WORKSPACE_PATH_PATTERN } from '@umbraco-cms/backoffice/workspace'; +import { + UmbExtensionsElementAndApiInitializer, + UmbExtensionsElementInitializer, +} from '@umbraco-cms/backoffice/extension-api'; +import { aliasToPath, debounce } from '@umbraco-cms/backoffice/utils'; /** * @export @@ -47,6 +50,10 @@ export class UmbSectionDefaultElement extends UmbLitElement implements UmbSectio @state() _splitPanelPosition = '300px'; + #routeExtensionsController: + | UmbExtensionsElementAndApiInitializer + | undefined; + constructor() { super(); @@ -56,7 +63,7 @@ export class UmbSectionDefaultElement extends UmbLitElement implements UmbSectio this.requestUpdate('_sidebarApps', oldValue); }); - this.#createRoutes(); + this.#observeRoutes(); const splitPanelPosition = localStorage.getItem('umb-split-panel-position'); if (splitPanelPosition) { @@ -64,15 +71,44 @@ export class UmbSectionDefaultElement extends UmbLitElement implements UmbSectio } } - #createRoutes() { - this._routes = [ - { - path: UMB_WORKSPACE_PATH_PATTERN.toString(), - component: () => import('../workspace/workspace.element.js'), - setup: (element, info) => { - (element as UmbWorkspaceElement).entityType = info.match.params.entityType; - }, + #observeRoutes(): void { + this.#routeExtensionsController?.destroy(); + + this.#routeExtensionsController = new UmbExtensionsElementAndApiInitializer< + ManifestSectionRoute, + 'sectionRoute', + ManifestSectionRoute + >( + this, + umbExtensionsRegistry, + 'sectionRoute', + undefined, + undefined, + (sectionRouteExtensions) => { + const routes: Array = sectionRouteExtensions.map((extensionController) => { + return { + path: + extensionController.api?.getPath?.() || + extensionController.manifest.meta?.path || + aliasToPath(extensionController.manifest.alias), + component: extensionController.component, + setup: (element: PageComponent, info: IRoutingInfo) => { + extensionController.api?.setup?.(element, info); + }, + }; + }); + + this.#debouncedCreateRoutes(routes); }, + undefined, // We can leave the alias to undefined, as we destroy this our selfs. + ); + } + + #debouncedCreateRoutes = debounce(this.#createRoutes, 50); + + #createRoutes(routes: Array) { + this._routes = [ + ...routes, { path: '**', component: () => import('./section-main-views/section-main-views.element.js'), From e873487da9b753083a6a5f5bf0438e1d327a129d Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Fri, 24 May 2024 18:39:28 +0200 Subject: [PATCH 05/20] register workspace as a section route --- .../src/packages/core/workspace/manifests.ts | 14 ++++++++------ .../core/workspace/section-routes/manifests.ts | 11 +++++++++++ 2 files changed, 19 insertions(+), 6 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/section-routes/manifests.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/manifests.ts index 95204a41c6..7e64360c26 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/manifests.ts @@ -1,12 +1,14 @@ import { manifests as componentManifests } from './components/manifests.js'; -import { manifests as workspaceKinds } from './kinds/manifests.js'; -import { manifests as workspaceModals } from './modals/manifests.js'; -import { manifests as workspaceConditions } from './conditions/manifests.js'; +import { manifests as sectionRouteManifests } from './section-routes/manifests.js'; +import { manifests as workspaceConditionManifests } from './conditions/manifests.js'; +import { manifests as workspaceKindManifest } from './kinds/manifests.js'; +import { manifests as workspaceModalManifest } from './modals/manifests.js'; import type { ManifestTypes, UmbBackofficeManifestKind } from '@umbraco-cms/backoffice/extension-registry'; export const manifests: Array = [ - ...workspaceConditions, - ...workspaceKinds, ...componentManifests, - ...workspaceModals, + ...sectionRouteManifests, + ...workspaceConditionManifests, + ...workspaceKindManifest, + ...workspaceModalManifest, ]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/section-routes/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/section-routes/manifests.ts new file mode 100644 index 0000000000..566b1b5e31 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/section-routes/manifests.ts @@ -0,0 +1,11 @@ +import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; + +export const manifests: Array = [ + { + type: 'sectionRoute', + alias: 'Umb.SectionRoute.Workspace', + name: 'Section Workspace Route', + element: () => import('../workspace.element.js'), + api: () => import('./workspace-section-route.api.js'), + }, +]; From 338032d98fb2f35c2fe19909bac2daf4043fceb4 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Fri, 24 May 2024 18:40:13 +0200 Subject: [PATCH 06/20] add api class --- .../workspace-section-route.route-entry.ts | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/workspace/section-routes/workspace-section-route.route-entry.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/section-routes/workspace-section-route.route-entry.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/section-routes/workspace-section-route.route-entry.ts new file mode 100644 index 0000000000..eae555fb26 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/section-routes/workspace-section-route.route-entry.ts @@ -0,0 +1,18 @@ +import { UMB_WORKSPACE_PATH_PATTERN } from '../paths.js'; +import type { UmbWorkspaceElement } from '../workspace.element.js'; +import type { IRoutingInfo, PageComponent, UmbRouteEntry } from '@umbraco-cms/backoffice/router'; +import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; + +export class UmbWorkspaceSectionRouteEntry implements UmbApi, UmbRouteEntry { + getPath(): string { + return UMB_WORKSPACE_PATH_PATTERN.toString(); + } + + setup(element: PageComponent, info: IRoutingInfo) { + (element as UmbWorkspaceElement).entityType = info.match.params.entityType; + } + + destroy(): void {} +} + +export { UmbWorkspaceSectionRouteEntry as api }; From acd22889069f274333dfecc82ecc01985ee601a6 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Fri, 24 May 2024 18:50:52 +0200 Subject: [PATCH 07/20] change type --- .../src/packages/core/workspace/section-routes/manifests.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/section-routes/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/section-routes/manifests.ts index 566b1b5e31..804f7dc284 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/section-routes/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/section-routes/manifests.ts @@ -6,6 +6,6 @@ export const manifests: Array = [ alias: 'Umb.SectionRoute.Workspace', name: 'Section Workspace Route', element: () => import('../workspace.element.js'), - api: () => import('./workspace-section-route.api.js'), + api: () => import('./workspace-section-route.route-entry.js'), }, ]; From d87d3930db232985bf5ebdb54b51e53aa677b3dc Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Fri, 24 May 2024 18:58:09 +0200 Subject: [PATCH 08/20] Better name --- .../src/packages/core/workspace/section-routes/manifests.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/section-routes/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/section-routes/manifests.ts index 804f7dc284..e5d441f3fc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/section-routes/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/section-routes/manifests.ts @@ -4,7 +4,7 @@ export const manifests: Array = [ { type: 'sectionRoute', alias: 'Umb.SectionRoute.Workspace', - name: 'Section Workspace Route', + name: 'Workspace Section Route', element: () => import('../workspace.element.js'), api: () => import('./workspace-section-route.route-entry.js'), }, From 2c4529f1fa87d97b51e8735996ae5b19fc7222b3 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Fri, 24 May 2024 21:24:42 +0200 Subject: [PATCH 09/20] Update .eslintrc.json --- 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 acde9551ae..ca3b358d25 100644 --- a/src/Umbraco.Web.UI.Client/.eslintrc.json +++ b/src/Umbraco.Web.UI.Client/.eslintrc.json @@ -39,7 +39,7 @@ "import/no-unresolved": "off", "import/order": "warn", "import/no-self-import": "error", - "import/no-cycle": ["error", { "maxDepth": 2, "allowUnsafeDynamicCyclicDependency": true }], + "import/no-cycle": ["error", { "maxDepth": 6, "allowUnsafeDynamicCyclicDependency": true }], "local-rules/bad-type-import": "error", "local-rules/enforce-element-suffix-on-element-class-name": "error", "local-rules/enforce-umb-prefix-on-element-name": "error", From cd1f3bea50824ab4ae2da5215a346e4533ed736c Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Fri, 24 May 2024 22:04:25 +0200 Subject: [PATCH 10/20] add sort children of media entity --- .../media/media/entity-actions/manifests.ts | 3 +- .../entity-actions/sort-children-of/index.ts | 3 ++ .../sort-children-of/manifests.ts | 28 ++++++++++++ .../sort-children-of/repository/constants.ts | 1 + .../sort-children-of/repository/index.ts | 3 ++ .../sort-children-of/repository/manifests.ts | 11 +++++ .../repository/sort-children-of.repository.ts | 39 ++++++++++++++++ .../sort-children-of.server.data.ts | 44 +++++++++++++++++++ .../sort-children-of/repository/types.ts | 4 ++ 9 files changed, 135 insertions(+), 1 deletion(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/repository/constants.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/repository/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/repository/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/repository/sort-children-of.repository.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/repository/sort-children-of.server.data.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/repository/types.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/manifests.ts index 8a0b6d6c60..4e8dfc0cde 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/manifests.ts @@ -2,6 +2,7 @@ import { UMB_MEDIA_DETAIL_REPOSITORY_ALIAS, UMB_MEDIA_ITEM_REPOSITORY_ALIAS } fr import { UMB_MEDIA_ENTITY_TYPE } from '../entity.js'; import { manifests as createManifests } from './create/manifests.js'; import { manifests as moveManifests } from './move-to/manifests.js'; +import { manifests as sortChildrenOfManifests } from './sort-children-of/manifests.js'; import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; import { UMB_ENTITY_IS_TRASHED_CONDITION_ALIAS } from '@umbraco-cms/backoffice/recycle-bin'; @@ -25,4 +26,4 @@ const entityActions: Array = [ }, ]; -export const manifests: Array = [...entityActions, ...moveManifests]; +export const manifests: Array = [...entityActions, ...moveManifests, ...sortChildrenOfManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/index.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/index.ts new file mode 100644 index 0000000000..7b4b44ef0d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/index.ts @@ -0,0 +1,3 @@ +export { UmbSortChildrenOfMediaRepository, UMB_SORT_CHILDREN_OF_MEDIA_REPOSITORY_ALIAS } from './repository/index.js'; + +export type { UmbSortChildrenOfArgs } from './repository/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/manifests.ts new file mode 100644 index 0000000000..9582500380 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/manifests.ts @@ -0,0 +1,28 @@ +import { UMB_MEDIA_ENTITY_TYPE, UMB_MEDIA_ROOT_ENTITY_TYPE } from '../../entity.js'; +import { UMB_MEDIA_ITEM_REPOSITORY_ALIAS } from '../../repository/index.js'; +import { UMB_MEDIA_TREE_REPOSITORY_ALIAS } from '../../tree/index.js'; +import { UMB_SORT_CHILDREN_OF_MEDIA_REPOSITORY_ALIAS } from './repository/constants.js'; +import { manifests as repositoryManifests } from './repository/manifests.js'; +import { UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS } from '@umbraco-cms/backoffice/recycle-bin'; +import type { ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; + +export const manifests: Array = [ + ...repositoryManifests, + { + type: 'entityAction', + kind: 'sortChildrenOf', + alias: 'Umb.EntityAction.Media.SortChildrenOf', + name: 'Sort Children Of Media Entity Action', + forEntityTypes: [UMB_MEDIA_ROOT_ENTITY_TYPE, UMB_MEDIA_ENTITY_TYPE], + meta: { + itemRepositoryAlias: UMB_MEDIA_ITEM_REPOSITORY_ALIAS, + sortChildrenOfRepositoryAlias: UMB_SORT_CHILDREN_OF_MEDIA_REPOSITORY_ALIAS, + treeRepositoryAlias: UMB_MEDIA_TREE_REPOSITORY_ALIAS, + }, + conditions: [ + { + alias: UMB_ENTITY_IS_NOT_TRASHED_CONDITION_ALIAS, + }, + ], + }, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/repository/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/repository/constants.ts new file mode 100644 index 0000000000..cecd6be9b5 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/repository/constants.ts @@ -0,0 +1 @@ +export const UMB_SORT_CHILDREN_OF_MEDIA_REPOSITORY_ALIAS = 'Umb.Repository.Media.SortChildrenOf'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/repository/index.ts new file mode 100644 index 0000000000..23c986a443 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/repository/index.ts @@ -0,0 +1,3 @@ +export { UmbSortChildrenOfMediaRepository } from './sort-children-of.repository.js'; +export { UMB_SORT_CHILDREN_OF_MEDIA_REPOSITORY_ALIAS } from './constants.js'; +export type { UmbSortChildrenOfArgs } from './types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/repository/manifests.ts new file mode 100644 index 0000000000..4a1c50fce1 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/repository/manifests.ts @@ -0,0 +1,11 @@ +import { UMB_SORT_CHILDREN_OF_MEDIA_REPOSITORY_ALIAS } from './constants.js'; +import type { ManifestRepository, ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; + +const repository: ManifestRepository = { + type: 'repository', + alias: UMB_SORT_CHILDREN_OF_MEDIA_REPOSITORY_ALIAS, + name: 'Sort Children Of Media Repository', + api: () => import('./sort-children-of.repository.js'), +}; + +export const manifests: Array = [repository]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/repository/sort-children-of.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/repository/sort-children-of.repository.ts new file mode 100644 index 0000000000..138e2af525 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/repository/sort-children-of.repository.ts @@ -0,0 +1,39 @@ +import { UmbSortChildrenOfMediaServerDataSource } from './sort-children-of.server.data.js'; +import type { UmbSortChildrenOfArgs } from './types.js'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; +import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; +import type { UmbNotificationContext } from '@umbraco-cms/backoffice/notification'; +import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification'; +import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; + +export class UmbSortChildrenOfMediaRepository extends UmbControllerBase implements UmbApi { + #dataSource: UmbSortChildrenOfMediaServerDataSource; + + #notificationContext?: UmbNotificationContext; + + constructor(host: UmbControllerHost) { + super(host); + + this.#dataSource = new UmbSortChildrenOfMediaServerDataSource(this); + + this.consumeContext(UMB_NOTIFICATION_CONTEXT, (instance) => { + this.#notificationContext = instance; + }); + } + + async sortChildrenOf(args: UmbSortChildrenOfArgs) { + if (args.unique === undefined) throw new Error('Unique is missing'); + if (!args.sorting) throw new Error('Sorting details are missing'); + + const { error } = await this.#dataSource.sortChildrenOf(args); + + if (!error) { + const notification = { data: { message: `Items sorted` } }; + this.#notificationContext?.peek('positive', notification); + } + + return { error }; + } +} + +export { UmbSortChildrenOfMediaRepository as api }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/repository/sort-children-of.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/repository/sort-children-of.server.data.ts new file mode 100644 index 0000000000..cfa5351bba --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/repository/sort-children-of.server.data.ts @@ -0,0 +1,44 @@ +import type { UmbSortChildrenOfArgs } from './types.js'; +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'; + +/** + * A server data source for sorting children of a Media + * @export + * @class UmbSortChildrenOfMediaServerDataSource + * @implements {RepositoryDetailDataSource} + */ +export class UmbSortChildrenOfMediaServerDataSource { + #host: UmbControllerHost; + + /** + * Creates an instance of UmbSortChildrenOfMediaServerDataSource. + * @param {UmbControllerHost} host + * @memberof UmbSortChildrenOfMediaServerDataSource + */ + constructor(host: UmbControllerHost) { + this.#host = host; + } + + /** + * Creates the Public Access for the given Media unique + * @param {UmbSortChildrenOfArgs} args + * @memberof UmbSortChildrenOfMediaServerDataSource + */ + async sortChildrenOf(args: UmbSortChildrenOfArgs) { + if (args.unique === undefined) throw new Error('unique is missing'); + + const sortingMapping = args.sorting.map((item) => ({ id: item.unique, sortOrder: item.sortOrder })); + + return tryExecuteAndNotify( + this.#host, + MediaService.putMediaSort({ + requestBody: { + parent: args.unique ? { id: args.unique } : null, + sorting: sortingMapping, + }, + }), + ); + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/repository/types.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/repository/types.ts new file mode 100644 index 0000000000..7934391f3f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/repository/types.ts @@ -0,0 +1,4 @@ +export interface UmbSortChildrenOfArgs { + unique: string | null; + sorting: Array<{ unique: string; sortOrder: number }>; +} From ff85ec17388451682cd72423e9d9930f826bef50 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Fri, 24 May 2024 22:19:36 +0200 Subject: [PATCH 11/20] add repo, data source + args types --- .../core/tree/entity-actions/sort-children-of/index.ts | 3 +++ .../sort-children-of-data-source.interface.ts | 6 ++++++ .../sort-children-of-repository.interface.ts | 7 +++++++ .../core/tree/entity-actions/sort-children-of/types.ts | 4 ++++ 4 files changed, 20 insertions(+) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/tree/entity-actions/sort-children-of/sort-children-of-data-source.interface.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/tree/entity-actions/sort-children-of/sort-children-of-repository.interface.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/core/tree/entity-actions/sort-children-of/types.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/entity-actions/sort-children-of/index.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/entity-actions/sort-children-of/index.ts index 2e789e1917..46e9490b58 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/entity-actions/sort-children-of/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/entity-actions/sort-children-of/index.ts @@ -1 +1,4 @@ export { UmbSortChildrenOfEntityAction } from './sort-children-of.action.js'; +export type { UmbSortChildrenOfArgs } from './types.js'; +export type { UmbSortChildrenOfRepository } from './sort-children-of-repository.interface.js'; +export type { UmbSortChildrenOfDataSource } from './sort-children-of-data-source.interface.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/entity-actions/sort-children-of/sort-children-of-data-source.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/entity-actions/sort-children-of/sort-children-of-data-source.interface.ts new file mode 100644 index 0000000000..e763545454 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/entity-actions/sort-children-of/sort-children-of-data-source.interface.ts @@ -0,0 +1,6 @@ +import type { UmbSortChildrenOfArgs } from './types.js'; +import type { UmbDataSourceErrorResponse } from '@umbraco-cms/backoffice/repository'; + +export interface UmbSortChildrenOfDataSource { + sortChildrenOf(args: UmbSortChildrenOfArgs): Promise; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/entity-actions/sort-children-of/sort-children-of-repository.interface.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/entity-actions/sort-children-of/sort-children-of-repository.interface.ts new file mode 100644 index 0000000000..6da10c0a39 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/entity-actions/sort-children-of/sort-children-of-repository.interface.ts @@ -0,0 +1,7 @@ +import type { UmbSortChildrenOfArgs } from './types.js'; +import type { UmbRepositoryErrorResponse } from '@umbraco-cms/backoffice/repository'; +import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; + +export interface UmbSortChildrenOfRepository extends UmbApi { + sortChildrenOf(args: UmbSortChildrenOfArgs): Promise; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/entity-actions/sort-children-of/types.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/entity-actions/sort-children-of/types.ts new file mode 100644 index 0000000000..7934391f3f --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/entity-actions/sort-children-of/types.ts @@ -0,0 +1,4 @@ +export interface UmbSortChildrenOfArgs { + unique: string | null; + sorting: Array<{ unique: string; sortOrder: number }>; +} From ccea759816223c177b80016f9754636620b02559 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Fri, 24 May 2024 22:19:58 +0200 Subject: [PATCH 12/20] get types from core --- .../media/media/entity-actions/sort-children-of/index.ts | 2 -- .../entity-actions/sort-children-of/repository/index.ts | 1 - .../repository/sort-children-of.repository.ts | 5 ++--- .../repository/sort-children-of.server.data.ts | 4 ++-- .../entity-actions/sort-children-of/repository/types.ts | 4 ---- 5 files changed, 4 insertions(+), 12 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/repository/types.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/index.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/index.ts index 7b4b44ef0d..02f7b00019 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/index.ts @@ -1,3 +1 @@ export { UmbSortChildrenOfMediaRepository, UMB_SORT_CHILDREN_OF_MEDIA_REPOSITORY_ALIAS } from './repository/index.js'; - -export type { UmbSortChildrenOfArgs } from './repository/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/repository/index.ts index 23c986a443..53e13556a6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/repository/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/repository/index.ts @@ -1,3 +1,2 @@ export { UmbSortChildrenOfMediaRepository } from './sort-children-of.repository.js'; export { UMB_SORT_CHILDREN_OF_MEDIA_REPOSITORY_ALIAS } from './constants.js'; -export type { UmbSortChildrenOfArgs } from './types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/repository/sort-children-of.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/repository/sort-children-of.repository.ts index 138e2af525..19025a35ac 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/repository/sort-children-of.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/repository/sort-children-of.repository.ts @@ -1,12 +1,11 @@ import { UmbSortChildrenOfMediaServerDataSource } from './sort-children-of.server.data.js'; -import type { UmbSortChildrenOfArgs } from './types.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; import type { UmbNotificationContext } from '@umbraco-cms/backoffice/notification'; import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification'; -import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; +import type { UmbSortChildrenOfArgs, UmbSortChildrenOfRepository } from '@umbraco-cms/backoffice/tree'; -export class UmbSortChildrenOfMediaRepository extends UmbControllerBase implements UmbApi { +export class UmbSortChildrenOfMediaRepository extends UmbControllerBase implements UmbSortChildrenOfRepository { #dataSource: UmbSortChildrenOfMediaServerDataSource; #notificationContext?: UmbNotificationContext; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/repository/sort-children-of.server.data.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/repository/sort-children-of.server.data.ts index cfa5351bba..463806706f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/repository/sort-children-of.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/repository/sort-children-of.server.data.ts @@ -1,7 +1,7 @@ -import type { UmbSortChildrenOfArgs } from './types.js'; 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'; +import type { UmbSortChildrenOfArgs, UmbSortChildrenOfDataSource } from '@umbraco-cms/backoffice/tree'; /** * A server data source for sorting children of a Media @@ -9,7 +9,7 @@ import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; * @class UmbSortChildrenOfMediaServerDataSource * @implements {RepositoryDetailDataSource} */ -export class UmbSortChildrenOfMediaServerDataSource { +export class UmbSortChildrenOfMediaServerDataSource implements UmbSortChildrenOfDataSource { #host: UmbControllerHost; /** diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/repository/types.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/repository/types.ts deleted file mode 100644 index 7934391f3f..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/entity-actions/sort-children-of/repository/types.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface UmbSortChildrenOfArgs { - unique: string | null; - sorting: Array<{ unique: string; sortOrder: number }>; -} From c6950e4aa16203db3f78145f24f7ae8f0f1d140d Mon Sep 17 00:00:00 2001 From: Bjarne Fyrstenborg Date: Sat, 25 May 2024 16:40:50 +0200 Subject: [PATCH 13/20] Add placeholder to name input --- .../components/input-with-alias/input-with-alias.element.ts | 2 +- .../workspace/document-type-workspace-editor.element.ts | 3 ++- .../workspace/media-type-workspace-editor.element.ts | 3 ++- .../workspace/member-type-workspace-editor.element.ts | 3 ++- .../workspace/user-group-workspace-editor.element.ts | 3 ++- 5 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-with-alias/input-with-alias.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-with-alias/input-with-alias.element.ts index 0e00a714f6..6d35011fb7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/input-with-alias/input-with-alias.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/input-with-alias/input-with-alias.element.ts @@ -70,7 +70,7 @@ export class UmbInputWithAliasElement extends UmbFormControlMixin(UmbLit render() { // Localizations: [NL] return html` - + + ${umbFocus()}> + `; diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/workspace/media-type-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/workspace/media-type-workspace-editor.element.ts index ac79122095..75360342ce 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media-types/workspace/media-type-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media-types/workspace/media-type-workspace-editor.element.ts @@ -80,7 +80,8 @@ export class UmbMediaTypeWorkspaceEditorElement extends UmbLitElement { alias=${this._alias} ?auto-generate-alias=${this._isNew} @change="${this.#onNameAndAliasChange}" - ${umbFocus()}> + ${umbFocus()}> + `; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/workspace/member-type-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/workspace/member-type-workspace-editor.element.ts index 065cc79855..7ddb67d261 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/members/member-type/workspace/member-type-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/members/member-type/workspace/member-type-workspace-editor.element.ts @@ -80,7 +80,8 @@ export class UmbMemberTypeWorkspaceEditorElement extends UmbLitElement { alias=${this._alias} ?auto-generate-alias=${this._isNew} @change="${this.#onNameAndAliasChange}" - ${umbFocus()}> + ${umbFocus()}> + `; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace-editor.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace-editor.element.ts index 1ed416c7bd..494dc2e52c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace-editor.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace-editor.element.ts @@ -222,7 +222,8 @@ export class UmbUserGroupWorkspaceEditorElement extends UmbLitElement { ?auto-generate-alias=${this._isNew} ?alias-readonly=${this._aliasCanBeChanged === false} @change=${this.#onNameAndAliasChange} - ${umbFocus()}> + ${umbFocus()}> + `; } From 3a0ff53013e500e6ba6bbe5ded074b4b902260fc Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Sat, 25 May 2024 18:42:33 +0200 Subject: [PATCH 14/20] implement interfaces --- .../documents/entity-actions/sort-children-of/index.ts | 2 -- .../entity-actions/sort-children-of/repository/index.ts | 1 - .../repository/sort-children-of.repository.ts | 5 ++--- .../repository/sort-children-of.server.data.ts | 4 ++-- .../entity-actions/sort-children-of/repository/types.ts | 4 ---- 5 files changed, 4 insertions(+), 12 deletions(-) delete mode 100644 src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/sort-children-of/repository/types.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/sort-children-of/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/sort-children-of/index.ts index 8276e983e9..53dabf0ae8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/sort-children-of/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/sort-children-of/index.ts @@ -2,5 +2,3 @@ export { UmbSortChildrenOfDocumentRepository, UMB_SORT_CHILDREN_OF_DOCUMENT_REPOSITORY_ALIAS, } from './repository/index.js'; - -export type { UmbSortChildrenOfArgs } from './repository/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/sort-children-of/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/sort-children-of/repository/index.ts index ce7a0f56a4..5839c4ddb4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/sort-children-of/repository/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/sort-children-of/repository/index.ts @@ -1,3 +1,2 @@ export { UmbSortChildrenOfDocumentRepository } from './sort-children-of.repository.js'; export { UMB_SORT_CHILDREN_OF_DOCUMENT_REPOSITORY_ALIAS } from './constants.js'; -export type { UmbSortChildrenOfArgs } from './types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/sort-children-of/repository/sort-children-of.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/sort-children-of/repository/sort-children-of.repository.ts index b6469aac92..0f79df3e55 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/sort-children-of/repository/sort-children-of.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/sort-children-of/repository/sort-children-of.repository.ts @@ -1,12 +1,11 @@ import { UmbSortChildrenOfDocumentServerDataSource } from './sort-children-of.server.data.js'; -import type { UmbSortChildrenOfArgs } from './types.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; import type { UmbNotificationContext } from '@umbraco-cms/backoffice/notification'; import { UMB_NOTIFICATION_CONTEXT } from '@umbraco-cms/backoffice/notification'; -import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; +import type { UmbSortChildrenOfArgs, UmbSortChildrenOfRepository } from '@umbraco-cms/backoffice/tree'; -export class UmbSortChildrenOfDocumentRepository extends UmbControllerBase implements UmbApi { +export class UmbSortChildrenOfDocumentRepository extends UmbControllerBase implements UmbSortChildrenOfRepository { #dataSource: UmbSortChildrenOfDocumentServerDataSource; #notificationContext?: UmbNotificationContext; 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 d820a02ffb..d57a1b2b80 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,7 +1,7 @@ -import type { UmbSortChildrenOfArgs } from './types.js'; 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 { UmbSortChildrenOfArgs, UmbSortChildrenOfDataSource } from '@umbraco-cms/backoffice/tree'; /** * A server data source for sorting children of a Document @@ -9,7 +9,7 @@ import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; * @class UmbSortChildrenOfDocumentServerDataSource * @implements {RepositoryDetailDataSource} */ -export class UmbSortChildrenOfDocumentServerDataSource { +export class UmbSortChildrenOfDocumentServerDataSource implements UmbSortChildrenOfDataSource { #host: UmbControllerHost; /** diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/sort-children-of/repository/types.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/sort-children-of/repository/types.ts deleted file mode 100644 index 7934391f3f..0000000000 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/sort-children-of/repository/types.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface UmbSortChildrenOfArgs { - unique: string | null; - sorting: Array<{ unique: string; sortOrder: number }>; -} From b08345c662e13d5605b0574aa9a75f2b17b67bb2 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Sat, 25 May 2024 18:44:13 +0200 Subject: [PATCH 15/20] swap any with interface --- .../sort-children-of/modal/sort-children-of-modal.element.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/tree/entity-actions/sort-children-of/modal/sort-children-of-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/tree/entity-actions/sort-children-of/modal/sort-children-of-modal.element.ts index fee3a27755..885444d4b6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/tree/entity-actions/sort-children-of/modal/sort-children-of-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/tree/entity-actions/sort-children-of/modal/sort-children-of-modal.element.ts @@ -5,7 +5,7 @@ import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; import { UmbSorterController } from '@umbraco-cms/backoffice/sorter'; import { createExtensionApiByAlias } from '@umbraco-cms/backoffice/extension-registry'; -import type { UmbTreeRepository, UmbTreeItemModel } from '@umbraco-cms/backoffice/tree'; +import type { UmbTreeRepository, UmbTreeItemModel, UmbSortChildrenOfRepository } from '@umbraco-cms/backoffice/tree'; import { UmbPaginationManager } from '@umbraco-cms/backoffice/utils'; import { observeMultiple } from '@umbraco-cms/backoffice/observable-api'; @@ -112,7 +112,7 @@ export class UmbSortChildrenOfModalElement extends UmbModalBaseElement< event?.stopPropagation(); if (!this.data?.sortChildrenOfRepositoryAlias) throw new Error('sortChildrenOfRepositoryAlias is required'); - const sortChildrenOfRepository = await createExtensionApiByAlias( + const sortChildrenOfRepository = await createExtensionApiByAlias( this, this.data.sortChildrenOfRepositoryAlias, ); From 19217d1dad36d3bcd09a2782176692d611b06209 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Sat, 25 May 2024 23:56:40 +0200 Subject: [PATCH 16/20] split const and tokens from implementation --- .../src/packages/language/collection/constants.ts | 1 + .../src/packages/language/collection/index.ts | 2 +- .../src/packages/language/collection/manifests.ts | 3 +-- .../src/packages/language/collection/repository/constants.ts | 1 + .../src/packages/language/collection/repository/index.ts | 2 +- .../src/packages/language/collection/repository/manifests.ts | 3 +-- .../language/global-contexts/app-language.context-token.ts | 4 ++++ .../language/global-contexts/app-language.context.ts | 4 +--- .../src/packages/language/global-contexts/index.ts | 1 + .../src/packages/language/repository/detail/constants.ts | 2 ++ .../src/packages/language/repository/detail/index.ts | 2 +- .../language/repository/detail/language-detail.repository.ts | 2 +- .../repository/detail/language-detail.server.data-source.ts | 1 - .../repository/detail/language-detail.store.context-token.ts | 4 ++++ .../language/repository/detail/language-detail.store.ts | 4 +--- .../src/packages/language/repository/detail/manifests.ts | 5 +---- .../src/packages/language/repository/item/constants.ts | 2 ++ .../src/packages/language/repository/item/index.ts | 2 +- .../language/repository/item/language-item.repository.ts | 2 +- .../repository/item/language-item.store.context-token.ts | 4 ++++ .../packages/language/repository/item/language-item.store.ts | 4 +--- .../src/packages/language/repository/item/manifests.ts | 4 +--- 22 files changed, 32 insertions(+), 27 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/language/collection/constants.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/language/collection/repository/constants.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/language/global-contexts/app-language.context-token.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/language/repository/detail/constants.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/language/repository/detail/language-detail.store.context-token.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/language/repository/item/constants.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/language/repository/item/language-item.store.context-token.ts diff --git a/src/Umbraco.Web.UI.Client/src/packages/language/collection/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/language/collection/constants.ts new file mode 100644 index 0000000000..1c7ef2a735 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/language/collection/constants.ts @@ -0,0 +1 @@ +export const UMB_LANGUAGE_COLLECTION_ALIAS = 'Umb.Collection.Language'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/language/collection/index.ts b/src/Umbraco.Web.UI.Client/src/packages/language/collection/index.ts index aa0587d7b2..cd030770dc 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/language/collection/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/language/collection/index.ts @@ -1,2 +1,2 @@ export { UmbLanguageCollectionRepository } from './repository/index.js'; -export { UMB_LANGUAGE_COLLECTION_ALIAS } from './manifests.js'; +export { UMB_LANGUAGE_COLLECTION_ALIAS } from './constants.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/language/collection/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/language/collection/manifests.ts index fdd87fdd1a..d03f3a5bb6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/language/collection/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/language/collection/manifests.ts @@ -2,10 +2,9 @@ import { UMB_LANGUAGE_COLLECTION_REPOSITORY_ALIAS } from './repository/index.js' import { manifests as collectionRepositoryManifests } from './repository/manifests.js'; import { manifests as collectionViewManifests } from './views/manifests.js'; import { manifests as collectionActionManifests } from './action/manifests.js'; +import { UMB_LANGUAGE_COLLECTION_ALIAS } from './constants.js'; import type { ManifestCollection, ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; -export const UMB_LANGUAGE_COLLECTION_ALIAS = 'Umb.Collection.Language'; - const collectionManifest: ManifestCollection = { type: 'collection', kind: 'default', diff --git a/src/Umbraco.Web.UI.Client/src/packages/language/collection/repository/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/language/collection/repository/constants.ts new file mode 100644 index 0000000000..c9bdf50093 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/language/collection/repository/constants.ts @@ -0,0 +1 @@ +export const UMB_LANGUAGE_COLLECTION_REPOSITORY_ALIAS = 'Umb.Repository.LanguageCollection'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/language/collection/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/language/collection/repository/index.ts index 4fd6ab9be5..031e5ffe39 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/language/collection/repository/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/language/collection/repository/index.ts @@ -1,2 +1,2 @@ -export { UMB_LANGUAGE_COLLECTION_REPOSITORY_ALIAS } from './manifests.js'; +export { UMB_LANGUAGE_COLLECTION_REPOSITORY_ALIAS } from './constants.js'; export { UmbLanguageCollectionRepository } from './language-collection.repository.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/language/collection/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/language/collection/repository/manifests.ts index d98668dae6..ea284123d7 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/language/collection/repository/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/language/collection/repository/manifests.ts @@ -1,7 +1,6 @@ +import { UMB_LANGUAGE_COLLECTION_REPOSITORY_ALIAS } from './constants.js'; import type { ManifestRepository, ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; -export const UMB_LANGUAGE_COLLECTION_REPOSITORY_ALIAS = 'Umb.Repository.LanguageCollection'; - const repository: ManifestRepository = { type: 'repository', alias: UMB_LANGUAGE_COLLECTION_REPOSITORY_ALIAS, diff --git a/src/Umbraco.Web.UI.Client/src/packages/language/global-contexts/app-language.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/language/global-contexts/app-language.context-token.ts new file mode 100644 index 0000000000..844e242259 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/language/global-contexts/app-language.context-token.ts @@ -0,0 +1,4 @@ +import type { UmbAppLanguageContext } from './app-language.context.js'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; + +export const UMB_APP_LANGUAGE_CONTEXT = new UmbContextToken('UmbAppLanguageContext'); diff --git a/src/Umbraco.Web.UI.Client/src/packages/language/global-contexts/app-language.context.ts b/src/Umbraco.Web.UI.Client/src/packages/language/global-contexts/app-language.context.ts index 2ba730a984..1383eee7c8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/language/global-contexts/app-language.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/language/global-contexts/app-language.context.ts @@ -1,9 +1,9 @@ import { UmbLanguageCollectionRepository } from '../collection/index.js'; import type { UmbLanguageDetailModel } from '../types.js'; +import { UMB_APP_LANGUAGE_CONTEXT } from './app-language.context-token.js'; import { UmbArrayState, UmbObjectState, createObservablePart } from '@umbraco-cms/backoffice/observable-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbContextBase } from '@umbraco-cms/backoffice/class-api'; -import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import type { UmbApi } from '@umbraco-cms/backoffice/extension-api'; import { UMB_AUTH_CONTEXT } from '@umbraco-cms/backoffice/auth'; @@ -71,5 +71,3 @@ export class UmbAppLanguageContext extends UmbContextBase // Default export to enable this as a globalContext extension js: export default UmbAppLanguageContext; - -export const UMB_APP_LANGUAGE_CONTEXT = new UmbContextToken('UmbAppLanguageContext'); diff --git a/src/Umbraco.Web.UI.Client/src/packages/language/global-contexts/index.ts b/src/Umbraco.Web.UI.Client/src/packages/language/global-contexts/index.ts index 2ae51a2bc7..60d5432219 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/language/global-contexts/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/language/global-contexts/index.ts @@ -1 +1,2 @@ export * from './app-language.context.js'; +export { UMB_APP_LANGUAGE_CONTEXT } from './app-language.context-token.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/language/repository/detail/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/language/repository/detail/constants.ts new file mode 100644 index 0000000000..88b813589d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/language/repository/detail/constants.ts @@ -0,0 +1,2 @@ +export const UMB_LANGUAGE_DETAIL_REPOSITORY_ALIAS = 'Umb.Repository.Language.Detail'; +export const UMB_LANGUAGE_DETAIL_STORE_ALIAS = 'Umb.Store.Language.Detail'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/language/repository/detail/index.ts b/src/Umbraco.Web.UI.Client/src/packages/language/repository/detail/index.ts index f76fdf72ff..5d91c03020 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/language/repository/detail/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/language/repository/detail/index.ts @@ -1,2 +1,2 @@ export { UmbLanguageDetailRepository } from './language-detail.repository.js'; -export { UMB_LANGUAGE_DETAIL_REPOSITORY_ALIAS } from './manifests.js'; +export { UMB_LANGUAGE_DETAIL_REPOSITORY_ALIAS } from './constants.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/language/repository/detail/language-detail.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/language/repository/detail/language-detail.repository.ts index af02498e2d..40ff20772e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/language/repository/detail/language-detail.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/language/repository/detail/language-detail.repository.ts @@ -1,6 +1,6 @@ import type { UmbLanguageDetailModel } from '../../types.js'; import { UmbLanguageServerDataSource } from './language-detail.server.data-source.js'; -import { UMB_LANGUAGE_DETAIL_STORE_CONTEXT } from './language-detail.store.js'; +import { UMB_LANGUAGE_DETAIL_STORE_CONTEXT } from './language-detail.store.context-token.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbDetailRepositoryBase } from '@umbraco-cms/backoffice/repository'; 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 6099653631..e40ed9bc28 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 @@ -1,6 +1,5 @@ import type { UmbLanguageDetailModel } from '../../types.js'; import { UMB_LANGUAGE_ENTITY_TYPE } from '../../entity.js'; -import { UmbId } from '@umbraco-cms/backoffice/id'; import type { UmbDetailDataSource } from '@umbraco-cms/backoffice/repository'; import type { CreateLanguageRequestModel, diff --git a/src/Umbraco.Web.UI.Client/src/packages/language/repository/detail/language-detail.store.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/language/repository/detail/language-detail.store.context-token.ts new file mode 100644 index 0000000000..9f65daf420 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/language/repository/detail/language-detail.store.context-token.ts @@ -0,0 +1,4 @@ +import type { UmbLanguageDetailStore } from './language-detail.store.js'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; + +export const UMB_LANGUAGE_DETAIL_STORE_CONTEXT = new UmbContextToken('UmbLanguageDetailStore'); diff --git a/src/Umbraco.Web.UI.Client/src/packages/language/repository/detail/language-detail.store.ts b/src/Umbraco.Web.UI.Client/src/packages/language/repository/detail/language-detail.store.ts index e985f118f4..a7362228b4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/language/repository/detail/language-detail.store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/language/repository/detail/language-detail.store.ts @@ -1,5 +1,5 @@ import type { UmbLanguageDetailModel } from '../../types.js'; -import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; +import { UMB_LANGUAGE_DETAIL_STORE_CONTEXT } from './language-detail.store.context-token.js'; import { UmbDetailStoreBase } from '@umbraco-cms/backoffice/store'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; @@ -21,5 +21,3 @@ export class UmbLanguageDetailStore extends UmbDetailStoreBase('UmbLanguageDetailStore'); diff --git a/src/Umbraco.Web.UI.Client/src/packages/language/repository/detail/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/language/repository/detail/manifests.ts index 4f9d77beae..1f68d6d8f8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/language/repository/detail/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/language/repository/detail/manifests.ts @@ -1,7 +1,6 @@ +import { UMB_LANGUAGE_DETAIL_REPOSITORY_ALIAS, UMB_LANGUAGE_DETAIL_STORE_ALIAS } from './constants.js'; import type { ManifestRepository, ManifestStore, ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; -export const UMB_LANGUAGE_DETAIL_REPOSITORY_ALIAS = 'Umb.Repository.Language.Detail'; - const repository: ManifestRepository = { type: 'repository', alias: UMB_LANGUAGE_DETAIL_REPOSITORY_ALIAS, @@ -9,8 +8,6 @@ const repository: ManifestRepository = { api: () => import('./language-detail.repository.js'), }; -export const UMB_LANGUAGE_DETAIL_STORE_ALIAS = 'Umb.Store.Language.Detail'; - const store: ManifestStore = { type: 'store', alias: UMB_LANGUAGE_DETAIL_STORE_ALIAS, diff --git a/src/Umbraco.Web.UI.Client/src/packages/language/repository/item/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/language/repository/item/constants.ts new file mode 100644 index 0000000000..7cfcf01b31 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/language/repository/item/constants.ts @@ -0,0 +1,2 @@ +export const UMB_LANGUAGE_ITEM_REPOSITORY_ALIAS = 'Umb.Repository.LanguageItem'; +export const UMB_LANGUAGE_STORE_ALIAS = 'Umb.Store.LanguageItem'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/language/repository/item/index.ts b/src/Umbraco.Web.UI.Client/src/packages/language/repository/item/index.ts index ccc13f2aa9..a793725ef4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/language/repository/item/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/language/repository/item/index.ts @@ -1,3 +1,3 @@ export { UmbLanguageItemRepository } from './language-item.repository.js'; -export { UMB_LANGUAGE_ITEM_REPOSITORY_ALIAS } from './manifests.js'; +export { UMB_LANGUAGE_ITEM_REPOSITORY_ALIAS } from './constants.js'; export type { UmbLanguageItemModel } from './types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/language/repository/item/language-item.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/language/repository/item/language-item.repository.ts index 7f73858991..8f30d9e3ef 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/language/repository/item/language-item.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/language/repository/item/language-item.repository.ts @@ -1,5 +1,5 @@ import { UmbLanguageItemServerDataSource } from './language-item.server.data-source.js'; -import { UMB_LANGUAGE_ITEM_STORE_CONTEXT } from './language-item.store.js'; +import { UMB_LANGUAGE_ITEM_STORE_CONTEXT } from './language-item.store.context-token.js'; import type { UmbLanguageItemModel } from './types.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbItemRepositoryBase } from '@umbraco-cms/backoffice/repository'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/language/repository/item/language-item.store.context-token.ts b/src/Umbraco.Web.UI.Client/src/packages/language/repository/item/language-item.store.context-token.ts new file mode 100644 index 0000000000..76149a4751 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/language/repository/item/language-item.store.context-token.ts @@ -0,0 +1,4 @@ +import type { UmbLanguageItemStore } from './language-item.store.js'; +import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; + +export const UMB_LANGUAGE_ITEM_STORE_CONTEXT = new UmbContextToken('UmbLanguageItemStore'); diff --git a/src/Umbraco.Web.UI.Client/src/packages/language/repository/item/language-item.store.ts b/src/Umbraco.Web.UI.Client/src/packages/language/repository/item/language-item.store.ts index c27747a459..58b72dd799 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/language/repository/item/language-item.store.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/language/repository/item/language-item.store.ts @@ -1,5 +1,5 @@ import type { UmbLanguageItemModel } from './types.js'; -import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; +import { UMB_LANGUAGE_ITEM_STORE_CONTEXT } from './language-item.store.context-token.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbItemStoreBase } from '@umbraco-cms/backoffice/store'; @@ -22,5 +22,3 @@ export class UmbLanguageItemStore extends UmbItemStoreBase } export default UmbLanguageItemStore; - -export const UMB_LANGUAGE_ITEM_STORE_CONTEXT = new UmbContextToken('UmbLanguageItemStore'); diff --git a/src/Umbraco.Web.UI.Client/src/packages/language/repository/item/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/language/repository/item/manifests.ts index cbcdf682a5..8aa52506d5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/language/repository/item/manifests.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/language/repository/item/manifests.ts @@ -1,8 +1,6 @@ +import { UMB_LANGUAGE_ITEM_REPOSITORY_ALIAS, UMB_LANGUAGE_STORE_ALIAS } from './constants.js'; import type { ManifestRepository, ManifestItemStore, ManifestTypes } from '@umbraco-cms/backoffice/extension-registry'; -export const UMB_LANGUAGE_ITEM_REPOSITORY_ALIAS = 'Umb.Repository.LanguageItem'; -export const UMB_LANGUAGE_STORE_ALIAS = 'Umb.Store.LanguageItem'; - const itemRepository: ManifestRepository = { type: 'repository', alias: UMB_LANGUAGE_ITEM_REPOSITORY_ALIAS, From f5a91736360663e8c129cc54f1bb026b7acf6eeb Mon Sep 17 00:00:00 2001 From: leekelleher Date: Sun, 26 May 2024 22:51:51 +0100 Subject: [PATCH 17/20] Bugfix: Media reference links Uses the associated entity-type for the reference for the modal route. Fixes https://github.com/umbraco/Umbraco-CMS/issues/16397 --- ...a-workspace-view-info-reference.element.ts | 166 ++++++++++-------- 1 file changed, 91 insertions(+), 75 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/views/info/media-workspace-view-info-reference.element.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/views/info/media-workspace-view-info-reference.element.ts index c45e290cc3..2704b72704 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/views/info/media-workspace-view-info-reference.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/views/info/media-workspace-view-info-reference.element.ts @@ -1,28 +1,25 @@ -import { css, html, customElement, state, nothing, repeat, property } from '@umbraco-cms/backoffice/external/lit'; -import type { UUIPaginationEvent } from '@umbraco-cms/backoffice/external/uui'; +import { css, customElement, html, nothing, property, repeat, state, when } from '@umbraco-cms/backoffice/external/lit'; +import { isDefaultReference, isDocumentReference, isMediaReference } from '@umbraco-cms/backoffice/relations'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; -import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UmbMediaReferenceRepository } from '@umbraco-cms/backoffice/media'; -import { UMB_WORKSPACE_MODAL } from '@umbraco-cms/backoffice/modal'; import { UmbModalRouteRegistrationController } from '@umbraco-cms/backoffice/router'; -import { - isDefaultReference, - isDocumentReference, - isMediaReference, - type UmbReferenceModel, -} from '@umbraco-cms/backoffice/relations'; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; +import { UMB_WORKSPACE_MODAL } from '@umbraco-cms/backoffice/modal'; +import type { UmbReferenceModel } from '@umbraco-cms/backoffice/relations'; +import type { UmbModalRouteBuilder } from '@umbraco-cms/backoffice/router'; +import type { UUIPaginationEvent } from '@umbraco-cms/backoffice/external/uui'; @customElement('umb-media-workspace-view-info-reference') export class UmbMediaWorkspaceViewInfoReferenceElement extends UmbLitElement { #itemsPerPage = 10; + #referenceRepository; + #routeBuilder?: UmbModalRouteBuilder; + @property() mediaUnique = ''; - @state() - private _editMediaPath = ''; - @state() private _currentPage = 1; @@ -32,17 +29,20 @@ export class UmbMediaWorkspaceViewInfoReferenceElement extends UmbLitElement { @state() private _items?: Array = []; + @state() + private _loading = true; + constructor() { super(); this.#referenceRepository = new UmbMediaReferenceRepository(this); new UmbModalRouteRegistrationController(this, UMB_WORKSPACE_MODAL) - .addAdditionalPath('media') - .onSetup(() => { - return { data: { entityType: 'media', preset: {} } }; + .addAdditionalPath(':entityType') + .onSetup((params) => { + return { data: { entityType: params.entityType, preset: {} } }; }) .observeRouteBuilder((routeBuilder) => { - this._editMediaPath = routeBuilder({}); + this.#routeBuilder = routeBuilder; }); } @@ -51,15 +51,20 @@ export class UmbMediaWorkspaceViewInfoReferenceElement extends UmbLitElement { } async #getReferences() { + this._loading = true; + const { data } = await this.#referenceRepository.requestReferencedBy( this.mediaUnique, - this._currentPage - 1 * this.#itemsPerPage, + (this._currentPage - 1) * this.#itemsPerPage, this.#itemsPerPage, ); + if (!data) return; this._total = data.total; this._items = data.items; + + this._loading = false; } #onPageChange(event: UUIPaginationEvent) { @@ -69,6 +74,11 @@ export class UmbMediaWorkspaceViewInfoReferenceElement extends UmbLitElement { this.#getReferences(); } + #getEditPath(item: UmbReferenceModel) { + const entityType = this.#getEntityType(item); + return this.#routeBuilder && entityType ? `${this.#routeBuilder({ entityType })}edit/${item.id}` : '#'; + } + #getIcon(item: UmbReferenceModel) { if (isDocumentReference(item)) { return item.documentType.icon ?? 'icon-document'; @@ -96,88 +106,94 @@ export class UmbMediaWorkspaceViewInfoReferenceElement extends UmbLitElement { if (isDefaultReference(item)) { return item.type; } - return ''; + return null; } - #getContentType(item: UmbReferenceModel) { + #getEntityType(item: UmbReferenceModel) { if (isDocumentReference(item)) { - return item.documentType.alias; + return 'document'; } if (isMediaReference(item)) { - return item.mediaType.alias; + return 'media'; } if (isDefaultReference(item)) { return item.type; } - return ''; + return null; } render() { - if (this._items && this._items.length > 0) { - return html` - - - - Name - Status - Type Name - Type - - - ${repeat( - this._items, - (item) => item.id, - (item) => - html` - - - - - ${isDocumentReference(item) - ? html` - - ${item.name} - - ` - : item.name} - - - ${this.#getPublishedStatus(item) - ? this.localize.term('content_published') - : this.localize.term('content_unpublished')} - - ${this.#getContentTypeName(item)} - ${this.#getContentType(item)} - `, - )} - - - ${this.#renderReferencePagination()}`; - } else { - return nothing; - } + return html` + + ${when( + this._loading, + () => html``, + () => html`${this.#renderItems()} ${this.#renderPagination()}`, + )} + + `; } - #renderReferencePagination() { + #renderItems() { + if (!this._items?.length) return html`

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

`; + return html` + + + Name + Status + Type Name + Type + + ${repeat( + this._items, + (item) => item.id, + (item) => html` + + + + + + + + ${when( + this.#getPublishedStatus(item), + () => + html`${this.localize.term('content_published')}`, + () => + html`${this.localize.term('content_unpublished')}`, + )} + + ${this.#getContentTypeName(item)} + ${this.#getEntityType(item)} + + `, + )} + + `; + } + + #renderPagination() { if (!this._total) return nothing; const totalPages = Math.ceil(this._total / this.#itemsPerPage); if (totalPages <= 1) return nothing; - return html``; + return html` + + `; } static styles = [ UmbTextStyles, css` - uui-table-cell:not(.link-cell) { + uui-table-cell { color: var(--uui-color-text-alt); } From d2edd2ba77ce29c6c074ef6ff1753ef2227697bc Mon Sep 17 00:00:00 2001 From: leekelleher Date: Sun, 26 May 2024 23:06:46 +0100 Subject: [PATCH 18/20] Bugfix: Media info links, corrected localization for no links Also removed the culture output, as media doesn't (currently) have variants. Fixes https://github.com/umbraco/Umbraco-CMS/issues/16395 --- .../views/info/media-workspace-view-info.element.ts | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/views/info/media-workspace-view-info.element.ts b/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/views/info/media-workspace-view-info.element.ts index 23109d8b3f..5277cc2ecf 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/views/info/media-workspace-view-info.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/media/media/workspace/views/info/media-workspace-view-info.element.ts @@ -123,11 +123,10 @@ export class UmbMediaWorkspaceViewInfoElement extends UmbLitElement { return html` ${repeat( this._urls, - (url) => url.culture, + (url) => url.url, (url) => html` - ${url.culture} - ${url.url} + ${url.url} `, @@ -136,8 +135,7 @@ export class UmbMediaWorkspaceViewInfoElement extends UmbLitElement { } else { return html` `; } @@ -217,7 +215,7 @@ export class UmbMediaWorkspaceViewInfoElement extends UmbLitElement { .link-item { padding: var(--uui-size-space-4) var(--uui-size-space-6); display: grid; - grid-template-columns: auto 1fr auto; + grid-template-columns: 1fr auto; gap: var(--uui-size-6); color: inherit; text-decoration: none; From 9a564a038dec4ae3f89504e5e0815bb5798a7acb Mon Sep 17 00:00:00 2001 From: leekelleher Date: Mon, 27 May 2024 00:02:52 +0100 Subject: [PATCH 19/20] Bugfix: DocumentType history clean UI Also added label localization. Fixes https://github.com/umbraco/Umbraco-CMS/issues/16295 --- .../document-type-workspace.context.ts | 6 +- ...nt-type-workspace-view-settings.element.ts | 137 +++++++++++++++--- 2 files changed, 123 insertions(+), 20 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/document-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/document-type-workspace.context.ts index d4aa7b5813..8ba097d556 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/document-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/document-type-workspace.context.ts @@ -102,7 +102,7 @@ export class UmbDocumentTypeWorkspaceContext // Document type specific: this.allowedTemplateIds = this.structure.ownerContentTypeObservablePart((data) => data?.allowedTemplates); this.defaultTemplate = this.structure.ownerContentTypeObservablePart((data) => data?.defaultTemplate); - this.cleanup = this.structure.ownerContentTypeObservablePart((data) => data?.defaultTemplate); + this.cleanup = this.structure.ownerContentTypeObservablePart((data) => data?.cleanup); this.routes.setRoutes([ { @@ -193,6 +193,10 @@ export class UmbDocumentTypeWorkspaceContext this.structure.updateOwnerContentType({ allowedContentTypes }); } + setCleanup(cleanup: UmbDocumentTypeDetailModel['cleanup']) { + this.structure.updateOwnerContentType({ cleanup }); + } + setCompositions(compositions: Array) { this.structure.updateOwnerContentType({ compositions }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/views/settings/document-type-workspace-view-settings.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/views/settings/document-type-workspace-view-settings.element.ts index 58aef22912..0c3a69eaad 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/views/settings/document-type-workspace-view-settings.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/document-types/workspace/views/settings/document-type-workspace-view-settings.element.ts @@ -1,7 +1,7 @@ import { UMB_DOCUMENT_TYPE_WORKSPACE_CONTEXT } from '../../document-type-workspace.context-token.js'; -import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; +import { css, html, customElement, state, when } from '@umbraco-cms/backoffice/external/lit'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; -import type { UUIToggleElement } from '@umbraco-cms/backoffice/external/uui'; +import type { UUIBooleanInputEvent, UUIToggleElement } from '@umbraco-cms/backoffice/external/uui'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import type { UmbWorkspaceViewElement } from '@umbraco-cms/backoffice/extension-registry'; @@ -11,22 +11,33 @@ export class UmbDocumentTypeWorkspaceViewSettingsElement extends UmbLitElement i @state() private _variesByCulture?: boolean; + @state() private _variesBySegment?: boolean; + @state() private _isElement?: boolean; + @state() + private _keepAllVersionsNewerThanDays?: number | null; + + @state() + private _keepLatestVersionPerDayForDays?: number | null; + + @state() + private _preventCleanup?: boolean; + constructor() { super(); // TODO: Figure out if this is the best way to consume the context or if it can be strongly typed with an UmbContextToken this.consumeContext(UMB_DOCUMENT_TYPE_WORKSPACE_CONTEXT, (documentTypeContext) => { this.#workspaceContext = documentTypeContext; - this._observeDocumentType(); + this.#observeDocumentType(); }); } - private _observeDocumentType() { + #observeDocumentType() { if (!this.#workspaceContext) return; this.observe( this.#workspaceContext.variesByCulture, @@ -37,13 +48,52 @@ export class UmbDocumentTypeWorkspaceViewSettingsElement extends UmbLitElement i (variesBySegment) => (this._variesBySegment = variesBySegment), ); this.observe(this.#workspaceContext.isElement, (isElement) => (this._isElement = isElement)); + + this.observe(this.#workspaceContext.cleanup, (cleanup) => { + this._preventCleanup = cleanup?.preventCleanup; + this._keepAllVersionsNewerThanDays = cleanup?.keepAllVersionsNewerThanDays; + this._keepLatestVersionPerDayForDays = cleanup?.keepLatestVersionPerDayForDays; + }); + } + + #setCleanup() { + this.#workspaceContext?.setCleanup({ + preventCleanup: this._preventCleanup ?? false, + keepAllVersionsNewerThanDays: this._keepAllVersionsNewerThanDays, + keepLatestVersionPerDayForDays: this._keepLatestVersionPerDayForDays, + }); + } + + #onChangePreventCleanup(event: UUIBooleanInputEvent) { + this._preventCleanup = event.target.checked; + if (this._preventCleanup) { + this._keepAllVersionsNewerThanDays = null; + this._keepLatestVersionPerDayForDays = null; + } + this.#setCleanup(); + } + + #onChangeKeepAllVersionsNewerThanDays(event: Event & { target: HTMLInputElement }) { + this._keepAllVersionsNewerThanDays = parseInt(event.target.value); + this.#setCleanup(); + } + + #onChangeKeepLatestVersionPerDayForDays(event: Event & { target: HTMLInputElement }) { + this._keepLatestVersionPerDayForDays = parseInt(event.target.value); + this.#setCleanup(); } render() { return html` - -
Allow editors to create content of different languages.
+ +
+ Allow editors to create content of different languages. +
- -
Allow editors to segment their content.
+ +
+ Allow editors to segment their content. +
- +
- An Element Type is used for content instances in Property Editors, like the Block Editors. + An Element Type is used for content instances in Property Editors, like the Block Editors.
{ this.#workspaceContext?.setIsElement((e.target as UUIToggleElement).checked); }} - label="Element type"> + label=${this.localize.term('contentTypeEditor_elementType')}>
- +
- Allow overriding the global history cleanup settings. (TODO: this ui is not working.. ) + Allow overriding the global history cleanup settings.
- - - Keep all versions newer than X days - - Keep latest version per day for X days - + + + + + ${when( + !this._preventCleanup, + () => html` + + + Keep all versions newer than days + + + + + + + + Keep latest version per day for days + + + + `, + )}
From 81f8b3fa5bff7205c6a8cfba9172d329807b0d2b Mon Sep 17 00:00:00 2001 From: leekelleher Date: Mon, 27 May 2024 00:14:43 +0100 Subject: [PATCH 20/20] Bugfix: Public Access, corrected Member Group picker Fixes: https://github.com/umbraco/Umbraco-CMS/issues/16259 --- .../modal/public-access-modal.element.ts | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.element.ts index 7a450b9714..c20e44ccca 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/documents/documents/entity-actions/public-access/modal/public-access-modal.element.ts @@ -2,13 +2,13 @@ import { UmbDocumentPublicAccessRepository } from '../repository/public-access.r import { UmbDocumentDetailRepository } from '../../../repository/index.js'; import type { UmbInputDocumentElement } from '../../../components/index.js'; import type { UmbPublicAccessModalData, UmbPublicAccessModalValue } from './public-access-modal.token.js'; -import { html, customElement, state, css, nothing } from '@umbraco-cms/backoffice/external/lit'; -import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; +import { css, customElement, html, nothing, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; -import type { UUIRadioEvent } from '@umbraco-cms/backoffice/external/uui'; -import type { PublicAccessRequestModel } from '@umbraco-cms/backoffice/external/backend-api'; -import type { UmbInputMemberTypeElement } from '@umbraco-cms/backoffice/member-type'; +import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import type { UmbInputMemberElement } from '@umbraco-cms/backoffice/member'; +import type { UmbInputMemberGroupElement } from '@umbraco-cms/backoffice/member-group'; +import type { PublicAccessRequestModel } from '@umbraco-cms/backoffice/external/backend-api'; +import type { UUIRadioEvent } from '@umbraco-cms/backoffice/external/uui'; @customElement('umb-public-access-modal') export class UmbPublicAccessModalElement extends UmbModalBaseElement< @@ -133,7 +133,7 @@ export class UmbPublicAccessModalElement extends UmbModalBaseElement< } #onChangeGroup(e: CustomEvent) { - this._selection = (e.target as UmbInputMemberTypeElement).selection; + this._selection = (e.target as UmbInputMemberGroupElement).selection; } #onChangeMember(e: CustomEvent) { @@ -205,7 +205,9 @@ export class UmbPublicAccessModalElement extends UmbModalBaseElement< : html` Select the groups who have access to the page ${this._documentName} - `; + `; } // Action buttons