@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.
- package/app.js +21 -2
- package/app.js.map +1 -1
- package/domain/tagsHelpers.d.ts +2 -2
- package/domain/types.d.ts +0 -8
- package/features/permissions/abstractions.d.ts +2 -2
- package/features/permissions/feature.d.ts +3 -3
- package/features/shared/FILE_FIELDS.js +4 -0
- package/features/shared/FILE_FIELDS.js.map +1 -1
- package/features/shared/FileFieldsProviderWithWcp.d.ts +5 -5
- package/features/shared/FileFieldsProviderWithWcp.js +7 -7
- package/features/shared/FileFieldsProviderWithWcp.js.map +1 -1
- package/modules/AiEnrichment/AiImageEnrichmentEventHandler.d.ts +18 -0
- package/modules/AiEnrichment/AiImageEnrichmentEventHandler.js +33 -0
- package/modules/AiEnrichment/AiImageEnrichmentEventHandler.js.map +1 -0
- package/modules/AiEnrichment/ReenrichFileGateway.d.ts +12 -0
- package/modules/AiEnrichment/ReenrichFileGateway.js +23 -0
- package/modules/AiEnrichment/ReenrichFileGateway.js.map +1 -0
- package/modules/AiEnrichment/ReenrichWithAi.d.ts +11 -0
- package/modules/AiEnrichment/ReenrichWithAi.js +57 -0
- package/modules/AiEnrichment/ReenrichWithAi.js.map +1 -0
- package/modules/AiEnrichment/ReenrichWithAiPresenter.d.ts +50 -0
- package/modules/AiEnrichment/ReenrichWithAiPresenter.js +114 -0
- package/modules/AiEnrichment/ReenrichWithAiPresenter.js.map +1 -0
- package/modules/AiEnrichment/StreamingPlaceholder.d.ts +15 -0
- package/modules/AiEnrichment/StreamingPlaceholder.js +32 -0
- package/modules/AiEnrichment/StreamingPlaceholder.js.map +1 -0
- package/modules/AiEnrichment/abstractions.d.ts +70 -0
- package/modules/AiEnrichment/abstractions.js +6 -0
- package/modules/AiEnrichment/abstractions.js.map +1 -0
- package/modules/AiEnrichment/feature.d.ts +3 -0
- package/modules/AiEnrichment/feature.js +21 -0
- package/modules/AiEnrichment/feature.js.map +1 -0
- package/modules/AiEnrichment/index.d.ts +2 -0
- package/modules/AiEnrichment/index.js +9 -0
- package/modules/AiEnrichment/index.js.map +1 -0
- package/modules/Enterprise/index.js +3 -3
- package/modules/Enterprise/index.js.map +1 -1
- package/modules/HeadlessCms/fieldType/AssetFieldSettingsModifier.d.ts +26 -0
- package/modules/HeadlessCms/fieldType/AssetFieldSettingsModifier.js +39 -0
- package/modules/HeadlessCms/fieldType/AssetFieldSettingsModifier.js.map +1 -0
- package/modules/HeadlessCms/fieldType/AssetFieldType.d.ts +34 -0
- package/modules/HeadlessCms/fieldType/AssetFieldType.js +42 -0
- package/modules/HeadlessCms/fieldType/AssetFieldType.js.map +1 -0
- package/modules/HeadlessCms/fieldType/AssetFormFieldType.d.ts +21 -0
- package/modules/HeadlessCms/fieldType/AssetFormFieldType.js +42 -0
- package/modules/HeadlessCms/fieldType/AssetFormFieldType.js.map +1 -0
- package/modules/HeadlessCms/fieldType/AssetInputRenderer.d.ts +15 -0
- package/modules/HeadlessCms/fieldType/AssetInputRenderer.js +20 -0
- package/modules/HeadlessCms/fieldType/AssetInputRenderer.js.map +1 -0
- package/modules/HeadlessCms/fieldType/AssetInputsRenderer.d.ts +15 -0
- package/modules/HeadlessCms/fieldType/AssetInputsRenderer.js +20 -0
- package/modules/HeadlessCms/fieldType/AssetInputsRenderer.js.map +1 -0
- package/modules/HeadlessCms/fieldType/FileFieldSettingsModifier.d.ts +16 -0
- package/modules/HeadlessCms/fieldType/FileFieldSettingsModifier.js +33 -0
- package/modules/HeadlessCms/fieldType/FileFieldSettingsModifier.js.map +1 -0
- package/modules/HeadlessCms/fieldType/FileFieldType.d.ts +25 -0
- package/modules/HeadlessCms/fieldType/FileFieldType.js +38 -0
- package/modules/HeadlessCms/fieldType/FileFieldType.js.map +1 -0
- package/modules/HeadlessCms/fieldType/FileInputRenderer.d.ts +15 -0
- package/modules/HeadlessCms/fieldType/FileInputRenderer.js +19 -0
- package/modules/HeadlessCms/fieldType/FileInputRenderer.js.map +1 -0
- package/modules/HeadlessCms/fieldType/FileInputsRenderer.d.ts +15 -0
- package/modules/HeadlessCms/fieldType/FileInputsRenderer.js +19 -0
- package/modules/HeadlessCms/fieldType/FileInputsRenderer.js.map +1 -0
- package/modules/HeadlessCms/fieldType/feature.d.ts +1 -0
- package/modules/HeadlessCms/fieldType/feature.js +27 -0
- package/modules/HeadlessCms/fieldType/feature.js.map +1 -0
- package/modules/HeadlessCms/fieldType/isAssetField.d.ts +2 -0
- package/modules/HeadlessCms/fieldType/isAssetField.js +4 -0
- package/modules/HeadlessCms/fieldType/isAssetField.js.map +1 -0
- package/package.json +24 -34
- package/presentation/FileActions/FileDetails/EditImage.d.ts +2 -0
- package/presentation/FileActions/FileDetails/EditImage.js +39 -0
- package/presentation/FileActions/FileDetails/EditImage.js.map +1 -0
- package/presentation/FileActions/index.js +8 -0
- package/presentation/FileActions/index.js.map +1 -1
- package/presentation/FileDetails/FileDetailsPresenter.d.ts +5 -4
- package/presentation/FileDetails/FileDetailsPresenter.js +40 -46
- package/presentation/FileDetails/FileDetailsPresenter.js.map +1 -1
- package/presentation/FileDetails/FileDetailsPresenter.test.js +39 -56
- package/presentation/FileDetails/FileDetailsPresenter.test.js.map +1 -1
- package/presentation/FileDetails/abstractions.d.ts +2 -0
- package/presentation/FileDetails/abstractions.js.map +1 -1
- package/presentation/FileDetails/components/Content.d.ts +6 -4
- package/presentation/FileDetails/components/Content.js +2 -2
- package/presentation/FileDetails/components/Content.js.map +1 -1
- package/presentation/FileDetails/components/FileDetailsDrawer.d.ts +2 -2
- package/presentation/FileDetails/components/FileDetailsDrawer.js +11 -5
- package/presentation/FileDetails/components/FileDetailsDrawer.js.map +1 -1
- package/presentation/FileList/FileListDataSource.d.ts +8 -12
- package/presentation/FileList/FileListDataSource.js +47 -87
- package/presentation/FileList/FileListDataSource.js.map +1 -1
- package/presentation/FileList/FileListPresenter.test.js +9 -3
- package/presentation/FileList/FileListPresenter.test.js.map +1 -1
- package/presentation/FileList/FileManagerPresenter.d.ts +1 -0
- package/presentation/FileList/FileManagerPresenter.js +15 -5
- package/presentation/FileList/FileManagerPresenter.js.map +1 -1
- package/presentation/FileList/abstractions.d.ts +3 -0
- package/presentation/FileList/abstractions.js.map +1 -1
- package/presentation/FileList/components/BulkActions/BulkActionBar.d.ts +2 -2
- package/presentation/FileList/components/BulkActions/BulkActionDelete.d.ts +2 -2
- package/presentation/FileList/components/BulkActions/BulkActionMove.d.ts +2 -2
- package/presentation/FileList/components/BulkActions/index.d.ts +0 -1
- package/presentation/FileList/components/BulkActions/index.js +0 -1
- package/presentation/FileList/components/BulkActions/useBulkActionWorker.d.ts +9 -8
- package/presentation/FileList/components/BulkActions/useBulkActionWorker.js +3 -9
- package/presentation/FileList/components/BulkActions/useBulkActionWorker.js.map +1 -1
- package/presentation/FileList/components/Filters/SubFoldersToggle.d.ts +2 -2
- package/presentation/FileList/components/Filters/TagsFilter.d.ts +2 -2
- package/presentation/FileList/components/Filters/TypeFilter.d.ts +2 -2
- package/presentation/FileList/components/Grid/FileGrid.d.ts +2 -2
- package/presentation/FileList/components/Grid/FileGrid.js +1 -1
- package/presentation/FileList/components/Grid/FileGrid.js.map +1 -1
- package/presentation/FileList/components/Grid/FileGrid.test.js +18 -7
- package/presentation/FileList/components/Grid/FileGrid.test.js.map +1 -1
- package/presentation/FileList/components/Header/FileManagerHeader.d.ts +2 -2
- package/presentation/FileList/components/Search/SearchBar.d.ts +2 -2
- package/presentation/FileList/components/Table/FileTable.d.ts +2 -2
- package/presentation/FileList/components/Table/FileTable.js +1 -1
- package/presentation/FileList/components/Table/FileTable.js.map +1 -1
- package/presentation/FileList/components/Table/FileTable.test.js +9 -4
- package/presentation/FileList/components/Table/FileTable.test.js.map +1 -1
- package/presentation/FileList/components/Upload/UploadProgress.d.ts +2 -2
- package/presentation/FileManager/FileManagerBreadcrumbs.d.ts +12 -0
- package/presentation/FileManager/FileManagerBreadcrumbs.js +37 -0
- package/presentation/FileManager/FileManagerBreadcrumbs.js.map +1 -0
- package/presentation/FileManager/FileManagerView.js +36 -2
- package/presentation/FileManager/FileManagerView.js.map +1 -1
- package/presentation/FileManager/RouteParamsSync.d.ts +2 -0
- package/presentation/FileManager/RouteParamsSync.js +30 -0
- package/presentation/FileManager/RouteParamsSync.js.map +1 -0
- package/presentation/Settings/components/SettingsView.d.ts +2 -2
- package/presentation/config/DefaultFileManagerConfig.js +13 -11
- package/presentation/config/DefaultFileManagerConfig.js.map +1 -1
- package/presentation/config/FileManagerViewConfig.d.ts +19 -25
- package/presentation/config/configComponents/Browser/BulkAction.d.ts +10 -8
- package/presentation/config/configComponents/Browser/BulkAction.js +3 -9
- package/presentation/config/configComponents/Browser/BulkAction.js.map +1 -1
- package/presentation/config/configComponents/Browser/FileAction.d.ts +2 -1
- package/presentation/config/configComponents/Browser/FolderAction.d.ts +2 -1
- package/presentation/config/configComponents/Browser/Table/Column.d.ts +9 -8
- package/presentation/config/configComponents/Browser/Table/index.d.ts +9 -9
- package/presentation/config/configComponents/Browser/index.d.ts +20 -20
- package/presentation/config/configComponents/Browser/index.js +0 -8
- package/presentation/config/configComponents/Browser/index.js.map +1 -1
- package/presentation/config/configComponents/FileDetails/index.d.ts +4 -2
- package/presentation/config/thumbnailRenderers/CroppedFileImage.d.ts +18 -0
- package/presentation/config/thumbnailRenderers/CroppedFileImage.js +66 -0
- package/presentation/config/thumbnailRenderers/CroppedFileImage.js.map +1 -0
- package/presentation/config/thumbnailRenderers/FilePreviewImageRenderer.js +6 -9
- package/presentation/config/thumbnailRenderers/FilePreviewImageRenderer.js.map +1 -1
- package/presentation/config/thumbnailRenderers/GridItemImageRenderer.js +6 -9
- package/presentation/config/thumbnailRenderers/GridItemImageRenderer.js.map +1 -1
- package/presentation/config/thumbnailRenderers/TableItemImageRenderer.js +6 -9
- package/presentation/config/thumbnailRenderers/TableItemImageRenderer.js.map +1 -1
- package/presentation/fieldRenderers/CmsAssetPickerRenderer.d.ts +22 -0
- package/presentation/fieldRenderers/CmsAssetPickerRenderer.js +56 -0
- package/presentation/fieldRenderers/CmsAssetPickerRenderer.js.map +1 -0
- package/presentation/fieldRenderers/CmsFilePickerRenderer.d.ts +13 -0
- package/presentation/fieldRenderers/CmsFilePickerRenderer.js +36 -0
- package/presentation/fieldRenderers/CmsFilePickerRenderer.js.map +1 -0
- package/presentation/fieldRenderers/CmsImageEditorDialog.d.ts +7 -0
- package/presentation/fieldRenderers/CmsImageEditorDialog.js +32 -0
- package/presentation/fieldRenderers/CmsImageEditorDialog.js.map +1 -0
- package/presentation/fieldRenderers/CmsMultiAssetPickerRenderer.d.ts +18 -0
- package/presentation/fieldRenderers/CmsMultiAssetPickerRenderer.js +88 -0
- package/presentation/fieldRenderers/CmsMultiAssetPickerRenderer.js.map +1 -0
- package/presentation/fieldRenderers/CmsMultiFilePickerRenderer.d.ts +13 -0
- package/presentation/fieldRenderers/CmsMultiFilePickerRenderer.js +60 -0
- package/presentation/fieldRenderers/CmsMultiFilePickerRenderer.js.map +1 -0
- package/presentation/fieldRenderers/CroppedAssetThumb.d.ts +15 -0
- package/presentation/fieldRenderers/CroppedAssetThumb.js +25 -0
- package/presentation/fieldRenderers/CroppedAssetThumb.js.map +1 -0
- package/presentation/fieldRenderers/assetValue.d.ts +10 -0
- package/presentation/fieldRenderers/assetValue.js +88 -0
- package/presentation/fieldRenderers/assetValue.js.map +1 -0
- package/presentation/hooks/useCmsImageEditor.d.ts +10 -0
- package/presentation/hooks/useCmsImageEditor.js +76 -0
- package/presentation/hooks/useCmsImageEditor.js.map +1 -0
- package/presentation/hooks/useEditImage.d.ts +14 -0
- package/presentation/hooks/useEditImage.js +67 -0
- package/presentation/hooks/useEditImage.js.map +1 -0
- package/routes.d.ts +1 -0
- package/routes.js +2 -1
- package/routes.js.map +1 -1
- package/modules/HeadlessCms/fileField.d.ts +0 -2
- package/modules/HeadlessCms/fileField.js +0 -44
- package/modules/HeadlessCms/fileField.js.map +0 -1
- package/modules/HeadlessCms/fileRenderer/fileField.d.ts +0 -2
- package/modules/HeadlessCms/fileRenderer/fileField.js +0 -53
- package/modules/HeadlessCms/fileRenderer/fileField.js.map +0 -1
- package/modules/HeadlessCms/fileRenderer/fileFields.d.ts +0 -2
- package/modules/HeadlessCms/fileRenderer/fileFields.js +0 -73
- package/modules/HeadlessCms/fileRenderer/fileFields.js.map +0 -1
- package/modules/HeadlessCms/fileRenderer/utils.d.ts +0 -2
- package/modules/HeadlessCms/fileRenderer/utils.js +0 -15
- package/modules/HeadlessCms/fileRenderer/utils.js.map +0 -1
- package/modules/HeadlessCms/index.d.ts +0 -1
- package/modules/HeadlessCms/index.js +0 -14
- package/modules/HeadlessCms/index.js.map +0 -1
- package/modules/Settings/graphql.d.ts +0 -12
- package/modules/Settings/graphql.js +0 -36
- package/modules/Settings/graphql.js.map +0 -1
- package/modules/Settings/views/FileManagerSettings.d.ts +0 -2
- package/modules/Settings/views/FileManagerSettings.js +0 -134
- package/modules/Settings/views/FileManagerSettings.js.map +0 -1
- package/presentation/FileList/components/BulkActions/BatchEditorDialog/AddOperation.d.ts +0 -7
- package/presentation/FileList/components/BulkActions/BatchEditorDialog/AddOperation.js +0 -15
- package/presentation/FileList/components/BulkActions/BatchEditorDialog/AddOperation.js.map +0 -1
- package/presentation/FileList/components/BulkActions/BatchEditorDialog/BatchEditor.d.ts +0 -15
- package/presentation/FileList/components/BulkActions/BatchEditorDialog/BatchEditor.js +0 -44
- package/presentation/FileList/components/BulkActions/BatchEditorDialog/BatchEditor.js.map +0 -1
- package/presentation/FileList/components/BulkActions/BatchEditorDialog/BatchEditorDialog.d.ts +0 -15
- package/presentation/FileList/components/BulkActions/BatchEditorDialog/BatchEditorDialog.js +0 -52
- package/presentation/FileList/components/BulkActions/BatchEditorDialog/BatchEditorDialog.js.map +0 -1
- package/presentation/FileList/components/BulkActions/BatchEditorDialog/BatchEditorDialogPresenter.d.ts +0 -61
- package/presentation/FileList/components/BulkActions/BatchEditorDialog/BatchEditorDialogPresenter.js +0 -111
- package/presentation/FileList/components/BulkActions/BatchEditorDialog/BatchEditorDialogPresenter.js.map +0 -1
- package/presentation/FileList/components/BulkActions/BatchEditorDialog/BatchEditorDialogPresenter.test.d.ts +0 -1
- package/presentation/FileList/components/BulkActions/BatchEditorDialog/BatchEditorDialogPresenter.test.js +0 -372
- package/presentation/FileList/components/BulkActions/BatchEditorDialog/BatchEditorDialogPresenter.test.js.map +0 -1
- package/presentation/FileList/components/BulkActions/BatchEditorDialog/FieldRenderer.d.ts +0 -8
- package/presentation/FileList/components/BulkActions/BatchEditorDialog/FieldRenderer.js +0 -31
- package/presentation/FileList/components/BulkActions/BatchEditorDialog/FieldRenderer.js.map +0 -1
- package/presentation/FileList/components/BulkActions/BatchEditorDialog/Operation.d.ts +0 -11
- package/presentation/FileList/components/BulkActions/BatchEditorDialog/Operation.js +0 -33
- package/presentation/FileList/components/BulkActions/BatchEditorDialog/Operation.js.map +0 -1
- package/presentation/FileList/components/BulkActions/BatchEditorDialog/index.d.ts +0 -1
- package/presentation/FileList/components/BulkActions/BatchEditorDialog/index.js +0 -1
- package/presentation/FileList/components/BulkActions/BulkActionEdit.d.ts +0 -4
- package/presentation/FileList/components/BulkActions/BulkActionEdit.js +0 -105
- package/presentation/FileList/components/BulkActions/BulkActionEdit.js.map +0 -1
- package/presentation/config/configComponents/Browser/FolderFieldDecorator.d.ts +0 -7
- package/presentation/config/configComponents/Browser/FolderFieldDecorator.js +0 -11
- 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 @@
|
|
|
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.
|
|
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.
|
|
20
|
-
"@webiny/app": "6.
|
|
21
|
-
"@webiny/app-aco": "6.
|
|
22
|
-
"@webiny/app-admin": "6.
|
|
23
|
-
"@webiny/app-headless-cms": "6.
|
|
24
|
-
"@webiny/app-headless-cms-common": "6.
|
|
25
|
-
"@webiny/app-websockets": "6.
|
|
26
|
-
"@webiny/di": "1.0
|
|
27
|
-
"@webiny/feature": "6.
|
|
28
|
-
"@webiny/form": "6.
|
|
29
|
-
"@webiny/icons": "6.
|
|
30
|
-
"@webiny/plugins": "6.
|
|
31
|
-
"@webiny/react-composition": "6.
|
|
32
|
-
"@webiny/react-properties": "6.
|
|
33
|
-
"@webiny/sdk": "6.
|
|
34
|
-
"@webiny/validation": "6.
|
|
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.
|
|
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.
|
|
47
|
-
"mobx": "
|
|
48
|
-
"mobx-react-lite": "
|
|
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
|
-
"@
|
|
56
|
-
"@webiny/build-tools": "6.4.11",
|
|
46
|
+
"@webiny/build-tools": "6.6.0-alpha.1",
|
|
57
47
|
"rimraf": "6.1.3",
|
|
58
|
-
"typescript": "
|
|
59
|
-
"vitest": "4.1.
|
|
48
|
+
"typescript": "7.0.2",
|
|
49
|
+
"vitest": "4.1.11"
|
|
60
50
|
},
|
|
61
51
|
"publishConfig": {
|
|
62
52
|
"access": "public"
|
|
@@ -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":"
|
|
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
|
|
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
|
|
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
|
-
|
|
48
|
+
this.form.setData({
|
|
49
49
|
name: result.file.name ?? "",
|
|
50
50
|
description: result.file.description ?? "",
|
|
51
|
-
tags: result.file.tags ?? []
|
|
52
|
-
|
|
53
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
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
|
-
|
|
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":";;;;;;;;AAeA,MAAMA;IAKF,YACYC,cAAwC,EACxCC,iBAA8C,EAC9CC,iBAA8C,EAC9CC,gBAA4C,EAC5CC,WAA6C,EAC7CC,kBAAmD,CAC7D;aANUL,cAAc,GAAdA;aACAC,iBAAiB,GAAjBA;aACAC,iBAAiB,GAAjBA;aACAC,gBAAgB,GAAhBA;aACAC,WAAW,GAAXA;aACAC,kBAAkB,GAAlBA;aAVJ,IAAI,GAAkB;aACtB,OAAO,GAAkB;QAY7B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS;QAE1BC,mBAAmB,IAAI,EAAE;YAAE,IAAIC;QAAS;IAC5C;IAEA,IAAI,KAA4B;QAC5B,OAAO;YACH,MAAM,IAAI,CAAC,IAAI;YACf,SAAS,IAAI,CAAC,OAAO;YACrB,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE;YAClB,YAAY,IAAI,CAAC,eAAe;YAChC,aAAa;gBACT,SAAS,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,IAAI,CAAC,IAAI,IAAIC;gBACvD,WAAW,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,IAAI,CAAC,IAAI,IAAIA;YAC/D;QACJ;IACJ;IAEA,MAAM,SAASC,EAAU,EAAiB;QACtCC,YAAY;YACR,IAAI,CAAC,OAAO,GAAG;QACnB;QAEA,IAAI;YACA,MAAMC,SAAS,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC;gBAAEF;YAAG;YACtDC,YAAY;gBACR,IAAIC,OAAO,OAAO,EAAE;oBAChB,IAAI,CAAC,IAAI,GAAGA,OAAO,IAAI;oBACvB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS;oBAC1B,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;wBACd,MAAMA,OAAO,IAAI,CAAC,IAAI,IAAI;wBAC1B,aAAaA,OAAO,IAAI,CAAC,WAAW,IAAI;wBACxC,MAAMA,OAAO,IAAI,CAAC,IAAI,IAAI,EAAE;wBAC5B,eAAeA,OAAO,IAAI,CAAC,aAAa,EAAE,QAAQ;oBACtD;oBAEA,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQA,OAAO,IAAI,GAAG;wBAChD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,WAAW,CAAC;wBACpC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,eAAe,WAAW,CAAC;wBAC3C,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,WAAW,CAAC;wBACpC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,iBAAiB,WAAW,CAAC;oBACjD;gBACJ;YACJ;QACJ,SAAU;YACND,YAAY;gBACR,IAAI,CAAC,OAAO,GAAG;YACnB;QACJ;IACJ;IAEA,QAAQE,IAAY,EAAQ;QACxBF,YAAY;YACR,IAAI,CAAC,IAAI,GAAGE;QAChB;IACJ;IAEA,MAAM,WAA6B;QAC/B,IAAI,CAAC,IAAI,CAAC,IAAI,EACV,OAAO;QAGX,MAAMC,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM;QACnC,IAAI,CAACA,MACD,OAAO;QAGXH,YAAY;YACR,IAAI,CAAC,OAAO,GAAG;QACnB;QAEA,IAAI;YACA,MAAM,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC;gBACjC,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE;gBAChB,MAAM;oBACF,MAAMG,KAAK,IAAI;oBACf,aAAaA,KAAK,WAAW;oBAC7B,MAAMA,KAAK,IAAI;oBACf,eAAe;wBACX,MAAMA,KAAK,aAAa;oBAC5B;gBACJ;YACJ;YACA,OAAO;QACX,SAAU;YACNH,YAAY;gBACR,IAAI,CAAC,OAAO,GAAG;YACnB;QACJ;IACJ;IAEQ,YAAwB;QAC5B,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;YAChC,QAAQI,CAAAA,SAAW;oBACf,MAAMA,OAAO,IAAI,GAAG,KAAK,CAAC,QAAQ,QAAQ,GAAG,WAAW,CAAC;oBACzD,aAAaA,OACR,IAAI,GACJ,KAAK,CAAC,eACN,QAAQ,CAAC,YACT,WAAW,CAAC;oBACjB,MAAMA,OAAO,IAAI,GAAG,KAAK,CAAC,QAAQ,IAAI,GAAG,QAAQ,CAAC,QAAQ,WAAW,CAAC;oBACtE,eAAeA,OACV,IAAI,GACJ,KAAK,CAAC,kBACN,IAAI,CAAC,qCACL,OAAO,CAAC;wBACL;4BAAE,OAAO;4BAAU,OAAO;wBAAS;wBACnC;4BAAE,OAAO;4BAA2B,OAAO;wBAAwB;qBACtE,EACA,YAAY,CAAC;gBACtB;YACA,QAAQC,CAAAA,SAAU;oBACdA,OAAO,GAAG,CAAC;oBACXA,OAAO,GAAG,CAAC;oBACXA,OAAO,GAAG,CAAC;oBACXA,OAAO,GAAG,CAAC;iBACd;QACL;IACJ;IAEQ,kBAAiC;QACrC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KACZ,OAAO;QAEX,MAAMC,YAAY,IAAI,CAAC,kBAAkB,CAAC,QAAQ,EAAE,aAAa;QACjE,OAAO,GAAGA,YAAY,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;IACzC;AACJ;AAEO,MAAMC,4CAAuBC,qBAAAA,oBAAgC,CAAC;IACjE,gBAAgBnB;IAChB,cAAc;QACVoB;QACAC;QACAC;QACAC;QACAC;QACAC;KACH;AACL"}
|