From 8b9da6ecd138de3da6ef01b24c9d1529cd529094 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 15 May 2024 12:29:20 +0200 Subject: [PATCH 01/15] new server models --- .../src/external/backend-api/src/models.ts | 59 ++++++++++++++----- .../src/external/backend-api/src/services.ts | 31 +++++++++- 2 files changed, 74 insertions(+), 16 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models.ts index da4e84c5d8..14ba6f5b36 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models.ts @@ -438,9 +438,9 @@ email: string userName: string name: string languageIsoCode?: string | null -documentStartNodeIds: Array +documentStartNodeIds: Array hasDocumentRootAccess: boolean -mediaStartNodeIds: Array +mediaStartNodeIds: Array hasMediaRootAccess: boolean avatarUrls: Array languages: Array @@ -541,11 +541,11 @@ icon?: string | null }; export type DeleteUserGroupsRequestModel = { - userGroupIds: Array + userGroupIds: Array }; export type DeleteUsersRequestModel = { - userIds: Array + userIds: Array }; export type DictionaryItemItemResponseModel = { @@ -577,7 +577,7 @@ export enum DirectionModel { } export type DisableUserRequestModel = { - userIds: Array + userIds: Array }; export type DocumentBlueprintItemResponseModel = { @@ -898,7 +898,7 @@ secret: string }; export type EnableUserRequestModel = { - userIds: Array + userIds: Array }; export enum EventMessageTypeModel { @@ -991,6 +991,15 @@ url?: string | null type?: string | null }; +export enum ImageCropModeModel { + CROP = 'Crop', + MAX = 'Max', + STRETCH = 'Stretch', + PAD = 'Pad', + BOX_PAD = 'BoxPad', + MIN = 'Min' +} + export type ImportDictionaryRequestModel = { temporaryFile: ReferenceByIdModel parent?: ReferenceByIdModel | null @@ -2268,7 +2277,7 @@ context: string }; export type UnlockUsersRequestModel = { - userIds: Array + userIds: Array }; export type UnpublishDocumentRequestModel = { @@ -2517,8 +2526,8 @@ permissions: Array -userGroupIds: Array + userIds: Array +userGroupIds: Array }; export type UpdateUserRequestModel = { @@ -2527,9 +2536,9 @@ userName: string name: string userGroupIds: Array languageIsoCode: string -documentStartNodeIds: Array +documentStartNodeIds: Array hasDocumentRootAccess: boolean -mediaStartNodeIds: Array +mediaStartNodeIds: Array hasMediaRootAccess: boolean }; @@ -2641,9 +2650,9 @@ name: string userGroupIds: Array id: string languageIsoCode?: string | null -documentStartNodeIds: Array +documentStartNodeIds: Array hasDocumentRootAccess: boolean -mediaStartNodeIds: Array +mediaStartNodeIds: Array hasMediaRootAccess: boolean avatarUrls: Array state: UserStateModel @@ -3510,6 +3519,26 @@ tree?: string } +export type ImagingData = { + + payloads: { + GetImagingResizeUrls: { + height?: number +id?: Array +mode?: ImageCropModeModel +width?: number + + }; + } + + + responses: { + GetImagingResizeUrls: Array + + } + + } + export type IndexerData = { payloads: { @@ -5015,12 +5044,12 @@ requestBody?: UpdateUserGroupRequestModel }; DeleteUserGroupByIdUsers: { id: string -requestBody?: Array +requestBody?: Array }; PostUserGroupByIdUsers: { id: string -requestBody?: Array +requestBody?: Array }; } diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services.ts index 84d88c42c7..797ead124c 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/services.ts @@ -1,7 +1,7 @@ import type { CancelablePromise } from './core/CancelablePromise'; import { OpenAPI } from './core/OpenAPI'; import { request as __request } from './core/request'; -import type { CultureData, DataTypeData, DictionaryData, DocumentBlueprintData, DocumentTypeData, DocumentVersionData, DocumentData, DynamicRootData, HealthCheckData, HelpData, IndexerData, InstallData, LanguageData, LogViewerData, ManifestData, MediaTypeData, MediaData, MemberGroupData, MemberTypeData, MemberData, ModelsBuilderData, ObjectTypesData, OembedData, PackageData, PartialViewData, PreviewData, ProfilingData, PropertyTypeData, PublishedCacheData, RedirectManagementData, RelationTypeData, RelationData, ScriptData, SearcherData, SecurityData, SegmentData, ServerData, StaticFileData, StylesheetData, TagData, TelemetryData, TemplateData, TemporaryFileData, UpgradeData, UserDataData, UserGroupData, UserData, WebhookData } from './models'; +import type { CultureData, DataTypeData, DictionaryData, DocumentBlueprintData, DocumentTypeData, DocumentVersionData, DocumentData, DynamicRootData, HealthCheckData, HelpData, ImagingData, IndexerData, InstallData, LanguageData, LogViewerData, ManifestData, MediaTypeData, MediaData, MemberGroupData, MemberTypeData, MemberData, ModelsBuilderData, ObjectTypesData, OembedData, PackageData, PartialViewData, PreviewData, ProfilingData, PropertyTypeData, PublishedCacheData, RedirectManagementData, RelationTypeData, RelationData, ScriptData, SearcherData, SecurityData, SegmentData, ServerData, StaticFileData, StylesheetData, TagData, TelemetryData, TemplateData, TemporaryFileData, UpgradeData, UserDataData, UserGroupData, UserData, WebhookData } from './models'; export class CultureService { @@ -2917,6 +2917,35 @@ baseUrl } +export class ImagingService { + + /** + * @returns unknown Success + * @throws ApiError + */ + public static getImagingResizeUrls(data: ImagingData['payloads']['GetImagingResizeUrls'] = {}): CancelablePromise { + const { + + id, +height, +width, +mode + } = data; + return __request(OpenAPI, { + method: 'GET', + url: '/umbraco/management/api/v1/imaging/resize/urls', + query: { + id, height, width, mode + }, + errors: { + 401: `The resource is protected and requires an authentication token`, + 403: `The authenticated user do not have access to this resource`, + }, + }); + } + +} + export class IndexerService { /** From a50b8fe1534f5ef4803c4814833a1e59b087d686 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 15 May 2024 12:40:39 +0200 Subject: [PATCH 02/15] update mappings --- .../src/mocks/data/user/user.data.ts | 4 ++-- .../user-collection.server.data-source.ts | 12 ++++++++-- .../detail/user-detail.server.data-source.ts | 24 +++++++++++++++---- .../disable-user.server.data-source.ts | 2 +- .../enable/enable-user.server.data-source.ts | 2 +- .../user-set-group.server.data-source.ts | 4 ++-- .../unlock/unlock-user.server.data-source.ts | 2 +- .../src/packages/user/user/types.ts | 5 ++-- 8 files changed, 40 insertions(+), 15 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.data.ts index 27b5ce7669..6235567f4e 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.data.ts @@ -31,9 +31,9 @@ export const data: Array = [ }, { id: '82e11d3d-b91d-43c9-9071-34d28e62e81d', - documentStartNodeIds: ['simple-document-id'], + documentStartNodeIds: [{ id: 'simple-document-id' }], hasDocumentRootAccess: true, - mediaStartNodeIds: ['f2f81a40-c989-4b6b-84e2-057cecd3adc1'], + mediaStartNodeIds: [{ id: 'f2f81a40-c989-4b6b-84e2-057cecd3adc1' }], hasMediaRootAccess: true, name: 'Amelie Walker', email: 'awalker1@domain.com', diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/repository/user-collection.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/repository/user-collection.server.data-source.ts index 61b063b3b2..4c4b14933a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/repository/user-collection.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/repository/user-collection.server.data-source.ts @@ -62,8 +62,16 @@ export class UmbUserCollectionServerDataSource implements UmbCollectionDataSourc userGroupUniques: item.userGroupIds, unique: item.id, languageIsoCode: item.languageIsoCode || null, - documentStartNodeUniques: item.documentStartNodeIds, - mediaStartNodeUniques: item.mediaStartNodeIds, + documentStartNodeUniques: item.documentStartNodeIds.map((node) => { + return { + unique: node.id, + }; + }), + mediaStartNodeUniques: item.mediaStartNodeIds.map((node) => { + return { + unique: node.id, + }; + }), hasDocumentRootAccess: item.hasDocumentRootAccess, hasMediaRootAccess: item.hasMediaRootAccess, avatarUrls: item.avatarUrls, diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/detail/user-detail.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/detail/user-detail.server.data-source.ts index b32acc6bcd..7ba56885e0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/detail/user-detail.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/detail/user-detail.server.data-source.ts @@ -78,7 +78,11 @@ export class UmbUserServerDataSource implements UmbDetailDataSource { + return { + unique: node.id, + }; + }), email: data.email, entityType: UMB_USER_ENTITY_TYPE, failedLoginAttempts: data.failedLoginAttempts, @@ -88,7 +92,11 @@ export class UmbUserServerDataSource implements UmbDetailDataSource { + return { + unique: node.id, + }; + }), name: data.name, state: data.state, unique: data.id, @@ -142,12 +150,20 @@ export class UmbUserServerDataSource implements UmbDetailDataSource { + return { + id: node.unique, + }; + }), email: model.email, hasDocumentRootAccess: model.hasDocumentRootAccess, hasMediaRootAccess: model.hasMediaRootAccess, languageIsoCode: model.languageIsoCode || '', - mediaStartNodeIds: model.mediaStartNodeUniques, + mediaStartNodeIds: model.mediaStartNodeUniques.map((node) => { + return { + id: node.unique, + }; + }), name: model.name, userGroupIds: model.userGroupUniques, userName: model.userName, diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/disable/disable-user.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/disable/disable-user.server.data-source.ts index 007d263760..37b6a6bc9f 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/disable/disable-user.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/disable/disable-user.server.data-source.ts @@ -33,7 +33,7 @@ export class UmbDisableUserServerDataSource implements UmbDisableUserDataSource this.#host, UserService.postUserDisable({ requestBody: { - userIds, + userIds: userIds.map((id) => ({ id })), }, }), ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/enable/enable-user.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/enable/enable-user.server.data-source.ts index 3db76ac1d2..d4674281ae 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/enable/enable-user.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/enable/enable-user.server.data-source.ts @@ -33,7 +33,7 @@ export class UmbEnableUserServerDataSource implements UmbEnableUserDataSource { this.#host, UserService.postUserEnable({ requestBody: { - userIds, + userIds: userIds.map((id) => ({ id })), }, }), ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/sources/user-set-group.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/sources/user-set-group.server.data-source.ts index 45ca8f6e5b..9a77a351c1 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/sources/user-set-group.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/sources/user-set-group.server.data-source.ts @@ -33,8 +33,8 @@ export class UmbUserSetGroupsServerDataSource { this.#host, UserService.postUserSetUserGroups({ requestBody: { - userIds, - userGroupIds, + userIds: userIds.map((id) => ({ id })), + userGroupIds: userGroupIds.map((id) => ({ id })), }, }), ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/unlock/unlock-user.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/unlock/unlock-user.server.data-source.ts index 8383b9154b..01aeb483b5 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/unlock/unlock-user.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/unlock/unlock-user.server.data-source.ts @@ -33,7 +33,7 @@ export class UmbUnlockUserServerDataSource implements UmbUnlockUserDataSource { this.#host, UserService.postUserUnlock({ requestBody: { - userIds, + userIds: userIds.map((id) => ({ id })), }, }), ); diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/types.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/types.ts index ef828645cb..eff7a183c4 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/types.ts @@ -1,4 +1,5 @@ import type { UmbUserEntityType } from './entity.js'; +import type { UmbReferenceByUnique } from '@umbraco-cms/backoffice/models'; import { UserStateModel, type UserTwoFactorProviderModel } from '@umbraco-cms/backoffice/external/backend-api'; export type UmbUserStateEnum = UserStateModel; @@ -7,7 +8,7 @@ export const UmbUserStateEnum = UserStateModel; export interface UmbUserDetailModel { avatarUrls: Array; createDate: string | null; - documentStartNodeUniques: Array; + documentStartNodeUniques: Array; email: string; entityType: UmbUserEntityType; failedLoginAttempts: number; @@ -18,7 +19,7 @@ export interface UmbUserDetailModel { lastLockoutDate: string | null; lastLoginDate: string | null; lastPasswordChangeDate: string | null; - mediaStartNodeUniques: Array; + mediaStartNodeUniques: Array; name: string; state: UmbUserStateEnum | null; unique: string; From f7f990923ca3190f50368dab5fe4183ad924019e Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 15 May 2024 12:43:32 +0200 Subject: [PATCH 03/15] update mappings --- .../repository/current-user.server.data-source.ts | 12 ++++++++++-- .../src/packages/user/current-user/types.ts | 5 +++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/repository/current-user.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/repository/current-user.server.data-source.ts index 60ec6d51c4..389d856f9a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/repository/current-user.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/repository/current-user.server.data-source.ts @@ -32,7 +32,11 @@ export class UmbCurrentUserServerDataSource { const user: UmbCurrentUserModel = { allowedSections: data.allowedSections, avatarUrls: data.avatarUrls, - documentStartNodeUniques: data.documentStartNodeIds, + documentStartNodeUniques: data.documentStartNodeIds.map((node) => { + return { + unique: node.id, + }; + }), email: data.email, fallbackPermissions: data.fallbackPermissions, hasAccessToAllLanguages: data.hasAccessToAllLanguages, @@ -41,7 +45,11 @@ export class UmbCurrentUserServerDataSource { isAdmin: data.isAdmin, languageIsoCode: data.languageIsoCode || 'en-us', // TODO: make global variable languages: data.languages, - mediaStartNodeUniques: data.mediaStartNodeIds, + mediaStartNodeUniques: data.mediaStartNodeIds.map((node) => { + return { + unique: node.id, + }; + }), name: data.name, permissions: data.permissions, unique: data.id, diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/types.ts b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/types.ts index e480087911..6a1363cc9a 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/current-user/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/current-user/types.ts @@ -5,11 +5,12 @@ import type { UnknownTypePermissionPresentationModel, UserTwoFactorProviderModel, } from '@umbraco-cms/backoffice/external/backend-api'; +import type { UmbReferenceByUnique } from '@umbraco-cms/backoffice/models'; export interface UmbCurrentUserModel { allowedSections: Array; avatarUrls: Array; - documentStartNodeUniques: Array; + documentStartNodeUniques: Array; email: string; fallbackPermissions: Array; hasAccessToAllLanguages: boolean; @@ -18,7 +19,7 @@ export interface UmbCurrentUserModel { isAdmin: boolean; languageIsoCode: string; languages: Array; - mediaStartNodeUniques: Array; + mediaStartNodeUniques: Array; name: string; permissions: Array; unique: string; From 1819f63e67c48800d66b515047ddd81c954aa585 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 15 May 2024 13:33:16 +0200 Subject: [PATCH 04/15] generate server models --- .../src/external/backend-api/src/models.ts | 8 ++++---- src/Umbraco.Web.UI.Client/src/packages/user/user/types.ts | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models.ts b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models.ts index 14ba6f5b36..554f627a7c 100644 --- a/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models.ts +++ b/src/Umbraco.Web.UI.Client/src/external/backend-api/src/models.ts @@ -403,7 +403,7 @@ export type CreateUserRequestModel = { email: string userName: string name: string -userGroupIds: Array +userGroupIds: Array id?: string | null }; @@ -1030,7 +1030,7 @@ export type InviteUserRequestModel = { email: string userName: string name: string -userGroupIds: Array +userGroupIds: Array id?: string | null message?: string | null }; @@ -2534,7 +2534,7 @@ export type UpdateUserRequestModel = { email: string userName: string name: string -userGroupIds: Array +userGroupIds: Array languageIsoCode: string documentStartNodeIds: Array hasDocumentRootAccess: boolean @@ -2647,7 +2647,7 @@ export type UserResponseModel = { email: string userName: string name: string -userGroupIds: Array +userGroupIds: Array id: string languageIsoCode?: string | null documentStartNodeIds: Array diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/types.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/types.ts index eff7a183c4..40c15cc643 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/types.ts @@ -24,7 +24,7 @@ export interface UmbUserDetailModel { state: UmbUserStateEnum | null; unique: string; updateDate: string | null; - userGroupUniques: Array; + userGroupUniques: Array; userName: string; } From 83e4d272a118e816bfb6e6ec9b34a69f5703dc8f Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 15 May 2024 13:40:02 +0200 Subject: [PATCH 05/15] update mapping --- .../src/mocks/data/user-group/user-group.db.ts | 4 ++-- .../detail/user-detail.server.data-source.ts | 18 +++++++++++++++--- .../user-workspace-assign-access.element.ts | 13 ++++++++++--- 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.db.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.db.ts index c6c9fc9bf5..250a6c5a02 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.db.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.db.ts @@ -39,9 +39,9 @@ export class UmbUserGroupMockDB extends UmbEntityMockDbBase): string[] { const sections = this.data - .filter((userGroup) => userGroupIds.includes(userGroup.id)) + .filter((userGroup) => userGroupIds.map((reference) => reference.id).includes(userGroup.id)) .map((userGroup) => (userGroup.sections?.length ? userGroup.sections : [])) .flat(); diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/detail/user-detail.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/detail/user-detail.server.data-source.ts index 7ba56885e0..93ab7446f6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/detail/user-detail.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/repository/detail/user-detail.server.data-source.ts @@ -101,7 +101,11 @@ export class UmbUserServerDataSource implements UmbDetailDataSource { + return { + unique: reference.id, + }; + }), userName: data.userName, }; @@ -121,7 +125,11 @@ export class UmbUserServerDataSource implements UmbDetailDataSource { + return { + id: reference.unique, + }; + }), userName: model.userName, }; @@ -165,7 +173,11 @@ export class UmbUserServerDataSource implements UmbDetailDataSource { + return { + id: reference.unique, + }; + }), userName: model.userName, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/components/user-workspace-assign-access/user-workspace-assign-access.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/components/user-workspace-assign-access/user-workspace-assign-access.element.ts index 4859421d47..c31530bc2d 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/components/user-workspace-assign-access/user-workspace-assign-access.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/components/user-workspace-assign-access/user-workspace-assign-access.element.ts @@ -7,6 +7,7 @@ import type { UmbInputDocumentElement } from '@umbraco-cms/backoffice/document'; import type { UmbInputMediaElement } from '@umbraco-cms/backoffice/media'; import type { UmbUserGroupInputElement } from '@umbraco-cms/backoffice/user-group'; import type { UUIBooleanInputEvent } from '@umbraco-cms/backoffice/external/uui'; +import { UmbReferenceByUnique } from '@umbraco-cms/backoffice/models'; const elementName = 'umb-user-workspace-assign-access'; @customElement(elementName) @@ -69,7 +70,9 @@ export class UmbUserWorkspaceAssignAccessElement extends UmbLitElement { #onUserGroupsChange(event: CustomEvent) { event.stopPropagation(); const target = event.target as UmbUserGroupInputElement; - const selection = target.selection; + const selection: Array = target.selection.map((unique) => { + return { unique }; + }); // TODO make contexts method this.#workspaceContext?.updateProperty('userGroupUniques', selection); } @@ -85,7 +88,9 @@ export class UmbUserWorkspaceAssignAccessElement extends UmbLitElement { #onDocumentStartNodeChange(event: CustomEvent) { event.stopPropagation(); const target = event.target as UmbInputDocumentElement; - const selection = target.selection; + const selection: Array = target.selection.map((unique) => { + return { unique }; + }); // TODO make contexts method this.#workspaceContext?.updateProperty('documentStartNodeUniques', selection); } @@ -101,7 +106,9 @@ export class UmbUserWorkspaceAssignAccessElement extends UmbLitElement { #onMediaStartNodeChange(event: CustomEvent) { event.stopPropagation(); const target = event.target as UmbInputMediaElement; - const selection = target.selection; + const selection: Array = target.selection.map((unique) => { + return { unique }; + }); // TODO make contexts method this.#workspaceContext?.updateProperty('mediaStartNodeUniques', selection); } From 9c958ffae08f76eff3cc632e017b97592648fbb0 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 15 May 2024 13:40:09 +0200 Subject: [PATCH 06/15] update mocks --- .../src/mocks/data/user/user.data.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.data.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.data.ts index 6235567f4e..ddbd634a65 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.data.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.data.ts @@ -24,7 +24,7 @@ export const data: Array = [ updateDate: '2/10/2022', createDate: '3/13/2022', failedLoginAttempts: 946, - userGroupIds: ['user-group-administrators-id', 'user-group-editors-id'], + userGroupIds: [{ id: 'user-group-administrators-id' }, { id: 'user-group-editors-id' }], userName: '', avatarUrls: [], isAdmin: true, @@ -45,7 +45,7 @@ export const data: Array = [ updateDate: '2023-10-12T18:30:32.879Z', createDate: '2023-10-12T18:30:32.879Z', failedLoginAttempts: 0, - userGroupIds: ['user-group-administrators-id'], + userGroupIds: [{ id: 'user-group-administrators-id' }], userName: '', avatarUrls: [], isAdmin: true, @@ -66,7 +66,7 @@ export const data: Array = [ updateDate: '2023-10-12T18:30:32.879Z', createDate: '2023-10-12T18:30:32.879Z', failedLoginAttempts: 0, - userGroupIds: ['user-group-editors-id'], + userGroupIds: [{ id: 'user-group-editors-id' }], userName: '', avatarUrls: [], isAdmin: false, @@ -87,7 +87,7 @@ export const data: Array = [ updateDate: '2023-10-12T18:30:32.879Z', createDate: '2023-10-12T18:30:32.879Z', failedLoginAttempts: 0, - userGroupIds: ['user-group-editors-id'], + userGroupIds: [{ id: 'user-group-editors-id' }], userName: '', avatarUrls: [], isAdmin: false, @@ -108,7 +108,7 @@ export const data: Array = [ updateDate: '2023-10-12T18:30:32.879Z', createDate: '2023-10-12T18:30:32.879Z', failedLoginAttempts: 25, - userGroupIds: ['user-group-editors-id', 'user-group-sensitive-data-id'], + userGroupIds: [{ id: 'user-group-editors-id' }, { id: 'user-group-sensitive-data-id' }], userName: '', avatarUrls: [], isAdmin: false, From 3a530480ca67139a72e533d83022a4cb6d097f09 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 15 May 2024 13:46:49 +0200 Subject: [PATCH 07/15] update mapping --- .../user-collection.server.data-source.ts | 6 +++++- .../table/user-table-collection-view.element.ts | 13 ++++++++----- .../user/modals/create/create-user-modal.element.ts | 7 +++++-- 3 files changed, 18 insertions(+), 8 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/repository/user-collection.server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/repository/user-collection.server.data-source.ts index 4c4b14933a..447159adc0 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/repository/user-collection.server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/repository/user-collection.server.data-source.ts @@ -59,7 +59,11 @@ export class UmbUserCollectionServerDataSource implements UmbCollectionDataSourc email: item.email, userName: item.userName, name: item.name, - userGroupUniques: item.userGroupIds, + userGroupUniques: item.userGroupIds.map((reference) => { + return { + unique: reference.id, + }; + }), unique: item.id, languageIsoCode: item.languageIsoCode || null, documentStartNodeUniques: item.documentStartNodeIds.map((node) => { 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 8b93ced715..b2eab75172 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 @@ -15,6 +15,7 @@ import { UMB_COLLECTION_CONTEXT } from '@umbraco-cms/backoffice/collection'; import { UmbLitElement } from '@umbraco-cms/backoffice/lit-element'; import type { UmbUserGroupItemModel } from '@umbraco-cms/backoffice/user-group'; import { UmbUserGroupItemRepository } from '@umbraco-cms/backoffice/user-group'; +import type { UmbReferenceByUnique } from '@umbraco-cms/backoffice/models'; import './column-layouts/name/user-table-name-column-layout.element.js'; import './column-layouts/status/user-table-status-column-layout.element.js'; @@ -87,7 +88,9 @@ export class UmbUserTableCollectionViewElement extends UmbLitElement { async #observeUserGroups() { if (this._users.length === 0) return; - const userGroupsUniques = [...new Set(this._users.flatMap((user) => user.userGroupUniques))]; + const userGroupsUniques = [ + ...new Set(this._users.flatMap((user) => user.userGroupUniques.map((reference) => reference.unique))), + ]; const { asObservable } = await this.#userGroupItemRepository.requestItems(userGroupsUniques); this.observe( asObservable(), @@ -99,10 +102,10 @@ export class UmbUserTableCollectionViewElement extends UmbLitElement { ); } - #getUserGroupNames(uniques: Array) { - return uniques - .map((unique: string) => { - return this._userGroupItems.find((x) => x.unique === unique)?.name; + #getUserGroupNames(references: Array) { + return references + .map((reference) => { + return this._userGroupItems.find((x) => x.unique === reference.unique)?.name; }) .join(', '); } diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/modals/create/create-user-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/modals/create/create-user-modal.element.ts index 0f0d7ac088..84a721a1ae 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/modals/create/create-user-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/modals/create/create-user-modal.element.ts @@ -4,6 +4,7 @@ import type { UmbUserGroupInputElement } from '@umbraco-cms/backoffice/user-grou import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { css, html, customElement, query } from '@umbraco-cms/backoffice/external/lit'; import { UmbModalBaseElement, UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; +import { UmbReferenceByUnique } from '@umbraco-cms/backoffice/models'; @customElement('umb-create-user-modal') export class UmbCreateUserModalElement extends UmbModalBaseElement { @@ -27,7 +28,9 @@ export class UmbCreateUserModalElement extends UmbModalBaseElement { const email = formData.get('email') as string; const userGroupPicker = form.querySelector('#userGroups') as UmbUserGroupInputElement; - const userGroups = userGroupPicker?.selection; + const userGroupReferences: Array = userGroupPicker?.selection.map((unique) => { + return { unique }; + }); const { data: userScaffold } = await this.#userDetailRepository.createScaffold(); if (!userScaffold) return; @@ -35,7 +38,7 @@ export class UmbCreateUserModalElement extends UmbModalBaseElement { userScaffold.name = name; userScaffold.email = email; userScaffold.userName = email; - userScaffold.userGroupUniques = userGroups; + userScaffold.userGroupUniques = userGroupReferences; // TODO: figure out when to use email or username const { data } = await this.#userDetailRepository.create(userScaffold); From edf5815c5392d8a7f1879bbeb1bbe5d5c0a8c357 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 15 May 2024 13:48:57 +0200 Subject: [PATCH 08/15] Update user-grid-collection-view.element.ts --- .../collection/views/grid/user-grid-collection-view.element.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/views/grid/user-grid-collection-view.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/views/grid/user-grid-collection-view.element.ts index 9c17e7d784..eaa00e61ee 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/views/grid/user-grid-collection-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/collection/views/grid/user-grid-collection-view.element.ts @@ -137,7 +137,7 @@ export class UmbUserGridCollectionViewElement extends UmbLitElement { #renderUserGroupNames(user: UmbUserDetailModel) { const userGroupNames = this.#userGroups - .filter((userGroup) => user.userGroupUniques?.includes(userGroup.unique)) + .filter((userGroup) => user.userGroupUniques?.map((reference) => reference.unique).includes(userGroup.unique)) .map((userGroup) => userGroup.name) .join(', '); From e6559c3215866bcb958dc659021bd35d50bbb86c Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 15 May 2024 13:57:41 +0200 Subject: [PATCH 09/15] map invite request --- .../user/invite/modal/invite/user-invite-modal.element.ts | 5 ++++- .../user/invite/repository/invite-user-server.data-source.ts | 4 +++- .../src/packages/user/user/invite/repository/types.ts | 3 ++- 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/modal/invite/user-invite-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/modal/invite/user-invite-modal.element.ts index 948f6b99d9..f79fbb282c 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/modal/invite/user-invite-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/modal/invite/user-invite-modal.element.ts @@ -3,6 +3,7 @@ import { UmbInviteUserRepository } from '../../repository/invite-user.repository import { css, html, customElement } from '@umbraco-cms/backoffice/external/lit'; import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { UmbModalBaseElement } from '@umbraco-cms/backoffice/modal'; +import type { UmbReferenceByUnique } from '@umbraco-cms/backoffice/models'; @customElement('umb-invite-user-modal') export class UmbInviteUserModalElement extends UmbModalBaseElement { @@ -24,7 +25,9 @@ export class UmbInviteUserModalElement extends UmbModalBaseElement { //TODO: How should we handle pickers forms? const userGroupPicker = form.querySelector('#userGroups') as UmbUserGroupInputElement; - const userGroupUniques = userGroupPicker?.selection; + const userGroupUniques: Array = userGroupPicker?.selection.map((unique) => { + return { unique }; + }); const message = formData.get('message') as string; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/repository/invite-user-server.data-source.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/repository/invite-user-server.data-source.ts index f78309c6c5..0e2cdcdce6 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/repository/invite-user-server.data-source.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/repository/invite-user-server.data-source.ts @@ -35,7 +35,9 @@ export class UmbInviteUserServerDataSource implements UmbInviteUserDataSource { email: request.email, userName: request.userName, name: request.name, - userGroupIds: request.userGroupUniques, + userGroupIds: request.userGroupUniques.map((reference) => { + return { id: reference.unique }; + }), message: request.message, }; diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/repository/types.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/repository/types.ts index 6f21c4c7d6..f85302e24e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/repository/types.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/invite/repository/types.ts @@ -1,4 +1,5 @@ import type { UmbUserDetailModel } from '../../types.js'; +import type { UmbReferenceByUnique } from '@umbraco-cms/backoffice/models'; import type { UmbDataSourceResponse, UmbDataSourceErrorResponse } from '@umbraco-cms/backoffice/repository'; export interface UmbInviteUserDataSource { @@ -10,7 +11,7 @@ export interface UmbInviteUserRequestModel { email: string; userName: string; name: string; - userGroupUniques: Array; + userGroupUniques: Array; message: string | null; } From 9ec3eb46f9b8034bf816c50a5c9421db5aa6c9b8 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 15 May 2024 13:58:31 +0200 Subject: [PATCH 10/15] Update user.db.ts --- src/Umbraco.Web.UI.Client/src/mocks/data/user/user.db.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.db.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.db.ts index f414e6bc65..1725d64d10 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.db.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.db.ts @@ -38,7 +38,8 @@ class UmbUserMockDB extends UmbEntityMockDbBase { * @memberof UmbUserData */ setUserGroups(data: UpdateUserGroupsOnUserRequestModel): void { - const users = this.data.filter((user) => data.userIds?.includes(user.id ?? '')); + const users = this.data.filter((user) => data.userIds?.map((reference) => reference.id).includes(user.id)); + users.forEach((user) => { user.userGroupIds = data.userGroupIds; }); @@ -209,7 +210,7 @@ const createMockMapper = (item: CreateUserRequestModel): UmbMockUserModel => { lastLoginDate: null, lastLockoutDate: null, lastPasswordChangeDate: null, - isAdmin: item.userGroupIds.includes(umbUserGroupMockDb.getAll()[0].id), + isAdmin: item.userGroupIds.map((reference) => reference.id).includes(umbUserGroupMockDb.getAll()[0].id), }; }; From a7c3ed1851b13b662fa55cf757b152d268963fcc Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 15 May 2024 13:59:52 +0200 Subject: [PATCH 11/15] fixing mock data --- .../src/mocks/data/user-group/user-group.db.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.db.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.db.ts index 250a6c5a02..e7583a88a7 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.db.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.db.ts @@ -27,10 +27,10 @@ export class UmbUserGroupMockDB extends UmbEntityMockDbBase, ): Array { const permissions = this.data - .filter((userGroup) => userGroupIds.includes(userGroup.id)) + .filter((userGroup) => userGroupIds.map((reference) => reference.id).includes(userGroup.id)) .map((userGroup) => (userGroup.permissions?.length ? userGroup.permissions : [])) .flat(); From 3c831d1c26b240b07affadf23e24e672fa5e6b29 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 15 May 2024 14:07:26 +0200 Subject: [PATCH 12/15] add type --- .../src/mocks/data/user/user.db.ts | 21 ++++++++++++++----- .../mocks/handlers/user/filter.handlers.ts | 2 +- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.db.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.db.ts index 1725d64d10..b30b8cc216 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.db.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.db.ts @@ -17,11 +17,22 @@ import type { } from '@umbraco-cms/backoffice/external/backend-api'; import { UserStateModel } from '@umbraco-cms/backoffice/external/backend-api'; -const userGroupFilter = (filterOptions: any, item: UmbMockUserModel) => +interface UserFilterOptions { + skip: number; + take: number; + orderBy: string; + orderDirection: string; + userGroupIds: Array<{ id: string }>; + userStates: Array; + filter: string; +} + +const userGroupFilter = (filterOptions: UserFilterOptions, item: UmbMockUserModel) => arrayFilter(filterOptions.userGroupIds, item.userGroupIds); -const userStateFilter = (filterOptions: any, item: UmbMockUserModel) => +const userStateFilter = (filterOptions: UserFilterOptions, item: UmbMockUserModel) => stringFilter(filterOptions.userStates, item.state); -const userQueryFilter = (filterOptions: any, item: UmbMockUserModel) => queryFilter(filterOptions.filter, item.name); +const userQueryFilter = (filterOptions: UserFilterOptions, item: UmbMockUserModel) => + queryFilter(filterOptions.filter, item.name); // Temp mocked database class UmbUserMockDB extends UmbEntityMockDbBase { @@ -155,10 +166,10 @@ class UmbUserMockDB extends UmbEntityMockDbBase { return { userId: newUserId }; } - filter(options: any): PagedUserResponseModel { + filter(options: UserFilterOptions): PagedUserResponseModel { const allItems = this.getAll(); - const filterOptions = { + const filterOptions: UserFilterOptions = { skip: options.skip || 0, take: options.take || 25, orderBy: options.orderBy || 'name', diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/filter.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/filter.handlers.ts index 8d078cfb57..f01d2922a3 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/filter.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user/filter.handlers.ts @@ -13,7 +13,7 @@ export const handlers = [ const userStates = req.url.searchParams.getAll('userStates'); const filter = req.url.searchParams.get('filter'); - const options = { + const options: any = { skip: skip || undefined, take: take || undefined, orderBy: orderBy || undefined, From 3a3cfb085fb6f98e192b93d78a6aeb9acb3fc8d1 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 15 May 2024 14:19:23 +0200 Subject: [PATCH 13/15] add user group filter mocks --- .../mocks/data/user-group/user-group.db.ts | 28 +++++++++++++++++++ .../handlers/user-group/filter.handlers.ts | 21 ++++++++++++++ .../src/mocks/handlers/user-group/index.ts | 3 +- 3 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 src/Umbraco.Web.UI.Client/src/mocks/handlers/user-group/filter.handlers.ts diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.db.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.db.ts index e7583a88a7..60d8f4fbf2 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.db.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/user-group/user-group.db.ts @@ -1,3 +1,4 @@ +import { queryFilter } from '../utils.js'; import { UmbEntityMockDbBase } from '../utils/entity/entity-base.js'; import { UmbMockEntityDetailManager } from '../utils/entity/entity-detail.manager.js'; import { UmbMockEntityItemManager } from '../utils/entity/entity-item.manager.js'; @@ -6,12 +7,22 @@ import { data } from './user-group.data.js'; import type { CreateUserGroupRequestModel, DocumentPermissionPresentationModel, + PagedUserGroupResponseModel, UnknownTypePermissionPresentationModel, UserGroupItemResponseModel, UserGroupResponseModel, } from '@umbraco-cms/backoffice/external/backend-api'; import { UmbId } from '@umbraco-cms/backoffice/id'; +interface UserGroupFilterOptions { + skip: number; + take: number; + filter: string; +} + +const userGroupQueryFilter = (filterOptions: UserGroupFilterOptions, item: UmbMockUserGroupModel) => + queryFilter(filterOptions.filter, item.name); + export class UmbUserGroupMockDB extends UmbEntityMockDbBase { item = new UmbMockEntityItemManager(this, itemMapper); detail = new UmbMockEntityDetailManager(this, createMockMapper, detailResponseMapper); @@ -48,6 +59,23 @@ export class UmbUserGroupMockDB extends UmbEntityMockDbBase userGroupQueryFilter(filterOptions, item)); + const totalItems = filteredItems.length; + + const paginatedItems = filteredItems.slice(filterOptions.skip, filterOptions.skip + filterOptions.take); + + return { total: totalItems, items: paginatedItems }; + } } const itemMapper = (item: UmbMockUserGroupModel): UserGroupItemResponseModel => { diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user-group/filter.handlers.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user-group/filter.handlers.ts new file mode 100644 index 0000000000..931b80e094 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user-group/filter.handlers.ts @@ -0,0 +1,21 @@ +const { rest } = window.MockServiceWorker; +import { umbUserGroupMockDb } from '../../data/user-group/user-group.db.js'; +import { UMB_SLUG } from './slug.js'; +import { umbracoPath } from '@umbraco-cms/backoffice/utils'; + +export const handlers = [ + rest.get(umbracoPath(`/filter${UMB_SLUG}`), (req, res, ctx) => { + const skip = Number(req.url.searchParams.get('skip')); + const take = Number(req.url.searchParams.get('take')); + const filter = req.url.searchParams.get('filter'); + + const options: any = { + skip: skip || undefined, + take: take || undefined, + filter: filter || undefined, + }; + + const response = umbUserGroupMockDb.filter(options); + return res(ctx.status(200), ctx.json(response)); + }), +]; diff --git a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user-group/index.ts b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user-group/index.ts index 8432caafdd..aa9f26c37e 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/handlers/user-group/index.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/handlers/user-group/index.ts @@ -1,4 +1,5 @@ import { detailHandlers } from './detail.handlers.js'; import { itemHandlers } from './item.handlers.js'; +import { handlers as filterHandlers } from './filter.handlers.js'; -export const handlers = [...itemHandlers, ...detailHandlers]; +export const handlers = [...itemHandlers, ...filterHandlers, ...detailHandlers]; From 2c6abfa6861fe21ccf9f516b8e55d7b05ccc49c6 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 15 May 2024 14:36:48 +0200 Subject: [PATCH 14/15] add filter to handle object arrays --- src/Umbraco.Web.UI.Client/src/mocks/data/user/user.db.ts | 4 ++-- src/Umbraco.Web.UI.Client/src/mocks/data/utils.ts | 9 +++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.db.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.db.ts index b30b8cc216..2333106580 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.db.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/user/user.db.ts @@ -1,5 +1,5 @@ import { umbUserGroupMockDb } from '../user-group/user-group.db.js'; -import { arrayFilter, stringFilter, queryFilter } from '../utils.js'; +import { arrayFilter, stringFilter, queryFilter, objectArrayFilter } from '../utils.js'; import { UmbEntityMockDbBase } from '../utils/entity/entity-base.js'; import { UmbMockEntityItemManager } from '../utils/entity/entity-item.manager.js'; import { UmbMockEntityDetailManager } from '../utils/entity/entity-detail.manager.js'; @@ -28,7 +28,7 @@ interface UserFilterOptions { } const userGroupFilter = (filterOptions: UserFilterOptions, item: UmbMockUserModel) => - arrayFilter(filterOptions.userGroupIds, item.userGroupIds); + objectArrayFilter(filterOptions.userGroupIds, item.userGroupIds, 'id'); const userStateFilter = (filterOptions: UserFilterOptions, item: UmbMockUserModel) => stringFilter(filterOptions.userStates, item.state); const userQueryFilter = (filterOptions: UserFilterOptions, item: UmbMockUserModel) => diff --git a/src/Umbraco.Web.UI.Client/src/mocks/data/utils.ts b/src/Umbraco.Web.UI.Client/src/mocks/data/utils.ts index 1635df1b75..7b2536ef50 100644 --- a/src/Umbraco.Web.UI.Client/src/mocks/data/utils.ts +++ b/src/Umbraco.Web.UI.Client/src/mocks/data/utils.ts @@ -7,11 +7,20 @@ export const arrayFilter = (filterBy: Array, value?: Array): boo return filterBy.some((filterValue: string) => value?.includes(filterValue)); }; +export const objectArrayFilter = (filterBy: Array, value: Array, key: string): boolean => { + if (!filterBy || !value) { + return true; + } + + return value.map((value) => value[key]).some((value: any) => filterBy.includes(value)); +}; + export const stringFilter = (filterBy: Array, value?: string): boolean => { // if a filter is not set, return all items if (!filterBy || !value) { return true; } + return filterBy.includes(value); }; From b96037607fcec5ee15944261bb23e8c929536bf8 Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Wed, 15 May 2024 14:43:37 +0200 Subject: [PATCH 15/15] add type to imports --- .../user/user/modals/create/create-user-modal.element.ts | 2 +- .../user-workspace-assign-access.element.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/modals/create/create-user-modal.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/modals/create/create-user-modal.element.ts index 84a721a1ae..e162a7e88b 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/modals/create/create-user-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/modals/create/create-user-modal.element.ts @@ -4,7 +4,7 @@ import type { UmbUserGroupInputElement } from '@umbraco-cms/backoffice/user-grou import { UmbTextStyles } from '@umbraco-cms/backoffice/style'; import { css, html, customElement, query } from '@umbraco-cms/backoffice/external/lit'; import { UmbModalBaseElement, UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal'; -import { UmbReferenceByUnique } from '@umbraco-cms/backoffice/models'; +import type { UmbReferenceByUnique } from '@umbraco-cms/backoffice/models'; @customElement('umb-create-user-modal') export class UmbCreateUserModalElement extends UmbModalBaseElement { diff --git a/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/components/user-workspace-assign-access/user-workspace-assign-access.element.ts b/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/components/user-workspace-assign-access/user-workspace-assign-access.element.ts index c31530bc2d..3ff486de9e 100644 --- a/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/components/user-workspace-assign-access/user-workspace-assign-access.element.ts +++ b/src/Umbraco.Web.UI.Client/src/packages/user/user/workspace/components/user-workspace-assign-access/user-workspace-assign-access.element.ts @@ -7,7 +7,7 @@ import type { UmbInputDocumentElement } from '@umbraco-cms/backoffice/document'; import type { UmbInputMediaElement } from '@umbraco-cms/backoffice/media'; import type { UmbUserGroupInputElement } from '@umbraco-cms/backoffice/user-group'; import type { UUIBooleanInputEvent } from '@umbraco-cms/backoffice/external/uui'; -import { UmbReferenceByUnique } from '@umbraco-cms/backoffice/models'; +import type { UmbReferenceByUnique } from '@umbraco-cms/backoffice/models'; const elementName = 'umb-user-workspace-assign-access'; @customElement(elementName)