@webiny/app-file-manager 6.4.12-beta.4 → 6.5.0-beta.0
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 +2 -2
- package/features/shared/FILE_FIELDS.js +4 -0
- package/features/shared/FILE_FIELDS.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/feature.d.ts +1 -0
- package/modules/AiEnrichment/feature.js +11 -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/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 +25 -35
- 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 +4 -0
- package/presentation/FileActions/index.js.map +1 -1
- package/presentation/FileDetails/FileDetailsPresenter.d.ts +2 -0
- package/presentation/FileDetails/FileDetailsPresenter.js +5 -0
- package/presentation/FileDetails/FileDetailsPresenter.js.map +1 -1
- package/presentation/FileDetails/FileDetailsPresenter.test.js +1 -0
- 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 +5 -4
- package/presentation/FileDetails/components/FileDetailsDrawer.d.ts +2 -2
- 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/FileManagerView.js +4 -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 +1 -4
- 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/getThumbnailRenderer.js +1 -1
- package/presentation/config/getThumbnailRenderer.js.map +1 -1
- 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,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 @@
|
|
|
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.5.0-beta.0",
|
|
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.
|
|
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.5.0-beta.0",
|
|
18
|
+
"@webiny/app": "6.5.0-beta.0",
|
|
19
|
+
"@webiny/app-aco": "6.5.0-beta.0",
|
|
20
|
+
"@webiny/app-admin": "6.5.0-beta.0",
|
|
21
|
+
"@webiny/app-headless-cms": "6.5.0-beta.0",
|
|
22
|
+
"@webiny/app-headless-cms-common": "6.5.0-beta.0",
|
|
23
|
+
"@webiny/app-websockets": "6.5.0-beta.0",
|
|
24
|
+
"@webiny/di": "1.0.2",
|
|
25
|
+
"@webiny/feature": "6.5.0-beta.0",
|
|
26
|
+
"@webiny/form": "6.5.0-beta.0",
|
|
27
|
+
"@webiny/icons": "6.5.0-beta.0",
|
|
28
|
+
"@webiny/plugins": "6.5.0-beta.0",
|
|
29
|
+
"@webiny/react-composition": "6.5.0-beta.0",
|
|
30
|
+
"@webiny/react-properties": "6.5.0-beta.0",
|
|
31
|
+
"@webiny/sdk": "6.5.0-beta.0",
|
|
32
|
+
"@webiny/validation": "6.5.0-beta.0",
|
|
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.21",
|
|
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.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.
|
|
43
|
+
"zod": "4.4.3"
|
|
53
44
|
},
|
|
54
45
|
"devDependencies": {
|
|
55
|
-
"@
|
|
56
|
-
"@webiny/build-tools": "6.4.12-beta.4",
|
|
46
|
+
"@webiny/build-tools": "6.5.0-beta.0",
|
|
57
47
|
"rimraf": "6.1.3",
|
|
58
|
-
"typescript": "
|
|
59
|
-
"vitest": "
|
|
48
|
+
"typescript": "7.0.2",
|
|
49
|
+
"vitest": "4.1.10"
|
|
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,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":"
|
|
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;
|
|
@@ -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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"}
|