diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/components/table/table.element.ts b/src/Umbraco.Web.UI.Client/src/packages/core/components/table/table.element.ts index 1242c59aa8..2fe80b1517 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/components/table/table.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/components/table/table.element.ts @@ -14,7 +14,7 @@ import { // TODO: move to UI Library - entity actions should NOT be moved to UI Library but stay in an UmbTable element export interface UmbTableItem { id: string; - icon?: string; + icon?: string | null; entityType?: string; data: Array; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/change-password-modal.token.ts b/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/change-password-modal.token.ts index 78b0faa8d2..8c8cf1b9a6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/change-password-modal.token.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/core/modal/token/change-password-modal.token.ts @@ -1,7 +1,9 @@ import { UmbModalToken } from '@umbraco-cms/backoffice/modal'; export interface UmbChangePasswordModalData { - userId: string; + user: { + unique: string; + }; } export interface UmbChangePasswordModalValue { diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/user-profile-apps/user-profile-app-profile.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/user-profile-apps/user-profile-app-profile.element.ts index 599d63d859..b182f9a4a0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/user-profile-apps/user-profile-app-profile.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/user-profile-apps/user-profile-app-profile.element.ts @@ -1,18 +1,14 @@ import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import type { - UmbModalManagerContext} from '@umbraco-cms/backoffice/modal'; -import { - UMB_CHANGE_PASSWORD_MODAL, - UMB_MODAL_MANAGER_CONTEXT, -} from '@umbraco-cms/backoffice/modal'; -import { UMB_CURRENT_USER_CONTEXT, type UmbCurrentUser } from '@umbraco-cms/backoffice/current-user'; +import type { UmbModalManagerContext } from '@umbraco-cms/backoffice/modal'; +import { UMB_CHANGE_PASSWORD_MODAL, UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; +import { UMB_CURRENT_USER_CONTEXT, type UmbCurrentUserModel } from '@umbraco-cms/backoffice/current-user'; @customElement('umb-user-profile-app-profile') export class UmbUserProfileAppProfileElement extends UmbLitElement { @state() - private _currentUser?: UmbCurrentUser; + private _currentUser?: UmbCurrentUserModel; #modalManagerContext?: UmbModalManagerContext; #currentUserContext?: typeof UMB_CURRENT_USER_CONTEXT.TYPE; @@ -45,15 +41,18 @@ export class UmbUserProfileAppProfileElement extends UmbLitElement { private _edit() { if (!this._currentUser) return; - history.pushState(null, '', 'section/user-management/view/users/user/' + this._currentUser.id); //TODO Change to a tag with href and make dynamic + history.pushState(null, '', 'section/user-management/view/users/user/' + this._currentUser.unique); //TODO Change to a tag with href and make dynamic //TODO Implement modal routing for the current-user-modal, so that the modal closes when navigating to the edit profile page } private _changePassword() { if (!this.#modalManagerContext) return; + if (!this._currentUser) throw new Error('Current User not found'); this.#modalManagerContext.open(UMB_CHANGE_PASSWORD_MODAL, { data: { - userId: this._currentUser?.id ?? '', + user: { + unique: this._currentUser.unique, + }, }, }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/modals/change-password/change-password-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/modals/change-password/change-password-modal.element.ts index 12c37d9482..e184e5dabd 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/modals/change-password/change-password-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/modals/change-password/change-password-modal.element.ts @@ -1,14 +1,10 @@ import { UmbUserItemRepository } from '../../user/repository/item/user-item.repository.js'; import { UMB_CURRENT_USER_CONTEXT } from '../../current-user/current-user.context.js'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; -import type { CSSResultGroup} from '@umbraco-cms/backoffice/external/lit'; +import type { CSSResultGroup } from '@umbraco-cms/backoffice/external/lit'; import { css, html, nothing, customElement, state } from '@umbraco-cms/backoffice/external/lit'; -import type { - UmbChangePasswordModalData, - UmbChangePasswordModalValue} from '@umbraco-cms/backoffice/modal'; -import { - UmbModalBaseElement, -} from '@umbraco-cms/backoffice/modal'; +import type { UmbChangePasswordModalData, UmbChangePasswordModalValue } from '@umbraco-cms/backoffice/modal'; +import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; @customElement('umb-change-password-modal') export class UmbChangePasswordModalElement extends UmbModalBaseElement< @@ -58,7 +54,7 @@ export class UmbChangePasswordModalElement extends UmbModalBaseElement< } async #setIsCurrentUser() { - if (!this.data?.userId) { + if (!this.data?.user.unique) { this._isCurrentUser = false; return; } @@ -68,12 +64,12 @@ export class UmbChangePasswordModalElement extends UmbModalBaseElement< return; } - this._isCurrentUser = await this.#currentUserContext.isUserCurrentUser(this.data.userId); + this._isCurrentUser = await this.#currentUserContext.isUserCurrentUser(this.data.user.unique); } protected async firstUpdated(): Promise { - if (!this.data?.userId) return; - const { data } = await this.#userItemRepository.requestItems([this.data.userId]); + if (!this.data?.user.unique) return; + const { data } = await this.#userItemRepository.requestItems([this.data.user.unique]); if (data) { const userName = data[0].name; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/repository/user-group-collection.repository.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/repository/user-group-collection.repository.ts index ea348ff58c..154cad42b8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/repository/user-group-collection.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/repository/user-group-collection.repository.ts @@ -1,6 +1,6 @@ import type { UmbUserGroupDetailModel } from '../../types.js'; -import type { UmbUserGroupStore } from '../../repository/user-group.store.js'; -import { UMB_USER_GROUP_STORE_CONTEXT } from '../../repository/user-group.store.js'; +import type { UmbUserGroupDetailStore } from '../../repository/index.js'; +import { UMB_USER_GROUP_DETAIL_STORE_CONTEXT } from '../../repository/index.js'; import type { UmbUserGroupCollectionFilterModel } from '../types.js'; import { UmbUserGroupCollectionServerDataSource } from './user-group-collection.server.data-source.js'; import type { UmbCollectionDataSource, UmbCollectionRepository } from '@umbraco-cms/backoffice/repository'; @@ -10,14 +10,14 @@ import { UmbBaseController } from '@umbraco-cms/backoffice/class-api'; export class UmbUserGroupCollectionRepository extends UmbBaseController implements UmbCollectionRepository { #init; - #detailStore?: UmbUserGroupStore; + #detailStore?: UmbUserGroupDetailStore; #collectionSource: UmbCollectionDataSource; constructor(host: UmbControllerHost) { super(host); this.#collectionSource = new UmbUserGroupCollectionServerDataSource(this._host); - this.#init = this.consumeContext(UMB_USER_GROUP_STORE_CONTEXT, (instance) => { + this.#init = this.consumeContext(UMB_USER_GROUP_DETAIL_STORE_CONTEXT, (instance) => { this.#detailStore = instance; }).asPromise(); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/repository/user-group-collection.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/repository/user-group-collection.server.data-source.ts index 90f7a2b6d7..f7e85f6963 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/repository/user-group-collection.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/repository/user-group-collection.server.data-source.ts @@ -1,8 +1,8 @@ -import type { UmbUserGroupCollectionFilterModel } from '../../types.js'; +import type { UmbUserGroupCollectionFilterModel } from '../types.js'; import type { UmbCollectionDataSource } from '@umbraco-cms/backoffice/repository'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; -import type { UserGroupResponseModel} from '@umbraco-cms/backoffice/backend-api'; +import type { UserGroupResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { UserGroupResource } from '@umbraco-cms/backoffice/backend-api'; /** @@ -23,8 +23,20 @@ export class UmbUserGroupCollectionServerDataSource implements UmbCollectionData this.#host = host; } - getCollection(filter: UmbUserGroupCollectionFilterModel) { - // TODO: Switch this to the filter endpoint when available - return tryExecuteAndNotify(this.#host, UserGroupResource.getUserGroup({})); + async getCollection(filter: UmbUserGroupCollectionFilterModel) { + const { data, error } = await tryExecuteAndNotify( + this.#host, + UserGroupResource.getUserGroup({ skip: filter.skip, take: filter.take }), + ); + + if (data) { + const mappedItems = data.items.map((item) => { + return { + ...item, + }; + }); + } + + return { error }; } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/views/user-group-table-collection-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/views/user-group-table-collection-view.element.ts index c6a75812ff..258336b1f9 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/views/user-group-table-collection-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/collection/views/user-group-table-collection-view.element.ts @@ -3,7 +3,6 @@ import { css, html, customElement, state } from '@umbraco-cms/backoffice/externa import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import type { UmbDefaultCollectionContext } from '@umbraco-cms/backoffice/collection'; import { UMB_DEFAULT_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; -import type { UserGroupResponseModel } from '@umbraco-cms/backoffice/backend-api'; import '../components/user-group-table-name-column-layout.element.js'; import '../components/user-group-table-sections-column-layout.element.js'; @@ -16,6 +15,7 @@ import type { UmbTableItem, UmbTableSelectedEvent, } from '@umbraco-cms/backoffice/components'; +import type { UmbUserGroupDetailModel } from '../../types.js'; @customElement('umb-user-group-collection-table-view') export class UmbUserGroupCollectionTableViewElement extends UmbLitElement { @@ -74,29 +74,29 @@ export class UmbUserGroupCollectionTableViewElement extends UmbLitElement { }); } - private _createTableItems(userGroups: Array) { + private _createTableItems(userGroups: Array) { this._tableItems = userGroups.map((userGroup) => { return { - id: userGroup.id || '', - icon: userGroup.icon || '', + id: userGroup.unique, + icon: userGroup.icon, data: [ { columnAlias: 'userGroupName', value: { - name: userGroup.name || '', + name: userGroup.name, }, }, { columnAlias: 'userGroupSections', - value: userGroup.sections || [], + value: userGroup.sections, }, { columnAlias: 'userGroupContentStartNode', - value: userGroup.documentStartNode?.id || this.localize.term('content_contentRoot'), + value: userGroup.documentStartNode?.unique || this.localize.term('content_contentRoot'), }, { columnAlias: 'userGroupMediaStartNode', - value: userGroup.mediaStartNode?.id || this.localize.term('media_mediaRoot'), + value: userGroup.mediaStartNode?.unique || this.localize.term('media_mediaRoot'), }, ], }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/components/input-user-group/user-group-input.context.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/components/input-user-group/user-group-input.context.ts index 372531cc04..96e95228e2 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/components/input-user-group/user-group-input.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/components/input-user-group/user-group-input.context.ts @@ -1,10 +1,10 @@ +import { UMB_USER_GROUP_ITEM_REPOSITORY_ALIAS, type UmbUserGroupItemModel } from '../../repository/index.js'; import { UmbPickerInputContext } from '@umbraco-cms/backoffice/picker-input'; import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller-api'; import { UMB_USER_GROUP_PICKER_MODAL } from '@umbraco-cms/backoffice/modal'; -import type { UserGroupItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; -export class UmbUserGroupPickerContext extends UmbPickerInputContext { +export class UmbUserGroupPickerContext extends UmbPickerInputContext { constructor(host: UmbControllerHostElement) { - super(host, 'Umb.Repository.UserGroup', UMB_USER_GROUP_PICKER_MODAL); + super(host, UMB_USER_GROUP_ITEM_REPOSITORY_ALIAS, UMB_USER_GROUP_PICKER_MODAL); } } diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/components/input-user-group/user-group-input.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/components/input-user-group/user-group-input.element.ts index 59903fcf09..83781110e8 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/components/input-user-group/user-group-input.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/components/input-user-group/user-group-input.element.ts @@ -1,8 +1,8 @@ +import type { UmbUserGroupItemModel } from '../../repository/index.js'; import { UmbUserGroupPickerContext } from './user-group-input.context.js'; import { css, html, customElement, property, state, ifDefined, nothing } from '@umbraco-cms/backoffice/external/lit'; import { FormControlMixin } from '@umbraco-cms/backoffice/external/uui'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import type { UserGroupItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { splitStringToArray } from '@umbraco-cms/backoffice/utils'; @customElement('umb-user-group-input') @@ -67,7 +67,7 @@ export class UmbUserGroupInputElement extends FormControlMixin(UmbLitElement) { } @state() - private _items?: Array; + private _items?: Array; #pickerContext = new UmbUserGroupPickerContext(this); @@ -111,7 +111,7 @@ export class UmbUserGroupInputElement extends FormControlMixin(UmbLitElement) { `; } - private _renderItem(item: UserGroupItemResponseModel) { + private _renderItem(item: UmbUserGroupItemModel) { if (!item.id) return; return html` diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/modals/user-group-picker/user-group-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/modals/user-group-picker/user-group-picker-modal.element.ts index d8237e7bff..491e07a3ff 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/modals/user-group-picker/user-group-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/modals/user-group-picker/user-group-picker-modal.element.ts @@ -1,10 +1,10 @@ import { UmbUserGroupCollectionRepository } from '../../collection/repository/index.js'; +import type { UmbUserGroupDetailModel } from '../../types.js'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { html, customElement, state, ifDefined } from '@umbraco-cms/backoffice/external/lit'; import { UmbSelectionManager } from '@umbraco-cms/backoffice/utils'; -import type { UMB_USER_GROUP_PICKER_MODAL} from '@umbraco-cms/backoffice/modal'; +import type { UMB_USER_GROUP_PICKER_MODAL } from '@umbraco-cms/backoffice/modal'; import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; -import type { UserGroupResponseModel } from '@umbraco-cms/backoffice/backend-api'; import type { UUIMenuItemEvent } from '@umbraco-cms/backoffice/external/uui'; import { UmbSelectedEvent, UmbDeselectedEvent } from '@umbraco-cms/backoffice/event'; @customElement('umb-user-group-picker-modal') @@ -13,7 +13,7 @@ export class UmbUserGroupPickerModalElement extends UmbModalBaseElement< (typeof UMB_USER_GROUP_PICKER_MODAL)['VALUE'] > { @state() - private _userGroups: Array = []; + private _userGroups: Array = []; #selectionManager = new UmbSelectionManager(this); #userGroupCollectionRepository = new UmbUserGroupCollectionRepository(this); @@ -37,20 +37,20 @@ export class UmbUserGroupPickerModalElement extends UmbModalBaseElement< this.observe(asObservable(), (items) => (this._userGroups = items), 'umbUserGroupsObserver'); } - #onSelected(event: UUIMenuItemEvent, item: UserGroupResponseModel) { - if (!item.id) throw new Error('User group id is required'); + #onSelected(event: UUIMenuItemEvent, item: UmbUserGroupDetailModel) { + if (!item.unique) throw new Error('User group unique is required'); event.stopPropagation(); - this.#selectionManager.select(item.id); + this.#selectionManager.select(item.unique); this.requestUpdate(); - this.modalContext?.dispatchEvent(new UmbSelectedEvent(item.id)); + this.modalContext?.dispatchEvent(new UmbSelectedEvent(item.unique)); } - #onDeselected(event: UUIMenuItemEvent, item: UserGroupResponseModel) { - if (!item.id) throw new Error('User group id is required'); + #onDeselected(event: UUIMenuItemEvent, item: UmbUserGroupDetailModel) { + if (!item.unique) throw new Error('User group unique is required'); event.stopPropagation(); - this.#selectionManager.deselect(item.id); + this.#selectionManager.deselect(item.unique); this.requestUpdate(); - this.modalContext?.dispatchEvent(new UmbDeselectedEvent(item.id)); + this.modalContext?.dispatchEvent(new UmbDeselectedEvent(item.unique)); } render() { @@ -64,7 +64,7 @@ export class UmbUserGroupPickerModalElement extends UmbModalBaseElement< selectable @selected=${(event: UUIMenuItemEvent) => this.#onSelected(event, item)} @deselected=${(event: UUIMenuItemEvent) => this.#onDeselected(event, item)} - ?selected=${this.#selectionManager.isSelected(item.id!)}> + ?selected=${this.#selectionManager.isSelected(item.unique)}> `, diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/detail/index.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/detail/index.ts index ba65f7c7d8..02a5394832 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/detail/index.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/repository/detail/index.ts @@ -1,2 +1,3 @@ export { UmbUserGroupDetailRepository } from './user-group-detail.repository.js'; export { UMB_USER_GROUP_DETAIL_REPOSITORY_ALIAS } from './manifests.js'; +export { UMB_USER_GROUP_DETAIL_STORE_CONTEXT } from './user-group-detail.store.js'; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-granular-permission-list.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-granular-permission-list.element.ts index eeabca24bd..edfd2ea396 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-granular-permission-list.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/components/user-group-granular-permission-list.element.ts @@ -1,13 +1,13 @@ import { UMB_USER_GROUP_WORKSPACE_CONTEXT } from '../user-group-workspace.context.js'; +import type { UmbUserGroupDetailModel } from '../../types.js'; import { css, html, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import type { UserGroupResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; @customElement('umb-user-group-granular-permission-list') export class UmbUserGroupGranularPermissionListElement extends UmbLitElement { @state() - private _userGroup?: UserGroupResponseModel; + private _userGroup?: UmbUserGroupDetailModel; #workspaceContext?: typeof UMB_USER_GROUP_WORKSPACE_CONTEXT.TYPE; 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 296014343b..2615fa362f 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 @@ -1,3 +1,4 @@ +import type { UmbUserGroupDetailModel } from '../index.js'; import { UMB_USER_GROUP_ENTITY_TYPE } from '../index.js'; import { UMB_USER_GROUP_WORKSPACE_CONTEXT } from './user-group-workspace.context.js'; import type { UmbUserInputElement } from '@umbraco-cms/backoffice/user'; @@ -5,7 +6,6 @@ import type { UUIInputElement } from '@umbraco-cms/backoffice/external/uui'; import { UUIInputEvent } from '@umbraco-cms/backoffice/external/uui'; import { css, html, nothing, customElement, state } from '@umbraco-cms/backoffice/external/lit'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import type { UserGroupResponseModel } from '@umbraco-cms/backoffice/backend-api'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import type { UmbInputDocumentElement } from '@umbraco-cms/backoffice/document'; import type { UmbInputSectionElement } from '@umbraco-cms/backoffice/components'; @@ -18,10 +18,10 @@ import './components/user-group-granular-permission-list.element.js'; @customElement('umb-user-group-workspace-editor') export class UmbUserGroupWorkspaceEditorElement extends UmbLitElement { @state() - private _userGroup?: UserGroupResponseModel; + private _userGroup?: UmbUserGroupDetailModel; @state() - private _userIds?: Array; + private _userUniques?: Array; #workspaceContext?: typeof UMB_USER_GROUP_WORKSPACE_CONTEXT.TYPE; @@ -31,7 +31,7 @@ export class UmbUserGroupWorkspaceEditorElement extends UmbLitElement { this.consumeContext(UMB_USER_GROUP_WORKSPACE_CONTEXT, (instance) => { this.#workspaceContext = instance; this.observe(this.#workspaceContext.data, (userGroup) => (this._userGroup = userGroup), 'umbUserGroupObserver'); - this.observe(this.#workspaceContext.userIds, (userIds) => (this._userIds = userIds), 'umbUserIdsObserver'); + this.observe(this.#workspaceContext.userIds, (userIds) => (this._userUniques = userIds), 'umbUserIdsObserver'); }); } @@ -118,7 +118,7 @@ export class UmbUserGroupWorkspaceEditorElement extends UmbLitElement { @@ -149,12 +149,12 @@ export class UmbUserGroupWorkspaceEditorElement extends UmbLitElement { #renderRightColumn() { return html`
- +
`; } diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace.context.ts index 2ae5dde3ab..6aa0697de1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user-group/workspace/user-group-workspace.context.ts @@ -1,23 +1,21 @@ -import { UmbUserGroupRepository } from '../repository/user-group.repository.js'; +import { UmbUserGroupDetailRepository } from '../repository/detail/index.js'; import { UmbUserRepository } from '../../user/repository/user.repository.js'; -import type { - UmbSaveableWorkspaceContextInterface} from '@umbraco-cms/backoffice/workspace'; -import { - UmbEditableWorkspaceContextBase, -} from '@umbraco-cms/backoffice/workspace'; -import type { UserGroupResponseModel } from '@umbraco-cms/backoffice/backend-api'; +import type { UmbUserGroupDetailModel } from '../types.js'; +import { UMB_USER_GROUP_ENTITY_TYPE } from '../entity.js'; +import type { UmbSaveableWorkspaceContextInterface } from '@umbraco-cms/backoffice/workspace'; +import { UmbEditableWorkspaceContextBase } from '@umbraco-cms/backoffice/workspace'; import { UmbArrayState, UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; export class UmbUserGroupWorkspaceContext - extends UmbEditableWorkspaceContextBase + extends UmbEditableWorkspaceContextBase implements UmbSaveableWorkspaceContextInterface { // - public readonly repository: UmbUserGroupRepository = new UmbUserGroupRepository(this); + public readonly repository: UmbUserGroupDetailRepository = new UmbUserGroupDetailRepository(this); - #data = new UmbObjectState(undefined); + #data = new UmbObjectState(undefined); data = this.#data.asObservable(); #userIds = new UmbArrayState([], (x) => x); @@ -34,43 +32,28 @@ export class UmbUserGroupWorkspaceContext async create() { const { data } = await this.repository.createScaffold(null); this.setIsNew(true); - // TODO: Should the data be the base model or the presentation model? - this.#data.setValue(data as unknown as UserGroupResponseModel); + this.#data.setValue(data); return { data }; } - async load(id: string) { - const { data } = await this.repository.requestById(id); + async load(unique: string) { + const { data } = await this.repository.requestByUnique(unique); if (data) { this.setIsNew(false); this.#data.update(data); } - - /* TODO: implement user selection for a user group - const { data: users } = await this.#userRepository.filterCollection({ - skip: 0, - take: 10000000, - userGroupIds: [id], - }); - - if (!users) return; - - const ids = users.items.map((user) => user.id ?? ''); - - this.#userIds.next(ids); - */ } - getEntityId(): string | undefined { - throw new Error('Method not implemented.'); + getEntityId() { + return this.getData()?.unique; } getEntityType(): string { - return 'user-group'; + return UMB_USER_GROUP_ENTITY_TYPE; } - getData(): UserGroupResponseModel | undefined { - throw new Error('Method not implemented.'); + getData() { + return this.#data.getValue(); } async save() { @@ -79,8 +62,8 @@ export class UmbUserGroupWorkspaceContext //TODO: Could we clean this code up? if (this.getIsNew()) { await this.repository.create(this.#data.value); - } else if (this.#data.value.id) { - await this.repository.save(this.#data.value.id, this.#data.value); + } else if (this.#data.value.unique) { + await this.repository.save(this.#data.value); } else return; //TODO: This next user-group section kinda works. But it will overwrite the entire user-group list on the user. @@ -89,7 +72,7 @@ export class UmbUserGroupWorkspaceContext //TODO: or the new user-group id needs to be removed from the existing list. const userIds = this.#userIds.getValue(); - const userGroupIds = [this.#data.getValue()?.id ?? '']; + const userGroupIds = [this.#data.getValue()?.unique ?? '']; if (userIds.length > 0 && userGroupIds.length > 0) { await this.#userRepository.setUserGroups(userIds, userGroupIds); @@ -107,7 +90,7 @@ export class UmbUserGroupWorkspaceContext await this.repository.delete(id); } - updateProperty(alias: Alias, value: UserGroupResponseModel[Alias]) { + updateProperty(alias: Alias, value: UmbUserGroupDetailModel[Alias]) { this.#data.update({ [alias]: value }); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/user-collection-header.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/user-collection-header.element.ts index 28e079b8fa..123ae1201e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/user-collection-header.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/user-collection-header.element.ts @@ -9,8 +9,10 @@ import { css, html, customElement, state, repeat, ifDefined } from '@umbraco-cms import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { UMB_DEFAULT_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; import type { UmbModalManagerContext } from '@umbraco-cms/backoffice/modal'; -import { UserOrderModel, UserStateModel } from '@umbraco-cms/backoffice/backend-api'; -import { UmbUserGroupCollectionRepository, UmbUserGroupDetailModel } from '@umbraco-cms/backoffice/user-group'; +import type { UserOrderModel } from '@umbraco-cms/backoffice/backend-api'; +import { UserStateModel } from '@umbraco-cms/backoffice/backend-api'; +import type { UmbUserGroupDetailModel } from '@umbraco-cms/backoffice/user-group'; +import { UmbUserGroupCollectionRepository } from '@umbraco-cms/backoffice/user-group'; @customElement('umb-user-collection-header') export class UmbUserCollectionHeaderElement extends UmbLitElement { @@ -20,9 +22,6 @@ export class UmbUserCollectionHeaderElement extends UmbLitElement { @state() private _stateFilterSelection: Array = []; - @state() - private _orderByOptions: Array = Object.values(UserOrderModel); - @state() private _orderBy?: UserOrderModel; @@ -109,18 +108,18 @@ export class UmbUserCollectionHeaderElement extends UmbLitElement { #onUserGroupFilterChange(event: UUIBooleanInputEvent) { const target = event.currentTarget as UUICheckboxElement; - const item = this._userGroups.find((group) => group.id === target.value); + const item = this._userGroups.find((group) => group.unique === target.value); if (!item) return; if (target.checked) { this._userGroupFilterSelection = [...this._userGroupFilterSelection, item]; } else { - this._userGroupFilterSelection = this._userGroupFilterSelection.filter((group) => group.id !== item.id); + this._userGroupFilterSelection = this._userGroupFilterSelection.filter((group) => group.unique !== item.unique); } - const ids = this._userGroupFilterSelection.map((group) => group.id!); - this.#collectionContext?.setUserGroupFilter(ids); + const uniques = this._userGroupFilterSelection.map((group) => group.unique); + this.#collectionContext?.setUserGroupFilter(uniques); } #getUserGroupFilterLabel() { @@ -183,11 +182,11 @@ export class UmbUserCollectionHeaderElement extends UmbLitElement {
${repeat( this._userGroups, - (group) => group.id, + (group) => group.unique, (group) => html` `, )} diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/views/table/user-table-collection-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/views/table/user-table-collection-view.element.ts index a07e5c51df..292f8397a1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/views/table/user-table-collection-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/views/table/user-table-collection-view.element.ts @@ -13,11 +13,11 @@ import type { } from '@umbraco-cms/backoffice/components'; import { UMB_DEFAULT_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { UmbUserGroupRepository } from '@umbraco-cms/backoffice/user-group'; +import type { UmbUserGroupItemModel } from '@umbraco-cms/backoffice/user-group'; +import { UmbUserGroupItemRepository } from '@umbraco-cms/backoffice/user-group'; import './column-layouts/name/user-table-name-column-layout.element.js'; import './column-layouts/status/user-table-status-column-layout.element.js'; -import type { UserGroupItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; @customElement('umb-user-table-collection-view') export class UmbUserTableCollectionViewElement extends UmbLitElement { @@ -52,9 +52,9 @@ export class UmbUserTableCollectionViewElement extends UmbLitElement { private _tableItems: Array = []; @state() - private _userGroupItems: Array = []; + private _userGroupItems: Array = []; - #UmbUserGroupRepository = new UmbUserGroupRepository(this); + #userGroupItemRepository = new UmbUserGroupItemRepository(this); @state() private _users: Array = []; @@ -87,8 +87,8 @@ export class UmbUserTableCollectionViewElement extends UmbLitElement { async #observeUserGroups() { if (this._users.length === 0) return; - const userGroupsIds = [...new Set(this._users.flatMap((user) => user.userGroupIds ?? []))]; - const { asObservable } = await this.#UmbUserGroupRepository.requestItems(userGroupsIds); + const userGroupsIds = [...new Set(this._users.flatMap((user) => user.userGroupIds))]; + const { asObservable } = await this.#userGroupItemRepository.requestItems(userGroupsIds); this.observe( asObservable(), (userGroups) => { @@ -99,10 +99,10 @@ export class UmbUserTableCollectionViewElement extends UmbLitElement { ); } - #getUserGroupNames(ids: Array) { - return ids - .map((id: string) => { - return this._userGroupItems.find((x) => x.id === id)?.name; + #getUserGroupNames(uniques: Array) { + return uniques + .map((unique: string) => { + return this._userGroupItems.find((x) => x.unique === unique)?.name; }) .join(', '); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/entity-actions/change-password/change-user-password.action.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/entity-actions/change-password/change-user-password.action.ts index 6409bc6eec..5981b76242 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/entity-actions/change-password/change-user-password.action.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/entity-actions/change-password/change-user-password.action.ts @@ -23,7 +23,9 @@ export class UmbChangeUserPasswordEntityAction extends UmbEntityActionBase