@webiny/app-aco 6.4.11 → 6.6.0-alpha.1

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 (184) hide show
  1. package/components/Actions/DeleteFolder/DeleteFolder.js +1 -1
  2. package/components/Actions/DeleteFolder/DeleteFolder.js.map +1 -1
  3. package/components/AdvancedSearch/AdvancedSearch.d.ts +2 -2
  4. package/components/AdvancedSearch/QueryBuilderDrawer/QueryBuilderDrawer.d.ts +2 -2
  5. package/components/AdvancedSearch/domain/Filter.d.ts +1 -1
  6. package/components/AdvancedSearch/domain/FilterRepositoryFactory.d.ts +2 -2
  7. package/components/AdvancedSearch/domain/FilterRepositoryFactory.js.map +1 -1
  8. package/components/AdvancedSearch/gateways/FiltersGraphQLGateway.d.ts +2 -2
  9. package/components/AdvancedSearch/gateways/FiltersGraphQLGateway.js +9 -10
  10. package/components/AdvancedSearch/gateways/FiltersGraphQLGateway.js.map +1 -1
  11. package/components/AdvancedSearch/gateways/filters.gql.d.ts +5 -5
  12. package/components/AdvancedSearch/gateways/filters.gql.js +5 -6
  13. package/components/AdvancedSearch/gateways/filters.gql.js.map +1 -1
  14. package/components/AdvancedSearch/useFilterRepository.js +7 -2
  15. package/components/AdvancedSearch/useFilterRepository.js.map +1 -1
  16. package/components/FolderTree/List/List.js +6 -14
  17. package/components/FolderTree/List/List.js.map +1 -1
  18. package/components/Table/cells/CellAuthor.d.ts +2 -0
  19. package/components/Table/cells/CellAuthor.js +10 -0
  20. package/components/Table/cells/CellAuthor.js.map +1 -0
  21. package/components/Table/cells/CellCreated.d.ts +2 -0
  22. package/components/Table/cells/CellCreated.js +13 -0
  23. package/components/Table/cells/CellCreated.js.map +1 -0
  24. package/components/Table/cells/CellModified.d.ts +2 -0
  25. package/components/Table/cells/CellModified.js +13 -0
  26. package/components/Table/cells/CellModified.js.map +1 -0
  27. package/components/Table/cells/index.d.ts +3 -0
  28. package/components/Table/cells/index.js +3 -0
  29. package/components/Table/components/Table/TableInner.d.ts +2 -2
  30. package/components/Table/createTableData.d.ts +7 -5
  31. package/components/Table/createTableData.js +22 -7
  32. package/components/Table/createTableData.js.map +1 -1
  33. package/components/Table/index.d.ts +2 -2
  34. package/components/Table/index.js +2 -2
  35. package/components/index.d.ts +0 -1
  36. package/components/index.js +0 -1
  37. package/config/AcoConfig.d.ts +8 -12
  38. package/config/advanced-search/FieldRenderer.d.ts +3 -1
  39. package/config/folder/Action.d.ts +1 -1
  40. package/config/folder/index.d.ts +3 -2
  41. package/config/index.d.ts +0 -1
  42. package/config/index.js +0 -1
  43. package/config/record/Action.d.ts +1 -1
  44. package/config/record/index.d.ts +1 -1
  45. package/config/table/Column.d.ts +8 -39
  46. package/config/table/Column.js +4 -67
  47. package/config/table/Column.js.map +1 -1
  48. package/config/table/Sorting.d.ts +2 -11
  49. package/config/table/Sorting.js +1 -28
  50. package/config/table/index.d.ts +5 -9
  51. package/contexts/index.d.ts +0 -3
  52. package/contexts/index.js +0 -3
  53. package/dialogs/DialogSetPermissions/graphql.d.ts +1 -1
  54. package/dialogs/DialogSetPermissions/graphql.js +1 -2
  55. package/dialogs/DialogSetPermissions/graphql.js.map +1 -1
  56. package/dialogs/useConfirmMoveFolderDialog.d.ts +0 -1
  57. package/dialogs/useConfirmMoveFolderDialog.js +2 -3
  58. package/dialogs/useConfirmMoveFolderDialog.js.map +1 -1
  59. package/dialogs/useCreateDialog.js +5 -9
  60. package/dialogs/useCreateDialog.js.map +1 -1
  61. package/dialogs/useEditDialog.js +2 -2
  62. package/dialogs/useEditDialog.js.map +1 -1
  63. package/dialogs/useSetPermissionsDialog.js +16 -4
  64. package/dialogs/useSetPermissionsDialog.js.map +1 -1
  65. package/domain/folder/Folder.d.ts +2 -1
  66. package/domain/folder/Folder.js.map +1 -1
  67. package/features/folders/createFolder/CreateFolderGqlGateway.d.ts +3 -3
  68. package/features/folders/createFolder/CreateFolderGqlGateway.js +15 -16
  69. package/features/folders/createFolder/CreateFolderGqlGateway.js.map +1 -1
  70. package/features/folders/deleteFolder/DeleteFolderGqlGateway.d.ts +3 -3
  71. package/features/folders/deleteFolder/DeleteFolderGqlGateway.js +5 -6
  72. package/features/folders/deleteFolder/DeleteFolderGqlGateway.js.map +1 -1
  73. package/features/folders/folderModelProvider/FolderModelProvider.js +29 -31
  74. package/features/folders/folderModelProvider/FolderModelProvider.js.map +1 -1
  75. package/features/folders/folderModelProvider/GetFolderModelGqlGateway.d.ts +3 -3
  76. package/features/folders/folderModelProvider/GetFolderModelGqlGateway.js +5 -7
  77. package/features/folders/folderModelProvider/GetFolderModelGqlGateway.js.map +1 -1
  78. package/features/folders/getFolder/GetFolderGqlGateway.d.ts +3 -3
  79. package/features/folders/getFolder/GetFolderGqlGateway.js +5 -7
  80. package/features/folders/getFolder/GetFolderGqlGateway.js.map +1 -1
  81. package/features/folders/getFolderExtensionsFields/GetFolderExtensionsFieldsUseCase.d.ts +3 -3
  82. package/features/folders/getFolderExtensionsFields/useFolderExtensionsFields.d.ts +3 -3
  83. package/features/folders/getFolderLevelPermission/GetFolderLevelPermission.test.js +12 -16
  84. package/features/folders/getFolderLevelPermission/GetFolderLevelPermission.test.js.map +1 -1
  85. package/features/folders/getFolderLevelPermission/decorators/GetFolderLevelPermissionWithFlpDecorator.d.ts +3 -3
  86. package/features/folders/getFolderLevelPermission/decorators/GetFolderLevelPermissionWithFlpDecorator.js +5 -5
  87. package/features/folders/getFolderLevelPermission/decorators/GetFolderLevelPermissionWithFlpDecorator.js.map +1 -1
  88. package/features/folders/listFolders/ListFoldersGqlGateway.d.ts +1 -1
  89. package/features/folders/listFolders/ListFoldersGqlGateway.js +1 -2
  90. package/features/folders/listFolders/ListFoldersGqlGateway.js.map +1 -1
  91. package/features/folders/listFolders/useListFolders.d.ts +1 -1
  92. package/features/folders/listFoldersByParentIds/ListFoldersByParentIdsGqlGateway.d.ts +3 -3
  93. package/features/folders/listFoldersByParentIds/ListFoldersByParentIdsGqlGateway.js +5 -7
  94. package/features/folders/listFoldersByParentIds/ListFoldersByParentIdsGqlGateway.js.map +1 -1
  95. package/features/folders/listFoldersByParentIds/useListFoldersByParentIds.d.ts +2 -2
  96. package/features/folders/loadFolderHierarchy/useLoadFolderHierarchy.d.ts +2 -2
  97. package/features/folders/updateFolder/UpdateFolderGqlGateway.d.ts +3 -3
  98. package/features/folders/updateFolder/UpdateFolderGqlGateway.js +5 -6
  99. package/features/folders/updateFolder/UpdateFolderGqlGateway.js.map +1 -1
  100. package/hooks/index.d.ts +0 -6
  101. package/hooks/index.js +0 -6
  102. package/index.d.ts +3 -2
  103. package/index.js +2 -2
  104. package/package.json +21 -28
  105. package/presentation/folderTree/FolderTreePresenter.d.ts +3 -1
  106. package/presentation/folderTree/FolderTreePresenter.js +15 -23
  107. package/presentation/folderTree/FolderTreePresenter.js.map +1 -1
  108. package/presentation/folderTree/FolderTreePresenter.test.js +8 -2
  109. package/presentation/folderTree/FolderTreePresenter.test.js.map +1 -1
  110. package/table.types.d.ts +2 -9
  111. package/types.d.ts +5 -26
  112. package/types.js.map +1 -1
  113. package/components/Extensions/Extensions.d.ts +0 -2
  114. package/components/Extensions/Extensions.js +0 -30
  115. package/components/Extensions/Extensions.js.map +0 -1
  116. package/components/Extensions/index.d.ts +0 -1
  117. package/components/Extensions/index.js +0 -1
  118. package/config/folder/createFolderFieldDecoratorFactory.d.ts +0 -13
  119. package/config/folder/createFolderFieldDecoratorFactory.js +0 -17
  120. package/config/folder/createFolderFieldDecoratorFactory.js.map +0 -1
  121. package/config/table/Sorting.js.map +0 -1
  122. package/contexts/acoList.d.ts +0 -49
  123. package/contexts/acoList.js +0 -303
  124. package/contexts/acoList.js.map +0 -1
  125. package/contexts/app.d.ts +0 -33
  126. package/contexts/app.js +0 -47
  127. package/contexts/app.js.map +0 -1
  128. package/contexts/folders.d.ts +0 -12
  129. package/contexts/folders.js +0 -32
  130. package/contexts/folders.js.map +0 -1
  131. package/contexts/navigateFolder.d.ts +0 -17
  132. package/contexts/navigateFolder.js +0 -54
  133. package/contexts/navigateFolder.js.map +0 -1
  134. package/contexts/records.d.ts +0 -31
  135. package/contexts/records.js +0 -316
  136. package/contexts/records.js.map +0 -1
  137. package/exports/admin/aco.d.ts +0 -2
  138. package/exports/admin/aco.js +0 -2
  139. package/graphql/app.gql.d.ts +0 -17
  140. package/graphql/app.gql.js +0 -22
  141. package/graphql/app.gql.js.map +0 -1
  142. package/graphql/records/common.d.ts +0 -4
  143. package/graphql/records/common.js +0 -57
  144. package/graphql/records/common.js.map +0 -1
  145. package/graphql/records/getRecord.d.ts +0 -2
  146. package/graphql/records/getRecord.js +0 -5
  147. package/graphql/records/getRecord.js.map +0 -1
  148. package/graphql/records/listRecords.d.ts +0 -2
  149. package/graphql/records/listRecords.js +0 -26
  150. package/graphql/records/listRecords.js.map +0 -1
  151. package/graphql/records/moveRecord.d.ts +0 -2
  152. package/graphql/records/moveRecord.js +0 -16
  153. package/graphql/records/moveRecord.js.map +0 -1
  154. package/graphql/records/types.d.ts +0 -108
  155. package/graphql/records/types.js +0 -0
  156. package/graphql/records.gql.d.ts +0 -3
  157. package/graphql/records.gql.js +0 -3
  158. package/handlers.d.ts +0 -23
  159. package/handlers.js +0 -22
  160. package/handlers.js.map +0 -1
  161. package/hooks/useAcoApp.d.ts +0 -2
  162. package/hooks/useAcoApp.js +0 -16
  163. package/hooks/useAcoApp.js.map +0 -1
  164. package/hooks/useAcoList.d.ts +0 -3
  165. package/hooks/useAcoList.js +0 -10
  166. package/hooks/useAcoList.js.map +0 -1
  167. package/hooks/useFolderModel.d.ts +0 -2
  168. package/hooks/useFolderModel.js +0 -16
  169. package/hooks/useFolderModel.js.map +0 -1
  170. package/hooks/useFoldersType.d.ts +0 -1
  171. package/hooks/useFoldersType.js +0 -12
  172. package/hooks/useFoldersType.js.map +0 -1
  173. package/hooks/useNavigateFolder.d.ts +0 -2
  174. package/hooks/useNavigateFolder.js +0 -10
  175. package/hooks/useNavigateFolder.js.map +0 -1
  176. package/hooks/useRecords.d.ts +0 -62
  177. package/hooks/useRecords.js +0 -64
  178. package/hooks/useRecords.js.map +0 -1
  179. package/hooks/useTags.d.ts +0 -14
  180. package/hooks/useTags.js +0 -27
  181. package/hooks/useTags.js.map +0 -1
  182. package/sorting.d.ts +0 -9
  183. package/sorting.js +0 -31
  184. package/sorting.js.map +0 -1
@@ -11,6 +11,7 @@ import { ListFoldersByParentIdsUseCase } from "../../features/folders/listFolder
11
11
  import { GetFolderAncestorsUseCase } from "../../features/folders/getFolderAncestors/abstractions.js";
12
12
  import { GetFolderLevelPermissionUseCase } from "../../features/folders/getFolderLevelPermission/abstractions.js";
13
13
  import { FormModelFactory } from "@webiny/app-admin/features/formModel/abstractions.js";
14
+ import { StringFormatter } from "@webiny/app-admin/features/stringFormatter/abstractions.js";
14
15
  import { ListCache } from "../../features/folders/cache/index.js";
15
16
  import { Folder } from "../../domain/folder/Folder.js";
16
17
  const TYPE = "FmFile";
@@ -107,6 +108,7 @@ function createMockFormModel() {
107
108
  isDirty: false,
108
109
  isValid: null,
109
110
  errors: [],
111
+ hasErrors: false,
110
112
  submitCount: 0,
111
113
  focusField: vi.fn(),
112
114
  getData: vi.fn(()=>({})),
@@ -114,7 +116,8 @@ function createMockFormModel() {
114
116
  },
115
117
  getFieldBuilders: vi.fn(()=>[]),
116
118
  resolveChildLayout: vi.fn(()=>[]),
117
- registry: {}
119
+ registry: {},
120
+ traverse: vi.fn()
118
121
  };
119
122
  return form;
120
123
  }
@@ -170,6 +173,9 @@ function createTestPresenter(folders = []) {
170
173
  execute: vi.fn().mockReturnValue(true)
171
174
  });
172
175
  container.registerInstance(FormModelFactory, formModelFactory);
176
+ container.registerInstance(StringFormatter, {
177
+ slugify: (value)=>value
178
+ });
173
179
  FolderTreePresenterFeature.register(container);
174
180
  const presenter = container.resolve(FolderTreePresenter);
175
181
  return {
@@ -400,7 +406,7 @@ describe("FolderTreePresenter", ()=>{
400
406
  presenter.createFolder("root-1");
401
407
  await presenter.submitOperation();
402
408
  expect(createFolderUseCase.execute).toHaveBeenCalledTimes(1);
403
- expect(listFolders.execute).toHaveBeenCalledTimes(2);
409
+ expect(listFolders.execute).toHaveBeenCalledTimes(1);
404
410
  });
405
411
  });
406
412
  describe("editFolder", ()=>{
@@ -1 +1 @@
1
- {"version":3,"file":"presentation/folderTree/FolderTreePresenter.test.js","sources":["../../../src/presentation/folderTree/FolderTreePresenter.test.ts"],"sourcesContent":["import { describe, it, expect, vi } from \"vitest\";\nimport { Container } from \"@webiny/di\";\nimport { FolderTreePresenter as Abstraction } from \"./abstractions.js\";\nimport { FolderTreePresenterFeature } from \"./feature.js\";\nimport { FoldersCache, FoldersContext } from \"~/features/folders/abstractions.js\";\nimport { ListFoldersUseCase } from \"~/features/folders/listFolders/abstractions.js\";\nimport { CreateFolderUseCase } from \"~/features/folders/createFolder/abstractions.js\";\nimport { UpdateFolderUseCase } from \"~/features/folders/updateFolder/abstractions.js\";\nimport { DeleteFolderUseCase } from \"~/features/folders/deleteFolder/abstractions.js\";\nimport { ListFoldersByParentIdsUseCase } from \"~/features/folders/listFoldersByParentIds/abstractions.js\";\nimport { GetFolderAncestorsUseCase } from \"~/features/folders/getFolderAncestors/abstractions.js\";\nimport { GetFolderLevelPermissionUseCase } from \"~/features/folders/getFolderLevelPermission/abstractions.js\";\nimport { FormModelFactory } from \"@webiny/app-admin/features/formModel/abstractions.js\";\nimport { ListCache } from \"~/features/folders/cache/index.js\";\nimport { Folder } from \"~/domain/folder/Folder.js\";\nimport type {\n IFormModel,\n IFormModelConfig,\n IField\n} from \"@webiny/app-admin/features/formModel/abstractions.js\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst TYPE = \"FmFile\";\n\nfunction createFolder(data: {\n id: string;\n title: string;\n slug: string;\n parentId: string | null;\n}): Folder {\n return Folder.create({\n ...data,\n type: TYPE,\n permissions: []\n });\n}\n\nfunction createFlatFolders(): Folder[] {\n return [\n createFolder({ id: \"root-1\", title: \"Documents\", slug: \"documents\", parentId: null }),\n createFolder({ id: \"root-2\", title: \"Images\", slug: \"images\", parentId: null }),\n createFolder({ id: \"child-1\", title: \"Invoices\", slug: \"invoices\", parentId: \"root-1\" }),\n createFolder({\n id: \"child-2\",\n title: \"Contracts\",\n slug: \"contracts\",\n parentId: \"root-1\"\n }),\n createFolder({\n id: \"grandchild-1\",\n title: \"2024\",\n slug: \"2024\",\n parentId: \"child-1\"\n })\n ];\n}\n\n// ---------------------------------------------------------------------------\n// Mock FormModel\n// ---------------------------------------------------------------------------\n\nfunction createMockField(): IField {\n let value: unknown = undefined;\n return {\n getValue: vi.fn(() => value),\n setValue: vi.fn((v: unknown) => {\n value = v;\n }),\n setDisabled: vi.fn(),\n setVisible: vi.fn(),\n remove: vi.fn(),\n addBeforeChange: vi.fn(),\n addAfterChange: vi.fn(),\n addAfterSetValue: vi.fn(),\n addOnBlur: vi.fn(),\n blur: vi.fn(),\n as: vi.fn()\n } as unknown as IField;\n}\n\nfunction createMockFormModel(): IFormModel {\n const fields = new Map<string, IField>();\n let data: Record<string, unknown> = {};\n\n const form: IFormModel = {\n field(name: string) {\n if (!fields.has(name)) {\n fields.set(name, createMockField());\n }\n return fields.get(name)!;\n },\n fields: vi.fn(),\n layout: vi.fn() as IFormModel[\"layout\"],\n setLayout: vi.fn(),\n addRule: vi.fn(),\n getData: vi.fn(() => data),\n setData: vi.fn((d: Record<string, unknown>) => {\n data = d;\n }),\n reset: vi.fn(),\n validate: vi.fn(async () => true),\n submit: vi.fn(async () => data) as IFormModel[\"submit\"],\n evaluateRules: vi.fn(() => ({ visible: true, disabled: false })),\n focusField: vi.fn(),\n isDirty: false,\n isValid: null,\n submitted: false,\n submitCount: 0,\n errors: [],\n vm: {\n layout: [],\n isDirty: false,\n isValid: null,\n errors: [],\n submitCount: 0,\n focusField: vi.fn(),\n getData: vi.fn(() => ({})),\n setData: vi.fn()\n },\n getFieldBuilders: vi.fn(() => []),\n resolveChildLayout: vi.fn(() => []),\n registry: {} as IFormModel[\"registry\"]\n };\n\n return form;\n}\n\n// ---------------------------------------------------------------------------\n// Mock use cases\n// ---------------------------------------------------------------------------\n\nclass MockListFoldersUseCase implements ListFoldersUseCase.Interface {\n execute = vi.fn(async () => {});\n}\n\nclass MockCreateFolderUseCase implements CreateFolderUseCase.Interface {\n execute = vi.fn(async () => {});\n}\n\nclass MockUpdateFolderUseCase implements UpdateFolderUseCase.Interface {\n execute = vi.fn(async () => {});\n}\n\nclass MockDeleteFolderUseCase implements DeleteFolderUseCase.Interface {\n execute = vi.fn(async () => {});\n}\n\nclass MockFormModelFactory {\n create = vi.fn((_config: IFormModelConfig) => createMockFormModel());\n}\n\n// ---------------------------------------------------------------------------\n// Setup\n// ---------------------------------------------------------------------------\n\nfunction createTestPresenter(folders: Folder[] = []) {\n const container = new Container();\n const foldersCache = new ListCache<Folder>();\n const listFolders = new MockListFoldersUseCase();\n const createFolderUseCase = new MockCreateFolderUseCase();\n const updateFolderUseCase = new MockUpdateFolderUseCase();\n const deleteFolderUseCase = new MockDeleteFolderUseCase();\n const formModelFactory = new MockFormModelFactory();\n\n // Pre-populate cache.\n if (folders.length > 0) {\n foldersCache.addItems(folders);\n }\n\n container.registerInstance(FoldersContext, { type: TYPE });\n container.registerInstance(FoldersCache, foldersCache);\n container.registerInstance(ListFoldersUseCase, listFolders);\n container.registerInstance(CreateFolderUseCase, createFolderUseCase);\n container.registerInstance(UpdateFolderUseCase, updateFolderUseCase);\n container.registerInstance(DeleteFolderUseCase, deleteFolderUseCase);\n container.registerInstance(ListFoldersByParentIdsUseCase, {\n execute: vi.fn().mockResolvedValue(undefined)\n });\n container.registerInstance(GetFolderAncestorsUseCase, {\n execute: vi.fn().mockReturnValue([])\n });\n container.registerInstance(GetFolderLevelPermissionUseCase, {\n execute: vi.fn().mockReturnValue(true)\n });\n container.registerInstance(\n FormModelFactory,\n formModelFactory as unknown as FormModelFactory.Interface\n );\n\n FolderTreePresenterFeature.register(container);\n\n const presenter = container.resolve(Abstraction);\n\n return {\n presenter,\n foldersCache,\n listFolders,\n createFolderUseCase,\n updateFolderUseCase,\n deleteFolderUseCase,\n formModelFactory\n };\n}\n\n// ---------------------------------------------------------------------------\n// Tests\n// ---------------------------------------------------------------------------\n\ndescribe(\"FolderTreePresenter\", () => {\n // -------------------------------------------------------------------\n // Scoped initialization via FoldersContext\n // -------------------------------------------------------------------\n\n describe(\"scoped initialization\", () => {\n it(\"should load folders on construction via ListFoldersUseCase\", () => {\n const { listFolders } = createTestPresenter();\n expect(listFolders.execute).toHaveBeenCalledTimes(1);\n });\n\n it(\"should not require an init(type) method — type comes from FoldersContext\", () => {\n const { presenter } = createTestPresenter();\n // The presenter has no init method — it reads type from injected FoldersContext.\n expect((presenter as any).init).toBeUndefined();\n });\n\n it(\"should start with loading=true then resolve to false\", async () => {\n const { presenter } = createTestPresenter();\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n });\n });\n\n // -------------------------------------------------------------------\n // Tree computation from flat folder list\n // -------------------------------------------------------------------\n\n describe(\"tree computation\", () => {\n it(\"should build a nested tree from a flat folder list\", async () => {\n const folders = createFlatFolders();\n const { presenter } = createTestPresenter(folders);\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n\n const { tree } = presenter.vm;\n\n // Two root nodes.\n expect(tree).toHaveLength(2);\n expect(tree[0].name).toBe(\"Documents\");\n expect(tree[1].name).toBe(\"Images\");\n\n // Documents has 2 children.\n expect(tree[0].children).toHaveLength(2);\n expect(tree[0].children[0].name).toBe(\"Invoices\");\n expect(tree[0].children[1].name).toBe(\"Contracts\");\n\n // Invoices has 1 grandchild.\n expect(tree[0].children[0].children).toHaveLength(1);\n expect(tree[0].children[0].children[0].name).toBe(\"2024\");\n\n // Images has no children.\n expect(tree[1].children).toHaveLength(0);\n });\n\n it(\"should return an empty tree when cache is empty\", async () => {\n const { presenter } = createTestPresenter([]);\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n\n expect(presenter.vm.tree).toEqual([]);\n });\n\n it(\"should treat folders with unknown parentId as root nodes\", async () => {\n const folders = [\n createFolder({\n id: \"orphan\",\n title: \"Orphan\",\n slug: \"orphan\",\n parentId: \"non-existent\"\n })\n ];\n const { presenter } = createTestPresenter(folders);\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n\n expect(presenter.vm.tree).toHaveLength(1);\n expect(presenter.vm.tree[0].name).toBe(\"Orphan\");\n });\n\n it(\"should map folder properties correctly to tree nodes\", async () => {\n const folders = [\n createFolder({\n id: \"f1\",\n title: \"My Folder\",\n slug: \"my-folder\",\n parentId: null\n })\n ];\n const { presenter } = createTestPresenter(folders);\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n\n const node = presenter.vm.tree[0];\n expect(node.id).toBe(\"f1\");\n expect(node.name).toBe(\"My Folder\");\n expect(node.slug).toBe(\"my-folder\");\n expect(node.parentId).toBeNull();\n expect(node.children).toEqual([]);\n });\n });\n\n // -------------------------------------------------------------------\n // selectFolder and onFolderChange\n // -------------------------------------------------------------------\n\n describe(\"selectFolder\", () => {\n it(\"should update currentFolderId\", async () => {\n const folders = createFlatFolders();\n const { presenter } = createTestPresenter(folders);\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n\n expect(presenter.vm.currentFolderId).toBeNull();\n\n presenter.selectFolder(\"root-1\");\n expect(presenter.vm.currentFolderId).toBe(\"root-1\");\n });\n\n it(\"should update currentFolder to the matching folder\", async () => {\n const folders = createFlatFolders();\n const { presenter } = createTestPresenter(folders);\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n\n presenter.selectFolder(\"child-1\");\n expect(presenter.vm.currentFolder).not.toBeNull();\n expect(presenter.vm.currentFolder!.id).toBe(\"child-1\");\n expect(presenter.vm.currentFolder!.title).toBe(\"Invoices\");\n });\n\n it(\"should set currentFolder to null when selecting root (null)\", async () => {\n const folders = createFlatFolders();\n const { presenter } = createTestPresenter(folders);\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n\n presenter.selectFolder(\"root-1\");\n expect(presenter.vm.currentFolder).not.toBeNull();\n\n presenter.selectFolder(null);\n expect(presenter.vm.currentFolderId).toBeNull();\n expect(presenter.vm.currentFolder).toBeNull();\n });\n\n it(\"should find deeply nested folders as currentFolder\", async () => {\n const folders = createFlatFolders();\n const { presenter } = createTestPresenter(folders);\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n\n presenter.selectFolder(\"grandchild-1\");\n expect(presenter.vm.currentFolder).not.toBeNull();\n expect(presenter.vm.currentFolder!.title).toBe(\"2024\");\n });\n });\n\n describe(\"onFolderChange\", () => {\n it(\"should fire callbacks when currentFolderId changes\", async () => {\n const folders = createFlatFolders();\n const { presenter } = createTestPresenter(folders);\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n\n const callback = vi.fn();\n presenter.onFolderChange(callback);\n\n presenter.selectFolder(\"root-1\");\n\n // MobX reaction fires synchronously for simple observable changes.\n expect(callback).toHaveBeenCalledTimes(1);\n expect(callback).toHaveBeenCalledWith(\"root-1\");\n });\n\n it(\"should fire callback with null when navigating to root\", async () => {\n const folders = createFlatFolders();\n const { presenter } = createTestPresenter(folders);\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n\n presenter.selectFolder(\"root-1\");\n\n const callback = vi.fn();\n presenter.onFolderChange(callback);\n\n presenter.selectFolder(null);\n expect(callback).toHaveBeenCalledWith(null);\n });\n\n it(\"should support multiple callbacks\", async () => {\n const { presenter } = createTestPresenter(createFlatFolders());\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n\n const cb1 = vi.fn();\n const cb2 = vi.fn();\n presenter.onFolderChange(cb1);\n presenter.onFolderChange(cb2);\n\n presenter.selectFolder(\"root-2\");\n\n expect(cb1).toHaveBeenCalledWith(\"root-2\");\n expect(cb2).toHaveBeenCalledWith(\"root-2\");\n });\n\n it(\"should return an unsubscribe function that stops callbacks\", async () => {\n const { presenter } = createTestPresenter(createFlatFolders());\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n\n const callback = vi.fn();\n const unsubscribe = presenter.onFolderChange(callback);\n\n presenter.selectFolder(\"root-1\");\n expect(callback).toHaveBeenCalledTimes(1);\n\n unsubscribe();\n\n presenter.selectFolder(\"root-2\");\n // Should not have been called again after unsubscribe.\n expect(callback).toHaveBeenCalledTimes(1);\n });\n\n it(\"should not fire callback when selecting the same folder\", async () => {\n const { presenter } = createTestPresenter(createFlatFolders());\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n\n presenter.selectFolder(\"root-1\");\n\n const callback = vi.fn();\n presenter.onFolderChange(callback);\n\n // Select the same folder again.\n presenter.selectFolder(\"root-1\");\n expect(callback).not.toHaveBeenCalled();\n });\n });\n\n // -------------------------------------------------------------------\n // createFolder / editFolder — operation state with FormModel\n // -------------------------------------------------------------------\n\n describe(\"createFolder\", () => {\n it(\"should set operation state with mode 'create' and a FormModel\", async () => {\n const { presenter, formModelFactory } = createTestPresenter(createFlatFolders());\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n\n presenter.createFolder(\"root-1\");\n\n expect(presenter.vm.operation.active).toBe(true);\n expect(presenter.vm.operation.mode).toBe(\"create\");\n expect(presenter.vm.operation.parentFolderId).toBe(\"root-1\");\n expect(presenter.vm.operation.form).toBeDefined();\n expect(formModelFactory.create).toHaveBeenCalledTimes(1);\n });\n\n it(\"should set parentFolderId to undefined when creating at root\", async () => {\n const { presenter } = createTestPresenter(createFlatFolders());\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n\n presenter.createFolder();\n\n expect(presenter.vm.operation.active).toBe(true);\n expect(presenter.vm.operation.mode).toBe(\"create\");\n expect(presenter.vm.operation.parentFolderId).toBeUndefined();\n });\n\n it(\"should wire submitOperation to CreateFolderUseCase\", async () => {\n const { presenter, createFolderUseCase, listFolders } =\n createTestPresenter(createFlatFolders());\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n\n presenter.createFolder(\"root-1\");\n\n await presenter.submitOperation();\n\n expect(createFolderUseCase.execute).toHaveBeenCalledTimes(1);\n expect(listFolders.execute).toHaveBeenCalledTimes(2);\n });\n });\n\n describe(\"editFolder\", () => {\n it(\"should set operation state with mode 'edit' and a FormModel\", async () => {\n const { presenter, formModelFactory } = createTestPresenter(createFlatFolders());\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n\n presenter.editFolder(\"root-1\");\n\n expect(presenter.vm.operation.active).toBe(true);\n expect(presenter.vm.operation.mode).toBe(\"edit\");\n expect(presenter.vm.operation.folderId).toBe(\"root-1\");\n expect(presenter.vm.operation.form).toBeDefined();\n expect(formModelFactory.create).toHaveBeenCalledTimes(1);\n });\n\n it(\"should pre-populate form with existing folder data\", async () => {\n const mockForm = createMockFormModel();\n const { presenter, formModelFactory } = createTestPresenter(createFlatFolders());\n formModelFactory.create.mockReturnValue(mockForm);\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n\n presenter.editFolder(\"root-1\");\n\n expect(mockForm.setData).toHaveBeenCalledWith({\n title: \"Documents\",\n slug: \"documents\"\n });\n });\n\n it(\"should do nothing when editing a non-existent folder\", async () => {\n const { presenter, formModelFactory } = createTestPresenter(createFlatFolders());\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n\n presenter.editFolder(\"non-existent\");\n\n expect(presenter.vm.operation.active).toBe(false);\n expect(presenter.vm.operation.mode).toBeNull();\n expect(formModelFactory.create).not.toHaveBeenCalled();\n });\n });\n\n // -------------------------------------------------------------------\n // deleteFolder — navigates to parent and updates tree\n // -------------------------------------------------------------------\n\n describe(\"deleteFolder\", () => {\n it(\"should call DeleteFolderUseCase with the folder id\", async () => {\n const { presenter, deleteFolderUseCase } = createTestPresenter(createFlatFolders());\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n\n await presenter.deleteFolder(\"child-1\");\n\n expect(deleteFolderUseCase.execute).toHaveBeenCalledWith(\"child-1\");\n });\n\n it(\"should set operation state with mode 'delete' during deletion\", async () => {\n const { presenter, deleteFolderUseCase } = createTestPresenter(createFlatFolders());\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n\n // Make delete hang so we can inspect intermediate state.\n let resolveDelete!: () => void;\n deleteFolderUseCase.execute.mockReturnValueOnce(\n new Promise<void>(resolve => {\n resolveDelete = resolve;\n })\n );\n\n const deletePromise = presenter.deleteFolder(\"child-1\");\n\n expect(presenter.vm.operation.active).toBe(true);\n expect(presenter.vm.operation.mode).toBe(\"delete\");\n expect(presenter.vm.operation.folderId).toBe(\"child-1\");\n\n resolveDelete();\n await deletePromise;\n\n // After completion, operation should be reset.\n expect(presenter.vm.operation.active).toBe(false);\n expect(presenter.vm.operation.mode).toBeNull();\n });\n\n it(\"should navigate to parent folder after deletion\", async () => {\n const { presenter } = createTestPresenter(createFlatFolders());\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n\n // child-1 has parentId \"root-1\".\n await presenter.deleteFolder(\"child-1\");\n\n expect(presenter.vm.currentFolderId).toBe(\"root-1\");\n });\n\n it(\"should navigate to root (null) when deleting a root folder\", async () => {\n const { presenter } = createTestPresenter(createFlatFolders());\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n\n // root-1 has parentId null.\n await presenter.deleteFolder(\"root-1\");\n\n expect(presenter.vm.currentFolderId).toBeNull();\n });\n\n it(\"should refresh the folder list after deletion\", async () => {\n const { presenter, listFolders } = createTestPresenter(createFlatFolders());\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n\n await presenter.deleteFolder(\"child-1\");\n\n // Initial load + refresh after delete.\n expect(listFolders.execute).toHaveBeenCalledTimes(2);\n });\n\n it(\"should fire onFolderChange callback when navigating to parent after delete\", async () => {\n const { presenter } = createTestPresenter(createFlatFolders());\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n\n const callback = vi.fn();\n presenter.onFolderChange(callback);\n\n // child-1 has parentId \"root-1\".\n await presenter.deleteFolder(\"child-1\");\n\n expect(callback).toHaveBeenCalledWith(\"root-1\");\n });\n });\n\n // -------------------------------------------------------------------\n // Operation state reset\n // -------------------------------------------------------------------\n\n describe(\"operation state\", () => {\n it(\"should start with inactive operation state\", async () => {\n const { presenter } = createTestPresenter();\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n\n expect(presenter.vm.operation.active).toBe(false);\n expect(presenter.vm.operation.mode).toBeNull();\n });\n });\n});\n"],"names":["TYPE","createFolder","data","Folder","createFlatFolders","createMockField","value","vi","v","createMockFormModel","fields","Map","form","name","d","MockListFoldersUseCase","MockCreateFolderUseCase","MockUpdateFolderUseCase","MockDeleteFolderUseCase","MockFormModelFactory","_config","createTestPresenter","folders","container","Container","foldersCache","ListCache","listFolders","createFolderUseCase","updateFolderUseCase","deleteFolderUseCase","formModelFactory","FoldersContext","FoldersCache","ListFoldersUseCase","CreateFolderUseCase","UpdateFolderUseCase","DeleteFolderUseCase","ListFoldersByParentIdsUseCase","undefined","GetFolderAncestorsUseCase","GetFolderLevelPermissionUseCase","FormModelFactory","FolderTreePresenterFeature","presenter","Abstraction","describe","it","expect","tree","node","callback","cb1","cb2","unsubscribe","mockForm","resolveDelete","Promise","resolve","deletePromise"],"mappings":"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"}
1
+ {"version":3,"file":"presentation/folderTree/FolderTreePresenter.test.js","sources":["../../../src/presentation/folderTree/FolderTreePresenter.test.ts"],"sourcesContent":["import { describe, it, expect, vi } from \"vitest\";\nimport { Container } from \"@webiny/di\";\nimport { FolderTreePresenter as Abstraction } from \"./abstractions.js\";\nimport { FolderTreePresenterFeature } from \"./feature.js\";\nimport { FoldersCache, FoldersContext } from \"~/features/folders/abstractions.js\";\nimport { ListFoldersUseCase } from \"~/features/folders/listFolders/abstractions.js\";\nimport { CreateFolderUseCase } from \"~/features/folders/createFolder/abstractions.js\";\nimport { UpdateFolderUseCase } from \"~/features/folders/updateFolder/abstractions.js\";\nimport { DeleteFolderUseCase } from \"~/features/folders/deleteFolder/abstractions.js\";\nimport { ListFoldersByParentIdsUseCase } from \"~/features/folders/listFoldersByParentIds/abstractions.js\";\nimport { GetFolderAncestorsUseCase } from \"~/features/folders/getFolderAncestors/abstractions.js\";\nimport { GetFolderLevelPermissionUseCase } from \"~/features/folders/getFolderLevelPermission/abstractions.js\";\nimport { FormModelFactory } from \"@webiny/app-admin/features/formModel/abstractions.js\";\nimport { StringFormatter } from \"@webiny/app-admin/features/stringFormatter/abstractions.js\";\nimport { ListCache } from \"~/features/folders/cache/index.js\";\nimport { Folder } from \"~/domain/folder/Folder.js\";\nimport type {\n IFormModel,\n IFormModelConfig,\n IField\n} from \"@webiny/app-admin/features/formModel/abstractions.js\";\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst TYPE = \"FmFile\";\n\nfunction createFolder(data: {\n id: string;\n title: string;\n slug: string;\n parentId: string | null;\n}): Folder {\n return Folder.create({\n ...data,\n type: TYPE,\n permissions: []\n });\n}\n\nfunction createFlatFolders(): Folder[] {\n return [\n createFolder({ id: \"root-1\", title: \"Documents\", slug: \"documents\", parentId: null }),\n createFolder({ id: \"root-2\", title: \"Images\", slug: \"images\", parentId: null }),\n createFolder({ id: \"child-1\", title: \"Invoices\", slug: \"invoices\", parentId: \"root-1\" }),\n createFolder({\n id: \"child-2\",\n title: \"Contracts\",\n slug: \"contracts\",\n parentId: \"root-1\"\n }),\n createFolder({\n id: \"grandchild-1\",\n title: \"2024\",\n slug: \"2024\",\n parentId: \"child-1\"\n })\n ];\n}\n\n// ---------------------------------------------------------------------------\n// Mock FormModel\n// ---------------------------------------------------------------------------\n\nfunction createMockField(): IField {\n let value: unknown = undefined;\n return {\n getValue: vi.fn(() => value),\n setValue: vi.fn((v: unknown) => {\n value = v;\n }),\n setDisabled: vi.fn(),\n setVisible: vi.fn(),\n remove: vi.fn(),\n addBeforeChange: vi.fn(),\n addAfterChange: vi.fn(),\n addAfterSetValue: vi.fn(),\n addOnBlur: vi.fn(),\n blur: vi.fn(),\n as: vi.fn()\n } as unknown as IField;\n}\n\nfunction createMockFormModel(): IFormModel {\n const fields = new Map<string, IField>();\n let data: Record<string, unknown> = {};\n\n const form: IFormModel = {\n field(name: string) {\n if (!fields.has(name)) {\n fields.set(name, createMockField());\n }\n return fields.get(name)!;\n },\n fields: vi.fn(),\n layout: vi.fn() as IFormModel[\"layout\"],\n setLayout: vi.fn(),\n addRule: vi.fn(),\n getData: vi.fn(() => data),\n setData: vi.fn((d: Record<string, unknown>) => {\n data = d;\n }),\n reset: vi.fn(),\n validate: vi.fn(async () => true),\n submit: vi.fn(async () => data) as IFormModel[\"submit\"],\n evaluateRules: vi.fn(() => ({ visible: true, disabled: false })),\n focusField: vi.fn(),\n isDirty: false,\n isValid: null,\n submitted: false,\n submitCount: 0,\n errors: [],\n vm: {\n layout: [],\n isDirty: false,\n isValid: null,\n errors: [],\n hasErrors: false,\n submitCount: 0,\n focusField: vi.fn(),\n getData: vi.fn(() => ({})),\n setData: vi.fn()\n },\n getFieldBuilders: vi.fn(() => []),\n resolveChildLayout: vi.fn(() => []),\n registry: {} as IFormModel[\"registry\"],\n traverse: vi.fn()\n };\n\n return form;\n}\n\n// ---------------------------------------------------------------------------\n// Mock use cases\n// ---------------------------------------------------------------------------\n\nclass MockListFoldersUseCase implements ListFoldersUseCase.Interface {\n execute = vi.fn(async () => {});\n}\n\nclass MockCreateFolderUseCase implements CreateFolderUseCase.Interface {\n execute = vi.fn(async () => {});\n}\n\nclass MockUpdateFolderUseCase implements UpdateFolderUseCase.Interface {\n execute = vi.fn(async () => {});\n}\n\nclass MockDeleteFolderUseCase implements DeleteFolderUseCase.Interface {\n execute = vi.fn(async () => {});\n}\n\nclass MockFormModelFactory {\n create = vi.fn((_config: IFormModelConfig) => createMockFormModel());\n}\n\n// ---------------------------------------------------------------------------\n// Setup\n// ---------------------------------------------------------------------------\n\nfunction createTestPresenter(folders: Folder[] = []) {\n const container = new Container();\n const foldersCache = new ListCache<Folder>();\n const listFolders = new MockListFoldersUseCase();\n const createFolderUseCase = new MockCreateFolderUseCase();\n const updateFolderUseCase = new MockUpdateFolderUseCase();\n const deleteFolderUseCase = new MockDeleteFolderUseCase();\n const formModelFactory = new MockFormModelFactory();\n\n // Pre-populate cache.\n if (folders.length > 0) {\n foldersCache.addItems(folders);\n }\n\n container.registerInstance(FoldersContext, { type: TYPE });\n container.registerInstance(FoldersCache, foldersCache);\n container.registerInstance(ListFoldersUseCase, listFolders);\n container.registerInstance(CreateFolderUseCase, createFolderUseCase);\n container.registerInstance(UpdateFolderUseCase, updateFolderUseCase);\n container.registerInstance(DeleteFolderUseCase, deleteFolderUseCase);\n container.registerInstance(ListFoldersByParentIdsUseCase, {\n execute: vi.fn().mockResolvedValue(undefined)\n });\n container.registerInstance(GetFolderAncestorsUseCase, {\n execute: vi.fn().mockReturnValue([])\n });\n container.registerInstance(GetFolderLevelPermissionUseCase, {\n execute: vi.fn().mockReturnValue(true)\n });\n container.registerInstance(\n FormModelFactory,\n formModelFactory as unknown as FormModelFactory.Interface\n );\n container.registerInstance(StringFormatter, {\n slugify: (value: string) => value\n });\n\n FolderTreePresenterFeature.register(container);\n\n const presenter = container.resolve(Abstraction);\n\n return {\n presenter,\n foldersCache,\n listFolders,\n createFolderUseCase,\n updateFolderUseCase,\n deleteFolderUseCase,\n formModelFactory\n };\n}\n\n// ---------------------------------------------------------------------------\n// Tests\n// ---------------------------------------------------------------------------\n\ndescribe(\"FolderTreePresenter\", () => {\n // -------------------------------------------------------------------\n // Scoped initialization via FoldersContext\n // -------------------------------------------------------------------\n\n describe(\"scoped initialization\", () => {\n it(\"should load folders on construction via ListFoldersUseCase\", () => {\n const { listFolders } = createTestPresenter();\n expect(listFolders.execute).toHaveBeenCalledTimes(1);\n });\n\n it(\"should not require an init(type) method — type comes from FoldersContext\", () => {\n const { presenter } = createTestPresenter();\n // The presenter has no init method — it reads type from injected FoldersContext.\n expect((presenter as any).init).toBeUndefined();\n });\n\n it(\"should start with loading=true then resolve to false\", async () => {\n const { presenter } = createTestPresenter();\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n });\n });\n\n // -------------------------------------------------------------------\n // Tree computation from flat folder list\n // -------------------------------------------------------------------\n\n describe(\"tree computation\", () => {\n it(\"should build a nested tree from a flat folder list\", async () => {\n const folders = createFlatFolders();\n const { presenter } = createTestPresenter(folders);\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n\n const { tree } = presenter.vm;\n\n // Two root nodes.\n expect(tree).toHaveLength(2);\n expect(tree[0].name).toBe(\"Documents\");\n expect(tree[1].name).toBe(\"Images\");\n\n // Documents has 2 children.\n expect(tree[0].children).toHaveLength(2);\n expect(tree[0].children[0].name).toBe(\"Invoices\");\n expect(tree[0].children[1].name).toBe(\"Contracts\");\n\n // Invoices has 1 grandchild.\n expect(tree[0].children[0].children).toHaveLength(1);\n expect(tree[0].children[0].children[0].name).toBe(\"2024\");\n\n // Images has no children.\n expect(tree[1].children).toHaveLength(0);\n });\n\n it(\"should return an empty tree when cache is empty\", async () => {\n const { presenter } = createTestPresenter([]);\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n\n expect(presenter.vm.tree).toEqual([]);\n });\n\n it(\"should treat folders with unknown parentId as root nodes\", async () => {\n const folders = [\n createFolder({\n id: \"orphan\",\n title: \"Orphan\",\n slug: \"orphan\",\n parentId: \"non-existent\"\n })\n ];\n const { presenter } = createTestPresenter(folders);\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n\n expect(presenter.vm.tree).toHaveLength(1);\n expect(presenter.vm.tree[0].name).toBe(\"Orphan\");\n });\n\n it(\"should map folder properties correctly to tree nodes\", async () => {\n const folders = [\n createFolder({\n id: \"f1\",\n title: \"My Folder\",\n slug: \"my-folder\",\n parentId: null\n })\n ];\n const { presenter } = createTestPresenter(folders);\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n\n const node = presenter.vm.tree[0];\n expect(node.id).toBe(\"f1\");\n expect(node.name).toBe(\"My Folder\");\n expect(node.slug).toBe(\"my-folder\");\n expect(node.parentId).toBeNull();\n expect(node.children).toEqual([]);\n });\n });\n\n // -------------------------------------------------------------------\n // selectFolder and onFolderChange\n // -------------------------------------------------------------------\n\n describe(\"selectFolder\", () => {\n it(\"should update currentFolderId\", async () => {\n const folders = createFlatFolders();\n const { presenter } = createTestPresenter(folders);\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n\n expect(presenter.vm.currentFolderId).toBeNull();\n\n presenter.selectFolder(\"root-1\");\n expect(presenter.vm.currentFolderId).toBe(\"root-1\");\n });\n\n it(\"should update currentFolder to the matching folder\", async () => {\n const folders = createFlatFolders();\n const { presenter } = createTestPresenter(folders);\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n\n presenter.selectFolder(\"child-1\");\n expect(presenter.vm.currentFolder).not.toBeNull();\n expect(presenter.vm.currentFolder!.id).toBe(\"child-1\");\n expect(presenter.vm.currentFolder!.title).toBe(\"Invoices\");\n });\n\n it(\"should set currentFolder to null when selecting root (null)\", async () => {\n const folders = createFlatFolders();\n const { presenter } = createTestPresenter(folders);\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n\n presenter.selectFolder(\"root-1\");\n expect(presenter.vm.currentFolder).not.toBeNull();\n\n presenter.selectFolder(null);\n expect(presenter.vm.currentFolderId).toBeNull();\n expect(presenter.vm.currentFolder).toBeNull();\n });\n\n it(\"should find deeply nested folders as currentFolder\", async () => {\n const folders = createFlatFolders();\n const { presenter } = createTestPresenter(folders);\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n\n presenter.selectFolder(\"grandchild-1\");\n expect(presenter.vm.currentFolder).not.toBeNull();\n expect(presenter.vm.currentFolder!.title).toBe(\"2024\");\n });\n });\n\n describe(\"onFolderChange\", () => {\n it(\"should fire callbacks when currentFolderId changes\", async () => {\n const folders = createFlatFolders();\n const { presenter } = createTestPresenter(folders);\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n\n const callback = vi.fn();\n presenter.onFolderChange(callback);\n\n presenter.selectFolder(\"root-1\");\n\n // MobX reaction fires synchronously for simple observable changes.\n expect(callback).toHaveBeenCalledTimes(1);\n expect(callback).toHaveBeenCalledWith(\"root-1\");\n });\n\n it(\"should fire callback with null when navigating to root\", async () => {\n const folders = createFlatFolders();\n const { presenter } = createTestPresenter(folders);\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n\n presenter.selectFolder(\"root-1\");\n\n const callback = vi.fn();\n presenter.onFolderChange(callback);\n\n presenter.selectFolder(null);\n expect(callback).toHaveBeenCalledWith(null);\n });\n\n it(\"should support multiple callbacks\", async () => {\n const { presenter } = createTestPresenter(createFlatFolders());\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n\n const cb1 = vi.fn();\n const cb2 = vi.fn();\n presenter.onFolderChange(cb1);\n presenter.onFolderChange(cb2);\n\n presenter.selectFolder(\"root-2\");\n\n expect(cb1).toHaveBeenCalledWith(\"root-2\");\n expect(cb2).toHaveBeenCalledWith(\"root-2\");\n });\n\n it(\"should return an unsubscribe function that stops callbacks\", async () => {\n const { presenter } = createTestPresenter(createFlatFolders());\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n\n const callback = vi.fn();\n const unsubscribe = presenter.onFolderChange(callback);\n\n presenter.selectFolder(\"root-1\");\n expect(callback).toHaveBeenCalledTimes(1);\n\n unsubscribe();\n\n presenter.selectFolder(\"root-2\");\n // Should not have been called again after unsubscribe.\n expect(callback).toHaveBeenCalledTimes(1);\n });\n\n it(\"should not fire callback when selecting the same folder\", async () => {\n const { presenter } = createTestPresenter(createFlatFolders());\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n\n presenter.selectFolder(\"root-1\");\n\n const callback = vi.fn();\n presenter.onFolderChange(callback);\n\n // Select the same folder again.\n presenter.selectFolder(\"root-1\");\n expect(callback).not.toHaveBeenCalled();\n });\n });\n\n // -------------------------------------------------------------------\n // createFolder / editFolder — operation state with FormModel\n // -------------------------------------------------------------------\n\n describe(\"createFolder\", () => {\n it(\"should set operation state with mode 'create' and a FormModel\", async () => {\n const { presenter, formModelFactory } = createTestPresenter(createFlatFolders());\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n\n presenter.createFolder(\"root-1\");\n\n expect(presenter.vm.operation.active).toBe(true);\n expect(presenter.vm.operation.mode).toBe(\"create\");\n expect(presenter.vm.operation.parentFolderId).toBe(\"root-1\");\n expect(presenter.vm.operation.form).toBeDefined();\n expect(formModelFactory.create).toHaveBeenCalledTimes(1);\n });\n\n it(\"should set parentFolderId to undefined when creating at root\", async () => {\n const { presenter } = createTestPresenter(createFlatFolders());\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n\n presenter.createFolder();\n\n expect(presenter.vm.operation.active).toBe(true);\n expect(presenter.vm.operation.mode).toBe(\"create\");\n expect(presenter.vm.operation.parentFolderId).toBeUndefined();\n });\n\n it(\"should wire submitOperation to CreateFolderUseCase\", async () => {\n const { presenter, createFolderUseCase, listFolders } =\n createTestPresenter(createFlatFolders());\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n\n presenter.createFolder(\"root-1\");\n\n await presenter.submitOperation();\n\n expect(createFolderUseCase.execute).toHaveBeenCalledTimes(1);\n expect(listFolders.execute).toHaveBeenCalledTimes(1);\n });\n });\n\n describe(\"editFolder\", () => {\n it(\"should set operation state with mode 'edit' and a FormModel\", async () => {\n const { presenter, formModelFactory } = createTestPresenter(createFlatFolders());\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n\n presenter.editFolder(\"root-1\");\n\n expect(presenter.vm.operation.active).toBe(true);\n expect(presenter.vm.operation.mode).toBe(\"edit\");\n expect(presenter.vm.operation.folderId).toBe(\"root-1\");\n expect(presenter.vm.operation.form).toBeDefined();\n expect(formModelFactory.create).toHaveBeenCalledTimes(1);\n });\n\n it(\"should pre-populate form with existing folder data\", async () => {\n const mockForm = createMockFormModel();\n const { presenter, formModelFactory } = createTestPresenter(createFlatFolders());\n formModelFactory.create.mockReturnValue(mockForm);\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n\n presenter.editFolder(\"root-1\");\n\n expect(mockForm.setData).toHaveBeenCalledWith({\n title: \"Documents\",\n slug: \"documents\"\n });\n });\n\n it(\"should do nothing when editing a non-existent folder\", async () => {\n const { presenter, formModelFactory } = createTestPresenter(createFlatFolders());\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n\n presenter.editFolder(\"non-existent\");\n\n expect(presenter.vm.operation.active).toBe(false);\n expect(presenter.vm.operation.mode).toBeNull();\n expect(formModelFactory.create).not.toHaveBeenCalled();\n });\n });\n\n // -------------------------------------------------------------------\n // deleteFolder — navigates to parent and updates tree\n // -------------------------------------------------------------------\n\n describe(\"deleteFolder\", () => {\n it(\"should call DeleteFolderUseCase with the folder id\", async () => {\n const { presenter, deleteFolderUseCase } = createTestPresenter(createFlatFolders());\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n\n await presenter.deleteFolder(\"child-1\");\n\n expect(deleteFolderUseCase.execute).toHaveBeenCalledWith(\"child-1\");\n });\n\n it(\"should set operation state with mode 'delete' during deletion\", async () => {\n const { presenter, deleteFolderUseCase } = createTestPresenter(createFlatFolders());\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n\n // Make delete hang so we can inspect intermediate state.\n let resolveDelete!: () => void;\n deleteFolderUseCase.execute.mockReturnValueOnce(\n new Promise<void>(resolve => {\n resolveDelete = resolve;\n })\n );\n\n const deletePromise = presenter.deleteFolder(\"child-1\");\n\n expect(presenter.vm.operation.active).toBe(true);\n expect(presenter.vm.operation.mode).toBe(\"delete\");\n expect(presenter.vm.operation.folderId).toBe(\"child-1\");\n\n resolveDelete();\n await deletePromise;\n\n // After completion, operation should be reset.\n expect(presenter.vm.operation.active).toBe(false);\n expect(presenter.vm.operation.mode).toBeNull();\n });\n\n it(\"should navigate to parent folder after deletion\", async () => {\n const { presenter } = createTestPresenter(createFlatFolders());\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n\n // child-1 has parentId \"root-1\".\n await presenter.deleteFolder(\"child-1\");\n\n expect(presenter.vm.currentFolderId).toBe(\"root-1\");\n });\n\n it(\"should navigate to root (null) when deleting a root folder\", async () => {\n const { presenter } = createTestPresenter(createFlatFolders());\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n\n // root-1 has parentId null.\n await presenter.deleteFolder(\"root-1\");\n\n expect(presenter.vm.currentFolderId).toBeNull();\n });\n\n it(\"should refresh the folder list after deletion\", async () => {\n const { presenter, listFolders } = createTestPresenter(createFlatFolders());\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n\n await presenter.deleteFolder(\"child-1\");\n\n // Initial load + refresh after delete.\n expect(listFolders.execute).toHaveBeenCalledTimes(2);\n });\n\n it(\"should fire onFolderChange callback when navigating to parent after delete\", async () => {\n const { presenter } = createTestPresenter(createFlatFolders());\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n\n const callback = vi.fn();\n presenter.onFolderChange(callback);\n\n // child-1 has parentId \"root-1\".\n await presenter.deleteFolder(\"child-1\");\n\n expect(callback).toHaveBeenCalledWith(\"root-1\");\n });\n });\n\n // -------------------------------------------------------------------\n // Operation state reset\n // -------------------------------------------------------------------\n\n describe(\"operation state\", () => {\n it(\"should start with inactive operation state\", async () => {\n const { presenter } = createTestPresenter();\n\n await vi.waitFor(() => {\n expect(presenter.vm.loading).toBe(false);\n });\n\n expect(presenter.vm.operation.active).toBe(false);\n expect(presenter.vm.operation.mode).toBeNull();\n });\n });\n});\n"],"names":["TYPE","createFolder","data","Folder","createFlatFolders","createMockField","value","vi","v","createMockFormModel","fields","Map","form","name","d","MockListFoldersUseCase","MockCreateFolderUseCase","MockUpdateFolderUseCase","MockDeleteFolderUseCase","MockFormModelFactory","_config","createTestPresenter","folders","container","Container","foldersCache","ListCache","listFolders","createFolderUseCase","updateFolderUseCase","deleteFolderUseCase","formModelFactory","FoldersContext","FoldersCache","ListFoldersUseCase","CreateFolderUseCase","UpdateFolderUseCase","DeleteFolderUseCase","ListFoldersByParentIdsUseCase","undefined","GetFolderAncestorsUseCase","GetFolderLevelPermissionUseCase","FormModelFactory","StringFormatter","FolderTreePresenterFeature","presenter","Abstraction","describe","it","expect","tree","node","callback","cb1","cb2","unsubscribe","mockForm","resolveDelete","Promise","resolve","deletePromise"],"mappings":"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"}
package/table.types.d.ts CHANGED
@@ -1,6 +1,8 @@
1
1
  import type { FolderDto } from "./domain/folder/FolderDto.js";
2
2
  import type { FolderIdentityDto } from "./domain/folder/FolderIdentity.js";
3
3
  import type { GenericSearchData, Location } from "./types.js";
4
+ export type { TableRow, RecordTableRow } from "@webiny/app-admin/components/Table/table.types.js";
5
+ import type { TableRow } from "@webiny/app-admin/components/Table/table.types.js";
4
6
  export interface SearchRecordItem<TData extends GenericSearchData = GenericSearchData> {
5
7
  id: string;
6
8
  type: string;
@@ -18,15 +20,6 @@ export interface SearchRecordItem<TData extends GenericSearchData = GenericSearc
18
20
  }
19
21
  export type MovableSearchRecordItem = Pick<SearchRecordItem, "id" | "location">;
20
22
  export type DeletableSearchRecordItem = Pick<SearchRecordItem, "id" | "location">;
21
- export interface TableRow<TData = unknown> {
22
- id: string;
23
- $selectable: boolean;
24
- $type: string;
25
- data: TData;
26
- }
27
23
  export interface FolderTableRow extends TableRow<FolderDto> {
28
24
  $type: "FOLDER";
29
25
  }
30
- export interface RecordTableRow<TData> extends TableRow<TData> {
31
- $type: "RECORD";
32
- }
package/types.d.ts CHANGED
@@ -1,8 +1,10 @@
1
- import type { CmsModel, CmsModelField, CmsModelFieldSettings } from "@webiny/app-headless-cms-common/types/index.js";
2
- export type { CmsIdentity } from "@webiny/app-headless-cms-common/types/index.js";
3
1
  export type * from "@webiny/shared-aco/flp/flp.types.js";
4
- export type * from "./graphql/records/types.js";
5
2
  export type * from "./table.types.js";
3
+ export interface CmsIdentity {
4
+ id: string;
5
+ displayName: string;
6
+ type: string;
7
+ }
6
8
  export interface FolderLevelPermissionsTarget<TMeta = Record<string, any>> {
7
9
  id: string;
8
10
  target: string;
@@ -38,31 +40,8 @@ export interface AcoError {
38
40
  message: string;
39
41
  data?: Record<string, any> | null;
40
42
  }
41
- export type ListSearchRecordsSortItem = `${string}_ASC` | `${string}_DESC`;
42
- export type ListSearchRecordsSort = ListSearchRecordsSortItem[];
43
43
  export interface ListMeta {
44
44
  cursor: string | null;
45
45
  totalCount: number;
46
46
  hasMoreItems: boolean;
47
47
  }
48
- /**
49
- * Apps.
50
- */
51
- export interface AcoModel extends CmsModel {
52
- fields: AcoModelField[];
53
- }
54
- export interface AcoModelFieldSettingsAco {
55
- enabled?: boolean;
56
- header?: boolean;
57
- }
58
- export interface AcoModelFieldSettings {
59
- aco?: AcoModelFieldSettingsAco;
60
- }
61
- export interface AcoModelField extends CmsModelField {
62
- settings?: CmsModelFieldSettings & AcoModelFieldSettings;
63
- }
64
- export interface AcoApp {
65
- id: string;
66
- model: AcoModel;
67
- getFields: () => AcoModelField[];
68
- }
package/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sources":["../src/types.ts"],"sourcesContent":["import type {\n CmsModel,\n CmsModelField,\n CmsModelFieldSettings\n} from \"@webiny/app-headless-cms-common/types/index.js\";\n\nexport type { CmsIdentity } from \"@webiny/app-headless-cms-common/types/index.js\";\nexport type * from \"@webiny/shared-aco/flp/flp.types.js\";\nexport type * from \"~/graphql/records/types.js\";\nexport type * from \"~/table.types.js\";\n\nexport interface FolderLevelPermissionsTarget<TMeta = Record<string, any>> {\n id: string;\n target: string;\n name: string;\n type: string;\n meta: TMeta;\n}\n\nexport type GenericSearchData = {\n [key: string]: any;\n};\n\nexport interface Location {\n folderId: string;\n}\n\nexport interface TagItem {\n tag: string;\n}\n\nexport type Loading<T extends string> = { [P in T]?: boolean };\n\nexport type LoadingActions =\n | \"INIT\"\n | \"LIST\"\n | \"LIST_MORE\"\n | \"GET\"\n | \"CREATE\"\n | \"UPDATE\"\n | \"DELETE\"\n | \"MOVE\";\n\nexport const LoadingActionsEnum = {\n init: \"INIT\",\n list: \"LIST\",\n listMore: \"LIST_MORE\",\n get: \"GET\",\n create: \"CREATE\",\n update: \"UPDATE\",\n delete: \"DELETE\",\n move: \"MOVE\"\n};\n\nexport interface AcoError {\n code: string;\n message: string;\n data?: Record<string, any> | null;\n}\n\nexport type ListSearchRecordsSortItem = `${string}_ASC` | `${string}_DESC`;\nexport type ListSearchRecordsSort = ListSearchRecordsSortItem[];\n\nexport interface ListMeta {\n cursor: string | null;\n totalCount: number;\n hasMoreItems: boolean;\n}\n\n/**\n * Apps.\n */\nexport interface AcoModel extends CmsModel {\n fields: AcoModelField[];\n}\n\nexport interface AcoModelFieldSettingsAco {\n enabled?: boolean;\n header?: boolean;\n}\n\nexport interface AcoModelFieldSettings {\n aco?: AcoModelFieldSettingsAco;\n}\n\nexport interface AcoModelField extends CmsModelField {\n settings?: CmsModelFieldSettings & AcoModelFieldSettings;\n}\n\nexport interface AcoApp {\n id: string;\n model: AcoModel;\n getFields: () => AcoModelField[];\n}\n"],"names":["LoadingActionsEnum"],"mappings":"AA2CO,MAAMA,qBAAqB;IAC9B,MAAM;IACN,MAAM;IACN,UAAU;IACV,KAAK;IACL,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,MAAM;AACV"}
1
+ {"version":3,"file":"types.js","sources":["../src/types.ts"],"sourcesContent":["export type * from \"@webiny/shared-aco/flp/flp.types.js\";\nexport type * from \"~/table.types.js\";\n\nexport interface CmsIdentity {\n id: string;\n displayName: string;\n type: string;\n}\n\nexport interface FolderLevelPermissionsTarget<TMeta = Record<string, any>> {\n id: string;\n target: string;\n name: string;\n type: string;\n meta: TMeta;\n}\n\nexport type GenericSearchData = {\n [key: string]: any;\n};\n\nexport interface Location {\n folderId: string;\n}\n\nexport interface TagItem {\n tag: string;\n}\n\nexport type Loading<T extends string> = { [P in T]?: boolean };\n\nexport type LoadingActions =\n | \"INIT\"\n | \"LIST\"\n | \"LIST_MORE\"\n | \"GET\"\n | \"CREATE\"\n | \"UPDATE\"\n | \"DELETE\"\n | \"MOVE\";\n\nexport const LoadingActionsEnum = {\n init: \"INIT\",\n list: \"LIST\",\n listMore: \"LIST_MORE\",\n get: \"GET\",\n create: \"CREATE\",\n update: \"UPDATE\",\n delete: \"DELETE\",\n move: \"MOVE\"\n};\n\nexport interface AcoError {\n code: string;\n message: string;\n data?: Record<string, any> | null;\n}\n\nexport interface ListMeta {\n cursor: string | null;\n totalCount: number;\n hasMoreItems: boolean;\n}\n"],"names":["LoadingActionsEnum"],"mappings":"AAyCO,MAAMA,qBAAqB;IAC9B,MAAM;IACN,MAAM;IACN,UAAU;IACV,KAAK;IACL,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,MAAM;AACV"}
@@ -1,2 +0,0 @@
1
- import React from "react";
2
- export declare const Extensions: () => React.JSX.Element | null;
@@ -1,30 +0,0 @@
1
- import react from "react";
2
- import { CompositionScope } from "@webiny/app-admin";
3
- import { Fields, ModelProvider } from "@webiny/app-headless-cms-common";
4
- import { Bind, BindPrefix } from "@webiny/form";
5
- import { useFolderExtensionsFields } from "../../features/folders/getFolderExtensionsFields/index.js";
6
- import { useFolderModel } from "../../hooks/useFolderModel.js";
7
- const Extensions = ()=>{
8
- const { fields } = useFolderExtensionsFields();
9
- const folderModel = useFolderModel();
10
- if (0 === fields.length || !folderModel) return null;
11
- return /*#__PURE__*/ react.createElement(CompositionScope, {
12
- name: "aco.folderDetails.extensionFields"
13
- }, /*#__PURE__*/ react.createElement(ModelProvider, {
14
- model: folderModel
15
- }, /*#__PURE__*/ react.createElement(BindPrefix, {
16
- name: "extensions"
17
- }, /*#__PURE__*/ react.createElement("div", {
18
- className: "mt-lg"
19
- }, /*#__PURE__*/ react.createElement(Fields, {
20
- contentModel: folderModel,
21
- Bind: Bind,
22
- fields: fields,
23
- layout: fields.map((field)=>[
24
- field.fieldId
25
- ])
26
- })))));
27
- };
28
- export { Extensions };
29
-
30
- //# sourceMappingURL=Extensions.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"components/Extensions/Extensions.js","sources":["../../../src/components/Extensions/Extensions.tsx"],"sourcesContent":["import React from \"react\";\nimport { CompositionScope } from \"@webiny/app-admin\";\nimport { ModelProvider, Fields } from \"@webiny/app-headless-cms-common\";\nimport { Bind, BindPrefix } from \"@webiny/form\";\nimport { useFolderExtensionsFields } from \"~/features/folders/getFolderExtensionsFields/index.js\";\nimport { useFolderModel } from \"~/hooks/useFolderModel.js\";\n\nexport const Extensions = () => {\n const { fields } = useFolderExtensionsFields();\n const folderModel = useFolderModel();\n\n if (fields.length === 0 || !folderModel) {\n return null;\n }\n\n return (\n <CompositionScope name={\"aco.folderDetails.extensionFields\"}>\n <ModelProvider model={folderModel}>\n <BindPrefix name={\"extensions\"}>\n <div className={\"mt-lg\"}>\n <Fields\n contentModel={folderModel}\n // @ts-expect-error\n Bind={Bind}\n fields={fields}\n layout={fields.map(field => [field.fieldId])}\n />\n </div>\n </BindPrefix>\n </ModelProvider>\n </CompositionScope>\n );\n};\n"],"names":["Extensions","fields","useFolderExtensionsFields","folderModel","useFolderModel","CompositionScope","ModelProvider","BindPrefix","Fields","Bind","field"],"mappings":";;;;;;AAOO,MAAMA,aAAa;IACtB,MAAM,EAAEC,MAAM,EAAE,GAAGC;IACnB,MAAMC,cAAcC;IAEpB,IAAIH,AAAkB,MAAlBA,OAAO,MAAM,IAAU,CAACE,aACxB,OAAO;IAGX,OAAO,WAAP,GACI,oBAACE,kBAAgBA;QAAC,MAAM;qBACpB,oBAACC,eAAaA;QAAC,OAAOH;qBAClB,oBAACI,YAAUA;QAAC,MAAM;qBACd,oBAAC;QAAI,WAAW;qBACZ,oBAACC,QAAMA;QACH,cAAcL;QAEd,MAAMM;QACN,QAAQR;QACR,QAAQA,OAAO,GAAG,CAACS,CAAAA,QAAS;gBAACA,MAAM,OAAO;aAAC;;AAOvE"}
@@ -1 +0,0 @@
1
- export * from "./Extensions.js";
@@ -1 +0,0 @@
1
- export * from "./Extensions.js";
@@ -1,13 +0,0 @@
1
- import React from "react";
2
- import type { GenericComponent, Decorator } from "@webiny/app-admin";
3
- import { FieldElement } from "@webiny/app-headless-cms-common";
4
- export type FieldProps = React.ComponentProps<typeof FieldElement>;
5
- export interface FieldDecoratorProps {
6
- id?: string;
7
- modelIds?: string[];
8
- }
9
- export interface FolderFieldDecoratorParams {
10
- scope?: string;
11
- shouldDecorate: (decoratorProps: FieldDecoratorProps, componentProps: FieldProps) => boolean;
12
- }
13
- export declare const createFolderFieldDecoratorFactory: ({ scope, shouldDecorate }: FolderFieldDecoratorParams) => (decorator: Decorator<GenericComponent<FieldProps>>) => (props: FieldDecoratorProps) => React.JSX.Element;
@@ -1,17 +0,0 @@
1
- import react from "react";
2
- import { Compose, CompositionScope, createConditionalDecorator } from "@webiny/app-admin";
3
- import { FieldElement } from "@webiny/app-headless-cms-common";
4
- const createFolderFieldDecoratorFactory = ({ scope = "*", shouldDecorate })=>(decorator)=>function(props) {
5
- const conditionalDecorator = createConditionalDecorator(shouldDecorate, decorator, props);
6
- return /*#__PURE__*/ react.createElement(CompositionScope, {
7
- name: scope
8
- }, /*#__PURE__*/ react.createElement(CompositionScope, {
9
- name: "aco.folderDetails.extensionFields"
10
- }, /*#__PURE__*/ react.createElement(Compose, {
11
- component: FieldElement,
12
- with: conditionalDecorator
13
- })));
14
- };
15
- export { createFolderFieldDecoratorFactory };
16
-
17
- //# sourceMappingURL=createFolderFieldDecoratorFactory.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config/folder/createFolderFieldDecoratorFactory.js","sources":["../../../src/config/folder/createFolderFieldDecoratorFactory.tsx"],"sourcesContent":["import React from \"react\";\nimport type { GenericComponent, Decorator } from \"@webiny/app-admin\";\nimport { Compose, createConditionalDecorator, CompositionScope } from \"@webiny/app-admin\";\nimport { FieldElement } from \"@webiny/app-headless-cms-common\";\n\nexport type FieldProps = React.ComponentProps<typeof FieldElement>;\n\nexport interface FieldDecoratorProps {\n id?: string;\n modelIds?: string[];\n}\n\nexport interface FolderFieldDecoratorParams {\n scope?: string;\n shouldDecorate: (decoratorProps: FieldDecoratorProps, componentProps: FieldProps) => boolean;\n}\n\nexport const createFolderFieldDecoratorFactory =\n ({ scope = \"*\", shouldDecorate }: FolderFieldDecoratorParams) =>\n (decorator: Decorator<GenericComponent<FieldProps>>) => {\n return function FieldDecorator(props: FieldDecoratorProps) {\n const conditionalDecorator = createConditionalDecorator(\n shouldDecorate,\n decorator,\n props\n );\n\n return (\n <CompositionScope name={scope}>\n <CompositionScope name={\"aco.folderDetails.extensionFields\"}>\n <Compose component={FieldElement} with={conditionalDecorator} />\n </CompositionScope>\n </CompositionScope>\n );\n };\n };\n"],"names":["createFolderFieldDecoratorFactory","scope","shouldDecorate","decorator","props","conditionalDecorator","createConditionalDecorator","CompositionScope","Compose","FieldElement"],"mappings":";;;AAiBO,MAAMA,oCACT,CAAC,EAAEC,QAAQ,GAAG,EAAEC,cAAc,EAA8B,GAC5D,CAACC,YACU,SAAwBC,KAA0B;YACrD,MAAMC,uBAAuBC,2BACzBJ,gBACAC,WACAC;YAGJ,OAAO,WAAP,GACI,oBAACG,kBAAgBA;gBAAC,MAAMN;6BACpB,oBAACM,kBAAgBA;gBAAC,MAAM;6BACpB,oBAACC,SAAOA;gBAAC,WAAWC;gBAAc,MAAMJ;;QAIxD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"config/table/Sorting.js","sources":["../../../src/config/table/Sorting.tsx"],"sourcesContent":["import React from \"react\";\nimport { Property, useIdGenerator } from \"@webiny/react-properties\";\n\nexport interface SortingConfig {\n field: string;\n order: \"asc\" | \"desc\";\n}\n\nexport interface SortingProps {\n name: string;\n field: string;\n order?: \"asc\" | \"desc\";\n}\n\nexport const Sorting = ({ name, field, order = \"desc\" }: SortingProps) => {\n const getId = useIdGenerator(\"tableSorting\");\n\n return (\n <Property id=\"table\" name={\"table\"}>\n <Property id={getId(name)} name={\"sorting\"} array={true}>\n <Property id={getId(name, \"name\")} name={\"name\"} value={name} />\n <Property id={getId(name, \"field\")} name={\"field\"} value={field} />\n <Property id={getId(name, \"order\")} name={\"order\"} value={order} />\n </Property>\n </Property>\n );\n};\n"],"names":["Sorting","name","field","order","getId","useIdGenerator","Property"],"mappings":";;AAcO,MAAMA,UAAU,CAAC,EAAEC,IAAI,EAAEC,KAAK,EAAEC,QAAQ,MAAM,EAAgB;IACjE,MAAMC,QAAQC,eAAe;IAE7B,OAAO,WAAP,GACI,oBAACC,UAAQA;QAAC,IAAG;QAAQ,MAAM;qBACvB,oBAACA,UAAQA;QAAC,IAAIF,MAAMH;QAAO,MAAM;QAAW,OAAO;qBAC/C,oBAACK,UAAQA;QAAC,IAAIF,MAAMH,MAAM;QAAS,MAAM;QAAQ,OAAOA;sBACxD,oBAACK,UAAQA;QAAC,IAAIF,MAAMH,MAAM;QAAU,MAAM;QAAS,OAAOC;sBAC1D,oBAACI,UAAQA;QAAC,IAAIF,MAAMH,MAAM;QAAU,MAAM;QAAS,OAAOE;;AAI1E"}
@@ -1,49 +0,0 @@
1
- import React from "react";
2
- import type { FolderDto } from "../domain/folder/FolderDto.js";
3
- import type { GenericSearchData, ListMeta, ListSearchRecordsSort } from "../types.js";
4
- export interface AcoListContextData<T> {
5
- currentFolder?: FolderDto;
6
- folders: FolderDto[];
7
- hideFilters: () => void;
8
- isListLoading: boolean;
9
- isListLoadingMore: boolean;
10
- isSearch: boolean;
11
- listMoreRecords: () => void;
12
- listTitle?: string;
13
- meta: ListMeta;
14
- records: T[];
15
- selected: T[];
16
- setFilters: (data: Record<string, any>) => void;
17
- setListSort: (state: ListSearchRecordsSort) => void;
18
- setSearchQuery: (query: string) => void;
19
- setSelected: (selected: T[]) => void;
20
- showFilters: () => void;
21
- showingFilters: boolean;
22
- showingSelectAll: boolean;
23
- searchQuery: string;
24
- isSelectedAll: boolean;
25
- selectAll: () => void;
26
- unselectAll: () => void;
27
- getWhere: () => Record<string, any>;
28
- refresh: () => Promise<void>;
29
- }
30
- export declare const AcoListContext: React.Context<AcoListContextData<GenericSearchData> | undefined>;
31
- export interface State<T> {
32
- after?: string;
33
- filters?: Record<string, any>;
34
- folderId?: string;
35
- isSearch: boolean;
36
- limit: number;
37
- listSort: ListSearchRecordsSort;
38
- searchQuery: string;
39
- selected: T[];
40
- showingFilters: boolean;
41
- showingSelectAll: boolean;
42
- isSelectedAll: boolean;
43
- }
44
- export interface AcoListProviderProps {
45
- children: React.ReactNode;
46
- own?: boolean;
47
- titleFieldId: string | null;
48
- }
49
- export declare const AcoListProvider: ({ children, ...props }: AcoListProviderProps) => React.JSX.Element;