@webiny/app-file-manager 6.4.12-beta.5 → 6.5.0-beta.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 (212) 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 +2 -2
  7. package/features/shared/FILE_FIELDS.js +4 -0
  8. package/features/shared/FILE_FIELDS.js.map +1 -1
  9. package/modules/AiEnrichment/AiImageEnrichmentEventHandler.d.ts +18 -0
  10. package/modules/AiEnrichment/AiImageEnrichmentEventHandler.js +33 -0
  11. package/modules/AiEnrichment/AiImageEnrichmentEventHandler.js.map +1 -0
  12. package/modules/AiEnrichment/feature.d.ts +1 -0
  13. package/modules/AiEnrichment/feature.js +11 -0
  14. package/modules/AiEnrichment/feature.js.map +1 -0
  15. package/modules/AiEnrichment/index.d.ts +2 -0
  16. package/modules/AiEnrichment/index.js +9 -0
  17. package/modules/AiEnrichment/index.js.map +1 -0
  18. package/modules/HeadlessCms/fieldType/AssetFieldSettingsModifier.d.ts +26 -0
  19. package/modules/HeadlessCms/fieldType/AssetFieldSettingsModifier.js +39 -0
  20. package/modules/HeadlessCms/fieldType/AssetFieldSettingsModifier.js.map +1 -0
  21. package/modules/HeadlessCms/fieldType/AssetFieldType.d.ts +34 -0
  22. package/modules/HeadlessCms/fieldType/AssetFieldType.js +42 -0
  23. package/modules/HeadlessCms/fieldType/AssetFieldType.js.map +1 -0
  24. package/modules/HeadlessCms/fieldType/AssetFormFieldType.d.ts +21 -0
  25. package/modules/HeadlessCms/fieldType/AssetFormFieldType.js +42 -0
  26. package/modules/HeadlessCms/fieldType/AssetFormFieldType.js.map +1 -0
  27. package/modules/HeadlessCms/fieldType/AssetInputRenderer.d.ts +15 -0
  28. package/modules/HeadlessCms/fieldType/AssetInputRenderer.js +20 -0
  29. package/modules/HeadlessCms/fieldType/AssetInputRenderer.js.map +1 -0
  30. package/modules/HeadlessCms/fieldType/AssetInputsRenderer.d.ts +15 -0
  31. package/modules/HeadlessCms/fieldType/AssetInputsRenderer.js +20 -0
  32. package/modules/HeadlessCms/fieldType/AssetInputsRenderer.js.map +1 -0
  33. package/modules/HeadlessCms/fieldType/FileFieldSettingsModifier.d.ts +16 -0
  34. package/modules/HeadlessCms/fieldType/FileFieldSettingsModifier.js +33 -0
  35. package/modules/HeadlessCms/fieldType/FileFieldSettingsModifier.js.map +1 -0
  36. package/modules/HeadlessCms/fieldType/FileFieldType.d.ts +25 -0
  37. package/modules/HeadlessCms/fieldType/FileFieldType.js +38 -0
  38. package/modules/HeadlessCms/fieldType/FileFieldType.js.map +1 -0
  39. package/modules/HeadlessCms/fieldType/FileInputRenderer.d.ts +15 -0
  40. package/modules/HeadlessCms/fieldType/FileInputRenderer.js +19 -0
  41. package/modules/HeadlessCms/fieldType/FileInputRenderer.js.map +1 -0
  42. package/modules/HeadlessCms/fieldType/FileInputsRenderer.d.ts +15 -0
  43. package/modules/HeadlessCms/fieldType/FileInputsRenderer.js +19 -0
  44. package/modules/HeadlessCms/fieldType/FileInputsRenderer.js.map +1 -0
  45. package/modules/HeadlessCms/fieldType/feature.d.ts +1 -0
  46. package/modules/HeadlessCms/fieldType/feature.js +27 -0
  47. package/modules/HeadlessCms/fieldType/feature.js.map +1 -0
  48. package/modules/HeadlessCms/fieldType/isAssetField.d.ts +2 -0
  49. package/modules/HeadlessCms/fieldType/isAssetField.js +4 -0
  50. package/modules/HeadlessCms/fieldType/isAssetField.js.map +1 -0
  51. package/package.json +25 -35
  52. package/presentation/FileActions/FileDetails/EditImage.d.ts +2 -0
  53. package/presentation/FileActions/FileDetails/EditImage.js +39 -0
  54. package/presentation/FileActions/FileDetails/EditImage.js.map +1 -0
  55. package/presentation/FileActions/index.js +4 -0
  56. package/presentation/FileActions/index.js.map +1 -1
  57. package/presentation/FileDetails/FileDetailsPresenter.d.ts +2 -0
  58. package/presentation/FileDetails/FileDetailsPresenter.js +5 -0
  59. package/presentation/FileDetails/FileDetailsPresenter.js.map +1 -1
  60. package/presentation/FileDetails/FileDetailsPresenter.test.js +1 -0
  61. package/presentation/FileDetails/FileDetailsPresenter.test.js.map +1 -1
  62. package/presentation/FileDetails/abstractions.d.ts +2 -0
  63. package/presentation/FileDetails/abstractions.js.map +1 -1
  64. package/presentation/FileDetails/components/Content.d.ts +5 -4
  65. package/presentation/FileDetails/components/FileDetailsDrawer.d.ts +2 -2
  66. package/presentation/FileList/FileListDataSource.d.ts +8 -12
  67. package/presentation/FileList/FileListDataSource.js +47 -87
  68. package/presentation/FileList/FileListDataSource.js.map +1 -1
  69. package/presentation/FileList/FileListPresenter.test.js +9 -3
  70. package/presentation/FileList/FileListPresenter.test.js.map +1 -1
  71. package/presentation/FileList/FileManagerPresenter.d.ts +1 -0
  72. package/presentation/FileList/FileManagerPresenter.js +15 -5
  73. package/presentation/FileList/FileManagerPresenter.js.map +1 -1
  74. package/presentation/FileList/abstractions.d.ts +3 -0
  75. package/presentation/FileList/abstractions.js.map +1 -1
  76. package/presentation/FileList/components/BulkActions/BulkActionBar.d.ts +2 -2
  77. package/presentation/FileList/components/BulkActions/BulkActionDelete.d.ts +2 -2
  78. package/presentation/FileList/components/BulkActions/BulkActionMove.d.ts +2 -2
  79. package/presentation/FileList/components/BulkActions/index.d.ts +0 -1
  80. package/presentation/FileList/components/BulkActions/index.js +0 -1
  81. package/presentation/FileList/components/BulkActions/useBulkActionWorker.d.ts +9 -8
  82. package/presentation/FileList/components/BulkActions/useBulkActionWorker.js +3 -9
  83. package/presentation/FileList/components/BulkActions/useBulkActionWorker.js.map +1 -1
  84. package/presentation/FileList/components/Filters/SubFoldersToggle.d.ts +2 -2
  85. package/presentation/FileList/components/Filters/TagsFilter.d.ts +2 -2
  86. package/presentation/FileList/components/Filters/TypeFilter.d.ts +2 -2
  87. package/presentation/FileList/components/Grid/FileGrid.d.ts +2 -2
  88. package/presentation/FileList/components/Grid/FileGrid.js +1 -1
  89. package/presentation/FileList/components/Grid/FileGrid.js.map +1 -1
  90. package/presentation/FileList/components/Grid/FileGrid.test.js +18 -7
  91. package/presentation/FileList/components/Grid/FileGrid.test.js.map +1 -1
  92. package/presentation/FileList/components/Header/FileManagerHeader.d.ts +2 -2
  93. package/presentation/FileList/components/Search/SearchBar.d.ts +2 -2
  94. package/presentation/FileList/components/Table/FileTable.d.ts +2 -2
  95. package/presentation/FileList/components/Table/FileTable.js +1 -1
  96. package/presentation/FileList/components/Table/FileTable.js.map +1 -1
  97. package/presentation/FileList/components/Table/FileTable.test.js +9 -4
  98. package/presentation/FileList/components/Table/FileTable.test.js.map +1 -1
  99. package/presentation/FileList/components/Upload/UploadProgress.d.ts +2 -2
  100. package/presentation/FileManager/FileManagerView.js +4 -2
  101. package/presentation/FileManager/FileManagerView.js.map +1 -1
  102. package/presentation/FileManager/RouteParamsSync.d.ts +2 -0
  103. package/presentation/FileManager/RouteParamsSync.js +30 -0
  104. package/presentation/FileManager/RouteParamsSync.js.map +1 -0
  105. package/presentation/Settings/components/SettingsView.d.ts +2 -2
  106. package/presentation/config/DefaultFileManagerConfig.js +1 -4
  107. package/presentation/config/DefaultFileManagerConfig.js.map +1 -1
  108. package/presentation/config/FileManagerViewConfig.d.ts +19 -25
  109. package/presentation/config/configComponents/Browser/BulkAction.d.ts +10 -8
  110. package/presentation/config/configComponents/Browser/BulkAction.js +3 -9
  111. package/presentation/config/configComponents/Browser/BulkAction.js.map +1 -1
  112. package/presentation/config/configComponents/Browser/FileAction.d.ts +2 -1
  113. package/presentation/config/configComponents/Browser/FolderAction.d.ts +2 -1
  114. package/presentation/config/configComponents/Browser/Table/Column.d.ts +9 -8
  115. package/presentation/config/configComponents/Browser/Table/index.d.ts +9 -9
  116. package/presentation/config/configComponents/Browser/index.d.ts +20 -20
  117. package/presentation/config/configComponents/Browser/index.js +0 -8
  118. package/presentation/config/configComponents/Browser/index.js.map +1 -1
  119. package/presentation/config/configComponents/FileDetails/index.d.ts +4 -2
  120. package/presentation/config/getThumbnailRenderer.js +1 -1
  121. package/presentation/config/getThumbnailRenderer.js.map +1 -1
  122. package/presentation/config/thumbnailRenderers/CroppedFileImage.d.ts +18 -0
  123. package/presentation/config/thumbnailRenderers/CroppedFileImage.js +66 -0
  124. package/presentation/config/thumbnailRenderers/CroppedFileImage.js.map +1 -0
  125. package/presentation/config/thumbnailRenderers/FilePreviewImageRenderer.js +6 -9
  126. package/presentation/config/thumbnailRenderers/FilePreviewImageRenderer.js.map +1 -1
  127. package/presentation/config/thumbnailRenderers/GridItemImageRenderer.js +6 -9
  128. package/presentation/config/thumbnailRenderers/GridItemImageRenderer.js.map +1 -1
  129. package/presentation/config/thumbnailRenderers/TableItemImageRenderer.js +6 -9
  130. package/presentation/config/thumbnailRenderers/TableItemImageRenderer.js.map +1 -1
  131. package/presentation/fieldRenderers/CmsAssetPickerRenderer.d.ts +22 -0
  132. package/presentation/fieldRenderers/CmsAssetPickerRenderer.js +56 -0
  133. package/presentation/fieldRenderers/CmsAssetPickerRenderer.js.map +1 -0
  134. package/presentation/fieldRenderers/CmsFilePickerRenderer.d.ts +13 -0
  135. package/presentation/fieldRenderers/CmsFilePickerRenderer.js +36 -0
  136. package/presentation/fieldRenderers/CmsFilePickerRenderer.js.map +1 -0
  137. package/presentation/fieldRenderers/CmsImageEditorDialog.d.ts +7 -0
  138. package/presentation/fieldRenderers/CmsImageEditorDialog.js +32 -0
  139. package/presentation/fieldRenderers/CmsImageEditorDialog.js.map +1 -0
  140. package/presentation/fieldRenderers/CmsMultiAssetPickerRenderer.d.ts +18 -0
  141. package/presentation/fieldRenderers/CmsMultiAssetPickerRenderer.js +88 -0
  142. package/presentation/fieldRenderers/CmsMultiAssetPickerRenderer.js.map +1 -0
  143. package/presentation/fieldRenderers/CmsMultiFilePickerRenderer.d.ts +13 -0
  144. package/presentation/fieldRenderers/CmsMultiFilePickerRenderer.js +60 -0
  145. package/presentation/fieldRenderers/CmsMultiFilePickerRenderer.js.map +1 -0
  146. package/presentation/fieldRenderers/CroppedAssetThumb.d.ts +15 -0
  147. package/presentation/fieldRenderers/CroppedAssetThumb.js +25 -0
  148. package/presentation/fieldRenderers/CroppedAssetThumb.js.map +1 -0
  149. package/presentation/fieldRenderers/assetValue.d.ts +10 -0
  150. package/presentation/fieldRenderers/assetValue.js +94 -0
  151. package/presentation/fieldRenderers/assetValue.js.map +1 -0
  152. package/presentation/fieldRenderers/assetValue.test.js +54 -0
  153. package/presentation/fieldRenderers/assetValue.test.js.map +1 -0
  154. package/presentation/hooks/useCmsImageEditor.d.ts +10 -0
  155. package/presentation/hooks/useCmsImageEditor.js +76 -0
  156. package/presentation/hooks/useCmsImageEditor.js.map +1 -0
  157. package/presentation/hooks/useEditImage.d.ts +14 -0
  158. package/presentation/hooks/useEditImage.js +67 -0
  159. package/presentation/hooks/useEditImage.js.map +1 -0
  160. package/routes.d.ts +1 -0
  161. package/routes.js +2 -1
  162. package/routes.js.map +1 -1
  163. package/modules/HeadlessCms/fileField.d.ts +0 -2
  164. package/modules/HeadlessCms/fileField.js +0 -44
  165. package/modules/HeadlessCms/fileField.js.map +0 -1
  166. package/modules/HeadlessCms/fileRenderer/fileField.d.ts +0 -2
  167. package/modules/HeadlessCms/fileRenderer/fileField.js +0 -53
  168. package/modules/HeadlessCms/fileRenderer/fileField.js.map +0 -1
  169. package/modules/HeadlessCms/fileRenderer/fileFields.d.ts +0 -2
  170. package/modules/HeadlessCms/fileRenderer/fileFields.js +0 -73
  171. package/modules/HeadlessCms/fileRenderer/fileFields.js.map +0 -1
  172. package/modules/HeadlessCms/fileRenderer/utils.d.ts +0 -2
  173. package/modules/HeadlessCms/fileRenderer/utils.js +0 -15
  174. package/modules/HeadlessCms/fileRenderer/utils.js.map +0 -1
  175. package/modules/HeadlessCms/index.d.ts +0 -1
  176. package/modules/HeadlessCms/index.js +0 -14
  177. package/modules/HeadlessCms/index.js.map +0 -1
  178. package/modules/Settings/graphql.d.ts +0 -12
  179. package/modules/Settings/graphql.js +0 -36
  180. package/modules/Settings/graphql.js.map +0 -1
  181. package/modules/Settings/views/FileManagerSettings.d.ts +0 -2
  182. package/modules/Settings/views/FileManagerSettings.js +0 -134
  183. package/modules/Settings/views/FileManagerSettings.js.map +0 -1
  184. package/presentation/FileList/components/BulkActions/BatchEditorDialog/AddOperation.d.ts +0 -7
  185. package/presentation/FileList/components/BulkActions/BatchEditorDialog/AddOperation.js +0 -15
  186. package/presentation/FileList/components/BulkActions/BatchEditorDialog/AddOperation.js.map +0 -1
  187. package/presentation/FileList/components/BulkActions/BatchEditorDialog/BatchEditor.d.ts +0 -15
  188. package/presentation/FileList/components/BulkActions/BatchEditorDialog/BatchEditor.js +0 -44
  189. package/presentation/FileList/components/BulkActions/BatchEditorDialog/BatchEditor.js.map +0 -1
  190. package/presentation/FileList/components/BulkActions/BatchEditorDialog/BatchEditorDialog.d.ts +0 -15
  191. package/presentation/FileList/components/BulkActions/BatchEditorDialog/BatchEditorDialog.js +0 -52
  192. package/presentation/FileList/components/BulkActions/BatchEditorDialog/BatchEditorDialog.js.map +0 -1
  193. package/presentation/FileList/components/BulkActions/BatchEditorDialog/BatchEditorDialogPresenter.d.ts +0 -61
  194. package/presentation/FileList/components/BulkActions/BatchEditorDialog/BatchEditorDialogPresenter.js +0 -111
  195. package/presentation/FileList/components/BulkActions/BatchEditorDialog/BatchEditorDialogPresenter.js.map +0 -1
  196. package/presentation/FileList/components/BulkActions/BatchEditorDialog/BatchEditorDialogPresenter.test.js +0 -372
  197. package/presentation/FileList/components/BulkActions/BatchEditorDialog/BatchEditorDialogPresenter.test.js.map +0 -1
  198. package/presentation/FileList/components/BulkActions/BatchEditorDialog/FieldRenderer.d.ts +0 -8
  199. package/presentation/FileList/components/BulkActions/BatchEditorDialog/FieldRenderer.js +0 -31
  200. package/presentation/FileList/components/BulkActions/BatchEditorDialog/FieldRenderer.js.map +0 -1
  201. package/presentation/FileList/components/BulkActions/BatchEditorDialog/Operation.d.ts +0 -11
  202. package/presentation/FileList/components/BulkActions/BatchEditorDialog/Operation.js +0 -33
  203. package/presentation/FileList/components/BulkActions/BatchEditorDialog/Operation.js.map +0 -1
  204. package/presentation/FileList/components/BulkActions/BatchEditorDialog/index.d.ts +0 -1
  205. package/presentation/FileList/components/BulkActions/BatchEditorDialog/index.js +0 -1
  206. package/presentation/FileList/components/BulkActions/BulkActionEdit.d.ts +0 -4
  207. package/presentation/FileList/components/BulkActions/BulkActionEdit.js +0 -105
  208. package/presentation/FileList/components/BulkActions/BulkActionEdit.js.map +0 -1
  209. package/presentation/config/configComponents/Browser/FolderFieldDecorator.d.ts +0 -7
  210. package/presentation/config/configComponents/Browser/FolderFieldDecorator.js +0 -11
  211. package/presentation/config/configComponents/Browser/FolderFieldDecorator.js.map +0 -1
  212. /package/presentation/{FileList/components/BulkActions/BatchEditorDialog/BatchEditorDialogPresenter.test.d.ts → fieldRenderers/assetValue.test.d.ts} +0 -0
@@ -0,0 +1,33 @@
1
+ import { CmsFieldEditorGroupModifier } from "@webiny/app-headless-cms/presentation/fieldEditor/abstractions.js";
2
+ class FileFieldSettingsModifierImpl {
3
+ shouldApply(context) {
4
+ return "file" === context.fieldType.type;
5
+ }
6
+ modifyForm(form) {
7
+ form.fields((fields)=>({
8
+ imagesOnly: fields.boolean().label("Images only").description("Allow only images to be selected").renderer("switch").defaultValue(false)
9
+ }));
10
+ form.layout((layout)=>[
11
+ layout.row("imagesOnly")
12
+ ]);
13
+ }
14
+ mapToForm(field) {
15
+ return {
16
+ imagesOnly: field.settings?.imagesOnly ?? false
17
+ };
18
+ }
19
+ mapFromForm(formData, field) {
20
+ if (!field.settings) field.settings = {};
21
+ field.settings.imagesOnly = formData.imagesOnly;
22
+ }
23
+ constructor(){
24
+ this.group = "general";
25
+ }
26
+ }
27
+ const FileFieldSettingsModifier = CmsFieldEditorGroupModifier.createImplementation({
28
+ implementation: FileFieldSettingsModifierImpl,
29
+ dependencies: []
30
+ });
31
+ export { FileFieldSettingsModifier };
32
+
33
+ //# sourceMappingURL=FileFieldSettingsModifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modules/HeadlessCms/fieldType/FileFieldSettingsModifier.js","sources":["../../../../src/modules/HeadlessCms/fieldType/FileFieldSettingsModifier.ts"],"sourcesContent":["import { CmsFieldEditorGroupModifier } from \"@webiny/app-headless-cms/presentation/fieldEditor/abstractions.js\";\nimport type {\n ICmsFieldEditorFormBuilder,\n ICmsFieldEditorContext\n} from \"@webiny/app-headless-cms/presentation/fieldEditor/abstractions.js\";\nimport type { CmsModelField } from \"@webiny/app-headless-cms-common/types/index.js\";\n\nclass FileFieldSettingsModifierImpl implements CmsFieldEditorGroupModifier.Interface {\n group = \"general\";\n\n shouldApply(context: ICmsFieldEditorContext) {\n return context.fieldType.type === \"file\";\n }\n\n modifyForm(form: ICmsFieldEditorFormBuilder) {\n form.fields(fields => ({\n imagesOnly: fields\n .boolean()\n .label(\"Images only\")\n .description(\"Allow only images to be selected\")\n .renderer(\"switch\")\n .defaultValue(false)\n }));\n form.layout(layout => [layout.row(\"imagesOnly\")]);\n }\n\n mapToForm(field: CmsModelField) {\n return { imagesOnly: field.settings?.imagesOnly ?? false };\n }\n\n mapFromForm(formData: Record<string, any>, field: CmsModelField) {\n if (!field.settings) {\n field.settings = {};\n }\n field.settings.imagesOnly = formData.imagesOnly;\n }\n}\n\nexport const FileFieldSettingsModifier = CmsFieldEditorGroupModifier.createImplementation({\n implementation: FileFieldSettingsModifierImpl,\n dependencies: []\n});\n"],"names":["FileFieldSettingsModifierImpl","context","form","fields","layout","field","formData","FileFieldSettingsModifier","CmsFieldEditorGroupModifier"],"mappings":";AAOA,MAAMA;IAGF,YAAYC,OAA+B,EAAE;QACzC,OAAOA,AAA2B,WAA3BA,QAAQ,SAAS,CAAC,IAAI;IACjC;IAEA,WAAWC,IAAgC,EAAE;QACzCA,KAAK,MAAM,CAACC,CAAAA,SAAW;gBACnB,YAAYA,OACP,OAAO,GACP,KAAK,CAAC,eACN,WAAW,CAAC,oCACZ,QAAQ,CAAC,UACT,YAAY,CAAC;YACtB;QACAD,KAAK,MAAM,CAACE,CAAAA,SAAU;gBAACA,OAAO,GAAG,CAAC;aAAc;IACpD;IAEA,UAAUC,KAAoB,EAAE;QAC5B,OAAO;YAAE,YAAYA,MAAM,QAAQ,EAAE,cAAc;QAAM;IAC7D;IAEA,YAAYC,QAA6B,EAAED,KAAoB,EAAE;QAC7D,IAAI,CAACA,MAAM,QAAQ,EACfA,MAAM,QAAQ,GAAG,CAAC;QAEtBA,MAAM,QAAQ,CAAC,UAAU,GAAGC,SAAS,UAAU;IACnD;;aA3BA,KAAK,GAAG;;AA4BZ;AAEO,MAAMC,4BAA4BC,4BAA4B,oBAAoB,CAAC;IACtF,gBAAgBR;IAChB,cAAc,EAAE;AACpB"}
@@ -0,0 +1,25 @@
1
+ import React from "react";
2
+ import { CmsFieldType } from "@webiny/app-headless-cms/presentation/fieldTypes/abstractions.js";
3
+ declare class FileFieldTypeImpl implements CmsFieldType.Interface {
4
+ type: string;
5
+ label: string;
6
+ description: string;
7
+ icon: React.JSX.Element;
8
+ allowList: boolean;
9
+ listLabel: string;
10
+ allowPredefinedValues: boolean;
11
+ validators: string[];
12
+ listValidators: string[];
13
+ deprecated: boolean;
14
+ createField(): {
15
+ type: string;
16
+ validation: never[];
17
+ renderer: {
18
+ name: string;
19
+ };
20
+ };
21
+ }
22
+ export declare const FileFieldType: typeof FileFieldTypeImpl & {
23
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/app-headless-cms/presentation/fieldTypes/abstractions.js").ICmsFieldType>;
24
+ };
25
+ export {};
@@ -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.12-beta.5",
3
+ "version": "6.5.0-beta.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.12-beta.5",
20
- "@webiny/app": "6.4.12-beta.5",
21
- "@webiny/app-aco": "6.4.12-beta.5",
22
- "@webiny/app-admin": "6.4.12-beta.5",
23
- "@webiny/app-headless-cms": "6.4.12-beta.5",
24
- "@webiny/app-headless-cms-common": "6.4.12-beta.5",
25
- "@webiny/app-websockets": "6.4.12-beta.5",
26
- "@webiny/di": "1.1.0",
27
- "@webiny/feature": "6.4.12-beta.5",
28
- "@webiny/form": "6.4.12-beta.5",
29
- "@webiny/icons": "6.4.12-beta.5",
30
- "@webiny/plugins": "6.4.12-beta.5",
31
- "@webiny/react-composition": "6.4.12-beta.5",
32
- "@webiny/react-properties": "6.4.12-beta.5",
33
- "@webiny/sdk": "6.4.12-beta.5",
34
- "@webiny/validation": "6.4.12-beta.5",
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.5.0-beta.1",
18
+ "@webiny/app": "6.5.0-beta.1",
19
+ "@webiny/app-aco": "6.5.0-beta.1",
20
+ "@webiny/app-admin": "6.5.0-beta.1",
21
+ "@webiny/app-headless-cms": "6.5.0-beta.1",
22
+ "@webiny/app-headless-cms-common": "6.5.0-beta.1",
23
+ "@webiny/app-websockets": "6.5.0-beta.1",
24
+ "@webiny/di": "1.0.2",
25
+ "@webiny/feature": "6.5.0-beta.1",
26
+ "@webiny/form": "6.5.0-beta.1",
27
+ "@webiny/icons": "6.5.0-beta.1",
28
+ "@webiny/plugins": "6.5.0-beta.1",
29
+ "@webiny/react-composition": "6.5.0-beta.1",
30
+ "@webiny/react-properties": "6.5.0-beta.1",
31
+ "@webiny/sdk": "6.5.0-beta.1",
32
+ "@webiny/validation": "6.5.0-beta.1",
39
33
  "bytes": "3.1.2",
40
- "dayjs": "1.11.23",
41
- "dot-prop-immutable": "2.1.1",
42
- "graphql": "16.14.2",
43
- "graphql-tag": "2.12.7",
34
+ "dayjs": "1.11.21",
44
35
  "lodash": "4.18.1",
45
36
  "mime": "4.1.0",
46
- "minimatch": "10.2.6",
47
- "mobx": "7.0.3",
48
- "mobx-react-lite": "5.0.3",
37
+ "minimatch": "10.2.5",
38
+ "mobx": "6.16.1",
39
+ "mobx-react-lite": "4.1.1",
49
40
  "react": "18.3.1",
50
41
  "react-dom": "18.3.1",
51
42
  "react-lazy-load": "4.0.1",
52
- "zod": "4.6.5"
43
+ "zod": "4.4.3"
53
44
  },
54
45
  "devDependencies": {
55
- "@svgr/webpack": "8.1.0",
56
- "@webiny/build-tools": "6.4.12-beta.5",
46
+ "@webiny/build-tools": "6.5.0-beta.1",
57
47
  "rimraf": "6.1.3",
58
- "typescript": "6.0.3",
59
- "vitest": "5.0.1"
48
+ "typescript": "7.0.2",
49
+ "vitest": "4.1.10"
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,7 @@ 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";
11
12
  const { Browser: Browser, FileDetails: FileDetails } = FileManagerViewConfig;
12
13
  const FileActions = ()=>/*#__PURE__*/ react.createElement(react.Fragment, null, /*#__PURE__*/ react.createElement(Browser.Grid.Item.Action, {
13
14
  name: "settings",
@@ -21,6 +22,9 @@ const FileActions = ()=>/*#__PURE__*/ react.createElement(react.Fragment, null,
21
22
  }), /*#__PURE__*/ react.createElement(Browser.Grid.Item.Action, {
22
23
  name: "delete",
23
24
  element: /*#__PURE__*/ react.createElement(Delete, null)
25
+ }), /*#__PURE__*/ react.createElement(FileDetails.Action, {
26
+ name: "editImage",
27
+ element: /*#__PURE__*/ react.createElement(EditImage, null)
24
28
  }), /*#__PURE__*/ react.createElement(FileDetails.Action, {
25
29
  name: "download",
26
30
  element: /*#__PURE__*/ react.createElement(Download_js_Download, null)
@@ -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\";\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 </>\n );\n};\n"],"names":["Browser","FileDetails","FileManagerViewConfig","FileActions","GridSettings","GridDownload","GridMoveToFolder","GridDelete","FileDetailsEditImage","FileDetailsDownload","FileDetailsMoveToFolder","FileDetailsCopyUrl","FileDetailsDeleteImage"],"mappings":";;;;;;;;;;;AAYA,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"}
@@ -5,6 +5,7 @@ import { UpdateFileUseCase } from "../../features/updateFile/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;
@@ -18,6 +19,7 @@ declare class FileDetailsPresenterImpl implements IFileDetailsPresenter {
18
19
  constructor(getFileUseCase: GetFileUseCase.Interface, updateFileUseCase: UpdateFileUseCase.Interface, formModelFactory: FormModelFactory.Interface, permissions: FileManagerPermissions.Interface, settingsRepository: GetSettingsRepository.Interface, wcp: WcpService.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
25
  private canUsePrivateFiles;
@@ -66,6 +66,11 @@ class FileDetailsPresenterImpl {
66
66
  });
67
67
  }
68
68
  }
69
+ setFile(file) {
70
+ runInAction(()=>{
71
+ this.file = file;
72
+ });
73
+ }
69
74
  async saveFile() {
70
75
  if (!this.file) return false;
71
76
  const data = await this.form.submit();
@@ -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 { 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 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 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","file","data","updateData","fields","fieldDefs","layout","rows","srcPrefix","FileDetailsPresenter","Abstraction","GetFileUseCase","UpdateFileUseCase","FormModelFactory","FileManagerPermissions","GetSettingsRepository","WcpService"],"mappings":"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"}
@@ -13,6 +13,7 @@ function createMockFormModel(overrides) {
13
13
  const vm = {
14
14
  layout: [],
15
15
  errors: [],
16
+ hasErrors: false,
16
17
  isDirty: false,
17
18
  isValid: true,
18
19
  submitCount: 0,