diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group/user-group-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group/user-group-workspace.context.ts index 6f81961747..81f0da5a81 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group/user-group-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group/user-group-workspace.context.ts @@ -1,49 +1,50 @@ -import { UmbUserGroupDetailRepository } from '../../repository/detail/index.js'; import type { UmbUserGroupDetailModel } from '../../types.js'; +import { UMB_USER_GROUP_DETAIL_REPOSITORY_ALIAS, type UmbUserGroupDetailRepository } from '../../repository/index.js'; +import { UMB_USER_GROUP_ENTITY_TYPE, UMB_USER_GROUP_ROOT_ENTITY_TYPE } from '../../entity.js'; import { UmbUserGroupWorkspaceEditorElement } from './user-group-workspace-editor.element.js'; +import { UMB_USER_GROUP_WORKSPACE_ALIAS } from './constants.js'; import type { UmbUserPermissionModel } from '@umbraco-cms/backoffice/user-permission'; import type { UmbRoutableWorkspaceContext, UmbSubmittableWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; import { - UmbSubmittableWorkspaceContextBase, + UmbEntityDetailWorkspaceContextBase, UmbWorkspaceIsNewRedirectController, } from '@umbraco-cms/backoffice/workspace'; -import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; export class UmbUserGroupWorkspaceContext - extends UmbSubmittableWorkspaceContextBase + extends UmbEntityDetailWorkspaceContextBase implements UmbSubmittableWorkspaceContext, UmbRoutableWorkspaceContext { - // - public readonly repository: UmbUserGroupDetailRepository = new UmbUserGroupDetailRepository(this); + data = this._data.current; - #data = new UmbObjectState(undefined); - data = this.#data.asObservable(); - - readonly unique = this.#data.asObservablePart((data) => data?.unique); - readonly name = this.#data.asObservablePart((data) => data?.name || ''); - readonly alias = this.#data.asObservablePart((data) => data?.alias || ''); - readonly aliasCanBeChanged = this.#data.asObservablePart((data) => data?.aliasCanBeChanged); - readonly icon = this.#data.asObservablePart((data) => data?.icon || null); - readonly sections = this.#data.asObservablePart((data) => data?.sections || []); - readonly languages = this.#data.asObservablePart((data) => data?.languages || []); - readonly hasAccessToAllLanguages = this.#data.asObservablePart((data) => data?.hasAccessToAllLanguages || false); - readonly documentStartNode = this.#data.asObservablePart((data) => data?.documentStartNode || null); - readonly documentRootAccess = this.#data.asObservablePart((data) => data?.documentRootAccess || false); - readonly mediaStartNode = this.#data.asObservablePart((data) => data?.mediaStartNode || null); - readonly mediaRootAccess = this.#data.asObservablePart((data) => data?.mediaRootAccess || false); - readonly fallbackPermissions = this.#data.asObservablePart((data) => data?.fallbackPermissions || []); - readonly permissions = this.#data.asObservablePart((data) => data?.permissions || []); + readonly unique = this._data.createObservablePart((data) => data?.unique); + readonly name = this._data.createObservablePart((data) => data?.name || ''); + readonly alias = this._data.createObservablePart((data) => data?.alias || ''); + readonly aliasCanBeChanged = this._data.createObservablePart((data) => data?.aliasCanBeChanged); + readonly icon = this._data.createObservablePart((data) => data?.icon || null); + readonly sections = this._data.createObservablePart((data) => data?.sections || []); + readonly languages = this._data.createObservablePart((data) => data?.languages || []); + readonly hasAccessToAllLanguages = this._data.createObservablePart((data) => data?.hasAccessToAllLanguages || false); + readonly documentStartNode = this._data.createObservablePart((data) => data?.documentStartNode || null); + readonly documentRootAccess = this._data.createObservablePart((data) => data?.documentRootAccess || false); + readonly mediaStartNode = this._data.createObservablePart((data) => data?.mediaStartNode || null); + readonly mediaRootAccess = this._data.createObservablePart((data) => data?.mediaRootAccess || false); + readonly fallbackPermissions = this._data.createObservablePart((data) => data?.fallbackPermissions || []); + readonly permissions = this._data.createObservablePart((data) => data?.permissions || []); constructor(host: UmbControllerHost) { - super(host, 'Umb.Workspace.UserGroup'); + super(host, { + workspaceAlias: UMB_USER_GROUP_WORKSPACE_ALIAS, + entityType: UMB_USER_GROUP_ENTITY_TYPE, + detailRepositoryAlias: UMB_USER_GROUP_DETAIL_REPOSITORY_ALIAS, + }); this.routes.setRoutes([ { path: 'create', component: UmbUserGroupWorkspaceEditorElement, setup: () => { - this.create(); + this.create({ parent: { entityType: UMB_USER_GROUP_ROOT_ENTITY_TYPE, unique: null } }); new UmbWorkspaceIsNewRedirectController( this, @@ -63,70 +64,16 @@ export class UmbUserGroupWorkspaceContext ]); } - protected override resetState(): void { - super.resetState(); - this.#data.setValue(undefined); - } - - async create() { - this.resetState(); - const { data } = await this.repository.createScaffold(); - this.setIsNew(true); - this.#data.setValue(data); - return { data }; - } - - async load(unique: string) { - this.resetState(); - const { data } = await this.repository.requestByUnique(unique); - if (data) { - this.setIsNew(false); - this.#data.setValue(data); - } - } - - getUnique() { - return this.getData()?.unique; - } - - getEntityType(): string { - return 'user-group'; - } - - getData() { - return this.#data.getValue(); - } - - async submit() { - if (!this.#data.value) throw new Error('Data is missing'); - + protected override _checkWillNavigateAway(newUrl: string): boolean { if (this.getIsNew()) { - const { error, data } = await this.repository.create(this.#data.value); - if (data) { - this.#data.setValue(data); - this.setIsNew(false); - } - if (error) throw new Error(error.message); - } else if (this.#data.value.unique) { - const { error, data } = await this.repository.save(this.#data.value); - if (data) { - this.#data.setValue(data); - } - if (error) throw new Error(error.message); + return !newUrl.includes(`/create`) || super._checkWillNavigateAway(newUrl); + } else { + return !newUrl.includes(`/edit/${this.getUnique()}`) || super._checkWillNavigateAway(newUrl); } } - override destroy(): void { - this.#data.destroy(); - super.destroy(); - } - - async delete(id: string) { - await this.repository.delete(id); - } - updateProperty(alias: Alias, value: UmbUserGroupDetailModel[Alias]) { - this.#data.update({ [alias]: value }); + this._data.updateCurrentData({ [alias]: value }); } /** @@ -134,7 +81,7 @@ export class UmbUserGroupWorkspaceContext * @memberof UmbUserGroupWorkspaceContext */ getPermissions() { - return this.#data.getValue()?.permissions ?? []; + return this._data.getCurrentData()?.permissions ?? []; } /** @@ -143,7 +90,7 @@ export class UmbUserGroupWorkspaceContext * @memberof UmbUserGroupWorkspaceContext */ setPermissions(permissions: Array) { - this.#data.update({ permissions: permissions }); + this._data.updateCurrentData({ permissions: permissions }); } /** @@ -151,7 +98,7 @@ export class UmbUserGroupWorkspaceContext * @memberof UmbUserGroupWorkspaceContext */ getFallbackPermissions() { - return this.#data.getValue()?.fallbackPermissions ?? []; + return this._data.getCurrentData()?.fallbackPermissions ?? []; } /** @@ -160,7 +107,7 @@ export class UmbUserGroupWorkspaceContext * @memberof UmbUserGroupWorkspaceContext */ setFallbackPermissions(fallbackPermissions: Array) { - this.#data.update({ fallbackPermissions }); + this._data.updateCurrentData({ fallbackPermissions }); } }