@umbraco-cms/backoffice 14.0.0--preview004-2f33e9be → 14.0.0--preview004-19e302a4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/dist-cms/custom-elements.json +44 -0
  2. package/dist-cms/mocks/browser-handlers.js +1 -1
  3. package/dist-cms/mocks/data/media-type.data.d.ts +12 -7
  4. package/dist-cms/mocks/data/media-type.data.js +46 -22
  5. package/dist-cms/mocks/data/user.data.d.ts +7 -1
  6. package/dist-cms/mocks/data/user.data.js +27 -1
  7. package/dist-cms/mocks/data/utils.d.ts +5 -1
  8. package/dist-cms/mocks/data/utils.js +27 -0
  9. package/dist-cms/mocks/handlers/media-type/detail.handlers.d.ts +1 -0
  10. package/dist-cms/mocks/handlers/media-type/detail.handlers.js +37 -0
  11. package/dist-cms/mocks/handlers/media-type/index.js +4 -0
  12. package/dist-cms/mocks/handlers/media-type/item.handlers.d.ts +1 -0
  13. package/dist-cms/mocks/handlers/media-type/item.handlers.js +20 -0
  14. package/dist-cms/mocks/handlers/media-type/slug.d.ts +1 -0
  15. package/dist-cms/mocks/handlers/media-type/slug.js +1 -0
  16. package/dist-cms/mocks/handlers/media-type/tree.handlers.d.ts +1 -0
  17. package/dist-cms/mocks/handlers/media-type/tree.handlers.js +25 -0
  18. package/dist-cms/mocks/handlers/user/detail.handlers.js +4 -9
  19. package/dist-cms/mocks/handlers/user/filter.handlers.d.ts +1 -0
  20. package/dist-cms/mocks/handlers/user/filter.handlers.js +26 -0
  21. package/dist-cms/mocks/handlers/user/index.js +3 -1
  22. package/dist-cms/packages/core/collection/collection.context.d.ts +10 -7
  23. package/dist-cms/packages/core/collection/collection.context.js +42 -20
  24. package/dist-cms/packages/core/collection/collection.element.d.ts +1 -0
  25. package/dist-cms/packages/core/collection/collection.element.js +4 -0
  26. package/dist-cms/packages/core/collection/components/collection-selection-actions.element.d.ts +1 -1
  27. package/dist-cms/packages/core/collection/components/collection-selection-actions.element.js +6 -7
  28. package/dist-cms/packages/core/collection/components/index.d.ts +2 -0
  29. package/dist-cms/packages/core/collection/components/index.js +2 -0
  30. package/dist-cms/packages/core/collection/components/pagination/collection-pagination.element.d.ts +16 -0
  31. package/dist-cms/packages/core/collection/components/pagination/collection-pagination.element.js +59 -0
  32. package/dist-cms/packages/core/collection/types.d.ts +3 -0
  33. package/dist-cms/packages/core/event/change.event.d.ts +1 -0
  34. package/dist-cms/packages/core/event/change.event.js +2 -1
  35. package/dist-cms/packages/core/repository/data-source/collection-data-source.interface.d.ts +3 -4
  36. package/dist-cms/packages/core/repository/data-source/index.d.ts +1 -0
  37. package/dist-cms/packages/core/repository/data-source/index.js +1 -0
  38. package/dist-cms/packages/core/repository/data-source/tree-data-source.interface.d.ts +1 -1
  39. package/dist-cms/packages/core/repository/data-source/types.d.ts +4 -0
  40. package/dist-cms/packages/core/repository/tree-repository.interface.d.ts +2 -5
  41. package/dist-cms/packages/core/tree/tree-item-base/tree-item-base.context.d.ts +1 -1
  42. package/dist-cms/packages/media/media-types/repository/media-type-item.store.d.ts +20 -0
  43. package/dist-cms/packages/media/media-types/repository/media-type-item.store.js +23 -0
  44. package/dist-cms/packages/media/media-types/repository/media-type.detail.store.d.ts +3 -2
  45. package/dist-cms/packages/media/media-types/repository/media-type.detail.store.js +3 -0
  46. package/dist-cms/packages/media/media-types/repository/media-type.repository.d.ts +25 -22
  47. package/dist-cms/packages/media/media-types/repository/media-type.repository.js +61 -30
  48. package/dist-cms/packages/media/media-types/repository/sources/media-type-item.server.data.d.ts +25 -0
  49. package/dist-cms/packages/media/media-types/repository/sources/media-type-item.server.data.js +32 -0
  50. package/dist-cms/packages/media/media-types/repository/sources/media-type.detail.server.data.d.ts +10 -10
  51. package/dist-cms/packages/media/media-types/repository/sources/media-type.detail.server.data.js +26 -35
  52. package/dist-cms/packages/media/media-types/workspace/manifests.js +76 -2
  53. package/dist-cms/packages/media/media-types/workspace/media-type-workspace-editor.element.d.ts +7 -1
  54. package/dist-cms/packages/media/media-types/workspace/media-type-workspace-editor.element.js +135 -18
  55. package/dist-cms/packages/media/media-types/workspace/media-type-workspace.context.d.ts +11 -8
  56. package/dist-cms/packages/media/media-types/workspace/media-type-workspace.context.js +25 -12
  57. package/dist-cms/packages/media/media-types/workspace/views/details/media-type-design-workspace-view.element.d.ts +17 -0
  58. package/dist-cms/packages/media/media-types/workspace/views/details/media-type-design-workspace-view.element.js +51 -0
  59. package/dist-cms/packages/media/media-types/workspace/views/details/media-type-list-view-workspace-view.element.d.ts +17 -0
  60. package/dist-cms/packages/media/media-types/workspace/views/details/media-type-list-view-workspace-view.element.js +51 -0
  61. package/dist-cms/packages/media/media-types/workspace/views/details/media-type-permissions-workspace-view.element.d.ts +17 -0
  62. package/dist-cms/packages/media/media-types/workspace/views/details/media-type-permissions-workspace-view.element.js +51 -0
  63. package/dist-cms/packages/user/user/collection/repository/user-collection.repository.js +1 -1
  64. package/dist-cms/packages/user/user/collection/repository/user-collection.server.data.d.ts +1 -22
  65. package/dist-cms/packages/user/user/collection/repository/user-collection.server.data.js +1 -12
  66. package/dist-cms/packages/user/user/collection/user-collection.context.js +1 -1
  67. package/dist-cms/packages/user/user-group/collection/repository/user-group-collection.repository.js +1 -1
  68. package/dist-cms/packages/user/user-group/collection/repository/user-group-collection.server.data.d.ts +1 -2
  69. package/dist-cms/packages/user/user-group/collection/repository/user-group-collection.server.data.js +1 -4
  70. package/dist-cms/shared/utils/index.d.ts +1 -0
  71. package/dist-cms/shared/utils/index.js +1 -0
  72. package/dist-cms/shared/utils/pagination-manager/pagination.manager.d.ts +56 -0
  73. package/dist-cms/shared/utils/pagination-manager/pagination.manager.js +113 -0
  74. package/dist-cms/tsconfig.build.tsbuildinfo +1 -1
  75. package/dist-cms/vscode-html-custom-data.json +22 -2
  76. package/package.json +1 -1
  77. package/dist-cms/mocks/handlers/media-type.handlers.js +0 -23
  78. package/dist-cms/packages/media/media-types/repository/sources/media-type.details.server.data.interface.d.ts +0 -9
  79. package/dist-cms/packages/media/media-types/types.d.ts +0 -6
  80. /package/dist-cms/mocks/handlers/{media-type.handlers.d.ts → media-type/index.d.ts} +0 -0
  81. /package/dist-cms/packages/{media/media-types → core/collection}/types.js +0 -0
  82. /package/dist-cms/packages/{media/media-types/repository/sources/media-type.details.server.data.interface.js → core/repository/data-source/types.js} +0 -0
@@ -498,6 +498,17 @@
498
498
  }
499
499
  ]
500
500
  },
501
+ {
502
+ "name": "umb-collection-pagination",
503
+ "path": "./../src/packages/core/collection/components/pagination/collection-pagination.element.ts",
504
+ "properties": [
505
+ {
506
+ "name": "styles",
507
+ "type": "array",
508
+ "default": "[\"UmbTextStyles\",null]"
509
+ }
510
+ ]
511
+ },
501
512
  {
502
513
  "name": "umb-dashboard-collection",
503
514
  "path": "./../src/packages/core/collection/dashboards/dashboard-collection.element.ts",
@@ -6127,6 +6138,39 @@
6127
6138
  }
6128
6139
  ]
6129
6140
  },
6141
+ {
6142
+ "name": "umb-media-type-design-workspace-view",
6143
+ "path": "./../src/packages/media/media-types/workspace/views/details/media-type-design-workspace-view.element.ts",
6144
+ "properties": [
6145
+ {
6146
+ "name": "styles",
6147
+ "type": "array",
6148
+ "default": "[\"UmbTextStyles\",null]"
6149
+ }
6150
+ ]
6151
+ },
6152
+ {
6153
+ "name": "umb-media-type-list-view-workspace-view",
6154
+ "path": "./../src/packages/media/media-types/workspace/views/details/media-type-list-view-workspace-view.element.ts",
6155
+ "properties": [
6156
+ {
6157
+ "name": "styles",
6158
+ "type": "array",
6159
+ "default": "[\"UmbTextStyles\",null]"
6160
+ }
6161
+ ]
6162
+ },
6163
+ {
6164
+ "name": "umb-media-type-permissions-workspace-view",
6165
+ "path": "./../src/packages/media/media-types/workspace/views/details/media-type-permissions-workspace-view.element.ts",
6166
+ "properties": [
6167
+ {
6168
+ "name": "styles",
6169
+ "type": "array",
6170
+ "default": "[\"UmbTextStyles\",null]"
6171
+ }
6172
+ ]
6173
+ },
6130
6174
  {
6131
6175
  "name": "umb-collection-view-media-test",
6132
6176
  "path": "./../src/packages/media/media/collection-view/collection-view-media-test.element.ts",
@@ -16,7 +16,7 @@ import { handlers as profilingHandlers } from './handlers/performance-profiling.
16
16
  import { handlers as documentHandlers } from './handlers/document/index.js';
17
17
  import { handlers as mediaHandlers } from './handlers/media.handlers.js';
18
18
  import { handlers as dictionaryHandlers } from './handlers/dictionary.handlers.js';
19
- import { handlers as mediaTypeHandlers } from './handlers/media-type.handlers.js';
19
+ import { handlers as mediaTypeHandlers } from './handlers/media-type/index.js';
20
20
  import { handlers as memberGroupHandlers } from './handlers/member-group.handlers.js';
21
21
  import { handlers as memberHandlers } from './handlers/member.handlers.js';
22
22
  import { handlers as memberTypeHandlers } from './handlers/member-type.handlers.js';
@@ -1,12 +1,17 @@
1
- import type { MediaTypeDetails } from '../../packages/media/media-types/types.js';
2
1
  import { UmbEntityData } from './entity.data.js';
3
- import { FolderTreeItemResponseModel, PagedMediaTreeItemResponseModel } from '../../external/backend-api/index.js';
4
- export declare const data: Array<MediaTypeDetails>;
5
- declare class UmbMediaTypeData extends UmbEntityData<MediaTypeDetails> {
2
+ import { MediaTypeResponseModel, MediaTypeTreeItemResponseModel } from '../../external/backend-api/index.js';
3
+ export declare const data: Array<MediaTypeResponseModel>;
4
+ export declare const treeData: Array<MediaTypeTreeItemResponseModel>;
5
+ declare class UmbMediaTypeData extends UmbEntityData<MediaTypeResponseModel> {
6
+ private treeData;
6
7
  constructor();
7
- getTreeRoot(): PagedMediaTreeItemResponseModel;
8
- getTreeItemChildren(id: string): PagedMediaTreeItemResponseModel;
9
- getTreeItem(ids: Array<string>): Array<FolderTreeItemResponseModel>;
8
+ insert(item: MediaTypeResponseModel): import("../../external/backend-api/index.js").ContentTypeResponseModelBaseMediaTypePropertyTypeResponseModelMediaTypePropertyTypeContainerResponseModel;
9
+ update(id: string, item: MediaTypeResponseModel): import("../../external/backend-api/index.js").ContentTypeResponseModelBaseMediaTypePropertyTypeResponseModelMediaTypePropertyTypeContainerResponseModel;
10
+ getItems(ids: Array<string>): Array<MediaTypeTreeItemResponseModel>;
11
+ getTreeRoot(): Array<MediaTypeTreeItemResponseModel>;
12
+ getTreeItemChildren(id: string): Array<MediaTypeTreeItemResponseModel>;
13
+ getTreeItems(ids: Array<string>): Array<MediaTypeTreeItemResponseModel>;
14
+ getAllowedTypesOf(id: string): Array<MediaTypeTreeItemResponseModel>;
10
15
  }
11
16
  export declare const umbMediaTypeData: UmbMediaTypeData;
12
17
  export {};
@@ -1,27 +1,25 @@
1
1
  import { UmbEntityData } from './entity.data.js';
2
- import { createFolderTreeItem } from './utils.js';
2
+ import { createMediaTypeTreeItem } from './utils.js';
3
3
  export const data = [
4
4
  {
5
5
  name: 'Media Type 1',
6
- type: 'media-type',
7
- hasChildren: false,
8
6
  id: 'c5159663-eb82-43ee-bd23-e42dc5e71db6',
9
- isContainer: false,
10
- parentId: null,
11
- isFolder: false,
7
+ description: 'Media type 1 description',
12
8
  alias: 'mediaType1',
9
+ icon: 'umb:bug',
13
10
  properties: [],
11
+ containers: [],
14
12
  },
13
+ ];
14
+ export const treeData = [
15
15
  {
16
- name: 'Media Type 2',
16
+ name: data[0].name,
17
+ id: data[0].id,
18
+ icon: data[0].icon,
17
19
  type: 'media-type',
18
20
  hasChildren: false,
19
- id: '22da1b0b-c310-4730-9912-c30b3eb9802e',
20
21
  isContainer: false,
21
22
  parentId: null,
22
- isFolder: false,
23
- alias: 'mediaType2',
24
- properties: [],
25
23
  },
26
24
  ];
27
25
  // Temp mocked database
@@ -31,22 +29,48 @@ export const data = [
31
29
  class UmbMediaTypeData extends UmbEntityData {
32
30
  constructor() {
33
31
  super(data);
32
+ this.treeData = treeData;
33
+ }
34
+ // TODO: Can we do this smarter so we don't need to make this for each mock data:
35
+ insert(item) {
36
+ const result = super.insert(item);
37
+ this.treeData.push(createMediaTypeTreeItem(result));
38
+ return result;
39
+ }
40
+ update(id, item) {
41
+ const result = super.save(id, item);
42
+ this.treeData = this.treeData.map((x) => {
43
+ if (x.id === result.id) {
44
+ return createMediaTypeTreeItem(result);
45
+ }
46
+ else {
47
+ return x;
48
+ }
49
+ });
50
+ return result;
51
+ }
52
+ getItems(ids) {
53
+ const items = this.data.filter((item) => ids.includes(item.id ?? ''));
54
+ return items.map((item) => item);
34
55
  }
35
56
  getTreeRoot() {
36
- const items = this.data.filter((item) => item.parentId === null);
37
- const treeItems = items.map((item) => createFolderTreeItem(item));
38
- const total = items.length;
39
- return { items: treeItems, total };
57
+ const rootItems = this.treeData.filter((item) => item.parentId === null);
58
+ const result = rootItems.map((item) => createMediaTypeTreeItem(item));
59
+ return result;
40
60
  }
41
61
  getTreeItemChildren(id) {
42
- const items = this.data.filter((item) => item.parentId === id);
43
- const treeItems = items.map((item) => createFolderTreeItem(item));
44
- const total = items.length;
45
- return { items: treeItems, total };
62
+ const childItems = this.treeData.filter((item) => item.parentId === id);
63
+ return childItems.map((item) => item);
46
64
  }
47
- getTreeItem(ids) {
48
- const items = this.data.filter((item) => ids.includes(item.id ?? ''));
49
- return items.map((item) => createFolderTreeItem(item));
65
+ getTreeItems(ids) {
66
+ const items = this.treeData.filter((item) => ids.includes(item.id ?? ''));
67
+ return items.map((item) => item);
68
+ }
69
+ getAllowedTypesOf(id) {
70
+ const mediaType = this.getById(id);
71
+ const allowedTypeKeys = mediaType?.allowedContentTypes?.map((mediaType) => mediaType.id) ?? [];
72
+ const items = this.treeData.filter((item) => allowedTypeKeys.includes(item.id ?? ''));
73
+ return items.map((item) => item);
50
74
  }
51
75
  }
52
76
  export const umbMediaTypeData = new UmbMediaTypeData();
@@ -1,6 +1,6 @@
1
1
  import { UmbEntityData } from './entity.data.js';
2
2
  import { UmbLoggedInUser } from '../../shared/auth/index.js';
3
- import { CreateUserRequestModel, CreateUserResponseModel, InviteUserRequestModel, UpdateUserGroupsOnUserRequestModel, UserItemResponseModel, UserResponseModel } from '../../external/backend-api/index.js';
3
+ import { CreateUserRequestModel, CreateUserResponseModel, InviteUserRequestModel, PagedUserResponseModel, UpdateUserGroupsOnUserRequestModel, UserItemResponseModel, UserResponseModel } from '../../external/backend-api/index.js';
4
4
  declare class UmbUserData extends UmbEntityData<UserResponseModel> {
5
5
  constructor(data: UserResponseModel[]);
6
6
  /**
@@ -46,7 +46,13 @@ declare class UmbUserData extends UmbEntityData<UserResponseModel> {
46
46
  * @memberof UmbUserData
47
47
  */
48
48
  unlock(ids: Array<string>): void;
49
+ /**
50
+ * Invites a user
51
+ * @param {InviteUserRequestModel} data
52
+ * @memberof UmbUserData
53
+ */
49
54
  invite(data: InviteUserRequestModel): void;
55
+ filter(options: any): PagedUserResponseModel;
50
56
  }
51
57
  export declare const data: Array<UserResponseModel & {
52
58
  type: string;
@@ -1,6 +1,7 @@
1
- import { UmbId } from '../../packages/core/id/index.js';
2
1
  import { UmbEntityData } from './entity.data.js';
3
2
  import { umbUserGroupData } from './user-group.data.js';
3
+ import { arrayFilter, stringFilter, queryFilter } from './utils.js';
4
+ import { UmbId } from '../../packages/core/id/index.js';
4
5
  import { UserStateModel, } from '../../external/backend-api/index.js';
5
6
  const createUserItem = (item) => {
6
7
  return {
@@ -8,6 +9,9 @@ const createUserItem = (item) => {
8
9
  id: item.id,
9
10
  };
10
11
  };
12
+ const userGroupFilter = (filterOptions, item) => arrayFilter(filterOptions.userGroupIds, item.userGroupIds);
13
+ const userStateFilter = (filterOptions, item) => stringFilter(filterOptions.userStates, item.state);
14
+ const userQueryFilter = (filterOptions, item) => queryFilter(filterOptions.filter, item.name);
11
15
  // Temp mocked database
12
16
  class UmbUserData extends UmbEntityData {
13
17
  constructor(data) {
@@ -116,6 +120,11 @@ class UmbUserData extends UmbEntityData {
116
120
  user.state = UserStateModel.ACTIVE;
117
121
  });
118
122
  }
123
+ /**
124
+ * Invites a user
125
+ * @param {InviteUserRequestModel} data
126
+ * @memberof UmbUserData
127
+ */
119
128
  invite(data) {
120
129
  const invitedUser = {
121
130
  status: UserStateModel.INVITED,
@@ -123,6 +132,23 @@ class UmbUserData extends UmbEntityData {
123
132
  };
124
133
  this.createUser(invitedUser);
125
134
  }
135
+ filter(options) {
136
+ const { items: allItems } = this.getAll();
137
+ const filterOptions = {
138
+ skip: options.skip || 0,
139
+ take: options.take || 25,
140
+ orderBy: options.orderBy || 'name',
141
+ orderDirection: options.orderDirection || 'asc',
142
+ userGroupIds: options.userGroupIds,
143
+ userStates: options.userStates,
144
+ filter: options.filter,
145
+ };
146
+ const filteredItems = allItems.filter((item) => userGroupFilter(filterOptions, item) && userStateFilter(filterOptions, item) && userQueryFilter(filterOptions, item));
147
+ const totalItems = filteredItems.length;
148
+ const paginatedItems = filteredItems.slice(filterOptions.skip, filterOptions.skip + filterOptions.take);
149
+ return { total: totalItems, items: paginatedItems };
150
+ }
151
+ ;
126
152
  }
127
153
  export const data = [
128
154
  {
@@ -1,4 +1,4 @@
1
- import type { ContentTreeItemResponseModel, DocumentTreeItemResponseModel, DocumentTypeTreeItemResponseModel, EntityTreeItemResponseModel, FolderTreeItemResponseModel, DocumentTypeResponseModel, FileSystemTreeItemPresentationModel, DocumentResponseModel, TextFileResponseModelBaseModel, FileItemResponseModelBaseModel } from '../../external/backend-api/index.js';
1
+ import type { ContentTreeItemResponseModel, DocumentTreeItemResponseModel, DocumentTypeTreeItemResponseModel, EntityTreeItemResponseModel, FolderTreeItemResponseModel, DocumentTypeResponseModel, FileSystemTreeItemPresentationModel, DocumentResponseModel, TextFileResponseModelBaseModel, FileItemResponseModelBaseModel, MediaTypeResponseModel, MediaTypeTreeItemResponseModel } from '../../external/backend-api/index.js';
2
2
  export declare const createEntityTreeItem: (item: any) => EntityTreeItemResponseModel;
3
3
  export declare const createFolderTreeItem: (item: any) => FolderTreeItemResponseModel;
4
4
  export declare const createContentTreeItem: (item: any) => ContentTreeItemResponseModel & {
@@ -8,6 +8,10 @@ export declare const createDocumentTreeItem: (item: DocumentResponseModel) => Do
8
8
  isTrashed: boolean;
9
9
  };
10
10
  export declare const createDocumentTypeTreeItem: (item: DocumentTypeResponseModel) => DocumentTypeTreeItemResponseModel;
11
+ export declare const createMediaTypeTreeItem: (item: MediaTypeResponseModel) => MediaTypeTreeItemResponseModel;
11
12
  export declare const createFileSystemTreeItem: (item: any) => FileSystemTreeItemPresentationModel;
12
13
  export declare const createTextFileItem: (item: any) => TextFileResponseModelBaseModel;
13
14
  export declare const createFileItemResponseModelBaseModel: (item: any) => FileItemResponseModelBaseModel;
15
+ export declare const arrayFilter: (filterBy: Array<string>, value?: Array<string>) => boolean;
16
+ export declare const stringFilter: (filterBy: Array<string>, value?: string) => boolean;
17
+ export declare const queryFilter: (filterBy: string, value?: string) => boolean;
@@ -46,6 +46,12 @@ export const createDocumentTypeTreeItem = (item) => {
46
46
  isElement: item.isElement,
47
47
  };
48
48
  };
49
+ export const createMediaTypeTreeItem = (item) => {
50
+ return {
51
+ ...createEntityTreeItem(item),
52
+ type: 'media-type',
53
+ };
54
+ };
49
55
  export const createFileSystemTreeItem = (item) => {
50
56
  return {
51
57
  name: item.name,
@@ -65,3 +71,24 @@ export const createFileItemResponseModelBaseModel = (item) => ({
65
71
  name: item.name,
66
72
  icon: item.icon,
67
73
  });
74
+ export const arrayFilter = (filterBy, value) => {
75
+ // if a filter is not set, return all items
76
+ if (!filterBy) {
77
+ return true;
78
+ }
79
+ return filterBy.some((filterValue) => value?.includes(filterValue));
80
+ };
81
+ export const stringFilter = (filterBy, value) => {
82
+ // if a filter is not set, return all items
83
+ if (!filterBy || !value) {
84
+ return true;
85
+ }
86
+ return filterBy.includes(value);
87
+ };
88
+ export const queryFilter = (filterBy, value) => {
89
+ if (!filterBy || !value) {
90
+ return true;
91
+ }
92
+ const query = filterBy.toLowerCase();
93
+ return value.toLowerCase().includes(query);
94
+ };
@@ -0,0 +1 @@
1
+ export declare const detailHandlers: import("msw").RestHandler<import("msw/lib/glossary-de6278a9.js").M<import("msw/lib/glossary-de6278a9.js").h>>[];
@@ -0,0 +1,37 @@
1
+ const { rest } = window.MockServiceWorker;
2
+ import { umbMediaTypeData } from '../../data/media-type.data.js';
3
+ import { slug } from './slug.js';
4
+ import { umbracoPath } from '../../../shared/utils/index.js';
5
+ export const detailHandlers = [
6
+ rest.post(umbracoPath(`${slug}`), async (req, res, ctx) => {
7
+ const data = await req.json();
8
+ if (!data)
9
+ return;
10
+ umbMediaTypeData.insert(data);
11
+ return res(ctx.status(200));
12
+ }),
13
+ rest.get(umbracoPath(`${slug}/:id`), (req, res, ctx) => {
14
+ const id = req.params.id;
15
+ if (!id)
16
+ return;
17
+ const data = umbMediaTypeData.getById(id);
18
+ return res(ctx.status(200), ctx.json(data));
19
+ }),
20
+ rest.put(umbracoPath(`${slug}/:id`), async (req, res, ctx) => {
21
+ const id = req.params.id;
22
+ if (!id)
23
+ return;
24
+ const data = await req.json();
25
+ if (!data)
26
+ return;
27
+ const saved = umbMediaTypeData.save(id, data);
28
+ return res(ctx.status(200), ctx.json(saved));
29
+ }),
30
+ rest.delete(umbracoPath(`${slug}/:id`), async (req, res, ctx) => {
31
+ const id = req.params.id;
32
+ if (!id)
33
+ return;
34
+ umbMediaTypeData.delete([id]);
35
+ return res(ctx.status(200));
36
+ }),
37
+ ];
@@ -0,0 +1,4 @@
1
+ import { treeHandlers } from './tree.handlers.js';
2
+ import { itemHandlers } from './item.handlers.js';
3
+ import { detailHandlers } from './detail.handlers.js';
4
+ export const handlers = [...treeHandlers, ...itemHandlers, ...detailHandlers];
@@ -0,0 +1 @@
1
+ export declare const itemHandlers: import("msw").RestHandler<import("msw/lib/glossary-de6278a9.js").M<import("msw/lib/glossary-de6278a9.js").h>>[];
@@ -0,0 +1,20 @@
1
+ const { rest } = window.MockServiceWorker;
2
+ import { umbMediaTypeData } from '../../data/media-type.data.js';
3
+ import { slug } from './slug.js';
4
+ import { umbracoPath } from '../../../shared/utils/index.js';
5
+ export const itemHandlers = [
6
+ rest.get(umbracoPath(`${slug}/item`), (req, res, ctx) => {
7
+ const ids = req.url.searchParams.getAll('id');
8
+ if (!ids)
9
+ return;
10
+ const items = umbMediaTypeData.getItems(ids);
11
+ return res(ctx.status(200), ctx.json(items));
12
+ }),
13
+ rest.get(umbracoPath(`/tree${slug}/item`), (req, res, ctx) => {
14
+ const ids = req.url.searchParams.getAll('id');
15
+ if (!ids)
16
+ return;
17
+ const items = umbMediaTypeData.getTreeItems(ids);
18
+ return res(ctx.status(200), ctx.json(items));
19
+ }),
20
+ ];
@@ -0,0 +1 @@
1
+ export declare const slug = "/media-type";
@@ -0,0 +1 @@
1
+ export const slug = '/media-type';
@@ -0,0 +1 @@
1
+ export declare const treeHandlers: import("msw").RestHandler<import("msw/lib/glossary-de6278a9.js").M<import("msw/lib/glossary-de6278a9.js").h>>[];
@@ -0,0 +1,25 @@
1
+ const { rest } = window.MockServiceWorker;
2
+ import { umbMediaTypeData } from '../../data/media-type.data.js';
3
+ import { slug } from './slug.js';
4
+ import { umbracoPath } from '../../../shared/utils/index.js';
5
+ export const treeHandlers = [
6
+ rest.get(umbracoPath(`/tree${slug}/root`), (req, res, ctx) => {
7
+ const rootItems = umbMediaTypeData.getTreeRoot();
8
+ const response = {
9
+ total: rootItems.length,
10
+ items: rootItems,
11
+ };
12
+ return res(ctx.status(200), ctx.json(response));
13
+ }),
14
+ rest.get(umbracoPath(`/tree${slug}/children`), (req, res, ctx) => {
15
+ const parentId = req.url.searchParams.get('parentId');
16
+ if (!parentId)
17
+ return;
18
+ const children = umbMediaTypeData.getTreeItemChildren(parentId);
19
+ const response = {
20
+ total: children.length,
21
+ items: children,
22
+ };
23
+ return res(ctx.status(200), ctx.json(response));
24
+ }),
25
+ ];
@@ -3,6 +3,10 @@ import { umbUsersData } from '../../data/user.data.js';
3
3
  import { slug } from './slug.js';
4
4
  import { umbracoPath } from '../../../shared/utils/index.js';
5
5
  export const handlers = [
6
+ rest.get(umbracoPath(`${slug}`), (req, res, ctx) => {
7
+ const response = umbUsersData.getAll();
8
+ return res(ctx.status(200), ctx.json(response));
9
+ }),
6
10
  rest.post(umbracoPath(`${slug}`), async (req, res, ctx) => {
7
11
  const data = await req.json();
8
12
  if (!data)
@@ -10,15 +14,6 @@ export const handlers = [
10
14
  const response = umbUsersData.createUser(data);
11
15
  return res(ctx.status(200), ctx.json(response));
12
16
  }),
13
- rest.get(umbracoPath(`${slug}`), (req, res, ctx) => {
14
- const response = umbUsersData.getAll();
15
- return res(ctx.status(200), ctx.json(response));
16
- }),
17
- rest.get(umbracoPath(`${slug}/filter`), (req, res, ctx) => {
18
- //TODO: Implementer filter
19
- const response = umbUsersData.getAll();
20
- return res(ctx.status(200), ctx.json(response));
21
- }),
22
17
  rest.get(umbracoPath(`${slug}/:id`), (req, res, ctx) => {
23
18
  const id = req.params.id;
24
19
  if (!id)
@@ -0,0 +1 @@
1
+ export declare const handlers: import("msw").RestHandler<import("msw/lib/glossary-de6278a9.js").M<import("msw/lib/glossary-de6278a9.js").h>>[];
@@ -0,0 +1,26 @@
1
+ const { rest } = window.MockServiceWorker;
2
+ import { umbUsersData } from '../../data/user.data.js';
3
+ import { slug } from './slug.js';
4
+ import { umbracoPath } from '../../../shared/utils/index.js';
5
+ export const handlers = [
6
+ rest.get(umbracoPath(`${slug}/filter`), (req, res, ctx) => {
7
+ const skip = Number(req.url.searchParams.get('skip'));
8
+ const take = Number(req.url.searchParams.get('take'));
9
+ const orderBy = req.url.searchParams.get('orderBy');
10
+ const orderDirection = req.url.searchParams.get('orderDirection');
11
+ const userGroupIds = req.url.searchParams.getAll('userGroupIds');
12
+ const userStates = req.url.searchParams.getAll('userStates');
13
+ const filter = req.url.searchParams.get('filter');
14
+ const options = {
15
+ skip: skip || undefined,
16
+ take: take || undefined,
17
+ orderBy: orderBy || undefined,
18
+ orderDirection: orderDirection || undefined,
19
+ userGroupIds: userGroupIds.length > 0 ? userGroupIds : undefined,
20
+ userStates: userStates.length > 0 ? userStates : undefined,
21
+ filter: filter || undefined,
22
+ };
23
+ const response = umbUsersData.filter(options);
24
+ return res(ctx.status(200), ctx.json(response));
25
+ }),
26
+ ];
@@ -7,6 +7,7 @@ import { handlers as disableHandlers } from './disable.handlers.js';
7
7
  import { handlers as changePasswordHandlers } from './change-password.handlers.js';
8
8
  import { handlers as unlockHandlers } from './unlock.handlers.js';
9
9
  import { handlers as inviteHandlers } from './invite.handlers.js';
10
+ import { handlers as filterHandlers } from './filter.handlers.js';
10
11
  export const handlers = [
11
12
  ...itemHandlers,
12
13
  ...currentHandlers,
@@ -15,6 +16,7 @@ export const handlers = [
15
16
  ...setUserGroupsHandlers,
16
17
  ...changePasswordHandlers,
17
18
  ...unlockHandlers,
18
- ...detailHandlers,
19
+ ...filterHandlers,
19
20
  ...inviteHandlers,
21
+ ...detailHandlers,
20
22
  ];
@@ -1,21 +1,24 @@
1
+ import { UmbCollectionConfiguration } from './types.js';
1
2
  import { UmbCollectionRepository } from '../repository/index.js';
2
3
  import { UmbBaseController, type UmbControllerHostElement } from '../../../libs/controller-api/index.js';
3
4
  import { UmbContextToken } from '../../../libs/context-api/index.js';
4
5
  import { ManifestCollectionView } from '../extension-registry/index.js';
5
6
  import type { UmbCollectionFilterModel } from './index.js';
7
+ import { UmbPaginationManager } from '../../../shared/utils/index.js';
6
8
  export declare class UmbCollectionContext<ItemType, FilterModelType extends UmbCollectionFilterModel> extends UmbBaseController {
7
9
  #private;
8
10
  protected entityType: string;
9
11
  protected init: Promise<[import("../extension-registry/index.js").ManifestRepository, ManifestCollectionView[]]>;
10
- readonly items: import("rxjs/internal/Observable").Observable<ItemType[]>;
11
- readonly total: import("rxjs/internal/Observable").Observable<number>;
12
- readonly selection: import("rxjs/internal/Observable").Observable<(string | null)[]>;
13
- readonly filter: import("rxjs/internal/Observable").Observable<object | FilterModelType>;
14
- readonly views: import("rxjs/internal/Observable").Observable<ManifestCollectionView[]>;
15
- readonly currentView: import("rxjs/internal/Observable").Observable<ManifestCollectionView | undefined>;
12
+ readonly items: import("rxjs/internal/Observable.js").Observable<ItemType[]>;
13
+ readonly totalItems: import("rxjs/internal/Observable.js").Observable<number>;
14
+ readonly selection: import("rxjs/internal/Observable.js").Observable<(string | null)[]>;
15
+ readonly filter: import("rxjs/internal/Observable.js").Observable<object | FilterModelType>;
16
+ readonly views: import("rxjs/internal/Observable.js").Observable<ManifestCollectionView[]>;
17
+ readonly currentView: import("rxjs/internal/Observable.js").Observable<ManifestCollectionView | undefined>;
16
18
  repository?: UmbCollectionRepository;
17
19
  collectionRootPathname: string;
18
- constructor(host: UmbControllerHostElement, entityType: string, repositoryAlias: string);
20
+ readonly pagination: UmbPaginationManager;
21
+ constructor(host: UmbControllerHostElement, entityType: string, repositoryAlias: string, config?: UmbCollectionConfiguration);
19
22
  /**
20
23
  * Returns true if the given id is selected.
21
24
  * @param {string} id
@@ -4,20 +4,21 @@ import { UmbArrayState, UmbNumberState, UmbObjectState, } from '../../../libs/ob
4
4
  import { createExtensionApi } from '../../../libs/extension-api/index.js';
5
5
  import { umbExtensionsRegistry } from '../extension-registry/index.js';
6
6
  import { map } from '../../../external/rxjs/index.js';
7
- import { UmbSelectionManager } from '../../../shared/utils/index.js';
7
+ import { UmbSelectionManager, UmbPaginationManager } from '../../../shared/utils/index.js';
8
+ import { UmbChangeEvent } from '../event/index.js';
8
9
  export class UmbCollectionContext extends UmbBaseController {
9
10
  #items;
10
- #total;
11
+ #totalItems;
11
12
  #selectionManager;
12
13
  #filter;
13
14
  #views;
14
15
  #currentView;
15
- constructor(host, entityType, repositoryAlias) {
16
+ constructor(host, entityType, repositoryAlias, config = { pageSize: 50 }) {
16
17
  super(host);
17
18
  this.#items = new UmbArrayState([]);
18
19
  this.items = this.#items.asObservable();
19
- this.#total = new UmbNumberState(0);
20
- this.total = this.#total.asObservable();
20
+ this.#totalItems = new UmbNumberState(0);
21
+ this.totalItems = this.#totalItems.asObservable();
21
22
  this.#selectionManager = new UmbSelectionManager();
22
23
  this.selection = this.#selectionManager.selection;
23
24
  this.#filter = new UmbObjectState({});
@@ -26,25 +27,22 @@ export class UmbCollectionContext extends UmbBaseController {
26
27
  this.views = this.#views.asObservable();
27
28
  this.#currentView = new UmbObjectState(undefined);
28
29
  this.currentView = this.#currentView.asObservable();
30
+ this.pagination = new UmbPaginationManager();
31
+ this.#onPageChange = (event) => {
32
+ const target = event.target;
33
+ const skipFilter = { skip: target.getSkip() };
34
+ this.setFilter(skipFilter);
35
+ };
29
36
  this.entityType = entityType;
30
- this.#selectionManager.setMultiple(true);
37
+ // listen for page changes on the pagination manager
38
+ this.pagination.addEventListener(UmbChangeEvent.TYPE, this.#onPageChange);
31
39
  const currentUrl = new URL(window.location.href);
32
40
  this.collectionRootPathname = currentUrl.pathname.substring(0, currentUrl.pathname.lastIndexOf('/'));
33
41
  this.init = Promise.all([
34
- this.observe(umbExtensionsRegistry.getByTypeAndAlias('repository', repositoryAlias), async (repositoryManifest) => {
35
- if (repositoryManifest) {
36
- const result = await createExtensionApi(repositoryManifest, [this._host]);
37
- this.repository = result;
38
- this.requestCollection();
39
- }
40
- }, 'umbCollectionRepositoryObserver').asPromise(),
41
- this.observe(umbExtensionsRegistry.extensionsOfType('collectionView').pipe(map((extensions) => {
42
- return extensions.filter((extension) => extension.conditions.entityType === this.getEntityType());
43
- })), (views) => {
44
- this.#views.next(views);
45
- this.#setCurrentView();
46
- }, 'umbCollectionViewsObserver').asPromise(),
42
+ this.#observeRepository(repositoryAlias).asPromise(),
43
+ this.#observeViews().asPromise(),
47
44
  ]);
45
+ this.#configure(config);
48
46
  this.provideContext(UMB_COLLECTION_CONTEXT, this);
49
47
  }
50
48
  /**
@@ -114,8 +112,9 @@ export class UmbCollectionContext extends UmbBaseController {
114
112
  const filter = this.#filter.getValue();
115
113
  const { data } = await this.repository.requestCollection(filter);
116
114
  if (data) {
117
- this.#total.next(data.total);
118
115
  this.#items.next(data.items);
116
+ this.#totalItems.next(data.total);
117
+ this.pagination.setTotalItems(data.total);
119
118
  }
120
119
  }
121
120
  /**
@@ -144,6 +143,29 @@ export class UmbCollectionContext extends UmbBaseController {
144
143
  getCurrentView() {
145
144
  return this.#currentView.getValue();
146
145
  }
146
+ #configure(configuration) {
147
+ this.#selectionManager.setMultiple(true);
148
+ this.pagination.setPageSize(configuration.pageSize);
149
+ this.#filter.next({ ...this.#filter.getValue(), skip: 0, take: configuration.pageSize });
150
+ }
151
+ #observeRepository(repositoryAlias) {
152
+ return this.observe(umbExtensionsRegistry.getByTypeAndAlias('repository', repositoryAlias), async (repositoryManifest) => {
153
+ if (repositoryManifest) {
154
+ const result = await createExtensionApi(repositoryManifest, [this._host]);
155
+ this.repository = result;
156
+ this.requestCollection();
157
+ }
158
+ }, 'umbCollectionRepositoryObserver');
159
+ }
160
+ #observeViews() {
161
+ return this.observe(umbExtensionsRegistry.extensionsOfType('collectionView').pipe(map((extensions) => {
162
+ return extensions.filter((extension) => extension.conditions.entityType === this.getEntityType());
163
+ })), (views) => {
164
+ this.#views.next(views);
165
+ this.#setCurrentView();
166
+ }, 'umbCollectionViewsObserver');
167
+ }
168
+ #onPageChange;
147
169
  #setCurrentView() {
148
170
  const currentUrl = new URL(window.location.href);
149
171
  const lastPathSegment = currentUrl.pathname.split('/').pop();