@webiny/app-file-manager 6.4.11 → 6.6.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (235) hide show
  1. package/app.js +21 -2
  2. package/app.js.map +1 -1
  3. package/domain/tagsHelpers.d.ts +2 -2
  4. package/domain/types.d.ts +0 -8
  5. package/features/permissions/abstractions.d.ts +2 -2
  6. package/features/permissions/feature.d.ts +3 -3
  7. package/features/shared/FILE_FIELDS.js +4 -0
  8. package/features/shared/FILE_FIELDS.js.map +1 -1
  9. package/features/shared/FileFieldsProviderWithWcp.d.ts +5 -5
  10. package/features/shared/FileFieldsProviderWithWcp.js +7 -7
  11. package/features/shared/FileFieldsProviderWithWcp.js.map +1 -1
  12. package/modules/AiEnrichment/AiImageEnrichmentEventHandler.d.ts +18 -0
  13. package/modules/AiEnrichment/AiImageEnrichmentEventHandler.js +33 -0
  14. package/modules/AiEnrichment/AiImageEnrichmentEventHandler.js.map +1 -0
  15. package/modules/AiEnrichment/ReenrichFileGateway.d.ts +12 -0
  16. package/modules/AiEnrichment/ReenrichFileGateway.js +23 -0
  17. package/modules/AiEnrichment/ReenrichFileGateway.js.map +1 -0
  18. package/modules/AiEnrichment/ReenrichWithAi.d.ts +11 -0
  19. package/modules/AiEnrichment/ReenrichWithAi.js +57 -0
  20. package/modules/AiEnrichment/ReenrichWithAi.js.map +1 -0
  21. package/modules/AiEnrichment/ReenrichWithAiPresenter.d.ts +50 -0
  22. package/modules/AiEnrichment/ReenrichWithAiPresenter.js +114 -0
  23. package/modules/AiEnrichment/ReenrichWithAiPresenter.js.map +1 -0
  24. package/modules/AiEnrichment/StreamingPlaceholder.d.ts +15 -0
  25. package/modules/AiEnrichment/StreamingPlaceholder.js +32 -0
  26. package/modules/AiEnrichment/StreamingPlaceholder.js.map +1 -0
  27. package/modules/AiEnrichment/abstractions.d.ts +70 -0
  28. package/modules/AiEnrichment/abstractions.js +6 -0
  29. package/modules/AiEnrichment/abstractions.js.map +1 -0
  30. package/modules/AiEnrichment/feature.d.ts +3 -0
  31. package/modules/AiEnrichment/feature.js +21 -0
  32. package/modules/AiEnrichment/feature.js.map +1 -0
  33. package/modules/AiEnrichment/index.d.ts +2 -0
  34. package/modules/AiEnrichment/index.js +9 -0
  35. package/modules/AiEnrichment/index.js.map +1 -0
  36. package/modules/Enterprise/index.js +3 -3
  37. package/modules/Enterprise/index.js.map +1 -1
  38. package/modules/HeadlessCms/fieldType/AssetFieldSettingsModifier.d.ts +26 -0
  39. package/modules/HeadlessCms/fieldType/AssetFieldSettingsModifier.js +39 -0
  40. package/modules/HeadlessCms/fieldType/AssetFieldSettingsModifier.js.map +1 -0
  41. package/modules/HeadlessCms/fieldType/AssetFieldType.d.ts +34 -0
  42. package/modules/HeadlessCms/fieldType/AssetFieldType.js +42 -0
  43. package/modules/HeadlessCms/fieldType/AssetFieldType.js.map +1 -0
  44. package/modules/HeadlessCms/fieldType/AssetFormFieldType.d.ts +21 -0
  45. package/modules/HeadlessCms/fieldType/AssetFormFieldType.js +42 -0
  46. package/modules/HeadlessCms/fieldType/AssetFormFieldType.js.map +1 -0
  47. package/modules/HeadlessCms/fieldType/AssetInputRenderer.d.ts +15 -0
  48. package/modules/HeadlessCms/fieldType/AssetInputRenderer.js +20 -0
  49. package/modules/HeadlessCms/fieldType/AssetInputRenderer.js.map +1 -0
  50. package/modules/HeadlessCms/fieldType/AssetInputsRenderer.d.ts +15 -0
  51. package/modules/HeadlessCms/fieldType/AssetInputsRenderer.js +20 -0
  52. package/modules/HeadlessCms/fieldType/AssetInputsRenderer.js.map +1 -0
  53. package/modules/HeadlessCms/fieldType/FileFieldSettingsModifier.d.ts +16 -0
  54. package/modules/HeadlessCms/fieldType/FileFieldSettingsModifier.js +33 -0
  55. package/modules/HeadlessCms/fieldType/FileFieldSettingsModifier.js.map +1 -0
  56. package/modules/HeadlessCms/fieldType/FileFieldType.d.ts +25 -0
  57. package/modules/HeadlessCms/fieldType/FileFieldType.js +38 -0
  58. package/modules/HeadlessCms/fieldType/FileFieldType.js.map +1 -0
  59. package/modules/HeadlessCms/fieldType/FileInputRenderer.d.ts +15 -0
  60. package/modules/HeadlessCms/fieldType/FileInputRenderer.js +19 -0
  61. package/modules/HeadlessCms/fieldType/FileInputRenderer.js.map +1 -0
  62. package/modules/HeadlessCms/fieldType/FileInputsRenderer.d.ts +15 -0
  63. package/modules/HeadlessCms/fieldType/FileInputsRenderer.js +19 -0
  64. package/modules/HeadlessCms/fieldType/FileInputsRenderer.js.map +1 -0
  65. package/modules/HeadlessCms/fieldType/feature.d.ts +1 -0
  66. package/modules/HeadlessCms/fieldType/feature.js +27 -0
  67. package/modules/HeadlessCms/fieldType/feature.js.map +1 -0
  68. package/modules/HeadlessCms/fieldType/isAssetField.d.ts +2 -0
  69. package/modules/HeadlessCms/fieldType/isAssetField.js +4 -0
  70. package/modules/HeadlessCms/fieldType/isAssetField.js.map +1 -0
  71. package/package.json +24 -34
  72. package/presentation/FileActions/FileDetails/EditImage.d.ts +2 -0
  73. package/presentation/FileActions/FileDetails/EditImage.js +39 -0
  74. package/presentation/FileActions/FileDetails/EditImage.js.map +1 -0
  75. package/presentation/FileActions/index.js +8 -0
  76. package/presentation/FileActions/index.js.map +1 -1
  77. package/presentation/FileDetails/FileDetailsPresenter.d.ts +5 -4
  78. package/presentation/FileDetails/FileDetailsPresenter.js +40 -46
  79. package/presentation/FileDetails/FileDetailsPresenter.js.map +1 -1
  80. package/presentation/FileDetails/FileDetailsPresenter.test.js +39 -56
  81. package/presentation/FileDetails/FileDetailsPresenter.test.js.map +1 -1
  82. package/presentation/FileDetails/abstractions.d.ts +2 -0
  83. package/presentation/FileDetails/abstractions.js.map +1 -1
  84. package/presentation/FileDetails/components/Content.d.ts +6 -4
  85. package/presentation/FileDetails/components/Content.js +2 -2
  86. package/presentation/FileDetails/components/Content.js.map +1 -1
  87. package/presentation/FileDetails/components/FileDetailsDrawer.d.ts +2 -2
  88. package/presentation/FileDetails/components/FileDetailsDrawer.js +11 -5
  89. package/presentation/FileDetails/components/FileDetailsDrawer.js.map +1 -1
  90. package/presentation/FileList/FileListDataSource.d.ts +8 -12
  91. package/presentation/FileList/FileListDataSource.js +47 -87
  92. package/presentation/FileList/FileListDataSource.js.map +1 -1
  93. package/presentation/FileList/FileListPresenter.test.js +9 -3
  94. package/presentation/FileList/FileListPresenter.test.js.map +1 -1
  95. package/presentation/FileList/FileManagerPresenter.d.ts +1 -0
  96. package/presentation/FileList/FileManagerPresenter.js +15 -5
  97. package/presentation/FileList/FileManagerPresenter.js.map +1 -1
  98. package/presentation/FileList/abstractions.d.ts +3 -0
  99. package/presentation/FileList/abstractions.js.map +1 -1
  100. package/presentation/FileList/components/BulkActions/BulkActionBar.d.ts +2 -2
  101. package/presentation/FileList/components/BulkActions/BulkActionDelete.d.ts +2 -2
  102. package/presentation/FileList/components/BulkActions/BulkActionMove.d.ts +2 -2
  103. package/presentation/FileList/components/BulkActions/index.d.ts +0 -1
  104. package/presentation/FileList/components/BulkActions/index.js +0 -1
  105. package/presentation/FileList/components/BulkActions/useBulkActionWorker.d.ts +9 -8
  106. package/presentation/FileList/components/BulkActions/useBulkActionWorker.js +3 -9
  107. package/presentation/FileList/components/BulkActions/useBulkActionWorker.js.map +1 -1
  108. package/presentation/FileList/components/Filters/SubFoldersToggle.d.ts +2 -2
  109. package/presentation/FileList/components/Filters/TagsFilter.d.ts +2 -2
  110. package/presentation/FileList/components/Filters/TypeFilter.d.ts +2 -2
  111. package/presentation/FileList/components/Grid/FileGrid.d.ts +2 -2
  112. package/presentation/FileList/components/Grid/FileGrid.js +1 -1
  113. package/presentation/FileList/components/Grid/FileGrid.js.map +1 -1
  114. package/presentation/FileList/components/Grid/FileGrid.test.js +18 -7
  115. package/presentation/FileList/components/Grid/FileGrid.test.js.map +1 -1
  116. package/presentation/FileList/components/Header/FileManagerHeader.d.ts +2 -2
  117. package/presentation/FileList/components/Search/SearchBar.d.ts +2 -2
  118. package/presentation/FileList/components/Table/FileTable.d.ts +2 -2
  119. package/presentation/FileList/components/Table/FileTable.js +1 -1
  120. package/presentation/FileList/components/Table/FileTable.js.map +1 -1
  121. package/presentation/FileList/components/Table/FileTable.test.js +9 -4
  122. package/presentation/FileList/components/Table/FileTable.test.js.map +1 -1
  123. package/presentation/FileList/components/Upload/UploadProgress.d.ts +2 -2
  124. package/presentation/FileManager/FileManagerBreadcrumbs.d.ts +12 -0
  125. package/presentation/FileManager/FileManagerBreadcrumbs.js +37 -0
  126. package/presentation/FileManager/FileManagerBreadcrumbs.js.map +1 -0
  127. package/presentation/FileManager/FileManagerView.js +36 -2
  128. package/presentation/FileManager/FileManagerView.js.map +1 -1
  129. package/presentation/FileManager/RouteParamsSync.d.ts +2 -0
  130. package/presentation/FileManager/RouteParamsSync.js +30 -0
  131. package/presentation/FileManager/RouteParamsSync.js.map +1 -0
  132. package/presentation/Settings/components/SettingsView.d.ts +2 -2
  133. package/presentation/config/DefaultFileManagerConfig.js +13 -11
  134. package/presentation/config/DefaultFileManagerConfig.js.map +1 -1
  135. package/presentation/config/FileManagerViewConfig.d.ts +19 -25
  136. package/presentation/config/configComponents/Browser/BulkAction.d.ts +10 -8
  137. package/presentation/config/configComponents/Browser/BulkAction.js +3 -9
  138. package/presentation/config/configComponents/Browser/BulkAction.js.map +1 -1
  139. package/presentation/config/configComponents/Browser/FileAction.d.ts +2 -1
  140. package/presentation/config/configComponents/Browser/FolderAction.d.ts +2 -1
  141. package/presentation/config/configComponents/Browser/Table/Column.d.ts +9 -8
  142. package/presentation/config/configComponents/Browser/Table/index.d.ts +9 -9
  143. package/presentation/config/configComponents/Browser/index.d.ts +20 -20
  144. package/presentation/config/configComponents/Browser/index.js +0 -8
  145. package/presentation/config/configComponents/Browser/index.js.map +1 -1
  146. package/presentation/config/configComponents/FileDetails/index.d.ts +4 -2
  147. package/presentation/config/thumbnailRenderers/CroppedFileImage.d.ts +18 -0
  148. package/presentation/config/thumbnailRenderers/CroppedFileImage.js +66 -0
  149. package/presentation/config/thumbnailRenderers/CroppedFileImage.js.map +1 -0
  150. package/presentation/config/thumbnailRenderers/FilePreviewImageRenderer.js +6 -9
  151. package/presentation/config/thumbnailRenderers/FilePreviewImageRenderer.js.map +1 -1
  152. package/presentation/config/thumbnailRenderers/GridItemImageRenderer.js +6 -9
  153. package/presentation/config/thumbnailRenderers/GridItemImageRenderer.js.map +1 -1
  154. package/presentation/config/thumbnailRenderers/TableItemImageRenderer.js +6 -9
  155. package/presentation/config/thumbnailRenderers/TableItemImageRenderer.js.map +1 -1
  156. package/presentation/fieldRenderers/CmsAssetPickerRenderer.d.ts +22 -0
  157. package/presentation/fieldRenderers/CmsAssetPickerRenderer.js +56 -0
  158. package/presentation/fieldRenderers/CmsAssetPickerRenderer.js.map +1 -0
  159. package/presentation/fieldRenderers/CmsFilePickerRenderer.d.ts +13 -0
  160. package/presentation/fieldRenderers/CmsFilePickerRenderer.js +36 -0
  161. package/presentation/fieldRenderers/CmsFilePickerRenderer.js.map +1 -0
  162. package/presentation/fieldRenderers/CmsImageEditorDialog.d.ts +7 -0
  163. package/presentation/fieldRenderers/CmsImageEditorDialog.js +32 -0
  164. package/presentation/fieldRenderers/CmsImageEditorDialog.js.map +1 -0
  165. package/presentation/fieldRenderers/CmsMultiAssetPickerRenderer.d.ts +18 -0
  166. package/presentation/fieldRenderers/CmsMultiAssetPickerRenderer.js +88 -0
  167. package/presentation/fieldRenderers/CmsMultiAssetPickerRenderer.js.map +1 -0
  168. package/presentation/fieldRenderers/CmsMultiFilePickerRenderer.d.ts +13 -0
  169. package/presentation/fieldRenderers/CmsMultiFilePickerRenderer.js +60 -0
  170. package/presentation/fieldRenderers/CmsMultiFilePickerRenderer.js.map +1 -0
  171. package/presentation/fieldRenderers/CroppedAssetThumb.d.ts +15 -0
  172. package/presentation/fieldRenderers/CroppedAssetThumb.js +25 -0
  173. package/presentation/fieldRenderers/CroppedAssetThumb.js.map +1 -0
  174. package/presentation/fieldRenderers/assetValue.d.ts +10 -0
  175. package/presentation/fieldRenderers/assetValue.js +88 -0
  176. package/presentation/fieldRenderers/assetValue.js.map +1 -0
  177. package/presentation/hooks/useCmsImageEditor.d.ts +10 -0
  178. package/presentation/hooks/useCmsImageEditor.js +76 -0
  179. package/presentation/hooks/useCmsImageEditor.js.map +1 -0
  180. package/presentation/hooks/useEditImage.d.ts +14 -0
  181. package/presentation/hooks/useEditImage.js +67 -0
  182. package/presentation/hooks/useEditImage.js.map +1 -0
  183. package/routes.d.ts +1 -0
  184. package/routes.js +2 -1
  185. package/routes.js.map +1 -1
  186. package/modules/HeadlessCms/fileField.d.ts +0 -2
  187. package/modules/HeadlessCms/fileField.js +0 -44
  188. package/modules/HeadlessCms/fileField.js.map +0 -1
  189. package/modules/HeadlessCms/fileRenderer/fileField.d.ts +0 -2
  190. package/modules/HeadlessCms/fileRenderer/fileField.js +0 -53
  191. package/modules/HeadlessCms/fileRenderer/fileField.js.map +0 -1
  192. package/modules/HeadlessCms/fileRenderer/fileFields.d.ts +0 -2
  193. package/modules/HeadlessCms/fileRenderer/fileFields.js +0 -73
  194. package/modules/HeadlessCms/fileRenderer/fileFields.js.map +0 -1
  195. package/modules/HeadlessCms/fileRenderer/utils.d.ts +0 -2
  196. package/modules/HeadlessCms/fileRenderer/utils.js +0 -15
  197. package/modules/HeadlessCms/fileRenderer/utils.js.map +0 -1
  198. package/modules/HeadlessCms/index.d.ts +0 -1
  199. package/modules/HeadlessCms/index.js +0 -14
  200. package/modules/HeadlessCms/index.js.map +0 -1
  201. package/modules/Settings/graphql.d.ts +0 -12
  202. package/modules/Settings/graphql.js +0 -36
  203. package/modules/Settings/graphql.js.map +0 -1
  204. package/modules/Settings/views/FileManagerSettings.d.ts +0 -2
  205. package/modules/Settings/views/FileManagerSettings.js +0 -134
  206. package/modules/Settings/views/FileManagerSettings.js.map +0 -1
  207. package/presentation/FileList/components/BulkActions/BatchEditorDialog/AddOperation.d.ts +0 -7
  208. package/presentation/FileList/components/BulkActions/BatchEditorDialog/AddOperation.js +0 -15
  209. package/presentation/FileList/components/BulkActions/BatchEditorDialog/AddOperation.js.map +0 -1
  210. package/presentation/FileList/components/BulkActions/BatchEditorDialog/BatchEditor.d.ts +0 -15
  211. package/presentation/FileList/components/BulkActions/BatchEditorDialog/BatchEditor.js +0 -44
  212. package/presentation/FileList/components/BulkActions/BatchEditorDialog/BatchEditor.js.map +0 -1
  213. package/presentation/FileList/components/BulkActions/BatchEditorDialog/BatchEditorDialog.d.ts +0 -15
  214. package/presentation/FileList/components/BulkActions/BatchEditorDialog/BatchEditorDialog.js +0 -52
  215. package/presentation/FileList/components/BulkActions/BatchEditorDialog/BatchEditorDialog.js.map +0 -1
  216. package/presentation/FileList/components/BulkActions/BatchEditorDialog/BatchEditorDialogPresenter.d.ts +0 -61
  217. package/presentation/FileList/components/BulkActions/BatchEditorDialog/BatchEditorDialogPresenter.js +0 -111
  218. package/presentation/FileList/components/BulkActions/BatchEditorDialog/BatchEditorDialogPresenter.js.map +0 -1
  219. package/presentation/FileList/components/BulkActions/BatchEditorDialog/BatchEditorDialogPresenter.test.d.ts +0 -1
  220. package/presentation/FileList/components/BulkActions/BatchEditorDialog/BatchEditorDialogPresenter.test.js +0 -372
  221. package/presentation/FileList/components/BulkActions/BatchEditorDialog/BatchEditorDialogPresenter.test.js.map +0 -1
  222. package/presentation/FileList/components/BulkActions/BatchEditorDialog/FieldRenderer.d.ts +0 -8
  223. package/presentation/FileList/components/BulkActions/BatchEditorDialog/FieldRenderer.js +0 -31
  224. package/presentation/FileList/components/BulkActions/BatchEditorDialog/FieldRenderer.js.map +0 -1
  225. package/presentation/FileList/components/BulkActions/BatchEditorDialog/Operation.d.ts +0 -11
  226. package/presentation/FileList/components/BulkActions/BatchEditorDialog/Operation.js +0 -33
  227. package/presentation/FileList/components/BulkActions/BatchEditorDialog/Operation.js.map +0 -1
  228. package/presentation/FileList/components/BulkActions/BatchEditorDialog/index.d.ts +0 -1
  229. package/presentation/FileList/components/BulkActions/BatchEditorDialog/index.js +0 -1
  230. package/presentation/FileList/components/BulkActions/BulkActionEdit.d.ts +0 -4
  231. package/presentation/FileList/components/BulkActions/BulkActionEdit.js +0 -105
  232. package/presentation/FileList/components/BulkActions/BulkActionEdit.js.map +0 -1
  233. package/presentation/config/configComponents/Browser/FolderFieldDecorator.d.ts +0 -7
  234. package/presentation/config/configComponents/Browser/FolderFieldDecorator.js +0 -11
  235. package/presentation/config/configComponents/Browser/FolderFieldDecorator.js.map +0 -1
@@ -0,0 +1,38 @@
1
+ import react from "react";
2
+ import { ReactComponent } from "@webiny/icons/file_present.svg";
3
+ import { CmsFieldType } from "@webiny/app-headless-cms/presentation/fieldTypes/abstractions.js";
4
+ class FileFieldTypeImpl {
5
+ createField() {
6
+ return {
7
+ type: this.type,
8
+ validation: [],
9
+ renderer: {
10
+ name: ""
11
+ }
12
+ };
13
+ }
14
+ constructor(){
15
+ this.type = "file";
16
+ this.label = "Files";
17
+ this.description = "Images, videos and other files.";
18
+ this.icon = /*#__PURE__*/ react.createElement(ReactComponent, null);
19
+ this.allowList = true;
20
+ this.listLabel = "Use as a list of files or an image gallery";
21
+ this.allowPredefinedValues = false;
22
+ this.validators = [
23
+ "required"
24
+ ];
25
+ this.listValidators = [
26
+ "minLength",
27
+ "maxLength"
28
+ ];
29
+ this.deprecated = true;
30
+ }
31
+ }
32
+ const FileFieldType = CmsFieldType.createImplementation({
33
+ implementation: FileFieldTypeImpl,
34
+ dependencies: []
35
+ });
36
+ export { FileFieldType };
37
+
38
+ //# sourceMappingURL=FileFieldType.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modules/HeadlessCms/fieldType/FileFieldType.js","sources":["../../../../src/modules/HeadlessCms/fieldType/FileFieldType.tsx"],"sourcesContent":["import React from \"react\";\nimport { ReactComponent as FileIcon } from \"@webiny/icons/file_present.svg\";\nimport { CmsFieldType } from \"@webiny/app-headless-cms/presentation/fieldTypes/abstractions.js\";\n\nclass FileFieldTypeImpl implements CmsFieldType.Interface {\n type = \"file\";\n label = \"Files\";\n description = \"Images, videos and other files.\";\n icon = <FileIcon />;\n allowList = true;\n listLabel = \"Use as a list of files or an image gallery\";\n allowPredefinedValues = false;\n validators = [\"required\"];\n listValidators = [\"minLength\", \"maxLength\"];\n // Superseded by the Asset field. Hidden from the palette unless a model already\n // uses a file field, so existing models remain editable (backwards compatible).\n deprecated = true;\n\n createField() {\n return {\n type: this.type,\n validation: [],\n renderer: { name: \"\" }\n };\n }\n}\n\nexport const FileFieldType = CmsFieldType.createImplementation({\n implementation: FileFieldTypeImpl,\n dependencies: []\n});\n"],"names":["FileFieldTypeImpl","FileIcon","FileFieldType","CmsFieldType"],"mappings":";;;AAIA,MAAMA;IAcF,cAAc;QACV,OAAO;YACH,MAAM,IAAI,CAAC,IAAI;YACf,YAAY,EAAE;YACd,UAAU;gBAAE,MAAM;YAAG;QACzB;IACJ;;aAnBA,IAAI,GAAG;aACP,KAAK,GAAG;aACR,WAAW,GAAG;aACd,IAAI,GAAG,WAAP,GAAO,oBAACC,gBAAQA;aAChB,SAAS,GAAG;aACZ,SAAS,GAAG;aACZ,qBAAqB,GAAG;aACxB,UAAU,GAAG;YAAC;SAAW;aACzB,cAAc,GAAG;YAAC;YAAa;SAAY;aAG3C,UAAU,GAAG;;AASjB;AAEO,MAAMC,gBAAgBC,aAAa,oBAAoB,CAAC;IAC3D,gBAAgBH;IAChB,cAAc,EAAE;AACpB"}
@@ -0,0 +1,15 @@
1
+ import { CmsFieldRenderer } from "@webiny/app-headless-cms/presentation/fieldRenderers/abstractions.js";
2
+ import type { CmsModelField } from "@webiny/app-headless-cms-common/types/index.js";
3
+ declare class FileInputRendererImpl implements CmsFieldRenderer.Interface {
4
+ rendererName: string;
5
+ formRenderer: string;
6
+ name: string;
7
+ description: string;
8
+ canUse({ field }: {
9
+ field: CmsModelField;
10
+ }): boolean;
11
+ }
12
+ export declare const FileInputRenderer: typeof FileInputRendererImpl & {
13
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/app-headless-cms/presentation/fieldRenderers/abstractions.js").ICmsFieldRenderer>;
14
+ };
15
+ export {};
@@ -0,0 +1,19 @@
1
+ import { CmsFieldRenderer } from "@webiny/app-headless-cms/presentation/fieldRenderers/abstractions.js";
2
+ class FileInputRendererImpl {
3
+ canUse({ field }) {
4
+ return "file" === field.type && !field.list;
5
+ }
6
+ constructor(){
7
+ this.rendererName = "file-input";
8
+ this.formRenderer = "cmsFilePicker";
9
+ this.name = "File Input";
10
+ this.description = "Enables selecting a single file via File Manager.";
11
+ }
12
+ }
13
+ const FileInputRenderer = CmsFieldRenderer.createImplementation({
14
+ implementation: FileInputRendererImpl,
15
+ dependencies: []
16
+ });
17
+ export { FileInputRenderer };
18
+
19
+ //# sourceMappingURL=FileInputRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modules/HeadlessCms/fieldType/FileInputRenderer.js","sources":["../../../../src/modules/HeadlessCms/fieldType/FileInputRenderer.ts"],"sourcesContent":["import { CmsFieldRenderer } from \"@webiny/app-headless-cms/presentation/fieldRenderers/abstractions.js\";\nimport type { CmsModelField } from \"@webiny/app-headless-cms-common/types/index.js\";\n\nclass FileInputRendererImpl implements CmsFieldRenderer.Interface {\n rendererName = \"file-input\";\n formRenderer = \"cmsFilePicker\";\n name = \"File Input\";\n description = \"Enables selecting a single file via File Manager.\";\n\n canUse({ field }: { field: CmsModelField }) {\n return field.type === \"file\" && !field.list;\n }\n}\n\nexport const FileInputRenderer = CmsFieldRenderer.createImplementation({\n implementation: FileInputRendererImpl,\n dependencies: []\n});\n"],"names":["FileInputRendererImpl","field","FileInputRenderer","CmsFieldRenderer"],"mappings":";AAGA,MAAMA;IAMF,OAAO,EAAEC,KAAK,EAA4B,EAAE;QACxC,OAAOA,AAAe,WAAfA,MAAM,IAAI,IAAe,CAACA,MAAM,IAAI;IAC/C;;aAPA,YAAY,GAAG;aACf,YAAY,GAAG;aACf,IAAI,GAAG;aACP,WAAW,GAAG;;AAKlB;AAEO,MAAMC,oBAAoBC,iBAAiB,oBAAoB,CAAC;IACnE,gBAAgBH;IAChB,cAAc,EAAE;AACpB"}
@@ -0,0 +1,15 @@
1
+ import { CmsFieldRenderer } from "@webiny/app-headless-cms/presentation/fieldRenderers/abstractions.js";
2
+ import type { CmsModelField } from "@webiny/app-headless-cms-common/types/index.js";
3
+ declare class FileInputsRendererImpl implements CmsFieldRenderer.Interface {
4
+ rendererName: string;
5
+ formRenderer: string;
6
+ name: string;
7
+ description: string;
8
+ canUse({ field }: {
9
+ field: CmsModelField;
10
+ }): boolean;
11
+ }
12
+ export declare const FileInputsRenderer: typeof FileInputsRendererImpl & {
13
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/app-headless-cms/presentation/fieldRenderers/abstractions.js").ICmsFieldRenderer>;
14
+ };
15
+ export {};
@@ -0,0 +1,19 @@
1
+ import { CmsFieldRenderer } from "@webiny/app-headless-cms/presentation/fieldRenderers/abstractions.js";
2
+ class FileInputsRendererImpl {
3
+ canUse({ field }) {
4
+ return "file" === field.type && !!field.list;
5
+ }
6
+ constructor(){
7
+ this.rendererName = "file-inputs";
8
+ this.formRenderer = "cmsMultiFilePicker";
9
+ this.name = "File Inputs";
10
+ this.description = "Enables selecting multiple files via File Manager.";
11
+ }
12
+ }
13
+ const FileInputsRenderer = CmsFieldRenderer.createImplementation({
14
+ implementation: FileInputsRendererImpl,
15
+ dependencies: []
16
+ });
17
+ export { FileInputsRenderer };
18
+
19
+ //# sourceMappingURL=FileInputsRenderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modules/HeadlessCms/fieldType/FileInputsRenderer.js","sources":["../../../../src/modules/HeadlessCms/fieldType/FileInputsRenderer.ts"],"sourcesContent":["import { CmsFieldRenderer } from \"@webiny/app-headless-cms/presentation/fieldRenderers/abstractions.js\";\nimport type { CmsModelField } from \"@webiny/app-headless-cms-common/types/index.js\";\n\nclass FileInputsRendererImpl implements CmsFieldRenderer.Interface {\n rendererName = \"file-inputs\";\n formRenderer = \"cmsMultiFilePicker\";\n name = \"File Inputs\";\n description = \"Enables selecting multiple files via File Manager.\";\n\n canUse({ field }: { field: CmsModelField }) {\n return field.type === \"file\" && !!field.list;\n }\n}\n\nexport const FileInputsRenderer = CmsFieldRenderer.createImplementation({\n implementation: FileInputsRendererImpl,\n dependencies: []\n});\n"],"names":["FileInputsRendererImpl","field","FileInputsRenderer","CmsFieldRenderer"],"mappings":";AAGA,MAAMA;IAMF,OAAO,EAAEC,KAAK,EAA4B,EAAE;QACxC,OAAOA,AAAe,WAAfA,MAAM,IAAI,IAAe,CAAC,CAACA,MAAM,IAAI;IAChD;;aAPA,YAAY,GAAG;aACf,YAAY,GAAG;aACf,IAAI,GAAG;aACP,WAAW,GAAG;;AAKlB;AAEO,MAAMC,qBAAqBC,iBAAiB,oBAAoB,CAAC;IACpE,gBAAgBH;IAChB,cAAc,EAAE;AACpB"}
@@ -0,0 +1 @@
1
+ export declare const FileFieldTypeFeature: import("@webiny/feature/admin").FeatureDefinition<any, []>;
@@ -0,0 +1,27 @@
1
+ import { createFeature } from "@webiny/feature/admin";
2
+ import { FileFieldType } from "./FileFieldType.js";
3
+ import { AssetFieldType } from "./AssetFieldType.js";
4
+ import { AssetFormFieldType } from "./AssetFormFieldType.js";
5
+ import { FileFieldSettingsModifier } from "./FileFieldSettingsModifier.js";
6
+ import { AssetFieldSettingsModifier } from "./AssetFieldSettingsModifier.js";
7
+ import { FileInputRenderer } from "./FileInputRenderer.js";
8
+ import { FileInputsRenderer } from "./FileInputsRenderer.js";
9
+ import { AssetInputRenderer } from "./AssetInputRenderer.js";
10
+ import { AssetInputsRenderer } from "./AssetInputsRenderer.js";
11
+ const FileFieldTypeFeature = createFeature({
12
+ name: "FileFieldType",
13
+ register (container) {
14
+ container.register(FileFieldType);
15
+ container.register(AssetFieldType);
16
+ container.register(AssetFormFieldType);
17
+ container.register(FileFieldSettingsModifier);
18
+ container.register(AssetFieldSettingsModifier);
19
+ container.register(FileInputRenderer);
20
+ container.register(FileInputsRenderer);
21
+ container.register(AssetInputRenderer);
22
+ container.register(AssetInputsRenderer);
23
+ }
24
+ });
25
+ export { FileFieldTypeFeature };
26
+
27
+ //# sourceMappingURL=feature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modules/HeadlessCms/fieldType/feature.js","sources":["../../../../src/modules/HeadlessCms/fieldType/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/admin\";\nimport { FileFieldType } from \"./FileFieldType.js\";\nimport { AssetFieldType } from \"./AssetFieldType.js\";\nimport { AssetFormFieldType } from \"./AssetFormFieldType.js\";\nimport { FileFieldSettingsModifier } from \"./FileFieldSettingsModifier.js\";\nimport { AssetFieldSettingsModifier } from \"./AssetFieldSettingsModifier.js\";\nimport { FileInputRenderer } from \"./FileInputRenderer.js\";\nimport { FileInputsRenderer } from \"./FileInputsRenderer.js\";\nimport { AssetInputRenderer } from \"./AssetInputRenderer.js\";\nimport { AssetInputsRenderer } from \"./AssetInputsRenderer.js\";\n\nexport const FileFieldTypeFeature = createFeature({\n name: \"FileFieldType\",\n register(container) {\n container.register(FileFieldType);\n container.register(AssetFieldType);\n container.register(AssetFormFieldType);\n container.register(FileFieldSettingsModifier);\n container.register(AssetFieldSettingsModifier);\n container.register(FileInputRenderer);\n container.register(FileInputsRenderer);\n container.register(AssetInputRenderer);\n container.register(AssetInputsRenderer);\n }\n});\n"],"names":["FileFieldTypeFeature","createFeature","container","FileFieldType","AssetFieldType","AssetFormFieldType","FileFieldSettingsModifier","AssetFieldSettingsModifier","FileInputRenderer","FileInputsRenderer","AssetInputRenderer","AssetInputsRenderer"],"mappings":";;;;;;;;;;AAWO,MAAMA,uBAAuBC,cAAc;IAC9C,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC;QACnBD,UAAU,QAAQ,CAACE;QACnBF,UAAU,QAAQ,CAACG;QACnBH,UAAU,QAAQ,CAACI;QACnBJ,UAAU,QAAQ,CAACK;QACnBL,UAAU,QAAQ,CAACM;QACnBN,UAAU,QAAQ,CAACO;QACnBP,UAAU,QAAQ,CAACQ;QACnBR,UAAU,QAAQ,CAACS;IACvB;AACJ"}
@@ -0,0 +1,2 @@
1
+ import type { CmsModelField } from "@webiny/app-headless-cms-common/types/index.js";
2
+ export declare const isAssetField: (field: Pick<CmsModelField, "type">) => boolean;
@@ -0,0 +1,4 @@
1
+ const isAssetField = (field)=>"asset" === field.type;
2
+ export { isAssetField };
3
+
4
+ //# sourceMappingURL=isAssetField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modules/HeadlessCms/fieldType/isAssetField.js","sources":["../../../../src/modules/HeadlessCms/fieldType/isAssetField.ts"],"sourcesContent":["import type { CmsModelField } from \"@webiny/app-headless-cms-common/types/index.js\";\n\nexport const isAssetField = (field: Pick<CmsModelField, \"type\">): boolean => {\n return field.type === \"asset\";\n};\n"],"names":["isAssetField","field"],"mappings":"AAEO,MAAMA,eAAe,CAACC,QAClBA,AAAe,YAAfA,MAAM,IAAI"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webiny/app-file-manager",
3
- "version": "6.4.11",
3
+ "version": "6.6.0-alpha.1",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./index.js",
@@ -13,50 +13,40 @@
13
13
  "author": "Jon Rapp ",
14
14
  "license": "MIT",
15
15
  "dependencies": {
16
- "@apollo/react-common": "3.1.4",
17
- "@apollo/react-components": "3.1.5",
18
16
  "@types/react": "18.3.31",
19
- "@webiny/admin-ui": "6.4.11",
20
- "@webiny/app": "6.4.11",
21
- "@webiny/app-aco": "6.4.11",
22
- "@webiny/app-admin": "6.4.11",
23
- "@webiny/app-headless-cms": "6.4.11",
24
- "@webiny/app-headless-cms-common": "6.4.11",
25
- "@webiny/app-websockets": "6.4.11",
26
- "@webiny/di": "1.0.2",
27
- "@webiny/feature": "6.4.11",
28
- "@webiny/form": "6.4.11",
29
- "@webiny/icons": "6.4.11",
30
- "@webiny/plugins": "6.4.11",
31
- "@webiny/react-composition": "6.4.11",
32
- "@webiny/react-properties": "6.4.11",
33
- "@webiny/sdk": "6.4.11",
34
- "@webiny/validation": "6.4.11",
35
- "apollo-cache": "1.3.5",
36
- "apollo-client": "2.6.10",
37
- "apollo-link": "1.2.14",
38
- "apollo-utilities": "1.3.4",
17
+ "@webiny/admin-ui": "6.6.0-alpha.1",
18
+ "@webiny/app": "6.6.0-alpha.1",
19
+ "@webiny/app-aco": "6.6.0-alpha.1",
20
+ "@webiny/app-admin": "6.6.0-alpha.1",
21
+ "@webiny/app-headless-cms": "6.6.0-alpha.1",
22
+ "@webiny/app-headless-cms-common": "6.6.0-alpha.1",
23
+ "@webiny/app-websockets": "6.6.0-alpha.1",
24
+ "@webiny/di": "1.1.0",
25
+ "@webiny/feature": "6.6.0-alpha.1",
26
+ "@webiny/form": "6.6.0-alpha.1",
27
+ "@webiny/icons": "6.6.0-alpha.1",
28
+ "@webiny/plugins": "6.6.0-alpha.1",
29
+ "@webiny/react-composition": "6.6.0-alpha.1",
30
+ "@webiny/react-properties": "6.6.0-alpha.1",
31
+ "@webiny/sdk": "6.6.0-alpha.1",
32
+ "@webiny/validation": "6.6.0-alpha.1",
39
33
  "bytes": "3.1.2",
40
- "dayjs": "1.11.21",
41
- "dot-prop-immutable": "2.1.1",
42
- "graphql": "16.14.2",
43
- "graphql-tag": "2.12.7",
34
+ "dayjs": "1.11.23",
44
35
  "lodash": "4.18.1",
45
36
  "mime": "4.1.0",
46
- "minimatch": "10.2.5",
47
- "mobx": "6.16.1",
48
- "mobx-react-lite": "4.1.1",
37
+ "minimatch": "10.2.6",
38
+ "mobx": "7.0.3",
39
+ "mobx-react-lite": "5.0.3",
49
40
  "react": "18.3.1",
50
41
  "react-dom": "18.3.1",
51
42
  "react-lazy-load": "4.0.1",
52
43
  "zod": "4.4.3"
53
44
  },
54
45
  "devDependencies": {
55
- "@svgr/webpack": "8.1.0",
56
- "@webiny/build-tools": "6.4.11",
46
+ "@webiny/build-tools": "6.6.0-alpha.1",
57
47
  "rimraf": "6.1.3",
58
- "typescript": "6.0.3",
59
- "vitest": "4.1.10"
48
+ "typescript": "7.0.2",
49
+ "vitest": "4.1.11"
60
50
  },
61
51
  "publishConfig": {
62
52
  "access": "public"
@@ -0,0 +1,2 @@
1
+ import React from "react";
2
+ export declare const EditImage: () => React.JSX.Element | null;
@@ -0,0 +1,39 @@
1
+ import react, { useCallback } from "react";
2
+ import { ReactComponent } from "@webiny/icons/crop.svg";
3
+ import { ImageEditor } from "@webiny/admin-ui";
4
+ import { FileManagerViewConfig, useFile } from "../../../index.js";
5
+ import { useFileManagerPresenter } from "../../FileList/FileManagerPresenterProvider.js";
6
+ import { useEditImage } from "../../hooks/useEditImage.js";
7
+ const { FileDetails: FileDetails } = FileManagerViewConfig;
8
+ const EditImage = ()=>{
9
+ const { file } = useFile();
10
+ const { vm } = useFileManagerPresenter();
11
+ const fileDetails = vm.fileDetails;
12
+ const onSaved = useCallback((updated)=>{
13
+ fileDetails?.setFile(updated);
14
+ }, [
15
+ fileDetails
16
+ ]);
17
+ const { open, openEditor, closeEditor, value, save } = useEditImage(file, {
18
+ onSaved
19
+ });
20
+ if (!file.type?.startsWith("image/") || "image/svg+xml" === file.type) return null;
21
+ return /*#__PURE__*/ react.createElement(react.Fragment, null, /*#__PURE__*/ react.createElement(FileDetails.Action.Button, {
22
+ label: "Edit image",
23
+ icon: /*#__PURE__*/ react.createElement(ReactComponent, null),
24
+ onAction: openEditor
25
+ }), /*#__PURE__*/ react.createElement(ImageEditor, {
26
+ open: open,
27
+ onClose: closeEditor,
28
+ image: {
29
+ src: file.src,
30
+ width: file.metadata?.image?.width ?? 0,
31
+ height: file.metadata?.image?.height ?? 0
32
+ },
33
+ value: value,
34
+ onSave: save
35
+ }));
36
+ };
37
+ export { EditImage };
38
+
39
+ //# sourceMappingURL=EditImage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentation/FileActions/FileDetails/EditImage.js","sources":["../../../../src/presentation/FileActions/FileDetails/EditImage.tsx"],"sourcesContent":["import React, { useCallback } from \"react\";\nimport { ReactComponent as CropIcon } from \"@webiny/icons/crop.svg\";\nimport { ImageEditor } from \"@webiny/admin-ui\";\nimport { FileManagerViewConfig, useFile } from \"~/index.js\";\nimport { useFileManagerPresenter } from \"~/presentation/FileList/FileManagerPresenterProvider.js\";\nimport { useEditImage } from \"~/presentation/hooks/useEditImage.js\";\nimport type { FileItem } from \"~/domain/types.js\";\n\nconst { FileDetails } = FileManagerViewConfig;\n\nexport const EditImage = () => {\n const { file } = useFile();\n const { vm } = useFileManagerPresenter();\n const fileDetails = vm.fileDetails;\n\n // After saving, replace the file shown in the drawer so the preview updates\n // in place (without needing to close and reopen the drawer).\n const onSaved = useCallback(\n (updated: FileItem) => {\n fileDetails?.setFile(updated);\n },\n [fileDetails]\n );\n\n const { open, openEditor, closeEditor, value, save } = useEditImage(file, { onSaved });\n\n if (!file.type?.startsWith(\"image/\") || file.type === \"image/svg+xml\") {\n return null;\n }\n\n return (\n <>\n <FileDetails.Action.Button\n label={\"Edit image\"}\n icon={<CropIcon />}\n onAction={openEditor}\n />\n <ImageEditor\n open={open}\n onClose={closeEditor}\n image={{\n src: file.src,\n width: file.metadata?.image?.width ?? 0,\n height: file.metadata?.image?.height ?? 0\n }}\n value={value}\n onSave={save}\n />\n </>\n );\n};\n"],"names":["FileDetails","FileManagerViewConfig","EditImage","file","useFile","vm","useFileManagerPresenter","fileDetails","onSaved","useCallback","updated","open","openEditor","closeEditor","value","save","useEditImage","CropIcon","ImageEditor"],"mappings":";;;;;;AAQA,MAAM,EAAEA,aAAAA,WAAW,EAAE,GAAGC;AAEjB,MAAMC,YAAY;IACrB,MAAM,EAAEC,IAAI,EAAE,GAAGC;IACjB,MAAM,EAAEC,EAAE,EAAE,GAAGC;IACf,MAAMC,cAAcF,GAAG,WAAW;IAIlC,MAAMG,UAAUC,YACZ,CAACC;QACGH,aAAa,QAAQG;IACzB,GACA;QAACH;KAAY;IAGjB,MAAM,EAAEI,IAAI,EAAEC,UAAU,EAAEC,WAAW,EAAEC,KAAK,EAAEC,IAAI,EAAE,GAAGC,aAAab,MAAM;QAAEK;IAAQ;IAEpF,IAAI,CAACL,KAAK,IAAI,EAAE,WAAW,aAAaA,AAAc,oBAAdA,KAAK,IAAI,EAC7C,OAAO;IAGX,OAAO,WAAP,GACI,wDACI,oBAACH,YAAY,MAAM,CAAC,MAAM;QACtB,OAAO;QACP,oBAAM,oBAACiB,gBAAQA;QACf,UAAUL;sBAEd,oBAACM,aAAWA;QACR,MAAMP;QACN,SAASE;QACT,OAAO;YACH,KAAKV,KAAK,GAAG;YACb,OAAOA,KAAK,QAAQ,EAAE,OAAO,SAAS;YACtC,QAAQA,KAAK,QAAQ,EAAE,OAAO,UAAU;QAC5C;QACA,OAAOW;QACP,QAAQC;;AAIxB"}
@@ -8,6 +8,8 @@ import { Download as Download_js_Download } from "./FileDetails/Download.js";
8
8
  import { MoveToFolder as MoveToFolder_js_MoveToFolder } from "./FileDetails/MoveToFolder.js";
9
9
  import { CopyUrl } from "./FileDetails/CopyUrl.js";
10
10
  import { DeleteImage } from "./FileDetails/DeleteImage.js";
11
+ import { EditImage } from "./FileDetails/EditImage.js";
12
+ import { ReenrichWithAi } from "../../modules/AiEnrichment/ReenrichWithAi.js";
11
13
  const { Browser: Browser, FileDetails: FileDetails } = FileManagerViewConfig;
12
14
  const FileActions = ()=>/*#__PURE__*/ react.createElement(react.Fragment, null, /*#__PURE__*/ react.createElement(Browser.Grid.Item.Action, {
13
15
  name: "settings",
@@ -21,6 +23,9 @@ const FileActions = ()=>/*#__PURE__*/ react.createElement(react.Fragment, null,
21
23
  }), /*#__PURE__*/ react.createElement(Browser.Grid.Item.Action, {
22
24
  name: "delete",
23
25
  element: /*#__PURE__*/ react.createElement(Delete, null)
26
+ }), /*#__PURE__*/ react.createElement(FileDetails.Action, {
27
+ name: "editImage",
28
+ element: /*#__PURE__*/ react.createElement(EditImage, null)
24
29
  }), /*#__PURE__*/ react.createElement(FileDetails.Action, {
25
30
  name: "download",
26
31
  element: /*#__PURE__*/ react.createElement(Download_js_Download, null)
@@ -33,6 +38,9 @@ const FileActions = ()=>/*#__PURE__*/ react.createElement(react.Fragment, null,
33
38
  }), /*#__PURE__*/ react.createElement(FileDetails.Action, {
34
39
  name: "delete",
35
40
  element: /*#__PURE__*/ react.createElement(DeleteImage, null)
41
+ }), /*#__PURE__*/ react.createElement(FileDetails.Action, {
42
+ name: "reenrichWithAi",
43
+ element: /*#__PURE__*/ react.createElement(ReenrichWithAi, null)
36
44
  }));
37
45
  export { FileActions };
38
46
 
@@ -1 +1 @@
1
- {"version":3,"file":"presentation/FileActions/index.js","sources":["../../../src/presentation/FileActions/index.tsx"],"sourcesContent":["import React from \"react\";\nimport { FileManagerViewConfig } from \"~/index.js\";\nimport { Delete as GridDelete } from \"./Grid/Delete.js\";\nimport { Download as GridDownload } from \"./Grid/Download.js\";\nimport { MoveToFolder as GridMoveToFolder } from \"./Grid/MoveToFolder.js\";\nimport { Settings as GridSettings } from \"./Grid/Settings.js\";\nimport { Download as FileDetailsDownload } from \"./FileDetails/Download.js\";\nimport { MoveToFolder as FileDetailsMoveToFolder } from \"./FileDetails/MoveToFolder.js\";\nimport { CopyUrl as FileDetailsCopyUrl } from \"./FileDetails/CopyUrl.js\";\nimport { DeleteImage as FileDetailsDeleteImage } from \"./FileDetails/DeleteImage.js\";\n\nconst { Browser, FileDetails } = FileManagerViewConfig;\n\nexport const FileActions = () => {\n return (\n <>\n {/* Grid actions. */}\n <Browser.Grid.Item.Action name={\"settings\"} element={<GridSettings />} />\n <Browser.Grid.Item.Action name={\"download\"} element={<GridDownload />} />\n <Browser.Grid.Item.Action name={\"move\"} element={<GridMoveToFolder />} />\n <Browser.Grid.Item.Action name={\"delete\"} element={<GridDelete />} />\n {/* File details actions. */}\n <FileDetails.Action name={\"download\"} element={<FileDetailsDownload />} />\n <FileDetails.Action name={\"moveToFolder\"} element={<FileDetailsMoveToFolder />} />\n <FileDetails.Action name={\"copyUrl\"} element={<FileDetailsCopyUrl />} />\n <FileDetails.Action name={\"delete\"} element={<FileDetailsDeleteImage />} />\n </>\n );\n};\n"],"names":["Browser","FileDetails","FileManagerViewConfig","FileActions","GridSettings","GridDownload","GridMoveToFolder","GridDelete","FileDetailsDownload","FileDetailsMoveToFolder","FileDetailsCopyUrl","FileDetailsDeleteImage"],"mappings":";;;;;;;;;;AAWA,MAAM,EAAEA,SAAAA,OAAO,EAAEC,aAAAA,WAAW,EAAE,GAAGC;AAE1B,MAAMC,cAAc,IAChB,WAAP,GACI,wDAEI,oBAACH,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM;QAAC,MAAM;QAAY,uBAAS,oBAACI,UAAYA;sBAClE,oBAACJ,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM;QAAC,MAAM;QAAY,uBAAS,oBAACK,UAAYA;sBAClE,oBAACL,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM;QAAC,MAAM;QAAQ,uBAAS,oBAACM,cAAgBA;sBAClE,oBAACN,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM;QAAC,MAAM;QAAU,uBAAS,oBAACO,QAAUA;sBAE9D,oBAACN,YAAY,MAAM;QAAC,MAAM;QAAY,uBAAS,oBAACO,sBAAmBA;sBACnE,oBAACP,YAAY,MAAM;QAAC,MAAM;QAAgB,uBAAS,oBAACQ,8BAAuBA;sBAC3E,oBAACR,YAAY,MAAM;QAAC,MAAM;QAAW,uBAAS,oBAACS,SAAkBA;sBACjE,oBAACT,YAAY,MAAM;QAAC,MAAM;QAAU,uBAAS,oBAACU,aAAsBA"}
1
+ {"version":3,"file":"presentation/FileActions/index.js","sources":["../../../src/presentation/FileActions/index.tsx"],"sourcesContent":["import React from \"react\";\nimport { FileManagerViewConfig } from \"~/index.js\";\nimport { Delete as GridDelete } from \"./Grid/Delete.js\";\nimport { Download as GridDownload } from \"./Grid/Download.js\";\nimport { MoveToFolder as GridMoveToFolder } from \"./Grid/MoveToFolder.js\";\nimport { Settings as GridSettings } from \"./Grid/Settings.js\";\nimport { Download as FileDetailsDownload } from \"./FileDetails/Download.js\";\nimport { MoveToFolder as FileDetailsMoveToFolder } from \"./FileDetails/MoveToFolder.js\";\nimport { CopyUrl as FileDetailsCopyUrl } from \"./FileDetails/CopyUrl.js\";\nimport { DeleteImage as FileDetailsDeleteImage } from \"./FileDetails/DeleteImage.js\";\nimport { EditImage as FileDetailsEditImage } from \"./FileDetails/EditImage.js\";\nimport { ReenrichWithAi } from \"~/modules/AiEnrichment/ReenrichWithAi.js\";\n\nconst { Browser, FileDetails } = FileManagerViewConfig;\n\nexport const FileActions = () => {\n return (\n <>\n {/* Grid actions. */}\n <Browser.Grid.Item.Action name={\"settings\"} element={<GridSettings />} />\n <Browser.Grid.Item.Action name={\"download\"} element={<GridDownload />} />\n <Browser.Grid.Item.Action name={\"move\"} element={<GridMoveToFolder />} />\n <Browser.Grid.Item.Action name={\"delete\"} element={<GridDelete />} />\n {/* File details actions. */}\n <FileDetails.Action name={\"editImage\"} element={<FileDetailsEditImage />} />\n <FileDetails.Action name={\"download\"} element={<FileDetailsDownload />} />\n <FileDetails.Action name={\"moveToFolder\"} element={<FileDetailsMoveToFolder />} />\n <FileDetails.Action name={\"copyUrl\"} element={<FileDetailsCopyUrl />} />\n <FileDetails.Action name={\"delete\"} element={<FileDetailsDeleteImage />} />\n <FileDetails.Action name={\"reenrichWithAi\"} element={<ReenrichWithAi />} />\n </>\n );\n};\n"],"names":["Browser","FileDetails","FileManagerViewConfig","FileActions","GridSettings","GridDownload","GridMoveToFolder","GridDelete","FileDetailsEditImage","FileDetailsDownload","FileDetailsMoveToFolder","FileDetailsCopyUrl","FileDetailsDeleteImage","ReenrichWithAi"],"mappings":";;;;;;;;;;;;AAaA,MAAM,EAAEA,SAAAA,OAAO,EAAEC,aAAAA,WAAW,EAAE,GAAGC;AAE1B,MAAMC,cAAc,IAChB,WAAP,GACI,wDAEI,oBAACH,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM;QAAC,MAAM;QAAY,uBAAS,oBAACI,UAAYA;sBAClE,oBAACJ,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM;QAAC,MAAM;QAAY,uBAAS,oBAACK,UAAYA;sBAClE,oBAACL,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM;QAAC,MAAM;QAAQ,uBAAS,oBAACM,cAAgBA;sBAClE,oBAACN,QAAQ,IAAI,CAAC,IAAI,CAAC,MAAM;QAAC,MAAM;QAAU,uBAAS,oBAACO,QAAUA;sBAE9D,oBAACN,YAAY,MAAM;QAAC,MAAM;QAAa,uBAAS,oBAACO,WAAoBA;sBACrE,oBAACP,YAAY,MAAM;QAAC,MAAM;QAAY,uBAAS,oBAACQ,sBAAmBA;sBACnE,oBAACR,YAAY,MAAM;QAAC,MAAM;QAAgB,uBAAS,oBAACS,8BAAuBA;sBAC3E,oBAACT,YAAY,MAAM;QAAC,MAAM;QAAW,uBAAS,oBAACU,SAAkBA;sBACjE,oBAACV,YAAY,MAAM;QAAC,MAAM;QAAU,uBAAS,oBAACW,aAAsBA;sBACpE,oBAACX,YAAY,MAAM;QAAC,MAAM;QAAkB,uBAAS,oBAACY,gBAAcA"}
@@ -1,26 +1,27 @@
1
- import { WcpService } from "@webiny/app-admin/features/wcp/abstractions.js";
2
1
  import { type IFileDetailsPresenter, type IFileDetailsViewModel } from "./abstractions.js";
3
2
  import { GetFileUseCase } from "../../features/getFile/abstractions.js";
4
3
  import { UpdateFileUseCase } from "../../features/updateFile/abstractions.js";
4
+ import { DeleteFileUseCase } from "../../features/deleteFile/abstractions.js";
5
5
  import { FormModelFactory } from "@webiny/app-admin/features/formModel/abstractions.js";
6
6
  import { FileManagerPermissions } from "../../features/permissions/abstractions.js";
7
7
  import { GetSettingsRepository } from "../../features/settings/abstractions.js";
8
+ import type { FmFile } from "../../features/shared/types.js";
8
9
  declare class FileDetailsPresenterImpl implements IFileDetailsPresenter {
9
10
  private getFileUseCase;
10
11
  private updateFileUseCase;
12
+ private deleteFileUseCase;
11
13
  private formModelFactory;
12
14
  private permissions;
13
15
  private settingsRepository;
14
- private wcp;
15
16
  private file;
16
17
  private loading;
17
18
  private form;
18
- constructor(getFileUseCase: GetFileUseCase.Interface, updateFileUseCase: UpdateFileUseCase.Interface, formModelFactory: FormModelFactory.Interface, permissions: FileManagerPermissions.Interface, settingsRepository: GetSettingsRepository.Interface, wcp: WcpService.Interface);
19
+ constructor(getFileUseCase: GetFileUseCase.Interface, updateFileUseCase: UpdateFileUseCase.Interface, deleteFileUseCase: DeleteFileUseCase.Interface, formModelFactory: FormModelFactory.Interface, permissions: FileManagerPermissions.Interface, settingsRepository: GetSettingsRepository.Interface);
19
20
  get vm(): IFileDetailsViewModel;
20
21
  loadFile(id: string): Promise<void>;
22
+ setFile(file: FmFile): void;
21
23
  saveFile(): Promise<boolean>;
22
24
  private buildForm;
23
- private canUsePrivateFiles;
24
25
  private buildPreviewUrl;
25
26
  }
26
27
  export declare const FileDetailsPresenter: typeof FileDetailsPresenterImpl & {
@@ -1,19 +1,19 @@
1
1
  import { computed, makeAutoObservable, runInAction } from "mobx";
2
- import { WcpService } from "@webiny/app-admin/features/wcp/abstractions.js";
3
2
  import { FileDetailsPresenter } from "./abstractions.js";
4
3
  import { GetFileUseCase } from "../../features/getFile/abstractions.js";
5
4
  import { UpdateFileUseCase } from "../../features/updateFile/abstractions.js";
5
+ import { DeleteFileUseCase } from "../../features/deleteFile/abstractions.js";
6
6
  import { FormModelFactory } from "@webiny/app-admin/features/formModel/abstractions.js";
7
7
  import { FileManagerPermissions } from "../../features/permissions/abstractions.js";
8
8
  import { GetSettingsRepository } from "../../features/settings/abstractions.js";
9
9
  class FileDetailsPresenterImpl {
10
- constructor(getFileUseCase, updateFileUseCase, formModelFactory, permissions, settingsRepository, wcp){
10
+ constructor(getFileUseCase, updateFileUseCase, deleteFileUseCase, formModelFactory, permissions, settingsRepository){
11
11
  this.getFileUseCase = getFileUseCase;
12
12
  this.updateFileUseCase = updateFileUseCase;
13
+ this.deleteFileUseCase = deleteFileUseCase;
13
14
  this.formModelFactory = formModelFactory;
14
15
  this.permissions = permissions;
15
16
  this.settingsRepository = settingsRepository;
16
- this.wcp = wcp;
17
17
  this.file = null;
18
18
  this.loading = null;
19
19
  this.form = this.buildForm();
@@ -45,18 +45,17 @@ class FileDetailsPresenterImpl {
45
45
  if (result.success) {
46
46
  this.file = result.file;
47
47
  this.form = this.buildForm();
48
- const formData = {
48
+ this.form.setData({
49
49
  name: result.file.name ?? "",
50
50
  description: result.file.description ?? "",
51
- tags: result.file.tags ?? []
52
- };
53
- if (this.canUsePrivateFiles()) formData.accessControl = result.file.accessControl?.type ?? "public";
54
- this.form.setData(formData);
51
+ tags: result.file.tags ?? [],
52
+ accessControl: result.file.accessControl?.type ?? "public"
53
+ });
55
54
  if (!this.permissions.canEdit("file", result.file)) {
56
55
  this.form.field("name").setDisabled(true);
57
56
  this.form.field("description").setDisabled(true);
58
57
  this.form.field("tags").setDisabled(true);
59
- if (this.canUsePrivateFiles()) this.form.field("accessControl").setDisabled(true);
58
+ this.form.field("accessControl").setDisabled(true);
60
59
  }
61
60
  }
62
61
  });
@@ -66,6 +65,11 @@ class FileDetailsPresenterImpl {
66
65
  });
67
66
  }
68
67
  }
68
+ setFile(file) {
69
+ runInAction(()=>{
70
+ this.file = file;
71
+ });
72
+ }
69
73
  async saveFile() {
70
74
  if (!this.file) return false;
71
75
  const data = await this.form.submit();
@@ -74,17 +78,16 @@ class FileDetailsPresenterImpl {
74
78
  this.loading = "Saving changes...";
75
79
  });
76
80
  try {
77
- const updateData = {
78
- name: data.name,
79
- description: data.description,
80
- tags: data.tags
81
- };
82
- if (this.canUsePrivateFiles()) updateData.accessControl = {
83
- type: data.accessControl
84
- };
85
81
  await this.updateFileUseCase.execute({
86
82
  id: this.file.id,
87
- data: updateData
83
+ data: {
84
+ name: data.name,
85
+ description: data.description,
86
+ tags: data.tags,
87
+ accessControl: {
88
+ type: data.accessControl
89
+ }
90
+ }
88
91
  });
89
92
  return true;
90
93
  } finally{
@@ -95,38 +98,29 @@ class FileDetailsPresenterImpl {
95
98
  }
96
99
  buildForm() {
97
100
  return this.formModelFactory.create({
98
- fields: (fields)=>{
99
- const fieldDefs = {
101
+ fields: (fields)=>({
100
102
  name: fields.text().label("Name").required().placeholder("Enter name"),
101
103
  description: fields.text().label("Description").renderer("textarea").placeholder("Enter description"),
102
- tags: fields.text().label("Tags").list().renderer("tags").placeholder("Add tags")
103
- };
104
- if (this.canUsePrivateFiles()) fieldDefs.accessControl = fields.text().label("Access Control").help("Control who can access this file.").options([
105
- {
106
- label: "Public",
107
- value: "public"
108
- },
109
- {
110
- label: "Private (Authenticated)",
111
- value: "private-authenticated"
112
- }
113
- ]).defaultValue("public");
114
- return fieldDefs;
115
- },
116
- layout: (layout)=>{
117
- const rows = [
104
+ tags: fields.text().label("Tags").list().renderer("tags").placeholder("Add tags"),
105
+ accessControl: fields.text().label("Access Control").help("Control who can access this file.").options([
106
+ {
107
+ label: "Public",
108
+ value: "public"
109
+ },
110
+ {
111
+ label: "Private (Authenticated)",
112
+ value: "private-authenticated"
113
+ }
114
+ ]).defaultValue("public")
115
+ }),
116
+ layout: (layout)=>[
118
117
  layout.row("name"),
119
118
  layout.row("description"),
120
- layout.row("tags")
121
- ];
122
- if (this.canUsePrivateFiles()) rows.push(layout.row("accessControl"));
123
- return rows;
124
- }
119
+ layout.row("tags"),
120
+ layout.row("accessControl")
121
+ ]
125
122
  });
126
123
  }
127
- canUsePrivateFiles() {
128
- return this.wcp.getProject().canUsePrivateFiles();
129
- }
130
124
  buildPreviewUrl() {
131
125
  if (!this.file?.key) return null;
132
126
  const srcPrefix = this.settingsRepository.settings?.srcPrefix ?? "";
@@ -138,10 +132,10 @@ const FileDetailsPresenter_FileDetailsPresenter = FileDetailsPresenter.createImp
138
132
  dependencies: [
139
133
  GetFileUseCase,
140
134
  UpdateFileUseCase,
135
+ DeleteFileUseCase,
141
136
  FormModelFactory,
142
137
  FileManagerPermissions,
143
- GetSettingsRepository,
144
- WcpService
138
+ GetSettingsRepository
145
139
  ]
146
140
  });
147
141
  export { FileDetailsPresenter_FileDetailsPresenter as FileDetailsPresenter };
@@ -1 +1 @@
1
- {"version":3,"file":"presentation/FileDetails/FileDetailsPresenter.js","sources":["../../../src/presentation/FileDetails/FileDetailsPresenter.ts"],"sourcesContent":["import { makeAutoObservable, runInAction, computed } from \"mobx\";\nimport { WcpService } from \"@webiny/app-admin/features/wcp/abstractions.js\";\nimport {\n FileDetailsPresenter as Abstraction,\n type IFileDetailsPresenter,\n type IFileDetailsViewModel\n} from \"./abstractions.js\";\nimport { GetFileUseCase } from \"../../features/getFile/abstractions.js\";\nimport { UpdateFileUseCase } from \"../../features/updateFile/abstractions.js\";\nimport { FormModelFactory } from \"@webiny/app-admin/features/formModel/abstractions.js\";\nimport type { IFormModel } from \"@webiny/app-admin/features/formModel/abstractions.js\";\nimport { FileManagerPermissions } from \"../../features/permissions/abstractions.js\";\nimport { GetSettingsRepository } from \"../../features/settings/abstractions.js\";\nimport type { FmFile } from \"../../features/shared/types.js\";\nimport type { UpdateFileData } from \"../../features/updateFile/abstractions.js\";\n\nclass FileDetailsPresenterImpl implements IFileDetailsPresenter {\n private file: FmFile | null = null;\n private loading: string | null = null;\n private form: IFormModel;\n\n constructor(\n private getFileUseCase: GetFileUseCase.Interface,\n private updateFileUseCase: UpdateFileUseCase.Interface,\n private formModelFactory: FormModelFactory.Interface,\n private permissions: FileManagerPermissions.Interface,\n private settingsRepository: GetSettingsRepository.Interface,\n private wcp: WcpService.Interface\n ) {\n // Build an empty form initially.\n this.form = this.buildForm();\n\n makeAutoObservable(this, { vm: computed });\n }\n\n get vm(): IFileDetailsViewModel {\n return {\n file: this.file,\n loading: this.loading,\n form: this.form.vm,\n previewUrl: this.buildPreviewUrl(),\n permissions: {\n canEdit: this.permissions.canEdit(\"file\", this.file ?? undefined),\n canDelete: this.permissions.canDelete(\"file\", this.file ?? undefined)\n }\n };\n }\n\n async loadFile(id: string): Promise<void> {\n runInAction(() => {\n this.loading = \"Loading file...\";\n });\n\n try {\n const result = await this.getFileUseCase.execute({ id });\n runInAction(() => {\n if (result.success) {\n this.file = result.file;\n this.form = this.buildForm();\n\n const formData: Record<string, unknown> = {\n name: result.file.name ?? \"\",\n description: result.file.description ?? \"\",\n tags: result.file.tags ?? []\n };\n\n if (this.canUsePrivateFiles()) {\n formData.accessControl = result.file.accessControl?.type ?? \"public\";\n }\n\n this.form.setData(formData);\n\n if (!this.permissions.canEdit(\"file\", result.file)) {\n this.form.field(\"name\").setDisabled(true);\n this.form.field(\"description\").setDisabled(true);\n this.form.field(\"tags\").setDisabled(true);\n if (this.canUsePrivateFiles()) {\n this.form.field(\"accessControl\").setDisabled(true);\n }\n }\n }\n });\n } finally {\n runInAction(() => {\n this.loading = null;\n });\n }\n }\n\n async saveFile(): Promise<boolean> {\n if (!this.file) {\n return false;\n }\n\n const data = await this.form.submit();\n if (!data) {\n return false;\n }\n\n runInAction(() => {\n this.loading = \"Saving changes...\";\n });\n\n try {\n const updateData: UpdateFileData = {\n name: data.name as string,\n description: data.description as string,\n tags: data.tags as string[]\n };\n\n if (this.canUsePrivateFiles()) {\n updateData.accessControl = {\n type: data.accessControl as \"public\" | \"private-authenticated\"\n };\n }\n\n await this.updateFileUseCase.execute({\n id: this.file.id,\n data: updateData\n });\n return true;\n } finally {\n runInAction(() => {\n this.loading = null;\n });\n }\n }\n\n private buildForm(): IFormModel {\n return this.formModelFactory.create({\n fields: fields => {\n const fieldDefs: Record<string, any> = {\n name: fields.text().label(\"Name\").required().placeholder(\"Enter name\"),\n description: fields\n .text()\n .label(\"Description\")\n .renderer(\"textarea\")\n .placeholder(\"Enter description\"),\n tags: fields\n .text()\n .label(\"Tags\")\n .list()\n .renderer(\"tags\")\n .placeholder(\"Add tags\")\n };\n\n if (this.canUsePrivateFiles()) {\n fieldDefs.accessControl = fields\n .text()\n .label(\"Access Control\")\n .help(\"Control who can access this file.\")\n .options([\n { label: \"Public\", value: \"public\" },\n {\n label: \"Private (Authenticated)\",\n value: \"private-authenticated\"\n }\n ])\n .defaultValue(\"public\");\n }\n\n return fieldDefs;\n },\n layout: layout => {\n const rows = [layout.row(\"name\"), layout.row(\"description\"), layout.row(\"tags\")];\n\n if (this.canUsePrivateFiles()) {\n rows.push(layout.row(\"accessControl\"));\n }\n\n return rows;\n }\n });\n }\n\n private canUsePrivateFiles(): boolean {\n return this.wcp.getProject().canUsePrivateFiles();\n }\n\n private buildPreviewUrl(): string | null {\n if (!this.file?.key) {\n return null;\n }\n const srcPrefix = this.settingsRepository.settings?.srcPrefix ?? \"\";\n return `${srcPrefix}${this.file.key}`;\n }\n}\n\nexport const FileDetailsPresenter = Abstraction.createImplementation({\n implementation: FileDetailsPresenterImpl,\n dependencies: [\n GetFileUseCase,\n UpdateFileUseCase,\n FormModelFactory,\n FileManagerPermissions,\n GetSettingsRepository,\n WcpService\n ]\n});\n"],"names":["FileDetailsPresenterImpl","getFileUseCase","updateFileUseCase","formModelFactory","permissions","settingsRepository","wcp","makeAutoObservable","computed","undefined","id","runInAction","result","formData","data","updateData","fields","fieldDefs","layout","rows","srcPrefix","FileDetailsPresenter","Abstraction","GetFileUseCase","UpdateFileUseCase","FormModelFactory","FileManagerPermissions","GetSettingsRepository","WcpService"],"mappings":"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"}
1
+ {"version":3,"file":"presentation/FileDetails/FileDetailsPresenter.js","sources":["../../../src/presentation/FileDetails/FileDetailsPresenter.ts"],"sourcesContent":["import { makeAutoObservable, runInAction, computed } from \"mobx\";\nimport {\n FileDetailsPresenter as Abstraction,\n type IFileDetailsPresenter,\n type IFileDetailsViewModel\n} from \"./abstractions.js\";\nimport { GetFileUseCase } from \"../../features/getFile/abstractions.js\";\nimport { UpdateFileUseCase } from \"../../features/updateFile/abstractions.js\";\nimport { DeleteFileUseCase } from \"../../features/deleteFile/abstractions.js\";\nimport { FormModelFactory } from \"@webiny/app-admin/features/formModel/abstractions.js\";\nimport type { IFormModel } from \"@webiny/app-admin/features/formModel/abstractions.js\";\nimport { FileManagerPermissions } from \"../../features/permissions/abstractions.js\";\nimport { GetSettingsRepository } from \"../../features/settings/abstractions.js\";\nimport type { FmFile } from \"../../features/shared/types.js\";\n\nclass FileDetailsPresenterImpl implements IFileDetailsPresenter {\n private file: FmFile | null = null;\n private loading: string | null = null;\n private form: IFormModel;\n\n constructor(\n private getFileUseCase: GetFileUseCase.Interface,\n private updateFileUseCase: UpdateFileUseCase.Interface,\n private deleteFileUseCase: DeleteFileUseCase.Interface,\n private formModelFactory: FormModelFactory.Interface,\n private permissions: FileManagerPermissions.Interface,\n private settingsRepository: GetSettingsRepository.Interface\n ) {\n // Build an empty form initially.\n this.form = this.buildForm();\n\n makeAutoObservable(this, { vm: computed });\n }\n\n get vm(): IFileDetailsViewModel {\n return {\n file: this.file,\n loading: this.loading,\n form: this.form.vm,\n previewUrl: this.buildPreviewUrl(),\n permissions: {\n canEdit: this.permissions.canEdit(\"file\", this.file ?? undefined),\n canDelete: this.permissions.canDelete(\"file\", this.file ?? undefined)\n }\n };\n }\n\n async loadFile(id: string): Promise<void> {\n runInAction(() => {\n this.loading = \"Loading file...\";\n });\n\n try {\n const result = await this.getFileUseCase.execute({ id });\n runInAction(() => {\n if (result.success) {\n this.file = result.file;\n this.form = this.buildForm();\n this.form.setData({\n name: result.file.name ?? \"\",\n description: result.file.description ?? \"\",\n tags: result.file.tags ?? [],\n accessControl: result.file.accessControl?.type ?? \"public\"\n });\n\n if (!this.permissions.canEdit(\"file\", result.file)) {\n this.form.field(\"name\").setDisabled(true);\n this.form.field(\"description\").setDisabled(true);\n this.form.field(\"tags\").setDisabled(true);\n this.form.field(\"accessControl\").setDisabled(true);\n }\n }\n });\n } finally {\n runInAction(() => {\n this.loading = null;\n });\n }\n }\n\n setFile(file: FmFile): void {\n runInAction(() => {\n this.file = file;\n });\n }\n\n async saveFile(): Promise<boolean> {\n if (!this.file) {\n return false;\n }\n\n const data = await this.form.submit();\n if (!data) {\n return false;\n }\n\n runInAction(() => {\n this.loading = \"Saving changes...\";\n });\n\n try {\n await this.updateFileUseCase.execute({\n id: this.file.id,\n data: {\n name: data.name as string,\n description: data.description as string,\n tags: data.tags as string[],\n accessControl: {\n type: data.accessControl as \"public\" | \"private-authenticated\"\n }\n }\n });\n return true;\n } finally {\n runInAction(() => {\n this.loading = null;\n });\n }\n }\n\n private buildForm(): IFormModel {\n return this.formModelFactory.create({\n fields: fields => ({\n name: fields.text().label(\"Name\").required().placeholder(\"Enter name\"),\n description: fields\n .text()\n .label(\"Description\")\n .renderer(\"textarea\")\n .placeholder(\"Enter description\"),\n tags: fields.text().label(\"Tags\").list().renderer(\"tags\").placeholder(\"Add tags\"),\n accessControl: fields\n .text()\n .label(\"Access Control\")\n .help(\"Control who can access this file.\")\n .options([\n { label: \"Public\", value: \"public\" },\n { label: \"Private (Authenticated)\", value: \"private-authenticated\" }\n ])\n .defaultValue(\"public\")\n }),\n layout: layout => [\n layout.row(\"name\"),\n layout.row(\"description\"),\n layout.row(\"tags\"),\n layout.row(\"accessControl\")\n ]\n });\n }\n\n private buildPreviewUrl(): string | null {\n if (!this.file?.key) {\n return null;\n }\n const srcPrefix = this.settingsRepository.settings?.srcPrefix ?? \"\";\n return `${srcPrefix}${this.file.key}`;\n }\n}\n\nexport const FileDetailsPresenter = Abstraction.createImplementation({\n implementation: FileDetailsPresenterImpl,\n dependencies: [\n GetFileUseCase,\n UpdateFileUseCase,\n DeleteFileUseCase,\n FormModelFactory,\n FileManagerPermissions,\n GetSettingsRepository\n ]\n});\n"],"names":["FileDetailsPresenterImpl","getFileUseCase","updateFileUseCase","deleteFileUseCase","formModelFactory","permissions","settingsRepository","makeAutoObservable","computed","undefined","id","runInAction","result","file","data","fields","layout","srcPrefix","FileDetailsPresenter","Abstraction","GetFileUseCase","UpdateFileUseCase","DeleteFileUseCase","FormModelFactory","FileManagerPermissions","GetSettingsRepository"],"mappings":"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"}