From f7f2da7659cc3c8f0cc563daa6c94924ab7536ba Mon Sep 17 00:00:00 2001 From: Mads Rasmussen Date: Tue, 2 May 2023 11:04:52 +0200 Subject: [PATCH] Chore: Cleanup of Generic models lib (#681) * move collection filter model to collection lib * move temp member type details * move temp user group details model * move user details model out of models lib * move document blue print out of models * fix import paths * use relative import paths * move member details out of models * move more models out of core models file * fix import path * Prefix * remove entity type * add null check * typescript fixes * move tree interfaces to tree lib * fix import order --------- Co-authored-by: Nathan Woulfe --- .../collection-filter-model.interface.ts | 5 + .../libs/collection/collection.context.ts | 4 +- .../libs/collection/index.ts | 1 + .../token/entity-workspace-context.token.ts | 4 +- .../libs/modal/modal.interfaces.ts | 4 +- .../token/user-group-picker-modal.token.ts | 12 +- .../libs/models/index.ts | 119 +----------------- .../repository/tree-repository.interface.ts | 2 +- .../libs/section/section.context.ts | 3 - src/Umbraco.Web.UI.Client/libs/tree/index.ts | 14 +++ .../workspace/context/workspace-context.ts | 4 +- .../document-blueprint.detail.store.ts | 2 +- .../documents/document-blueprints/types.ts | 11 ++ .../repository/media-type.detail.store.ts | 2 +- .../repository/media-type.repository.ts | 2 +- .../sources/media-type.detail.server.data.ts | 2 +- ...edia-type.details.server.data.interface.ts | 2 +- .../src/backoffice/media/media-types/types.ts | 7 ++ .../workspace/media-type-workspace.context.ts | 2 +- .../repository/member-group.repository.ts | 2 +- .../repository/member-group.store.ts | 2 +- .../member-group.detail.server.data.ts | 2 +- .../backoffice/members/member-groups/types.ts | 5 + .../member-group-workspace-edit.element.ts | 4 +- .../member-group-workspace.context.ts | 2 +- ...orkspace-view-member-group-info.element.ts | 6 +- .../repository/member-type.repository.ts | 2 +- .../repository/member-type.store.ts | 2 +- .../sources/member-type.detail.server.data.ts | 2 +- .../backoffice/members/member-types/types.ts | 7 ++ .../members/members/member.detail.store.ts | 4 +- .../members/repository/member.store.ts | 2 +- .../src/backoffice/members/members/types.ts | 5 + .../workspace/member-workspace.context.ts | 2 +- ...installed-packages-section-view.element.ts | 2 +- .../packages/repository/package.store.ts | 2 +- .../src/backoffice/packages/types.ts | 9 ++ .../input-color-picker.element.ts | 8 +- .../input-list-base/input-list-base.ts | 4 +- ...property-editor-ui-color-picker.element.ts | 6 +- .../repository/stylesheet.repository.ts | 2 +- .../current-user-header-app.element.ts | 8 +- .../users/current-user/current-user.store.ts | 4 +- .../current-user-modal.element.ts | 4 +- .../backoffice/users/current-user/types.ts | 22 ++++ .../user-profile-app-profile.element.ts | 4 +- .../src/backoffice/users/index.ts | 1 + .../users/user-groups/components/index.ts | 1 + .../input-user-group.element.ts | 20 ++- .../input-user-group.stories.ts | 0 .../input-user-group/input-user-group.test.ts | 0 .../src/backoffice/users/user-groups/index.ts | 1 + .../user-group-picker-modal.element.ts | 4 +- .../repository/user-group.store.ts | 13 +- .../src/backoffice/users/user-groups/types.ts | 13 ++ .../user-group-workspace-edit.element.ts | 2 +- .../workspace/user-group-workspace.context.ts | 2 +- .../workspace-view-user-groups.element.ts | 8 +- .../user-table-collection-view.element.ts | 6 +- .../create-user/create-user-modal.element.ts | 2 +- .../invite-user/invite-user-modal.element.ts | 2 +- .../src/backoffice/users/users/types.ts | 1 + .../workspace/user-workspace-edit.element.ts | 3 +- .../users/workspace/user-workspace.element.ts | 2 +- .../src/core/mocks/data/data-type.data.ts | 15 ++- .../mocks/data/document-blueprint.data.ts | 2 +- .../src/core/mocks/data/entity-tree.data.ts | 52 ++++++++ .../src/core/mocks/data/entity.data.ts | 70 +++-------- .../src/core/mocks/data/media-type.data.ts | 2 +- .../src/core/mocks/data/media.data.ts | 7 ++ .../src/core/mocks/data/member-group.data.ts | 2 +- .../src/core/mocks/data/member-type.data.ts | 2 +- .../src/core/mocks/data/member.data.ts | 2 +- .../src/core/mocks/data/user-groups.data.ts | 12 +- .../core/mocks/domains/manifests.handlers.ts | 2 +- .../mocks/domains/user-groups.handlers.ts | 10 +- .../src/core/mocks/domains/users.handlers.ts | 84 ------------- .../core/modal/modal-element-picker-base.ts | 23 ++-- src/Umbraco.Web.UI.Client/tsconfig.json | 4 + .../web-test-runner.config.mjs | 4 + 80 files changed, 297 insertions(+), 403 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/libs/collection/collection-filter-model.interface.ts create mode 100644 src/Umbraco.Web.UI.Client/libs/tree/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/documents/document-blueprints/types.ts create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/types.ts create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/types.ts create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/types.ts create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/members/members/types.ts create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/packages/types.ts create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/types.ts create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/components/index.ts rename src/Umbraco.Web.UI.Client/src/backoffice/{shared => users/user-groups}/components/input-user-group/input-user-group.element.ts (86%) rename src/Umbraco.Web.UI.Client/src/backoffice/{shared => users/user-groups}/components/input-user-group/input-user-group.stories.ts (100%) rename src/Umbraco.Web.UI.Client/src/backoffice/{shared => users/user-groups}/components/input-user-group/input-user-group.test.ts (100%) create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/index.ts create mode 100644 src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/types.ts create mode 100644 src/Umbraco.Web.UI.Client/src/core/mocks/data/entity-tree.data.ts diff --git a/src/Umbraco.Web.UI.Client/libs/collection/collection-filter-model.interface.ts b/src/Umbraco.Web.UI.Client/libs/collection/collection-filter-model.interface.ts new file mode 100644 index 0000000000..4f3c2f915b --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/collection/collection-filter-model.interface.ts @@ -0,0 +1,5 @@ +export interface UmbCollectionFilterModel { + skip?: number; + take?: number; + filter?: string; +} diff --git a/src/Umbraco.Web.UI.Client/libs/collection/collection.context.ts b/src/Umbraco.Web.UI.Client/libs/collection/collection.context.ts index 6f0ae47adc..7c50ee9451 100644 --- a/src/Umbraco.Web.UI.Client/libs/collection/collection.context.ts +++ b/src/Umbraco.Web.UI.Client/libs/collection/collection.context.ts @@ -8,10 +8,10 @@ import { } from '@umbraco-cms/backoffice/observable-api'; import { umbExtensionsRegistry, createExtensionClass } from '@umbraco-cms/backoffice/extensions-api'; import { UmbCollectionRepository } from '@umbraco-cms/backoffice/repository'; -import type { UmbFilterModel } from '@umbraco-cms/backoffice/models'; +import type { UmbCollectionFilterModel } from '@umbraco-cms/backoffice/collection'; // TODO: Clean up the need for store as Media has switched to use Repositories(repository). -export class UmbCollectionContext { +export class UmbCollectionContext { private _host: UmbControllerHostElement; private _entityType: string | null; diff --git a/src/Umbraco.Web.UI.Client/libs/collection/index.ts b/src/Umbraco.Web.UI.Client/libs/collection/index.ts index 7dc5e58379..764134199c 100644 --- a/src/Umbraco.Web.UI.Client/libs/collection/index.ts +++ b/src/Umbraco.Web.UI.Client/libs/collection/index.ts @@ -1 +1,2 @@ export * from './collection.context'; +export * from './collection-filter-model.interface'; diff --git a/src/Umbraco.Web.UI.Client/libs/context-api/token/entity-workspace-context.token.ts b/src/Umbraco.Web.UI.Client/libs/context-api/token/entity-workspace-context.token.ts index 52a66be29b..b112693baf 100644 --- a/src/Umbraco.Web.UI.Client/libs/context-api/token/entity-workspace-context.token.ts +++ b/src/Umbraco.Web.UI.Client/libs/context-api/token/entity-workspace-context.token.ts @@ -1,7 +1,7 @@ import { UmbEntityWorkspaceContextInterface } from '../../workspace/context/workspace-entity-context.interface'; import { UmbContextToken } from './context-token'; -import type { BaseEntity } from '@umbraco-cms/backoffice/models'; +import type { UmbEntityBase } from '@umbraco-cms/backoffice/models'; -export const UMB_ENTITY_WORKSPACE_CONTEXT = new UmbContextToken>( +export const UMB_ENTITY_WORKSPACE_CONTEXT = new UmbContextToken>( 'UmbEntityWorkspaceContext' ); diff --git a/src/Umbraco.Web.UI.Client/libs/modal/modal.interfaces.ts b/src/Umbraco.Web.UI.Client/libs/modal/modal.interfaces.ts index a31868a946..bcc2f9ad6d 100644 --- a/src/Umbraco.Web.UI.Client/libs/modal/modal.interfaces.ts +++ b/src/Umbraco.Web.UI.Client/libs/modal/modal.interfaces.ts @@ -1,9 +1,9 @@ export interface UmbPickerModalData { multiple: boolean; - selection: Array; + selection: Array; filter?: (item: T) => boolean; } export interface UmbPickerModalResult { - selection: Array; + selection: Array; } diff --git a/src/Umbraco.Web.UI.Client/libs/modal/token/user-group-picker-modal.token.ts b/src/Umbraco.Web.UI.Client/libs/modal/token/user-group-picker-modal.token.ts index 4264345e24..f378843285 100644 --- a/src/Umbraco.Web.UI.Client/libs/modal/token/user-group-picker-modal.token.ts +++ b/src/Umbraco.Web.UI.Client/libs/modal/token/user-group-picker-modal.token.ts @@ -1,10 +1,6 @@ -import type { UserDetails } from '@umbraco-cms/backoffice/models'; import { UmbModalToken, UmbPickerModalData } from '@umbraco-cms/backoffice/modal'; -export const UMB_USER_GROUP_PICKER_MODAL = new UmbModalToken>( - 'Umb.Modal.UserGroupPicker', - { - type: 'sidebar', - size: 'small', - } -); +export const UMB_USER_GROUP_PICKER_MODAL = new UmbModalToken>('Umb.Modal.UserGroupPicker', { + type: 'sidebar', + size: 'small', +}); diff --git a/src/Umbraco.Web.UI.Client/libs/models/index.ts b/src/Umbraco.Web.UI.Client/libs/models/index.ts index 4b16ebba15..d2fccc54c2 100644 --- a/src/Umbraco.Web.UI.Client/libs/models/index.ts +++ b/src/Umbraco.Web.UI.Client/libs/models/index.ts @@ -1,131 +1,16 @@ -import type { - EntityTreeItemResponseModel, - FolderTreeItemResponseModel, - PackageManifestResponseModel, -} from '@umbraco-cms/backoffice/backend-api'; - // eslint-disable-next-line @typescript-eslint/no-explicit-any export type HTMLElementConstructor = new (...args: any[]) => T; // eslint-disable-next-line @typescript-eslint/no-explicit-any export type ClassConstructor = new (...args: any[]) => T; -// Users -// TODO: would the right name be Node? as entity is just something with a Key. But node is something in a content structure, aka. with hasChildren and parentId. -export interface Entity { - id: string; - name: string; - icon: string; - type: string; - hasChildren: boolean; - parentId: string | null; -} - /** Tried to find a common base of our entities — used by Entity Workspace Context */ -export type BaseEntity = { +export type UmbEntityBase = { id?: string; - //alias?: string; name?: string; - //icon?: string; - //properties?: Array; }; -export interface UserEntity extends Entity { - type: 'user'; -} - -export type UserStatus = 'enabled' | 'inactive' | 'invited' | 'disabled'; -export interface UserDetails extends UserEntity { - email: string; - status: UserStatus; - language: string; - lastLoginDate?: string; - lastLockoutDate?: string; - lastPasswordChangeDate?: string; - updateDate: string; - createDate: string; - failedLoginAttempts: number; - userGroups: Array; - contentStartNodes: Array; - mediaStartNodes: Array; -} - -export interface UserGroupEntity extends Entity { - type: 'user-group'; -} - -export interface UserGroupDetails extends UserGroupEntity { - sections: Array; - contentStartNode?: string; - mediaStartNode?: string; - permissions: Array; -} - -// TODO: Make sure Entity Type/interface. -export interface MemberTypeDetails extends EntityTreeItemResponseModel { - id: string; // TODO: Remove this when the backend is fixed - alias: string; - properties: []; -} - -// Media Types - -export interface MediaTypeDetails extends FolderTreeItemResponseModel { - id: string; // TODO: Remove this when the backend is fixed - alias: string; - properties: []; -} - -// Member Groups -export interface MemberGroupDetails extends EntityTreeItemResponseModel { - id: string; // TODO: Remove this when the backend is fixed -} - -export interface MemberDetails extends EntityTreeItemResponseModel { - id: string; // TODO: Remove this when the backend is fixed -} - -// Document Blueprint -export interface DocumentBlueprintDetails { - id: string; - name: string; - type: 'document-blueprint'; - properties: Array; - data: Array; - icon: string; - documentTypeKey: string; -} - -export interface SwatchDetails { +export interface UmbSwatchDetails { label: string; value: string; } - -export type UmbPackage = PackageManifestResponseModel; - -export type PackageManifestResponse = UmbPackage[]; - -export type UmbPackageWithMigrationStatus = UmbPackage & { - hasPendingMigrations: boolean; -}; - -export interface UmbFilterModel { - skip?: number; - take?: number; - filter?: string; -} - -export interface UmbTreeRootModel { - type: string; - name: string; - hasChildren: boolean; - icon?: string; -} - -export interface UmbTreeRootEntityModel extends UmbTreeRootModel { - id: string | null; -} - -export interface UmbTreeRootFileSystemModel extends UmbTreeRootModel { - path: string | null; -} diff --git a/src/Umbraco.Web.UI.Client/libs/repository/tree-repository.interface.ts b/src/Umbraco.Web.UI.Client/libs/repository/tree-repository.interface.ts index c267d1730a..edb3221f33 100644 --- a/src/Umbraco.Web.UI.Client/libs/repository/tree-repository.interface.ts +++ b/src/Umbraco.Web.UI.Client/libs/repository/tree-repository.interface.ts @@ -1,6 +1,6 @@ import type { Observable } from 'rxjs'; +import type { UmbTreeRootEntityModel, UmbTreeRootModel } from '@umbraco-cms/backoffice/tree'; import { ProblemDetailsModel, TreeItemPresentationModel } from '@umbraco-cms/backoffice/backend-api'; -import type { UmbTreeRootEntityModel, UmbTreeRootModel } from '@umbraco-cms/backoffice/models'; export interface UmbPagedData { total: number; diff --git a/src/Umbraco.Web.UI.Client/libs/section/section.context.ts b/src/Umbraco.Web.UI.Client/libs/section/section.context.ts index 805092697b..1102488443 100644 --- a/src/Umbraco.Web.UI.Client/libs/section/section.context.ts +++ b/src/Umbraco.Web.UI.Client/libs/section/section.context.ts @@ -1,10 +1,7 @@ import type { ManifestSection } from '@umbraco-cms/backoffice/extensions-registry'; -import type { Entity } from '@umbraco-cms/backoffice/models'; import { UmbStringState } from '@umbraco-cms/backoffice/observable-api'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; -export type ActiveTreeItemType = Entity | undefined; - export class UmbSectionContext { #manifestAlias = new UmbStringState(undefined); #manifestPathname = new UmbStringState(undefined); diff --git a/src/Umbraco.Web.UI.Client/libs/tree/index.ts b/src/Umbraco.Web.UI.Client/libs/tree/index.ts new file mode 100644 index 0000000000..dcf04e2366 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/libs/tree/index.ts @@ -0,0 +1,14 @@ +export interface UmbTreeRootModel { + type: string; + name: string; + hasChildren: boolean; + icon?: string; +} + +export interface UmbTreeRootEntityModel extends UmbTreeRootModel { + id: string | null; +} + +export interface UmbTreeRootFileSystemModel extends UmbTreeRootModel { + path: string | null; +} diff --git a/src/Umbraco.Web.UI.Client/libs/workspace/context/workspace-context.ts b/src/Umbraco.Web.UI.Client/libs/workspace/context/workspace-context.ts index 91d1f863c7..f3113768f9 100644 --- a/src/Umbraco.Web.UI.Client/libs/workspace/context/workspace-context.ts +++ b/src/Umbraco.Web.UI.Client/libs/workspace/context/workspace-context.ts @@ -2,14 +2,14 @@ import { UmbEntityWorkspaceContextInterface } from './workspace-entity-context.i import { UmbContextProviderController, UMB_ENTITY_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/context-api'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbBooleanState } from '@umbraco-cms/backoffice/observable-api'; -import type { BaseEntity } from '@umbraco-cms/backoffice/models'; +import type { UmbEntityBase } from '@umbraco-cms/backoffice/models'; /* TODO: We need to figure out if we like to keep using same alias for all workspace contexts. If so we need to align on a interface that all of these implements. otherwise consumers cant trust the workspace-context. */ -export abstract class UmbWorkspaceContext +export abstract class UmbWorkspaceContext implements UmbEntityWorkspaceContextInterface { public host: UmbControllerHostElement; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-blueprints/document-blueprint.detail.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-blueprints/document-blueprint.detail.store.ts index d7efe4701c..60379060ea 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-blueprints/document-blueprint.detail.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-blueprints/document-blueprint.detail.store.ts @@ -1,4 +1,4 @@ -import type { DocumentBlueprintDetails } from '@umbraco-cms/backoffice/models'; +import type { DocumentBlueprintDetails } from './types'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { UmbArrayState } from '@umbraco-cms/backoffice/observable-api'; import { UmbStoreBase } from '@umbraco-cms/backoffice/store'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-blueprints/types.ts b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-blueprints/types.ts new file mode 100644 index 0000000000..6a7b8c2fbb --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/documents/document-blueprints/types.ts @@ -0,0 +1,11 @@ +// Document Blueprint + +export interface DocumentBlueprintDetails { + id: string; + name: string; + type: 'document-blueprint'; + properties: Array; + data: Array; + icon: string; + documentTypeKey: string; +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/media-type.detail.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/media-type.detail.store.ts index e258ca33cf..0cb76d18c8 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/media-type.detail.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/media-type.detail.store.ts @@ -1,8 +1,8 @@ +import type { MediaTypeDetails } from '../types'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { UmbStoreBase } from '@umbraco-cms/backoffice/store'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbArrayState } from '@umbraco-cms/backoffice/observable-api'; -import type { MediaTypeDetails } from '@umbraco-cms/backoffice/models'; /** * @export diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/media-type.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/media-type.repository.ts index dda6267aa8..6ba912bb89 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/media-type.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/media-type.repository.ts @@ -1,10 +1,10 @@ +import type { MediaTypeDetails } from '../types'; import { UmbMediaTypeTreeStore, UMB_MEDIA_TYPE_TREE_STORE_CONTEXT_TOKEN } from './media-type.tree.store'; import { UmbMediaTypeDetailServerDataSource } from './sources/media-type.detail.server.data'; import { UmbMediaTypeStore, UMB_MEDIA_TYPE_STORE_CONTEXT_TOKEN } from './media-type.detail.store'; import { UmbMediaTypeTreeServerDataSource } from './sources/media-type.tree.server.data'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; -import type { MediaTypeDetails } from '@umbraco-cms/backoffice/models'; import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; import { UmbTreeRepository, UmbTreeDataSource } from '@umbraco-cms/backoffice/repository'; import { EntityTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/sources/media-type.detail.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/sources/media-type.detail.server.data.ts index c305dde0c0..c577ea6ec3 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/sources/media-type.detail.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/sources/media-type.detail.server.data.ts @@ -1,6 +1,6 @@ +import type { MediaTypeDetails } from '../../types'; import { MediaTypeDetailDataSource } from './media-type.details.server.data.interface'; import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; -import type { MediaTypeDetails } from '@umbraco-cms/backoffice/models'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; /** diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/sources/media-type.details.server.data.interface.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/sources/media-type.details.server.data.interface.ts index 7da7f1a9b2..535592c31b 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/sources/media-type.details.server.data.interface.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/repository/sources/media-type.details.server.data.interface.ts @@ -1,4 +1,4 @@ -import type { MediaTypeDetails } from '@umbraco-cms/backoffice/models'; +import type { MediaTypeDetails } from '../../types'; import type { DataSourceResponse } from '@umbraco-cms/backoffice/repository'; // TODO => Use models when they exist diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/types.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/types.ts new file mode 100644 index 0000000000..85e668234e --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/types.ts @@ -0,0 +1,7 @@ +import { FolderTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; + +export interface MediaTypeDetails extends FolderTreeItemResponseModel { + id: string; // TODO: Remove this when the backend is fixed + alias: string; + properties: []; +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/workspace/media-type-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/workspace/media-type-workspace.context.ts index 642a52ce13..2e579bca20 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/workspace/media-type-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/media/media-types/workspace/media-type-workspace.context.ts @@ -1,8 +1,8 @@ import { UmbMediaTypeRepository } from '../repository/media-type.repository'; +import type { MediaTypeDetails } from '../types'; import { UmbEntityWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; -import type { MediaTypeDetails } from '@umbraco-cms/backoffice/models'; type EntityType = MediaTypeDetails; export class UmbWorkspaceMediaTypeContext diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/member-group.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/member-group.repository.ts index a0c0c3075c..7d19336711 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/member-group.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/member-group.repository.ts @@ -1,3 +1,4 @@ +import type { MemberGroupDetails } from '../types'; import { UmbMemberGroupTreeStore, UMB_MEMBER_GROUP_TREE_STORE_CONTEXT_TOKEN } from './member-group.tree.store'; import { UmbMemberGroupDetailServerDataSource } from './sources/member-group.detail.server.data'; import { UmbMemberGroupStore, UMB_MEMBER_GROUP_STORE_CONTEXT_TOKEN } from './member-group.store'; @@ -5,7 +6,6 @@ import { UmbMemberGroupTreeServerDataSource } from './sources/member-group.tree. import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; -import type { MemberGroupDetails } from '@umbraco-cms/backoffice/models'; import type { UmbTreeDataSource, UmbDetailRepository, UmbTreeRepository } from '@umbraco-cms/backoffice/repository'; import { EntityTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/member-group.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/member-group.store.ts index f5175b7168..029486ae40 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/member-group.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/member-group.store.ts @@ -1,4 +1,4 @@ -import type { MemberGroupDetails } from '@umbraco-cms/backoffice/models'; +import type { MemberGroupDetails } from '../types'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { UmbArrayState } from '@umbraco-cms/backoffice/observable-api'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/sources/member-group.detail.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/sources/member-group.detail.server.data.ts index 89c7ee4775..a0c862a2c5 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/sources/member-group.detail.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/repository/sources/member-group.detail.server.data.ts @@ -1,6 +1,6 @@ +import type { MemberGroupDetails } from '../../types'; import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; -import type { MemberGroupDetails } from '@umbraco-cms/backoffice/models'; import { UmbDataSource } from '@umbraco-cms/backoffice/repository'; /** diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/types.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/types.ts new file mode 100644 index 0000000000..9fc89986e2 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/types.ts @@ -0,0 +1,5 @@ +import { EntityTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; + +export interface MemberGroupDetails extends EntityTreeItemResponseModel { + id: string; // TODO: Remove this when the backend is fixed +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/workspace/member-group-workspace-edit.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/workspace/member-group-workspace-edit.element.ts index 1d87666038..964bf53538 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/workspace/member-group-workspace-edit.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/workspace/member-group-workspace-edit.element.ts @@ -2,9 +2,9 @@ import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { css, html } from 'lit'; import { customElement, state } from 'lit/decorators.js'; import { UUIInputElement, UUIInputEvent } from '@umbraco-ui/uui'; +import type { MemberGroupDetails } from '../types'; import { UmbWorkspaceMemberGroupContext } from './member-group-workspace.context'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import type { MemberGroupDetails } from '@umbraco-cms/backoffice/models'; import { UMB_ENTITY_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/context-api'; /** @@ -13,8 +13,6 @@ import { UMB_ENTITY_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/context-ap */ @customElement('umb-member-group-workspace-edit') export class UmbMemberGroupWorkspaceEditElement extends UmbLitElement { - - #workspaceContext?: UmbWorkspaceMemberGroupContext; @state() diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/workspace/member-group-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/workspace/member-group-workspace.context.ts index fee370fcf1..612695ce0d 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/workspace/member-group-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/workspace/member-group-workspace.context.ts @@ -1,6 +1,6 @@ import { UmbMemberGroupRepository } from '../repository/member-group.repository'; +import type { MemberGroupDetails } from '../types'; import { UmbEntityWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; -import type { MemberGroupDetails } from '@umbraco-cms/backoffice/models'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/workspace/views/info/workspace-view-member-group-info.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/workspace/views/info/workspace-view-member-group-info.element.ts index 121ffa67f4..7ef7baa0c9 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/workspace/views/info/workspace-view-member-group-info.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-groups/workspace/views/info/workspace-view-member-group-info.element.ts @@ -2,14 +2,12 @@ import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { css, html } from 'lit'; import { customElement, state } from 'lit/decorators.js'; import { UmbWorkspaceMemberGroupContext } from '../../member-group-workspace.context'; -import type { MemberGroupDetails } from '@umbraco-cms/backoffice/models'; +import type { MemberGroupDetails } from '../../../types'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { UMB_ENTITY_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/context-api'; @customElement('umb-workspace-view-member-group-info') export class UmbWorkspaceViewMemberGroupInfoElement extends UmbLitElement { - - @state() private _memberGroup?: MemberGroupDetails; @@ -58,7 +56,7 @@ export class UmbWorkspaceViewMemberGroupInfoElement extends UmbLitElement { render() { return html` ${this._renderMemberGroupInfo()}${this._renderGeneralInfo()} `; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/member-type.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/member-type.repository.ts index 44274b0d07..9cf1b99e2c 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/member-type.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/member-type.repository.ts @@ -1,3 +1,4 @@ +import type { MemberTypeDetails } from '../types'; import { UmbMemberTypeTreeServerDataSource } from './sources/member-type.tree.server.data'; import { UmbMemberTypeTreeStore, UMB_MEMBER_TYPE_TREE_STORE_CONTEXT_TOKEN } from './member-type.tree.store'; import { UmbMemberTypeStore, UMB_MEMBER_TYPE_STORE_CONTEXT_TOKEN } from './member-type.store'; @@ -6,7 +7,6 @@ import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; import { UmbTreeDataSource, UmbDetailRepository, UmbTreeRepository } from '@umbraco-cms/backoffice/repository'; import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/notification'; -import type { MemberTypeDetails } from '@umbraco-cms/backoffice/models'; import { EntityTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; // TODO => use correct type when available diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/member-type.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/member-type.store.ts index 6c7e895e6a..a5b1edd2bc 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/member-type.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/member-type.store.ts @@ -1,8 +1,8 @@ +import type { MemberTypeDetails } from '../types'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { UmbStoreBase } from '@umbraco-cms/backoffice/store'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbArrayState } from '@umbraco-cms/backoffice/observable-api'; -import type { MemberTypeDetails } from '@umbraco-cms/backoffice/models'; /** * @export diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/sources/member-type.detail.server.data.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/sources/member-type.detail.server.data.ts index 2359904e2e..657864c8ec 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/sources/member-type.detail.server.data.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/repository/sources/member-type.detail.server.data.ts @@ -1,6 +1,6 @@ +import type { MemberTypeDetails } from '../../types'; import type { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { tryExecuteAndNotify } from '@umbraco-cms/backoffice/resources'; -import type { MemberTypeDetails } from '@umbraco-cms/backoffice/models'; import { UmbDataSource } from '@umbraco-cms/backoffice/repository'; /** diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/types.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/types.ts new file mode 100644 index 0000000000..7171aa0b4a --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/member-types/types.ts @@ -0,0 +1,7 @@ +import type { EntityTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; + +export interface MemberTypeDetails extends EntityTreeItemResponseModel { + id: string; // TODO: Remove this when the backend is fixed + alias: string; + properties: []; +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/member.detail.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/member.detail.store.ts index 95520e4d2b..77f778d939 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/member.detail.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/member.detail.store.ts @@ -1,6 +1,6 @@ import { Observable } from 'rxjs'; import { umbMemberData } from '../../../core/mocks/data/member.data'; -import type { MemberDetails, MemberGroupDetails } from '@umbraco-cms/backoffice/models'; +import type { MemberDetails } from './types'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { UmbArrayState, createObservablePart } from '@umbraco-cms/backoffice/observable-api'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; @@ -27,7 +27,7 @@ export class UmbMemberStore extends UmbStoreBase implements UmbEntityDetailStore * @return {*} {(Observable)} * @memberof UmbMemberStore */ - getByKey(id: string): Observable { + getByKey(id: string): Observable { // tryExecuteAndNotify(this.host, MemberResource.getMemberByKey({ id })).then(({ data }) => { // if (data) {} // this.#data.appendOne(data); diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/member.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/member.store.ts index 49a7339a76..2cbad03734 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/member.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/repository/member.store.ts @@ -1,8 +1,8 @@ +import type { MemberDetails } from '../types'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { UmbStoreBase } from '@umbraco-cms/backoffice/store'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbArrayState } from '@umbraco-cms/backoffice/observable-api'; -import type { MemberDetails } from '@umbraco-cms/backoffice/models'; /** * @export diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/types.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/types.ts new file mode 100644 index 0000000000..f4b03017ed --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/types.ts @@ -0,0 +1,5 @@ +import type { EntityTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; + +export interface MemberDetails extends EntityTreeItemResponseModel { + id: string; // TODO: Remove this when the backend is fixed +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/workspace/member-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/workspace/member-workspace.context.ts index 3bdc4b5402..701d5e66f6 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/members/members/workspace/member-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/members/members/workspace/member-workspace.context.ts @@ -1,6 +1,6 @@ import { UmbMemberRepository } from '../repository/member.repository'; +import type { MemberDetails } from '../types'; import { UmbEntityWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; -import type { MemberDetails } from '@umbraco-cms/backoffice/models'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; export class UmbMemberWorkspaceContext diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/installed/installed-packages-section-view.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/installed/installed-packages-section-view.element.ts index 87b152a156..0851bf17c6 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/installed/installed-packages-section-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/packages/package-section/views/installed/installed-packages-section-view.element.ts @@ -4,8 +4,8 @@ import { repeat } from 'lit/directives/repeat.js'; import { combineLatest } from 'rxjs'; import { UUITextStyles } from '@umbraco-ui/uui-css'; import { UmbPackageRepository } from '../../../repository/package.repository'; +import type { UmbPackageWithMigrationStatus } from '../../../types'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import type { UmbPackageWithMigrationStatus } from '@umbraco-cms/backoffice/models'; import './installed-packages-section-view-item.element'; import { UmbSectionViewExtensionElement } from '@umbraco-cms/backoffice/extensions-registry'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/packages/repository/package.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/packages/repository/package.store.ts index 13a9ce6aa9..7a7cf0ff19 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/packages/repository/package.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/packages/repository/package.store.ts @@ -1,8 +1,8 @@ import { ReplaySubject } from 'rxjs'; +import type { UmbPackage } from '../types'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbStoreBase } from '@umbraco-cms/backoffice/store'; -import type { UmbPackage } from '@umbraco-cms/backoffice/models'; import type { PackageMigrationStatusResponseModel } from '@umbraco-cms/backoffice/backend-api'; import type { ManifestBase } from '@umbraco-cms/backoffice/extensions-registry'; import { UmbArrayState } from '@umbraco-cms/backoffice/observable-api'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/packages/types.ts b/src/Umbraco.Web.UI.Client/src/backoffice/packages/types.ts new file mode 100644 index 0000000000..7fc91fa1ee --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/packages/types.ts @@ -0,0 +1,9 @@ +import { PackageManifestResponseModel } from '@umbraco-cms/backoffice/backend-api'; + +export type UmbPackage = PackageManifestResponseModel; + +export type PackageManifestResponse = UmbPackage[]; + +export type UmbPackageWithMigrationStatus = UmbPackage & { + hasPendingMigrations: boolean; +}; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-color-picker/input-color-picker.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-color-picker/input-color-picker.element.ts index 0c4d71f981..8546bcf864 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-color-picker/input-color-picker.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-color-picker/input-color-picker.element.ts @@ -4,7 +4,7 @@ import { customElement, property } from 'lit/decorators.js'; import { FormControlMixin } from '@umbraco-ui/uui-base/lib/mixins'; import { UUIColorSwatchesEvent } from '@umbraco-ui/uui'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import type { SwatchDetails } from '@umbraco-cms/backoffice/models'; +import type { UmbSwatchDetails } from '@umbraco-cms/backoffice/models'; /* * This wraps the UUI library uui-color-swatches component @@ -12,13 +12,11 @@ import type { SwatchDetails } from '@umbraco-cms/backoffice/models'; */ @customElement('umb-input-color-picker') export class UmbInputColorPickerElement extends FormControlMixin(UmbLitElement) { - - @property({ type: Boolean }) showLabels = false; @property() - swatches?: SwatchDetails[]; + swatches?: UmbSwatchDetails[]; constructor() { super(); @@ -48,7 +46,7 @@ export class UmbInputColorPickerElement extends FormControlMixin(UmbLitElement) .showLabel=${this.showLabels}>`; })}`; } - + static styles = [UUITextStyles]; } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-list-base/input-list-base.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-list-base/input-list-base.ts index 2128b126e5..8d5208dc37 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-list-base/input-list-base.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-list-base/input-list-base.ts @@ -45,13 +45,13 @@ export class UmbInputListBaseElement extends UmbLitElement { modalHandler?.onSubmit().then((data: UmbPickerModalData) => { if (data) { - this.value = data.selection; + this.value = data.selection.filter((id) => id !== null && id !== undefined) as Array; this.selectionUpdated(); } }); } - protected removeFromSelection(id: string) { + protected removeFromSelection(id?: string | null) { this.value = this.value.filter((k) => k !== id); this.selectionUpdated(); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/color-picker/property-editor-ui-color-picker.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/color-picker/property-editor-ui-color-picker.element.ts index d860a60012..354b032f7c 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/color-picker/property-editor-ui-color-picker.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/shared/property-editors/uis/color-picker/property-editor-ui-color-picker.element.ts @@ -5,15 +5,13 @@ import { UUIColorSwatchesEvent } from '@umbraco-ui/uui'; import { UmbPropertyEditorExtensionElement } from '@umbraco-cms/backoffice/extensions-registry'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import type { DataTypePropertyPresentationModel } from '@umbraco-cms/backoffice/backend-api'; -import type { SwatchDetails } from '@umbraco-cms/backoffice/models'; +import type { UmbSwatchDetails } from '@umbraco-cms/backoffice/models'; /** * @element umb-property-editor-ui-color-picker */ @customElement('umb-property-editor-ui-color-picker') export class UmbPropertyEditorUIColorPickerElement extends UmbLitElement implements UmbPropertyEditorExtensionElement { - - @property() value = ''; @@ -21,7 +19,7 @@ export class UmbPropertyEditorUIColorPickerElement extends UmbLitElement impleme private _showLabels = false; @state() - private _swatches: SwatchDetails[] = []; + private _swatches: UmbSwatchDetails[] = []; @property({ type: Array, attribute: false }) public set config(config: Array) { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/repository/stylesheet.repository.ts b/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/repository/stylesheet.repository.ts index f1a29007ce..4795b97862 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/repository/stylesheet.repository.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/templating/stylesheets/repository/stylesheet.repository.ts @@ -6,7 +6,7 @@ import { UmbNotificationContext, UMB_NOTIFICATION_CONTEXT_TOKEN } from '@umbraco import { UmbContextConsumerController } from '@umbraco-cms/backoffice/context-api'; import { UmbTreeRepository } from '@umbraco-cms/backoffice/repository'; import { FileSystemTreeItemPresentationModel } from '@umbraco-cms/backoffice/backend-api'; -import type { UmbTreeRootFileSystemModel } from '@umbraco-cms/backoffice/models'; +import type { UmbTreeRootFileSystemModel } from '@umbraco-cms/backoffice/tree'; export class UmbStylesheetRepository implements UmbTreeRepository diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/current-user-header-app.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/current-user-header-app.element.ts index 2462854ed5..b0d44f1d4e 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/current-user-header-app.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/current-user-header-app.element.ts @@ -1,17 +1,15 @@ import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { css, CSSResultGroup, html } from 'lit'; import { customElement, state } from 'lit/decorators.js'; +import type { UmbLoggedInUser } from './types'; import { UmbCurrentUserStore, UMB_CURRENT_USER_STORE_CONTEXT_TOKEN } from './current-user.store'; -import type { UserDetails } from '@umbraco-cms/backoffice/models'; import { UmbModalContext, UMB_MODAL_CONTEXT_TOKEN, UMB_CURRENT_USER_MODAL } from '@umbraco-cms/backoffice/modal'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-current-user-header-app') export class UmbCurrentUserHeaderAppElement extends UmbLitElement { - - @state() - private _currentUser?: UserDetails; + private _currentUser?: UmbLoggedInUser; private _currentUserStore?: UmbCurrentUserStore; private _modalContext?: UmbModalContext; @@ -48,7 +46,7 @@ export class UmbCurrentUserHeaderAppElement extends UmbLitElement { `; } - + static styles: CSSResultGroup = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/current-user.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/current-user.store.ts index e693f62bc0..53665ae826 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/current-user.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/current-user.store.ts @@ -1,10 +1,10 @@ -import type { UserDetails } from '@umbraco-cms/backoffice/models'; +import type { UmbLoggedInUser } from './types'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { UmbObjectState } from '@umbraco-cms/backoffice/observable-api'; export const UMB_CURRENT_USER_STORE_CONTEXT_TOKEN = new UmbContextToken('UmbCurrentUserStore'); export class UmbCurrentUserStore { - #currentUser = new UmbObjectState(undefined); + #currentUser = new UmbObjectState(undefined); public readonly currentUser = this.#currentUser.asObservable(); } diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/modals/current-user/current-user-modal.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/modals/current-user/current-user-modal.element.ts index 7e1a194704..cd0cc5a770 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/modals/current-user/current-user-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/modals/current-user/current-user-modal.element.ts @@ -2,8 +2,8 @@ import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { css, CSSResultGroup, html } from 'lit'; import { customElement, property, state } from 'lit/decorators.js'; import { UmbCurrentUserStore, UMB_CURRENT_USER_STORE_CONTEXT_TOKEN } from '../../current-user.store'; +import type { UmbLoggedInUser } from '../../types'; import { UmbModalHandler } from '@umbraco-cms/backoffice/modal'; -import type { UserDetails } from '@umbraco-cms/backoffice/models'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-current-user-modal') @@ -12,7 +12,7 @@ export class UmbCurrentUserModalElement extends UmbLitElement { modalHandler?: UmbModalHandler; @state() - private _currentUser?: UserDetails; + private _currentUser?: UmbLoggedInUser; private _currentUserStore?: UmbCurrentUserStore; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/types.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/types.ts new file mode 100644 index 0000000000..adfe453bf4 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/types.ts @@ -0,0 +1,22 @@ +import type { UmbEntityBase } from '@umbraco-cms/backoffice/models'; + +export interface UserEntity extends UmbEntityBase { + type: 'user'; +} + +export type UserStatus = 'enabled' | 'inactive' | 'invited' | 'disabled'; + +export interface UmbLoggedInUser extends UserEntity { + email: string; + status: UserStatus; + language: string; + lastLoginDate?: string; + lastLockoutDate?: string; + lastPasswordChangeDate?: string; + updateDate: string; + createDate: string; + failedLoginAttempts: number; + userGroups: Array; + contentStartNodes: Array; + mediaStartNodes: Array; +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/user-profile-apps/user-profile-app-profile.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/user-profile-apps/user-profile-app-profile.element.ts index c13879a26b..09273f5e23 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/user-profile-apps/user-profile-app-profile.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/current-user/user-profile-apps/user-profile-app-profile.element.ts @@ -2,14 +2,14 @@ import { css, html } from 'lit'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { customElement, state } from 'lit/decorators.js'; import { UmbCurrentUserStore, UMB_CURRENT_USER_STORE_CONTEXT_TOKEN } from '../current-user.store'; +import type { UmbLoggedInUser } from '../types'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import type { UserDetails } from '@umbraco-cms/backoffice/models'; import { UmbModalContext, UMB_CHANGE_PASSWORD_MODAL, UMB_MODAL_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/modal'; @customElement('umb-user-profile-app-profile') export class UmbUserProfileAppProfileElement extends UmbLitElement { @state() - private _currentUser?: UserDetails; + private _currentUser?: UmbLoggedInUser; private _modalContext?: UmbModalContext; private _currentUserStore?: UmbCurrentUserStore; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/index.ts index 5beff8aad8..9d0e895e00 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/index.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/index.ts @@ -12,6 +12,7 @@ import { UmbContextProviderController } from '@umbraco-cms/backoffice/context-ap import { UmbEntrypointOnInit } from '@umbraco-cms/backoffice/extensions-api'; import './users/components'; +import './user-groups/components'; export const manifests = [...userGroupManifests, ...userManifests, ...userSectionManifests, ...currentUserManifests]; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/components/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/components/index.ts new file mode 100644 index 0000000000..b32058e232 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/components/index.ts @@ -0,0 +1 @@ +import './input-user-group/input-user-group.element'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-user-group/input-user-group.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/components/input-user-group/input-user-group.element.ts similarity index 86% rename from src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-user-group/input-user-group.element.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/components/input-user-group/input-user-group.element.ts index 42ffca8e87..1be3bf4334 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-user-group/input-user-group.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/components/input-user-group/input-user-group.element.ts @@ -1,19 +1,13 @@ import { UUITextStyles } from '@umbraco-ui/uui-css'; import { css, html, nothing } from 'lit'; import { customElement, state } from 'lit/decorators.js'; -import { UmbInputListBaseElement } from '../input-list-base/input-list-base'; -import { - UmbUserGroupStore, - UMB_USER_GROUP_STORE_CONTEXT_TOKEN, -} from '../../../users/user-groups/repository/user-group.store'; - +import { UmbInputListBaseElement } from '../../../../shared/components/input-list-base/input-list-base'; +import { UmbUserGroupStore, UMB_USER_GROUP_STORE_CONTEXT_TOKEN } from '../../repository/user-group.store'; +import type { UserGroupEntity } from '../../types'; import { UMB_USER_GROUP_PICKER_MODAL } from '@umbraco-cms/backoffice/modal'; -import type { UserGroupEntity } from '@umbraco-cms/backoffice/models'; @customElement('umb-input-user-group') export class UmbInputPickerUserGroupElement extends UmbInputListBaseElement { - - @state() private _userGroups: Array = []; @@ -24,10 +18,11 @@ export class UmbInputPickerUserGroupElement extends UmbInputListBaseElement { this.pickerToken = UMB_USER_GROUP_PICKER_MODAL; this.consumeContext(UMB_USER_GROUP_STORE_CONTEXT_TOKEN, (usersContext) => { this._userGroupStore = usersContext; - this._observeUserGroups(); + //this._observeUserGroups(); }); } + /* private _observeUserGroups() { if (this.value.length > 0 && this._userGroupStore) { this.observe(this._userGroupStore.getByKeys(this.value), (userGroups) => (this._userGroups = userGroups)); @@ -35,9 +30,10 @@ export class UmbInputPickerUserGroupElement extends UmbInputListBaseElement { this._userGroups = []; } } + */ selectionUpdated() { - this._observeUserGroups(); + //this._observeUserGroups(); this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true })); } @@ -65,7 +61,7 @@ export class UmbInputPickerUserGroupElement extends UmbInputListBaseElement { renderContent() { return html`${this._renderUserGroupList()}`; } - + static styles = [ UUITextStyles, css` diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-user-group/input-user-group.stories.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/components/input-user-group/input-user-group.stories.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-user-group/input-user-group.stories.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/components/input-user-group/input-user-group.stories.ts diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-user-group/input-user-group.test.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/components/input-user-group/input-user-group.test.ts similarity index 100% rename from src/Umbraco.Web.UI.Client/src/backoffice/shared/components/input-user-group/input-user-group.test.ts rename to src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/components/input-user-group/input-user-group.test.ts diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/index.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/index.ts new file mode 100644 index 0000000000..fcb073fefc --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/index.ts @@ -0,0 +1 @@ +export * from './types'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/modals/user-group-picker/user-group-picker-modal.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/modals/user-group-picker/user-group-picker-modal.element.ts index 537d541997..6e1d3d7518 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/modals/user-group-picker/user-group-picker-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/modals/user-group-picker/user-group-picker-modal.element.ts @@ -2,13 +2,11 @@ import { UUITextStyles } from '@umbraco-ui/uui-css'; import { css, html } from 'lit'; import { customElement, state } from 'lit/decorators.js'; import { UmbUserGroupStore, UMB_USER_GROUP_STORE_CONTEXT_TOKEN } from '../../repository/user-group.store'; +import type { UserGroupDetails } from '../../types'; import { UmbModalElementPickerBase } from '@umbraco-cms/internal/modal'; -import type { UserGroupDetails } from '@umbraco-cms/backoffice/models'; @customElement('umb-user-group-picker-modal') export class UmbUserGroupPickerModalElement extends UmbModalElementPickerBase { - - @state() private _userGroups: Array = []; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/repository/user-group.store.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/repository/user-group.store.ts index b3eb6f3cd6..7405847d81 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/repository/user-group.store.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/repository/user-group.store.ts @@ -1,4 +1,4 @@ -import type { UserGroupDetails } from '@umbraco-cms/backoffice/models'; +import type { UserGroupDetails } from '../types'; import { UmbContextToken } from '@umbraco-cms/backoffice/context-api'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; import { UmbArrayState } from '@umbraco-cms/backoffice/observable-api'; @@ -61,17 +61,6 @@ export class UmbUserGroupStore extends UmbStoreBase implements UmbEntityDetailSt return this.#groups.getObservablePart((userGroups) => userGroups.find((userGroup) => userGroup.id === id)); } - getByKeys(ids: Array) { - const params = ids.map((id) => `id=${id}`).join('&'); - fetch(`/umbraco/backoffice/user-groups/getByKeys?${params}`) - .then((res) => res.json()) - .then((data) => { - this.#groups.append(data); - }); - - return this.#groups.getObservablePart((items) => items.filter((node) => ids.includes(node.id))); - } - async save(userGroups: Array) { // TODO: use Fetcher API. diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/types.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/types.ts new file mode 100644 index 0000000000..fea9946242 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/types.ts @@ -0,0 +1,13 @@ +import type { UmbEntityBase } from '@umbraco-cms/backoffice/models'; + +export interface UserGroupEntity extends UmbEntityBase { + type: 'user-group'; + icon?: string; +} + +export interface UserGroupDetails extends UserGroupEntity { + sections: Array; + contentStartNode?: string; + mediaStartNode?: string; + permissions: Array; +} diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/workspace/user-group-workspace-edit.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/workspace/user-group-workspace-edit.element.ts index edce7b010c..d1de9a921c 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/workspace/user-group-workspace-edit.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/workspace/user-group-workspace-edit.element.ts @@ -4,8 +4,8 @@ import { css, html, nothing } from 'lit'; import { customElement, state } from 'lit/decorators.js'; import { repeat } from 'lit/directives/repeat.js'; import { UmbUserStore } from '../../users/repository/user.store'; +import type { UserGroupDetails } from '../types'; import { UmbUserGroupWorkspaceContext } from './user-group-workspace.context'; -import type { UserGroupDetails } from '@umbraco-cms/backoffice/models'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import '../../users/components/user-input/user-input.element'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/workspace/user-group-workspace.context.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/workspace/user-group-workspace.context.ts index 56d90dbb55..92dad94830 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/workspace/user-group-workspace.context.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/workspace/user-group-workspace.context.ts @@ -1,8 +1,8 @@ import { UmbEntityWorkspaceManager } from '../../../shared/components/workspace/workspace-context/entity-manager-controller'; import { UMB_USER_GROUP_STORE_CONTEXT_TOKEN } from '../repository/user-group.store'; import { UmbUserGroupRepository } from '../repository/user-group.repository'; +import type { UserGroupDetails } from '../types'; import { UmbEntityWorkspaceContextInterface, UmbWorkspaceContext } from '@umbraco-cms/backoffice/workspace'; -import type { UserGroupDetails } from '@umbraco-cms/backoffice/models'; import { UmbControllerHostElement } from '@umbraco-cms/backoffice/controller'; export class UmbUserGroupWorkspaceContext diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/workspace/workspace-view-user-groups.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/workspace/workspace-view-user-groups.element.ts index 352ab18080..74b879f4a2 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/workspace/workspace-view-user-groups.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/user-groups/workspace/workspace-view-user-groups.element.ts @@ -1,7 +1,6 @@ import { UUITextStyles } from '@umbraco-ui/uui-css'; import { css, html } from 'lit'; import { customElement, state } from 'lit/decorators.js'; - import { UmbTableColumn, UmbTableConfig, @@ -12,12 +11,11 @@ import { UmbTableSelectedEvent, } from '../../../shared/components/table'; import { UmbUserGroupStore, UMB_USER_GROUP_STORE_CONTEXT_TOKEN } from '../repository/user-group.store'; - -import type { UserGroupDetails } from '@umbraco-cms/backoffice/models'; +import type { UserGroupDetails } from '../types'; +import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import './user-group-table-name-column-layout.element'; //import '../../user-section/views/user-groups/user-group-table-sections-column-layout.element'; -import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; @customElement('umb-workspace-view-user-groups') export class UmbWorkspaceViewUserGroupsElement extends UmbLitElement { @@ -80,7 +78,7 @@ export class UmbWorkspaceViewUserGroupsElement extends UmbLitElement { private _createTableItems(userGroups: Array) { this._tableItems = userGroups.map((userGroup) => { return { - id: userGroup.id, + id: userGroup.id || '', icon: userGroup.icon, data: [ { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/collection/views/table/user-table-collection-view.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/collection/views/table/user-table-collection-view.element.ts index 4220f02a3e..4be59d080d 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/collection/views/table/user-table-collection-view.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/collection/views/table/user-table-collection-view.element.ts @@ -15,13 +15,13 @@ import { UMB_USER_GROUP_STORE_CONTEXT_TOKEN, } from '../../../../user-groups/repository/user-group.store'; import { UmbUserCollectionContext } from '../../user-collection.context'; +import type { UserGroupEntity } from '@umbraco-cms/backoffice/user-group'; import { UMB_COLLECTION_CONTEXT_TOKEN } from '@umbraco-cms/backoffice/collection'; -import type { UserGroupEntity } from '@umbraco-cms/backoffice/models'; +import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; +import { UserResponseModel } from '@umbraco-cms/backoffice/backend-api'; import './column-layouts/name/user-table-name-column-layout.element'; import './column-layouts/status/user-table-status-column-layout.element'; -import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; -import { UserResponseModel } from '@umbraco-cms/backoffice/backend-api'; @customElement('umb-user-table-collection-view') export class UmbUserTableCollectionViewElement extends UmbLitElement { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/modals/create-user/create-user-modal.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/modals/create-user/create-user-modal.element.ts index 17f8ee41dc..8a9fa369ef 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/modals/create-user/create-user-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/modals/create-user/create-user-modal.element.ts @@ -3,7 +3,7 @@ import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { customElement, query, state } from 'lit/decorators.js'; import { UUIInputPasswordElement } from '@umbraco-ui/uui'; import { UmbUserStore, UMB_USER_STORE_CONTEXT_TOKEN } from '../../repository/user.store'; -import { UmbInputPickerUserGroupElement } from '../../../../shared/components/input-user-group/input-user-group.element'; +import { UmbInputPickerUserGroupElement } from '../../../user-groups/components/input-user-group/input-user-group.element'; import { UmbUserRepository } from '../../repository/user.repository'; import { UmbModalBaseElement } from '@umbraco-cms/internal/modal'; import { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/modals/invite-user/invite-user-modal.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/modals/invite-user/invite-user-modal.element.ts index 463df6e6fe..5b06bd1c61 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/modals/invite-user/invite-user-modal.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/modals/invite-user/invite-user-modal.element.ts @@ -1,7 +1,7 @@ import { css, html, nothing } from 'lit'; import { UUITextStyles } from '@umbraco-ui/uui-css/lib'; import { customElement, query, state } from 'lit/decorators.js'; -import { UmbInputPickerUserGroupElement } from '../../../../shared/components/input-user-group/input-user-group.element'; +import { UmbInputPickerUserGroupElement } from '../../../user-groups/components/input-user-group/input-user-group.element'; import { UmbUserRepository } from '../../repository/user.repository'; import { UmbModalBaseElement } from '@umbraco-cms/internal/modal'; import type { UserResponseModel } from '@umbraco-cms/backoffice/backend-api'; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/types.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/types.ts index 47d72404da..9b2b8e7db6 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/types.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/types.ts @@ -8,6 +8,7 @@ import type { UserResponseModel, UserStateModel, } from '@umbraco-cms/backoffice/backend-api'; + import { UmbDataSource, UmbDetailRepository } from '@umbraco-cms/backoffice/repository'; export interface UmbCreateUserResponseModel { diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/workspace/user-workspace-edit.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/workspace/user-workspace-edit.element.ts index e3c58b2162..1e9feab4b0 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/workspace/user-workspace-edit.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/workspace/user-workspace-edit.element.ts @@ -10,7 +10,6 @@ import { getLookAndColorFromUserStatus } from '../../utils'; import { UmbUserWorkspaceContext } from './user-workspace.context'; import { UMB_CHANGE_PASSWORD_MODAL } from '@umbraco-cms/backoffice/modal'; import type { UmbModalContext } from '@umbraco-cms/backoffice/modal'; -import type { UserDetails } from '@umbraco-cms/backoffice/models'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import { UMB_ENTITY_WORKSPACE_CONTEXT } from '@umbraco-cms/backoffice/context-api'; @@ -19,7 +18,7 @@ import { UserResponseModel, UserStateModel } from '@umbraco-cms/backoffice/backe @customElement('umb-user-workspace-edit') export class UmbUserWorkspaceEditElement extends UmbLitElement { @state() - private _currentUser?: UserDetails; + private _currentUser?: any; @state() private _user?: UserResponseModel; diff --git a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/workspace/user-workspace.element.ts b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/workspace/user-workspace.element.ts index 864cf1c6c4..ed7e94f68b 100644 --- a/src/Umbraco.Web.UI.Client/src/backoffice/users/users/workspace/user-workspace.element.ts +++ b/src/Umbraco.Web.UI.Client/src/backoffice/users/users/workspace/user-workspace.element.ts @@ -6,7 +6,7 @@ import { UmbUserWorkspaceEditElement } from './user-workspace-edit.element'; import { UmbLitElement } from '@umbraco-cms/internal/lit-element'; import type { UmbRoute } from '@umbraco-cms/backoffice/router'; -import '../../../shared/components/input-user-group/input-user-group.element'; +import '../../user-groups/components/input-user-group/input-user-group.element'; import '../../../shared/property-editors/uis/document-picker/property-editor-ui-document-picker.element'; import '../../../shared/components/workspace/workspace-editor/workspace-editor.element'; diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/data/data-type.data.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/data/data-type.data.ts index 404e42482b..88fc3f752c 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/data/data-type.data.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/data/data-type.data.ts @@ -1,3 +1,4 @@ +import { UmbEntityTreeData } from './entity-tree.data'; import { UmbEntityData } from './entity.data'; import { createFolderTreeItem } from './utils'; import type { @@ -611,11 +612,9 @@ const createDataTypeItem = (item: DataTypeResponseModel | FolderTreeItemResponse }; }; -// Temp mocked database -// TODO: all properties are optional in the server schema. I don't think this is correct. -// eslint-disable-next-line @typescript-eslint/ban-ts-comment -// @ts-ignore class UmbDataTypeData extends UmbEntityData { + #tree = new UmbEntityTreeData(this); + constructor() { super(data); } @@ -655,6 +654,14 @@ class UmbDataTypeData extends UmbEntityData item.id !== id); } + + copy(ids: Array, destinationKey: string) { + return this.#tree.copy(ids, destinationKey); + } + + move(ids: Array, destinationKey: string) { + return this.#tree.move(ids, destinationKey); + } } export const umbDataTypeData = new UmbDataTypeData(); diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/data/document-blueprint.data.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/data/document-blueprint.data.ts index 9ac544bffd..e56f700499 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/data/document-blueprint.data.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/data/document-blueprint.data.ts @@ -1,5 +1,5 @@ +import type { DocumentBlueprintDetails } from '../../../backoffice/documents/document-blueprints/types'; import { UmbEntityData } from './entity.data'; -import type { DocumentBlueprintDetails } from '@umbraco-cms/backoffice/models'; export const data: Array = [ { diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/data/entity-tree.data.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/data/entity-tree.data.ts new file mode 100644 index 0000000000..d309faa09c --- /dev/null +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/data/entity-tree.data.ts @@ -0,0 +1,52 @@ +import { UmbEntityData } from './entity.data'; +import { TreeItemPresentationModel } from '@umbraco-cms/backoffice/backend-api'; +import { UmbId } from '@umbraco-cms/backoffice/id'; + +export class UmbEntityTreeData { + #detailDatabase: UmbEntityData; + + constructor(detailDatabase: UmbEntityData) { + this.#detailDatabase = detailDatabase; + } + + move(ids: Array, destinationKey: string) { + const destinationItem = this.#detailDatabase.getById(destinationKey); + if (!destinationItem) throw new Error(`Destination item with key ${destinationKey} not found`); + + const items = this.#detailDatabase.getByIds(ids); + const movedItems = items.map((item) => { + return { + ...item, + parentId: destinationKey, + }; + }); + + movedItems.forEach((movedItem) => this.#detailDatabase.updateData(movedItem)); + destinationItem.hasChildren = true; + this.#detailDatabase.updateData(destinationItem); + } + + copy(ids: Array, destinationKey: string) { + const destinationItem = this.#detailDatabase.getById(destinationKey); + if (!destinationItem) throw new Error(`Destination item with key ${destinationKey} not found`); + + // TODO: Notice we don't add numbers to the 'copy' name. + const items = this.#detailDatabase.getByIds(ids); + const copyItems = items.map((item) => { + return { + ...item, + name: item.name + ' Copy', + id: UmbId.new(), + parentId: destinationKey, + }; + }); + + copyItems.forEach((copyItem) => this.#detailDatabase.insert(copyItem)); + const newIds = copyItems.map((item) => item.id); + + destinationItem.hasChildren = true; + this.#detailDatabase.updateData(destinationItem); + + return newIds; + } +} diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/data/entity.data.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/data/entity.data.ts index a8a2fbd01a..04fb1771b5 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/data/entity.data.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/data/entity.data.ts @@ -1,9 +1,8 @@ import { UmbData } from './data'; -import { UmbId } from '@umbraco-cms/backoffice/id'; -import type { Entity } from '@umbraco-cms/backoffice/models'; +import type { UmbEntityBase } from '@umbraco-cms/backoffice/models'; // Temp mocked database -export class UmbEntityData extends UmbData { +export class UmbEntityData extends UmbData { constructor(data: Array) { super(data); } @@ -17,7 +16,10 @@ export class UmbEntityData extends UmbData { } getByIds(ids: Array) { - return this.data.filter((item) => ids.includes(item.id)); + return this.data.filter((item) => { + if (!item.id) throw new Error('Item has no id'); + ids.includes(item.id); + }); } insert(item: T) { @@ -44,50 +46,6 @@ export class UmbEntityData extends UmbData { return saveItem; } - move(ids: Array, destinationId: string | null) { - if (destinationId === undefined) throw new Error('Destination Id is missing'); - - if (destinationId !== null) { - const destinationItem = this.getById(destinationId); - if (!destinationItem) throw new Error(`Destination item with key ${destinationId} not found`); - } - - const items = this.getByIds(ids); - const movedItems = items.map((item) => { - return { - ...item, - parentId: destinationId, - }; - }); - - movedItems.forEach((movedItem) => this.updateData(movedItem)); - } - - copy(ids: Array, destinationId: string | null) { - if (destinationId === undefined) throw new Error('Destination Id is missing'); - - if (destinationId !== null) { - const destinationItem = this.getById(destinationId); - if (!destinationItem) throw new Error(`Destination item with key ${destinationId} not found`); - } - - // TODO: Notice we don't add numbers to the 'copy' name. - const items = this.getByIds(ids); - const copyItems = items.map((item) => { - return { - ...item, - name: item.name + ' Copy', - id: UmbId.new(), - parentId: destinationId, - }; - }); - - copyItems.forEach((copyItem) => this.insert(copyItem)); - const newIds = copyItems.map((item) => item.id); - - return newIds; - } - trash(ids: Array) { const trashedItems: Array = []; @@ -108,12 +66,22 @@ export class UmbEntityData extends UmbData { } delete(ids: Array) { - const deletedKeys = this.data.filter((item) => ids.includes(item.id)).map((item) => item.id); - this.data = this.data.filter((item) => ids.indexOf(item.id) === -1); + const deletedKeys = this.data + .filter((item) => { + if (!item.id) throw new Error('Item has no id'); + ids.includes(item.id); + }) + .map((item) => item.id); + + this.data = this.data.filter((item) => { + if (!item.id) throw new Error('Item has no id'); + ids.indexOf(item.id) === -1; + }); + return deletedKeys; } - protected updateData(updateItem: T) { + updateData(updateItem: T) { const itemIndex = this.data.findIndex((item) => item.id === updateItem.id); const item = this.data[itemIndex]; if (!item) return; diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/data/media-type.data.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/data/media-type.data.ts index 601f5fc6c3..eaccc78edc 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/data/media-type.data.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/data/media-type.data.ts @@ -1,7 +1,7 @@ +import type { MediaTypeDetails } from '../../../backoffice/media/media-types/types'; import { UmbEntityData } from './entity.data'; import { createFolderTreeItem } from './utils'; import { FolderTreeItemResponseModel, PagedFolderTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; -import type { MediaTypeDetails } from '@umbraco-cms/backoffice/models'; export const data: Array = [ { diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/data/media.data.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/data/media.data.ts index 31a930b596..6f3b164b50 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/data/media.data.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/data/media.data.ts @@ -1,4 +1,5 @@ import type { MediaDetails } from '../../../backoffice/media/media'; +import { UmbEntityTreeData } from './entity-tree.data'; import { UmbEntityData } from './entity.data'; import { createContentTreeItem } from './utils'; import { ContentTreeItemResponseModel, PagedContentTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; @@ -203,6 +204,8 @@ export const data: Array = [ // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore class UmbMediaData extends UmbEntityData { + #tree = new UmbEntityTreeData(this); + constructor() { super(data); } @@ -225,6 +228,10 @@ class UmbMediaData extends UmbEntityData { const items = this.data.filter((item) => ids.includes(item.id)); return items.map((item) => createContentTreeItem(item)); } + + move(ids: Array, destinationKey: string) { + return this.#tree.move(ids, destinationKey); + } } export const umbMediaData = new UmbMediaData(); diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/data/member-group.data.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/data/member-group.data.ts index db2d57d5e7..4e6cf68fd2 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/data/member-group.data.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/data/member-group.data.ts @@ -1,6 +1,6 @@ +import type { MemberGroupDetails } from '../../../backoffice/members/member-groups/types'; import { UmbEntityData } from './entity.data'; import { createEntityTreeItem } from './utils'; -import type { MemberGroupDetails } from '@umbraco-cms/backoffice/models'; import { EntityTreeItemResponseModel, PagedEntityTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; export const data: Array = [ diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/data/member-type.data.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/data/member-type.data.ts index 7200916cb4..f7723023e8 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/data/member-type.data.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/data/member-type.data.ts @@ -1,7 +1,7 @@ +import type { MemberTypeDetails } from '../../../backoffice/members/member-types/types'; import { UmbData } from './data'; import { createEntityTreeItem } from './utils'; import { EntityTreeItemResponseModel, PagedEntityTreeItemResponseModel } from '@umbraco-cms/backoffice/backend-api'; -import type { MemberTypeDetails } from '@umbraco-cms/backoffice/models'; export const data: Array = [ { diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/data/member.data.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/data/member.data.ts index 75faed9860..c5fb176e97 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/data/member.data.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/data/member.data.ts @@ -1,6 +1,6 @@ +import type { MemberDetails } from '../../../backoffice/members/members/types'; import { UmbEntityData } from './entity.data'; import { createEntityTreeItem } from './utils'; -import type { MemberDetails } from '@umbraco-cms/backoffice/models'; import type { EntityTreeItemResponseModel, PagedEntityTreeItemResponseModel, diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/data/user-groups.data.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/data/user-groups.data.ts index 3c4b99b1ca..16e8feb45a 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/data/user-groups.data.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/data/user-groups.data.ts @@ -1,5 +1,5 @@ +import type { UserGroupDetails } from '../../../backoffice/users/user-groups/types'; import { UmbEntityData } from './entity.data'; -import type { UserGroupDetails } from '@umbraco-cms/backoffice/models'; // Temp mocked database class UmbUserGroupsData extends UmbEntityData { @@ -17,9 +17,7 @@ export const data: Array = [ id: 'c630d49e-4e7b-42ea-b2bc-edc0edacb6b1', name: 'Administrators', icon: 'umb:medal', - parentId: '', type: 'user-group', - hasChildren: false, sections: [ 'Umb.Section.Users', 'Umb.Section.Packages', @@ -34,9 +32,7 @@ export const data: Array = [ id: '9a9ad4e9-3b5b-4fe7-b0d9-e301b9675949', name: 'Workspaces', icon: 'umb:tools', - parentId: '', type: 'user-group', - hasChildren: false, sections: ['Umb.Section.Members', 'Umb.Section.Media'], permissions: [], contentStartNode: '74e4008a-ea4f-4793-b924-15e02fd380d1', @@ -45,9 +41,7 @@ export const data: Array = [ id: 'b847398a-6875-4d7a-9f6d-231256b81471', name: 'Sensitive Data', icon: 'umb:lock', - parentId: '', type: 'user-group', - hasChildren: false, sections: ['Umb.Section.Settings', 'Umb.Section.Members', 'Umb.Section.Media', 'Umb.Section.Content'], permissions: [], contentStartNode: 'cdd30288-2d1c-41b4-89a9-61647b4a10d5', @@ -56,9 +50,7 @@ export const data: Array = [ id: '2668f09b-320c-48a7-a78a-95047026ec0e', name: 'Translators', icon: 'umb:globe', - parentId: '', type: 'user-group', - hasChildren: false, sections: ['Umb.Section.Packages', 'Umb.Section.Settings'], permissions: [], contentStartNode: 'cdd30288-2d1c-41b4-89a9-61647b4a10d5', @@ -67,9 +59,7 @@ export const data: Array = [ id: '397f3a8b-4ca3-4b01-9dd3-94e5c9eaa9b2', name: 'Writers', icon: 'umb:edit', - parentId: '', type: 'user-group', - hasChildren: false, sections: ['Umb.Section.Content'], permissions: [], }, diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/manifests.handlers.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/manifests.handlers.ts index 543329b7b5..21844a3a4e 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/manifests.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/manifests.handlers.ts @@ -1,7 +1,7 @@ import { rest } from 'msw'; +import type { PackageManifestResponse } from '../../../backoffice/packages/types'; import { umbracoPath } from '@umbraco-cms/backoffice/utils'; -import type { PackageManifestResponse } from '@umbraco-cms/backoffice/models'; export const manifestDevelopmentHandler = rest.get(umbracoPath('/package/manifest'), (_req, res, ctx) => { return res( diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/user-groups.handlers.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/user-groups.handlers.ts index 929979ba43..e007de0b70 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/user-groups.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/user-groups.handlers.ts @@ -1,6 +1,6 @@ import { rest } from 'msw'; import { umbUserGroupsData } from '../data/user-groups.data'; -import type { UserGroupDetails } from '@umbraco-cms/backoffice/models'; +import type { UserGroupDetails } from '../../../backoffice/users/user-groups/types'; export const handlers = [ rest.get('/umbraco/backoffice/user-groups/list/items', (req, res, ctx) => { @@ -23,14 +23,6 @@ export const handlers = [ return res(ctx.status(200), ctx.json(userGroup)); }), - rest.get('/umbraco/backoffice/user-groups/getByKeys', (req, res, ctx) => { - const ids = req.url.searchParams.getAll('id'); - if (ids.length === 0) return; - const userGroups = umbUserGroupsData.getByIds(ids); - - return res(ctx.status(200), ctx.json(userGroups)); - }), - rest.post>('/umbraco/backoffice/user-groups/save', async (req, res, ctx) => { const data = await req.json(); if (!data) return; diff --git a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/users.handlers.ts b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/users.handlers.ts index 6bc524c5f7..fe909257f7 100644 --- a/src/Umbraco.Web.UI.Client/src/core/mocks/domains/users.handlers.ts +++ b/src/Umbraco.Web.UI.Client/src/core/mocks/domains/users.handlers.ts @@ -28,88 +28,4 @@ export const handlers = [ return res(ctx.status(200), ctx.json(saved)); }), - - // rest.get('/umbraco/backoffice/users/getByKeys', (req, res, ctx) => { - // const ids = req.url.searchParams.getAll('id'); - // if (ids.length === 0) return; - // const users = umbUsersData.getByIds(ids); - - // return res(ctx.status(200), ctx.json(users)); - // }), - - // rest.post('/umbraco/backoffice/users/save', async (req, res, ctx) => { - // const data = await req.json(); - // if (!data) return; - - // const saved = umbUsersData.save(data); - - // console.log('saved', saved); - - // return res(ctx.status(200), ctx.json(saved)); - // }), - - // rest.post('/umbraco/backoffice/users/invite', async (req, res, ctx) => { - // const data = await req.json(); - // if (!data) return; - - // const newUser: UserDetails = { - // id: uuidv4(), - // name: data.name, - // email: data.email, - // status: 'invited', - // language: 'en', - // updateDate: new Date().toISOString(), - // createDate: new Date().toISOString(), - // failedLoginAttempts: 0, - // parentId: '', - // hasChildren: false, - // type: 'user', - // icon: 'umb:icon-user', - // userGroups: data.userGroups, - // contentStartNodes: [], - // mediaStartNodes: [], - // }; - - // const invited = umbUsersData.save(newUser); - - // console.log('invited', invited); - - // return res(ctx.status(200), ctx.json(invited)); - // }), - - // rest.post>('/umbraco/backoffice/users/enable', async (req, res, ctx) => { - // const data = await req.json(); - // if (!data) return; - - // const enabledKeys = umbUsersData.enable(data); - - // return res(ctx.status(200), ctx.json(enabledKeys)); - // }), - - // rest.post>('/umbraco/backoffice/users/disable', async (req, res, ctx) => { - // const data = await req.json(); - // if (!data) return; - - // const enabledKeys = umbUsersData.disable(data); - - // return res(ctx.status(200), ctx.json(enabledKeys)); - // }), - - // rest.post>('/umbraco/backoffice/users/updateUserGroup', async (req, res, ctx) => { - // const data = await req.json(); - // if (!data) return; - - // const userKeys = umbUsersData.updateUserGroup(data.userKeys, data.userGroupKey); - - // return res(ctx.status(200), ctx.json(userKeys)); - // }), - - // rest.post>('/umbraco/backoffice/users/delete', async (req, res, ctx) => { - // const data = await req.json(); - // if (!data) return; - - // const deletedKeys = umbUsersData.delete(data); - - // return res(ctx.status(200), ctx.json(deletedKeys)); - // }), ]; diff --git a/src/Umbraco.Web.UI.Client/src/core/modal/modal-element-picker-base.ts b/src/Umbraco.Web.UI.Client/src/core/modal/modal-element-picker-base.ts index 1cb4cacec2..111ddccd08 100644 --- a/src/Umbraco.Web.UI.Client/src/core/modal/modal-element-picker-base.ts +++ b/src/Umbraco.Web.UI.Client/src/core/modal/modal-element-picker-base.ts @@ -6,7 +6,7 @@ import { UmbPickerModalData, UmbPickerModalResult } from '@umbraco-cms/backoffic // So we don't have to extend an element to get basic picker/selection logic export class UmbModalElementPickerBase extends UmbModalBaseElement, UmbPickerModalResult> { @property() - selection: Array = []; + selection: Array = []; connectedCallback(): void { super.connectedCallback(); @@ -21,28 +21,31 @@ export class UmbModalElementPickerBase extends UmbModalBaseElement selectedKey !== key); + if (this.isSelected(id)) { + this.selection = this.selection.filter((selectedKey) => selectedKey !== id); } else { - this.selection.push(key); + this.selection.push(id); } } else { - this.selection = [key]; + this.selection = [id]; } this.requestUpdate('_selection'); } - isSelected(key: string): boolean { - return this.selection.includes(key); + isSelected(id?: string | null): boolean { + if (id === undefined) throw new Error('No Id provided'); + return this.selection.includes(id); } } diff --git a/src/Umbraco.Web.UI.Client/tsconfig.json b/src/Umbraco.Web.UI.Client/tsconfig.json index 525b98b901..8ec155f04a 100644 --- a/src/Umbraco.Web.UI.Client/tsconfig.json +++ b/src/Umbraco.Web.UI.Client/tsconfig.json @@ -44,7 +44,11 @@ "@umbraco-cms/backoffice/picker-input": ["libs/picker-input"], "@umbraco-cms/backoffice/id": ["libs/id"], "@umbraco-cms/backoffice/collection": ["libs/collection"], + "@umbraco-cms/backoffice/tree": ["libs/tree"], "@umbraco-cms/backoffice/section": ["libs/section"], + + "@umbraco-cms/backoffice/user-group": ["src/backoffice/users/user-groups"], + "@umbraco-cms/internal/lit-element": ["src/core/lit-element"], "@umbraco-cms/internal/modal": ["src/core/modal"], "@umbraco-cms/internal/router": ["src/core/router"], diff --git a/src/Umbraco.Web.UI.Client/web-test-runner.config.mjs b/src/Umbraco.Web.UI.Client/web-test-runner.config.mjs index 54f0fbbeae..4e33441cf3 100644 --- a/src/Umbraco.Web.UI.Client/web-test-runner.config.mjs +++ b/src/Umbraco.Web.UI.Client/web-test-runner.config.mjs @@ -60,7 +60,11 @@ export default { '@umbraco-cms/backoffice/picker-input': './libs/picker-input/index.ts', '@umbraco-cms/backoffice/id': './libs/id/index.ts', '@umbraco-cms/backoffice/collection': './libs/collection/index.ts', + '@umbraco-cms/backoffice/tree': './libs/tree/index.ts', '@umbraco-cms/backoffice/section': './libs/section/index.ts', + + '@umbraco-cms/backoffice/user-group': './src/backoffice/users/user-groups/index.ts', + '@umbraco-cms/internal/lit-element': './src/core/lit-element/index.ts', '@umbraco-cms/internal/modal': './src/core/modal/index.ts', '@umbraco-cms/internal/router': './src/core/router/index.ts',