{"version":3,"file":"index.js","sources":["../../../../src/packages/core/workspace/components/workspace-action-menu-item/workspace-action-menu-item-base.controller.ts","../../../../src/packages/core/workspace/components/workspace-action/workspace-action-base.controller.ts","../../../../src/packages/core/workspace/components/workspace-action/common/submit/submit.action.ts","../../../../src/packages/core/workspace/controllers/workspace-route-manager.controller.ts","../../../../src/packages/core/workspace/submittable/submittable-workspace-context-base.ts","../../../../src/packages/core/workspace/entity/entity-workspace-data-manager.ts","../../../../src/packages/core/workspace/entity-detail/entity-detail-workspace-base.ts","../../../../src/packages/core/workspace/entity-detail/entity-named-detail-workspace-base.ts","../../../../src/packages/core/workspace/controllers/workspace-is-new-redirect.controller.ts","../../../../src/packages/core/workspace/controllers/workspace-split-view-manager.controller.ts","../../../../src/packages/core/workspace/utils/object-to-property-value-array.function.ts","../../../../src/packages/core/workspace/workspace-property-dataset/invariant-workspace-property-dataset-context.ts"],"sourcesContent":["import type { UmbWorkspaceActionMenuItemArgs } from './types.js';\r\nimport type { UmbWorkspaceActionMenuItem } from './workspace-action-menu-item.interface.js';\r\nimport { UmbActionBase } from '@umbraco-cms/backoffice/action';\r\n\r\n/**\r\n * Base class for an workspace action.\r\n * @abstract\r\n * @class UmbWorkspaceActionMenuItemBase\r\n * @augments {UmbActionBase}\r\n * @implements {UmbWorkspaceActionMenuItem}\r\n * @template RepositoryType\r\n */\r\nexport abstract class UmbWorkspaceActionMenuItemBase\r\n\textends UmbActionBase>\r\n\timplements UmbWorkspaceActionMenuItem\r\n{\r\n\t/**\r\n\t * By specifying the href, the action will act as a link.\r\n\t * The `execute` method will not be called.\r\n\t * @abstract\r\n\t * @returns {string | undefined}\r\n\t */\r\n\tpublic getHref(): Promise {\r\n\t\treturn Promise.resolve(undefined);\r\n\t}\r\n\r\n\t/**\r\n\t * By specifying the `execute` method, the action will act as a button.\r\n\t * @abstract\r\n\t * @returns {Promise}\r\n\t */\r\n\tpublic execute(): Promise {\r\n\t\treturn Promise.resolve();\r\n\t}\r\n}\r\n","import type { UmbWorkspaceActionArgs } from './types.js';\r\nimport type { UmbWorkspaceAction } from './workspace-action.interface.js';\r\nimport { UmbBooleanState } from '@umbraco-cms/backoffice/observable-api';\r\nimport { UmbActionBase } from '@umbraco-cms/backoffice/action';\r\n\r\n/**\r\n * Base class for an workspace action.\r\n * @abstract\r\n * @class UmbWorkspaceActionBase\r\n * @augments {UmbActionBase}\r\n * @implements {UmbEntityAction}\r\n * @template RepositoryType\r\n */\r\nexport abstract class UmbWorkspaceActionBase\r\n\textends UmbActionBase>\r\n\timplements UmbWorkspaceAction\r\n{\r\n\tprotected _isDisabled = new UmbBooleanState(false);\r\n\tpublic isDisabled = this._isDisabled.asObservable();\r\n\r\n\t/**\r\n\t * By specifying the href, the action will act as a link.\r\n\t * The `execute` method will not be called.\r\n\t * @abstract\r\n\t * @returns {string | undefined}\r\n\t */\r\n\tpublic getHref(): Promise {\r\n\t\treturn Promise.resolve(undefined);\r\n\t}\r\n\r\n\t/**\r\n\t * By specifying the `execute` method, the action will act as a button.\r\n\t * @abstract\r\n\t * @returns {Promise}\r\n\t */\r\n\tpublic execute(): Promise {\r\n\t\treturn Promise.resolve();\r\n\t}\r\n\r\n\t/**\r\n\t * Disables the action.\r\n\t * @memberof UmbWorkspaceActionBase\r\n\t */\r\n\tpublic disable(): void {\r\n\t\tthis._isDisabled.setValue(true);\r\n\t}\r\n\r\n\t/**\r\n\t * Enables the action.\r\n\t * @memberof UmbWorkspaceActionBase\r\n\t */\r\n\tpublic enable(): void {\r\n\t\tthis._isDisabled.setValue(false);\r\n\t}\r\n}\r\n","import { UMB_SUBMITTABLE_WORKSPACE_CONTEXT } from '../../../../contexts/tokens/index.js';\r\nimport type { UmbSubmittableWorkspaceContext } from '../../../../contexts/tokens/index.js';\r\nimport type { UmbWorkspaceActionArgs } from '../../types.js';\r\nimport { UmbWorkspaceActionBase } from '../../workspace-action-base.controller.js';\r\nimport type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';\r\n\r\nexport class UmbSubmitWorkspaceAction extends UmbWorkspaceActionBase {\r\n\t#workspaceContext?: UmbSubmittableWorkspaceContext;\r\n\r\n\tconstructor(host: UmbControllerHost, args: UmbWorkspaceActionArgs) {\r\n\t\tsuper(host, args);\r\n\r\n\t\t// TODO: Could we make change label depending on the state?\r\n\t\tthis.consumeContext(UMB_SUBMITTABLE_WORKSPACE_CONTEXT, (context) => {\r\n\t\t\tthis.#workspaceContext = context;\r\n\t\t\tthis.#observeUnique();\r\n\t\t});\r\n\t}\r\n\r\n\t#observeUnique() {\r\n\t\tthis.observe(\r\n\t\t\tthis.#workspaceContext?.unique,\r\n\t\t\t(unique) => {\r\n\t\t\t\t// We can't save if we don't have a unique\r\n\t\t\t\tif (unique === undefined) {\r\n\t\t\t\t\tthis.disable();\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis.enable();\r\n\t\t\t\t}\r\n\t\t\t},\r\n\t\t\t'saveWorkspaceActionUniqueObserver',\r\n\t\t);\r\n\t}\r\n\r\n\toverride async execute() {\r\n\t\tconst workspaceContext = await this.getContext(UMB_SUBMITTABLE_WORKSPACE_CONTEXT);\r\n\t\treturn await workspaceContext.requestSubmit();\r\n\t}\r\n}\r\n\r\n/*\r\n * @deprecated Use UmbSubmitWorkspaceAction instead\r\n */\r\nexport { UmbSubmitWorkspaceAction as UmbSaveWorkspaceAction };\r\n","import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api';\r\nimport { UmbArrayState, UmbStringState } from '@umbraco-cms/backoffice/observable-api';\r\nimport type { IComponentRoute, UmbRoute } from '@umbraco-cms/backoffice/router';\r\n\r\n/**\r\n * The workspace route manager.\r\n * @class UmbWorkspaceRouteManager\r\n * @augments {UmbControllerBase}\r\n */\r\nexport class UmbWorkspaceRouteManager extends UmbControllerBase {\r\n\t//\r\n\t#routes = new UmbArrayState([], (x) => x.path);\r\n\tpublic readonly routes = this.#routes.asObservable();\r\n\r\n\t#activeLocalPath = new UmbStringState('');\r\n\r\n\t/**\r\n\t * Set the routes for the workspace.\r\n\t * @param {Array} routes The routes for the workspace.\r\n\t * @memberof UmbWorkspaceRouteManager\r\n\t */\r\n\tsetRoutes(routes: Array) {\r\n\t\tconst allRoutes = [\r\n\t\t\t...routes,\r\n\t\t\t{\r\n\t\t\t\tpath: `**`,\r\n\t\t\t\tcomponent: async () => (await import('@umbraco-cms/backoffice/router')).UmbRouteNotFoundElement,\r\n\t\t\t},\r\n\t\t] as Array;\r\n\r\n\t\tconst mappedRoutes = allRoutes.map((route) => {\r\n\t\t\t// override the setup method to set the active local path\r\n\t\t\tconst oldSetupCallback = route.setup;\r\n\r\n\t\t\troute.setup = (_component: any, info: any) => {\r\n\t\t\t\tthis.#activeLocalPath.setValue(info.match.fragments.consumed);\r\n\r\n\t\t\t\tif (oldSetupCallback) {\r\n\t\t\t\t\toldSetupCallback(_component, info);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\r\n\t\t\treturn route;\r\n\t\t});\r\n\r\n\t\tthis.#routes.setValue([...mappedRoutes]);\r\n\t}\r\n\r\n\t/**\r\n\t * Get the routes for the workspace.\r\n\t * @returns {Array} The routes for the workspace.\r\n\t * @memberof UmbWorkspaceRouteManager\r\n\t */\r\n\tgetRoutes(): Array {\r\n\t\treturn this.#routes.getValue();\r\n\t}\r\n\r\n\t/**\r\n\t * Get the active local path.\r\n\t * @returns {*} {string}\r\n\t * @memberof UmbWorkspaceRouteManager\r\n\t */\r\n\tgetActiveLocalPath(): string {\r\n\t\treturn this.#activeLocalPath.getValue();\r\n\t}\r\n}\r\n","import { UmbWorkspaceRouteManager } from '../controllers/workspace-route-manager.controller.js';\r\nimport { UMB_WORKSPACE_CONTEXT } from '../workspace.context-token.js';\r\nimport type { UmbSubmittableWorkspaceContext } from '../contexts/tokens/submittable-workspace-context.interface.js';\r\nimport type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';\r\nimport { UmbContextBase } from '@umbraco-cms/backoffice/class-api';\r\nimport { UmbBooleanState } from '@umbraco-cms/backoffice/observable-api';\r\nimport type { UmbModalContext } from '@umbraco-cms/backoffice/modal';\r\nimport { UMB_MODAL_CONTEXT } from '@umbraco-cms/backoffice/modal';\r\nimport type { Observable } from '@umbraco-cms/backoffice/external/rxjs';\r\nimport type { UmbValidationController } from '@umbraco-cms/backoffice/validation';\r\n\r\nexport abstract class UmbSubmittableWorkspaceContextBase\r\n\textends UmbContextBase>\r\n\timplements UmbSubmittableWorkspaceContext\r\n{\r\n\tpublic readonly workspaceAlias: string;\r\n\r\n\t// TODO: We could make a base type for workspace modal data, and use this here: As well as a base for the result, to make sure we always include the unique (instead of the object type)\r\n\tpublic readonly modalContext?: UmbModalContext<{ preset: object }>;\r\n\r\n\t#validationContexts: Array = [];\r\n\r\n\t/**\r\n\t * Appends a validation context to the workspace.\r\n\t * @param context\r\n\t */\r\n\taddValidationContext(context: UmbValidationController) {\r\n\t\tthis.#validationContexts.push(context);\r\n\t}\r\n\r\n\t#submitPromise: Promise | undefined;\r\n\t#submitResolve: (() => void) | undefined;\r\n\t#submitReject: (() => void) | undefined;\r\n\r\n\tabstract readonly unique: Observable;\r\n\r\n\t#isNew = new UmbBooleanState(undefined);\r\n\tisNew = this.#isNew.asObservable();\r\n\r\n\treadonly routes = new UmbWorkspaceRouteManager(this);\r\n\r\n\t/*\r\n\t\tConcept notes: [NL]\r\n\t\tConsiderations are, if we bring a dirty state (observable) we need to maintain it all the time.\r\n\t\tThis might be too heavy process, so we might want to consider just having a get dirty state method.\r\n\t*/\r\n\t//#isDirty = new UmbBooleanState(undefined);\r\n\t//isDirty = this.#isNew.asObservable();\r\n\r\n\tconstructor(host: UmbControllerHost, workspaceAlias: string) {\r\n\t\tsuper(host, UMB_WORKSPACE_CONTEXT.toString());\r\n\t\tthis.workspaceAlias = workspaceAlias;\r\n\t\t// TODO: Consider if we can move this consumption to #resolveSubmit, just as a getContext, but it depends if others use the modalContext prop.. [NL]\r\n\t\tthis.consumeContext(UMB_MODAL_CONTEXT, (context) => {\r\n\t\t\t(this.modalContext as UmbModalContext) = context;\r\n\t\t});\r\n\t}\r\n\r\n\tprotected resetState() {\r\n\t\t//this.validation.reset();\r\n\t\tthis.#validationContexts.forEach((context) => context.reset());\r\n\t\tthis.#isNew.setValue(undefined);\r\n\t}\r\n\r\n\tpublic getIsNew() {\r\n\t\treturn this.#isNew.getValue();\r\n\t}\r\n\r\n\tprotected setIsNew(isNew: boolean) {\r\n\t\tthis.#isNew.setValue(isNew);\r\n\t}\r\n\r\n\t/**\r\n\t * If a Workspace has multiple validation contexts, then this method can be overwritten to return the correct one.\r\n\t * @returns Promise that resolves to void when the validation is complete.\r\n\t */\r\n\tpublic async validate(): Promise> {\r\n\t\t//return this.validation.validate();\r\n\t\treturn Promise.all(this.#validationContexts.map((context) => context.validate()));\r\n\t}\r\n\r\n\tpublic async requestSubmit(): Promise {\r\n\t\treturn this.validateAndSubmit(\r\n\t\t\t() => this.submit(),\r\n\t\t\t() => this.invalidSubmit(),\r\n\t\t);\r\n\t}\r\n\r\n\tpublic async validateAndSubmit(onValid: () => Promise, onInvalid: () => Promise): Promise {\r\n\t\tif (this.#submitPromise) {\r\n\t\t\treturn this.#submitPromise;\r\n\t\t}\r\n\t\tthis.#submitPromise = new Promise((resolve, reject) => {\r\n\t\t\tthis.#submitResolve = resolve;\r\n\t\t\tthis.#submitReject = reject;\r\n\t\t});\r\n\t\tthis.validate().then(\r\n\t\t\tasync () => {\r\n\t\t\t\tonValid().then(this.#completeSubmit, this.#rejectSubmit);\r\n\t\t\t},\r\n\t\t\tasync () => {\r\n\t\t\t\tonInvalid().then(this.#resolveSubmit, this.#rejectSubmit);\r\n\t\t\t},\r\n\t\t);\r\n\r\n\t\treturn this.#submitPromise;\r\n\t}\r\n\r\n\t#rejectSubmit = () => {\r\n\t\tif (this.#submitPromise) {\r\n\t\t\t// TODO: Capture the validation contexts messages on open, and then reset to them in this case. [NL]\r\n\r\n\t\t\tthis.#submitReject?.();\r\n\t\t\tthis.#submitPromise = undefined;\r\n\t\t\tthis.#submitResolve = undefined;\r\n\t\t\tthis.#submitReject = undefined;\r\n\t\t}\r\n\t};\r\n\r\n\t#resolveSubmit = () => {\r\n\t\t// Resolve the submit promise:\r\n\t\tthis.#submitResolve?.();\r\n\t\tthis.#submitPromise = undefined;\r\n\t\tthis.#submitResolve = undefined;\r\n\t\tthis.#submitReject = undefined;\r\n\t};\r\n\r\n\t#completeSubmit = () => {\r\n\t\tthis.#resolveSubmit();\r\n\r\n\t\t// Calling reset on the validation context here. [NL]\r\n\t\t// TODO: Capture the validation messages on open, and then reset to that.\r\n\t\t//this.validation.reset();\r\n\r\n\t\tthis._closeModal();\r\n\t};\r\n\r\n\tprotected _closeModal() {\r\n\t\tif (this.modalContext) {\r\n\t\t\tthis.modalContext?.setValue(this.getData());\r\n\t\t\tthis.modalContext?.submit();\r\n\t\t}\r\n\t}\r\n\r\n\t//abstract getIsDirty(): Promise;\r\n\tabstract getUnique(): string | null | undefined;\r\n\tabstract getEntityType(): string;\r\n\tabstract getData(): WorkspaceDataModelType | undefined;\r\n\tprotected abstract submit(): Promise;\r\n\tprotected invalidSubmit(): Promise {\r\n\t\treturn Promise.reject();\r\n\t}\r\n}\r\n\r\n/*\r\n * @deprecated Use UmbSubmittableWorkspaceContextBase instead — Will be removed before RC.\r\n * Rename `save` to `submit` and return a promise that resolves to true when save is complete.\r\n * TODO: Delete before RC.\r\n */\r\nexport abstract class UmbEditableWorkspaceContextBase<\r\n\tWorkspaceDataModelType,\r\n> extends UmbSubmittableWorkspaceContextBase {}\r\n","import type { UmbWorkspaceDataManager } from '../data-manager/workspace-data-manager.interface.js';\r\nimport { jsonStringComparison, UmbObjectState, type MappingFunction } from '@umbraco-cms/backoffice/observable-api';\r\nimport { UmbControllerBase } from '@umbraco-cms/backoffice/class-api';\r\n\r\n/**\r\n * Manages the workspace data for an entity.\r\n * @class UmbEntityWorkspaceDataManager\r\n * @augments {UmbControllerBase}\r\n * @implements {UmbWorkspaceDataManager}\r\n * @template ModelType\r\n */\r\nexport class UmbEntityWorkspaceDataManager\r\n\textends UmbControllerBase\r\n\timplements UmbWorkspaceDataManager\r\n{\r\n\tprotected readonly _persisted = new UmbObjectState(undefined);\r\n\tprotected readonly _current = new UmbObjectState(undefined);\r\n\r\n\t/**\r\n\t * Observable of the persisted data\r\n\t * @memberof UmbEntityWorkspaceDataManager\r\n\t */\r\n\tpublic readonly persisted = this._persisted.asObservable();\r\n\r\n\t/**\r\n\t * Observable of the current data\r\n\t * @memberof UmbEntityWorkspaceDataManager\r\n\t */\r\n\tpublic readonly current = this._current.asObservable();\r\n\r\n\t/**\r\n\t * Gets persisted data\r\n\t * @returns {(ModelType | undefined)}\r\n\t * @memberof UmbSubmittableWorkspaceDataManager\r\n\t */\r\n\tgetPersisted() {\r\n\t\treturn this._persisted.getValue();\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the persisted data\r\n\t * @param {(ModelType | undefined)} data\r\n\t * @memberof UmbSubmittableWorkspaceDataManager\r\n\t */\r\n\tsetPersisted(data: ModelType | undefined) {\r\n\t\tthis._persisted.setValue(data);\r\n\t}\r\n\r\n\t/**\r\n\t * Updates the persisted data\r\n\t * @param {Partial} partialData\r\n\t * @memberof UmbSubmittableWorkspaceDataManager\r\n\t */\r\n\tupdatePersisted(partialData: Partial) {\r\n\t\tthis._persisted.update(partialData);\r\n\t}\r\n\r\n\t/**\r\n\t * Creates an observable part of the persisted data\r\n\t * @template ReturnType\r\n\t * @param {(MappingFunction)} mappingFunction\r\n\t * @returns {*}\r\n\t * @memberof UmbEntityWorkspaceDataManager\r\n\t */\r\n\tcreateObservablePartOfPersisted(mappingFunction: MappingFunction) {\r\n\t\treturn this._persisted.asObservablePart(mappingFunction);\r\n\t}\r\n\r\n\t/**\r\n\t * Gets the current data\r\n\t * @returns {(ModelType | undefined)}\r\n\t * @memberof UmbSubmittableWorkspaceDataManager\r\n\t */\r\n\tgetCurrent() {\r\n\t\treturn this._current.getValue();\r\n\t}\r\n\r\n\t/**\r\n\t * Sets the current data\r\n\t * @param {(ModelType | undefined)} data\r\n\t * @memberof UmbSubmittableWorkspaceDataManager\r\n\t */\r\n\tsetCurrent(data: ModelType | undefined) {\r\n\t\tthis._current.setValue(data);\r\n\t}\r\n\r\n\t/**\r\n\t * Updates the current data\r\n\t * @param {Partial} partialData\r\n\t * @memberof UmbSubmittableWorkspaceDataManager\r\n\t */\r\n\tupdateCurrent(partialData: Partial) {\r\n\t\tthis._current.update(partialData);\r\n\t}\r\n\r\n\t/**\r\n\t * Creates an observable part of the current data\r\n\t * @template ReturnType\r\n\t * @param {(MappingFunction)} mappingFunction\r\n\t * @returns {*}\r\n\t * @memberof UmbEntityWorkspaceDataManager\r\n\t */\r\n\tcreateObservablePartOfCurrent(mappingFunction: MappingFunction) {\r\n\t\treturn this._current.asObservablePart(mappingFunction);\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if there are unpersisted changes\r\n\t * @returns {*}\r\n\t * @memberof UmbSubmittableWorkspaceDataManager\r\n\t */\r\n\tgetHasUnpersistedChanges() {\r\n\t\tconst persisted = this._persisted.getValue();\r\n\t\tconst current = this._current.getValue();\r\n\t\treturn jsonStringComparison(persisted, current) === false;\r\n\t}\r\n\r\n\t/**\r\n\t * Resets the current data to the persisted data\r\n\t * @memberof UmbSubmittableWorkspaceDataManager\r\n\t */\r\n\tresetCurrent() {\r\n\t\tthis._current.setValue(this._persisted.getValue());\r\n\t}\r\n\r\n\t/**\r\n\t * Clears the data\r\n\t * @memberof UmbSubmittableWorkspaceDataManager\r\n\t */\r\n\tclear() {\r\n\t\tthis._persisted.setValue(undefined);\r\n\t\tthis._current.setValue(undefined);\r\n\t}\r\n\r\n\toverride destroy() {\r\n\t\tthis._persisted?.destroy();\r\n\t\tthis._current?.destroy();\r\n\r\n\t\t(this._persisted as any) = undefined;\r\n\t\t(this._current as any) = undefined;\r\n\t\tsuper.destroy();\r\n\t}\r\n}\r\n","import { UmbSubmittableWorkspaceContextBase } from '../submittable/index.js';\r\nimport { UmbEntityWorkspaceDataManager } from '../entity/entity-workspace-data-manager.js';\r\nimport type { UmbEntityDetailWorkspaceContextArgs, UmbEntityDetailWorkspaceContextCreateArgs } from './types.js';\r\nimport { UMB_ACTION_EVENT_CONTEXT } from '@umbraco-cms/backoffice/action';\r\nimport type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';\r\nimport { UmbEntityContext, type UmbEntityModel, type UmbEntityUnique } from '@umbraco-cms/backoffice/entity';\r\nimport { UMB_DISCARD_CHANGES_MODAL, UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal';\r\nimport { UmbObjectState } from '@umbraco-cms/backoffice/observable-api';\r\nimport {\r\n\tUmbRequestReloadChildrenOfEntityEvent,\r\n\tUmbRequestReloadStructureForEntityEvent,\r\n} from '@umbraco-cms/backoffice/entity-action';\r\nimport { UmbExtensionApiInitializer } from '@umbraco-cms/backoffice/extension-api';\r\nimport { umbExtensionsRegistry, type ManifestRepository } from '@umbraco-cms/backoffice/extension-registry';\r\nimport type { UmbDetailRepository } from '@umbraco-cms/backoffice/repository';\r\nimport { UmbStateManager } from '@umbraco-cms/backoffice/utils';\r\nimport { UmbValidationContext } from '@umbraco-cms/backoffice/validation';\r\n\r\nconst LOADING_STATE_UNIQUE = 'umbLoadingEntityDetail';\r\n\r\nexport abstract class UmbEntityDetailWorkspaceContextBase<\r\n\tDetailModelType extends UmbEntityModel = UmbEntityModel,\r\n\tDetailRepositoryType extends UmbDetailRepository = UmbDetailRepository,\r\n\tCreateArgsType extends\r\n\t\tUmbEntityDetailWorkspaceContextCreateArgs = UmbEntityDetailWorkspaceContextCreateArgs,\r\n> extends UmbSubmittableWorkspaceContextBase {\r\n\t// Just for context token safety:\r\n\tpublic readonly IS_ENTITY_DETAIL_WORKSPACE_CONTEXT = true;\r\n\r\n\t/**\r\n\t * @description Data manager for the workspace.\r\n\t * @protected\r\n\t * @memberof UmbEntityWorkspaceContextBase\r\n\t */\r\n\tprotected readonly _data = new UmbEntityWorkspaceDataManager(this);\r\n\r\n\t#entityContext = new UmbEntityContext(this);\r\n\tpublic readonly entityType = this.#entityContext.entityType;\r\n\tpublic readonly unique = this.#entityContext.unique;\r\n\r\n\tpublic readonly data = this._data.current;\r\n\tpublic readonly persistedData = this._data.persisted;\r\n\tpublic readonly loading = new UmbStateManager(this);\r\n\r\n\tprotected _getDataPromise?: Promise;\r\n\tprotected _detailRepository?: DetailRepositoryType;\r\n\r\n\t#parent = new UmbObjectState<{ entityType: string; unique: UmbEntityUnique } | undefined>(undefined);\r\n\tpublic readonly parentUnique = this.#parent.asObservablePart((parent) => (parent ? parent.unique : undefined));\r\n\tpublic readonly parentEntityType = this.#parent.asObservablePart((parent) =>\r\n\t\tparent ? parent.entityType : undefined,\r\n\t);\r\n\r\n\t/**\r\n\t * The base validation context for the workspace. This ensures that at least one validation context is always present.\r\n\t * @example You can manually validate all properties on the context:\r\n\t * ```ts\r\n\t * try {\r\n\t * await this.validationContext.validate();\r\n\t * } catch (error) {\r\n\t * console.error(error);\r\n\t * }\r\n\t * ```\r\n\t * @example You can set the data path on the context to map to a specific part of the server validation:\r\n\t * ```ts\r\n\t * this.validationContext.setDataPath('path.to.data');\r\n\t * ```\r\n\t */\r\n\tprotected validationContext = new UmbValidationContext(this);\r\n\r\n\t#initResolver?: () => void;\r\n\t#initialized = false;\r\n\r\n\t#init = new Promise((resolve) => {\r\n\t\tif (this.#initialized) {\r\n\t\t\tresolve();\r\n\t\t} else {\r\n\t\t\tthis.#initResolver = resolve;\r\n\t\t}\r\n\t});\r\n\r\n\tconstructor(host: UmbControllerHost, args: UmbEntityDetailWorkspaceContextArgs) {\r\n\t\tsuper(host, args.workspaceAlias);\r\n\t\tthis.#entityContext.setEntityType(args.entityType);\r\n\t\twindow.addEventListener('willchangestate', this.#onWillNavigate);\r\n\t\tthis.#observeRepository(args.detailRepositoryAlias);\r\n\t\tthis.addValidationContext(this.validationContext);\r\n\t}\r\n\r\n\t/**\r\n\t * Get the entity type\r\n\t * @returns { string } The entity type\r\n\t */\r\n\tgetEntityType(): string {\r\n\t\tconst entityType = this.#entityContext.getEntityType();\r\n\t\tif (!entityType) throw new Error('Entity type is not set');\r\n\t\treturn entityType;\r\n\t}\r\n\r\n\t/**\r\n\t * Get the current data\r\n\t * @returns { DetailModelType | undefined } The entity context\r\n\t */\r\n\tgetData(): DetailModelType | undefined {\r\n\t\treturn this._data.getCurrent();\r\n\t}\r\n\r\n\t/**\r\n\t * Get the persisted data\r\n\t * @returns { DetailModelType | undefined } The persisted data\r\n\t */\r\n\tpublic getPersistedData(): DetailModelType | undefined {\r\n\t\treturn this._data.getPersisted();\r\n\t}\r\n\r\n\t/**\r\n\t * Get the unique\r\n\t * @returns { string | undefined } The unique identifier\r\n\t */\r\n\tgetUnique(): UmbEntityUnique | undefined {\r\n\t\treturn this.#entityContext.getUnique();\r\n\t}\r\n\r\n\tsetUnique(unique: string) {\r\n\t\tthis.#entityContext.setUnique(unique);\r\n\t}\r\n\r\n\t/**\r\n\t * Get the parent\r\n\t * @returns { UmbEntityModel | undefined } The parent entity\r\n\t */\r\n\tgetParent(): UmbEntityModel | undefined {\r\n\t\treturn this.#parent.getValue();\r\n\t}\r\n\r\n\tsetParent(parent: UmbEntityModel) {\r\n\t\tthis.#parent.setValue(parent);\r\n\t}\r\n\r\n\t/**\r\n\t * Get the parent unique\r\n\t * @returns { string | undefined } The parent unique identifier\r\n\t */\r\n\tgetParentUnique(): UmbEntityUnique | undefined {\r\n\t\treturn this.#parent.getValue()?.unique;\r\n\t}\r\n\r\n\tgetParentEntityType() {\r\n\t\treturn this.#parent.getValue()?.entityType;\r\n\t}\r\n\r\n\tasync load(unique: string) {\r\n\t\tthis.resetState();\r\n\t\tthis.#entityContext.setUnique(unique);\r\n\t\tthis.loading.addState({ unique: LOADING_STATE_UNIQUE, message: `Loading ${this.getEntityType()} Details` });\r\n\t\tawait this.#init;\r\n\t\tthis._getDataPromise = this._detailRepository!.requestByUnique(unique);\r\n\t\ttype GetDataType = Awaited['requestByUnique']>>;\r\n\t\tconst response = (await this._getDataPromise) as GetDataType;\r\n\t\tconst data = response.data;\r\n\r\n\t\tif (data) {\r\n\t\t\tthis._data.setPersisted(data);\r\n\t\t\tthis._data.setCurrent(data);\r\n\t\t\tthis.setIsNew(false);\r\n\r\n\t\t\tthis.observe(\r\n\t\t\t\tresponse.asObservable(),\r\n\t\t\t\t(entity) => this.#onDetailStoreChange(entity),\r\n\t\t\t\t'umbEntityDetailTypeStoreObserver',\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\tthis.loading.removeState(LOADING_STATE_UNIQUE);\r\n\t\treturn response;\r\n\t}\r\n\r\n\t/**\r\n\t * Reload the workspace data\r\n\t * @returns { Promise } The promise of the reload\r\n\t */\r\n\tpublic async reload(): Promise {\r\n\t\tconst unique = this.getUnique();\r\n\t\tif (!unique) throw new Error('Unique is not set');\r\n\t\tconst { data } = await this._detailRepository!.requestByUnique(unique);\r\n\r\n\t\tif (data) {\r\n\t\t\tthis._data.setPersisted(data);\r\n\t\t\tthis._data.setCurrent(data);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Method to check if the workspace data is loaded.\r\n\t * @returns { Promise | undefined } true if the workspace data is loaded.\r\n\t * @memberof UmbEntityWorkspaceContextBase\r\n\t */\r\n\tpublic isLoaded(): Promise | undefined {\r\n\t\treturn this._getDataPromise;\r\n\t}\r\n\r\n\t/**\r\n\t * Create a data scaffold\r\n\t * @param {CreateArgsType} args The arguments to create the scaffold.\r\n\t * @param {UmbEntityModel} args.parent The parent entity.\r\n\t * @param {UmbEntityUnique} args.parent.unique The unique identifier of the parent entity.\r\n\t * @param {string} args.parent.entityType The entity type of the parent entity.\r\n\t * @param {Partial} args.preset The preset data.\r\n\t * @returns { Promise | undefined } The data of the scaffold.\r\n\t */\r\n\tpublic async createScaffold(args: CreateArgsType) {\r\n\t\tthis.resetState();\r\n\t\tthis.loading.addState({ unique: LOADING_STATE_UNIQUE, message: `Creating ${this.getEntityType()} scaffold` });\r\n\t\tawait this.#init;\r\n\t\tthis.setParent(args.parent);\r\n\r\n\t\tconst request = this._detailRepository!.createScaffold(args.preset);\r\n\t\tthis._getDataPromise = request;\r\n\t\tlet { data } = await request;\r\n\r\n\t\tif (data) {\r\n\t\t\tthis.#entityContext.setUnique(data.unique);\r\n\r\n\t\t\tif (this.modalContext) {\r\n\t\t\t\tdata = { ...data, ...this.modalContext.data.preset };\r\n\t\t\t}\r\n\r\n\t\t\tthis.setIsNew(true);\r\n\t\t\tthis._data.setPersisted(data);\r\n\t\t\tthis._data.setCurrent(data);\r\n\t\t}\r\n\r\n\t\tthis.loading.removeState(LOADING_STATE_UNIQUE);\r\n\r\n\t\treturn data;\r\n\t}\r\n\r\n\tasync submit() {\r\n\t\tawait this.#init;\r\n\t\tconst currentData = this.getData();\r\n\r\n\t\tif (!currentData) {\r\n\t\t\tthrow new Error('Data is not set');\r\n\t\t}\r\n\r\n\t\tif (currentData.unique === undefined) {\r\n\t\t\tthrow new Error('Unique is not set');\r\n\t\t}\r\n\r\n\t\tif (this.getIsNew()) {\r\n\t\t\tconst parent = this.#parent.getValue();\r\n\t\t\tif (parent?.unique === undefined) throw new Error('Parent unique is missing');\r\n\t\t\tif (!parent.entityType) throw new Error('Parent entity type is missing');\r\n\t\t\tawait this._create(currentData, parent);\r\n\t\t} else {\r\n\t\t\tawait this._update(currentData);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Deletes the entity.\r\n\t * @param unique The unique identifier of the entity to delete.\r\n\t */\r\n\tasync delete(unique: string) {\r\n\t\tawait this.#init;\r\n\t\tawait this._detailRepository!.delete(unique);\r\n\t}\r\n\r\n\t/**\r\n\t * Check if the workspace is about to navigate away.\r\n\t * @protected\r\n\t * @param {string} newUrl The new url that the workspace is navigating to.\r\n\t * @returns { boolean} true if the workspace is navigating away.\r\n\t * @memberof UmbEntityWorkspaceContextBase\r\n\t */\r\n\tprotected _checkWillNavigateAway(newUrl: string): boolean {\r\n\t\treturn !newUrl.includes(this.routes.getActiveLocalPath());\r\n\t}\r\n\r\n\tprotected async _create(currentData: DetailModelType, parent: UmbEntityModel) {\r\n\t\tif (!this._detailRepository) throw new Error('Detail repository is not set');\r\n\r\n\t\tconst { error, data } = await this._detailRepository.create(currentData, parent.unique);\r\n\t\tif (error || !data) {\r\n\t\t\tthrow error?.message ?? 'Repository did not return data after create.';\r\n\t\t}\r\n\r\n\t\tthis.#entityContext.setUnique(data.unique);\r\n\t\tthis._data.setPersisted(data);\r\n\t\tthis._data.setCurrent(data);\r\n\r\n\t\tconst eventContext = await this.getContext(UMB_ACTION_EVENT_CONTEXT);\r\n\t\tconst event = new UmbRequestReloadChildrenOfEntityEvent({\r\n\t\t\tentityType: parent.entityType,\r\n\t\t\tunique: parent.unique,\r\n\t\t});\r\n\t\teventContext.dispatchEvent(event);\r\n\t\tthis.setIsNew(false);\r\n\t}\r\n\r\n\tprotected async _update(currentData: DetailModelType) {\r\n\t\tconst { error, data } = await this._detailRepository!.save(currentData);\r\n\t\tif (error || !data) {\r\n\t\t\tthrow error?.message ?? 'Repository did not return data after create.';\r\n\t\t}\r\n\r\n\t\tthis._data.setPersisted(data);\r\n\t\tthis._data.setCurrent(data);\r\n\r\n\t\tconst actionEventContext = await this.getContext(UMB_ACTION_EVENT_CONTEXT);\r\n\t\tconst event = new UmbRequestReloadStructureForEntityEvent({\r\n\t\t\tunique: this.getUnique()!,\r\n\t\t\tentityType: this.getEntityType(),\r\n\t\t});\r\n\r\n\t\tactionEventContext.dispatchEvent(event);\r\n\t}\r\n\r\n\t#allowNavigateAway = false;\r\n\r\n\t#onWillNavigate = async (e: CustomEvent) => {\r\n\t\tconst newUrl = e.detail.url;\r\n\r\n\t\tif (this.#allowNavigateAway) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\t/* TODO: temp removal of discard changes in workspace modals.\r\n\t\t The modal closes before the discard changes dialog is resolved.*/\r\n\t\tif (newUrl.includes('/modal/umb-modal-workspace/')) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\tif (this._checkWillNavigateAway(newUrl) && this._getHasUnpersistedChanges()) {\r\n\t\t\t/* Since ours modals are async while events are synchronous, we need to prevent the default behavior of the event, even if the modal hasn’t been resolved yet.\r\n\t\t\tOnce the modal is resolved (the user accepted to discard the changes and navigate away from the route), we will push a new history state.\r\n\t\t\tThis push will make the \"willchangestate\" event happen again and due to this somewhat \"backward\" behavior,\r\n\t\t\twe set an \"allowNavigateAway\"-flag to prevent the \"discard-changes\" functionality from running in a loop.*/\r\n\t\t\te.preventDefault();\r\n\t\t\tconst modalManager = await this.getContext(UMB_MODAL_MANAGER_CONTEXT);\r\n\t\t\tconst modal = modalManager.open(this, UMB_DISCARD_CHANGES_MODAL);\r\n\r\n\t\t\ttry {\r\n\t\t\t\t// navigate to the new url when discarding changes\r\n\t\t\t\tawait modal.onSubmit();\r\n\t\t\t\tthis.#allowNavigateAway = true;\r\n\t\t\t\thistory.pushState({}, '', e.detail.url);\r\n\t\t\t\treturn true;\r\n\t\t\t} catch {\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t};\r\n\r\n\t/**\r\n\t * Check if there are unpersisted changes.\r\n\t * @returns { boolean } true if there are unpersisted changes.\r\n\t */\r\n\tprotected _getHasUnpersistedChanges(): boolean {\r\n\t\treturn this._data.getHasUnpersistedChanges();\r\n\t}\r\n\r\n\toverride resetState() {\r\n\t\tsuper.resetState();\r\n\t\tthis._data.clear();\r\n\t\tthis.#allowNavigateAway = false;\r\n\t}\r\n\r\n\t#checkIfInitialized() {\r\n\t\tif (this._detailRepository) {\r\n\t\t\tthis.#initialized = true;\r\n\t\t\tthis.#initResolver?.();\r\n\t\t}\r\n\t}\r\n\r\n\t#observeRepository(repositoryAlias: string) {\r\n\t\tif (!repositoryAlias) throw new Error('Entity Workspace must have a repository alias.');\r\n\r\n\t\tnew UmbExtensionApiInitializer>(\r\n\t\t\tthis,\r\n\t\t\tumbExtensionsRegistry,\r\n\t\t\trepositoryAlias,\r\n\t\t\t[this._host],\r\n\t\t\t(permitted, ctrl) => {\r\n\t\t\t\tthis._detailRepository = permitted ? ctrl.api : undefined;\r\n\t\t\t\tthis.#checkIfInitialized();\r\n\t\t\t},\r\n\t\t);\r\n\t}\r\n\r\n\t#onDetailStoreChange(entity: DetailModelType | undefined) {\r\n\t\tif (!entity) {\r\n\t\t\tthis._data.clear();\r\n\t\t}\r\n\t}\r\n\r\n\tpublic override destroy(): void {\r\n\t\twindow.removeEventListener('willchangestate', this.#onWillNavigate);\r\n\t\tthis._detailRepository?.destroy();\r\n\t\tthis.#entityContext.destroy();\r\n\t\tsuper.destroy();\r\n\t}\r\n}\r\n","import type { UmbNamableWorkspaceContext } from '../types.js';\r\nimport { UmbEntityDetailWorkspaceContextBase } from './entity-detail-workspace-base.js';\r\nimport type { UmbEntityDetailWorkspaceContextCreateArgs } from './types.js';\r\nimport type { UmbNamedEntityModel } from '@umbraco-cms/backoffice/entity';\r\nimport type { UmbDetailRepository } from '@umbraco-cms/backoffice/repository';\r\n\r\nexport abstract class UmbEntityNamedDetailWorkspaceContextBase<\r\n\t\tNamedDetailModelType extends UmbNamedEntityModel = UmbNamedEntityModel,\r\n\t\tNamedDetailRepositoryType extends\r\n\t\t\tUmbDetailRepository = UmbDetailRepository,\r\n\t\tCreateArgsType extends\r\n\t\t\tUmbEntityDetailWorkspaceContextCreateArgs = UmbEntityDetailWorkspaceContextCreateArgs,\r\n\t>\r\n\textends UmbEntityDetailWorkspaceContextBase\r\n\timplements UmbNamableWorkspaceContext\r\n{\r\n\t// Just for context token safety:\r\n\tpublic readonly IS_ENTITY_NAMED_DETAIL_WORKSPACE_CONTEXT = true;\r\n\r\n\treadonly name = this._data.createObservablePartOfCurrent((data) => data?.name);\r\n\r\n\tgetName() {\r\n\t\treturn this._data.getCurrent()?.name;\r\n\t}\r\n\r\n\tsetName(name: string | undefined) {\r\n\t\t// We have to cast to Partial because TypeScript doesn't understand that the model has a name property due to generic sub-types\r\n\t\tthis._data.updateCurrent({ name } as Partial);\r\n\t}\r\n}\r\n","import type { UmbSubmittableWorkspaceContextBase } from '../submittable/index.js';\r\nimport type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';\r\nimport { UmbControllerBase } from '@umbraco-cms/backoffice/class-api';\r\nimport type { UmbRouterSlotElement } from '@umbraco-cms/backoffice/router';\r\nimport { ensurePathEndsWithSlash, umbUrlPatternToString } from '@umbraco-cms/backoffice/utils';\r\n\r\nexport const UmbWorkspaceIsNewRedirectControllerAlias = Symbol('IsNewRedirectControllerAlias');\r\n\r\n/**\r\n * Observe the workspace context to see if the entity is new or not.\r\n * If that changes redirect to the edit url.\r\n *\r\n * This requires that the edit URL, is edit/:id\r\n * @param host\r\n * @param workspaceContext\r\n * @param router\r\n */\r\nexport class UmbWorkspaceIsNewRedirectController extends UmbControllerBase {\r\n\tconstructor(\r\n\t\thost: UmbControllerHost,\r\n\t\tworkspaceContext: UmbSubmittableWorkspaceContextBase,\r\n\t\trouter: UmbRouterSlotElement,\r\n\t) {\r\n\t\tsuper(host, UmbWorkspaceIsNewRedirectControllerAlias);\r\n\r\n\t\t// Navigate to edit route when language is created:\r\n\t\tthis.observe(workspaceContext.isNew, (isNew) => {\r\n\t\t\tif (isNew === false) {\r\n\t\t\t\tconst unique = workspaceContext.getUnique();\r\n\t\t\t\tif (router && unique) {\r\n\t\t\t\t\tconst routerPath = router.absoluteRouterPath;\r\n\t\t\t\t\tif (routerPath) {\r\n\t\t\t\t\t\tconst newPath: string = umbUrlPatternToString(ensurePathEndsWithSlash(routerPath) + 'edit/:id', {\r\n\t\t\t\t\t\t\tid: unique,\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t\tthis.destroy();\r\n\t\t\t\t\t\twindow.history.replaceState({}, '', newPath);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// TODO: If workspace route changes cause of other reasons then this controller should be destroyed.\r\n\t}\r\n}\r\n","import { UmbArrayState } from '@umbraco-cms/backoffice/observable-api';\r\nimport { UmbVariantId } from '@umbraco-cms/backoffice/variant';\r\n\r\nexport type ActiveVariant = {\r\n\tindex: number;\r\n\tculture: string | null;\r\n\tsegment: string | null;\r\n};\r\n\r\n/**\r\n * @class UmbWorkspaceSplitViewManager\r\n * @description - Class managing the split view state for a workspace context.\r\n */\r\nexport class UmbWorkspaceSplitViewManager {\r\n\t#activeVariantsInfo = new UmbArrayState([], (x) => x.index).sortBy(\r\n\t\t(a, b) => (a.index || 0) - (b.index || 0),\r\n\t);\r\n\tpublic readonly activeVariantsInfo = this.#activeVariantsInfo.asObservable();\r\n\r\n\tprivate _routeBase?: string;\r\n\tpublic getWorkspaceRoute(): string | undefined {\r\n\t\treturn this._routeBase;\r\n\t}\r\n\tpublic setWorkspaceRoute(route: string | undefined) {\r\n\t\tthis._routeBase = route;\r\n\t}\r\n\r\n\tsetActiveVariant(index: number, culture: string | null, segment: string | null) {\r\n\t\tthis.#activeVariantsInfo.appendOneAt({ index, culture: culture ?? null, segment: segment ?? null }, index);\r\n\t}\r\n\r\n\tgetActiveVariants() {\r\n\t\treturn this.#activeVariantsInfo.getValue();\r\n\t}\r\n\r\n\tpublic removeActiveVariant(index: number) {\r\n\t\tif (this.getActiveVariants().length > 1) {\r\n\t\t\tthis.#activeVariantsInfo.removeOne(index);\r\n\t\t}\r\n\t}\r\n\r\n\tpublic activeVariantByIndex(index: number) {\r\n\t\treturn this.#activeVariantsInfo.asObservablePart((data) => data.find((x) => x.index === index) || undefined);\r\n\t}\r\n\r\n\tpublic switchVariant(index: number, variantId: UmbVariantId) {\r\n\t\t// TODO: remember current path and extend url with it.\r\n\t\t// TODO: construct URl with all active routes:\r\n\t\t// TODO: use method for generating variant url:\r\n\t\tconst workspaceRoute = this.getWorkspaceRoute();\r\n\t\tif (workspaceRoute) {\r\n\t\t\tconst activeVariants = this.getActiveVariants();\r\n\t\t\tif (activeVariants && index < activeVariants.length) {\r\n\t\t\t\tconst newVariants = [...activeVariants];\r\n\t\t\t\tnewVariants[index] = { index, culture: variantId.culture, segment: variantId.segment };\r\n\r\n\t\t\t\tconst variantPart: string = newVariants.map((v) => UmbVariantId.Create(v).toString()).join('_&_');\r\n\r\n\t\t\t\thistory.pushState(null, '', `${workspaceRoute}/${variantPart}`);\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tpublic openSplitView(newVariant: UmbVariantId) {\r\n\t\t// TODO: remember current path and extend url with it.\r\n\t\t// TODO: construct URl with all active routes:\r\n\t\t// TODO: use method for generating variant url:\r\n\r\n\t\tconst currentVariant = this.getActiveVariants()[0];\r\n\t\tconst workspaceRoute = this.getWorkspaceRoute();\r\n\t\tif (currentVariant && workspaceRoute) {\r\n\t\t\thistory.pushState(null, '', `${workspaceRoute}/${UmbVariantId.Create(currentVariant)}_&_${newVariant}`);\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tpublic closeSplitView(index: number) {\r\n\t\tconst workspaceRoute = this.getWorkspaceRoute();\r\n\t\tif (workspaceRoute) {\r\n\t\t\tconst activeVariants = this.getActiveVariants();\r\n\t\t\tif (activeVariants && index < activeVariants.length) {\r\n\t\t\t\tconst newVariants = activeVariants.filter((x) => x.index !== index);\r\n\r\n\t\t\t\tconst variantPart: string = newVariants.map((v) => UmbVariantId.Create(v)).join('_&_');\r\n\r\n\t\t\t\thistory.pushState(null, '', `${workspaceRoute}/${variantPart}`);\r\n\t\t\t\treturn true;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n}\r\n","import type { UmbPropertyValueData } from '../../property/types.js';\r\n\r\n/**\r\n * @function UmbObjectToPropertyValueArray\r\n * @param {object} data - an object with properties to be converted.\r\n * @returns {Array | undefined} - and array of property values or undefined\r\n */\r\nexport function umbObjectToPropertyValueArray(data: object | undefined): Array | undefined {\r\n\tif (!data) return;\r\n\treturn Object.keys(data).map((key) => ({\r\n\t\talias: key,\r\n\t\tvalue: (data as any)[key],\r\n\t}));\r\n}\r\n","import type {\r\n\tUmbPropertyDatasetContext,\r\n\tUmbNameablePropertyDatasetContext,\r\n\tUmbPropertyValueData,\r\n} from '@umbraco-cms/backoffice/property';\r\nimport { UMB_PROPERTY_DATASET_CONTEXT } from '@umbraco-cms/backoffice/property';\r\nimport type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';\r\nimport { UmbContextBase } from '@umbraco-cms/backoffice/class-api';\r\nimport { UmbVariantId } from '@umbraco-cms/backoffice/variant';\r\nimport type { UmbInvariantDatasetWorkspaceContext } from '@umbraco-cms/backoffice/workspace';\r\nimport { UmbBooleanState, type Observable } from '@umbraco-cms/backoffice/observable-api';\r\n\r\n/**\r\n * A property dataset context that hooks directly into the workspace context.\r\n */\r\nexport class UmbInvariantWorkspacePropertyDatasetContext<\r\n\t\tWorkspaceType extends UmbInvariantDatasetWorkspaceContext = UmbInvariantDatasetWorkspaceContext,\r\n\t>\r\n\textends UmbContextBase\r\n\timplements UmbPropertyDatasetContext, UmbNameablePropertyDatasetContext\r\n{\r\n\t#readOnly = new UmbBooleanState(false);\r\n\tpublic readOnly = this.#readOnly.asObservable();\r\n\r\n\t#workspace: WorkspaceType;\r\n\r\n\tname;\r\n\r\n\t// default data:\r\n\r\n\tgetVariantId() {\r\n\t\treturn UmbVariantId.CreateInvariant();\r\n\t}\r\n\tgetEntityType() {\r\n\t\treturn this.#workspace.getEntityType();\r\n\t}\r\n\tgetUnique() {\r\n\t\treturn this.#workspace.getUnique();\r\n\t}\r\n\tgetName() {\r\n\t\treturn this.#workspace.getName();\r\n\t}\r\n\tsetName(name: string) {\r\n\t\tthis.#workspace.setName(name);\r\n\t}\r\n\r\n\tconstructor(host: UmbControllerHost, workspace: WorkspaceType) {\r\n\t\tsuper(host, UMB_PROPERTY_DATASET_CONTEXT);\r\n\t\tthis.#workspace = workspace;\r\n\r\n\t\tthis.name = this.#workspace.name;\r\n\t}\r\n\r\n\tget properties(): Observable | undefined> {\r\n\t\treturn this.#workspace.values;\r\n\t}\r\n\tgetProperties(): Promise | undefined> {\r\n\t\treturn this.#workspace.getValues();\r\n\t}\r\n\r\n\t/**\r\n\t * @function propertyValueByAlias\r\n\t * @param {string} propertyAlias\r\n\t * @returns {Promise | undefined>}\r\n\t * @description Get an Observable for the value of this property.\r\n\t */\r\n\tasync propertyValueByAlias(propertyAlias: string) {\r\n\t\treturn await this.#workspace.propertyValueByAlias(propertyAlias);\r\n\t}\r\n\r\n\t/**\r\n\t * @param {string} propertyAlias - The alias of the property\r\n\t * @param {unknown} value - The value to be set for this property\r\n\t * @returns {Promise} - an promise which resolves once the value has been set.\r\n\t */\r\n\tasync setPropertyValue(propertyAlias: string, value: unknown) {\r\n\t\treturn this.#workspace.setPropertyValue(propertyAlias, value);\r\n\t}\r\n\r\n\tgetReadOnly() {\r\n\t\treturn this.#readOnly.getValue();\r\n\t}\r\n}\r\n"],"names":["UmbWorkspaceActionMenuItemBase","UmbActionBase","UmbWorkspaceActionBase","UmbBooleanState","UmbSubmitWorkspaceAction","#workspaceContext","host","args","UMB_SUBMITTABLE_WORKSPACE_CONTEXT","context","#observeUnique","unique","UmbWorkspaceRouteManager","UmbControllerBase","#routes","UmbArrayState","x","#activeLocalPath","UmbStringState","routes","mappedRoutes","route","oldSetupCallback","_component","info","UmbSubmittableWorkspaceContextBase","UmbContextBase","workspaceAlias","UMB_WORKSPACE_CONTEXT","#validationContexts","#isNew","#rejectSubmit","#submitPromise","#submitReject","#submitResolve","#resolveSubmit","#completeSubmit","UMB_MODAL_CONTEXT","isNew","onValid","onInvalid","resolve","reject","UmbEditableWorkspaceContextBase","UmbEntityWorkspaceDataManager","UmbObjectState","data","partialData","mappingFunction","persisted","current","jsonStringComparison","LOADING_STATE_UNIQUE","UmbEntityDetailWorkspaceContextBase","#entityContext","UmbEntityContext","UmbStateManager","#parent","parent","UmbValidationContext","#initialized","#init","#initResolver","#allowNavigateAway","#onWillNavigate","e","newUrl","modal","UMB_MODAL_MANAGER_CONTEXT","UMB_DISCARD_CHANGES_MODAL","#observeRepository","entityType","response","entity","#onDetailStoreChange","request","currentData","error","eventContext","UMB_ACTION_EVENT_CONTEXT","event","UmbRequestReloadChildrenOfEntityEvent","actionEventContext","UmbRequestReloadStructureForEntityEvent","#checkIfInitialized","repositoryAlias","UmbExtensionApiInitializer","umbExtensionsRegistry","permitted","ctrl","UmbEntityNamedDetailWorkspaceContextBase","name","UmbWorkspaceIsNewRedirectControllerAlias","UmbWorkspaceIsNewRedirectController","workspaceContext","router","routerPath","newPath","umbUrlPatternToString","ensurePathEndsWithSlash","UmbWorkspaceSplitViewManager","#activeVariantsInfo","a","b","index","culture","segment","variantId","workspaceRoute","activeVariants","newVariants","variantPart","v","UmbVariantId","newVariant","currentVariant","umbObjectToPropertyValueArray","key","UmbInvariantWorkspacePropertyDatasetContext","workspace","UMB_PROPERTY_DATASET_CONTEXT","#readOnly","#workspace","propertyAlias","value"],"mappings":"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"}