@webiny/app-aco 0.0.0-unstable.a4f3e4ea8b → 0.0.0-unstable.a85ef555b2

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 (83) hide show
  1. package/app.js +5 -1
  2. package/app.js.map +1 -1
  3. package/components/AdvancedSearch/AdvancedSearch.d.ts +2 -2
  4. package/components/AdvancedSearch/AdvancedSearch.js +1 -1
  5. package/components/AdvancedSearch/AdvancedSearch.js.map +1 -1
  6. package/components/AdvancedSearch/QueryBuilderDrawer/QueryBuilder/components/OperationSelector.js +2 -2
  7. package/components/AdvancedSearch/QueryBuilderDrawer/QueryBuilder/components/OperationSelector.js.map +1 -1
  8. package/components/AdvancedSearch/QueryBuilderDrawer/QueryBuilderDrawer.d.ts +2 -2
  9. package/components/AdvancedSearch/SelectedFilter/SelectedFilter.js +1 -1
  10. package/components/AdvancedSearch/SelectedFilter/SelectedFilter.js.map +1 -1
  11. package/components/FolderTree/List/List.js +1 -1
  12. package/components/FolderTree/List/List.js.map +1 -1
  13. package/components/Table/components/Table/TableInner.d.ts +2 -2
  14. package/dialogs/DialogSetPermissions/UsersTeamsSelection/ListItemMeta.js +5 -0
  15. package/dialogs/DialogSetPermissions/UsersTeamsSelection/ListItemMeta.js.map +1 -1
  16. package/dialogs/useCreateDialog.js +3 -7
  17. package/dialogs/useCreateDialog.js.map +1 -1
  18. package/features/folders/cache/FoldersCacheFactory.d.ts +3 -1
  19. package/features/folders/cache/FoldersCacheFactory.js +5 -0
  20. package/features/folders/cache/FoldersCacheFactory.js.map +1 -1
  21. package/features/folders/cache/updateDescendantPermissions.d.ts +12 -0
  22. package/features/folders/cache/updateDescendantPermissions.js +27 -0
  23. package/features/folders/cache/updateDescendantPermissions.js.map +1 -0
  24. package/features/folders/folderEvents/AddCreatedFolderToCache.d.ts +22 -0
  25. package/features/folders/folderEvents/AddCreatedFolderToCache.js +24 -0
  26. package/features/folders/folderEvents/AddCreatedFolderToCache.js.map +1 -0
  27. package/features/folders/folderEvents/FolderCreatedEvent.d.ts +14 -0
  28. package/features/folders/folderEvents/FolderCreatedEvent.js +13 -0
  29. package/features/folders/folderEvents/FolderCreatedEvent.js.map +1 -0
  30. package/features/folders/folderEvents/FolderDeletedEvent.d.ts +9 -0
  31. package/features/folders/folderEvents/FolderDeletedEvent.js +13 -0
  32. package/features/folders/folderEvents/FolderDeletedEvent.js.map +1 -0
  33. package/features/folders/folderEvents/FolderEvents.test.d.ts +1 -0
  34. package/features/folders/folderEvents/FolderEvents.test.js +238 -0
  35. package/features/folders/folderEvents/FolderEvents.test.js.map +1 -0
  36. package/features/folders/folderEvents/FolderUpdatedEvent.d.ts +12 -0
  37. package/features/folders/folderEvents/FolderUpdatedEvent.js +13 -0
  38. package/features/folders/folderEvents/FolderUpdatedEvent.js.map +1 -0
  39. package/features/folders/folderEvents/FolderWebsocketMessages.d.ts +15 -0
  40. package/features/folders/folderEvents/FolderWebsocketMessages.js +48 -0
  41. package/features/folders/folderEvents/FolderWebsocketMessages.js.map +1 -0
  42. package/features/folders/folderEvents/RefreshUpdatedFolderInCache.d.ts +19 -0
  43. package/features/folders/folderEvents/RefreshUpdatedFolderInCache.js +27 -0
  44. package/features/folders/folderEvents/RefreshUpdatedFolderInCache.js.map +1 -0
  45. package/features/folders/folderEvents/RemoveDeletedFolderFromCache.d.ts +13 -0
  46. package/features/folders/folderEvents/RemoveDeletedFolderFromCache.js +15 -0
  47. package/features/folders/folderEvents/RemoveDeletedFolderFromCache.js.map +1 -0
  48. package/features/folders/folderEvents/abstractions.d.ts +28 -0
  49. package/features/folders/folderEvents/abstractions.js +7 -0
  50. package/features/folders/folderEvents/abstractions.js.map +1 -0
  51. package/features/folders/folderEvents/feature.d.ts +9 -0
  52. package/features/folders/folderEvents/feature.js +21 -0
  53. package/features/folders/folderEvents/feature.js.map +1 -0
  54. package/features/folders/folderEvents/index.d.ts +5 -0
  55. package/features/folders/folderEvents/index.js +5 -0
  56. package/features/folders/folderModelProvider/FolderModelProvider.js +1 -0
  57. package/features/folders/folderModelProvider/FolderModelProvider.js.map +1 -1
  58. package/features/folders/getFolderExtensionsFields/GetFolderExtensionsFieldsUseCase.d.ts +1 -0
  59. package/features/folders/getFolderExtensionsFields/useFolderExtensionsFields.d.ts +1 -0
  60. package/features/folders/getFolderLevelPermission/GetFolderLevelPermission.test.js +12 -16
  61. package/features/folders/getFolderLevelPermission/GetFolderLevelPermission.test.js.map +1 -1
  62. package/features/folders/getFolderLevelPermission/decorators/GetFolderLevelPermissionWithFlpDecorator.d.ts +3 -3
  63. package/features/folders/getFolderLevelPermission/decorators/GetFolderLevelPermissionWithFlpDecorator.js +5 -5
  64. package/features/folders/getFolderLevelPermission/decorators/GetFolderLevelPermissionWithFlpDecorator.js.map +1 -1
  65. package/features/folders/updateFolder/UpdateFolderGqlGateway.js +1 -1
  66. package/features/folders/updateFolder/UpdateFolderGqlGateway.js.map +1 -1
  67. package/features/folders/updateFolder/decorators/RepositoryWithPermissionsChange.d.ts +1 -4
  68. package/features/folders/updateFolder/decorators/RepositoryWithPermissionsChange.js +3 -30
  69. package/features/folders/updateFolder/decorators/RepositoryWithPermissionsChange.js.map +1 -1
  70. package/features/folders/updateFolder/decorators/{UseCaseWithoutInheritedPermissions.d.ts → UseCaseWithoutReadOnlyPermissions.d.ts} +2 -2
  71. package/features/folders/updateFolder/decorators/{UseCaseWithoutInheritedPermissions.js → UseCaseWithoutReadOnlyPermissions.js} +6 -6
  72. package/features/folders/updateFolder/decorators/UseCaseWithoutReadOnlyPermissions.js.map +1 -0
  73. package/features/folders/updateFolder/feature.js +2 -2
  74. package/features/folders/updateFolder/feature.js.map +1 -1
  75. package/package.json +21 -20
  76. package/presentation/folderTree/FolderTree.js +1 -1
  77. package/presentation/folderTree/FolderTree.js.map +1 -1
  78. package/presentation/folderTree/FolderTreePresenter.d.ts +3 -1
  79. package/presentation/folderTree/FolderTreePresenter.js +9 -17
  80. package/presentation/folderTree/FolderTreePresenter.js.map +1 -1
  81. package/presentation/folderTree/FolderTreePresenter.test.js +5 -0
  82. package/presentation/folderTree/FolderTreePresenter.test.js.map +1 -1
  83. package/features/folders/updateFolder/decorators/UseCaseWithoutInheritedPermissions.js.map +0 -1
package/app.js CHANGED
@@ -1,6 +1,10 @@
1
1
  import react from "react";
2
+ import { RegisterFeature } from "@webiny/app-admin";
2
3
  import { FolderModelProviderModule } from "./features/folders/folderModelProvider/FolderModelContext.js";
3
- const AdvancedContentOrganisation = ()=>/*#__PURE__*/ react.createElement(FolderModelProviderModule, null);
4
+ import { FolderEventsFeature } from "./features/folders/folderEvents/index.js";
5
+ const AdvancedContentOrganisation = ()=>/*#__PURE__*/ react.createElement(react.Fragment, null, /*#__PURE__*/ react.createElement(FolderModelProviderModule, null), /*#__PURE__*/ react.createElement(RegisterFeature, {
6
+ feature: FolderEventsFeature
7
+ }));
4
8
  export { AdvancedContentOrganisation };
5
9
 
6
10
  //# sourceMappingURL=app.js.map
package/app.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"app.js","sources":["../src/app.tsx"],"sourcesContent":["import React from \"react\";\nimport { FolderModelProviderModule } from \"~/features/folders/folderModelProvider/FolderModelContext.js\";\n\nexport const AdvancedContentOrganisation = () => {\n return <FolderModelProviderModule />;\n};\n"],"names":["AdvancedContentOrganisation","FolderModelProviderModule"],"mappings":";;AAGO,MAAMA,8BAA8B,IAChC,WAAP,GAAO,oBAACC,2BAAyBA"}
1
+ {"version":3,"file":"app.js","sources":["../src/app.tsx"],"sourcesContent":["import React from \"react\";\nimport { RegisterFeature } from \"@webiny/app-admin\";\nimport { FolderModelProviderModule } from \"~/features/folders/folderModelProvider/FolderModelContext.js\";\nimport { FolderEventsFeature } from \"~/features/folders/folderEvents/index.js\";\n\nexport const AdvancedContentOrganisation = () => {\n return (\n <>\n <FolderModelProviderModule />\n <RegisterFeature feature={FolderEventsFeature} />\n </>\n );\n};\n"],"names":["AdvancedContentOrganisation","FolderModelProviderModule","RegisterFeature","FolderEventsFeature"],"mappings":";;;;AAKO,MAAMA,8BAA8B,IAChC,WAAP,GACI,wDACI,oBAACC,2BAAyBA,OAAAA,WAAAA,GAC1B,oBAACC,iBAAeA;QAAC,SAASC"}
@@ -5,6 +5,6 @@ export interface AdvancedSearchProps {
5
5
  repository: FilterRepository;
6
6
  onApplyFilter: (data: FilterDTO | null) => void;
7
7
  }
8
- export declare const AdvancedSearch: (({ fields, repository, onApplyFilter }: AdvancedSearchProps) => React.JSX.Element) & {
9
- displayName: string;
8
+ export declare const AdvancedSearch: (({ fields, repository, onApplyFilter }: AdvancedSearchProps) => React.JSX.Element) & React.NamedExoticComponent<AdvancedSearchProps> & {
9
+ readonly type: ({ fields, repository, onApplyFilter }: AdvancedSearchProps) => React.JSX.Element;
10
10
  };
@@ -42,7 +42,7 @@ const AdvancedSearch = observer(({ fields, repository, onApplyFilter })=>{
42
42
  presenter.vm.feedbackVm.message
43
43
  ]);
44
44
  return /*#__PURE__*/ react.createElement(react.Fragment, null, /*#__PURE__*/ react.createElement("div", {
45
- className: "flex flex-row-reverse justify-between items-center gap-sm"
45
+ className: "flex flex-row-reverse justify-between items-center gap-sm min-w-0"
46
46
  }, /*#__PURE__*/ react.createElement(Button, {
47
47
  onClick: ()=>presenter.openManager()
48
48
  }), presenter.vm.appliedFilter ? /*#__PURE__*/ react.createElement(SelectedFilter, {
@@ -1 +1 @@
1
- {"version":3,"file":"components/AdvancedSearch/AdvancedSearch.js","sources":["../../../src/components/AdvancedSearch/AdvancedSearch.tsx"],"sourcesContent":["import React, { useEffect, useMemo } from \"react\";\nimport { observer } from \"mobx-react-lite\";\nimport { useToast } from \"@webiny/admin-ui\";\n\nimport type { FieldDTOWithElement, FilterDTO, FilterRepository } from \"./domain/index.js\";\n\nimport { AdvancedSearchPresenter } from \"./AdvancedSearchPresenter.js\";\n\nimport { Button } from \"./Button/index.js\";\nimport { QueryManagerDialog } from \"./QueryManagerDialog/index.js\";\nimport { QueryBuilderDrawer } from \"./QueryBuilderDrawer/index.js\";\nimport { QuerySaverDialog } from \"./QuerySaverDialog/index.js\";\nimport { SelectedFilter } from \"./SelectedFilter/index.js\";\n\nexport interface AdvancedSearchProps {\n fields: FieldDTOWithElement[];\n repository: FilterRepository;\n onApplyFilter: (data: FilterDTO | null) => void;\n}\n\nexport const AdvancedSearch = observer(\n ({ fields, repository, onApplyFilter }: AdvancedSearchProps) => {\n const { showToast } = useToast();\n\n const presenter = useMemo<AdvancedSearchPresenter>(() => {\n return new AdvancedSearchPresenter(repository);\n }, [repository]);\n\n useEffect(() => {\n presenter.load();\n }, []);\n\n const applyFilter = async (filter: string | FilterDTO) => {\n await presenter.applyFilter(filter);\n if (presenter.vm.appliedFilter) {\n onApplyFilter(presenter.vm.appliedFilter);\n }\n };\n\n const unsetFilter = () => {\n if (presenter.vm.appliedFilter) {\n presenter.unsetFilter();\n onApplyFilter(null);\n }\n };\n\n const deleteFilter = async (filterId: string) => {\n await presenter.deleteFilter(filterId);\n if (filterId === presenter.vm.appliedFilter?.id) {\n unsetFilter();\n }\n };\n\n const persistAndApplyFilter = async (filter: FilterDTO) => {\n await presenter.persistFilter(filter);\n onApplyFilter(filter);\n };\n\n useEffect(() => {\n if (presenter.vm.feedbackVm.isOpen) {\n showToast({\n title: presenter.vm.feedbackVm.message\n });\n }\n }, [presenter.vm.feedbackVm.isOpen, presenter.vm.feedbackVm.message]);\n\n return (\n <>\n <div className={\"flex flex-row-reverse justify-between items-center gap-sm\"}>\n <Button onClick={() => presenter.openManager()} />\n {presenter.vm.appliedFilter ? (\n <SelectedFilter\n filter={presenter.vm.appliedFilter}\n onEdit={() => presenter.editAppliedFilter()}\n onDelete={unsetFilter}\n />\n ) : null}\n </div>\n <QueryManagerDialog\n onClose={() => presenter.closeManager()}\n onCreate={() => presenter.createFilter()}\n onEdit={filterId => presenter.editFilter(filterId)}\n onRename={filterId => presenter.renameFilter(filterId)}\n onClone={filterId => presenter.cloneFilter(filterId)}\n onDelete={deleteFilter}\n onSelect={applyFilter}\n vm={presenter.vm.managerVm}\n />\n {presenter.vm.currentFilter ? (\n <>\n <QueryBuilderDrawer\n fields={fields}\n onClose={() => presenter.closeBuilder()}\n onSave={filter => presenter.saveFilter(filter)}\n onApply={applyFilter}\n onValidationError={message => presenter.showFeedback(message)}\n filter={presenter.vm.currentFilter}\n vm={presenter.vm.builderVm}\n />\n <QuerySaverDialog\n onSave={persistAndApplyFilter}\n onClose={() => presenter.closeSaver()}\n filter={presenter.vm.currentFilter}\n vm={presenter.vm.saverVm}\n />\n </>\n ) : null}\n </>\n );\n }\n);\n"],"names":["AdvancedSearch","observer","fields","repository","onApplyFilter","showToast","useToast","presenter","useMemo","AdvancedSearchPresenter","useEffect","applyFilter","filter","unsetFilter","deleteFilter","filterId","persistAndApplyFilter","Button","SelectedFilter","QueryManagerDialog","QueryBuilderDrawer","message","QuerySaverDialog"],"mappings":";;;;;;;;;AAoBO,MAAMA,iBAAiBC,SAC1B,CAAC,EAAEC,MAAM,EAAEC,UAAU,EAAEC,aAAa,EAAuB;IACvD,MAAM,EAAEC,SAAS,EAAE,GAAGC;IAEtB,MAAMC,YAAYC,QAAiC,IACxC,IAAIC,wBAAwBN,aACpC;QAACA;KAAW;IAEfO,UAAU;QACNH,UAAU,IAAI;IAClB,GAAG,EAAE;IAEL,MAAMI,cAAc,OAAOC;QACvB,MAAML,UAAU,WAAW,CAACK;QAC5B,IAAIL,UAAU,EAAE,CAAC,aAAa,EAC1BH,cAAcG,UAAU,EAAE,CAAC,aAAa;IAEhD;IAEA,MAAMM,cAAc;QAChB,IAAIN,UAAU,EAAE,CAAC,aAAa,EAAE;YAC5BA,UAAU,WAAW;YACrBH,cAAc;QAClB;IACJ;IAEA,MAAMU,eAAe,OAAOC;QACxB,MAAMR,UAAU,YAAY,CAACQ;QAC7B,IAAIA,aAAaR,UAAU,EAAE,CAAC,aAAa,EAAE,IACzCM;IAER;IAEA,MAAMG,wBAAwB,OAAOJ;QACjC,MAAML,UAAU,aAAa,CAACK;QAC9BR,cAAcQ;IAClB;IAEAF,UAAU;QACN,IAAIH,UAAU,EAAE,CAAC,UAAU,CAAC,MAAM,EAC9BF,UAAU;YACN,OAAOE,UAAU,EAAE,CAAC,UAAU,CAAC,OAAO;QAC1C;IAER,GAAG;QAACA,UAAU,EAAE,CAAC,UAAU,CAAC,MAAM;QAAEA,UAAU,EAAE,CAAC,UAAU,CAAC,OAAO;KAAC;IAEpE,OAAO,WAAP,GACI,wDACI,oBAAC;QAAI,WAAW;qBACZ,oBAACU,QAAMA;QAAC,SAAS,IAAMV,UAAU,WAAW;QAC3CA,UAAU,EAAE,CAAC,aAAa,GAAG,WAAH,GACvB,oBAACW,gBAAcA;QACX,QAAQX,UAAU,EAAE,CAAC,aAAa;QAClC,QAAQ,IAAMA,UAAU,iBAAiB;QACzC,UAAUM;SAEd,qBAER,oBAACM,oBAAkBA;QACf,SAAS,IAAMZ,UAAU,YAAY;QACrC,UAAU,IAAMA,UAAU,YAAY;QACtC,QAAQQ,CAAAA,WAAYR,UAAU,UAAU,CAACQ;QACzC,UAAUA,CAAAA,WAAYR,UAAU,YAAY,CAACQ;QAC7C,SAASA,CAAAA,WAAYR,UAAU,WAAW,CAACQ;QAC3C,UAAUD;QACV,UAAUH;QACV,IAAIJ,UAAU,EAAE,CAAC,SAAS;QAE7BA,UAAU,EAAE,CAAC,aAAa,GAAG,WAAH,GACvB,wDACI,oBAACa,oBAAkBA;QACf,QAAQlB;QACR,SAAS,IAAMK,UAAU,YAAY;QACrC,QAAQK,CAAAA,SAAUL,UAAU,UAAU,CAACK;QACvC,SAASD;QACT,mBAAmBU,CAAAA,UAAWd,UAAU,YAAY,CAACc;QACrD,QAAQd,UAAU,EAAE,CAAC,aAAa;QAClC,IAAIA,UAAU,EAAE,CAAC,SAAS;sBAE9B,oBAACe,kBAAgBA;QACb,QAAQN;QACR,SAAS,IAAMT,UAAU,UAAU;QACnC,QAAQA,UAAU,EAAE,CAAC,aAAa;QAClC,IAAIA,UAAU,EAAE,CAAC,OAAO;UAGhC;AAGhB"}
1
+ {"version":3,"file":"components/AdvancedSearch/AdvancedSearch.js","sources":["../../../src/components/AdvancedSearch/AdvancedSearch.tsx"],"sourcesContent":["import React, { useEffect, useMemo } from \"react\";\nimport { observer } from \"mobx-react-lite\";\nimport { useToast } from \"@webiny/admin-ui\";\n\nimport type { FieldDTOWithElement, FilterDTO, FilterRepository } from \"./domain/index.js\";\n\nimport { AdvancedSearchPresenter } from \"./AdvancedSearchPresenter.js\";\n\nimport { Button } from \"./Button/index.js\";\nimport { QueryManagerDialog } from \"./QueryManagerDialog/index.js\";\nimport { QueryBuilderDrawer } from \"./QueryBuilderDrawer/index.js\";\nimport { QuerySaverDialog } from \"./QuerySaverDialog/index.js\";\nimport { SelectedFilter } from \"./SelectedFilter/index.js\";\n\nexport interface AdvancedSearchProps {\n fields: FieldDTOWithElement[];\n repository: FilterRepository;\n onApplyFilter: (data: FilterDTO | null) => void;\n}\n\nexport const AdvancedSearch = observer(\n ({ fields, repository, onApplyFilter }: AdvancedSearchProps) => {\n const { showToast } = useToast();\n\n const presenter = useMemo<AdvancedSearchPresenter>(() => {\n return new AdvancedSearchPresenter(repository);\n }, [repository]);\n\n useEffect(() => {\n presenter.load();\n }, []);\n\n const applyFilter = async (filter: string | FilterDTO) => {\n await presenter.applyFilter(filter);\n if (presenter.vm.appliedFilter) {\n onApplyFilter(presenter.vm.appliedFilter);\n }\n };\n\n const unsetFilter = () => {\n if (presenter.vm.appliedFilter) {\n presenter.unsetFilter();\n onApplyFilter(null);\n }\n };\n\n const deleteFilter = async (filterId: string) => {\n await presenter.deleteFilter(filterId);\n if (filterId === presenter.vm.appliedFilter?.id) {\n unsetFilter();\n }\n };\n\n const persistAndApplyFilter = async (filter: FilterDTO) => {\n await presenter.persistFilter(filter);\n onApplyFilter(filter);\n };\n\n useEffect(() => {\n if (presenter.vm.feedbackVm.isOpen) {\n showToast({\n title: presenter.vm.feedbackVm.message\n });\n }\n }, [presenter.vm.feedbackVm.isOpen, presenter.vm.feedbackVm.message]);\n\n return (\n <>\n <div\n className={\"flex flex-row-reverse justify-between items-center gap-sm min-w-0\"}\n >\n <Button onClick={() => presenter.openManager()} />\n {presenter.vm.appliedFilter ? (\n <SelectedFilter\n filter={presenter.vm.appliedFilter}\n onEdit={() => presenter.editAppliedFilter()}\n onDelete={unsetFilter}\n />\n ) : null}\n </div>\n <QueryManagerDialog\n onClose={() => presenter.closeManager()}\n onCreate={() => presenter.createFilter()}\n onEdit={filterId => presenter.editFilter(filterId)}\n onRename={filterId => presenter.renameFilter(filterId)}\n onClone={filterId => presenter.cloneFilter(filterId)}\n onDelete={deleteFilter}\n onSelect={applyFilter}\n vm={presenter.vm.managerVm}\n />\n {presenter.vm.currentFilter ? (\n <>\n <QueryBuilderDrawer\n fields={fields}\n onClose={() => presenter.closeBuilder()}\n onSave={filter => presenter.saveFilter(filter)}\n onApply={applyFilter}\n onValidationError={message => presenter.showFeedback(message)}\n filter={presenter.vm.currentFilter}\n vm={presenter.vm.builderVm}\n />\n <QuerySaverDialog\n onSave={persistAndApplyFilter}\n onClose={() => presenter.closeSaver()}\n filter={presenter.vm.currentFilter}\n vm={presenter.vm.saverVm}\n />\n </>\n ) : null}\n </>\n );\n }\n);\n"],"names":["AdvancedSearch","observer","fields","repository","onApplyFilter","showToast","useToast","presenter","useMemo","AdvancedSearchPresenter","useEffect","applyFilter","filter","unsetFilter","deleteFilter","filterId","persistAndApplyFilter","Button","SelectedFilter","QueryManagerDialog","QueryBuilderDrawer","message","QuerySaverDialog"],"mappings":";;;;;;;;;AAoBO,MAAMA,iBAAiBC,SAC1B,CAAC,EAAEC,MAAM,EAAEC,UAAU,EAAEC,aAAa,EAAuB;IACvD,MAAM,EAAEC,SAAS,EAAE,GAAGC;IAEtB,MAAMC,YAAYC,QAAiC,IACxC,IAAIC,wBAAwBN,aACpC;QAACA;KAAW;IAEfO,UAAU;QACNH,UAAU,IAAI;IAClB,GAAG,EAAE;IAEL,MAAMI,cAAc,OAAOC;QACvB,MAAML,UAAU,WAAW,CAACK;QAC5B,IAAIL,UAAU,EAAE,CAAC,aAAa,EAC1BH,cAAcG,UAAU,EAAE,CAAC,aAAa;IAEhD;IAEA,MAAMM,cAAc;QAChB,IAAIN,UAAU,EAAE,CAAC,aAAa,EAAE;YAC5BA,UAAU,WAAW;YACrBH,cAAc;QAClB;IACJ;IAEA,MAAMU,eAAe,OAAOC;QACxB,MAAMR,UAAU,YAAY,CAACQ;QAC7B,IAAIA,aAAaR,UAAU,EAAE,CAAC,aAAa,EAAE,IACzCM;IAER;IAEA,MAAMG,wBAAwB,OAAOJ;QACjC,MAAML,UAAU,aAAa,CAACK;QAC9BR,cAAcQ;IAClB;IAEAF,UAAU;QACN,IAAIH,UAAU,EAAE,CAAC,UAAU,CAAC,MAAM,EAC9BF,UAAU;YACN,OAAOE,UAAU,EAAE,CAAC,UAAU,CAAC,OAAO;QAC1C;IAER,GAAG;QAACA,UAAU,EAAE,CAAC,UAAU,CAAC,MAAM;QAAEA,UAAU,EAAE,CAAC,UAAU,CAAC,OAAO;KAAC;IAEpE,OAAO,WAAP,GACI,wDACI,oBAAC;QACG,WAAW;qBAEX,oBAACU,QAAMA;QAAC,SAAS,IAAMV,UAAU,WAAW;QAC3CA,UAAU,EAAE,CAAC,aAAa,GAAG,WAAH,GACvB,oBAACW,gBAAcA;QACX,QAAQX,UAAU,EAAE,CAAC,aAAa;QAClC,QAAQ,IAAMA,UAAU,iBAAiB;QACzC,UAAUM;SAEd,qBAER,oBAACM,oBAAkBA;QACf,SAAS,IAAMZ,UAAU,YAAY;QACrC,UAAU,IAAMA,UAAU,YAAY;QACtC,QAAQQ,CAAAA,WAAYR,UAAU,UAAU,CAACQ;QACzC,UAAUA,CAAAA,WAAYR,UAAU,YAAY,CAACQ;QAC7C,SAASA,CAAAA,WAAYR,UAAU,WAAW,CAACQ;QAC3C,UAAUD;QACV,UAAUH;QACV,IAAIJ,UAAU,EAAE,CAAC,SAAS;QAE7BA,UAAU,EAAE,CAAC,aAAa,GAAG,WAAH,GACvB,wDACI,oBAACa,oBAAkBA;QACf,QAAQlB;QACR,SAAS,IAAMK,UAAU,YAAY;QACrC,QAAQK,CAAAA,SAAUL,UAAU,UAAU,CAACK;QACvC,SAASD;QACT,mBAAmBU,CAAAA,UAAWd,UAAU,YAAY,CAACc;QACrD,QAAQd,UAAU,EAAE,CAAC,aAAa;QAClC,IAAIA,UAAU,EAAE,CAAC,SAAS;sBAE9B,oBAACe,kBAAgBA;QACb,QAAQN;QACR,SAAS,IAAMT,UAAU,UAAU;QACnC,QAAQA,UAAU,EAAE,CAAC,aAAa;QAClC,IAAIA,UAAU,EAAE,CAAC,OAAO;UAGhC;AAGhB"}
@@ -1,6 +1,6 @@
1
1
  import react from "react";
2
2
  import { Bind } from "@webiny/form";
3
- import { Switch } from "@webiny/admin-ui";
3
+ import { SwitchPrimitive } from "@webiny/admin-ui";
4
4
  import { Operation } from "../../../domain/index.js";
5
5
  const OperationSelector = ({ label, name })=>{
6
6
  const getValue = (value)=>value === Operation.AND;
@@ -10,7 +10,7 @@ const OperationSelector = ({ label, name })=>{
10
10
  };
11
11
  return /*#__PURE__*/ react.createElement(Bind, {
12
12
  name: name
13
- }, ({ value, onChange })=>/*#__PURE__*/ react.createElement(Switch, {
13
+ }, ({ value, onChange })=>/*#__PURE__*/ react.createElement(SwitchPrimitive, {
14
14
  label: label,
15
15
  checked: getValue(value),
16
16
  onChange: (value)=>onChange(setValue(value))
@@ -1 +1 @@
1
- {"version":3,"file":"components/AdvancedSearch/QueryBuilderDrawer/QueryBuilder/components/OperationSelector.js","sources":["../../../../../../src/components/AdvancedSearch/QueryBuilderDrawer/QueryBuilder/components/OperationSelector.tsx"],"sourcesContent":["import React from \"react\";\n\nimport { Bind } from \"@webiny/form\";\nimport { Switch } from \"@webiny/admin-ui\";\nimport { Operation } from \"~/components/AdvancedSearch/domain/index.js\";\n\ninterface OperationSelectorProps {\n label: string;\n name: string;\n}\n\nexport const OperationSelector = ({ label, name }: OperationSelectorProps) => {\n const getValue = (value: Operation): boolean => {\n return value === Operation.AND;\n };\n\n const setValue = (value: boolean): Operation => {\n if (value) {\n return Operation.AND;\n } else {\n return Operation.OR;\n }\n };\n\n return (\n <Bind name={name}>\n {({ value, onChange }) => (\n <Switch\n label={label}\n checked={getValue(value)}\n onChange={value => onChange(setValue(value))}\n />\n )}\n </Bind>\n );\n};\n"],"names":["OperationSelector","label","name","getValue","value","Operation","setValue","Bind","onChange","Switch"],"mappings":";;;;AAWO,MAAMA,oBAAoB,CAAC,EAAEC,KAAK,EAAEC,IAAI,EAA0B;IACrE,MAAMC,WAAW,CAACC,QACPA,UAAUC,UAAU,GAAG;IAGlC,MAAMC,WAAW,CAACF;QACd,IAAIA,OACA,OAAOC,UAAU,GAAG;QAEpB,OAAOA,UAAU,EAAE;IAE3B;IAEA,OAAO,WAAP,GACI,oBAACE,MAAIA;QAAC,MAAML;OACP,CAAC,EAAEE,KAAK,EAAEI,QAAQ,EAAE,iBACjB,oBAACC,QAAMA;YACH,OAAOR;YACP,SAASE,SAASC;YAClB,UAAUA,CAAAA,QAASI,SAASF,SAASF;;AAKzD"}
1
+ {"version":3,"file":"components/AdvancedSearch/QueryBuilderDrawer/QueryBuilder/components/OperationSelector.js","sources":["../../../../../../src/components/AdvancedSearch/QueryBuilderDrawer/QueryBuilder/components/OperationSelector.tsx"],"sourcesContent":["import React from \"react\";\n\nimport { Bind } from \"@webiny/form\";\nimport { SwitchPrimitive } from \"@webiny/admin-ui\";\nimport { Operation } from \"~/components/AdvancedSearch/domain/index.js\";\n\ninterface OperationSelectorProps {\n label: string;\n name: string;\n}\n\nexport const OperationSelector = ({ label, name }: OperationSelectorProps) => {\n const getValue = (value: Operation): boolean => {\n return value === Operation.AND;\n };\n\n const setValue = (value: boolean): Operation => {\n if (value) {\n return Operation.AND;\n } else {\n return Operation.OR;\n }\n };\n\n return (\n <Bind name={name}>\n {({ value, onChange }) => (\n // The primitive keeps the label inline: both call sites put this switch in a\n // header row, next to a title, not in a form with a label above it.\n <SwitchPrimitive\n label={label}\n checked={getValue(value)}\n onChange={value => onChange(setValue(value))}\n />\n )}\n </Bind>\n );\n};\n"],"names":["OperationSelector","label","name","getValue","value","Operation","setValue","Bind","onChange","SwitchPrimitive"],"mappings":";;;;AAWO,MAAMA,oBAAoB,CAAC,EAAEC,KAAK,EAAEC,IAAI,EAA0B;IACrE,MAAMC,WAAW,CAACC,QACPA,UAAUC,UAAU,GAAG;IAGlC,MAAMC,WAAW,CAACF;QACd,IAAIA,OACA,OAAOC,UAAU,GAAG;QAEpB,OAAOA,UAAU,EAAE;IAE3B;IAEA,OAAO,WAAP,GACI,oBAACE,MAAIA;QAAC,MAAML;OACP,CAAC,EAAEE,KAAK,EAAEI,QAAQ,EAAE,G,cAGjB,oBAACC,iBAAeA;YACZ,OAAOR;YACP,SAASE,SAASC;YAClB,UAAUA,CAAAA,QAASI,SAASF,SAASF;;AAKzD"}
@@ -11,7 +11,7 @@ interface QueryBuilderDrawerProps {
11
11
  isOpen: boolean;
12
12
  };
13
13
  }
14
- export declare const QueryBuilderDrawer: (({ filter, ...props }: QueryBuilderDrawerProps) => React.JSX.Element) & {
15
- displayName: string;
14
+ export declare const QueryBuilderDrawer: (({ filter, ...props }: QueryBuilderDrawerProps) => React.JSX.Element) & React.NamedExoticComponent<QueryBuilderDrawerProps> & {
15
+ readonly type: ({ filter, ...props }: QueryBuilderDrawerProps) => React.JSX.Element;
16
16
  };
17
17
  export {};
@@ -5,7 +5,7 @@ const SelectedFilter = (props)=>/*#__PURE__*/ react.createElement("div", {
5
5
  role: "button",
6
6
  className: cn(buttonVariants({
7
7
  variant: "tertiary"
8
- }), "gap-xs cursor-pointer"),
8
+ }), "gap-xs cursor-pointer min-w-0"),
9
9
  onClick: props.onEdit
10
10
  }, /*#__PURE__*/ react.createElement("span", {
11
11
  className: "truncate max-w-sidebar-expanded"
@@ -1 +1 @@
1
- {"version":3,"file":"components/AdvancedSearch/SelectedFilter/SelectedFilter.js","sources":["../../../../src/components/AdvancedSearch/SelectedFilter/SelectedFilter.tsx"],"sourcesContent":["import React from \"react\";\nimport { cn, IconButton, buttonVariants } from \"@webiny/admin-ui\";\nimport { ReactComponent as Close } from \"@webiny/icons/close.svg\";\nimport type { FilterDTO } from \"~/components/AdvancedSearch/domain/index.js\";\n\ninterface SelectedFilterProps {\n filter: FilterDTO;\n onEdit: () => void;\n onDelete: () => void;\n}\n\nexport const SelectedFilter = (props: SelectedFilterProps) => {\n return (\n <div\n role={\"button\"}\n className={cn(buttonVariants({ variant: \"tertiary\" }), \"gap-xs cursor-pointer\")}\n onClick={props.onEdit}\n >\n <span className={\"truncate max-w-sidebar-expanded\"}>{props.filter.name}</span>\n <IconButton icon={<Close />} onClick={props.onDelete} size={\"xs\"} variant={\"ghost\"} />\n </div>\n );\n};\n"],"names":["SelectedFilter","props","cn","buttonVariants","IconButton","Close"],"mappings":";;;AAWO,MAAMA,iBAAiB,CAACC,QACpB,WAAP,GACI,oBAAC;QACG,MAAM;QACN,WAAWC,GAAGC,eAAe;YAAE,SAAS;QAAW,IAAI;QACvD,SAASF,MAAM,MAAM;qBAErB,oBAAC;QAAK,WAAW;OAAoCA,MAAM,MAAM,CAAC,IAAI,iBACtE,oBAACG,YAAUA;QAAC,oBAAM,oBAACC,gBAAKA;QAAK,SAASJ,MAAM,QAAQ;QAAE,MAAM;QAAM,SAAS"}
1
+ {"version":3,"file":"components/AdvancedSearch/SelectedFilter/SelectedFilter.js","sources":["../../../../src/components/AdvancedSearch/SelectedFilter/SelectedFilter.tsx"],"sourcesContent":["import React from \"react\";\nimport { cn, IconButton, buttonVariants } from \"@webiny/admin-ui\";\nimport { ReactComponent as Close } from \"@webiny/icons/close.svg\";\nimport type { FilterDTO } from \"~/components/AdvancedSearch/domain/index.js\";\n\ninterface SelectedFilterProps {\n filter: FilterDTO;\n onEdit: () => void;\n onDelete: () => void;\n}\n\nexport const SelectedFilter = (props: SelectedFilterProps) => {\n return (\n <div\n role={\"button\"}\n className={cn(buttonVariants({ variant: \"tertiary\" }), \"gap-xs cursor-pointer min-w-0\")}\n onClick={props.onEdit}\n >\n <span className={\"truncate max-w-sidebar-expanded\"}>{props.filter.name}</span>\n <IconButton icon={<Close />} onClick={props.onDelete} size={\"xs\"} variant={\"ghost\"} />\n </div>\n );\n};\n"],"names":["SelectedFilter","props","cn","buttonVariants","IconButton","Close"],"mappings":";;;AAWO,MAAMA,iBAAiB,CAACC,QACpB,WAAP,GACI,oBAAC;QACG,MAAM;QACN,WAAWC,GAAGC,eAAe;YAAE,SAAS;QAAW,IAAI;QACvD,SAASF,MAAM,MAAM;qBAErB,oBAAC;QAAK,WAAW;OAAoCA,MAAM,MAAM,CAAC,IAAI,iBACtE,oBAACG,YAAUA;QAAC,oBAAM,oBAACC,gBAAKA;QAAK,SAASJ,MAAM,QAAQ;QAAE,MAAM;QAAM,SAAS"}
@@ -87,7 +87,7 @@ const List = ({ folders, folderActions, onFolderClick, focusedFolderId, hiddenFo
87
87
  }
88
88
  });
89
89
  });
90
- } else await runDrop();
90
+ } else runDrop();
91
91
  }, [
92
92
  folders,
93
93
  dropConfirmation,
@@ -1 +1 @@
1
- {"version":3,"file":"components/FolderTree/List/List.js","sources":["../../../../src/components/FolderTree/List/List.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport {\n Tree,\n type NodeDto,\n type TreeProps,\n type WithDefaultNodeData,\n type DropOptions\n} from \"@webiny/admin-ui\";\nimport { useSnackbar } from \"@webiny/app-admin\";\nimport type { FolderDto } from \"~/domain/folder/FolderDto.js\";\nimport { useGetFolderLevelPermission } from \"~/features/folders/getFolderLevelPermission/index.js\";\nimport { useListFoldersByParentIds } from \"~/features/folders/listFoldersByParentIds/index.js\";\nimport { useGetFolderAncestors } from \"~/features/folders/getFolderAncestors/index.js\";\nimport { useUpdateFolder } from \"~/features/folders/updateFolder/index.js\";\nimport { Node } from \"../Node/index.js\";\nimport { createInitialOpenList, createTreeData } from \"./utils.js\";\nimport { ROOT_FOLDER } from \"~/constants.js\";\nimport { FolderProvider } from \"~/contexts/folder.js\";\nimport { useConfirmMoveFolderDialog } from \"~/dialogs/index.js\";\nimport type { FolderActionConfig } from \"~/config/AcoConfig.js\";\n\ninterface ListProps {\n folders: FolderDto[];\n folderActions: FolderActionConfig[];\n dropConfirmation?: boolean;\n focusedFolderId?: string;\n hiddenFolderIds?: string[];\n enableActions?: boolean;\n onFolderClick: (data: FolderDto) => void;\n}\n\nexport const List = ({\n folders,\n folderActions,\n onFolderClick,\n focusedFolderId,\n hiddenFolderIds,\n enableActions,\n dropConfirmation = false\n}: ListProps) => {\n const { listFoldersByParentIds, loading } = useListFoldersByParentIds();\n const { updateFolder } = useUpdateFolder();\n const { getFolderLevelPermission: canManageStructure } =\n useGetFolderLevelPermission(\"canManageStructure\");\n const { getFolderAncestors } = useGetFolderAncestors();\n const { showSnackbar } = useSnackbar();\n\n const [treeData, setTreeData] = useState<NodeDto<FolderDto>[]>([]);\n const [openFolderIds, setOpenFolderIds] = useState<string[]>([ROOT_FOLDER]);\n const { showDialog: showConfirmMoveFolderDialog } = useConfirmMoveFolderDialog();\n\n useEffect(() => {\n setTreeData(createTreeData(folders, focusedFolderId, hiddenFolderIds));\n }, [folders, focusedFolderId, hiddenFolderIds]);\n\n useEffect(() => {\n setOpenFolderIds(prev => {\n const expanded = createInitialOpenList(folders, prev, focusedFolderId);\n return [...new Set([ROOT_FOLDER, ...expanded])];\n });\n }, [focusedFolderId, folders, setOpenFolderIds]);\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 setOpenFolderIds(updatedOpenIds);\n\n const fetchableIds = folderIds.filter(id => id !== ROOT_FOLDER && id !== \"0\");\n await listFoldersByParentIds(fetchableIds);\n };\n\n const handleDrop: TreeProps[\"onDrop\"] = async (_, { dragSourceId, dropTargetId }) => {\n try {\n const item = folders.find(folder => folder.id === dragSourceId);\n if (!item) {\n throw new Error(\"Folder not found!\");\n }\n\n await updateFolder({\n ...item,\n parentId: dropTargetId !== ROOT_FOLDER ? (dropTargetId as string) : null\n });\n } catch (error) {\n showSnackbar(error.message);\n }\n };\n\n const onDrop = useCallback<NonNullable<TreeProps[\"onDrop\"]>>(\n async (newTree, options: DropOptions) => {\n // Function to execute the drop logic\n const runDrop = async () => handleDrop(newTree, options);\n\n // If drop confirmation is enabled, show dialog before proceeding\n if (dropConfirmation) {\n const { dragSourceId, dropTargetId } = options;\n const folder = folders.find(f => f.id === dragSourceId);\n const targetFolder = folders.find(f => f.id === dropTargetId);\n\n // Abort if either folder is not found\n if (!folder || !targetFolder) {\n throw new Error(\"Folder not found\");\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 // Otherwise, perform the drop immediately\n await runDrop();\n }\n },\n [folders, 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>) => node.id !== ROOT_FOLDER && canManageStructure(node.id),\n [canManageStructure]\n );\n\n const canDrop: TreeProps<FolderDto>[\"canDrop\"] = (_, options: DropOptions<FolderDto>) => {\n const { dragSourceId, dropTargetId } = options;\n const dropTagetAncestorIds = getFolderAncestors(dropTargetId).map(item => item.id);\n\n // Prevent dropping a folder into itself or its descendants\n return !(dragSourceId && dropTagetAncestorIds.includes(dragSourceId));\n };\n\n const nodeRenderer: TreeProps<FolderDto>[\"renderer\"] = node => {\n const folder = folders.find(folder => folder.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 onFolderClick(node);\n },\n [onFolderClick]\n );\n\n return (\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={loading}\n />\n );\n};\n"],"names":["List","folders","folderActions","onFolderClick","focusedFolderId","hiddenFolderIds","enableActions","dropConfirmation","listFoldersByParentIds","loading","useListFoldersByParentIds","updateFolder","useUpdateFolder","canManageStructure","useGetFolderLevelPermission","getFolderAncestors","useGetFolderAncestors","showSnackbar","useSnackbar","treeData","setTreeData","useState","openFolderIds","setOpenFolderIds","ROOT_FOLDER","showConfirmMoveFolderDialog","useConfirmMoveFolderDialog","useEffect","createTreeData","prev","expanded","createInitialOpenList","Set","handleChangeOpen","nodes","folderIds","node","updatedOpenIds","fetchableIds","id","handleDrop","_","dragSourceId","dropTargetId","item","folder","Error","error","onDrop","useCallback","newTree","options","runDrop","f","targetFolder","Promise","resolve","reject","sort","useMemo","a","b","undefined","canDrag","canDrop","dropTagetAncestorIds","nodeRenderer","FolderProvider","Node","handleNodeClick","Tree"],"mappings":"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"}
1
+ {"version":3,"file":"components/FolderTree/List/List.js","sources":["../../../../src/components/FolderTree/List/List.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport {\n Tree,\n type NodeDto,\n type TreeProps,\n type WithDefaultNodeData,\n type DropOptions\n} from \"@webiny/admin-ui\";\nimport { useSnackbar } from \"@webiny/app-admin\";\nimport type { FolderDto } from \"~/domain/folder/FolderDto.js\";\nimport { useGetFolderLevelPermission } from \"~/features/folders/getFolderLevelPermission/index.js\";\nimport { useListFoldersByParentIds } from \"~/features/folders/listFoldersByParentIds/index.js\";\nimport { useGetFolderAncestors } from \"~/features/folders/getFolderAncestors/index.js\";\nimport { useUpdateFolder } from \"~/features/folders/updateFolder/index.js\";\nimport { Node } from \"../Node/index.js\";\nimport { createInitialOpenList, createTreeData } from \"./utils.js\";\nimport { ROOT_FOLDER } from \"~/constants.js\";\nimport { FolderProvider } from \"~/contexts/folder.js\";\nimport { useConfirmMoveFolderDialog } from \"~/dialogs/index.js\";\nimport type { FolderActionConfig } from \"~/config/AcoConfig.js\";\n\ninterface ListProps {\n folders: FolderDto[];\n folderActions: FolderActionConfig[];\n dropConfirmation?: boolean;\n focusedFolderId?: string;\n hiddenFolderIds?: string[];\n enableActions?: boolean;\n onFolderClick: (data: FolderDto) => void;\n}\n\nexport const List = ({\n folders,\n folderActions,\n onFolderClick,\n focusedFolderId,\n hiddenFolderIds,\n enableActions,\n dropConfirmation = false\n}: ListProps) => {\n const { listFoldersByParentIds, loading } = useListFoldersByParentIds();\n const { updateFolder } = useUpdateFolder();\n const { getFolderLevelPermission: canManageStructure } =\n useGetFolderLevelPermission(\"canManageStructure\");\n const { getFolderAncestors } = useGetFolderAncestors();\n const { showSnackbar } = useSnackbar();\n\n const [treeData, setTreeData] = useState<NodeDto<FolderDto>[]>([]);\n const [openFolderIds, setOpenFolderIds] = useState<string[]>([ROOT_FOLDER]);\n const { showDialog: showConfirmMoveFolderDialog } = useConfirmMoveFolderDialog();\n\n useEffect(() => {\n setTreeData(createTreeData(folders, focusedFolderId, hiddenFolderIds));\n }, [folders, focusedFolderId, hiddenFolderIds]);\n\n useEffect(() => {\n setOpenFolderIds(prev => {\n const expanded = createInitialOpenList(folders, prev, focusedFolderId);\n return [...new Set([ROOT_FOLDER, ...expanded])];\n });\n }, [focusedFolderId, folders, setOpenFolderIds]);\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 setOpenFolderIds(updatedOpenIds);\n\n const fetchableIds = folderIds.filter(id => id !== ROOT_FOLDER && id !== \"0\");\n await listFoldersByParentIds(fetchableIds);\n };\n\n const handleDrop: TreeProps[\"onDrop\"] = async (_, { dragSourceId, dropTargetId }) => {\n try {\n const item = folders.find(folder => folder.id === dragSourceId);\n if (!item) {\n throw new Error(\"Folder not found!\");\n }\n\n await updateFolder({\n ...item,\n parentId: dropTargetId !== ROOT_FOLDER ? (dropTargetId as string) : null\n });\n } catch (error) {\n showSnackbar(error.message);\n }\n };\n\n const onDrop = useCallback<NonNullable<TreeProps[\"onDrop\"]>>(\n async (newTree, options: DropOptions) => {\n // Function to execute the drop logic\n const runDrop = async () => handleDrop(newTree, options);\n\n // If drop confirmation is enabled, show dialog before proceeding\n if (dropConfirmation) {\n const { dragSourceId, dropTargetId } = options;\n const folder = folders.find(f => f.id === dragSourceId);\n const targetFolder = folders.find(f => f.id === dropTargetId);\n\n // Abort if either folder is not found\n if (!folder || !targetFolder) {\n throw new Error(\"Folder not found\");\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 [folders, 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>) => node.id !== ROOT_FOLDER && canManageStructure(node.id),\n [canManageStructure]\n );\n\n const canDrop: TreeProps<FolderDto>[\"canDrop\"] = (_, options: DropOptions<FolderDto>) => {\n const { dragSourceId, dropTargetId } = options;\n const dropTagetAncestorIds = getFolderAncestors(dropTargetId).map(item => item.id);\n\n // Prevent dropping a folder into itself or its descendants\n return !(dragSourceId && dropTagetAncestorIds.includes(dragSourceId));\n };\n\n const nodeRenderer: TreeProps<FolderDto>[\"renderer\"] = node => {\n const folder = folders.find(folder => folder.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 onFolderClick(node);\n },\n [onFolderClick]\n );\n\n return (\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={loading}\n />\n );\n};\n"],"names":["List","folders","folderActions","onFolderClick","focusedFolderId","hiddenFolderIds","enableActions","dropConfirmation","listFoldersByParentIds","loading","useListFoldersByParentIds","updateFolder","useUpdateFolder","canManageStructure","useGetFolderLevelPermission","getFolderAncestors","useGetFolderAncestors","showSnackbar","useSnackbar","treeData","setTreeData","useState","openFolderIds","setOpenFolderIds","ROOT_FOLDER","showConfirmMoveFolderDialog","useConfirmMoveFolderDialog","useEffect","createTreeData","prev","expanded","createInitialOpenList","Set","handleChangeOpen","nodes","folderIds","node","updatedOpenIds","fetchableIds","id","handleDrop","_","dragSourceId","dropTargetId","item","folder","Error","error","onDrop","useCallback","newTree","options","runDrop","f","targetFolder","Promise","resolve","reject","sort","useMemo","a","b","undefined","canDrag","canDrop","dropTagetAncestorIds","nodeRenderer","FolderProvider","Node","handleNodeClick","Tree"],"mappings":"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"}
@@ -19,6 +19,6 @@ export interface TableInnerProps<T extends TableRow> {
19
19
  sorting: DataTableSorting;
20
20
  tablePresenter: TablePresenter;
21
21
  }
22
- export declare const TableInner: (<T extends TableRow>(props: TableInnerProps<T>) => React.JSX.Element) & {
23
- displayName: string;
22
+ export declare const TableInner: (<T extends TableRow>(props: TableInnerProps<T>) => React.JSX.Element) & React.NamedExoticComponent<TableInnerProps<TableRow<unknown>>> & {
23
+ readonly type: <T extends TableRow>(props: TableInnerProps<T>) => React.JSX.Element;
24
24
  };
@@ -38,6 +38,11 @@ const ListItemMeta = ({ permission, target, targetsList, onRemoveAccess, onUpdat
38
38
  disabled = false;
39
39
  removePermissionDisabled = true;
40
40
  }
41
+ if (permission.plugin) {
42
+ message = "Defined in code and cannot be changed here.";
43
+ disabled = true;
44
+ removePermissionDisabled = true;
45
+ }
41
46
  if (identity.id === target.id) {
42
47
  message = "You can't change your own permissions.";
43
48
  if (permission.inheritedFrom?.startsWith("team:")) {
@@ -1 +1 @@
1
- {"version":3,"file":"dialogs/DialogSetPermissions/UsersTeamsSelection/ListItemMeta.js","sources":["../../../../src/dialogs/DialogSetPermissions/UsersTeamsSelection/ListItemMeta.tsx"],"sourcesContent":["import React, { useMemo } from \"react\";\nimport { ReactComponent as More } from \"@webiny/icons/arrow_drop_down.svg\";\nimport { Button, DropdownMenu, Text, Tooltip } from \"@webiny/admin-ui\";\nimport { useSecurity } from \"@webiny/app-admin\";\nimport type { FolderAccessLevel, FolderLevelPermissionsTarget, FolderPermission } from \"~/types.js\";\n\nconst TARGET_LEVELS = [\n {\n id: \"no-access\",\n label: \"No Access\",\n description: \"Cannot view or modify content\"\n },\n {\n id: \"viewer\",\n label: \"Viewer\",\n description: \"Can view content, but not modify it\"\n },\n {\n id: \"editor\",\n label: \"Editor\",\n description: \"Can view and modify content\"\n },\n {\n id: \"owner\",\n label: \"Owner\",\n description: \"Can edit and manage content permissions\"\n }\n];\n\ninterface ListItemMetaProps {\n permission: FolderPermission;\n target: FolderLevelPermissionsTarget;\n targetsList: FolderLevelPermissionsTarget[];\n onRemoveAccess: (params: { permission: FolderPermission }) => void;\n onUpdatePermission: (params: { permission: FolderPermission }) => void;\n}\n\nexport const ListItemMeta = ({\n permission,\n target,\n targetsList,\n onRemoveAccess,\n onUpdatePermission\n}: ListItemMetaProps) => {\n const { identity } = useSecurity();\n\n const currentLevel = useMemo(() => {\n return TARGET_LEVELS.find(level => level.id === permission.level)!;\n }, [permission.level]);\n\n const { isListDisabled, isRemovePermissionDisabled, tooltipMessage } = useMemo(() => {\n let message = null;\n let disabled = false;\n let removePermissionDisabled = false;\n\n if (permission.inheritedFrom?.startsWith(\"parent:\")) {\n message = \"Inherited from parent folder.\";\n disabled = false; // Still allow interaction, just inform user\n removePermissionDisabled = true;\n }\n\n if (identity!.id === target.id) {\n message = \"You can't change your own permissions.\";\n if (permission.inheritedFrom?.startsWith(\"team:\")) {\n const team = targetsList.find(t => t.target === permission.inheritedFrom);\n message += \" Access to this folder is managed by a team\";\n if (team) {\n message += ` (${team.name})`;\n }\n message += \".\";\n }\n disabled = true;\n removePermissionDisabled = true;\n }\n\n return {\n isListDisabled: disabled,\n isRemovePermissionDisabled: removePermissionDisabled,\n tooltipMessage: message\n };\n }, [permission, identity, target, targetsList]);\n\n const handle = useMemo(() => {\n let handle = (\n <Button\n variant={\"ghost\"}\n disabled={!!isListDisabled}\n text={currentLevel.label}\n icon={<More />}\n iconPosition={\"end\"}\n />\n );\n\n if (tooltipMessage) {\n handle = <Tooltip content={tooltipMessage} trigger={handle} />;\n }\n\n return handle;\n }, [tooltipMessage, isListDisabled, currentLevel.label]);\n\n return (\n <DropdownMenu trigger={handle}>\n {TARGET_LEVELS.map(level => (\n <DropdownMenu.CheckboxItem\n key={level.id}\n checked={currentLevel.id === level.id}\n text={\n <div>\n <Text as={\"div\"}>{level.label}</Text>\n <Text as={\"div\"} size={\"sm\"} className={\"text-neutral-strong\"}>\n {level.description}\n </Text>\n </div>\n }\n onClick={() => {\n // Needed to do this with a short delay because of a visual glitch.\n setTimeout(() => {\n onUpdatePermission({\n permission: {\n ...permission,\n level: level.id as FolderAccessLevel\n }\n });\n }, 75);\n }}\n />\n ))}\n <DropdownMenu.Separator />\n <DropdownMenu.Item\n onClick={() => onRemoveAccess({ permission })}\n text={\"Remove permission\"}\n disabled={isRemovePermissionDisabled}\n />\n </DropdownMenu>\n );\n};\n"],"names":["TARGET_LEVELS","ListItemMeta","permission","target","targetsList","onRemoveAccess","onUpdatePermission","identity","useSecurity","currentLevel","useMemo","level","isListDisabled","isRemovePermissionDisabled","tooltipMessage","message","disabled","removePermissionDisabled","team","t","handle","Button","More","Tooltip","DropdownMenu","Text","setTimeout"],"mappings":";;;;AAMA,MAAMA,gBAAgB;IAClB;QACI,IAAI;QACJ,OAAO;QACP,aAAa;IACjB;IACA;QACI,IAAI;QACJ,OAAO;QACP,aAAa;IACjB;IACA;QACI,IAAI;QACJ,OAAO;QACP,aAAa;IACjB;IACA;QACI,IAAI;QACJ,OAAO;QACP,aAAa;IACjB;CACH;AAUM,MAAMC,eAAe,CAAC,EACzBC,UAAU,EACVC,MAAM,EACNC,WAAW,EACXC,cAAc,EACdC,kBAAkB,EACF;IAChB,MAAM,EAAEC,QAAQ,EAAE,GAAGC;IAErB,MAAMC,eAAeC,QAAQ,IAClBV,cAAc,IAAI,CAACW,CAAAA,QAASA,MAAM,EAAE,KAAKT,WAAW,KAAK,GACjE;QAACA,WAAW,KAAK;KAAC;IAErB,MAAM,EAAEU,cAAc,EAAEC,0BAA0B,EAAEC,cAAc,EAAE,GAAGJ,QAAQ;QAC3E,IAAIK,UAAU;QACd,IAAIC,WAAW;QACf,IAAIC,2BAA2B;QAE/B,IAAIf,WAAW,aAAa,EAAE,WAAW,YAAY;YACjDa,UAAU;YACVC,WAAW;YACXC,2BAA2B;QAC/B;QAEA,IAAIV,SAAU,EAAE,KAAKJ,OAAO,EAAE,EAAE;YAC5BY,UAAU;YACV,IAAIb,WAAW,aAAa,EAAE,WAAW,UAAU;gBAC/C,MAAMgB,OAAOd,YAAY,IAAI,CAACe,CAAAA,IAAKA,EAAE,MAAM,KAAKjB,WAAW,aAAa;gBACxEa,WAAW;gBACX,IAAIG,MACAH,WAAW,CAAC,EAAE,EAAEG,KAAK,IAAI,CAAC,CAAC,CAAC;gBAEhCH,WAAW;YACf;YACAC,WAAW;YACXC,2BAA2B;QAC/B;QAEA,OAAO;YACH,gBAAgBD;YAChB,4BAA4BC;YAC5B,gBAAgBF;QACpB;IACJ,GAAG;QAACb;QAAYK;QAAUJ;QAAQC;KAAY;IAE9C,MAAMgB,SAASV,QAAQ;QACnB,IAAIU,SAAS,WAATA,GACA,oBAACC,QAAMA;YACH,SAAS;YACT,UAAU,CAAC,CAACT;YACZ,MAAMH,aAAa,KAAK;YACxB,oBAAM,oBAACa,gBAAIA;YACX,cAAc;;QAItB,IAAIR,gBACAM,SAAS,WAATA,GAAS,oBAACG,SAAOA;YAAC,SAAST;YAAgB,SAASM;;QAGxD,OAAOA;IACX,GAAG;QAACN;QAAgBF;QAAgBH,aAAa,KAAK;KAAC;IAEvD,OAAO,WAAP,GACI,oBAACe,cAAYA;QAAC,SAASJ;OAClBpB,cAAc,GAAG,CAACW,CAAAA,QAAAA,WAAAA,GACf,oBAACa,aAAa,YAAY;YACtB,KAAKb,MAAM,EAAE;YACb,SAASF,aAAa,EAAE,KAAKE,MAAM,EAAE;YACrC,oBACI,oBAAC,2BACG,oBAACc,MAAIA;gBAAC,IAAI;eAAQd,MAAM,KAAK,iBAC7B,oBAACc,MAAIA;gBAAC,IAAI;gBAAO,MAAM;gBAAM,WAAW;eACnCd,MAAM,WAAW;YAI9B,SAAS;gBAELe,WAAW;oBACPpB,mBAAmB;wBACf,YAAY;4BACR,GAAGJ,UAAU;4BACb,OAAOS,MAAM,EAAE;wBACnB;oBACJ;gBACJ,GAAG;YACP;2BAGR,oBAACa,aAAa,SAAS,uBACvB,oBAACA,aAAa,IAAI;QACd,SAAS,IAAMnB,eAAe;gBAAEH;YAAW;QAC3C,MAAM;QACN,UAAUW;;AAI1B"}
1
+ {"version":3,"file":"dialogs/DialogSetPermissions/UsersTeamsSelection/ListItemMeta.js","sources":["../../../../src/dialogs/DialogSetPermissions/UsersTeamsSelection/ListItemMeta.tsx"],"sourcesContent":["import React, { useMemo } from \"react\";\nimport { ReactComponent as More } from \"@webiny/icons/arrow_drop_down.svg\";\nimport { Button, DropdownMenu, Text, Tooltip } from \"@webiny/admin-ui\";\nimport { useSecurity } from \"@webiny/app-admin\";\nimport type { FolderAccessLevel, FolderLevelPermissionsTarget, FolderPermission } from \"~/types.js\";\n\nconst TARGET_LEVELS = [\n {\n id: \"no-access\",\n label: \"No Access\",\n description: \"Cannot view or modify content\"\n },\n {\n id: \"viewer\",\n label: \"Viewer\",\n description: \"Can view content, but not modify it\"\n },\n {\n id: \"editor\",\n label: \"Editor\",\n description: \"Can view and modify content\"\n },\n {\n id: \"owner\",\n label: \"Owner\",\n description: \"Can edit and manage content permissions\"\n }\n];\n\ninterface ListItemMetaProps {\n permission: FolderPermission;\n target: FolderLevelPermissionsTarget;\n targetsList: FolderLevelPermissionsTarget[];\n onRemoveAccess: (params: { permission: FolderPermission }) => void;\n onUpdatePermission: (params: { permission: FolderPermission }) => void;\n}\n\nexport const ListItemMeta = ({\n permission,\n target,\n targetsList,\n onRemoveAccess,\n onUpdatePermission\n}: ListItemMetaProps) => {\n const { identity } = useSecurity();\n\n const currentLevel = useMemo(() => {\n return TARGET_LEVELS.find(level => level.id === permission.level)!;\n }, [permission.level]);\n\n const { isListDisabled, isRemovePermissionDisabled, tooltipMessage } = useMemo(() => {\n let message = null;\n let disabled = false;\n let removePermissionDisabled = false;\n\n if (permission.inheritedFrom?.startsWith(\"parent:\")) {\n message = \"Inherited from parent folder.\";\n disabled = false; // Still allow interaction, just inform user\n removePermissionDisabled = true;\n }\n\n if (permission.plugin) {\n message = \"Defined in code and cannot be changed here.\";\n disabled = true;\n removePermissionDisabled = true;\n }\n\n if (identity!.id === target.id) {\n message = \"You can't change your own permissions.\";\n if (permission.inheritedFrom?.startsWith(\"team:\")) {\n const team = targetsList.find(t => t.target === permission.inheritedFrom);\n message += \" Access to this folder is managed by a team\";\n if (team) {\n message += ` (${team.name})`;\n }\n message += \".\";\n }\n disabled = true;\n removePermissionDisabled = true;\n }\n\n return {\n isListDisabled: disabled,\n isRemovePermissionDisabled: removePermissionDisabled,\n tooltipMessage: message\n };\n }, [permission, identity, target, targetsList]);\n\n const handle = useMemo(() => {\n let handle = (\n <Button\n variant={\"ghost\"}\n disabled={!!isListDisabled}\n text={currentLevel.label}\n icon={<More />}\n iconPosition={\"end\"}\n />\n );\n\n if (tooltipMessage) {\n handle = <Tooltip content={tooltipMessage} trigger={handle} />;\n }\n\n return handle;\n }, [tooltipMessage, isListDisabled, currentLevel.label]);\n\n return (\n <DropdownMenu trigger={handle}>\n {TARGET_LEVELS.map(level => (\n <DropdownMenu.CheckboxItem\n key={level.id}\n checked={currentLevel.id === level.id}\n text={\n <div>\n <Text as={\"div\"}>{level.label}</Text>\n <Text as={\"div\"} size={\"sm\"} className={\"text-neutral-strong\"}>\n {level.description}\n </Text>\n </div>\n }\n onClick={() => {\n // Needed to do this with a short delay because of a visual glitch.\n setTimeout(() => {\n onUpdatePermission({\n permission: {\n ...permission,\n level: level.id as FolderAccessLevel\n }\n });\n }, 75);\n }}\n />\n ))}\n <DropdownMenu.Separator />\n <DropdownMenu.Item\n onClick={() => onRemoveAccess({ permission })}\n text={\"Remove permission\"}\n disabled={isRemovePermissionDisabled}\n />\n </DropdownMenu>\n );\n};\n"],"names":["TARGET_LEVELS","ListItemMeta","permission","target","targetsList","onRemoveAccess","onUpdatePermission","identity","useSecurity","currentLevel","useMemo","level","isListDisabled","isRemovePermissionDisabled","tooltipMessage","message","disabled","removePermissionDisabled","team","t","handle","Button","More","Tooltip","DropdownMenu","Text","setTimeout"],"mappings":";;;;AAMA,MAAMA,gBAAgB;IAClB;QACI,IAAI;QACJ,OAAO;QACP,aAAa;IACjB;IACA;QACI,IAAI;QACJ,OAAO;QACP,aAAa;IACjB;IACA;QACI,IAAI;QACJ,OAAO;QACP,aAAa;IACjB;IACA;QACI,IAAI;QACJ,OAAO;QACP,aAAa;IACjB;CACH;AAUM,MAAMC,eAAe,CAAC,EACzBC,UAAU,EACVC,MAAM,EACNC,WAAW,EACXC,cAAc,EACdC,kBAAkB,EACF;IAChB,MAAM,EAAEC,QAAQ,EAAE,GAAGC;IAErB,MAAMC,eAAeC,QAAQ,IAClBV,cAAc,IAAI,CAACW,CAAAA,QAASA,MAAM,EAAE,KAAKT,WAAW,KAAK,GACjE;QAACA,WAAW,KAAK;KAAC;IAErB,MAAM,EAAEU,cAAc,EAAEC,0BAA0B,EAAEC,cAAc,EAAE,GAAGJ,QAAQ;QAC3E,IAAIK,UAAU;QACd,IAAIC,WAAW;QACf,IAAIC,2BAA2B;QAE/B,IAAIf,WAAW,aAAa,EAAE,WAAW,YAAY;YACjDa,UAAU;YACVC,WAAW;YACXC,2BAA2B;QAC/B;QAEA,IAAIf,WAAW,MAAM,EAAE;YACnBa,UAAU;YACVC,WAAW;YACXC,2BAA2B;QAC/B;QAEA,IAAIV,SAAU,EAAE,KAAKJ,OAAO,EAAE,EAAE;YAC5BY,UAAU;YACV,IAAIb,WAAW,aAAa,EAAE,WAAW,UAAU;gBAC/C,MAAMgB,OAAOd,YAAY,IAAI,CAACe,CAAAA,IAAKA,EAAE,MAAM,KAAKjB,WAAW,aAAa;gBACxEa,WAAW;gBACX,IAAIG,MACAH,WAAW,CAAC,EAAE,EAAEG,KAAK,IAAI,CAAC,CAAC,CAAC;gBAEhCH,WAAW;YACf;YACAC,WAAW;YACXC,2BAA2B;QAC/B;QAEA,OAAO;YACH,gBAAgBD;YAChB,4BAA4BC;YAC5B,gBAAgBF;QACpB;IACJ,GAAG;QAACb;QAAYK;QAAUJ;QAAQC;KAAY;IAE9C,MAAMgB,SAASV,QAAQ;QACnB,IAAIU,SAAS,WAATA,GACA,oBAACC,QAAMA;YACH,SAAS;YACT,UAAU,CAAC,CAACT;YACZ,MAAMH,aAAa,KAAK;YACxB,oBAAM,oBAACa,gBAAIA;YACX,cAAc;;QAItB,IAAIR,gBACAM,SAAS,WAATA,GAAS,oBAACG,SAAOA;YAAC,SAAST;YAAgB,SAASM;;QAGxD,OAAOA;IACX,GAAG;QAACN;QAAgBF;QAAgBH,aAAa,KAAK;KAAC;IAEvD,OAAO,WAAP,GACI,oBAACe,cAAYA;QAAC,SAASJ;OAClBpB,cAAc,GAAG,CAACW,CAAAA,QAAAA,WAAAA,GACf,oBAACa,aAAa,YAAY;YACtB,KAAKb,MAAM,EAAE;YACb,SAASF,aAAa,EAAE,KAAKE,MAAM,EAAE;YACrC,oBACI,oBAAC,2BACG,oBAACc,MAAIA;gBAAC,IAAI;eAAQd,MAAM,KAAK,iBAC7B,oBAACc,MAAIA;gBAAC,IAAI;gBAAO,MAAM;gBAAM,WAAW;eACnCd,MAAM,WAAW;YAI9B,SAAS;gBAELe,WAAW;oBACPpB,mBAAmB;wBACf,YAAY;4BACR,GAAGJ,UAAU;4BACb,OAAOS,MAAM,EAAE;wBACnB;oBACJ;gBACJ,GAAG;YACP;2BAGR,oBAACa,aAAa,SAAS,uBACvB,oBAACA,aAAa,IAAI;QACd,SAAS,IAAMnB,eAAe;gBAAEH;YAAW;QAC3C,MAAM;QACN,UAAUW;;AAI1B"}
@@ -1,5 +1,5 @@
1
1
  import react, { useCallback, useState } from "react";
2
- import slugify from "slugify";
2
+ import { useStringFormatter } from "@webiny/app-admin/features/stringFormatter/useStringFormatter.js";
3
3
  import { Grid, Input } from "@webiny/admin-ui";
4
4
  import { useDialogs, useSnackbar } from "@webiny/app-admin";
5
5
  import { Bind, useForm } from "@webiny/form";
@@ -11,14 +11,10 @@ import { ParentFolderField } from "./ParentFolderField.js";
11
11
  const FormComponent = ({ currentParentId = null })=>{
12
12
  const [parentId, setParentId] = useState(currentParentId);
13
13
  const form = useForm();
14
+ const stringFormatter = useStringFormatter();
14
15
  const generateSlug = ()=>{
15
16
  if (form.data.slug || !form.data.title) return;
16
- form.setValue("slug", slugify(form.data.title, {
17
- replacement: "-",
18
- lower: true,
19
- remove: /[*#?<>_{}[\]+~.()'"!:;@]/g,
20
- trim: false
21
- }));
17
+ form.setValue("slug", stringFormatter.slugify(form.data.title));
22
18
  };
23
19
  return /*#__PURE__*/ react.createElement(react.Fragment, null, /*#__PURE__*/ react.createElement(Grid, null, /*#__PURE__*/ react.createElement(Grid.Column, {
24
20
  span: 12
@@ -1 +1 @@
1
- {"version":3,"file":"dialogs/useCreateDialog.js","sources":["../../src/dialogs/useCreateDialog.tsx"],"sourcesContent":["import React, { useCallback, useState } from \"react\";\nimport slugify from \"slugify\";\nimport { Grid, Input } from \"@webiny/admin-ui\";\nimport { useDialogs, useSnackbar } from \"@webiny/app-admin\";\nimport type { GenericFormData } from \"@webiny/form\";\nimport { Bind, useForm } from \"@webiny/form\";\nimport { validation } from \"@webiny/validation\";\nimport { FolderTree } from \"~/components/index.js\";\nimport { ROOT_FOLDER } from \"~/constants.js\";\nimport type { FolderDto } from \"~/domain/folder/FolderDto.js\";\nimport { useCreateFolder } from \"~/features/folders/createFolder/index.js\";\nimport { ParentFolderField } from \"./ParentFolderField.js\";\n\ninterface ShowDialogParams {\n currentParentId?: string | null;\n}\n\ninterface UseCreateDialogResponse {\n showDialog: (params?: ShowDialogParams) => void;\n}\n\ninterface FormComponentProps {\n currentParentId?: string | null;\n}\n\nconst FormComponent = ({ currentParentId = null }: FormComponentProps) => {\n const [parentId, setParentId] = useState<string | null>(currentParentId);\n const form = useForm();\n\n const generateSlug = () => {\n if (form.data.slug || !form.data.title) {\n return;\n }\n\n // We want to update slug only when the folder is first being created.\n form.setValue(\n \"slug\",\n slugify(form.data.title, {\n replacement: \"-\",\n lower: true,\n remove: /[*#?<>_{}[\\]+~.()'\"!:;@]/g,\n trim: false\n })\n );\n };\n\n return (\n <>\n <Grid>\n <Grid.Column span={12}>\n <Bind name={\"title\"} validators={validation.create(\"required\")}>\n {bind => (\n <Input\n {...bind}\n label={\"Title\"}\n onBlur={generateSlug}\n size={\"lg\"}\n required\n autoFocus={true}\n />\n )}\n </Bind>\n </Grid.Column>\n <Grid.Column span={12}>\n <Bind name={\"slug\"} validators={validation.create(\"required,slug\")}>\n <Input label={\"Slug\"} size={\"lg\"} required />\n </Bind>\n </Grid.Column>\n <Grid.Column span={12}>\n <ParentFolderField>\n <Bind name={\"parentId\"} defaultValue={parentId}>\n {({ onChange }) => (\n <FolderTree\n focusedFolderId={parentId || ROOT_FOLDER}\n onFolderClick={folder => {\n setParentId(folder.id);\n onChange(folder.id === ROOT_FOLDER ? null : folder.id);\n }}\n />\n )}\n </Bind>\n </ParentFolderField>\n </Grid.Column>\n </Grid>\n </>\n );\n};\n\nexport const useCreateDialog = (): UseCreateDialogResponse => {\n const dialogs = useDialogs();\n const { createFolder } = useCreateFolder();\n const { showSnackbar } = useSnackbar();\n\n const onAccept = useCallback(async (data: FolderDto) => {\n try {\n await createFolder({\n ...data,\n parentId: data.parentId === ROOT_FOLDER ? null : data.parentId\n });\n showSnackbar(\"Folder created successfully!\");\n } catch (error) {\n showSnackbar(error.message);\n }\n }, []);\n\n const showDialog = (params?: ShowDialogParams) => {\n const { currentParentId = null } = params ?? {};\n\n dialogs.showDialog({\n title: \"Create a new folder\",\n content: <FormComponent currentParentId={currentParentId} />,\n acceptLabel: \"Create folder\",\n cancelLabel: \"Cancel\",\n loadingLabel: \"Creating folder...\",\n /**\n * We need to cast as there are no generics to pass for the onAccept function.\n */\n onAccept: onAccept as (data: GenericFormData) => Promise<void>\n });\n };\n\n return {\n showDialog\n };\n};\n"],"names":["FormComponent","currentParentId","parentId","setParentId","useState","form","useForm","generateSlug","slugify","Grid","Bind","validation","bind","Input","ParentFolderField","onChange","FolderTree","ROOT_FOLDER","folder","useCreateDialog","dialogs","useDialogs","createFolder","useCreateFolder","showSnackbar","useSnackbar","onAccept","useCallback","data","error","showDialog","params"],"mappings":";;;;;;;;;;AAyBA,MAAMA,gBAAgB,CAAC,EAAEC,kBAAkB,IAAI,EAAsB;IACjE,MAAM,CAACC,UAAUC,YAAY,GAAGC,SAAwBH;IACxD,MAAMI,OAAOC;IAEb,MAAMC,eAAe;QACjB,IAAIF,KAAK,IAAI,CAAC,IAAI,IAAI,CAACA,KAAK,IAAI,CAAC,KAAK,EAClC;QAIJA,KAAK,QAAQ,CACT,QACAG,QAAQH,KAAK,IAAI,CAAC,KAAK,EAAE;YACrB,aAAa;YACb,OAAO;YACP,QAAQ;YACR,MAAM;QACV;IAER;IAEA,OAAO,WAAP,GACI,wDACI,oBAACI,MAAIA,MAAAA,WAAAA,GACD,oBAACA,KAAK,MAAM;QAAC,MAAM;qBACf,oBAACC,MAAIA;QAAC,MAAM;QAAS,YAAYC,WAAW,MAAM,CAAC;OAC9CC,CAAAA,OAAAA,WAAAA,GACG,oBAACC,OAAKA;YACD,GAAGD,IAAI;YACR,OAAO;YACP,QAAQL;YACR,MAAM;YACN;YACA,WAAW;4BAK3B,oBAACE,KAAK,MAAM;QAAC,MAAM;qBACf,oBAACC,MAAIA;QAAC,MAAM;QAAQ,YAAYC,WAAW,MAAM,CAAC;qBAC9C,oBAACE,OAAKA;QAAC,OAAO;QAAQ,MAAM;QAAM;wBAG1C,oBAACJ,KAAK,MAAM;QAAC,MAAM;qBACf,oBAACK,mBAAiBA,MAAAA,WAAAA,GACd,oBAACJ,MAAIA;QAAC,MAAM;QAAY,cAAcR;OACjC,CAAC,EAAEa,QAAQ,EAAE,iBACV,oBAACC,YAAUA;YACP,iBAAiBd,YAAYe;YAC7B,eAAeC,CAAAA;gBACXf,YAAYe,OAAO,EAAE;gBACrBH,SAASG,OAAO,EAAE,KAAKD,cAAc,OAAOC,OAAO,EAAE;YACzD;;AASpC;AAEO,MAAMC,kBAAkB;IAC3B,MAAMC,UAAUC;IAChB,MAAM,EAAEC,YAAY,EAAE,GAAGC;IACzB,MAAM,EAAEC,YAAY,EAAE,GAAGC;IAEzB,MAAMC,WAAWC,YAAY,OAAOC;QAChC,IAAI;YACA,MAAMN,aAAa;gBACf,GAAGM,IAAI;gBACP,UAAUA,KAAK,QAAQ,KAAKX,cAAc,OAAOW,KAAK,QAAQ;YAClE;YACAJ,aAAa;QACjB,EAAE,OAAOK,OAAO;YACZL,aAAaK,MAAM,OAAO;QAC9B;IACJ,GAAG,EAAE;IAEL,MAAMC,aAAa,CAACC;QAChB,MAAM,EAAE9B,kBAAkB,IAAI,EAAE,GAAG8B,UAAU,CAAC;QAE9CX,QAAQ,UAAU,CAAC;YACf,OAAO;YACP,SAAS,WAAT,GAAS,oBAACpB,eAAaA;gBAAC,iBAAiBC;;YACzC,aAAa;YACb,aAAa;YACb,cAAc;YAId,UAAUyB;QACd;IACJ;IAEA,OAAO;QACHI;IACJ;AACJ"}
1
+ {"version":3,"file":"dialogs/useCreateDialog.js","sources":["../../src/dialogs/useCreateDialog.tsx"],"sourcesContent":["import React, { useCallback, useState } from \"react\";\nimport { useStringFormatter } from \"@webiny/app-admin/features/stringFormatter/useStringFormatter.js\";\nimport { Grid, Input } from \"@webiny/admin-ui\";\nimport { useDialogs, useSnackbar } from \"@webiny/app-admin\";\nimport type { GenericFormData } from \"@webiny/form\";\nimport { Bind, useForm } from \"@webiny/form\";\nimport { validation } from \"@webiny/validation\";\nimport { FolderTree } from \"~/components/index.js\";\nimport { ROOT_FOLDER } from \"~/constants.js\";\nimport type { FolderDto } from \"~/domain/folder/FolderDto.js\";\nimport { useCreateFolder } from \"~/features/folders/createFolder/index.js\";\nimport { ParentFolderField } from \"./ParentFolderField.js\";\n\ninterface ShowDialogParams {\n currentParentId?: string | null;\n}\n\ninterface UseCreateDialogResponse {\n showDialog: (params?: ShowDialogParams) => void;\n}\n\ninterface FormComponentProps {\n currentParentId?: string | null;\n}\n\nconst FormComponent = ({ currentParentId = null }: FormComponentProps) => {\n const [parentId, setParentId] = useState<string | null>(currentParentId);\n const form = useForm();\n const stringFormatter = useStringFormatter();\n\n const generateSlug = () => {\n if (form.data.slug || !form.data.title) {\n return;\n }\n\n // We want to update slug only when the folder is first being created.\n form.setValue(\"slug\", stringFormatter.slugify(form.data.title));\n };\n\n return (\n <>\n <Grid>\n <Grid.Column span={12}>\n <Bind name={\"title\"} validators={validation.create(\"required\")}>\n {bind => (\n <Input\n {...bind}\n label={\"Title\"}\n onBlur={generateSlug}\n size={\"lg\"}\n required\n autoFocus={true}\n />\n )}\n </Bind>\n </Grid.Column>\n <Grid.Column span={12}>\n <Bind name={\"slug\"} validators={validation.create(\"required,slug\")}>\n <Input label={\"Slug\"} size={\"lg\"} required />\n </Bind>\n </Grid.Column>\n <Grid.Column span={12}>\n <ParentFolderField>\n <Bind name={\"parentId\"} defaultValue={parentId}>\n {({ onChange }) => (\n <FolderTree\n focusedFolderId={parentId || ROOT_FOLDER}\n onFolderClick={folder => {\n setParentId(folder.id);\n onChange(folder.id === ROOT_FOLDER ? null : folder.id);\n }}\n />\n )}\n </Bind>\n </ParentFolderField>\n </Grid.Column>\n </Grid>\n </>\n );\n};\n\nexport const useCreateDialog = (): UseCreateDialogResponse => {\n const dialogs = useDialogs();\n const { createFolder } = useCreateFolder();\n const { showSnackbar } = useSnackbar();\n\n const onAccept = useCallback(async (data: FolderDto) => {\n try {\n await createFolder({\n ...data,\n parentId: data.parentId === ROOT_FOLDER ? null : data.parentId\n });\n showSnackbar(\"Folder created successfully!\");\n } catch (error) {\n showSnackbar(error.message);\n }\n }, []);\n\n const showDialog = (params?: ShowDialogParams) => {\n const { currentParentId = null } = params ?? {};\n\n dialogs.showDialog({\n title: \"Create a new folder\",\n content: <FormComponent currentParentId={currentParentId} />,\n acceptLabel: \"Create folder\",\n cancelLabel: \"Cancel\",\n loadingLabel: \"Creating folder...\",\n /**\n * We need to cast as there are no generics to pass for the onAccept function.\n */\n onAccept: onAccept as (data: GenericFormData) => Promise<void>\n });\n };\n\n return {\n showDialog\n };\n};\n"],"names":["FormComponent","currentParentId","parentId","setParentId","useState","form","useForm","stringFormatter","useStringFormatter","generateSlug","Grid","Bind","validation","bind","Input","ParentFolderField","onChange","FolderTree","ROOT_FOLDER","folder","useCreateDialog","dialogs","useDialogs","createFolder","useCreateFolder","showSnackbar","useSnackbar","onAccept","useCallback","data","error","showDialog","params"],"mappings":";;;;;;;;;;AAyBA,MAAMA,gBAAgB,CAAC,EAAEC,kBAAkB,IAAI,EAAsB;IACjE,MAAM,CAACC,UAAUC,YAAY,GAAGC,SAAwBH;IACxD,MAAMI,OAAOC;IACb,MAAMC,kBAAkBC;IAExB,MAAMC,eAAe;QACjB,IAAIJ,KAAK,IAAI,CAAC,IAAI,IAAI,CAACA,KAAK,IAAI,CAAC,KAAK,EAClC;QAIJA,KAAK,QAAQ,CAAC,QAAQE,gBAAgB,OAAO,CAACF,KAAK,IAAI,CAAC,KAAK;IACjE;IAEA,OAAO,WAAP,GACI,wDACI,oBAACK,MAAIA,MAAAA,WAAAA,GACD,oBAACA,KAAK,MAAM;QAAC,MAAM;qBACf,oBAACC,MAAIA;QAAC,MAAM;QAAS,YAAYC,WAAW,MAAM,CAAC;OAC9CC,CAAAA,OAAAA,WAAAA,GACG,oBAACC,OAAKA;YACD,GAAGD,IAAI;YACR,OAAO;YACP,QAAQJ;YACR,MAAM;YACN;YACA,WAAW;4BAK3B,oBAACC,KAAK,MAAM;QAAC,MAAM;qBACf,oBAACC,MAAIA;QAAC,MAAM;QAAQ,YAAYC,WAAW,MAAM,CAAC;qBAC9C,oBAACE,OAAKA;QAAC,OAAO;QAAQ,MAAM;QAAM;wBAG1C,oBAACJ,KAAK,MAAM;QAAC,MAAM;qBACf,oBAACK,mBAAiBA,MAAAA,WAAAA,GACd,oBAACJ,MAAIA;QAAC,MAAM;QAAY,cAAcT;OACjC,CAAC,EAAEc,QAAQ,EAAE,iBACV,oBAACC,YAAUA;YACP,iBAAiBf,YAAYgB;YAC7B,eAAeC,CAAAA;gBACXhB,YAAYgB,OAAO,EAAE;gBACrBH,SAASG,OAAO,EAAE,KAAKD,cAAc,OAAOC,OAAO,EAAE;YACzD;;AASpC;AAEO,MAAMC,kBAAkB;IAC3B,MAAMC,UAAUC;IAChB,MAAM,EAAEC,YAAY,EAAE,GAAGC;IACzB,MAAM,EAAEC,YAAY,EAAE,GAAGC;IAEzB,MAAMC,WAAWC,YAAY,OAAOC;QAChC,IAAI;YACA,MAAMN,aAAa;gBACf,GAAGM,IAAI;gBACP,UAAUA,KAAK,QAAQ,KAAKX,cAAc,OAAOW,KAAK,QAAQ;YAClE;YACAJ,aAAa;QACjB,EAAE,OAAOK,OAAO;YACZL,aAAaK,MAAM,OAAO;QAC9B;IACJ,GAAG,EAAE;IAEL,MAAMC,aAAa,CAACC;QAChB,MAAM,EAAE/B,kBAAkB,IAAI,EAAE,GAAG+B,UAAU,CAAC;QAE9CX,QAAQ,UAAU,CAAC;YACf,OAAO;YACP,SAAS,WAAT,GAAS,oBAACrB,eAAaA;gBAAC,iBAAiBC;;YACzC,aAAa;YACb,aAAa;YACb,cAAc;YAId,UAAU0B;QACd;IACJ;IAEA,OAAO;QACHI;IACJ;AACJ"}
@@ -1,8 +1,10 @@
1
1
  import type { Folder } from "../../../domain/folder/Folder.js";
2
- import { ListCache } from "../../../features/folders/cache/ListCache.js";
2
+ import { type IListCache, ListCache } from "../../../features/folders/cache/ListCache.js";
3
3
  export declare class FoldersCacheFactory {
4
4
  private cache;
5
5
  getCache(namespace: string): ListCache<Folder>;
6
+ /** Every folder type's cache created so far. */
7
+ getCaches(): IListCache<Folder>[];
6
8
  private getCacheKey;
7
9
  }
8
10
  export declare const folderCacheFactory: FoldersCacheFactory;
@@ -5,6 +5,11 @@ class FoldersCacheFactory {
5
5
  if (!this.cache.has(cacheKey)) this.cache.set(cacheKey, new ListCache());
6
6
  return this.cache.get(cacheKey);
7
7
  }
8
+ getCaches() {
9
+ return [
10
+ ...this.cache.values()
11
+ ];
12
+ }
8
13
  getCacheKey(namespace) {
9
14
  return namespace;
10
15
  }
@@ -1 +1 @@
1
- {"version":3,"file":"features/folders/cache/FoldersCacheFactory.js","sources":["../../../../src/features/folders/cache/FoldersCacheFactory.ts"],"sourcesContent":["import type { Folder } from \"~/domain/folder/Folder.js\";\nimport { type IListCache, ListCache } from \"~/features/folders/cache/ListCache.js\";\n\nexport class FoldersCacheFactory {\n private cache: Map<string, IListCache<Folder>> = new Map();\n\n getCache(namespace: string) {\n const cacheKey = this.getCacheKey(namespace);\n\n if (!this.cache.has(cacheKey)) {\n this.cache.set(cacheKey, new ListCache<Folder>());\n }\n\n return this.cache.get(cacheKey) as ListCache<Folder>;\n }\n\n private getCacheKey(namespace: string) {\n return namespace;\n }\n}\n\nexport const folderCacheFactory = new FoldersCacheFactory();\n"],"names":["FoldersCacheFactory","namespace","cacheKey","ListCache","Map","folderCacheFactory"],"mappings":";AAGO,MAAMA;IAGT,SAASC,SAAiB,EAAE;QACxB,MAAMC,WAAW,IAAI,CAAC,WAAW,CAACD;QAElC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAACC,WAChB,IAAI,CAAC,KAAK,CAAC,GAAG,CAACA,UAAU,IAAIC;QAGjC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAACD;IAC1B;IAEQ,YAAYD,SAAiB,EAAE;QACnC,OAAOA;IACX;;aAdQ,KAAK,GAAoC,IAAIG;;AAezD;AAEO,MAAMC,qBAAqB,IAAIL"}
1
+ {"version":3,"file":"features/folders/cache/FoldersCacheFactory.js","sources":["../../../../src/features/folders/cache/FoldersCacheFactory.ts"],"sourcesContent":["import type { Folder } from \"~/domain/folder/Folder.js\";\nimport { type IListCache, ListCache } from \"~/features/folders/cache/ListCache.js\";\n\nexport class FoldersCacheFactory {\n private cache: Map<string, IListCache<Folder>> = new Map();\n\n getCache(namespace: string) {\n const cacheKey = this.getCacheKey(namespace);\n\n if (!this.cache.has(cacheKey)) {\n this.cache.set(cacheKey, new ListCache<Folder>());\n }\n\n return this.cache.get(cacheKey) as ListCache<Folder>;\n }\n\n /** Every folder type's cache created so far. */\n getCaches() {\n return [...this.cache.values()];\n }\n\n private getCacheKey(namespace: string) {\n return namespace;\n }\n}\n\nexport const folderCacheFactory = new FoldersCacheFactory();\n"],"names":["FoldersCacheFactory","namespace","cacheKey","ListCache","Map","folderCacheFactory"],"mappings":";AAGO,MAAMA;IAGT,SAASC,SAAiB,EAAE;QACxB,MAAMC,WAAW,IAAI,CAAC,WAAW,CAACD;QAElC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAACC,WAChB,IAAI,CAAC,KAAK,CAAC,GAAG,CAACA,UAAU,IAAIC;QAGjC,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAACD;IAC1B;IAGA,YAAY;QACR,OAAO;eAAI,IAAI,CAAC,KAAK,CAAC,MAAM;SAAG;IACnC;IAEQ,YAAYD,SAAiB,EAAE;QACnC,OAAOA;IACX;;aAnBQ,KAAK,GAAoC,IAAIG;;AAoBzD;AAEO,MAAMC,qBAAqB,IAAIL"}
@@ -0,0 +1,12 @@
1
+ import { Folder } from "../../../domain/folder/Folder.js";
2
+ import type { IListCache } from "./ListCache.js";
3
+ /**
4
+ * Re-derives the inherited permissions of one cached folder from its parent, and returns it.
5
+ */
6
+ export declare const updateFolderPermissions: (cache: IListCache<Folder>, folderId: string, parentFolder: Folder | undefined) => Folder;
7
+ /**
8
+ * Folders inherit their parent's permissions, and the cache holds each folder's resolved list. So
9
+ * when a folder's permissions change, every cached folder below it is stale too. This walks the
10
+ * cached descendants and re-derives theirs, the same way the server resolves them on read.
11
+ */
12
+ export declare const updateDescendantPermissions: (cache: IListCache<Folder>, folder: Folder) => void;
@@ -0,0 +1,27 @@
1
+ import { Permissions } from "@webiny/shared-aco";
2
+ import { Folder } from "../../../domain/folder/Folder.js";
3
+ const listDirectChildren = (cache, folder)=>cache.getItems().filter((f)=>f.parentId === folder.id);
4
+ const updateFolderPermissions = (cache, folderId, parentFolder)=>{
5
+ let updatedFolder;
6
+ cache.updateItems((f)=>{
7
+ if (f.id === folderId) {
8
+ const permissions = Permissions.create(f.permissions, parentFolder);
9
+ updatedFolder = Folder.create({
10
+ ...f,
11
+ permissions
12
+ });
13
+ return updatedFolder;
14
+ }
15
+ return f;
16
+ });
17
+ return updatedFolder;
18
+ };
19
+ const updateDescendantPermissions = (cache, folder)=>{
20
+ for (const child of listDirectChildren(cache, folder)){
21
+ const updatedChild = updateFolderPermissions(cache, child.id, folder);
22
+ updateDescendantPermissions(cache, updatedChild);
23
+ }
24
+ };
25
+ export { updateDescendantPermissions, updateFolderPermissions };
26
+
27
+ //# sourceMappingURL=updateDescendantPermissions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/folders/cache/updateDescendantPermissions.js","sources":["../../../../src/features/folders/cache/updateDescendantPermissions.ts"],"sourcesContent":["import { Permissions } from \"@webiny/shared-aco\";\nimport { Folder } from \"~/domain/folder/Folder.js\";\nimport type { IListCache } from \"./ListCache.js\";\n\nconst listDirectChildren = (cache: IListCache<Folder>, folder: Folder) => {\n return cache.getItems().filter(f => f.parentId === folder.id);\n};\n\n/**\n * Re-derives the inherited permissions of one cached folder from its parent, and returns it.\n */\nexport const updateFolderPermissions = (\n cache: IListCache<Folder>,\n folderId: string,\n parentFolder: Folder | undefined\n): Folder => {\n let updatedFolder: Folder | undefined;\n cache.updateItems(f => {\n if (f.id === folderId) {\n const permissions = Permissions.create(f.permissions, parentFolder);\n updatedFolder = Folder.create({ ...f, permissions });\n return updatedFolder;\n }\n return f;\n });\n\n return updatedFolder!;\n};\n\n/**\n * Folders inherit their parent's permissions, and the cache holds each folder's resolved list. So\n * when a folder's permissions change, every cached folder below it is stale too. This walks the\n * cached descendants and re-derives theirs, the same way the server resolves them on read.\n */\nexport const updateDescendantPermissions = (cache: IListCache<Folder>, folder: Folder) => {\n for (const child of listDirectChildren(cache, folder)) {\n const updatedChild = updateFolderPermissions(cache, child.id, folder);\n updateDescendantPermissions(cache, updatedChild);\n }\n};\n"],"names":["listDirectChildren","cache","folder","f","updateFolderPermissions","folderId","parentFolder","updatedFolder","permissions","Permissions","Folder","updateDescendantPermissions","child","updatedChild"],"mappings":";;AAIA,MAAMA,qBAAqB,CAACC,OAA2BC,SAC5CD,MAAM,QAAQ,GAAG,MAAM,CAACE,CAAAA,IAAKA,EAAE,QAAQ,KAAKD,OAAO,EAAE;AAMzD,MAAME,0BAA0B,CACnCH,OACAI,UACAC;IAEA,IAAIC;IACJN,MAAM,WAAW,CAACE,CAAAA;QACd,IAAIA,EAAE,EAAE,KAAKE,UAAU;YACnB,MAAMG,cAAcC,YAAY,MAAM,CAACN,EAAE,WAAW,EAAEG;YACtDC,gBAAgBG,OAAO,MAAM,CAAC;gBAAE,GAAGP,CAAC;gBAAEK;YAAY;YAClD,OAAOD;QACX;QACA,OAAOJ;IACX;IAEA,OAAOI;AACX;AAOO,MAAMI,8BAA8B,CAACV,OAA2BC;IACnE,KAAK,MAAMU,SAASZ,mBAAmBC,OAAOC,QAAS;QACnD,MAAMW,eAAeT,wBAAwBH,OAAOW,MAAM,EAAE,EAAEV;QAC9DS,4BAA4BV,OAAOY;IACvC;AACJ"}
@@ -0,0 +1,22 @@
1
+ import { GetFolderGateway } from "../../../features/folders/getFolder/abstractions.js";
2
+ import { FolderCreatedEventHandler } from "./abstractions.js";
3
+ /**
4
+ * Reads the folder back and puts it in the cache for its type, so every open folder tree of that
5
+ * type shows it.
6
+ *
7
+ * Read back rather than taken from the event, so the folder has the same fields and the same
8
+ * permission checks as any other the admin loads. `addItems` replaces by id, so an event that
9
+ * arrives twice, or for a folder already loaded, changes nothing.
10
+ *
11
+ * The cache is reached through `folderCacheFactory` rather than injected, because this runs in the
12
+ * root container and each folder type's cache is registered in its own view's child container.
13
+ */
14
+ declare class AddCreatedFolderToCacheImpl implements FolderCreatedEventHandler.Interface {
15
+ private getFolder;
16
+ constructor(getFolder: GetFolderGateway.Interface);
17
+ handle(event: FolderCreatedEventHandler.Event): Promise<void>;
18
+ }
19
+ export declare const AddCreatedFolderToCache: typeof AddCreatedFolderToCacheImpl & {
20
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/app/features/eventPublisher/abstractions.js").IEventHandler<import("./FolderCreatedEvent.js").FolderCreatedEvent>>;
21
+ };
22
+ export {};
@@ -0,0 +1,24 @@
1
+ import { GetFolderGateway } from "../getFolder/abstractions.js";
2
+ import { folderCacheFactory } from "../cache/index.js";
3
+ import { Folder } from "../../../domain/folder/Folder.js";
4
+ import { FolderCreatedEventHandler } from "./abstractions.js";
5
+ class AddCreatedFolderToCacheImpl {
6
+ constructor(getFolder){
7
+ this.getFolder = getFolder;
8
+ }
9
+ async handle(event) {
10
+ const folder = Folder.create(await this.getFolder.execute(event.payload.id));
11
+ folderCacheFactory.getCache(folder.type).addItems([
12
+ folder
13
+ ]);
14
+ }
15
+ }
16
+ const AddCreatedFolderToCache = FolderCreatedEventHandler.createImplementation({
17
+ implementation: AddCreatedFolderToCacheImpl,
18
+ dependencies: [
19
+ GetFolderGateway
20
+ ]
21
+ });
22
+ export { AddCreatedFolderToCache };
23
+
24
+ //# sourceMappingURL=AddCreatedFolderToCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/folders/folderEvents/AddCreatedFolderToCache.js","sources":["../../../../src/features/folders/folderEvents/AddCreatedFolderToCache.ts"],"sourcesContent":["import { GetFolderGateway } from \"~/features/folders/getFolder/abstractions.js\";\nimport { folderCacheFactory } from \"~/features/folders/cache/index.js\";\nimport { Folder } from \"~/domain/folder/Folder.js\";\nimport { FolderCreatedEventHandler } from \"./abstractions.js\";\n\n/**\n * Reads the folder back and puts it in the cache for its type, so every open folder tree of that\n * type shows it.\n *\n * Read back rather than taken from the event, so the folder has the same fields and the same\n * permission checks as any other the admin loads. `addItems` replaces by id, so an event that\n * arrives twice, or for a folder already loaded, changes nothing.\n *\n * The cache is reached through `folderCacheFactory` rather than injected, because this runs in the\n * root container and each folder type's cache is registered in its own view's child container.\n */\nclass AddCreatedFolderToCacheImpl implements FolderCreatedEventHandler.Interface {\n constructor(private getFolder: GetFolderGateway.Interface) {}\n\n async handle(event: FolderCreatedEventHandler.Event): Promise<void> {\n const folder = Folder.create(await this.getFolder.execute(event.payload.id));\n\n folderCacheFactory.getCache(folder.type).addItems([folder]);\n }\n}\n\nexport const AddCreatedFolderToCache = FolderCreatedEventHandler.createImplementation({\n implementation: AddCreatedFolderToCacheImpl,\n dependencies: [GetFolderGateway]\n});\n"],"names":["AddCreatedFolderToCacheImpl","getFolder","event","folder","Folder","folderCacheFactory","AddCreatedFolderToCache","FolderCreatedEventHandler","GetFolderGateway"],"mappings":";;;;AAgBA,MAAMA;IACF,YAAoBC,SAAqC,CAAE;aAAvCA,SAAS,GAATA;IAAwC;IAE5D,MAAM,OAAOC,KAAsC,EAAiB;QAChE,MAAMC,SAASC,OAAO,MAAM,CAAC,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAACF,MAAM,OAAO,CAAC,EAAE;QAE1EG,mBAAmB,QAAQ,CAACF,OAAO,IAAI,EAAE,QAAQ,CAAC;YAACA;SAAO;IAC9D;AACJ;AAEO,MAAMG,0BAA0BC,0BAA0B,oBAAoB,CAAC;IAClF,gBAAgBP;IAChB,cAAc;QAACQ;KAAiB;AACpC"}
@@ -0,0 +1,14 @@
1
+ import { BaseEvent } from "@webiny/app/features/eventPublisher/index.js";
2
+ export interface FolderCreatedPayload {
3
+ id: string;
4
+ }
5
+ /**
6
+ * A folder now exists that the admin's cache may not have.
7
+ *
8
+ * Deliberately says nothing about where the news came from. The websocket is one source today; the
9
+ * palette or a background task can publish the same event, and the handlers do not change.
10
+ */
11
+ export declare class FolderCreatedEvent extends BaseEvent<FolderCreatedPayload> {
12
+ readonly eventType: "Aco/FolderCreated";
13
+ getHandlerAbstraction(): import("@webiny/di").Abstraction<import("@webiny/app/features/eventPublisher/abstractions.js").IEventHandler<FolderCreatedEvent>>;
14
+ }
@@ -0,0 +1,13 @@
1
+ import { BaseEvent } from "@webiny/app/features/eventPublisher/index.js";
2
+ import { FolderCreatedEventHandler } from "./abstractions.js";
3
+ class FolderCreatedEvent extends BaseEvent {
4
+ getHandlerAbstraction() {
5
+ return FolderCreatedEventHandler;
6
+ }
7
+ constructor(...args){
8
+ super(...args), this.eventType = "Aco/FolderCreated";
9
+ }
10
+ }
11
+ export { FolderCreatedEvent };
12
+
13
+ //# sourceMappingURL=FolderCreatedEvent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/folders/folderEvents/FolderCreatedEvent.js","sources":["../../../../src/features/folders/folderEvents/FolderCreatedEvent.ts"],"sourcesContent":["import { BaseEvent } from \"@webiny/app/features/eventPublisher/index.js\";\nimport { FolderCreatedEventHandler } from \"./abstractions.js\";\n\nexport interface FolderCreatedPayload {\n id: string;\n}\n\n/**\n * A folder now exists that the admin's cache may not have.\n *\n * Deliberately says nothing about where the news came from. The websocket is one source today; the\n * palette or a background task can publish the same event, and the handlers do not change.\n */\nexport class FolderCreatedEvent extends BaseEvent<FolderCreatedPayload> {\n readonly eventType = \"Aco/FolderCreated\" as const;\n\n getHandlerAbstraction() {\n return FolderCreatedEventHandler;\n }\n}\n"],"names":["FolderCreatedEvent","BaseEvent","FolderCreatedEventHandler"],"mappings":";;AAaO,MAAMA,2BAA2BC;IAGpC,wBAAwB;QACpB,OAAOC;IACX;;QALG,qBACM,SAAS,GAAG;;AAKzB"}
@@ -0,0 +1,9 @@
1
+ import { BaseEvent } from "@webiny/app/features/eventPublisher/index.js";
2
+ export interface FolderDeletedPayload {
3
+ id: string;
4
+ }
5
+ /** A folder no longer exists, and the admin's cache may still hold it. */
6
+ export declare class FolderDeletedEvent extends BaseEvent<FolderDeletedPayload> {
7
+ readonly eventType: "Aco/FolderDeleted";
8
+ getHandlerAbstraction(): import("@webiny/di").Abstraction<import("@webiny/app/features/eventPublisher/abstractions.js").IEventHandler<FolderDeletedEvent>>;
9
+ }
@@ -0,0 +1,13 @@
1
+ import { BaseEvent } from "@webiny/app/features/eventPublisher/index.js";
2
+ import { FolderDeletedEventHandler } from "./abstractions.js";
3
+ class FolderDeletedEvent extends BaseEvent {
4
+ getHandlerAbstraction() {
5
+ return FolderDeletedEventHandler;
6
+ }
7
+ constructor(...args){
8
+ super(...args), this.eventType = "Aco/FolderDeleted";
9
+ }
10
+ }
11
+ export { FolderDeletedEvent };
12
+
13
+ //# sourceMappingURL=FolderDeletedEvent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features/folders/folderEvents/FolderDeletedEvent.js","sources":["../../../../src/features/folders/folderEvents/FolderDeletedEvent.ts"],"sourcesContent":["import { BaseEvent } from \"@webiny/app/features/eventPublisher/index.js\";\nimport { FolderDeletedEventHandler } from \"./abstractions.js\";\n\nexport interface FolderDeletedPayload {\n id: string;\n}\n\n/** A folder no longer exists, and the admin's cache may still hold it. */\nexport class FolderDeletedEvent extends BaseEvent<FolderDeletedPayload> {\n readonly eventType = \"Aco/FolderDeleted\" as const;\n\n getHandlerAbstraction() {\n return FolderDeletedEventHandler;\n }\n}\n"],"names":["FolderDeletedEvent","BaseEvent","FolderDeletedEventHandler"],"mappings":";;AAQO,MAAMA,2BAA2BC;IAGpC,wBAAwB;QACpB,OAAOC;IACX;;QALG,qBACM,SAAS,GAAG;;AAKzB"}