@webiny/app-aco 0.0.0-unstable.7be00a75a9 → 0.0.0-unstable.7c2def32a7
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.
- package/app.js +5 -1
- package/app.js.map +1 -1
- package/components/Actions/DeleteFolder/DeleteFolder.js +1 -1
- package/components/Actions/DeleteFolder/DeleteFolder.js.map +1 -1
- package/components/AdvancedSearch/AdvancedSearch.d.ts +2 -2
- package/components/AdvancedSearch/AdvancedSearch.js +1 -1
- package/components/AdvancedSearch/AdvancedSearch.js.map +1 -1
- package/components/AdvancedSearch/QueryBuilderDrawer/QueryBuilder/components/OperationSelector.js +2 -2
- package/components/AdvancedSearch/QueryBuilderDrawer/QueryBuilder/components/OperationSelector.js.map +1 -1
- package/components/AdvancedSearch/QueryBuilderDrawer/QueryBuilderDrawer.d.ts +2 -2
- package/components/AdvancedSearch/SelectedFilter/SelectedFilter.js +1 -1
- package/components/AdvancedSearch/SelectedFilter/SelectedFilter.js.map +1 -1
- package/components/AdvancedSearch/domain/Filter.d.ts +1 -1
- package/components/AdvancedSearch/domain/FilterRepositoryFactory.d.ts +2 -2
- package/components/AdvancedSearch/domain/FilterRepositoryFactory.js.map +1 -1
- package/components/AdvancedSearch/gateways/FiltersGraphQLGateway.d.ts +2 -2
- package/components/AdvancedSearch/gateways/FiltersGraphQLGateway.js +9 -10
- package/components/AdvancedSearch/gateways/FiltersGraphQLGateway.js.map +1 -1
- package/components/AdvancedSearch/gateways/filters.gql.d.ts +5 -5
- package/components/AdvancedSearch/gateways/filters.gql.js +5 -6
- package/components/AdvancedSearch/gateways/filters.gql.js.map +1 -1
- package/components/AdvancedSearch/useFilterRepository.js +7 -2
- package/components/AdvancedSearch/useFilterRepository.js.map +1 -1
- package/components/FolderTree/List/List.js +14 -6
- package/components/FolderTree/List/List.js.map +1 -1
- package/components/Table/cells/CellAuthor.d.ts +2 -0
- package/components/Table/cells/CellAuthor.js +10 -0
- package/components/Table/cells/CellAuthor.js.map +1 -0
- package/components/Table/cells/CellCreated.d.ts +2 -0
- package/components/Table/cells/CellCreated.js +13 -0
- package/components/Table/cells/CellCreated.js.map +1 -0
- package/components/Table/cells/CellModified.d.ts +2 -0
- package/components/Table/cells/CellModified.js +13 -0
- package/components/Table/cells/CellModified.js.map +1 -0
- package/components/Table/cells/index.d.ts +3 -0
- package/components/Table/cells/index.js +3 -0
- package/components/Table/components/Table/TableInner.d.ts +2 -2
- package/components/Table/createTableData.d.ts +7 -5
- package/components/Table/createTableData.js +22 -7
- package/components/Table/createTableData.js.map +1 -1
- package/components/Table/index.d.ts +2 -2
- package/components/Table/index.js +2 -2
- package/components/index.d.ts +0 -1
- package/components/index.js +0 -1
- package/config/AcoConfig.d.ts +8 -12
- package/config/advanced-search/FieldRenderer.d.ts +3 -1
- package/config/folder/Action.d.ts +1 -1
- package/config/folder/index.d.ts +3 -2
- package/config/index.d.ts +0 -1
- package/config/index.js +0 -1
- package/config/record/Action.d.ts +1 -1
- package/config/record/index.d.ts +1 -1
- package/config/table/Column.d.ts +8 -39
- package/config/table/Column.js +4 -67
- package/config/table/Column.js.map +1 -1
- package/config/table/Sorting.d.ts +2 -11
- package/config/table/Sorting.js +1 -28
- package/config/table/index.d.ts +5 -9
- package/contexts/index.d.ts +0 -3
- package/contexts/index.js +0 -3
- package/dialogs/DialogSetPermissions/UsersTeamsSelection/ListItemMeta.js +5 -0
- package/dialogs/DialogSetPermissions/UsersTeamsSelection/ListItemMeta.js.map +1 -1
- package/dialogs/DialogSetPermissions/graphql.d.ts +1 -1
- package/dialogs/DialogSetPermissions/graphql.js +1 -2
- package/dialogs/DialogSetPermissions/graphql.js.map +1 -1
- package/dialogs/useConfirmMoveFolderDialog.d.ts +1 -0
- package/dialogs/useConfirmMoveFolderDialog.js +3 -2
- package/dialogs/useConfirmMoveFolderDialog.js.map +1 -1
- package/dialogs/useCreateDialog.js +5 -9
- package/dialogs/useCreateDialog.js.map +1 -1
- package/dialogs/useEditDialog.js +2 -2
- package/dialogs/useEditDialog.js.map +1 -1
- package/dialogs/useSetPermissionsDialog.js +16 -4
- package/dialogs/useSetPermissionsDialog.js.map +1 -1
- package/domain/folder/Folder.d.ts +2 -1
- package/domain/folder/Folder.js.map +1 -1
- package/features/folders/cache/FoldersCacheFactory.d.ts +3 -1
- package/features/folders/cache/FoldersCacheFactory.js +5 -0
- package/features/folders/cache/FoldersCacheFactory.js.map +1 -1
- package/features/folders/cache/updateDescendantPermissions.d.ts +12 -0
- package/features/folders/cache/updateDescendantPermissions.js +27 -0
- package/features/folders/cache/updateDescendantPermissions.js.map +1 -0
- package/features/folders/createFolder/CreateFolderGqlGateway.d.ts +3 -3
- package/features/folders/createFolder/CreateFolderGqlGateway.js +15 -16
- package/features/folders/createFolder/CreateFolderGqlGateway.js.map +1 -1
- package/features/folders/deleteFolder/DeleteFolderGqlGateway.d.ts +3 -3
- package/features/folders/deleteFolder/DeleteFolderGqlGateway.js +5 -6
- package/features/folders/deleteFolder/DeleteFolderGqlGateway.js.map +1 -1
- package/features/folders/folderEvents/AddCreatedFolderToCache.d.ts +22 -0
- package/features/folders/folderEvents/AddCreatedFolderToCache.js +24 -0
- package/features/folders/folderEvents/AddCreatedFolderToCache.js.map +1 -0
- package/features/folders/folderEvents/FolderCreatedEvent.d.ts +14 -0
- package/features/folders/folderEvents/FolderCreatedEvent.js +13 -0
- package/features/folders/folderEvents/FolderCreatedEvent.js.map +1 -0
- package/features/folders/folderEvents/FolderDeletedEvent.d.ts +9 -0
- package/features/folders/folderEvents/FolderDeletedEvent.js +13 -0
- package/features/folders/folderEvents/FolderDeletedEvent.js.map +1 -0
- package/features/folders/folderEvents/FolderEvents.test.d.ts +1 -0
- package/features/folders/folderEvents/FolderEvents.test.js +238 -0
- package/features/folders/folderEvents/FolderEvents.test.js.map +1 -0
- package/features/folders/folderEvents/FolderUpdatedEvent.d.ts +12 -0
- package/features/folders/folderEvents/FolderUpdatedEvent.js +13 -0
- package/features/folders/folderEvents/FolderUpdatedEvent.js.map +1 -0
- package/features/folders/folderEvents/FolderWebsocketMessages.d.ts +15 -0
- package/features/folders/folderEvents/FolderWebsocketMessages.js +48 -0
- package/features/folders/folderEvents/FolderWebsocketMessages.js.map +1 -0
- package/features/folders/folderEvents/RefreshUpdatedFolderInCache.d.ts +19 -0
- package/features/folders/folderEvents/RefreshUpdatedFolderInCache.js +27 -0
- package/features/folders/folderEvents/RefreshUpdatedFolderInCache.js.map +1 -0
- package/features/folders/folderEvents/RemoveDeletedFolderFromCache.d.ts +13 -0
- package/features/folders/folderEvents/RemoveDeletedFolderFromCache.js +15 -0
- package/features/folders/folderEvents/RemoveDeletedFolderFromCache.js.map +1 -0
- package/features/folders/folderEvents/abstractions.d.ts +28 -0
- package/features/folders/folderEvents/abstractions.js +7 -0
- package/features/folders/folderEvents/abstractions.js.map +1 -0
- package/features/folders/folderEvents/feature.d.ts +9 -0
- package/features/folders/folderEvents/feature.js +21 -0
- package/features/folders/folderEvents/feature.js.map +1 -0
- package/features/folders/folderEvents/index.d.ts +5 -0
- package/features/folders/folderEvents/index.js +5 -0
- package/features/folders/folderModelProvider/FolderModelProvider.js +30 -31
- package/features/folders/folderModelProvider/FolderModelProvider.js.map +1 -1
- package/features/folders/folderModelProvider/GetFolderModelGqlGateway.d.ts +3 -3
- package/features/folders/folderModelProvider/GetFolderModelGqlGateway.js +5 -7
- package/features/folders/folderModelProvider/GetFolderModelGqlGateway.js.map +1 -1
- package/features/folders/getFolder/GetFolderGqlGateway.d.ts +3 -3
- package/features/folders/getFolder/GetFolderGqlGateway.js +5 -7
- package/features/folders/getFolder/GetFolderGqlGateway.js.map +1 -1
- package/features/folders/getFolderExtensionsFields/GetFolderExtensionsFieldsUseCase.d.ts +4 -3
- package/features/folders/getFolderExtensionsFields/useFolderExtensionsFields.d.ts +4 -3
- package/features/folders/getFolderLevelPermission/GetFolderLevelPermission.test.js +12 -16
- package/features/folders/getFolderLevelPermission/GetFolderLevelPermission.test.js.map +1 -1
- package/features/folders/getFolderLevelPermission/decorators/GetFolderLevelPermissionWithFlpDecorator.d.ts +3 -3
- package/features/folders/getFolderLevelPermission/decorators/GetFolderLevelPermissionWithFlpDecorator.js +5 -5
- package/features/folders/getFolderLevelPermission/decorators/GetFolderLevelPermissionWithFlpDecorator.js.map +1 -1
- package/features/folders/listFolders/ListFoldersGqlGateway.d.ts +1 -1
- package/features/folders/listFolders/ListFoldersGqlGateway.js +1 -2
- package/features/folders/listFolders/ListFoldersGqlGateway.js.map +1 -1
- package/features/folders/listFolders/useListFolders.d.ts +1 -1
- package/features/folders/listFoldersByParentIds/ListFoldersByParentIdsGqlGateway.d.ts +3 -3
- package/features/folders/listFoldersByParentIds/ListFoldersByParentIdsGqlGateway.js +5 -7
- package/features/folders/listFoldersByParentIds/ListFoldersByParentIdsGqlGateway.js.map +1 -1
- package/features/folders/listFoldersByParentIds/useListFoldersByParentIds.d.ts +2 -2
- package/features/folders/loadFolderHierarchy/useLoadFolderHierarchy.d.ts +2 -2
- package/features/folders/updateFolder/UpdateFolderGqlGateway.d.ts +3 -3
- package/features/folders/updateFolder/UpdateFolderGqlGateway.js +6 -7
- package/features/folders/updateFolder/UpdateFolderGqlGateway.js.map +1 -1
- package/features/folders/updateFolder/decorators/RepositoryWithPermissionsChange.d.ts +1 -4
- package/features/folders/updateFolder/decorators/RepositoryWithPermissionsChange.js +3 -30
- package/features/folders/updateFolder/decorators/RepositoryWithPermissionsChange.js.map +1 -1
- package/features/folders/updateFolder/decorators/{UseCaseWithoutInheritedPermissions.d.ts → UseCaseWithoutReadOnlyPermissions.d.ts} +2 -2
- package/features/folders/updateFolder/decorators/{UseCaseWithoutInheritedPermissions.js → UseCaseWithoutReadOnlyPermissions.js} +6 -6
- package/features/folders/updateFolder/decorators/UseCaseWithoutReadOnlyPermissions.js.map +1 -0
- package/features/folders/updateFolder/feature.js +2 -2
- package/features/folders/updateFolder/feature.js.map +1 -1
- package/hooks/index.d.ts +0 -6
- package/hooks/index.js +0 -6
- package/index.d.ts +3 -2
- package/index.js +2 -2
- package/package.json +23 -29
- package/presentation/folderTree/FolderTree.js +13 -5
- package/presentation/folderTree/FolderTree.js.map +1 -1
- package/presentation/folderTree/FolderTreePresenter.d.ts +5 -1
- package/presentation/folderTree/FolderTreePresenter.js +49 -31
- package/presentation/folderTree/FolderTreePresenter.js.map +1 -1
- package/presentation/folderTree/FolderTreePresenter.test.js +111 -7
- package/presentation/folderTree/FolderTreePresenter.test.js.map +1 -1
- package/table.types.d.ts +2 -9
- package/types.d.ts +5 -26
- package/types.js.map +1 -1
- package/components/Extensions/Extensions.d.ts +0 -2
- package/components/Extensions/Extensions.js +0 -30
- package/components/Extensions/Extensions.js.map +0 -1
- package/components/Extensions/index.d.ts +0 -1
- package/components/Extensions/index.js +0 -1
- package/config/folder/createFolderFieldDecoratorFactory.d.ts +0 -13
- package/config/folder/createFolderFieldDecoratorFactory.js +0 -17
- package/config/folder/createFolderFieldDecoratorFactory.js.map +0 -1
- package/config/table/Sorting.js.map +0 -1
- package/contexts/acoList.d.ts +0 -49
- package/contexts/acoList.js +0 -303
- package/contexts/acoList.js.map +0 -1
- package/contexts/app.d.ts +0 -33
- package/contexts/app.js +0 -47
- package/contexts/app.js.map +0 -1
- package/contexts/folders.d.ts +0 -12
- package/contexts/folders.js +0 -32
- package/contexts/folders.js.map +0 -1
- package/contexts/navigateFolder.d.ts +0 -17
- package/contexts/navigateFolder.js +0 -54
- package/contexts/navigateFolder.js.map +0 -1
- package/contexts/records.d.ts +0 -31
- package/contexts/records.js +0 -316
- package/contexts/records.js.map +0 -1
- package/exports/admin/aco.d.ts +0 -2
- package/exports/admin/aco.js +0 -2
- package/features/folders/updateFolder/decorators/UseCaseWithoutInheritedPermissions.js.map +0 -1
- package/graphql/app.gql.d.ts +0 -17
- package/graphql/app.gql.js +0 -22
- package/graphql/app.gql.js.map +0 -1
- package/graphql/records/common.d.ts +0 -4
- package/graphql/records/common.js +0 -57
- package/graphql/records/common.js.map +0 -1
- package/graphql/records/getRecord.d.ts +0 -2
- package/graphql/records/getRecord.js +0 -5
- package/graphql/records/getRecord.js.map +0 -1
- package/graphql/records/listRecords.d.ts +0 -2
- package/graphql/records/listRecords.js +0 -26
- package/graphql/records/listRecords.js.map +0 -1
- package/graphql/records/moveRecord.d.ts +0 -2
- package/graphql/records/moveRecord.js +0 -16
- package/graphql/records/moveRecord.js.map +0 -1
- package/graphql/records/types.d.ts +0 -108
- package/graphql/records/types.js +0 -0
- package/graphql/records.gql.d.ts +0 -3
- package/graphql/records.gql.js +0 -3
- package/handlers.d.ts +0 -23
- package/handlers.js +0 -22
- package/handlers.js.map +0 -1
- package/hooks/useAcoApp.d.ts +0 -2
- package/hooks/useAcoApp.js +0 -16
- package/hooks/useAcoApp.js.map +0 -1
- package/hooks/useAcoList.d.ts +0 -3
- package/hooks/useAcoList.js +0 -10
- package/hooks/useAcoList.js.map +0 -1
- package/hooks/useFolderModel.d.ts +0 -2
- package/hooks/useFolderModel.js +0 -16
- package/hooks/useFolderModel.js.map +0 -1
- package/hooks/useFoldersType.d.ts +0 -1
- package/hooks/useFoldersType.js +0 -12
- package/hooks/useFoldersType.js.map +0 -1
- package/hooks/useNavigateFolder.d.ts +0 -2
- package/hooks/useNavigateFolder.js +0 -10
- package/hooks/useNavigateFolder.js.map +0 -1
- package/hooks/useRecords.d.ts +0 -62
- package/hooks/useRecords.js +0 -64
- package/hooks/useRecords.js.map +0 -1
- package/hooks/useTags.d.ts +0 -14
- package/hooks/useTags.js +0 -27
- package/hooks/useTags.js.map +0 -1
- package/sorting.d.ts +0 -9
- package/sorting.js +0 -31
- package/sorting.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/folders/updateFolder/UpdateFolderGqlGateway.js","sources":["../../../../src/features/folders/updateFolder/UpdateFolderGqlGateway.ts"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"features/folders/updateFolder/UpdateFolderGqlGateway.js","sources":["../../../../src/features/folders/updateFolder/UpdateFolderGqlGateway.ts"],"sourcesContent":["import { MainGraphQLClient } from \"@webiny/app/features/mainGraphQLClient/index.js\";\nimport type { FolderDto } from \"~/domain/folder/FolderDto.js\";\nimport { FolderModelProvider } from \"~/features/folders/abstractions.js\";\nimport type { FolderGatewayDto } from \"./abstractions.js\";\nimport { UpdateFolderGateway as GatewayAbstraction } from \"./abstractions.js\";\nimport type { AcoError } from \"~/types.js\";\nimport { ROOT_FOLDER } from \"~/constants.js\";\n\nexport interface UpdateFolderResponse {\n aco: {\n updateFolder: {\n data: FolderDto;\n error: AcoError | null;\n };\n };\n}\n\nexport interface UpdateFolderVariables {\n id: string;\n data: Partial<\n Omit<\n FolderDto,\n \"id\" | \"createdOn\" | \"createdBy\" | \"savedOn\" | \"savedBy\" | \"modifiedOn\" | \"modifiedBy\"\n >\n >;\n}\n\nexport const UPDATE_FOLDER = (FOLDER_FIELDS: string) => /* GraphQL */ `\n mutation UpdateFolder($id: ID!, $data: FolderUpdateInput!) {\n aco {\n updateFolder(id: $id, data: $data) {\n data ${FOLDER_FIELDS}\n error {\n code\n data\n message\n }\n }\n }\n }\n`;\n\nclass UpdateFolderGqlGatewayImpl implements GatewayAbstraction.Interface {\n constructor(\n private client: MainGraphQLClient.Interface,\n private folderModelProvider: FolderModelProvider.Interface\n ) {}\n\n async execute(folder: FolderGatewayDto) {\n const fields = await this.folderModelProvider.getGraphQLSelection();\n\n const { id, title, slug, permissions, parentId, extensions } = folder;\n\n const response = await this.client.execute<UpdateFolderResponse, UpdateFolderVariables>({\n query: UPDATE_FOLDER(fields),\n variables: {\n id,\n data: {\n title,\n slug,\n extensions,\n parentId: parentId === ROOT_FOLDER ? null : parentId,\n permissions: permissions.filter(p => !p.inheritedFrom && !p.plugin)\n }\n }\n });\n\n if (!response) {\n throw new Error(\"Network error while updating folder.\");\n }\n\n const { data, error } = response.aco.updateFolder;\n\n if (!data) {\n throw new Error(error?.message || \"Could not update folder\");\n }\n\n return data;\n }\n}\n\nexport const UpdateFolderGqlGateway = GatewayAbstraction.createImplementation({\n implementation: UpdateFolderGqlGatewayImpl,\n dependencies: [MainGraphQLClient, FolderModelProvider]\n});\n"],"names":["UPDATE_FOLDER","FOLDER_FIELDS","UpdateFolderGqlGatewayImpl","client","folderModelProvider","folder","fields","id","title","slug","permissions","parentId","extensions","response","ROOT_FOLDER","p","Error","data","error","UpdateFolderGqlGateway","GatewayAbstraction","MainGraphQLClient","FolderModelProvider"],"mappings":";;;;AA2BO,MAAMA,gBAAgB,CAACC,gBAAwC,CAAC;;;;qBAIlD,EAAEA,cAAc;;;;;;;;;AASrC,CAAC;AAED,MAAMC;IACF,YACYC,MAAmC,EACnCC,mBAAkD,CAC5D;aAFUD,MAAM,GAANA;aACAC,mBAAmB,GAAnBA;IACT;IAEH,MAAM,QAAQC,MAAwB,EAAE;QACpC,MAAMC,SAAS,MAAM,IAAI,CAAC,mBAAmB,CAAC,mBAAmB;QAEjE,MAAM,EAAEC,EAAE,EAAEC,KAAK,EAAEC,IAAI,EAAEC,WAAW,EAAEC,QAAQ,EAAEC,UAAU,EAAE,GAAGP;QAE/D,MAAMQ,WAAW,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAA8C;YACpF,OAAOb,cAAcM;YACrB,WAAW;gBACPC;gBACA,MAAM;oBACFC;oBACAC;oBACAG;oBACA,UAAUD,aAAaG,cAAc,OAAOH;oBAC5C,aAAaD,YAAY,MAAM,CAACK,CAAAA,IAAK,CAACA,EAAE,aAAa,IAAI,CAACA,EAAE,MAAM;gBACtE;YACJ;QACJ;QAEA,IAAI,CAACF,UACD,MAAM,IAAIG,MAAM;QAGpB,MAAM,EAAEC,IAAI,EAAEC,KAAK,EAAE,GAAGL,SAAS,GAAG,CAAC,YAAY;QAEjD,IAAI,CAACI,MACD,MAAM,IAAID,MAAME,OAAO,WAAW;QAGtC,OAAOD;IACX;AACJ;AAEO,MAAME,yBAAyBC,oBAAAA,oBAAuC,CAAC;IAC1E,gBAAgBlB;IAChB,cAAc;QAACmB;QAAmBC;KAAoB;AAC1D"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Folder } from "../../../../domain/folder/Folder.js";
|
|
1
|
+
import type { Folder } from "../../../../domain/folder/Folder.js";
|
|
2
2
|
import { FoldersCache } from "../../abstractions.js";
|
|
3
3
|
import { UpdateFolderRepository as RepositoryAbstraction } from "../abstractions.js";
|
|
4
4
|
declare class UpdateFolderRepositoryWithPermissionsChangeImpl implements RepositoryAbstraction.Interface {
|
|
@@ -6,9 +6,6 @@ declare class UpdateFolderRepositoryWithPermissionsChangeImpl implements Reposit
|
|
|
6
6
|
private decoratee;
|
|
7
7
|
constructor(cache: FoldersCache.Interface, decoratee: RepositoryAbstraction.Interface);
|
|
8
8
|
execute(folder: Folder): Promise<void>;
|
|
9
|
-
private updateChildrenPermissionsRecursively;
|
|
10
|
-
private updateFolderPermissions;
|
|
11
|
-
private listDirectChildren;
|
|
12
9
|
}
|
|
13
10
|
export declare const UpdateFolderRepositoryWithPermissionsChange: typeof UpdateFolderRepositoryWithPermissionsChangeImpl & {
|
|
14
11
|
__abstraction: import("@webiny/di").Abstraction<import("../abstractions.js").IUpdateFolderRepository>;
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import isEqual from "lodash/isEqual.js";
|
|
2
|
-
import {
|
|
3
|
-
import { Folder } from "../../../../domain/folder/Folder.js";
|
|
2
|
+
import { updateDescendantPermissions, updateFolderPermissions } from "../../cache/updateDescendantPermissions.js";
|
|
4
3
|
import { FoldersCache } from "../../abstractions.js";
|
|
5
4
|
import { UpdateFolderRepository } from "../abstractions.js";
|
|
6
5
|
class UpdateFolderRepositoryWithPermissionsChangeImpl {
|
|
@@ -17,34 +16,8 @@ class UpdateFolderRepositoryWithPermissionsChangeImpl {
|
|
|
17
16
|
if (!cachedFolderPermissions) return;
|
|
18
17
|
if (isEqual(cachedFolderPermissions, folderPermissions)) return;
|
|
19
18
|
const parentFolder = this.cache.getItem((f)=>f.id === folder.parentId);
|
|
20
|
-
const updatedFolder = this.
|
|
21
|
-
|
|
22
|
-
if (directChildren.length) this.updateChildrenPermissionsRecursively(directChildren, updatedFolder);
|
|
23
|
-
}
|
|
24
|
-
updateChildrenPermissionsRecursively(children, parentFolder) {
|
|
25
|
-
for (const child of children){
|
|
26
|
-
const updatedChild = this.updateFolderPermissions(child.id, parentFolder);
|
|
27
|
-
const grandChildren = this.listDirectChildren(updatedChild);
|
|
28
|
-
if (grandChildren.length) this.updateChildrenPermissionsRecursively(grandChildren, updatedChild);
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
updateFolderPermissions(folderId, parentFolder) {
|
|
32
|
-
let updatedFolder;
|
|
33
|
-
this.cache.updateItems((f)=>{
|
|
34
|
-
if (f.id === folderId) {
|
|
35
|
-
const permissions = Permissions.create(f.permissions, parentFolder);
|
|
36
|
-
updatedFolder = Folder.create({
|
|
37
|
-
...f,
|
|
38
|
-
permissions
|
|
39
|
-
});
|
|
40
|
-
return updatedFolder;
|
|
41
|
-
}
|
|
42
|
-
return f;
|
|
43
|
-
});
|
|
44
|
-
return updatedFolder;
|
|
45
|
-
}
|
|
46
|
-
listDirectChildren(folder) {
|
|
47
|
-
return this.cache.getItems().filter((f)=>f.parentId === folder.id);
|
|
19
|
+
const updatedFolder = updateFolderPermissions(this.cache, folder.id, parentFolder);
|
|
20
|
+
updateDescendantPermissions(this.cache, updatedFolder);
|
|
48
21
|
}
|
|
49
22
|
}
|
|
50
23
|
const UpdateFolderRepositoryWithPermissionsChange = UpdateFolderRepository.createDecorator({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/folders/updateFolder/decorators/RepositoryWithPermissionsChange.js","sources":["../../../../../src/features/folders/updateFolder/decorators/RepositoryWithPermissionsChange.ts"],"sourcesContent":["import isEqual from \"lodash/isEqual.js\";\nimport {
|
|
1
|
+
{"version":3,"file":"features/folders/updateFolder/decorators/RepositoryWithPermissionsChange.js","sources":["../../../../../src/features/folders/updateFolder/decorators/RepositoryWithPermissionsChange.ts"],"sourcesContent":["import isEqual from \"lodash/isEqual.js\";\nimport type { Folder } from \"~/domain/folder/Folder.js\";\nimport {\n updateDescendantPermissions,\n updateFolderPermissions\n} from \"~/features/folders/cache/updateDescendantPermissions.js\";\nimport { FoldersCache } from \"../../abstractions.js\";\nimport { UpdateFolderRepository as RepositoryAbstraction } from \"../abstractions.js\";\n\nclass UpdateFolderRepositoryWithPermissionsChangeImpl implements RepositoryAbstraction.Interface {\n constructor(\n private cache: FoldersCache.Interface,\n private decoratee: RepositoryAbstraction.Interface\n ) {}\n\n async execute(folder: Folder) {\n const folderPermissions = [...folder.permissions];\n const cachedFolderPermissions = this.cache.getItem(f => f.id === folder.id)?.permissions;\n\n // Let's run the original use case and update the folder.\n await this.decoratee.execute(folder);\n\n if (!cachedFolderPermissions) {\n // If the folder is not in the cache, we can't proceed to update its children permissions.\n return;\n }\n\n if (isEqual(cachedFolderPermissions, folderPermissions)) {\n // If the permissions are the same, we don't need to update anything.\n return;\n }\n\n // If the permissions have changed, we need to update the folder and its children.\n // Starting with the folder itself, inheriting permissions from its parent folder.\n const parentFolder = this.cache.getItem(f => f.id === folder.parentId);\n const updatedFolder = updateFolderPermissions(this.cache, folder.id, parentFolder);\n\n // Now we need to update the permissions of all the folder's descendants.\n updateDescendantPermissions(this.cache, updatedFolder);\n }\n}\n\nexport const UpdateFolderRepositoryWithPermissionsChange = RepositoryAbstraction.createDecorator({\n decorator: UpdateFolderRepositoryWithPermissionsChangeImpl,\n dependencies: [FoldersCache]\n});\n"],"names":["UpdateFolderRepositoryWithPermissionsChangeImpl","cache","decoratee","folder","folderPermissions","cachedFolderPermissions","f","isEqual","parentFolder","updatedFolder","updateFolderPermissions","updateDescendantPermissions","UpdateFolderRepositoryWithPermissionsChange","RepositoryAbstraction","FoldersCache"],"mappings":";;;;AASA,MAAMA;IACF,YACYC,KAA6B,EAC7BC,SAA0C,CACpD;aAFUD,KAAK,GAALA;aACAC,SAAS,GAATA;IACT;IAEH,MAAM,QAAQC,MAAc,EAAE;QAC1B,MAAMC,oBAAoB;eAAID,OAAO,WAAW;SAAC;QACjD,MAAME,0BAA0B,IAAI,CAAC,KAAK,CAAC,OAAO,CAACC,CAAAA,IAAKA,EAAE,EAAE,KAAKH,OAAO,EAAE,GAAG;QAG7E,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAACA;QAE7B,IAAI,CAACE,yBAED;QAGJ,IAAIE,QAAQF,yBAAyBD,oBAEjC;QAKJ,MAAMI,eAAe,IAAI,CAAC,KAAK,CAAC,OAAO,CAACF,CAAAA,IAAKA,EAAE,EAAE,KAAKH,OAAO,QAAQ;QACrE,MAAMM,gBAAgBC,wBAAwB,IAAI,CAAC,KAAK,EAAEP,OAAO,EAAE,EAAEK;QAGrEG,4BAA4B,IAAI,CAAC,KAAK,EAAEF;IAC5C;AACJ;AAEO,MAAMG,8CAA8CC,uBAAAA,eAAqC,CAAC;IAC7F,WAAWb;IACX,cAAc;QAACc;KAAa;AAChC"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { UpdateFolderUseCase as UseCaseAbstraction } from "../abstractions.js";
|
|
2
|
-
declare class
|
|
2
|
+
declare class UpdateFolderUseCaseWithoutReadOnlyPermissionsImpl implements UseCaseAbstraction.Interface {
|
|
3
3
|
private decoratee;
|
|
4
4
|
constructor(decoratee: UseCaseAbstraction.Interface);
|
|
5
5
|
execute(folder: UseCaseAbstraction.Params): Promise<void>;
|
|
6
6
|
}
|
|
7
|
-
export declare const
|
|
7
|
+
export declare const UpdateFolderUseCaseWithoutReadOnlyPermissions: typeof UpdateFolderUseCaseWithoutReadOnlyPermissionsImpl & {
|
|
8
8
|
__abstraction: import("@webiny/di").Abstraction<import("../abstractions.js").IUpdateFolderUseCase>;
|
|
9
9
|
};
|
|
10
10
|
export {};
|
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
import { UpdateFolderUseCase } from "../abstractions.js";
|
|
2
|
-
class
|
|
2
|
+
class UpdateFolderUseCaseWithoutReadOnlyPermissionsImpl {
|
|
3
3
|
constructor(decoratee){
|
|
4
4
|
this.decoratee = decoratee;
|
|
5
5
|
}
|
|
6
6
|
async execute(folder) {
|
|
7
|
-
const filteredPermissions = folder.permissions.filter((p)=>!p.inheritedFrom);
|
|
7
|
+
const filteredPermissions = folder.permissions.filter((p)=>!p.inheritedFrom && !p.plugin);
|
|
8
8
|
await this.decoratee.execute({
|
|
9
9
|
...folder,
|
|
10
10
|
permissions: filteredPermissions
|
|
11
11
|
});
|
|
12
12
|
}
|
|
13
13
|
}
|
|
14
|
-
const
|
|
15
|
-
decorator:
|
|
14
|
+
const UpdateFolderUseCaseWithoutReadOnlyPermissions = UpdateFolderUseCase.createDecorator({
|
|
15
|
+
decorator: UpdateFolderUseCaseWithoutReadOnlyPermissionsImpl,
|
|
16
16
|
dependencies: []
|
|
17
17
|
});
|
|
18
|
-
export {
|
|
18
|
+
export { UpdateFolderUseCaseWithoutReadOnlyPermissions };
|
|
19
19
|
|
|
20
|
-
//# sourceMappingURL=
|
|
20
|
+
//# sourceMappingURL=UseCaseWithoutReadOnlyPermissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"features/folders/updateFolder/decorators/UseCaseWithoutReadOnlyPermissions.js","sources":["../../../../../src/features/folders/updateFolder/decorators/UseCaseWithoutReadOnlyPermissions.ts"],"sourcesContent":["import { UpdateFolderUseCase as UseCaseAbstraction } from \"../abstractions.js\";\n\nclass UpdateFolderUseCaseWithoutReadOnlyPermissionsImpl implements UseCaseAbstraction.Interface {\n constructor(private decoratee: UseCaseAbstraction.Interface) {}\n\n async execute(folder: UseCaseAbstraction.Params) {\n // Some permissions are read-only: inherited ones are contributed by a parent folder, and\n // code-defined ones by an `FlpFactory` on the API side. Neither is stored on the folder\n // itself, and the API rejects them on write, so we must omit them.\n const filteredPermissions = folder.permissions.filter(p => !p.inheritedFrom && !p.plugin);\n\n await this.decoratee.execute({\n ...folder,\n permissions: filteredPermissions\n });\n }\n}\n\nexport const UpdateFolderUseCaseWithoutReadOnlyPermissions = UseCaseAbstraction.createDecorator({\n decorator: UpdateFolderUseCaseWithoutReadOnlyPermissionsImpl,\n dependencies: []\n});\n"],"names":["UpdateFolderUseCaseWithoutReadOnlyPermissionsImpl","decoratee","folder","filteredPermissions","p","UpdateFolderUseCaseWithoutReadOnlyPermissions","UseCaseAbstraction"],"mappings":";AAEA,MAAMA;IACF,YAAoBC,SAAuC,CAAE;aAAzCA,SAAS,GAATA;IAA0C;IAE9D,MAAM,QAAQC,MAAiC,EAAE;QAI7C,MAAMC,sBAAsBD,OAAO,WAAW,CAAC,MAAM,CAACE,CAAAA,IAAK,CAACA,EAAE,aAAa,IAAI,CAACA,EAAE,MAAM;QAExF,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;YACzB,GAAGF,MAAM;YACT,aAAaC;QACjB;IACJ;AACJ;AAEO,MAAME,gDAAgDC,oBAAAA,eAAkC,CAAC;IAC5F,WAAWN;IACX,cAAc,EAAE;AACpB"}
|
|
@@ -6,7 +6,7 @@ import { UpdateFolderRepository } from "./UpdateFolderRepository.js";
|
|
|
6
6
|
import { UpdateFolderGqlGateway } from "./UpdateFolderGqlGateway.js";
|
|
7
7
|
import { UpdateFolderRepositoryWithPathChange } from "./decorators/RepositoryWithPathChange.js";
|
|
8
8
|
import { UpdateFolderRepositoryWithPermissionsChange } from "./decorators/RepositoryWithPermissionsChange.js";
|
|
9
|
-
import {
|
|
9
|
+
import { UpdateFolderUseCaseWithoutReadOnlyPermissions } from "./decorators/UseCaseWithoutReadOnlyPermissions.js";
|
|
10
10
|
import { UpdateFolderUseCaseWithLoading } from "./decorators/UseCaseWithLoading.js";
|
|
11
11
|
const UpdateFolderFeature = createFeature({
|
|
12
12
|
name: "UpdateFolder",
|
|
@@ -16,7 +16,7 @@ const UpdateFolderFeature = createFeature({
|
|
|
16
16
|
container.register(UpdateFolderGqlGateway);
|
|
17
17
|
container.registerDecorator(UpdateFolderRepositoryWithPathChange);
|
|
18
18
|
container.registerDecorator(UpdateFolderRepositoryWithPermissionsChange);
|
|
19
|
-
container.registerDecorator(
|
|
19
|
+
container.registerDecorator(UpdateFolderUseCaseWithoutReadOnlyPermissions);
|
|
20
20
|
container.registerDecorator(UpdateFolderUseCaseWithLoading);
|
|
21
21
|
},
|
|
22
22
|
resolve (container) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"features/folders/updateFolder/feature.js","sources":["../../../../src/features/folders/updateFolder/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/admin\";\nimport { FoldersLoadingRepository } from \"~/features/folders/abstractions.js\";\nimport { UpdateFolderUseCase as UseCase } from \"./abstractions.js\";\nimport { UpdateFolderUseCase } from \"./UpdateFolderUseCase.js\";\nimport { UpdateFolderRepository } from \"./UpdateFolderRepository.js\";\nimport { UpdateFolderGqlGateway } from \"./UpdateFolderGqlGateway.js\";\nimport { UpdateFolderRepositoryWithPathChange } from \"./decorators/RepositoryWithPathChange.js\";\nimport { UpdateFolderRepositoryWithPermissionsChange } from \"./decorators/RepositoryWithPermissionsChange.js\";\nimport {
|
|
1
|
+
{"version":3,"file":"features/folders/updateFolder/feature.js","sources":["../../../../src/features/folders/updateFolder/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/admin\";\nimport { FoldersLoadingRepository } from \"~/features/folders/abstractions.js\";\nimport { UpdateFolderUseCase as UseCase } from \"./abstractions.js\";\nimport { UpdateFolderUseCase } from \"./UpdateFolderUseCase.js\";\nimport { UpdateFolderRepository } from \"./UpdateFolderRepository.js\";\nimport { UpdateFolderGqlGateway } from \"./UpdateFolderGqlGateway.js\";\nimport { UpdateFolderRepositoryWithPathChange } from \"./decorators/RepositoryWithPathChange.js\";\nimport { UpdateFolderRepositoryWithPermissionsChange } from \"./decorators/RepositoryWithPermissionsChange.js\";\nimport { UpdateFolderUseCaseWithoutReadOnlyPermissions } from \"./decorators/UseCaseWithoutReadOnlyPermissions.js\";\nimport { UpdateFolderUseCaseWithLoading } from \"./decorators/UseCaseWithLoading.js\";\n\nexport const UpdateFolderFeature = createFeature({\n name: \"UpdateFolder\",\n register(container) {\n // Register base use case\n container.register(UpdateFolderUseCase);\n\n // Register base repository\n container.register(UpdateFolderRepository).inSingletonScope();\n\n // Register gateway\n container.register(UpdateFolderGqlGateway);\n\n // Register repository decorators (innermost first)\n container.registerDecorator(UpdateFolderRepositoryWithPathChange);\n container.registerDecorator(UpdateFolderRepositoryWithPermissionsChange);\n\n // Register use case decorators (innermost first)\n container.registerDecorator(UpdateFolderUseCaseWithoutReadOnlyPermissions);\n container.registerDecorator(UpdateFolderUseCaseWithLoading);\n },\n resolve(container) {\n return {\n useCase: container.resolve(UseCase),\n loading: container.resolve(FoldersLoadingRepository)\n };\n }\n});\n"],"names":["UpdateFolderFeature","createFeature","container","UpdateFolderUseCase","UpdateFolderRepository","UpdateFolderGqlGateway","UpdateFolderRepositoryWithPathChange","UpdateFolderRepositoryWithPermissionsChange","UpdateFolderUseCaseWithoutReadOnlyPermissions","UpdateFolderUseCaseWithLoading","UseCase","FoldersLoadingRepository"],"mappings":";;;;;;;;;;AAWO,MAAMA,sBAAsBC,cAAc;IAC7C,MAAM;IACN,UAASC,SAAS;QAEdA,UAAU,QAAQ,CAACC;QAGnBD,UAAU,QAAQ,CAACE,wBAAwB,gBAAgB;QAG3DF,UAAU,QAAQ,CAACG;QAGnBH,UAAU,iBAAiB,CAACI;QAC5BJ,UAAU,iBAAiB,CAACK;QAG5BL,UAAU,iBAAiB,CAACM;QAC5BN,UAAU,iBAAiB,CAACO;IAChC;IACA,SAAQP,SAAS;QACb,OAAO;YACH,SAASA,UAAU,OAAO,CAACQ;YAC3B,SAASR,UAAU,OAAO,CAACS;QAC/B;IACJ;AACJ"}
|
package/hooks/index.d.ts
CHANGED
package/hooks/index.js
CHANGED
package/index.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
export * from "./app.js";
|
|
2
1
|
export * from "./components/index.js";
|
|
3
2
|
export * from "./config/index.js";
|
|
4
3
|
export * from "./contexts/index.js";
|
|
5
4
|
export * from "./hooks/index.js";
|
|
6
5
|
export * from "./dialogs/index.js";
|
|
7
|
-
export * from "./sorting.js";
|
|
8
6
|
export type { TableRow, FolderTableRow, RecordTableRow } from "./table.types.js";
|
|
7
|
+
export { sortFolders } from "./components/Table/createTableData.js";
|
|
8
|
+
export type { FolderSortConfig } from "./components/Table/createTableData.js";
|
|
9
9
|
export type { ListMeta, FolderLevelPermissionsTarget } from "./types.js";
|
|
10
10
|
export { LIST_FOLDER_LEVEL_PERMISSIONS_TARGETS } from "./dialogs/DialogSetPermissions/graphql.js";
|
|
11
11
|
export { UsersTeamsMultiAutocomplete } from "./dialogs/DialogSetPermissions/UsersTeamsMultiAutocomplete.js";
|
|
@@ -23,3 +23,4 @@ export * from "./features/folders/loadFolderHierarchy/useLoadFolderHierarchy.js"
|
|
|
23
23
|
export * from "./features/folders/listFolders/useListFolders.js";
|
|
24
24
|
export * from "./features/folders/listFoldersByParentIds/useListFoldersByParentIds.js";
|
|
25
25
|
export * from "./presentation/folderTree/index.js";
|
|
26
|
+
export * from "./app.js";
|
package/index.js
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
export * from "./app.js";
|
|
2
1
|
export * from "./components/index.js";
|
|
3
2
|
export * from "./config/index.js";
|
|
4
3
|
export * from "./contexts/index.js";
|
|
5
4
|
export * from "./hooks/index.js";
|
|
6
5
|
export * from "./dialogs/index.js";
|
|
7
|
-
export * from "./sorting.js";
|
|
8
6
|
export * from "./domain/folder/FolderDto.js";
|
|
9
7
|
export * from "./domain/folder/FolderDtoMapper.js";
|
|
10
8
|
export * from "./features/folders/createFolder/useCreateFolder.js";
|
|
@@ -19,5 +17,7 @@ export * from "./features/folders/loadFolderHierarchy/useLoadFolderHierarchy.js"
|
|
|
19
17
|
export * from "./features/folders/listFolders/useListFolders.js";
|
|
20
18
|
export * from "./features/folders/listFoldersByParentIds/useListFoldersByParentIds.js";
|
|
21
19
|
export * from "./presentation/folderTree/index.js";
|
|
20
|
+
export * from "./app.js";
|
|
21
|
+
export { sortFolders } from "./components/Table/createTableData.js";
|
|
22
22
|
export { LIST_FOLDER_LEVEL_PERMISSIONS_TARGETS } from "./dialogs/DialogSetPermissions/graphql.js";
|
|
23
23
|
export { UsersTeamsMultiAutocomplete } from "./dialogs/DialogSetPermissions/UsersTeamsMultiAutocomplete.js";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webiny/app-aco",
|
|
3
|
-
"version": "0.0.0-unstable.
|
|
3
|
+
"version": "0.0.0-unstable.7c2def32a7",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./index.js",
|
|
@@ -15,41 +15,35 @@
|
|
|
15
15
|
"author": "Webiny Ltd.",
|
|
16
16
|
"license": "MIT",
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"@
|
|
19
|
-
"@webiny/
|
|
20
|
-
"@webiny/app": "0.0.0-unstable.
|
|
21
|
-
"@webiny/app-
|
|
22
|
-
"@webiny/app-
|
|
23
|
-
"@webiny/app-
|
|
24
|
-
"@webiny/feature": "0.0.0-unstable.
|
|
25
|
-
"@webiny/
|
|
26
|
-
"@webiny/
|
|
27
|
-
"@webiny/
|
|
28
|
-
"@webiny/react-properties": "0.0.0-unstable.
|
|
29
|
-
"@webiny/shared-aco": "0.0.0-unstable.
|
|
30
|
-
"@webiny/utils": "0.0.0-unstable.
|
|
31
|
-
"@webiny/validation": "0.0.0-unstable.
|
|
32
|
-
"dot-prop-immutable": "2.1.1",
|
|
33
|
-
"graphql": "16.14.0",
|
|
34
|
-
"graphql-tag": "2.12.6",
|
|
18
|
+
"@webiny/admin-ui": "0.0.0-unstable.7c2def32a7",
|
|
19
|
+
"@webiny/app": "0.0.0-unstable.7c2def32a7",
|
|
20
|
+
"@webiny/app-admin": "0.0.0-unstable.7c2def32a7",
|
|
21
|
+
"@webiny/app-headless-cms-common": "0.0.0-unstable.7c2def32a7",
|
|
22
|
+
"@webiny/app-utils": "0.0.0-unstable.7c2def32a7",
|
|
23
|
+
"@webiny/app-websockets": "0.0.0-unstable.7c2def32a7",
|
|
24
|
+
"@webiny/feature": "0.0.0-unstable.7c2def32a7",
|
|
25
|
+
"@webiny/feature-flags": "0.0.0-unstable.7c2def32a7",
|
|
26
|
+
"@webiny/form": "0.0.0-unstable.7c2def32a7",
|
|
27
|
+
"@webiny/icons": "0.0.0-unstable.7c2def32a7",
|
|
28
|
+
"@webiny/react-properties": "0.0.0-unstable.7c2def32a7",
|
|
29
|
+
"@webiny/shared-aco": "0.0.0-unstable.7c2def32a7",
|
|
30
|
+
"@webiny/utils": "0.0.0-unstable.7c2def32a7",
|
|
31
|
+
"@webiny/validation": "0.0.0-unstable.7c2def32a7",
|
|
35
32
|
"lodash": "4.18.1",
|
|
36
|
-
"mobx": "
|
|
37
|
-
"mobx-react-lite": "
|
|
33
|
+
"mobx": "7.0.3",
|
|
34
|
+
"mobx-react-lite": "5.0.3",
|
|
38
35
|
"react": "18.3.1",
|
|
39
36
|
"react-dom": "18.3.1",
|
|
40
|
-
"slugify": "1.6.9",
|
|
41
37
|
"zod": "4.4.3"
|
|
42
38
|
},
|
|
43
39
|
"devDependencies": {
|
|
44
|
-
"@types/react": "18.3.
|
|
45
|
-
"@webiny/build-tools": "0.0.0-unstable.
|
|
46
|
-
"@webiny/di": "
|
|
47
|
-
"@webiny/wcp": "0.0.0-unstable.
|
|
48
|
-
"apollo-client": "2.6.10",
|
|
49
|
-
"apollo-link": "1.2.14",
|
|
40
|
+
"@types/react": "18.3.31",
|
|
41
|
+
"@webiny/build-tools": "0.0.0-unstable.7c2def32a7",
|
|
42
|
+
"@webiny/di": "2.0.0",
|
|
43
|
+
"@webiny/wcp": "0.0.0-unstable.7c2def32a7",
|
|
50
44
|
"rimraf": "6.1.3",
|
|
51
|
-
"typescript": "
|
|
52
|
-
"vitest": "4.1.
|
|
45
|
+
"typescript": "7.0.2",
|
|
46
|
+
"vitest": "4.1.11"
|
|
53
47
|
},
|
|
54
48
|
"publishConfig": {
|
|
55
49
|
"access": "public"
|
|
@@ -138,12 +138,20 @@ const FolderTree = ({ vm, actions, folderActions = [], enableCreate, enableActio
|
|
|
138
138
|
const folder = localFolders.find((f)=>f.id === dragSourceId);
|
|
139
139
|
const targetFolder = localFolders.find((f)=>f.id === dropTargetId);
|
|
140
140
|
if (!folder || !targetFolder) return;
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
141
|
+
await new Promise((resolve, reject)=>{
|
|
142
|
+
showConfirmMoveFolderDialog({
|
|
143
|
+
folder,
|
|
144
|
+
targetFolder,
|
|
145
|
+
onAccept: async ()=>{
|
|
146
|
+
await runDrop();
|
|
147
|
+
resolve();
|
|
148
|
+
},
|
|
149
|
+
onClose: ()=>{
|
|
150
|
+
reject(new Error("cancelled"));
|
|
151
|
+
}
|
|
152
|
+
});
|
|
145
153
|
});
|
|
146
|
-
} else
|
|
154
|
+
} else runDrop();
|
|
147
155
|
}, [
|
|
148
156
|
localFolders,
|
|
149
157
|
dropConfirmation,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"presentation/folderTree/FolderTree.js","sources":["../../../src/presentation/folderTree/FolderTree.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport {\n Tree,\n Tooltip,\n Dialog,\n Text,\n OverlayLoader,\n type NodeDto,\n type TreeProps,\n type WithDefaultNodeData,\n type DropOptions\n} from \"@webiny/admin-ui\";\nimport { useFeature } from \"@webiny/app\";\nimport { observer } from \"mobx-react-lite\";\nimport { useSnackbar, FormView } from \"@webiny/app-admin\";\nimport { i18n } from \"@webiny/app/i18n/index.js\";\nimport { ROOT_FOLDER } from \"~/constants.js\";\nimport { FolderProvider } from \"~/contexts/folder.js\";\nimport { Node } from \"~/components/FolderTree/Node/Node.js\";\nimport { Loader } from \"~/components/FolderTree/Loader/Loader.js\";\nimport { ButtonCreate } from \"~/components/FolderTree/ButtonCreate/ButtonCreate.js\";\nimport { useConfirmMoveFolderDialog } from \"~/dialogs/index.js\";\nimport { createTreeData, createInitialOpenList } from \"~/components/FolderTree/List/utils.js\";\nimport { FolderTreePresenterFeature } from \"./feature.js\";\nimport type { FolderDto } from \"~/domain/folder/FolderDto.js\";\nimport type { FolderActionConfig } from \"~/config/AcoConfig.js\";\nimport type {\n IFolderTreeCallbacks,\n IFolderTreeViewModel,\n IFolderOperationState\n} from \"./abstractions.js\";\n\nconst t = i18n.ns(\"app-aco/presentation/folder-tree\");\n\nconst FolderOperationDialog = observer(function FolderOperationDialog({\n operation,\n actions\n}: {\n operation: IFolderOperationState;\n actions: IFolderTreeCallbacks;\n}) {\n const [loading, setLoading] = useState(false);\n\n if (!operation.active) {\n return null;\n }\n\n const handleClose = () => {\n if (!loading) {\n actions.cancelOperation();\n }\n };\n\n const withLoading = async (fn: () => Promise<unknown>) => {\n setLoading(true);\n try {\n await fn();\n } finally {\n setLoading(false);\n }\n };\n\n if (operation.mode === \"delete\") {\n return (\n <Dialog\n open={true}\n onClose={handleClose}\n title={t`Delete Folder`}\n actions={\n <>\n <Dialog.CancelAction onClick={handleClose} text={t`Cancel`} />\n <Dialog.ConfirmAction\n onClick={() => {\n if (operation.folderId) {\n void withLoading(() =>\n actions.deleteFolder(operation.folderId!)\n );\n }\n }}\n text={t`Delete`}\n />\n </>\n }\n >\n {loading && <OverlayLoader text={t`Deleting folder...`} />}\n <Text size={\"md\"}>\n {t`Are you sure you want to delete this folder? This action cannot be undone.`}\n </Text>\n </Dialog>\n );\n }\n\n if ((operation.mode === \"create\" || operation.mode === \"edit\") && operation.form) {\n const title = operation.mode === \"create\" ? t`Create Folder` : t`Edit Folder`;\n const confirmLabel = operation.mode === \"create\" ? t`Create` : t`Save`;\n const loadingLabel =\n operation.mode === \"create\" ? t`Creating folder...` : t`Saving folder...`;\n\n return (\n <Dialog\n open={true}\n onClose={handleClose}\n title={title}\n actions={\n <>\n <Dialog.CancelAction onClick={handleClose} text={t`Cancel`} />\n <Dialog.ConfirmAction\n onClick={() => {\n void withLoading(() => actions.submitOperation());\n }}\n text={confirmLabel}\n />\n </>\n }\n >\n {loading && <OverlayLoader text={loadingLabel} />}\n <FormView name={\"Folder Tree\"} form={operation.form.vm} />\n </Dialog>\n );\n }\n\n return null;\n});\n\nexport interface PresenterFolderTreeProps {\n vm: IFolderTreeViewModel;\n actions: IFolderTreeCallbacks;\n folderActions?: FolderActionConfig[];\n enableCreate?: boolean;\n enableActions?: boolean;\n dropConfirmation?: boolean;\n rootFolderLabel?: string;\n hiddenFolderIds?: string[];\n}\n\nexport interface UncontrolledFolderTreeProps extends Omit<\n PresenterFolderTreeProps,\n \"vm\" | \"actions\"\n> {\n focusedFolderId?: string | null;\n onFolderClick?: (folderId: string | null) => void;\n}\n\nexport const FolderTree = ({\n vm,\n actions,\n folderActions = [],\n enableCreate,\n enableActions,\n dropConfirmation = false,\n rootFolderLabel,\n hiddenFolderIds\n}: PresenterFolderTreeProps) => {\n const { showSnackbar } = useSnackbar();\n const { showDialog: showConfirmMoveFolderDialog } = useConfirmMoveFolderDialog();\n\n const focusedFolderId = vm.currentFolderId ?? ROOT_FOLDER;\n\n const folders = vm.folders;\n\n const localFolders = useMemo(() => {\n if (!folders.length) {\n return [];\n }\n return folders.map(item =>\n item.id === ROOT_FOLDER && rootFolderLabel ? { ...item, title: rootFolderLabel } : item\n );\n }, [folders, rootFolderLabel]);\n\n const [treeData, setTreeData] = useState<NodeDto<FolderDto>[]>([]);\n const [openFolderIds, setOpenFolderIds] = useState<string[]>([ROOT_FOLDER]);\n\n useEffect(() => {\n setTreeData(createTreeData(localFolders, focusedFolderId, hiddenFolderIds));\n }, [localFolders, focusedFolderId, hiddenFolderIds]);\n\n useEffect(() => {\n setOpenFolderIds(prev => {\n const expanded = createInitialOpenList(localFolders, prev, focusedFolderId);\n return [...new Set([ROOT_FOLDER, ...expanded])];\n });\n }, [focusedFolderId, localFolders]);\n\n const handleChangeOpen: TreeProps[\"onChangeOpen\"] = async nodes => {\n const folderIds = nodes.map(node => node.id);\n const updatedOpenIds = [...new Set([ROOT_FOLDER, ...folderIds])];\n const newlyOpened = updatedOpenIds.filter(id => !openFolderIds.includes(id));\n setOpenFolderIds(updatedOpenIds);\n\n if (newlyOpened.length > 0) {\n await actions.loadChildFolders(newlyOpened);\n }\n };\n\n const handleDrop: TreeProps[\"onDrop\"] = async (_, { dragSourceId, dropTargetId }) => {\n try {\n const targetParentId = dropTargetId !== ROOT_FOLDER ? (dropTargetId as string) : null;\n await actions.moveFolder(dragSourceId as string, targetParentId);\n } catch (error) {\n showSnackbar((error as Error).message);\n }\n };\n\n const onDrop = useCallback<NonNullable<TreeProps[\"onDrop\"]>>(\n async (newTree, options: DropOptions) => {\n const runDrop = async () => handleDrop(newTree, options);\n\n if (dropConfirmation) {\n const { dragSourceId, dropTargetId } = options;\n const folder = localFolders.find(f => f.id === dragSourceId);\n const targetFolder = localFolders.find(f => f.id === dropTargetId);\n\n if (!folder || !targetFolder) {\n return;\n }\n\n showConfirmMoveFolderDialog({\n folder,\n targetFolder,\n onAccept: runDrop\n });\n } else {\n await runDrop();\n }\n },\n [localFolders, dropConfirmation, showConfirmMoveFolderDialog]\n );\n\n const sort = useMemo(\n () => (a: NodeDto<any>, b: NodeDto<any>) => {\n if (a.id === ROOT_FOLDER || b.id === ROOT_FOLDER) {\n return 1;\n }\n return a.label.localeCompare(b.label, undefined, { numeric: true });\n },\n []\n );\n\n const canDrag: TreeProps<FolderDto>[\"canDrag\"] = useCallback(\n (node: NodeDto<FolderDto>) =>\n node.id !== ROOT_FOLDER && actions.canManageStructure(node.id),\n [actions]\n );\n\n const canDrop: TreeProps<FolderDto>[\"canDrop\"] = (_, options: DropOptions<FolderDto>) => {\n const { dragSourceId, dropTargetId } = options;\n const ancestorIds = actions.getAncestorIds(dropTargetId as string);\n return !(dragSourceId && ancestorIds.includes(dragSourceId as string));\n };\n\n const nodeRenderer: TreeProps<FolderDto>[\"renderer\"] = node => {\n const folder = localFolders.find(f => f.id === node.id);\n return (\n <FolderProvider folder={folder}>\n <Node enableActions={enableActions} folderActions={folderActions} />\n </FolderProvider>\n );\n };\n\n const handleNodeClick = useCallback(\n (node: WithDefaultNodeData<FolderDto>) => {\n actions.selectFolder(node.id === ROOT_FOLDER ? null : node.id);\n },\n [actions]\n );\n\n const createButton = useMemo(() => {\n if (!enableCreate) {\n return null;\n }\n\n const canCreate = actions.canManageStructure(focusedFolderId);\n const button = (\n <ButtonCreate\n disabled={!canCreate}\n onCreateFolder={() =>\n actions.createFolder(\n focusedFolderId === ROOT_FOLDER ? undefined : focusedFolderId\n )\n }\n />\n );\n\n return canCreate ? (\n button\n ) : (\n <Tooltip\n content={`Cannot create folder because you're not an owner.`}\n trigger={button}\n />\n );\n }, [enableCreate, actions, focusedFolderId, localFolders]);\n\n if (vm.loading) {\n return <Loader />;\n }\n\n return (\n <div className=\"my-xs\">\n <Tree<FolderDto>\n nodes={treeData}\n rootId={\"0\"}\n defaultOpenNodeIds={openFolderIds}\n onChangeOpen={handleChangeOpen}\n onDrop={onDrop}\n onNodeClick={handleNodeClick}\n sort={sort}\n canDrag={canDrag}\n canDrop={canDrop}\n renderer={nodeRenderer}\n defaultLockedOpenNodeIds={[ROOT_FOLDER]}\n loadingNodeIds={vm.loadingNodeIds}\n />\n {enableCreate && (\n <div className={\"m-xs-plus mt-sm-plus mb-lg pl-sm-extra\"}>{createButton}</div>\n )}\n <FolderOperationDialog operation={vm.operation} actions={actions} />\n </div>\n );\n};\n\nexport const UncontrolledFolderTree = ({\n focusedFolderId,\n onFolderClick,\n ...props\n}: UncontrolledFolderTreeProps) => {\n const { presenter } = useFeature(FolderTreePresenterFeature);\n\n const vm = useMemo(() => {\n if (focusedFolderId === undefined) {\n return presenter.vm;\n }\n return { ...presenter.vm, currentFolderId: focusedFolderId };\n }, [presenter.vm, focusedFolderId]);\n\n const actions = useMemo(() => {\n if (!onFolderClick) {\n return presenter;\n }\n return { ...presenter, selectFolder: onFolderClick };\n }, [presenter, onFolderClick]);\n\n return <FolderTree vm={vm} actions={actions} {...props} />;\n};\n"],"names":["t","i18n","FolderOperationDialog","observer","operation","actions","loading","setLoading","useState","handleClose","withLoading","fn","Dialog","OverlayLoader","Text","title","confirmLabel","loadingLabel","FormView","FolderTree","vm","folderActions","enableCreate","enableActions","dropConfirmation","rootFolderLabel","hiddenFolderIds","showSnackbar","useSnackbar","showConfirmMoveFolderDialog","useConfirmMoveFolderDialog","focusedFolderId","ROOT_FOLDER","folders","localFolders","useMemo","item","treeData","setTreeData","openFolderIds","setOpenFolderIds","useEffect","createTreeData","prev","expanded","createInitialOpenList","Set","handleChangeOpen","nodes","folderIds","node","updatedOpenIds","newlyOpened","id","handleDrop","_","dragSourceId","dropTargetId","targetParentId","error","onDrop","useCallback","newTree","options","runDrop","folder","f","targetFolder","sort","a","b","undefined","canDrag","canDrop","ancestorIds","nodeRenderer","FolderProvider","Node","handleNodeClick","createButton","canCreate","button","ButtonCreate","Tooltip","Loader","Tree","UncontrolledFolderTree","onFolderClick","props","presenter","useFeature","FolderTreePresenterFeature"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"presentation/folderTree/FolderTree.js","sources":["../../../src/presentation/folderTree/FolderTree.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport {\n Tree,\n Tooltip,\n Dialog,\n Text,\n OverlayLoader,\n type NodeDto,\n type TreeProps,\n type WithDefaultNodeData,\n type DropOptions\n} from \"@webiny/admin-ui\";\nimport { useFeature } from \"@webiny/app\";\nimport { observer } from \"mobx-react-lite\";\nimport { useSnackbar, FormView } from \"@webiny/app-admin\";\nimport { i18n } from \"@webiny/app/i18n/index.js\";\nimport { ROOT_FOLDER } from \"~/constants.js\";\nimport { FolderProvider } from \"~/contexts/folder.js\";\nimport { Node } from \"~/components/FolderTree/Node/Node.js\";\nimport { Loader } from \"~/components/FolderTree/Loader/Loader.js\";\nimport { ButtonCreate } from \"~/components/FolderTree/ButtonCreate/ButtonCreate.js\";\nimport { useConfirmMoveFolderDialog } from \"~/dialogs/index.js\";\nimport { createTreeData, createInitialOpenList } from \"~/components/FolderTree/List/utils.js\";\nimport { FolderTreePresenterFeature } from \"./feature.js\";\nimport type { FolderDto } from \"~/domain/folder/FolderDto.js\";\nimport type { FolderActionConfig } from \"~/config/AcoConfig.js\";\nimport type {\n IFolderTreeCallbacks,\n IFolderTreeViewModel,\n IFolderOperationState\n} from \"./abstractions.js\";\n\nconst t = i18n.ns(\"app-aco/presentation/folder-tree\");\n\nconst FolderOperationDialog = observer(function FolderOperationDialog({\n operation,\n actions\n}: {\n operation: IFolderOperationState;\n actions: IFolderTreeCallbacks;\n}) {\n const [loading, setLoading] = useState(false);\n\n if (!operation.active) {\n return null;\n }\n\n const handleClose = () => {\n if (!loading) {\n actions.cancelOperation();\n }\n };\n\n const withLoading = async (fn: () => Promise<unknown>) => {\n setLoading(true);\n try {\n await fn();\n } finally {\n setLoading(false);\n }\n };\n\n if (operation.mode === \"delete\") {\n return (\n <Dialog\n open={true}\n onClose={handleClose}\n title={t`Delete Folder`}\n actions={\n <>\n <Dialog.CancelAction onClick={handleClose} text={t`Cancel`} />\n <Dialog.ConfirmAction\n onClick={() => {\n if (operation.folderId) {\n void withLoading(() =>\n actions.deleteFolder(operation.folderId!)\n );\n }\n }}\n text={t`Delete`}\n />\n </>\n }\n >\n {loading && <OverlayLoader text={t`Deleting folder...`} />}\n <Text size={\"md\"}>\n {t`Are you sure you want to delete this folder? This action cannot be undone.`}\n </Text>\n </Dialog>\n );\n }\n\n if ((operation.mode === \"create\" || operation.mode === \"edit\") && operation.form) {\n const title = operation.mode === \"create\" ? t`Create Folder` : t`Edit Folder`;\n const confirmLabel = operation.mode === \"create\" ? t`Create` : t`Save`;\n const loadingLabel =\n operation.mode === \"create\" ? t`Creating folder...` : t`Saving folder...`;\n\n return (\n <Dialog\n open={true}\n onClose={handleClose}\n title={title}\n actions={\n <>\n <Dialog.CancelAction onClick={handleClose} text={t`Cancel`} />\n <Dialog.ConfirmAction\n onClick={() => {\n void withLoading(() => actions.submitOperation());\n }}\n text={confirmLabel}\n />\n </>\n }\n >\n {loading && <OverlayLoader text={loadingLabel} />}\n <FormView name={\"Folder Tree\"} form={operation.form.vm} />\n </Dialog>\n );\n }\n\n return null;\n});\n\nexport interface PresenterFolderTreeProps {\n vm: IFolderTreeViewModel;\n actions: IFolderTreeCallbacks;\n folderActions?: FolderActionConfig[];\n enableCreate?: boolean;\n enableActions?: boolean;\n dropConfirmation?: boolean;\n rootFolderLabel?: string;\n hiddenFolderIds?: string[];\n}\n\nexport interface UncontrolledFolderTreeProps extends Omit<\n PresenterFolderTreeProps,\n \"vm\" | \"actions\"\n> {\n focusedFolderId?: string | null;\n onFolderClick?: (folderId: string | null) => void;\n}\n\nexport const FolderTree = ({\n vm,\n actions,\n folderActions = [],\n enableCreate,\n enableActions,\n dropConfirmation = false,\n rootFolderLabel,\n hiddenFolderIds\n}: PresenterFolderTreeProps) => {\n const { showSnackbar } = useSnackbar();\n const { showDialog: showConfirmMoveFolderDialog } = useConfirmMoveFolderDialog();\n\n const focusedFolderId = vm.currentFolderId ?? ROOT_FOLDER;\n\n const folders = vm.folders;\n\n const localFolders = useMemo(() => {\n if (!folders.length) {\n return [];\n }\n return folders.map(item =>\n item.id === ROOT_FOLDER && rootFolderLabel ? { ...item, title: rootFolderLabel } : item\n );\n }, [folders, rootFolderLabel]);\n\n const [treeData, setTreeData] = useState<NodeDto<FolderDto>[]>([]);\n const [openFolderIds, setOpenFolderIds] = useState<string[]>([ROOT_FOLDER]);\n\n useEffect(() => {\n setTreeData(createTreeData(localFolders, focusedFolderId, hiddenFolderIds));\n }, [localFolders, focusedFolderId, hiddenFolderIds]);\n\n useEffect(() => {\n setOpenFolderIds(prev => {\n const expanded = createInitialOpenList(localFolders, prev, focusedFolderId);\n return [...new Set([ROOT_FOLDER, ...expanded])];\n });\n }, [focusedFolderId, localFolders]);\n\n const handleChangeOpen: TreeProps[\"onChangeOpen\"] = async nodes => {\n const folderIds = nodes.map(node => node.id);\n const updatedOpenIds = [...new Set([ROOT_FOLDER, ...folderIds])];\n const newlyOpened = updatedOpenIds.filter(id => !openFolderIds.includes(id));\n setOpenFolderIds(updatedOpenIds);\n\n if (newlyOpened.length > 0) {\n await actions.loadChildFolders(newlyOpened);\n }\n };\n\n const handleDrop: TreeProps[\"onDrop\"] = async (_, { dragSourceId, dropTargetId }) => {\n try {\n const targetParentId = dropTargetId !== ROOT_FOLDER ? (dropTargetId as string) : null;\n await actions.moveFolder(dragSourceId as string, targetParentId);\n } catch (error) {\n showSnackbar((error as Error).message);\n }\n };\n\n const onDrop = useCallback<NonNullable<TreeProps[\"onDrop\"]>>(\n async (newTree, options: DropOptions) => {\n const runDrop = async () => handleDrop(newTree, options);\n\n if (dropConfirmation) {\n const { dragSourceId, dropTargetId } = options;\n const folder = localFolders.find(f => f.id === dragSourceId);\n const targetFolder = localFolders.find(f => f.id === dropTargetId);\n\n if (!folder || !targetFolder) {\n return;\n }\n\n await new Promise<void>((resolve, reject) => {\n showConfirmMoveFolderDialog({\n folder,\n targetFolder,\n onAccept: async () => {\n await runDrop();\n resolve();\n },\n onClose: () => {\n reject(new Error(\"cancelled\"));\n }\n });\n });\n } else {\n /*\n * Without a confirmation step, don't wait for the API call: the tree updates as soon\n * as onDrop returns. handleDrop catches its own errors and reports them, so nothing is\n * left unhandled.\n */\n void runDrop();\n }\n },\n [localFolders, dropConfirmation, showConfirmMoveFolderDialog]\n );\n\n const sort = useMemo(\n () => (a: NodeDto<any>, b: NodeDto<any>) => {\n if (a.id === ROOT_FOLDER || b.id === ROOT_FOLDER) {\n return 1;\n }\n return a.label.localeCompare(b.label, undefined, { numeric: true });\n },\n []\n );\n\n const canDrag: TreeProps<FolderDto>[\"canDrag\"] = useCallback(\n (node: NodeDto<FolderDto>) =>\n node.id !== ROOT_FOLDER && actions.canManageStructure(node.id),\n [actions]\n );\n\n const canDrop: TreeProps<FolderDto>[\"canDrop\"] = (_, options: DropOptions<FolderDto>) => {\n const { dragSourceId, dropTargetId } = options;\n const ancestorIds = actions.getAncestorIds(dropTargetId as string);\n return !(dragSourceId && ancestorIds.includes(dragSourceId as string));\n };\n\n const nodeRenderer: TreeProps<FolderDto>[\"renderer\"] = node => {\n const folder = localFolders.find(f => f.id === node.id);\n return (\n <FolderProvider folder={folder}>\n <Node enableActions={enableActions} folderActions={folderActions} />\n </FolderProvider>\n );\n };\n\n const handleNodeClick = useCallback(\n (node: WithDefaultNodeData<FolderDto>) => {\n actions.selectFolder(node.id === ROOT_FOLDER ? null : node.id);\n },\n [actions]\n );\n\n const createButton = useMemo(() => {\n if (!enableCreate) {\n return null;\n }\n\n const canCreate = actions.canManageStructure(focusedFolderId);\n const button = (\n <ButtonCreate\n disabled={!canCreate}\n onCreateFolder={() =>\n actions.createFolder(\n focusedFolderId === ROOT_FOLDER ? undefined : focusedFolderId\n )\n }\n />\n );\n\n return canCreate ? (\n button\n ) : (\n <Tooltip\n content={`Cannot create folder because you're not an owner.`}\n trigger={button}\n />\n );\n }, [enableCreate, actions, focusedFolderId, localFolders]);\n\n if (vm.loading) {\n return <Loader />;\n }\n\n return (\n <div className=\"my-xs\">\n <Tree<FolderDto>\n nodes={treeData}\n rootId={\"0\"}\n defaultOpenNodeIds={openFolderIds}\n onChangeOpen={handleChangeOpen}\n onDrop={onDrop}\n onNodeClick={handleNodeClick}\n sort={sort}\n canDrag={canDrag}\n canDrop={canDrop}\n renderer={nodeRenderer}\n defaultLockedOpenNodeIds={[ROOT_FOLDER]}\n loadingNodeIds={vm.loadingNodeIds}\n />\n {enableCreate && (\n <div className={\"m-xs-plus mt-sm-plus mb-lg pl-sm-extra\"}>{createButton}</div>\n )}\n <FolderOperationDialog operation={vm.operation} actions={actions} />\n </div>\n );\n};\n\nexport const UncontrolledFolderTree = ({\n focusedFolderId,\n onFolderClick,\n ...props\n}: UncontrolledFolderTreeProps) => {\n const { presenter } = useFeature(FolderTreePresenterFeature);\n\n const vm = useMemo(() => {\n if (focusedFolderId === undefined) {\n return presenter.vm;\n }\n return { ...presenter.vm, currentFolderId: focusedFolderId };\n }, [presenter.vm, focusedFolderId]);\n\n const actions = useMemo(() => {\n if (!onFolderClick) {\n return presenter;\n }\n return { ...presenter, selectFolder: onFolderClick };\n }, [presenter, onFolderClick]);\n\n return <FolderTree vm={vm} actions={actions} {...props} />;\n};\n"],"names":["t","i18n","FolderOperationDialog","observer","operation","actions","loading","setLoading","useState","handleClose","withLoading","fn","Dialog","OverlayLoader","Text","title","confirmLabel","loadingLabel","FormView","FolderTree","vm","folderActions","enableCreate","enableActions","dropConfirmation","rootFolderLabel","hiddenFolderIds","showSnackbar","useSnackbar","showConfirmMoveFolderDialog","useConfirmMoveFolderDialog","focusedFolderId","ROOT_FOLDER","folders","localFolders","useMemo","item","treeData","setTreeData","openFolderIds","setOpenFolderIds","useEffect","createTreeData","prev","expanded","createInitialOpenList","Set","handleChangeOpen","nodes","folderIds","node","updatedOpenIds","newlyOpened","id","handleDrop","_","dragSourceId","dropTargetId","targetParentId","error","onDrop","useCallback","newTree","options","runDrop","folder","f","targetFolder","Promise","resolve","reject","Error","sort","a","b","undefined","canDrag","canDrop","ancestorIds","nodeRenderer","FolderProvider","Node","handleNodeClick","createButton","canCreate","button","ButtonCreate","Tooltip","Loader","Tree","UncontrolledFolderTree","onFolderClick","props","presenter","useFeature","FolderTreePresenterFeature"],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { StringFormatter } from "@webiny/app-admin/features/stringFormatter/abstractions.js";
|
|
1
2
|
import { FolderTreePresenter as Abstraction, type IFolderTreeViewModel } from "./abstractions.js";
|
|
2
3
|
import { FoldersCache, FoldersContext } from "../../features/folders/abstractions.js";
|
|
3
4
|
import { ListFoldersUseCase } from "../../features/folders/listFolders/abstractions.js";
|
|
@@ -20,13 +21,15 @@ declare class FolderTreePresenterImpl implements Abstraction.Interface {
|
|
|
20
21
|
private getFolderAncestorsUseCase;
|
|
21
22
|
private getFolderLevelPermissionUseCase;
|
|
22
23
|
private formModelFactory;
|
|
24
|
+
private stringFormatter;
|
|
23
25
|
private currentFolderId;
|
|
24
26
|
private loading;
|
|
25
27
|
private _loadingNodeIds;
|
|
26
28
|
private operation;
|
|
27
29
|
private callbacks;
|
|
28
30
|
private disposed;
|
|
29
|
-
|
|
31
|
+
private previousFolders;
|
|
32
|
+
constructor(foldersContext: FoldersContext.Interface, foldersCache: FoldersCache.Interface, listFoldersUseCase: ListFoldersUseCase.Interface, listFoldersByParentIdsUseCase: ListFoldersByParentIdsUseCase.Interface, createFolderUseCase: CreateFolderUseCase.Interface, updateFolderUseCase: UpdateFolderUseCase.Interface, deleteFolderUseCase: DeleteFolderUseCase.Interface, getFolderAncestorsUseCase: GetFolderAncestorsUseCase.Interface, getFolderLevelPermissionUseCase: GetFolderLevelPermissionUseCase.Interface, formModelFactory: FormModelFactory.Interface, stringFormatter: StringFormatter.Interface);
|
|
30
33
|
get vm(): IFolderTreeViewModel;
|
|
31
34
|
selectFolder(folderId: string | null): void;
|
|
32
35
|
onFolderChange(callback: FolderChangeCallback): () => void;
|
|
@@ -40,6 +43,7 @@ declare class FolderTreePresenterImpl implements Abstraction.Interface {
|
|
|
40
43
|
deleteFolder(folderId: string): Promise<void>;
|
|
41
44
|
cancelOperation(): void;
|
|
42
45
|
private loadFolders;
|
|
46
|
+
private resolveValidFolderId;
|
|
43
47
|
private buildTree;
|
|
44
48
|
private buildTreeFromFolders;
|
|
45
49
|
private findFolder;
|