From 45ff3c3a6fab4b2588780ea2553579c645e025f0 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 25 Mar 2025 21:42:29 +0100 Subject: [PATCH] wip loading segment data --- src/Umbraco.Web.UI.Client/package.json | 1 + .../content-detail-workspace-base.ts | 6 ++- ...ace-split-view-variant-selector.element.ts | 1 + .../packages/segment/collection/constants.ts | 1 + .../src/packages/segment/collection/index.ts | 1 + .../packages/segment/collection/manifests.ts | 3 ++ .../collection/repository/constants.ts | 1 + .../segment/collection/repository/index.ts | 2 + .../collection/repository/manifests.ts | 10 +++++ .../segment-collection.repository.ts | 21 +++++++++ .../segment-collection.server.data-source.ts | 43 +++++++++++++++++++ .../segment/collection/repository/types.ts | 13 ++++++ .../src/packages/segment/collection/types.ts | 4 ++ .../src/packages/segment/constants.ts | 5 +++ .../src/packages/segment/entity.ts | 2 + .../src/packages/segment/index.ts | 4 ++ .../src/packages/segment/manifests.ts | 3 ++ .../src/packages/segment/types.ts | 10 +++++ .../src/packages/segment/umbraco-package.ts | 9 ++++ .../src/packages/segment/vite.config.ts | 12 ++++++ src/Umbraco.Web.UI.Client/tsconfig.json | 1 + 21 files changed, 152 insertions(+), 1 deletion(-) create mode 100644 src/Umbraco.Web.UI.Client/src/packages/segment/collection/constants.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/segment/collection/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/segment/collection/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/segment/collection/repository/constants.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/segment/collection/repository/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/segment/collection/repository/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/segment/collection/repository/segment-collection.repository.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/segment/collection/repository/segment-collection.server.data-source.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/segment/collection/repository/types.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/segment/collection/types.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/segment/constants.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/segment/entity.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/segment/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/segment/manifests.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/segment/types.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/segment/umbraco-package.ts create mode 100644 src/Umbraco.Web.UI.Client/src/packages/segment/vite.config.ts diff --git a/src/Umbraco.Web.UI.Client/package.json b/src/Umbraco.Web.UI.Client/package.json index f17919f040..2cd40b5a1b 100644 --- a/src/Umbraco.Web.UI.Client/package.json +++ b/src/Umbraco.Web.UI.Client/package.json @@ -88,6 +88,7 @@ "./script": "./dist-cms/packages/templating/scripts/index.js", "./search": "./dist-cms/packages/search/index.js", "./section": "./dist-cms/packages/core/section/index.js", + "./segment": "./dist-cms/packages/core/segment/index.js", "./server-file-system": "./dist-cms/packages/core/server-file-system/index.js", "./settings": "./dist-cms/packages/settings/index.js", "./sorter": "./dist-cms/packages/core/sorter/index.js", diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/content/workspace/content-detail-workspace-base.ts b/src/Umbraco.Web.UI.Client/src/packages/core/content/workspace/content-detail-workspace-base.ts index 28760926dd..5eb1abdb63 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/content/workspace/content-detail-workspace-base.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/content/workspace/content-detail-workspace-base.ts @@ -5,6 +5,7 @@ import type { UmbContentVariantPickerData, UmbContentVariantPickerValue } from ' import type { UmbContentPropertyDatasetContext } from '../property-dataset-context/index.js'; import type { UmbContentValidationRepository } from '../repository/content-validation-repository.interface.js'; import type { UmbContentWorkspaceContext } from './content-workspace-context.interface.js'; +import { UmbContentDetailValidationPathTranslator } from './content-detail-validation-path-translator.js'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import type { UmbDetailRepository, UmbDetailRepositoryConstructor } from '@umbraco-cms/backoffice/repository'; import { @@ -51,7 +52,7 @@ import { type UmbPropertyTypePresetModel, type UmbPropertyTypePresetModelTypeModel, } from '@umbraco-cms/backoffice/property'; -import { UmbContentDetailValidationPathTranslator } from './content-detail-validation-path-translator.js'; +import { UmbSegmentCollectionRepository, type UmbSegmentCollectionItemModel } from '@umbraco-cms/backoffice/segment'; export interface UmbContentDetailWorkspaceContextArgs< DetailModelType extends UmbContentDetailModel, @@ -140,6 +141,9 @@ export abstract class UmbContentDetailWorkspaceContextBase< */ public readonly languages = this.#languages.asObservable(); + #segmentRepository = new UmbSegmentCollectionRepository(this); + #segments = new UmbArrayState([], (x) => x.unique); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore // TODO: fix type error diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-split-view/workspace-split-view-variant-selector.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-split-view/workspace-split-view-variant-selector.element.ts index bd835d1734..541b839f0f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-split-view/workspace-split-view-variant-selector.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/workspace/components/workspace-split-view/workspace-split-view-variant-selector.element.ts @@ -82,6 +82,7 @@ export class UmbWorkspaceSplitViewVariantSelectorElement< workspaceContext.variantOptions, (variantOptions) => { this._variantOptions = (variantOptions as Array).sort(this._variantSorter); + debugger; this.#setReadOnlyCultures(); }, '_observeVariantOptions', diff --git a/src/Umbraco.Web.UI.Client/src/packages/segment/collection/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/segment/collection/constants.ts new file mode 100644 index 0000000000..41a409dec1 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/segment/collection/constants.ts @@ -0,0 +1 @@ +export * from './repository/constants.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/segment/collection/index.ts b/src/Umbraco.Web.UI.Client/src/packages/segment/collection/index.ts new file mode 100644 index 0000000000..4ca3dbc38d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/segment/collection/index.ts @@ -0,0 +1 @@ +export { UmbSegmentCollectionRepository } from './repository/index.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/segment/collection/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/segment/collection/manifests.ts new file mode 100644 index 0000000000..aaa15113ec --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/segment/collection/manifests.ts @@ -0,0 +1,3 @@ +import { manifests as collectionRepositoryManifests } from './repository/manifests.js'; + +export const manifests: Array = [...collectionRepositoryManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/segment/collection/repository/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/segment/collection/repository/constants.ts new file mode 100644 index 0000000000..e87bf9eb8e --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/segment/collection/repository/constants.ts @@ -0,0 +1 @@ +export const UMB_SEGMENT_COLLECTION_REPOSITORY_ALIAS = 'Umb.Repository.SegmentCollection'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/segment/collection/repository/index.ts b/src/Umbraco.Web.UI.Client/src/packages/segment/collection/repository/index.ts new file mode 100644 index 0000000000..75a6f64007 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/segment/collection/repository/index.ts @@ -0,0 +1,2 @@ +export { UMB_SEGMENT_COLLECTION_REPOSITORY_ALIAS } from './constants.js'; +export { UmbSegmentCollectionRepository } from './segment-collection.repository.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/segment/collection/repository/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/segment/collection/repository/manifests.ts new file mode 100644 index 0000000000..5430cfed7c --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/segment/collection/repository/manifests.ts @@ -0,0 +1,10 @@ +import { UMB_SEGMENT_COLLECTION_REPOSITORY_ALIAS } from './constants.js'; + +export const manifests: Array = [ + { + type: 'repository', + alias: UMB_SEGMENT_COLLECTION_REPOSITORY_ALIAS, + name: 'Segment Collection Repository', + api: () => import('./segment-collection.repository.js'), + }, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/segment/collection/repository/segment-collection.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/segment/collection/repository/segment-collection.repository.ts new file mode 100644 index 0000000000..9427780035 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/segment/collection/repository/segment-collection.repository.ts @@ -0,0 +1,21 @@ +import type { UmbSegmentCollectionFilterModel } from '../types.js'; +import { UmbSegmentCollectionServerDataSource } from './segment-collection.server.data-source.js'; +import type { UmbSegmentCollectionDataSource } from './types.js'; +import { UmbRepositoryBase } from '@umbraco-cms/backoffice/repository'; +import type { UmbCollectionRepository } from '@umbraco-cms/backoffice/collection'; +import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; + +export class UmbSegmentCollectionRepository extends UmbRepositoryBase implements UmbCollectionRepository { + #collectionSource: UmbSegmentCollectionDataSource; + + constructor(host: UmbControllerHost) { + super(host); + this.#collectionSource = new UmbSegmentCollectionServerDataSource(host); + } + + async requestCollection(filter: UmbSegmentCollectionFilterModel) { + return this.#collectionSource.getCollection(filter); + } +} + +export default UmbSegmentCollectionRepository; diff --git a/src/Umbraco.Web.UI.Client/src/packages/segment/collection/repository/segment-collection.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/segment/collection/repository/segment-collection.server.data-source.ts new file mode 100644 index 0000000000..296b1e87af --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/segment/collection/repository/segment-collection.server.data-source.ts @@ -0,0 +1,43 @@ +import type { UmbSegmentCollectionFilterModel } from '../types.js'; +import { UMB_SEGMENT_ENTITY_TYPE } from '../../entity.js'; +import type { UmbSegmentCollectionItemModel } from './types.js'; +import type { UmbCollectionDataSource } from '@umbraco-cms/backoffice/collection'; +import { SegmentService } from '@umbraco-cms/backoffice/external/backend-api'; +import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; +import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api'; + +/** + * A data source that fetches the language collection data from the server. + * @class UmbLanguageCollectionServerDataSource + * @implements {UmbCollectionDataSource} + */ +export class UmbSegmentCollectionServerDataSource + extends UmbControllerBase + implements UmbCollectionDataSource +{ + /** + * Gets the language collection filtered by the given filter. + * @param {UmbSegmentCollectionFilterModel} filter + * @returns {*} + * @memberof UmbLanguageCollectionServerDataSource + */ + async getCollection(filter: UmbSegmentCollectionFilterModel) { + const { data, error } = await tryExecuteAndNotify(this, SegmentService.getSegment(filter)); + + if (data) { + const items = data.items.map((item) => { + const model: UmbSegmentCollectionItemModel = { + entityType: UMB_SEGMENT_ENTITY_TYPE, + unique: item.alias, + alias: item.alias, + }; + + return model; + }); + + return { data: { items, total: data.total } }; + } + + return { error }; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/segment/collection/repository/types.ts b/src/Umbraco.Web.UI.Client/src/packages/segment/collection/repository/types.ts new file mode 100644 index 0000000000..d81532bf6b --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/segment/collection/repository/types.ts @@ -0,0 +1,13 @@ +import type { UmbSegmentCollectionFilterModel } from '../types.js'; +import type { UmbCollectionDataSource } from '@umbraco-cms/backoffice/collection'; + +export type UmbSegmentCollectionDataSource = UmbCollectionDataSource< + UmbSegmentCollectionItemModel, + UmbSegmentCollectionFilterModel +>; + +export interface UmbSegmentCollectionItemModel { + entityType: string; + unique: string; + alias: string; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/segment/collection/types.ts b/src/Umbraco.Web.UI.Client/src/packages/segment/collection/types.ts new file mode 100644 index 0000000000..77e12f5bf0 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/segment/collection/types.ts @@ -0,0 +1,4 @@ +export interface UmbSegmentCollectionFilterModel { + skip?: number; + take?: number; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/segment/constants.ts b/src/Umbraco.Web.UI.Client/src/packages/segment/constants.ts new file mode 100644 index 0000000000..9880c19421 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/segment/constants.ts @@ -0,0 +1,5 @@ +export * from './repository/constants.js'; + +export { UMB_SEGMENT_ENTITY_TYPE as UMB_LANGUAGE_ENTITY_TYPE, UMB_LANGUAGE_ROOT_ENTITY_TYPE } from './entity.js'; +export { UMB_APP_LANGUAGE_CONTEXT } from './global-contexts/app-language.context-token.js'; +export { UMB_LANGUAGE_ACCESS_WORKSPACE_CONTEXT } from './permissions/language-access.workspace.context-token.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/segment/entity.ts b/src/Umbraco.Web.UI.Client/src/packages/segment/entity.ts new file mode 100644 index 0000000000..3179ff216d --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/segment/entity.ts @@ -0,0 +1,2 @@ +export const UMB_SEGMENT_ENTITY_TYPE = 'segment'; +export type UmbSegmentEntityType = typeof UMB_SEGMENT_ENTITY_TYPE; diff --git a/src/Umbraco.Web.UI.Client/src/packages/segment/index.ts b/src/Umbraco.Web.UI.Client/src/packages/segment/index.ts new file mode 100644 index 0000000000..4c28e6c8da --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/segment/index.ts @@ -0,0 +1,4 @@ +export * from './constants.js'; +export * from './repository/index.js'; + +export type * from './types.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/segment/manifests.ts b/src/Umbraco.Web.UI.Client/src/packages/segment/manifests.ts new file mode 100644 index 0000000000..4ac6fbdcb2 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/segment/manifests.ts @@ -0,0 +1,3 @@ +import { manifests as repositoryManifests } from './repository/manifests.js'; + +export const manifests: Array = [...repositoryManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/segment/types.ts b/src/Umbraco.Web.UI.Client/src/packages/segment/types.ts new file mode 100644 index 0000000000..ad3ebe7ec6 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/segment/types.ts @@ -0,0 +1,10 @@ +import type { UmbSegmentEntityType } from './entity.js'; + +export type { UmbSegmentEntityType } from './entity.js'; +export type * from './repository/types.js'; + +export interface UmbSegmentDetailModel { + entityType: UmbSegmentEntityType; + unique: string; + alias: string; +} diff --git a/src/Umbraco.Web.UI.Client/src/packages/segment/umbraco-package.ts b/src/Umbraco.Web.UI.Client/src/packages/segment/umbraco-package.ts new file mode 100644 index 0000000000..61b82e22f4 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/segment/umbraco-package.ts @@ -0,0 +1,9 @@ +export const name = 'Umbraco.Core.Segment'; +export const extensions = [ + { + name: 'Segment Bundle', + alias: 'Umb.Bundle.Segment', + type: 'bundle', + js: () => import('./manifests.js'), + }, +]; diff --git a/src/Umbraco.Web.UI.Client/src/packages/segment/vite.config.ts b/src/Umbraco.Web.UI.Client/src/packages/segment/vite.config.ts new file mode 100644 index 0000000000..b1b9a38a3a --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/packages/segment/vite.config.ts @@ -0,0 +1,12 @@ +import { defineConfig } from 'vite'; +import { rmSync } from 'fs'; +import { getDefaultConfig } from '../../vite-config-base'; + +const dist = '../../../dist-cms/packages/segment'; + +// delete the unbundled dist folder +rmSync(dist, { recursive: true, force: true }); + +export default defineConfig({ + ...getDefaultConfig({ dist }), +}); diff --git a/src/Umbraco.Web.UI.Client/tsconfig.json b/src/Umbraco.Web.UI.Client/tsconfig.json index 9d85ebd8e6..a25f7dda63 100644 --- a/src/Umbraco.Web.UI.Client/tsconfig.json +++ b/src/Umbraco.Web.UI.Client/tsconfig.json @@ -117,6 +117,7 @@ DON'T EDIT THIS FILE DIRECTLY. It is generated by /devops/tsconfig/index.js "@umbraco-cms/backoffice/script": ["./src/packages/templating/scripts/index.ts"], "@umbraco-cms/backoffice/search": ["./src/packages/search/index.ts"], "@umbraco-cms/backoffice/section": ["./src/packages/core/section/index.ts"], + "@umbraco-cms/backoffice/segment": ["./src/packages/core/segment/index.ts"], "@umbraco-cms/backoffice/server-file-system": ["./src/packages/core/server-file-system/index.ts"], "@umbraco-cms/backoffice/settings": ["./src/packages/settings/index.ts"], "@umbraco-cms/backoffice/sorter": ["./src/packages/core/sorter/index.ts"],