@webiny/app-file-manager 6.0.0 → 6.1.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.
Files changed (26) hide show
  1. package/components/BottomInfoBar/BottomInfoBar.js +0 -10
  2. package/components/BottomInfoBar/BottomInfoBar.js.map +1 -1
  3. package/components/BottomInfoBar/SupportedFileTypes.js +5 -2
  4. package/components/BottomInfoBar/SupportedFileTypes.js.map +1 -1
  5. package/components/BulkActions/ActionEdit/domain/Batch.d.ts +3 -24
  6. package/components/FileDetails/FileDetails.js +1 -2
  7. package/components/FileDetails/FileDetails.js.map +1 -1
  8. package/components/FileDetails/components/ActionButton.d.ts +1 -1
  9. package/components/FileDetails/components/ActionButton.js.map +1 -1
  10. package/components/Grid/ActionButton.d.ts +1 -1
  11. package/components/Grid/ActionButton.js.map +1 -1
  12. package/components/Grid/File.d.ts +1 -1
  13. package/components/Grid/File.js.map +1 -1
  14. package/components/ImageEditor/ImageEditor.js +0 -4
  15. package/components/ImageEditor/ImageEditor.js.map +1 -1
  16. package/modules/FileManagerRenderer/FileActions/FileDetails/EditImage.js +2 -7
  17. package/modules/FileManagerRenderer/FileActions/FileDetails/EditImage.js.map +1 -1
  18. package/modules/FileManagerRenderer/FileManagerView/FileManagerView.js +1 -2
  19. package/modules/FileManagerRenderer/FileManagerView/FileManagerView.js.map +1 -1
  20. package/modules/FileManagerRenderer/FileManagerView/configComponents/Browser/Grid/Thumbnail.d.ts +2 -2
  21. package/modules/FileManagerRenderer/FileManagerView/configComponents/Browser/Grid/Thumbnail.js.map +1 -1
  22. package/modules/FileManagerRenderer/FileManagerView/configComponents/Browser/Table/Thumbnail.d.ts +2 -2
  23. package/modules/FileManagerRenderer/FileManagerView/configComponents/Browser/Table/Thumbnail.js.map +1 -1
  24. package/modules/FileManagerRenderer/FileManagerView/configComponents/FileDetails/Thumbnail.d.ts +2 -2
  25. package/modules/FileManagerRenderer/FileManagerView/configComponents/FileDetails/Thumbnail.js.map +1 -1
  26. package/package.json +26 -27
@@ -1,17 +1,7 @@
1
1
  import React from "react";
2
- import mime from "mime/lite.js";
3
2
  import { Separator } from "@webiny/admin-ui";
4
3
  import { SupportedFileTypes } from "./SupportedFileTypes.js";
5
4
  import ListStatus from "./ListStatus.js";
6
- mime.define({
7
- "image/x-icon": ["ico"]
8
- }, true);
9
- mime.define({
10
- "image/jpg": ["jpg"]
11
- }, true);
12
- mime.define({
13
- "image/vnd.microsoft.icon": ["ico"]
14
- }, true);
15
5
  export const BottomInfoBar = props => {
16
6
  return /*#__PURE__*/React.createElement("div", {
17
7
  className: "bg-neutral-base w-full overflow-hidden z-5"
@@ -1 +1 @@
1
- {"version":3,"names":["React","mime","Separator","SupportedFileTypes","ListStatus","define","BottomInfoBar","props","createElement","className"],"sources":["BottomInfoBar.tsx"],"sourcesContent":["import React from \"react\";\nimport mime from \"mime/lite.js\";\nimport { Separator } from \"@webiny/admin-ui\";\n\nimport type { SupportedFileTypesProps } from \"./SupportedFileTypes.js\";\nimport { SupportedFileTypes } from \"./SupportedFileTypes.js\";\nimport type { ListStatusProps } from \"./ListStatus.js\";\nimport ListStatus from \"./ListStatus.js\";\n\nmime.define({ \"image/x-icon\": [\"ico\"] }, true);\nmime.define({ \"image/jpg\": [\"jpg\"] }, true);\nmime.define({ \"image/vnd.microsoft.icon\": [\"ico\"] }, true);\n\ntype BottomInfoBarProps = SupportedFileTypesProps & ListStatusProps;\n\nexport const BottomInfoBar = (props: BottomInfoBarProps) => {\n return (\n <div className=\"bg-neutral-base w-full overflow-hidden z-5\">\n <Separator />\n <div className={\"h-xl px-md py-sm flex items-center justify-between\"}>\n <SupportedFileTypes {...props} />\n <ListStatus {...props} />\n </div>\n </div>\n );\n};\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,OAAOC,IAAI,MAAM,cAAc;AAC/B,SAASC,SAAS,QAAQ,kBAAkB;AAG5C,SAASC,kBAAkB;AAE3B,OAAOC,UAAU;AAEjBH,IAAI,CAACI,MAAM,CAAC;EAAE,cAAc,EAAE,CAAC,KAAK;AAAE,CAAC,EAAE,IAAI,CAAC;AAC9CJ,IAAI,CAACI,MAAM,CAAC;EAAE,WAAW,EAAE,CAAC,KAAK;AAAE,CAAC,EAAE,IAAI,CAAC;AAC3CJ,IAAI,CAACI,MAAM,CAAC;EAAE,0BAA0B,EAAE,CAAC,KAAK;AAAE,CAAC,EAAE,IAAI,CAAC;AAI1D,OAAO,MAAMC,aAAa,GAAIC,KAAyB,IAAK;EACxD,oBACIP,KAAA,CAAAQ,aAAA;IAAKC,SAAS,EAAC;EAA4C,gBACvDT,KAAA,CAAAQ,aAAA,CAACN,SAAS,MAAE,CAAC,eACbF,KAAA,CAAAQ,aAAA;IAAKC,SAAS,EAAE;EAAqD,gBACjET,KAAA,CAAAQ,aAAA,CAACL,kBAAkB,EAAKI,KAAQ,CAAC,eACjCP,KAAA,CAAAQ,aAAA,CAACJ,UAAU,EAAKG,KAAQ,CACvB,CACJ,CAAC;AAEd,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["React","Separator","SupportedFileTypes","ListStatus","BottomInfoBar","props","createElement","className"],"sources":["BottomInfoBar.tsx"],"sourcesContent":["import React from \"react\";\nimport { Separator } from \"@webiny/admin-ui\";\n\nimport type { SupportedFileTypesProps } from \"./SupportedFileTypes.js\";\nimport { SupportedFileTypes } from \"./SupportedFileTypes.js\";\nimport type { ListStatusProps } from \"./ListStatus.js\";\nimport ListStatus from \"./ListStatus.js\";\n\ntype BottomInfoBarProps = SupportedFileTypesProps & ListStatusProps;\n\nexport const BottomInfoBar = (props: BottomInfoBarProps) => {\n return (\n <div className=\"bg-neutral-base w-full overflow-hidden z-5\">\n <Separator />\n <div className={\"h-xl px-md py-sm flex items-center justify-between\"}>\n <SupportedFileTypes {...props} />\n <ListStatus {...props} />\n </div>\n </div>\n );\n};\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,SAAS,QAAQ,kBAAkB;AAG5C,SAASC,kBAAkB;AAE3B,OAAOC,UAAU;AAIjB,OAAO,MAAMC,aAAa,GAAIC,KAAyB,IAAK;EACxD,oBACIL,KAAA,CAAAM,aAAA;IAAKC,SAAS,EAAC;EAA4C,gBACvDP,KAAA,CAAAM,aAAA,CAACL,SAAS,MAAE,CAAC,eACbD,KAAA,CAAAM,aAAA;IAAKC,SAAS,EAAE;EAAqD,gBACjEP,KAAA,CAAAM,aAAA,CAACJ,kBAAkB,EAAKG,KAAQ,CAAC,eACjCL,KAAA,CAAAM,aAAA,CAACH,UAAU,EAAKE,KAAQ,CACvB,CACJ,CAAC;AAEd,CAAC","ignoreList":[]}
@@ -1,7 +1,10 @@
1
1
  import React, { useCallback } from "react";
2
2
  import { Text } from "@webiny/admin-ui";
3
3
  import { i18n } from "@webiny/app/i18n/index.js";
4
- import mime from "mime/lite.js";
4
+ import { Mime } from "mime";
5
+ import vendorTypes from "mime/types/other.js";
6
+ import standardTypes from "mime/types/standard.js";
7
+ const mime = new Mime(standardTypes, vendorTypes);
5
8
  mime.define({
6
9
  "image/x-icon": ["ico"]
7
10
  }, true);
@@ -9,7 +12,7 @@ mime.define({
9
12
  "image/jpg": ["jpg"]
10
13
  }, true);
11
14
  mime.define({
12
- "image/vnd.microsoft.icon": ["ico"]
15
+ "application/vnd.microsoft.icon": ["ico"]
13
16
  }, true);
14
17
  const t = i18n.ns("app-admin/file-manager/components/bottom-info-bar/supported-files");
15
18
  const getUniqueFilePlugins = accept => {
@@ -1 +1 @@
1
- {"version":3,"names":["React","useCallback","Text","i18n","mime","define","t","ns","getUniqueFilePlugins","accept","exts","forEach","item","ext","getExtension","Object","keys","SupportedFileTypes","loading","totalCount","currentCount","getLabel","count","length","createElement","size","as","className","currentCountLabel","String","totalCountLabel","files","join"],"sources":["SupportedFileTypes.tsx"],"sourcesContent":["import React, { useCallback } from \"react\";\nimport { Text } from \"@webiny/admin-ui\";\nimport { i18n } from \"@webiny/app/i18n/index.js\";\nimport mime from \"mime/lite.js\";\n\nmime.define({ \"image/x-icon\": [\"ico\"] }, true);\nmime.define({ \"image/jpg\": [\"jpg\"] }, true);\nmime.define({ \"image/vnd.microsoft.icon\": [\"ico\"] }, true);\n\nconst t = i18n.ns(\"app-admin/file-manager/components/bottom-info-bar/supported-files\");\n\nconst getUniqueFilePlugins = (accept: string[]): string[] => {\n const exts: Record<string, boolean> = {};\n accept.forEach(item => {\n const ext = mime.getExtension(item);\n if (!ext) {\n return;\n }\n exts[ext] = true;\n });\n\n return Object.keys(exts);\n};\n\nexport interface SupportedFileTypesProps {\n accept: string[];\n loading: boolean;\n totalCount: number;\n currentCount: number;\n}\n\nexport const SupportedFileTypes = ({\n accept,\n loading,\n totalCount,\n currentCount\n}: SupportedFileTypesProps) => {\n const getLabel = useCallback((count = 0): string => {\n return `${count} ${count === 1 ? \"file\" : \"files\"}`;\n }, []);\n\n if (!accept || loading) {\n return null;\n }\n\n if (accept.length === 0) {\n return (\n <Text size={\"sm\"} as={\"div\"} className={\"text-neutral-strong\"}>\n {t`Showing {currentCountLabel} out of {totalCountLabel} from all file extensions.`({\n currentCountLabel: String(currentCount),\n totalCountLabel: getLabel(totalCount)\n })}\n </Text>\n );\n }\n\n return (\n <Text size={\"sm\"} as={\"div\"} className={\"text-neutral-strong\"}>\n {t`Showing {currentCountLabel} out of {totalCountLabel} from the following file extensions: {files}.`(\n {\n currentCountLabel: String(currentCount),\n totalCountLabel: getLabel(totalCount),\n files: getUniqueFilePlugins(accept).join(\", \")\n }\n )}\n </Text>\n );\n};\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,WAAW,QAAQ,OAAO;AAC1C,SAASC,IAAI,QAAQ,kBAAkB;AACvC,SAASC,IAAI,QAAQ,2BAA2B;AAChD,OAAOC,IAAI,MAAM,cAAc;AAE/BA,IAAI,CAACC,MAAM,CAAC;EAAE,cAAc,EAAE,CAAC,KAAK;AAAE,CAAC,EAAE,IAAI,CAAC;AAC9CD,IAAI,CAACC,MAAM,CAAC;EAAE,WAAW,EAAE,CAAC,KAAK;AAAE,CAAC,EAAE,IAAI,CAAC;AAC3CD,IAAI,CAACC,MAAM,CAAC;EAAE,0BAA0B,EAAE,CAAC,KAAK;AAAE,CAAC,EAAE,IAAI,CAAC;AAE1D,MAAMC,CAAC,GAAGH,IAAI,CAACI,EAAE,CAAC,mEAAmE,CAAC;AAEtF,MAAMC,oBAAoB,GAAIC,MAAgB,IAAe;EACzD,MAAMC,IAA6B,GAAG,CAAC,CAAC;EACxCD,MAAM,CAACE,OAAO,CAACC,IAAI,IAAI;IACnB,MAAMC,GAAG,GAAGT,IAAI,CAACU,YAAY,CAACF,IAAI,CAAC;IACnC,IAAI,CAACC,GAAG,EAAE;MACN;IACJ;IACAH,IAAI,CAACG,GAAG,CAAC,GAAG,IAAI;EACpB,CAAC,CAAC;EAEF,OAAOE,MAAM,CAACC,IAAI,CAACN,IAAI,CAAC;AAC5B,CAAC;AASD,OAAO,MAAMO,kBAAkB,GAAGA,CAAC;EAC/BR,MAAM;EACNS,OAAO;EACPC,UAAU;EACVC;AACqB,CAAC,KAAK;EAC3B,MAAMC,QAAQ,GAAGpB,WAAW,CAAC,CAACqB,KAAK,GAAG,CAAC,KAAa;IAChD,OAAO,GAAGA,KAAK,IAAIA,KAAK,KAAK,CAAC,GAAG,MAAM,GAAG,OAAO,EAAE;EACvD,CAAC,EAAE,EAAE,CAAC;EAEN,IAAI,CAACb,MAAM,IAAIS,OAAO,EAAE;IACpB,OAAO,IAAI;EACf;EAEA,IAAIT,MAAM,CAACc,MAAM,KAAK,CAAC,EAAE;IACrB,oBACIvB,KAAA,CAAAwB,aAAA,CAACtB,IAAI;MAACuB,IAAI,EAAE,IAAK;MAACC,EAAE,EAAE,KAAM;MAACC,SAAS,EAAE;IAAsB,GACzDrB,CAAC,gFAAgF,CAAC;MAC/EsB,iBAAiB,EAAEC,MAAM,CAACT,YAAY,CAAC;MACvCU,eAAe,EAAET,QAAQ,CAACF,UAAU;IACxC,CAAC,CACC,CAAC;EAEf;EAEA,oBACInB,KAAA,CAAAwB,aAAA,CAACtB,IAAI;IAACuB,IAAI,EAAE,IAAK;IAACC,EAAE,EAAE,KAAM;IAACC,SAAS,EAAE;EAAsB,GACzDrB,CAAC,mGAAmG,CACjG;IACIsB,iBAAiB,EAAEC,MAAM,CAACT,YAAY,CAAC;IACvCU,eAAe,EAAET,QAAQ,CAACF,UAAU,CAAC;IACrCY,KAAK,EAAEvB,oBAAoB,CAACC,MAAM,CAAC,CAACuB,IAAI,CAAC,IAAI;EACjD,CACJ,CACE,CAAC;AAEf,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["React","useCallback","Text","i18n","Mime","vendorTypes","standardTypes","mime","define","t","ns","getUniqueFilePlugins","accept","exts","forEach","item","ext","getExtension","Object","keys","SupportedFileTypes","loading","totalCount","currentCount","getLabel","count","length","createElement","size","as","className","currentCountLabel","String","totalCountLabel","files","join"],"sources":["SupportedFileTypes.tsx"],"sourcesContent":["import React, { useCallback } from \"react\";\nimport { Text } from \"@webiny/admin-ui\";\nimport { i18n } from \"@webiny/app/i18n/index.js\";\nimport { Mime } from \"mime\";\nimport vendorTypes from \"mime/types/other.js\";\nimport standardTypes from \"mime/types/standard.js\";\n\nconst mime = new Mime(standardTypes, vendorTypes);\nmime.define({ \"image/x-icon\": [\"ico\"] }, true);\nmime.define({ \"image/jpg\": [\"jpg\"] }, true);\nmime.define({ \"application/vnd.microsoft.icon\": [\"ico\"] }, true);\n\nconst t = i18n.ns(\"app-admin/file-manager/components/bottom-info-bar/supported-files\");\n\nconst getUniqueFilePlugins = (accept: string[]): string[] => {\n const exts: Record<string, boolean> = {};\n accept.forEach(item => {\n const ext = mime.getExtension(item);\n if (!ext) {\n return;\n }\n exts[ext] = true;\n });\n\n return Object.keys(exts);\n};\n\nexport interface SupportedFileTypesProps {\n accept: string[];\n loading: boolean;\n totalCount: number;\n currentCount: number;\n}\n\nexport const SupportedFileTypes = ({\n accept,\n loading,\n totalCount,\n currentCount\n}: SupportedFileTypesProps) => {\n const getLabel = useCallback((count = 0): string => {\n return `${count} ${count === 1 ? \"file\" : \"files\"}`;\n }, []);\n\n if (!accept || loading) {\n return null;\n }\n\n if (accept.length === 0) {\n return (\n <Text size={\"sm\"} as={\"div\"} className={\"text-neutral-strong\"}>\n {t`Showing {currentCountLabel} out of {totalCountLabel} from all file extensions.`({\n currentCountLabel: String(currentCount),\n totalCountLabel: getLabel(totalCount)\n })}\n </Text>\n );\n }\n\n return (\n <Text size={\"sm\"} as={\"div\"} className={\"text-neutral-strong\"}>\n {t`Showing {currentCountLabel} out of {totalCountLabel} from the following file extensions: {files}.`(\n {\n currentCountLabel: String(currentCount),\n totalCountLabel: getLabel(totalCount),\n files: getUniqueFilePlugins(accept).join(\", \")\n }\n )}\n </Text>\n );\n};\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,WAAW,QAAQ,OAAO;AAC1C,SAASC,IAAI,QAAQ,kBAAkB;AACvC,SAASC,IAAI,QAAQ,2BAA2B;AAChD,SAASC,IAAI,QAAQ,MAAM;AAC3B,OAAOC,WAAW,MAAM,qBAAqB;AAC7C,OAAOC,aAAa,MAAM,wBAAwB;AAElD,MAAMC,IAAI,GAAG,IAAIH,IAAI,CAACE,aAAa,EAAED,WAAW,CAAC;AACjDE,IAAI,CAACC,MAAM,CAAC;EAAE,cAAc,EAAE,CAAC,KAAK;AAAE,CAAC,EAAE,IAAI,CAAC;AAC9CD,IAAI,CAACC,MAAM,CAAC;EAAE,WAAW,EAAE,CAAC,KAAK;AAAE,CAAC,EAAE,IAAI,CAAC;AAC3CD,IAAI,CAACC,MAAM,CAAC;EAAE,gCAAgC,EAAE,CAAC,KAAK;AAAE,CAAC,EAAE,IAAI,CAAC;AAEhE,MAAMC,CAAC,GAAGN,IAAI,CAACO,EAAE,CAAC,mEAAmE,CAAC;AAEtF,MAAMC,oBAAoB,GAAIC,MAAgB,IAAe;EACzD,MAAMC,IAA6B,GAAG,CAAC,CAAC;EACxCD,MAAM,CAACE,OAAO,CAACC,IAAI,IAAI;IACnB,MAAMC,GAAG,GAAGT,IAAI,CAACU,YAAY,CAACF,IAAI,CAAC;IACnC,IAAI,CAACC,GAAG,EAAE;MACN;IACJ;IACAH,IAAI,CAACG,GAAG,CAAC,GAAG,IAAI;EACpB,CAAC,CAAC;EAEF,OAAOE,MAAM,CAACC,IAAI,CAACN,IAAI,CAAC;AAC5B,CAAC;AASD,OAAO,MAAMO,kBAAkB,GAAGA,CAAC;EAC/BR,MAAM;EACNS,OAAO;EACPC,UAAU;EACVC;AACqB,CAAC,KAAK;EAC3B,MAAMC,QAAQ,GAAGvB,WAAW,CAAC,CAACwB,KAAK,GAAG,CAAC,KAAa;IAChD,OAAO,GAAGA,KAAK,IAAIA,KAAK,KAAK,CAAC,GAAG,MAAM,GAAG,OAAO,EAAE;EACvD,CAAC,EAAE,EAAE,CAAC;EAEN,IAAI,CAACb,MAAM,IAAIS,OAAO,EAAE;IACpB,OAAO,IAAI;EACf;EAEA,IAAIT,MAAM,CAACc,MAAM,KAAK,CAAC,EAAE;IACrB,oBACI1B,KAAA,CAAA2B,aAAA,CAACzB,IAAI;MAAC0B,IAAI,EAAE,IAAK;MAACC,EAAE,EAAE,KAAM;MAACC,SAAS,EAAE;IAAsB,GACzDrB,CAAC,gFAAgF,CAAC;MAC/EsB,iBAAiB,EAAEC,MAAM,CAACT,YAAY,CAAC;MACvCU,eAAe,EAAET,QAAQ,CAACF,UAAU;IACxC,CAAC,CACC,CAAC;EAEf;EAEA,oBACItB,KAAA,CAAA2B,aAAA,CAACzB,IAAI;IAAC0B,IAAI,EAAE,IAAK;IAACC,EAAE,EAAE,KAAM;IAACC,SAAS,EAAE;EAAsB,GACzDrB,CAAC,mGAAmG,CACjG;IACIsB,iBAAiB,EAAEC,MAAM,CAACT,YAAY,CAAC;IACvCU,eAAe,EAAET,QAAQ,CAACF,UAAU,CAAC;IACrCY,KAAK,EAAEvB,oBAAoB,CAACC,MAAM,CAAC,CAACuB,IAAI,CAAC,IAAI;EACjD,CACJ,CACE,CAAC;AAEf,CAAC","ignoreList":[]}
@@ -6,33 +6,12 @@ export declare const batchValidationSchema: zod.ZodObject<{
6
6
  operations: zod.ZodArray<zod.ZodObject<{
7
7
  field: zod.ZodString;
8
8
  operator: zod.ZodString;
9
- }, "strip", zod.ZodTypeAny, {
10
- field: string;
11
- operator: string;
12
- }, {
13
- field: string;
14
- operator: string;
15
- }>, "many">;
16
- }, "strip", zod.ZodTypeAny, {
17
- operations: {
18
- field: string;
19
- operator: string;
20
- }[];
21
- }, {
22
- operations: {
23
- field: string;
24
- operator: string;
25
- }[];
26
- }>;
9
+ }, zod.core.$strip>>;
10
+ }, zod.core.$strip>;
27
11
  export declare class Batch {
28
12
  operations: Operation[];
29
13
  static createEmpty(): Batch;
30
- static validate(data: BatchDTO): zod.SafeParseReturnType<{
31
- operations: {
32
- field: string;
33
- operator: string;
34
- }[];
35
- }, {
14
+ static validate(data: BatchDTO): zod.ZodSafeParseResult<{
36
15
  operations: {
37
16
  field: string;
38
17
  operator: string;
@@ -1,7 +1,6 @@
1
1
  import React, { useEffect, useMemo, useRef } from "react";
2
2
  import noop from "lodash/noop.js";
3
- // @ts-expect-error This package has no types.
4
- import { useHotkeys } from "react-hotkeyz";
3
+ import { useHotkeys } from "@webiny/app-admin";
5
4
  import { Drawer, Grid, OverlayLoader, Tabs } from "@webiny/admin-ui";
6
5
  import { Form } from "@webiny/form";
7
6
  import { prepareFormData } from "@webiny/app-headless-cms-common";
@@ -1 +1 @@
1
- {"version":3,"names":["React","useEffect","useMemo","useRef","noop","useHotkeys","Drawer","Grid","OverlayLoader","Tabs","Form","prepareFormData","FileDetailsProvider","Preview","Actions","Content","Extensions","Description","useFileModel","useFileManagerViewConfig","FileProvider","FileDetailsInner","file","onForm","props","formRef","createRef","current","fileModel","fileDetails","leftPanel","rightPanel","width","split","extensionFields","fields","find","field","fieldId","settings","onSubmit","data","fileData","basicFieldsElement","createElement","map","Column","span","key","name","element","extensionFieldsElement","length","model","ref","Panel","flex","parseFloat","className","groupFields","size","spacing","separator","tabs","Tab","value","trigger","content","FileDetails","open","onClose","onSave","loading","onSetFile","zIndex","disabled","keys","esc","drawerWidth","title","description","modal","bodyPadding","headerSeparator","footerSeparator","actions","Fragment","CancelButton","text","ConfirmButton","onClick","submit","hideFileDetails","form"],"sources":["FileDetails.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useRef } from \"react\";\nimport noop from \"lodash/noop.js\";\n// @ts-expect-error This package has no types.\nimport { useHotkeys } from \"react-hotkeyz\";\nimport { Drawer, Grid, OverlayLoader, Tabs } from \"@webiny/admin-ui\";\nimport type { FileItem } from \"~/types.js\";\nimport type { FormAPI, FormOnSubmit } from \"@webiny/form\";\nimport { Form } from \"@webiny/form\";\nimport { prepareFormData } from \"@webiny/app-headless-cms-common\";\nimport { FileDetailsProvider } from \"~/components/FileDetails/FileDetailsProvider.js\";\nimport { Preview } from \"./components/Preview.js\";\nimport { Actions } from \"./components/Actions.js\";\nimport { Content } from \"./components/Content.js\";\nimport { Extensions } from \"./components/Extensions.js\";\nimport { Description } from \"./components/Description.js\";\nimport { useFileModel } from \"~/hooks/useFileModel.js\";\nimport { useFileManagerViewConfig } from \"~/index.js\";\nimport { FileProvider } from \"~/contexts/FileProvider.js\";\n\ninterface FileDetailsInnerProps {\n file: FileItem;\n onForm: (form: FormAPI) => void;\n onClose: () => void;\n onSubmit: (fileData: FileItem) => void;\n}\n\nconst FileDetailsInner = ({ file, onForm, ...props }: FileDetailsInnerProps) => {\n const formRef = React.createRef<FormAPI>();\n\n useEffect(() => {\n if (formRef.current) {\n onForm(formRef.current);\n }\n }, []);\n\n const fileModel = useFileModel();\n const { fileDetails } = useFileManagerViewConfig();\n\n const [, leftPanel = \"1\", rightPanel = \"1\"] = fileDetails.width.split(\",\");\n\n const extensionFields = useMemo(() => {\n const fields = fileModel.fields.find(field => field.fieldId === \"extensions\");\n if (!fields?.settings?.fields) {\n return [];\n }\n return fields?.settings?.fields || [];\n }, [fileModel]);\n\n const onSubmit: FormOnSubmit<FileItem> = async data => {\n const fileData = prepareFormData(data, fileModel.fields);\n props.onSubmit({ ...file, ...fileData });\n };\n\n const basicFieldsElement = (\n <Grid>\n {fileDetails.fields.map(field => (\n <Grid.Column span={12} key={field.name}>\n {field.element}\n </Grid.Column>\n ))}\n </Grid>\n );\n\n const extensionFieldsElement =\n extensionFields.length > 0 ? <Extensions model={fileModel} /> : null;\n\n return (\n <Form data={file} onSubmit={onSubmit} ref={formRef}>\n {() => (\n <Content>\n <Content.Panel flex={parseFloat(leftPanel)}>\n <div className={\"flex flex-col justify-between gap-md h-full px-lg py-md\"}>\n <Actions />\n <Preview />\n </div>\n </Content.Panel>\n <Content.Panel flex={parseFloat(rightPanel)}>\n {fileDetails.groupFields ? (\n <Tabs\n size={\"md\"}\n spacing={\"lg\"}\n separator={true}\n tabs={[\n <Tabs.Tab\n key={\"basic-details\"}\n value={\"basic-details\"}\n trigger={\"Basic details\"}\n content={basicFieldsElement}\n />,\n <Tabs.Tab\n key={\"advanced-details\"}\n value={\"advanced-details\"}\n trigger={\"Advanced details\"}\n content={extensionFieldsElement}\n />\n ]}\n />\n ) : (\n <div className={\"p-lg\"}>\n {basicFieldsElement}\n <div className={\"mt-lg\"}>{extensionFieldsElement}</div>\n </div>\n )}\n </Content.Panel>\n </Content>\n )}\n </Form>\n );\n};\n\nexport interface FileDetailsProps {\n file?: FileItem;\n open: boolean;\n loading: string | null;\n onClose: () => void;\n onSave: (file: FileItem) => void;\n onSetFile?: (file: FileItem) => void;\n}\n\nexport const FileDetails = ({\n open,\n onClose,\n onSave,\n loading,\n file,\n onSetFile = noop\n}: FileDetailsProps) => {\n useHotkeys({\n zIndex: 50,\n disabled: !open,\n keys: {\n esc: onClose\n }\n });\n\n const { fileDetails } = useFileManagerViewConfig();\n\n const drawerWidth = fileDetails.width.split(\",\")[0];\n\n const formRef = useRef<FormAPI | null>(null);\n\n if (!file) {\n return null;\n }\n\n return (\n <FileProvider file={file}>\n <Drawer\n title={file.name}\n description={<Description />}\n width={drawerWidth}\n open={open}\n modal={true}\n bodyPadding={false}\n headerSeparator={true}\n footerSeparator={true}\n onClose={onClose}\n data-testid={\"fm.file-details.drawer\"}\n actions={\n <>\n <Drawer.CancelButton text={\"Cancel\"} />\n <Drawer.ConfirmButton\n text={\"Update\"}\n onClick={() => formRef.current?.submit()}\n />\n </>\n }\n >\n {loading && <OverlayLoader text={loading} />}\n <FileDetailsProvider hideFileDetails={onClose} onSetFile={onSetFile}>\n <FileDetailsInner\n onForm={form => {\n formRef.current = form;\n }}\n file={file}\n onClose={onClose}\n onSubmit={onSave}\n />\n </FileDetailsProvider>\n </Drawer>\n </FileProvider>\n );\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["React","useEffect","useMemo","useRef","noop","useHotkeys","Drawer","Grid","OverlayLoader","Tabs","Form","prepareFormData","FileDetailsProvider","Preview","Actions","Content","Extensions","Description","useFileModel","useFileManagerViewConfig","FileProvider","FileDetailsInner","file","onForm","props","formRef","createRef","current","fileModel","fileDetails","leftPanel","rightPanel","width","split","extensionFields","fields","find","field","fieldId","settings","onSubmit","data","fileData","basicFieldsElement","createElement","map","Column","span","key","name","element","extensionFieldsElement","length","model","ref","Panel","flex","parseFloat","className","groupFields","size","spacing","separator","tabs","Tab","value","trigger","content","FileDetails","open","onClose","onSave","loading","onSetFile","zIndex","disabled","keys","esc","drawerWidth","title","description","modal","bodyPadding","headerSeparator","footerSeparator","actions","Fragment","CancelButton","text","ConfirmButton","onClick","submit","hideFileDetails","form"],"sources":["FileDetails.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useRef } from \"react\";\nimport noop from \"lodash/noop.js\";\nimport { useHotkeys } from \"@webiny/app-admin\";\nimport { Drawer, Grid, OverlayLoader, Tabs } from \"@webiny/admin-ui\";\nimport type { FileItem } from \"~/types.js\";\nimport type { FormAPI, FormOnSubmit } from \"@webiny/form\";\nimport { Form } from \"@webiny/form\";\nimport { prepareFormData } from \"@webiny/app-headless-cms-common\";\nimport { FileDetailsProvider } from \"~/components/FileDetails/FileDetailsProvider.js\";\nimport { Preview } from \"./components/Preview.js\";\nimport { Actions } from \"./components/Actions.js\";\nimport { Content } from \"./components/Content.js\";\nimport { Extensions } from \"./components/Extensions.js\";\nimport { Description } from \"./components/Description.js\";\nimport { useFileModel } from \"~/hooks/useFileModel.js\";\nimport { useFileManagerViewConfig } from \"~/index.js\";\nimport { FileProvider } from \"~/contexts/FileProvider.js\";\n\ninterface FileDetailsInnerProps {\n file: FileItem;\n onForm: (form: FormAPI) => void;\n onClose: () => void;\n onSubmit: (fileData: FileItem) => void;\n}\n\nconst FileDetailsInner = ({ file, onForm, ...props }: FileDetailsInnerProps) => {\n const formRef = React.createRef<FormAPI>();\n\n useEffect(() => {\n if (formRef.current) {\n onForm(formRef.current);\n }\n }, []);\n\n const fileModel = useFileModel();\n const { fileDetails } = useFileManagerViewConfig();\n\n const [, leftPanel = \"1\", rightPanel = \"1\"] = fileDetails.width.split(\",\");\n\n const extensionFields = useMemo(() => {\n const fields = fileModel.fields.find(field => field.fieldId === \"extensions\");\n if (!fields?.settings?.fields) {\n return [];\n }\n return fields?.settings?.fields || [];\n }, [fileModel]);\n\n const onSubmit: FormOnSubmit<FileItem> = async data => {\n const fileData = prepareFormData(data, fileModel.fields);\n props.onSubmit({ ...file, ...fileData });\n };\n\n const basicFieldsElement = (\n <Grid>\n {fileDetails.fields.map(field => (\n <Grid.Column span={12} key={field.name}>\n {field.element}\n </Grid.Column>\n ))}\n </Grid>\n );\n\n const extensionFieldsElement =\n extensionFields.length > 0 ? <Extensions model={fileModel} /> : null;\n\n return (\n <Form data={file} onSubmit={onSubmit} ref={formRef}>\n {() => (\n <Content>\n <Content.Panel flex={parseFloat(leftPanel)}>\n <div className={\"flex flex-col justify-between gap-md h-full px-lg py-md\"}>\n <Actions />\n <Preview />\n </div>\n </Content.Panel>\n <Content.Panel flex={parseFloat(rightPanel)}>\n {fileDetails.groupFields ? (\n <Tabs\n size={\"md\"}\n spacing={\"lg\"}\n separator={true}\n tabs={[\n <Tabs.Tab\n key={\"basic-details\"}\n value={\"basic-details\"}\n trigger={\"Basic details\"}\n content={basicFieldsElement}\n />,\n <Tabs.Tab\n key={\"advanced-details\"}\n value={\"advanced-details\"}\n trigger={\"Advanced details\"}\n content={extensionFieldsElement}\n />\n ]}\n />\n ) : (\n <div className={\"p-lg\"}>\n {basicFieldsElement}\n <div className={\"mt-lg\"}>{extensionFieldsElement}</div>\n </div>\n )}\n </Content.Panel>\n </Content>\n )}\n </Form>\n );\n};\n\nexport interface FileDetailsProps {\n file?: FileItem;\n open: boolean;\n loading: string | null;\n onClose: () => void;\n onSave: (file: FileItem) => void;\n onSetFile?: (file: FileItem) => void;\n}\n\nexport const FileDetails = ({\n open,\n onClose,\n onSave,\n loading,\n file,\n onSetFile = noop\n}: FileDetailsProps) => {\n useHotkeys({\n zIndex: 50,\n disabled: !open,\n keys: {\n esc: onClose\n }\n });\n\n const { fileDetails } = useFileManagerViewConfig();\n\n const drawerWidth = fileDetails.width.split(\",\")[0];\n\n const formRef = useRef<FormAPI | null>(null);\n\n if (!file) {\n return null;\n }\n\n return (\n <FileProvider file={file}>\n <Drawer\n title={file.name}\n description={<Description />}\n width={drawerWidth}\n open={open}\n modal={true}\n bodyPadding={false}\n headerSeparator={true}\n footerSeparator={true}\n onClose={onClose}\n data-testid={\"fm.file-details.drawer\"}\n actions={\n <>\n <Drawer.CancelButton text={\"Cancel\"} />\n <Drawer.ConfirmButton\n text={\"Update\"}\n onClick={() => formRef.current?.submit()}\n />\n </>\n }\n >\n {loading && <OverlayLoader text={loading} />}\n <FileDetailsProvider hideFileDetails={onClose} onSetFile={onSetFile}>\n <FileDetailsInner\n onForm={form => {\n formRef.current = form;\n }}\n file={file}\n onClose={onClose}\n onSubmit={onSave}\n />\n </FileDetailsProvider>\n </Drawer>\n </FileProvider>\n );\n};\n"],"mappings":"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","ignoreList":[]}
@@ -1,7 +1,7 @@
1
1
  import React from "react";
2
2
  export interface ActionButtonProps {
3
3
  label: string;
4
- icon: JSX.Element;
4
+ icon: React.JSX.Element;
5
5
  onAction: () => void;
6
6
  "data-testid"?: string;
7
7
  disabled?: boolean;
@@ -1 +1 @@
1
- {"version":3,"names":["React","Button","ActionButton","label","icon","onAction","disabled","className","props","createElement","text","onClick","containerClassName","variant","size"],"sources":["ActionButton.tsx"],"sourcesContent":["import React from \"react\";\nimport { Button } from \"@webiny/admin-ui\";\n\nexport interface ActionButtonProps {\n label: string;\n icon: JSX.Element;\n onAction: () => void;\n \"data-testid\"?: string;\n disabled?: boolean;\n className?: string;\n}\n\nexport const ActionButton = ({\n label,\n icon,\n onAction,\n disabled,\n className,\n ...props\n}: ActionButtonProps) => {\n return (\n <Button\n text={label}\n icon={icon}\n onClick={onAction}\n disabled={disabled}\n data-testid={props[\"data-testid\"]}\n containerClassName={className}\n variant={\"ghost\"}\n size={\"sm\"}\n />\n );\n};\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,MAAM,QAAQ,kBAAkB;AAWzC,OAAO,MAAMC,YAAY,GAAGA,CAAC;EACzBC,KAAK;EACLC,IAAI;EACJC,QAAQ;EACRC,QAAQ;EACRC,SAAS;EACT,GAAGC;AACY,CAAC,KAAK;EACrB,oBACIR,KAAA,CAAAS,aAAA,CAACR,MAAM;IACHS,IAAI,EAAEP,KAAM;IACZC,IAAI,EAAEA,IAAK;IACXO,OAAO,EAAEN,QAAS;IAClBC,QAAQ,EAAEA,QAAS;IACnB,eAAaE,KAAK,CAAC,aAAa,CAAE;IAClCI,kBAAkB,EAAEL,SAAU;IAC9BM,OAAO,EAAE,OAAQ;IACjBC,IAAI,EAAE;EAAK,CACd,CAAC;AAEV,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["React","Button","ActionButton","label","icon","onAction","disabled","className","props","createElement","text","onClick","containerClassName","variant","size"],"sources":["ActionButton.tsx"],"sourcesContent":["import React from \"react\";\nimport { Button } from \"@webiny/admin-ui\";\n\nexport interface ActionButtonProps {\n label: string;\n icon: React.JSX.Element;\n onAction: () => void;\n \"data-testid\"?: string;\n disabled?: boolean;\n className?: string;\n}\n\nexport const ActionButton = ({\n label,\n icon,\n onAction,\n disabled,\n className,\n ...props\n}: ActionButtonProps) => {\n return (\n <Button\n text={label}\n icon={icon}\n onClick={onAction}\n disabled={disabled}\n data-testid={props[\"data-testid\"]}\n containerClassName={className}\n variant={\"ghost\"}\n size={\"sm\"}\n />\n );\n};\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,MAAM,QAAQ,kBAAkB;AAWzC,OAAO,MAAMC,YAAY,GAAGA,CAAC;EACzBC,KAAK;EACLC,IAAI;EACJC,QAAQ;EACRC,QAAQ;EACRC,SAAS;EACT,GAAGC;AACY,CAAC,KAAK;EACrB,oBACIR,KAAA,CAAAS,aAAA,CAACR,MAAM;IACHS,IAAI,EAAEP,KAAM;IACZC,IAAI,EAAEA,IAAK;IACXO,OAAO,EAAEN,QAAS;IAClBC,QAAQ,EAAEA,QAAS;IACnB,eAAaE,KAAK,CAAC,aAAa,CAAE;IAClCI,kBAAkB,EAAEL,SAAU;IAC9BM,OAAO,EAAE,OAAQ;IACjBC,IAAI,EAAE;EAAK,CACd,CAAC;AAEV,CAAC","ignoreList":[]}
@@ -1,6 +1,6 @@
1
1
  import React from "react";
2
2
  export interface ActionButtonProps {
3
- icon: JSX.Element;
3
+ icon: React.JSX.Element;
4
4
  label?: string;
5
5
  onAction: () => void;
6
6
  "data-testid"?: string;
@@ -1 +1 @@
1
- {"version":3,"names":["React","useCallback","IconButton","Tooltip","ActionButton","icon","label","onAction","disabled","props","onClick","event","stopPropagation","createElement","content","trigger","variant","size"],"sources":["ActionButton.tsx"],"sourcesContent":["import React, { useCallback } from \"react\";\nimport { IconButton, Tooltip } from \"@webiny/admin-ui\";\n\nexport interface ActionButtonProps {\n icon: JSX.Element;\n label?: string;\n onAction: () => void;\n \"data-testid\"?: string;\n disabled?: boolean;\n}\n\nexport const ActionButton = ({ icon, label, onAction, disabled, ...props }: ActionButtonProps) => {\n const onClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n // Prevent the click event from propagating to the grid item component.\n event.stopPropagation();\n onAction && onAction();\n },\n [onAction]\n );\n\n return (\n <Tooltip\n content={label ?? \"Custom action\"}\n trigger={\n <IconButton\n variant={\"tertiary\"}\n size={\"sm\"}\n icon={icon}\n onClick={onClick}\n disabled={disabled}\n data-testid={props[\"data-testid\"]}\n />\n }\n />\n );\n};\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,WAAW,QAAQ,OAAO;AAC1C,SAASC,UAAU,EAAEC,OAAO,QAAQ,kBAAkB;AAUtD,OAAO,MAAMC,YAAY,GAAGA,CAAC;EAAEC,IAAI;EAAEC,KAAK;EAAEC,QAAQ;EAAEC,QAAQ;EAAE,GAAGC;AAAyB,CAAC,KAAK;EAC9F,MAAMC,OAAO,GAAGT,WAAW,CACtBU,KAA0C,IAAK;IAC5C;IACAA,KAAK,CAACC,eAAe,CAAC,CAAC;IACvBL,QAAQ,IAAIA,QAAQ,CAAC,CAAC;EAC1B,CAAC,EACD,CAACA,QAAQ,CACb,CAAC;EAED,oBACIP,KAAA,CAAAa,aAAA,CAACV,OAAO;IACJW,OAAO,EAAER,KAAK,IAAI,eAAgB;IAClCS,OAAO,eACHf,KAAA,CAAAa,aAAA,CAACX,UAAU;MACPc,OAAO,EAAE,UAAW;MACpBC,IAAI,EAAE,IAAK;MACXZ,IAAI,EAAEA,IAAK;MACXK,OAAO,EAAEA,OAAQ;MACjBF,QAAQ,EAAEA,QAAS;MACnB,eAAaC,KAAK,CAAC,aAAa;IAAE,CACrC;EACJ,CACJ,CAAC;AAEV,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["React","useCallback","IconButton","Tooltip","ActionButton","icon","label","onAction","disabled","props","onClick","event","stopPropagation","createElement","content","trigger","variant","size"],"sources":["ActionButton.tsx"],"sourcesContent":["import React, { useCallback } from \"react\";\nimport { IconButton, Tooltip } from \"@webiny/admin-ui\";\n\nexport interface ActionButtonProps {\n icon: React.JSX.Element;\n label?: string;\n onAction: () => void;\n \"data-testid\"?: string;\n disabled?: boolean;\n}\n\nexport const ActionButton = ({ icon, label, onAction, disabled, ...props }: ActionButtonProps) => {\n const onClick = useCallback(\n (event: React.MouseEvent<HTMLButtonElement>) => {\n // Prevent the click event from propagating to the grid item component.\n event.stopPropagation();\n onAction && onAction();\n },\n [onAction]\n );\n\n return (\n <Tooltip\n content={label ?? \"Custom action\"}\n trigger={\n <IconButton\n variant={\"tertiary\"}\n size={\"sm\"}\n icon={icon}\n onClick={onClick}\n disabled={disabled}\n data-testid={props[\"data-testid\"]}\n />\n }\n />\n );\n};\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,WAAW,QAAQ,OAAO;AAC1C,SAASC,UAAU,EAAEC,OAAO,QAAQ,kBAAkB;AAUtD,OAAO,MAAMC,YAAY,GAAGA,CAAC;EAAEC,IAAI;EAAEC,KAAK;EAAEC,QAAQ;EAAEC,QAAQ;EAAE,GAAGC;AAAyB,CAAC,KAAK;EAC9F,MAAMC,OAAO,GAAGT,WAAW,CACtBU,KAA0C,IAAK;IAC5C;IACAA,KAAK,CAACC,eAAe,CAAC,CAAC;IACvBL,QAAQ,IAAIA,QAAQ,CAAC,CAAC;EAC1B,CAAC,EACD,CAACA,QAAQ,CACb,CAAC;EAED,oBACIP,KAAA,CAAAa,aAAA,CAACV,OAAO;IACJW,OAAO,EAAER,KAAK,IAAI,eAAgB;IAClCS,OAAO,eACHf,KAAA,CAAAa,aAAA,CAACX,UAAU;MACPc,OAAO,EAAE,UAAW;MACpBC,IAAI,EAAE,IAAK;MACXZ,IAAI,EAAEA,IAAK;MACXK,OAAO,EAAEA,OAAQ;MACjBF,QAAQ,EAAEA,QAAS;MACnB,eAAaC,KAAK,CAAC,aAAa;IAAE,CACrC;EACJ,CACJ,CAAC;AAEV,CAAC","ignoreList":[]}
@@ -3,7 +3,7 @@ import type { FileItem } from "../../types.js";
3
3
  export interface FileProps {
4
4
  file: FileItem;
5
5
  selected: boolean;
6
- fileBody?: JSX.Element;
6
+ fileBody?: React.JSX.Element;
7
7
  onSelect?: (event?: React.MouseEvent) => void;
8
8
  onClick?: (event?: React.MouseEvent) => void;
9
9
  multiple?: boolean;
@@ -1 +1 @@
1
- {"version":3,"names":["React","Fragment","LazyLoad","makeDecoratable","Text","TimeAgo","cn","CheckboxPrimitive","useFileManagerViewConfig","DefaultFileControls","onSelect","selected","browser","itemActions","grid","createElement","className","onClick","checked","onChange","map","action","key","name","element","DefaultFileBody","children","height","offset","DefaultFileLabel","file","size","as","type","datetime","createdOn","File","fileBody","id"],"sources":["File.tsx"],"sourcesContent":["import React, { Fragment } from \"react\";\nimport LazyLoad from \"react-lazy-load\";\nimport { makeDecoratable } from \"@webiny/app-admin\";\nimport { Text, TimeAgo, cn, CheckboxPrimitive } from \"@webiny/admin-ui\";\nimport { useFileManagerViewConfig } from \"~/modules/FileManagerRenderer/FileManagerView/FileManagerViewConfig.js\";\nimport type { FileItem } from \"~/types.js\";\n\nexport interface FileProps {\n file: FileItem;\n selected: boolean;\n fileBody?: JSX.Element;\n onSelect?: (event?: React.MouseEvent) => void;\n onClick?: (event?: React.MouseEvent) => void;\n multiple?: boolean;\n children: React.ReactNode;\n}\n\nexport type DefaultFileControlsProps = Pick<FileProps, \"selected\" | \"onSelect\">;\n\nconst DefaultFileControls = ({ onSelect, selected }: DefaultFileControlsProps) => {\n const { browser } = useFileManagerViewConfig();\n const { itemActions } = browser.grid;\n\n return (\n <>\n {onSelect ? (\n <div\n className={cn([\n \"p-xs rounded-md\",\n \"bg-neutral-base/30\",\n \"absolute top-sm left-sm\",\n selected ? \"visible\" : \"invisible group-hover:visible\"\n ])}\n >\n <CheckboxPrimitive\n onClick={onSelect}\n checked={selected}\n onChange={() => void 0}\n />\n </div>\n ) : null}\n <div\n className={cn([\n \"invisible group-hover:visible\",\n \"flex items-center gap-xxs\",\n \"p-xs\",\n \"absolute top-xs-plus right-xs-plus\"\n ])}\n >\n {itemActions.map(action => {\n return <Fragment key={action.name}>{action.element}</Fragment>;\n })}\n </div>\n </>\n );\n};\n\nexport type DefaultFileBodyProps = Pick<FileProps, \"selected\" | \"onSelect\" | \"children\">;\n\nconst DefaultFileBody = ({ selected, onSelect, children }: DefaultFileBodyProps) => {\n return (\n <div\n onClick={onSelect}\n className={cn([\"relative\", onSelect ? \"cursor-pointer\" : \"cursor-default\"])}\n >\n <DefaultFileControls selected={selected} onSelect={onSelect} />\n <LazyLoad\n height={150}\n offset={\"300px\"}\n data-testid={\"fm-file-wrapper-file-preview\"}\n className={cn([\n \"bg-neutral-muted\",\n \"flex items-center justify-center\",\n \"text-neutral-strong text-sm\"\n ])}\n >\n {children}\n </LazyLoad>\n </div>\n );\n};\n\ntype DefaultFileLabelProps = Pick<FileProps, \"file\">;\n\nconst DefaultFileLabel = ({ file }: DefaultFileLabelProps) => {\n return (\n <div className={\"px-md py-sm-extra\"} data-testid={\"fm-file-wrapper-file-label\"}>\n <Text size={\"sm\"} as={\"div\"} className={\"truncate text-neutral-primary\"}>\n {file.name}\n </Text>\n <Text size={\"sm\"} as={\"div\"} className={\"truncate text-neutral-dimmed\"}>\n {file.type} {\" // \"} <TimeAgo datetime={file.createdOn} />\n </Text>\n </div>\n );\n};\n\nexport const File = makeDecoratable(\n \"File\",\n ({ file, fileBody, selected, onSelect, children }: FileProps) => {\n return (\n <div\n className={cn([\n \"group\",\n \"bg-neutral-base rounded-lg\",\n \"shadow-sm hover:shadow-lg\",\n \"border-sm border-solid border-neutral-base hover:border-neutral-dimmed-darker\",\n selected && \"ring-md ring-primary-strong\",\n \"transition-shadow duration-250 ease-in-out\",\n \"overflow-hidden\"\n ])}\n data-testid={\"fm-list-wrapper-file\"}\n data-file-id={file.id}\n >\n {fileBody ?? (\n <DefaultFileBody selected={selected} onSelect={onSelect}>\n {children}\n </DefaultFileBody>\n )}\n <DefaultFileLabel file={file} />\n </div>\n );\n }\n);\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["React","Fragment","LazyLoad","makeDecoratable","Text","TimeAgo","cn","CheckboxPrimitive","useFileManagerViewConfig","DefaultFileControls","onSelect","selected","browser","itemActions","grid","createElement","className","onClick","checked","onChange","map","action","key","name","element","DefaultFileBody","children","height","offset","DefaultFileLabel","file","size","as","type","datetime","createdOn","File","fileBody","id"],"sources":["File.tsx"],"sourcesContent":["import React, { Fragment } from \"react\";\nimport LazyLoad from \"react-lazy-load\";\nimport { makeDecoratable } from \"@webiny/app-admin\";\nimport { Text, TimeAgo, cn, CheckboxPrimitive } from \"@webiny/admin-ui\";\nimport { useFileManagerViewConfig } from \"~/modules/FileManagerRenderer/FileManagerView/FileManagerViewConfig.js\";\nimport type { FileItem } from \"~/types.js\";\n\nexport interface FileProps {\n file: FileItem;\n selected: boolean;\n fileBody?: React.JSX.Element;\n onSelect?: (event?: React.MouseEvent) => void;\n onClick?: (event?: React.MouseEvent) => void;\n multiple?: boolean;\n children: React.ReactNode;\n}\n\nexport type DefaultFileControlsProps = Pick<FileProps, \"selected\" | \"onSelect\">;\n\nconst DefaultFileControls = ({ onSelect, selected }: DefaultFileControlsProps) => {\n const { browser } = useFileManagerViewConfig();\n const { itemActions } = browser.grid;\n\n return (\n <>\n {onSelect ? (\n <div\n className={cn([\n \"p-xs rounded-md\",\n \"bg-neutral-base/30\",\n \"absolute top-sm left-sm\",\n selected ? \"visible\" : \"invisible group-hover:visible\"\n ])}\n >\n <CheckboxPrimitive\n onClick={onSelect}\n checked={selected}\n onChange={() => void 0}\n />\n </div>\n ) : null}\n <div\n className={cn([\n \"invisible group-hover:visible\",\n \"flex items-center gap-xxs\",\n \"p-xs\",\n \"absolute top-xs-plus right-xs-plus\"\n ])}\n >\n {itemActions.map(action => {\n return <Fragment key={action.name}>{action.element}</Fragment>;\n })}\n </div>\n </>\n );\n};\n\nexport type DefaultFileBodyProps = Pick<FileProps, \"selected\" | \"onSelect\" | \"children\">;\n\nconst DefaultFileBody = ({ selected, onSelect, children }: DefaultFileBodyProps) => {\n return (\n <div\n onClick={onSelect}\n className={cn([\"relative\", onSelect ? \"cursor-pointer\" : \"cursor-default\"])}\n >\n <DefaultFileControls selected={selected} onSelect={onSelect} />\n <LazyLoad\n height={150}\n offset={\"300px\"}\n data-testid={\"fm-file-wrapper-file-preview\"}\n className={cn([\n \"bg-neutral-muted\",\n \"flex items-center justify-center\",\n \"text-neutral-strong text-sm\"\n ])}\n >\n {children}\n </LazyLoad>\n </div>\n );\n};\n\ntype DefaultFileLabelProps = Pick<FileProps, \"file\">;\n\nconst DefaultFileLabel = ({ file }: DefaultFileLabelProps) => {\n return (\n <div className={\"px-md py-sm-extra\"} data-testid={\"fm-file-wrapper-file-label\"}>\n <Text size={\"sm\"} as={\"div\"} className={\"truncate text-neutral-primary\"}>\n {file.name}\n </Text>\n <Text size={\"sm\"} as={\"div\"} className={\"truncate text-neutral-dimmed\"}>\n {file.type} {\" // \"} <TimeAgo datetime={file.createdOn} />\n </Text>\n </div>\n );\n};\n\nexport const File = makeDecoratable(\n \"File\",\n ({ file, fileBody, selected, onSelect, children }: FileProps) => {\n return (\n <div\n className={cn([\n \"group\",\n \"bg-neutral-base rounded-lg\",\n \"shadow-sm hover:shadow-lg\",\n \"border-sm border-solid border-neutral-base hover:border-neutral-dimmed-darker\",\n selected && \"ring-md ring-primary-strong\",\n \"transition-shadow duration-250 ease-in-out\",\n \"overflow-hidden\"\n ])}\n data-testid={\"fm-list-wrapper-file\"}\n data-file-id={file.id}\n >\n {fileBody ?? (\n <DefaultFileBody selected={selected} onSelect={onSelect}>\n {children}\n </DefaultFileBody>\n )}\n <DefaultFileLabel file={file} />\n </div>\n );\n }\n);\n"],"mappings":"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","ignoreList":[]}
@@ -1,10 +1,6 @@
1
1
  import React from "react";
2
2
  import { Button } from "@webiny/admin-ui";
3
3
  import { flip, filter, crop, rotate } from "./toolbar/index.js";
4
- /**
5
- * Package load-script does not have types.
6
- */
7
- // @ts-expect-error
8
4
  import loadScript from "load-script";
9
5
  const toolbar = {
10
6
  flip,
@@ -1 +1 @@
1
- {"version":3,"names":["React","Button","flip","filter","crop","rotate","loadScript","toolbar","initScripts","Promise","resolve","window","Caman","ImageEditor","Component","defaultProps","tools","state","tool","src","canvas","createRef","componentDidMount","then","updateCanvas","setTimeout","options","props","key","option","autoEnable","activateTool","image","Image","current","onload","width","height","ctx","getContext","drawImage","setState","tt","onActivate","getToolOptions","deactivateTool","getCanvasDataUrl","startsWith","toDataURL","applyActiveTool","apply","cancelActiveTool","cancel","name","render","children","editor","createElement","className","map","icon","Fragment","renderForm","variant","text","onClick","style","id","maxWidth","maxHeight","ref","activeTool"],"sources":["ImageEditor.tsx"],"sourcesContent":["import React from \"react\";\nimport { Button } from \"@webiny/admin-ui\";\nimport { flip, filter, crop, rotate } from \"./toolbar/index.js\";\nimport type { ImageEditorTool, ToolbarTool } from \"./toolbar/types.js\";\n/**\n * Package load-script does not have types.\n */\n// @ts-expect-error\nimport loadScript from \"load-script\";\n\nconst toolbar = {\n flip,\n filter,\n crop,\n rotate\n};\n\nconst initScripts = (): Promise<string> => {\n return new Promise((resolve: any) => {\n // @ts-expect-error\n if (window.Caman) {\n return resolve();\n }\n return loadScript(\n \"https://cdnjs.cloudflare.com/ajax/libs/camanjs/4.1.2/caman.full.min.js\",\n resolve\n );\n });\n};\n\ninterface RenderPropArgs {\n render: () => React.ReactNode;\n getCanvasDataUrl: () => string;\n activeTool: ImageEditorTool | null;\n applyActiveTool: () => Promise<void>;\n cancelActiveTool: () => Promise<void>;\n}\n\ninterface ImageEditorPropsPropsOptions {\n autoEnable: boolean;\n}\n\ninterface ImageEditorProps {\n src: string;\n tools: ToolbarTool[];\n options?: {\n flip: ImageEditorPropsPropsOptions;\n filter: ImageEditorPropsPropsOptions;\n crop: ImageEditorPropsPropsOptions;\n rotate: ImageEditorPropsPropsOptions;\n };\n onToolActivate?: () => void;\n onToolDeactivate?: () => void;\n children?: (props: RenderPropArgs) => React.ReactNode;\n}\n\ninterface ImageEditorState {\n tool: ImageEditorTool | null;\n src: string;\n}\n\nclass ImageEditor extends React.Component<ImageEditorProps, ImageEditorState> {\n static defaultProps: Partial<ImageEditorProps> = {\n tools: [\"crop\", \"flip\", \"rotate\", \"filter\"]\n };\n\n public override state: ImageEditorState = {\n tool: null,\n src: \"\"\n };\n\n public canvas = React.createRef<HTMLCanvasElement>();\n public image?: HTMLImageElement;\n\n public override componentDidMount() {\n initScripts().then(() => {\n this.updateCanvas();\n setTimeout(() => {\n const { options } = this.props;\n if (!options || typeof options !== \"object\") {\n return;\n }\n for (const key in options) {\n const option = options[key as ToolbarTool];\n if (option.autoEnable === true) {\n const tool: ImageEditorTool | null = toolbar[key as ToolbarTool];\n tool && this.activateTool(tool);\n break;\n }\n }\n }, 250);\n });\n }\n\n private readonly updateCanvas = (): void => {\n const { src } = this.props;\n this.image = new window.Image();\n const canvas = this.canvas.current;\n if (canvas) {\n this.image.onload = () => {\n if (this.image) {\n canvas.width = this.image.width;\n canvas.height = this.image.height;\n const ctx = canvas.getContext(\"2d\") as CanvasRenderingContext2D;\n ctx.drawImage(this.image, 0, 0);\n }\n };\n\n this.image.src = src;\n }\n };\n\n private readonly activateTool = (tool: ToolbarTool | ImageEditorTool): void => {\n if (typeof tool === \"string\") {\n tool = toolbar[tool];\n }\n\n this.setState({ tool }, () => {\n const tt = tool as ImageEditorTool;\n typeof tt.onActivate === \"function\" &&\n tt.onActivate({ canvas: this.canvas, options: this.getToolOptions(tt) });\n });\n };\n\n private readonly deactivateTool = (): void => {\n this.setState({\n tool: null\n });\n };\n\n public readonly getCanvasDataUrl = (): string => {\n const canvas = this.canvas.current as HTMLCanvasElement;\n if (canvas) {\n const { src } = this.props;\n if (src.startsWith(\"data:image/jpeg;\")) {\n return canvas.toDataURL(\"image/jpeg\", 1.0);\n }\n\n return canvas.toDataURL();\n }\n\n return \"\";\n };\n\n private readonly applyActiveTool = async (): Promise<void> => {\n const { tool } = this.state;\n if (!tool) {\n return;\n }\n\n if (tool.apply) {\n await tool.apply({\n canvas: this.canvas\n });\n }\n this.deactivateTool();\n };\n\n private readonly cancelActiveTool = async (): Promise<void> => {\n const { tool } = this.state;\n if (!tool) {\n return;\n }\n\n if (tool.cancel) {\n await tool.cancel({\n canvas: this.canvas\n });\n }\n this.deactivateTool();\n };\n\n private readonly getToolOptions = (\n tool: ImageEditorTool\n ): Partial<ImageEditorPropsPropsOptions> => {\n const { options } = this.props;\n if (!options || typeof options !== \"object\") {\n return {};\n }\n\n return options[tool.name as ToolbarTool] || {};\n };\n\n public override render(): React.ReactNode {\n const { src, tools, children } = this.props;\n const { tool } = this.state;\n const editor = (\n <div className={\"w-full h-full flex flex-col gap-md overflow-hidden\"}>\n <div className={\"flex justify-center items-center w-full\"}>\n {tools.map(key => {\n const tool: ImageEditorTool = toolbar[key];\n if (!tool) {\n return null;\n }\n\n return (\n <div\n key={key}\n className={\n this.state.tool ? \"opacity-50 cursor pointer-events-none\" : \"\"\n }\n >\n {tool.icon({\n activateTool: () => this.activateTool(tool)\n })}\n </div>\n );\n })}\n </div>\n <div className={\"w-full\"}>\n {tool ? (\n <>\n {typeof tool.renderForm === \"function\" &&\n tool.renderForm({\n options: this.getToolOptions(tool as ImageEditorTool),\n image: this.image as HTMLImageElement,\n canvas: this.canvas\n })}\n\n <div className={\"flex justify-center gap-sm mt-sm\"}>\n <Button\n variant={\"secondary\"}\n text={\"Cancel\"}\n data-testid=\"button-cancel\"\n onClick={() => {\n this.cancelActiveTool();\n }}\n />\n <Button\n variant={\"primary\"}\n text={\"Apply\"}\n data-testid=\"button-apply\"\n onClick={() => {\n this.applyActiveTool();\n }}\n />\n </div>\n </>\n ) : (\n <div className={\"text-center\"}>\n Select a tool to start working on your image.\n </div>\n )}\n </div>\n <div\n className={\n \"flex justify-center items-center w-full bg-neutral-dimmed rounded-md overflow-hidden\"\n }\n style={{ height: \"calc(100vh - 256px)\" }}\n >\n <canvas\n key={src}\n id={\"canvas\"}\n style={{ maxWidth: \"100%\", maxHeight: \"100%\" }}\n ref={this.canvas as React.Ref<any>}\n />\n </div>\n </div>\n );\n\n if (typeof children === \"function\") {\n return children({\n render: () => editor,\n // canvas: this.canvas,\n getCanvasDataUrl: this.getCanvasDataUrl,\n activeTool: this.state.tool,\n applyActiveTool: this.applyActiveTool,\n cancelActiveTool: this.cancelActiveTool\n });\n }\n\n return editor;\n }\n}\n\nexport { ImageEditor };\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["React","Button","flip","filter","crop","rotate","loadScript","toolbar","initScripts","Promise","resolve","window","Caman","ImageEditor","Component","defaultProps","tools","state","tool","src","canvas","createRef","componentDidMount","then","updateCanvas","setTimeout","options","props","key","option","autoEnable","activateTool","image","Image","current","onload","width","height","ctx","getContext","drawImage","setState","tt","onActivate","getToolOptions","deactivateTool","getCanvasDataUrl","startsWith","toDataURL","applyActiveTool","apply","cancelActiveTool","cancel","name","render","children","editor","createElement","className","map","icon","Fragment","renderForm","variant","text","onClick","style","id","maxWidth","maxHeight","ref","activeTool"],"sources":["ImageEditor.tsx"],"sourcesContent":["import React from \"react\";\nimport { Button } from \"@webiny/admin-ui\";\nimport { flip, filter, crop, rotate } from \"./toolbar/index.js\";\nimport type { ImageEditorTool, ToolbarTool } from \"./toolbar/types.js\";\nimport loadScript from \"load-script\";\n\nconst toolbar = {\n flip,\n filter,\n crop,\n rotate\n};\n\nconst initScripts = (): Promise<string> => {\n return new Promise((resolve: any) => {\n // @ts-expect-error\n if (window.Caman) {\n return resolve();\n }\n return loadScript(\n \"https://cdnjs.cloudflare.com/ajax/libs/camanjs/4.1.2/caman.full.min.js\",\n resolve\n );\n });\n};\n\ninterface RenderPropArgs {\n render: () => React.ReactNode;\n getCanvasDataUrl: () => string;\n activeTool: ImageEditorTool | null;\n applyActiveTool: () => Promise<void>;\n cancelActiveTool: () => Promise<void>;\n}\n\ninterface ImageEditorPropsPropsOptions {\n autoEnable: boolean;\n}\n\ninterface ImageEditorProps {\n src: string;\n tools: ToolbarTool[];\n options?: {\n flip: ImageEditorPropsPropsOptions;\n filter: ImageEditorPropsPropsOptions;\n crop: ImageEditorPropsPropsOptions;\n rotate: ImageEditorPropsPropsOptions;\n };\n onToolActivate?: () => void;\n onToolDeactivate?: () => void;\n children?: (props: RenderPropArgs) => React.ReactNode;\n}\n\ninterface ImageEditorState {\n tool: ImageEditorTool | null;\n src: string;\n}\n\nclass ImageEditor extends React.Component<ImageEditorProps, ImageEditorState> {\n static defaultProps: Partial<ImageEditorProps> = {\n tools: [\"crop\", \"flip\", \"rotate\", \"filter\"]\n };\n\n public override state: ImageEditorState = {\n tool: null,\n src: \"\"\n };\n\n public canvas = React.createRef<HTMLCanvasElement>();\n public image?: HTMLImageElement;\n\n public override componentDidMount() {\n initScripts().then(() => {\n this.updateCanvas();\n setTimeout(() => {\n const { options } = this.props;\n if (!options || typeof options !== \"object\") {\n return;\n }\n for (const key in options) {\n const option = options[key as ToolbarTool];\n if (option.autoEnable === true) {\n const tool: ImageEditorTool | null = toolbar[key as ToolbarTool];\n tool && this.activateTool(tool);\n break;\n }\n }\n }, 250);\n });\n }\n\n private readonly updateCanvas = (): void => {\n const { src } = this.props;\n this.image = new window.Image();\n const canvas = this.canvas.current;\n if (canvas) {\n this.image.onload = () => {\n if (this.image) {\n canvas.width = this.image.width;\n canvas.height = this.image.height;\n const ctx = canvas.getContext(\"2d\") as CanvasRenderingContext2D;\n ctx.drawImage(this.image, 0, 0);\n }\n };\n\n this.image.src = src;\n }\n };\n\n private readonly activateTool = (tool: ToolbarTool | ImageEditorTool): void => {\n if (typeof tool === \"string\") {\n tool = toolbar[tool];\n }\n\n this.setState({ tool }, () => {\n const tt = tool as ImageEditorTool;\n typeof tt.onActivate === \"function\" &&\n tt.onActivate({ canvas: this.canvas, options: this.getToolOptions(tt) });\n });\n };\n\n private readonly deactivateTool = (): void => {\n this.setState({\n tool: null\n });\n };\n\n public readonly getCanvasDataUrl = (): string => {\n const canvas = this.canvas.current as HTMLCanvasElement;\n if (canvas) {\n const { src } = this.props;\n if (src.startsWith(\"data:image/jpeg;\")) {\n return canvas.toDataURL(\"image/jpeg\", 1.0);\n }\n\n return canvas.toDataURL();\n }\n\n return \"\";\n };\n\n private readonly applyActiveTool = async (): Promise<void> => {\n const { tool } = this.state;\n if (!tool) {\n return;\n }\n\n if (tool.apply) {\n await tool.apply({\n canvas: this.canvas\n });\n }\n this.deactivateTool();\n };\n\n private readonly cancelActiveTool = async (): Promise<void> => {\n const { tool } = this.state;\n if (!tool) {\n return;\n }\n\n if (tool.cancel) {\n await tool.cancel({\n canvas: this.canvas\n });\n }\n this.deactivateTool();\n };\n\n private readonly getToolOptions = (\n tool: ImageEditorTool\n ): Partial<ImageEditorPropsPropsOptions> => {\n const { options } = this.props;\n if (!options || typeof options !== \"object\") {\n return {};\n }\n\n return options[tool.name as ToolbarTool] || {};\n };\n\n public override render(): React.ReactNode {\n const { src, tools, children } = this.props;\n const { tool } = this.state;\n const editor = (\n <div className={\"w-full h-full flex flex-col gap-md overflow-hidden\"}>\n <div className={\"flex justify-center items-center w-full\"}>\n {tools.map(key => {\n const tool: ImageEditorTool = toolbar[key];\n if (!tool) {\n return null;\n }\n\n return (\n <div\n key={key}\n className={\n this.state.tool ? \"opacity-50 cursor pointer-events-none\" : \"\"\n }\n >\n {tool.icon({\n activateTool: () => this.activateTool(tool)\n })}\n </div>\n );\n })}\n </div>\n <div className={\"w-full\"}>\n {tool ? (\n <>\n {typeof tool.renderForm === \"function\" &&\n tool.renderForm({\n options: this.getToolOptions(tool as ImageEditorTool),\n image: this.image as HTMLImageElement,\n canvas: this.canvas\n })}\n\n <div className={\"flex justify-center gap-sm mt-sm\"}>\n <Button\n variant={\"secondary\"}\n text={\"Cancel\"}\n data-testid=\"button-cancel\"\n onClick={() => {\n this.cancelActiveTool();\n }}\n />\n <Button\n variant={\"primary\"}\n text={\"Apply\"}\n data-testid=\"button-apply\"\n onClick={() => {\n this.applyActiveTool();\n }}\n />\n </div>\n </>\n ) : (\n <div className={\"text-center\"}>\n Select a tool to start working on your image.\n </div>\n )}\n </div>\n <div\n className={\n \"flex justify-center items-center w-full bg-neutral-dimmed rounded-md overflow-hidden\"\n }\n style={{ height: \"calc(100vh - 256px)\" }}\n >\n <canvas\n key={src}\n id={\"canvas\"}\n style={{ maxWidth: \"100%\", maxHeight: \"100%\" }}\n ref={this.canvas as React.Ref<any>}\n />\n </div>\n </div>\n );\n\n if (typeof children === \"function\") {\n return children({\n render: () => editor,\n // canvas: this.canvas,\n getCanvasDataUrl: this.getCanvasDataUrl,\n activeTool: this.state.tool,\n applyActiveTool: this.applyActiveTool,\n cancelActiveTool: this.cancelActiveTool\n });\n }\n\n return editor;\n }\n}\n\nexport { ImageEditor };\n"],"mappings":"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","ignoreList":[]}
@@ -1,7 +1,5 @@
1
1
  import React from "react";
2
2
  // @ts-expect-error
3
- import { Hotkeys } from "react-hotkeyz";
4
- // @ts-expect-error
5
3
  import dataURLtoBlob from "dataurl-to-blob";
6
4
  import { ImageEditorDialog } from "../../../../components/ImageEditor/ImageEditorDialog.js";
7
5
  import { ReactComponent as EditIcon } from "@webiny/icons/edit.svg";
@@ -80,10 +78,7 @@ export const EditImage = () => {
80
78
  dataUrl
81
79
  });
82
80
  }
83
- }), /*#__PURE__*/React.createElement(Hotkeys, {
84
- zIndex: 100,
85
- disabled: !state.dataUrl
86
- }, /*#__PURE__*/React.createElement(ImageEditorDialog, {
81
+ }), /*#__PURE__*/React.createElement(ImageEditorDialog, {
87
82
  "data-testid": "fm-image-editor-dialog",
88
83
  dialogZIndex: 100,
89
84
  open: state.showImageEditor,
@@ -105,7 +100,7 @@ export const EditImage = () => {
105
100
  fileDetails.close();
106
101
  }
107
102
  }
108
- })));
103
+ }));
109
104
  };
110
105
 
111
106
  //# sourceMappingURL=EditImage.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["React","Hotkeys","dataURLtoBlob","ImageEditorDialog","ReactComponent","EditIcon","FileManagerViewConfig","useFile","useFileDetails","useFileManagerApi","useFileManagerView","useSnackbar","toDataUrl","url","Promise","resolve","xhr","window","XMLHttpRequest","onload","reader","FileReader","onloadend","result","readAsDataURL","response","open","responseType","send","initialState","showImageEditor","dataUrl","reducer","state","action","next","type","FileDetails","EditImage","file","canEdit","fileDetails","uploadFile","dispatch","useReducer","showSnackbar","startsWith","createElement","Fragment","Action","Button","className","label","icon","onAction","src","zIndex","disabled","dialogZIndex","onClose","onAccept","blob","name","key","split","pop","newFile","setFile","close"],"sources":["EditImage.tsx"],"sourcesContent":["import React from \"react\";\n// @ts-expect-error\nimport { Hotkeys } from \"react-hotkeyz\";\n// @ts-expect-error\nimport dataURLtoBlob from \"dataurl-to-blob\";\nimport { ImageEditorDialog } from \"~/components/ImageEditor/ImageEditorDialog.js\";\nimport { ReactComponent as EditIcon } from \"@webiny/icons/edit.svg\";\nimport {\n FileManagerViewConfig,\n useFile,\n useFileDetails,\n useFileManagerApi,\n useFileManagerView\n} from \"~/index.js\";\nimport { useSnackbar } from \"@webiny/app-admin\";\n\nfunction toDataUrl(url: string): Promise<string> {\n return new Promise((resolve: (value: string) => void) => {\n const xhr = new window.XMLHttpRequest();\n xhr.onload = function () {\n const reader = new window.FileReader();\n reader.onloadend = function () {\n resolve(reader.result as string);\n };\n reader.readAsDataURL(xhr.response);\n };\n xhr.open(\"GET\", url);\n xhr.responseType = \"blob\";\n xhr.send();\n });\n}\n\ninterface State {\n showImageEditor: boolean;\n dataUrl: string | null;\n}\n\ninterface Action {\n type: \"setDataUrl\" | \"hideImageEditor\";\n dataUrl?: string | null;\n}\n\nconst initialState: State = {\n showImageEditor: false,\n dataUrl: null\n};\n\nconst reducer = (state: State, action: Action): State => {\n const next: State = { ...state };\n\n switch (action.type) {\n case \"setDataUrl\":\n next.dataUrl = action.dataUrl as string;\n next.showImageEditor = true;\n break;\n case \"hideImageEditor\":\n next.dataUrl = null;\n next.showImageEditor = false;\n break;\n }\n\n return next;\n};\n\nconst { FileDetails } = FileManagerViewConfig;\n\nexport const EditImage = () => {\n const { file } = useFile();\n const { canEdit } = useFileManagerApi();\n const fileDetails = useFileDetails();\n const { uploadFile } = useFileManagerView();\n const [state, dispatch] = React.useReducer(reducer, initialState);\n const { showSnackbar } = useSnackbar();\n\n if (!file.type.startsWith(\"image/\")) {\n return null;\n }\n\n // Render nothing if the user doesn't have the required permissions for \"edit\".\n if (!canEdit(file)) {\n return null;\n }\n\n return (\n <>\n <FileDetails.Action.Button\n className={\"order-last ml-auto\"}\n label={\"Edit image\"}\n data-testid={\"fm-edit-image-button\"}\n icon={<EditIcon />}\n onAction={async () => {\n const dataUrl = await toDataUrl(file.src);\n dispatch({ type: \"setDataUrl\", dataUrl });\n }}\n />\n <Hotkeys zIndex={100} disabled={!state.dataUrl}>\n <ImageEditorDialog\n data-testid={\"fm-image-editor-dialog\"}\n dialogZIndex={100}\n open={state.showImageEditor}\n src={state.dataUrl as string}\n onClose={() => dispatch({ type: \"hideImageEditor\" })}\n onAccept={async src => {\n const blob = dataURLtoBlob(src);\n blob.name = file.name;\n blob.key = file.key.split(\"/\").pop();\n const newFile = await uploadFile(blob);\n\n if (newFile) {\n showSnackbar(\"A new version of the image has been created!\");\n dispatch({ type: \"hideImageEditor\" });\n fileDetails.setFile(newFile);\n fileDetails.close();\n }\n }}\n />\n </Hotkeys>\n </>\n );\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["React","dataURLtoBlob","ImageEditorDialog","ReactComponent","EditIcon","FileManagerViewConfig","useFile","useFileDetails","useFileManagerApi","useFileManagerView","useSnackbar","toDataUrl","url","Promise","resolve","xhr","window","XMLHttpRequest","onload","reader","FileReader","onloadend","result","readAsDataURL","response","open","responseType","send","initialState","showImageEditor","dataUrl","reducer","state","action","next","type","FileDetails","EditImage","file","canEdit","fileDetails","uploadFile","dispatch","useReducer","showSnackbar","startsWith","createElement","Fragment","Action","Button","className","label","icon","onAction","src","dialogZIndex","onClose","onAccept","blob","name","key","split","pop","newFile","setFile","close"],"sources":["EditImage.tsx"],"sourcesContent":["import React from \"react\";\n// @ts-expect-error\nimport dataURLtoBlob from \"dataurl-to-blob\";\nimport { ImageEditorDialog } from \"~/components/ImageEditor/ImageEditorDialog.js\";\nimport { ReactComponent as EditIcon } from \"@webiny/icons/edit.svg\";\nimport {\n FileManagerViewConfig,\n useFile,\n useFileDetails,\n useFileManagerApi,\n useFileManagerView\n} from \"~/index.js\";\nimport { useSnackbar } from \"@webiny/app-admin\";\n\nfunction toDataUrl(url: string): Promise<string> {\n return new Promise((resolve: (value: string) => void) => {\n const xhr = new window.XMLHttpRequest();\n xhr.onload = function () {\n const reader = new window.FileReader();\n reader.onloadend = function () {\n resolve(reader.result as string);\n };\n reader.readAsDataURL(xhr.response);\n };\n xhr.open(\"GET\", url);\n xhr.responseType = \"blob\";\n xhr.send();\n });\n}\n\ninterface State {\n showImageEditor: boolean;\n dataUrl: string | null;\n}\n\ninterface Action {\n type: \"setDataUrl\" | \"hideImageEditor\";\n dataUrl?: string | null;\n}\n\nconst initialState: State = {\n showImageEditor: false,\n dataUrl: null\n};\n\nconst reducer = (state: State, action: Action): State => {\n const next: State = { ...state };\n\n switch (action.type) {\n case \"setDataUrl\":\n next.dataUrl = action.dataUrl as string;\n next.showImageEditor = true;\n break;\n case \"hideImageEditor\":\n next.dataUrl = null;\n next.showImageEditor = false;\n break;\n }\n\n return next;\n};\n\nconst { FileDetails } = FileManagerViewConfig;\n\nexport const EditImage = () => {\n const { file } = useFile();\n const { canEdit } = useFileManagerApi();\n const fileDetails = useFileDetails();\n const { uploadFile } = useFileManagerView();\n const [state, dispatch] = React.useReducer(reducer, initialState);\n const { showSnackbar } = useSnackbar();\n\n if (!file.type.startsWith(\"image/\")) {\n return null;\n }\n\n // Render nothing if the user doesn't have the required permissions for \"edit\".\n if (!canEdit(file)) {\n return null;\n }\n\n return (\n <>\n <FileDetails.Action.Button\n className={\"order-last ml-auto\"}\n label={\"Edit image\"}\n data-testid={\"fm-edit-image-button\"}\n icon={<EditIcon />}\n onAction={async () => {\n const dataUrl = await toDataUrl(file.src);\n dispatch({ type: \"setDataUrl\", dataUrl });\n }}\n />\n <ImageEditorDialog\n data-testid={\"fm-image-editor-dialog\"}\n dialogZIndex={100}\n open={state.showImageEditor}\n src={state.dataUrl as string}\n onClose={() => dispatch({ type: \"hideImageEditor\" })}\n onAccept={async src => {\n const blob = dataURLtoBlob(src);\n blob.name = file.name;\n blob.key = file.key.split(\"/\").pop();\n const newFile = await uploadFile(blob);\n\n if (newFile) {\n showSnackbar(\"A new version of the image has been created!\");\n dispatch({ type: \"hideImageEditor\" });\n fileDetails.setFile(newFile);\n fileDetails.close();\n }\n }}\n />\n </>\n );\n};\n"],"mappings":"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","ignoreList":[]}
@@ -1,8 +1,7 @@
1
1
  import React, { useCallback, useEffect, useMemo, useState } from "react";
2
2
  import Files from "react-butterfiles";
3
3
  import debounce from "lodash/debounce.js";
4
- // @ts-expect-error
5
- import { useHotkeys } from "react-hotkeyz";
4
+ import { useHotkeys } from "@webiny/app-admin";
6
5
  import { observer } from "mobx-react-lite";
7
6
  import { Scrollbar } from "@webiny/admin-ui";
8
7
  import { i18n } from "@webiny/app/i18n/index.js";
@@ -1 +1 @@
1
- {"version":3,"names":["React","useCallback","useEffect","useMemo","useState","Files","debounce","useHotkeys","observer","Scrollbar","i18n","LeftPanel","OverlayLayout","RightPanel","SplitView","useSnackbar","useFileManagerView","outputFileSelectionError","LeftSidebar","useFileManagerViewConfig","BatchFileUploader","BottomInfoBar","BulkActions","FileDropPlaceholder","Empty","FileDetails","Filters","Grid","Header","Table","TagsList","UploadStatus","t","ns","createSort","sorting","length","undefined","reduce","items","item","sort","id","desc","includes","push","FileManagerView","view","browser","showSnackbar","drawerLoading","setDrawerLoading","uploader","uploadFile","folderId","tableSorting","setTableSorting","currentFile","setCurrentFile","fetchFileDetails","showingFileDetails","file","getFile","setListSort","getFileUploadErrorMessage","e","match","message","zIndex","keys","esc","overlay","onClose","uploadFiles","files","addFiles","setIsUploadProgressIndicatorVisible","onUploadFinished","uploaded","errors","reset","createElement","Fragment","map","key","name","timeout","onUploadCompletion","filesBeingUploaded","getJobs","progress","renderList","browseFiles","isListLoading","isSearch","isSearchResult","folders","listTable","getSelectableRow","rows","filter","row","$type","data","onSelectRow","hasOnSelectCallback","multiple","setSelected","onChange","onToggleRow","toggleSelected","onSortingChange","folderActions","folder","actions","records","loading","onFolderClick","setFolderId","selected","deselectAll","displaySubFolders","loadMoreOnScroll","scrollFrame","top","loadMoreFiles","meta","updateFile","fileData","hideFileDetails","withOverlay","element","variant","onExited","maxSize","settings","uploadMaxFileSize","multipleMaxSize","accept","onSuccess","filesToUpload","src","Boolean","onError","getDropZoneProps","open","onSave","namespace","span","currentFolder","filterByTags","tags","activeTags","allTags","onActivatedTagsChange","setActiveTags","className","style","height","Object","assign","onDragOver","setDragging","onDragLeave","onDrop","onScrollFrame","dragging","numberOfFiles","isVisible","isUploadProgressIndicatorVisible","setIsVisible","listing","isListLoadingMore","totalCount","currentCount"],"sources":["FileManagerView.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport type { FilesRenderChildren } from \"react-butterfiles\";\nimport Files from \"react-butterfiles\";\nimport debounce from \"lodash/debounce.js\";\nimport type { positionValues } from \"react-custom-scrollbars\";\n// @ts-expect-error\nimport { useHotkeys } from \"react-hotkeyz\";\nimport { observer } from \"mobx-react-lite\";\nimport { type DataTableSorting, Scrollbar } from \"@webiny/admin-ui\";\nimport { i18n } from \"@webiny/app/i18n/index.js\";\nimport { LeftPanel, OverlayLayout, RightPanel, SplitView, useSnackbar } from \"@webiny/app-admin\";\nimport { useFileManagerView } from \"~/modules/FileManagerRenderer/FileManagerViewProvider/index.js\";\nimport { outputFileSelectionError } from \"./outputFileSelectionError.js\";\nimport { LeftSidebar } from \"./LeftSidebar.js\";\nimport { useFileManagerViewConfig } from \"~/index.js\";\nimport type { FileItem } from \"~/types.js\";\nimport { BatchFileUploader } from \"~/BatchFileUploader.js\";\nimport type { ListFilesSort, ListFilesSortItem } from \"~/modules/FileManagerApiProvider/graphql.js\";\nimport type { TableItem } from \"~/types.js\";\n\nimport { BottomInfoBar } from \"~/components/BottomInfoBar/index.js\";\nimport { BulkActions } from \"~/components/BulkActions/index.js\";\nimport { FileDropPlaceholder } from \"~/components/FileDropPlaceholder/index.js\";\nimport { Empty } from \"~/components/Empty/index.js\";\nimport { FileDetails } from \"~/components/FileDetails/index.js\";\nimport { Filters } from \"~/components/Filters/index.js\";\nimport { Grid } from \"~/components/Grid/index.js\";\nimport { Header } from \"~/components/Header/index.js\";\nimport type { TableProps } from \"~/components/Table/index.js\";\nimport { Table } from \"~/components/Table/index.js\";\nimport { TagsList } from \"~/components/TagsList/index.js\";\nimport { UploadStatus } from \"~/components/UploadStatus/index.js\";\n\nconst t = i18n.ns(\"app-admin/file-manager/file-manager-view\");\n\ntype GetFileUploadErrorMessageProps =\n | string\n | {\n message: string;\n };\n\nconst createSort = (sorting?: DataTableSorting): ListFilesSort | undefined => {\n if (!sorting?.length) {\n return undefined;\n }\n return sorting.reduce<ListFilesSort>((items, item) => {\n const sort = `${item.id}_${item.desc ? \"DESC\" : \"ASC\"}` as ListFilesSortItem;\n if (items.includes(sort)) {\n return items;\n }\n items.push(sort);\n return items;\n }, []);\n};\n\nconst FileManagerView = () => {\n const view = useFileManagerView();\n const { browser } = useFileManagerViewConfig();\n const { showSnackbar } = useSnackbar();\n const [drawerLoading, setDrawerLoading] = useState<string | null>(null);\n\n const uploader = useMemo<BatchFileUploader>(\n () => new BatchFileUploader(view.uploadFile),\n [view.folderId]\n );\n\n const [tableSorting, setTableSorting] = useState<DataTableSorting>([]);\n const [currentFile, setCurrentFile] = useState<FileItem>();\n\n useEffect(() => {\n const fetchFileDetails = async () => {\n if (view.showingFileDetails) {\n setDrawerLoading(\"Loading file details...\");\n const file = await view.getFile(view.showingFileDetails);\n setCurrentFile(file);\n } else {\n setCurrentFile(undefined);\n }\n setDrawerLoading(null);\n };\n\n // call the function\n fetchFileDetails();\n }, [view.showingFileDetails]);\n\n useEffect(() => {\n if (!tableSorting?.length) {\n return;\n }\n const sort = createSort(tableSorting);\n if (!sort) {\n return;\n }\n view.setListSort(sort);\n }, [tableSorting]);\n\n const getFileUploadErrorMessage = useCallback((e: GetFileUploadErrorMessageProps) => {\n if (typeof e === \"string\") {\n const match = e.match(/Message>(.*?)<\\/Message/);\n if (match) {\n const [, message] = match;\n return message;\n }\n\n return e;\n }\n return e.message;\n }, []);\n\n useHotkeys({\n zIndex: 20,\n keys: {\n esc: () => {\n if (view.overlay) {\n view.onClose();\n }\n }\n }\n });\n\n const uploadFiles = async (files: File[]) => {\n uploader.addFiles(files);\n view.setIsUploadProgressIndicatorVisible(true);\n\n uploader.onUploadFinished(({ uploaded, errors }) => {\n uploader.reset();\n view.setIsUploadProgressIndicatorVisible(true);\n\n if (errors.length > 0) {\n showSnackbar(\n <>\n {t`One or more files were not uploaded successfully:`}\n <ol>\n {errors.map(({ file, e }) => (\n <li key={file.name}>\n <strong>{file.name}</strong>: {getFileUploadErrorMessage(e)}\n </li>\n ))}\n </ol>\n </>\n );\n return;\n }\n\n showSnackbar(t`File upload complete.`, { timeout: 3000 });\n\n view.onUploadCompletion(uploaded);\n });\n };\n\n const filesBeingUploaded = uploader.getJobs().length;\n const progress = uploader.progress;\n\n const renderList = (browseFiles: FilesRenderChildren[\"browseFiles\"]) => {\n if (!view.isListLoading && view.isSearch && view.files.length === 0) {\n return <Empty isSearchResult={true} browseFiles={browseFiles} />;\n }\n\n if (!view.isListLoading && view.files.length === 0 && view.folders.length === 0) {\n return <Empty isSearchResult={false} browseFiles={browseFiles} />;\n }\n\n if (view.listTable) {\n const getSelectableRow = (rows: TableItem[]) =>\n rows.filter(row => row.$type === \"RECORD\").map(row => row.data as FileItem);\n\n const onSelectRow: TableProps[\"onSelectRow\"] = view.hasOnSelectCallback\n ? rows => {\n const files = getSelectableRow(rows);\n\n if (view.multiple) {\n view.setSelected(files);\n } else {\n view.onChange(files[0]);\n }\n }\n : rows => {\n const files = getSelectableRow(rows);\n view.setSelected(files);\n };\n\n const onToggleRow: TableProps[\"onToggleRow\"] = view.hasOnSelectCallback\n ? row => {\n const files = getSelectableRow([row]);\n\n if (view.multiple) {\n view.toggleSelected(files[0]);\n } else {\n view.onChange(files[0]);\n }\n }\n : row => {\n const files = getSelectableRow([row]);\n view.toggleSelected(files[0]);\n };\n\n return (\n <Table\n onSelectRow={onSelectRow}\n onToggleRow={onToggleRow}\n sorting={tableSorting}\n onSortingChange={setTableSorting}\n />\n );\n }\n\n return (\n <Grid\n folderActions={browser.folder.actions}\n folders={view.folders}\n records={view.files}\n loading={view.isListLoading}\n onFolderClick={view.setFolderId}\n selected={view.selected}\n multiple={view.multiple}\n toggleSelected={view.toggleSelected}\n deselectAll={view.deselectAll}\n onChange={view.onChange}\n onClose={view.onClose}\n hasOnSelectCallback={view.hasOnSelectCallback}\n displaySubFolders={view.displaySubFolders}\n />\n );\n };\n\n const loadMoreOnScroll = useCallback(\n debounce(async ({ scrollFrame }: { scrollFrame: positionValues }) => {\n if (scrollFrame.top > 0.8) {\n view.loadMoreFiles();\n }\n }, 200),\n [view.meta, view.loadMoreFiles]\n );\n\n const updateFile = useCallback(\n async (data: FileItem) => {\n const { id, ...fileData } = data;\n setDrawerLoading(\"Saving file changes...\");\n await view.updateFile(id, fileData);\n setDrawerLoading(null);\n showSnackbar(\"File updated successfully!\");\n view.hideFileDetails();\n },\n [view.updateFile]\n );\n\n const withOverlay = (element: React.ReactElement) => {\n if (view.overlay) {\n return (\n <OverlayLayout variant={\"strong\"} onExited={view.onClose}>\n {element}\n </OverlayLayout>\n );\n }\n\n return element;\n };\n return (\n <Files\n multiple\n maxSize={view.settings ? view.settings.uploadMaxFileSize + \"b\" : \"1TB\"}\n multipleMaxSize={\"1TB\"}\n accept={view.accept}\n onSuccess={files => {\n const filesToUpload = files.map(file => file.src.file).filter(Boolean) as File[];\n uploadFiles(filesToUpload);\n }}\n onError={errors => {\n const message = outputFileSelectionError(errors);\n showSnackbar(message);\n }}\n >\n {({ getDropZoneProps, browseFiles }) =>\n withOverlay(\n <>\n <FileDetails\n loading={drawerLoading}\n file={currentFile}\n open={Boolean(view.showingFileDetails)}\n onClose={view.hideFileDetails}\n onSave={updateFile}\n />\n <SplitView namespace={\"fm/file/list\"}>\n <LeftPanel span={2}>\n <LeftSidebar\n currentFolder={view.folderId}\n onFolderClick={view.setFolderId}\n >\n {browser.filterByTags ? (\n <TagsList\n loading={view.tags.loading}\n activeTags={view.tags.activeTags}\n tags={view.tags.allTags}\n onActivatedTagsChange={view.tags.setActiveTags}\n />\n ) : null}\n </LeftSidebar>\n </LeftPanel>\n <RightPanel span={10}>\n <div\n className={\"flex flex-col relative\"}\n style={{ height: \"calc(100vh - 45px\" }}\n >\n <Header browseFiles={browseFiles} />\n <div\n className={\"flex-1\"}\n {...getDropZoneProps({\n onDragOver: () => view.setDragging(true),\n onDragLeave: () => view.setDragging(false),\n onDrop: () => view.setDragging(false)\n })}\n data-testid={\"fm-list-wrapper\"}\n >\n <BulkActions />\n <Filters />\n <Scrollbar\n onScrollFrame={scrollFrame =>\n loadMoreOnScroll({ scrollFrame })\n }\n >\n {renderList(browseFiles)}\n </Scrollbar>\n {view.dragging && <FileDropPlaceholder />}\n <UploadStatus\n numberOfFiles={filesBeingUploaded}\n progress={progress}\n isVisible={view.isUploadProgressIndicatorVisible}\n setIsVisible={view.setIsUploadProgressIndicatorVisible}\n />\n </div>\n <BottomInfoBar\n accept={view.accept}\n listing={view.isListLoadingMore}\n loading={view.isListLoading}\n totalCount={view.meta?.totalCount ?? 0}\n currentCount={view.files.length}\n />\n </div>\n </RightPanel>\n </SplitView>\n </>\n )\n }\n </Files>\n );\n};\n\nexport default observer(FileManagerView);\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["React","useCallback","useEffect","useMemo","useState","Files","debounce","useHotkeys","observer","Scrollbar","i18n","LeftPanel","OverlayLayout","RightPanel","SplitView","useSnackbar","useFileManagerView","outputFileSelectionError","LeftSidebar","useFileManagerViewConfig","BatchFileUploader","BottomInfoBar","BulkActions","FileDropPlaceholder","Empty","FileDetails","Filters","Grid","Header","Table","TagsList","UploadStatus","t","ns","createSort","sorting","length","undefined","reduce","items","item","sort","id","desc","includes","push","FileManagerView","view","browser","showSnackbar","drawerLoading","setDrawerLoading","uploader","uploadFile","folderId","tableSorting","setTableSorting","currentFile","setCurrentFile","fetchFileDetails","showingFileDetails","file","getFile","setListSort","getFileUploadErrorMessage","e","match","message","zIndex","keys","esc","overlay","onClose","uploadFiles","files","addFiles","setIsUploadProgressIndicatorVisible","onUploadFinished","uploaded","errors","reset","createElement","Fragment","map","key","name","timeout","onUploadCompletion","filesBeingUploaded","getJobs","progress","renderList","browseFiles","isListLoading","isSearch","isSearchResult","folders","listTable","getSelectableRow","rows","filter","row","$type","data","onSelectRow","hasOnSelectCallback","multiple","setSelected","onChange","onToggleRow","toggleSelected","onSortingChange","folderActions","folder","actions","records","loading","onFolderClick","setFolderId","selected","deselectAll","displaySubFolders","loadMoreOnScroll","scrollFrame","top","loadMoreFiles","meta","updateFile","fileData","hideFileDetails","withOverlay","element","variant","onExited","maxSize","settings","uploadMaxFileSize","multipleMaxSize","accept","onSuccess","filesToUpload","src","Boolean","onError","getDropZoneProps","open","onSave","namespace","span","currentFolder","filterByTags","tags","activeTags","allTags","onActivatedTagsChange","setActiveTags","className","style","height","Object","assign","onDragOver","setDragging","onDragLeave","onDrop","onScrollFrame","dragging","numberOfFiles","isVisible","isUploadProgressIndicatorVisible","setIsVisible","listing","isListLoadingMore","totalCount","currentCount"],"sources":["FileManagerView.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport type { FilesRenderChildren } from \"react-butterfiles\";\nimport Files from \"react-butterfiles\";\nimport debounce from \"lodash/debounce.js\";\nimport type { positionValues } from \"react-custom-scrollbars\";\nimport { useHotkeys } from \"@webiny/app-admin\";\nimport { observer } from \"mobx-react-lite\";\nimport { type DataTableSorting, Scrollbar } from \"@webiny/admin-ui\";\nimport { i18n } from \"@webiny/app/i18n/index.js\";\nimport { LeftPanel, OverlayLayout, RightPanel, SplitView, useSnackbar } from \"@webiny/app-admin\";\nimport { useFileManagerView } from \"~/modules/FileManagerRenderer/FileManagerViewProvider/index.js\";\nimport { outputFileSelectionError } from \"./outputFileSelectionError.js\";\nimport { LeftSidebar } from \"./LeftSidebar.js\";\nimport { useFileManagerViewConfig } from \"~/index.js\";\nimport type { FileItem } from \"~/types.js\";\nimport { BatchFileUploader } from \"~/BatchFileUploader.js\";\nimport type { ListFilesSort, ListFilesSortItem } from \"~/modules/FileManagerApiProvider/graphql.js\";\nimport type { TableItem } from \"~/types.js\";\n\nimport { BottomInfoBar } from \"~/components/BottomInfoBar/index.js\";\nimport { BulkActions } from \"~/components/BulkActions/index.js\";\nimport { FileDropPlaceholder } from \"~/components/FileDropPlaceholder/index.js\";\nimport { Empty } from \"~/components/Empty/index.js\";\nimport { FileDetails } from \"~/components/FileDetails/index.js\";\nimport { Filters } from \"~/components/Filters/index.js\";\nimport { Grid } from \"~/components/Grid/index.js\";\nimport { Header } from \"~/components/Header/index.js\";\nimport type { TableProps } from \"~/components/Table/index.js\";\nimport { Table } from \"~/components/Table/index.js\";\nimport { TagsList } from \"~/components/TagsList/index.js\";\nimport { UploadStatus } from \"~/components/UploadStatus/index.js\";\n\nconst t = i18n.ns(\"app-admin/file-manager/file-manager-view\");\n\ntype GetFileUploadErrorMessageProps =\n | string\n | {\n message: string;\n };\n\nconst createSort = (sorting?: DataTableSorting): ListFilesSort | undefined => {\n if (!sorting?.length) {\n return undefined;\n }\n return sorting.reduce<ListFilesSort>((items, item) => {\n const sort = `${item.id}_${item.desc ? \"DESC\" : \"ASC\"}` as ListFilesSortItem;\n if (items.includes(sort)) {\n return items;\n }\n items.push(sort);\n return items;\n }, []);\n};\n\nconst FileManagerView = () => {\n const view = useFileManagerView();\n const { browser } = useFileManagerViewConfig();\n const { showSnackbar } = useSnackbar();\n const [drawerLoading, setDrawerLoading] = useState<string | null>(null);\n\n const uploader = useMemo<BatchFileUploader>(\n () => new BatchFileUploader(view.uploadFile),\n [view.folderId]\n );\n\n const [tableSorting, setTableSorting] = useState<DataTableSorting>([]);\n const [currentFile, setCurrentFile] = useState<FileItem>();\n\n useEffect(() => {\n const fetchFileDetails = async () => {\n if (view.showingFileDetails) {\n setDrawerLoading(\"Loading file details...\");\n const file = await view.getFile(view.showingFileDetails);\n setCurrentFile(file);\n } else {\n setCurrentFile(undefined);\n }\n setDrawerLoading(null);\n };\n\n // call the function\n fetchFileDetails();\n }, [view.showingFileDetails]);\n\n useEffect(() => {\n if (!tableSorting?.length) {\n return;\n }\n const sort = createSort(tableSorting);\n if (!sort) {\n return;\n }\n view.setListSort(sort);\n }, [tableSorting]);\n\n const getFileUploadErrorMessage = useCallback((e: GetFileUploadErrorMessageProps) => {\n if (typeof e === \"string\") {\n const match = e.match(/Message>(.*?)<\\/Message/);\n if (match) {\n const [, message] = match;\n return message;\n }\n\n return e;\n }\n return e.message;\n }, []);\n\n useHotkeys({\n zIndex: 20,\n keys: {\n esc: () => {\n if (view.overlay) {\n view.onClose();\n }\n }\n }\n });\n\n const uploadFiles = async (files: File[]) => {\n uploader.addFiles(files);\n view.setIsUploadProgressIndicatorVisible(true);\n\n uploader.onUploadFinished(({ uploaded, errors }) => {\n uploader.reset();\n view.setIsUploadProgressIndicatorVisible(true);\n\n if (errors.length > 0) {\n showSnackbar(\n <>\n {t`One or more files were not uploaded successfully:`}\n <ol>\n {errors.map(({ file, e }) => (\n <li key={file.name}>\n <strong>{file.name}</strong>: {getFileUploadErrorMessage(e)}\n </li>\n ))}\n </ol>\n </>\n );\n return;\n }\n\n showSnackbar(t`File upload complete.`, { timeout: 3000 });\n\n view.onUploadCompletion(uploaded);\n });\n };\n\n const filesBeingUploaded = uploader.getJobs().length;\n const progress = uploader.progress;\n\n const renderList = (browseFiles: FilesRenderChildren[\"browseFiles\"]) => {\n if (!view.isListLoading && view.isSearch && view.files.length === 0) {\n return <Empty isSearchResult={true} browseFiles={browseFiles} />;\n }\n\n if (!view.isListLoading && view.files.length === 0 && view.folders.length === 0) {\n return <Empty isSearchResult={false} browseFiles={browseFiles} />;\n }\n\n if (view.listTable) {\n const getSelectableRow = (rows: TableItem[]) =>\n rows.filter(row => row.$type === \"RECORD\").map(row => row.data as FileItem);\n\n const onSelectRow: TableProps[\"onSelectRow\"] = view.hasOnSelectCallback\n ? rows => {\n const files = getSelectableRow(rows);\n\n if (view.multiple) {\n view.setSelected(files);\n } else {\n view.onChange(files[0]);\n }\n }\n : rows => {\n const files = getSelectableRow(rows);\n view.setSelected(files);\n };\n\n const onToggleRow: TableProps[\"onToggleRow\"] = view.hasOnSelectCallback\n ? row => {\n const files = getSelectableRow([row]);\n\n if (view.multiple) {\n view.toggleSelected(files[0]);\n } else {\n view.onChange(files[0]);\n }\n }\n : row => {\n const files = getSelectableRow([row]);\n view.toggleSelected(files[0]);\n };\n\n return (\n <Table\n onSelectRow={onSelectRow}\n onToggleRow={onToggleRow}\n sorting={tableSorting}\n onSortingChange={setTableSorting}\n />\n );\n }\n\n return (\n <Grid\n folderActions={browser.folder.actions}\n folders={view.folders}\n records={view.files}\n loading={view.isListLoading}\n onFolderClick={view.setFolderId}\n selected={view.selected}\n multiple={view.multiple}\n toggleSelected={view.toggleSelected}\n deselectAll={view.deselectAll}\n onChange={view.onChange}\n onClose={view.onClose}\n hasOnSelectCallback={view.hasOnSelectCallback}\n displaySubFolders={view.displaySubFolders}\n />\n );\n };\n\n const loadMoreOnScroll = useCallback(\n debounce(async ({ scrollFrame }: { scrollFrame: positionValues }) => {\n if (scrollFrame.top > 0.8) {\n view.loadMoreFiles();\n }\n }, 200),\n [view.meta, view.loadMoreFiles]\n );\n\n const updateFile = useCallback(\n async (data: FileItem) => {\n const { id, ...fileData } = data;\n setDrawerLoading(\"Saving file changes...\");\n await view.updateFile(id, fileData);\n setDrawerLoading(null);\n showSnackbar(\"File updated successfully!\");\n view.hideFileDetails();\n },\n [view.updateFile]\n );\n\n const withOverlay = (element: React.ReactElement) => {\n if (view.overlay) {\n return (\n <OverlayLayout variant={\"strong\"} onExited={view.onClose}>\n {element}\n </OverlayLayout>\n );\n }\n\n return element;\n };\n return (\n <Files\n multiple\n maxSize={view.settings ? view.settings.uploadMaxFileSize + \"b\" : \"1TB\"}\n multipleMaxSize={\"1TB\"}\n accept={view.accept}\n onSuccess={files => {\n const filesToUpload = files.map(file => file.src.file).filter(Boolean) as File[];\n uploadFiles(filesToUpload);\n }}\n onError={errors => {\n const message = outputFileSelectionError(errors);\n showSnackbar(message);\n }}\n >\n {({ getDropZoneProps, browseFiles }) =>\n withOverlay(\n <>\n <FileDetails\n loading={drawerLoading}\n file={currentFile}\n open={Boolean(view.showingFileDetails)}\n onClose={view.hideFileDetails}\n onSave={updateFile}\n />\n <SplitView namespace={\"fm/file/list\"}>\n <LeftPanel span={2}>\n <LeftSidebar\n currentFolder={view.folderId}\n onFolderClick={view.setFolderId}\n >\n {browser.filterByTags ? (\n <TagsList\n loading={view.tags.loading}\n activeTags={view.tags.activeTags}\n tags={view.tags.allTags}\n onActivatedTagsChange={view.tags.setActiveTags}\n />\n ) : null}\n </LeftSidebar>\n </LeftPanel>\n <RightPanel span={10}>\n <div\n className={\"flex flex-col relative\"}\n style={{ height: \"calc(100vh - 45px\" }}\n >\n <Header browseFiles={browseFiles} />\n <div\n className={\"flex-1\"}\n {...getDropZoneProps({\n onDragOver: () => view.setDragging(true),\n onDragLeave: () => view.setDragging(false),\n onDrop: () => view.setDragging(false)\n })}\n data-testid={\"fm-list-wrapper\"}\n >\n <BulkActions />\n <Filters />\n <Scrollbar\n onScrollFrame={scrollFrame =>\n loadMoreOnScroll({ scrollFrame })\n }\n >\n {renderList(browseFiles)}\n </Scrollbar>\n {view.dragging && <FileDropPlaceholder />}\n <UploadStatus\n numberOfFiles={filesBeingUploaded}\n progress={progress}\n isVisible={view.isUploadProgressIndicatorVisible}\n setIsVisible={view.setIsUploadProgressIndicatorVisible}\n />\n </div>\n <BottomInfoBar\n accept={view.accept}\n listing={view.isListLoadingMore}\n loading={view.isListLoading}\n totalCount={view.meta?.totalCount ?? 0}\n currentCount={view.files.length}\n />\n </div>\n </RightPanel>\n </SplitView>\n </>\n )\n }\n </Files>\n );\n};\n\nexport default observer(FileManagerView);\n"],"mappings":"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","ignoreList":[]}
@@ -1,11 +1,11 @@
1
1
  import React from "react";
2
2
  export interface ThumbnailConfig {
3
3
  type: string;
4
- element: JSX.Element;
4
+ element: React.JSX.Element;
5
5
  }
6
6
  export interface RendererProps {
7
7
  type: string;
8
- element: JSX.Element;
8
+ element: React.JSX.Element;
9
9
  }
10
10
  export declare const Thumbnail: (({ type, element }: RendererProps) => React.JSX.Element) & {
11
11
  original: ({ type, element }: RendererProps) => React.JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"names":["React","makeDecoratable","Property","useIdGenerator","Thumbnail","type","element","getId","createElement","id","name","array","value"],"sources":["Thumbnail.tsx"],"sourcesContent":["import React from \"react\";\nimport { makeDecoratable } from \"@webiny/react-composition\";\nimport { Property, useIdGenerator } from \"@webiny/react-properties\";\n\nexport interface ThumbnailConfig {\n type: string;\n element: JSX.Element;\n}\n\nexport interface RendererProps {\n type: string;\n element: JSX.Element;\n}\n\nexport const Thumbnail = makeDecoratable(\"Thumbnail\", ({ type, element }: RendererProps) => {\n const getId = useIdGenerator(\"browser:grid:thumbnail\");\n\n return (\n <Property id=\"browser\" name={\"browser\"}>\n <Property id=\"grid\" name={\"grid\"}>\n <Property id={getId(type)} name={\"itemThumbnails\"} array={true}>\n <Property id={getId(type, \"type\")} name={\"type\"} value={type} />\n <Property id={getId(type, \"element\")} name={\"element\"} value={element} />\n </Property>\n </Property>\n </Property>\n );\n});\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,eAAe,QAAQ,2BAA2B;AAC3D,SAASC,QAAQ,EAAEC,cAAc,QAAQ,0BAA0B;AAYnE,OAAO,MAAMC,SAAS,GAAGH,eAAe,CAAC,WAAW,EAAE,CAAC;EAAEI,IAAI;EAAEC;AAAuB,CAAC,KAAK;EACxF,MAAMC,KAAK,GAAGJ,cAAc,CAAC,wBAAwB,CAAC;EAEtD,oBACIH,KAAA,CAAAQ,aAAA,CAACN,QAAQ;IAACO,EAAE,EAAC,SAAS;IAACC,IAAI,EAAE;EAAU,gBACnCV,KAAA,CAAAQ,aAAA,CAACN,QAAQ;IAACO,EAAE,EAAC,MAAM;IAACC,IAAI,EAAE;EAAO,gBAC7BV,KAAA,CAAAQ,aAAA,CAACN,QAAQ;IAACO,EAAE,EAAEF,KAAK,CAACF,IAAI,CAAE;IAACK,IAAI,EAAE,gBAAiB;IAACC,KAAK,EAAE;EAAK,gBAC3DX,KAAA,CAAAQ,aAAA,CAACN,QAAQ;IAACO,EAAE,EAAEF,KAAK,CAACF,IAAI,EAAE,MAAM,CAAE;IAACK,IAAI,EAAE,MAAO;IAACE,KAAK,EAAEP;EAAK,CAAE,CAAC,eAChEL,KAAA,CAAAQ,aAAA,CAACN,QAAQ;IAACO,EAAE,EAAEF,KAAK,CAACF,IAAI,EAAE,SAAS,CAAE;IAACK,IAAI,EAAE,SAAU;IAACE,KAAK,EAAEN;EAAQ,CAAE,CAClE,CACJ,CACJ,CAAC;AAEnB,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["React","makeDecoratable","Property","useIdGenerator","Thumbnail","type","element","getId","createElement","id","name","array","value"],"sources":["Thumbnail.tsx"],"sourcesContent":["import React from \"react\";\nimport { makeDecoratable } from \"@webiny/react-composition\";\nimport { Property, useIdGenerator } from \"@webiny/react-properties\";\n\nexport interface ThumbnailConfig {\n type: string;\n element: React.JSX.Element;\n}\n\nexport interface RendererProps {\n type: string;\n element: React.JSX.Element;\n}\n\nexport const Thumbnail = makeDecoratable(\"Thumbnail\", ({ type, element }: RendererProps) => {\n const getId = useIdGenerator(\"browser:grid:thumbnail\");\n\n return (\n <Property id=\"browser\" name={\"browser\"}>\n <Property id=\"grid\" name={\"grid\"}>\n <Property id={getId(type)} name={\"itemThumbnails\"} array={true}>\n <Property id={getId(type, \"type\")} name={\"type\"} value={type} />\n <Property id={getId(type, \"element\")} name={\"element\"} value={element} />\n </Property>\n </Property>\n </Property>\n );\n});\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,eAAe,QAAQ,2BAA2B;AAC3D,SAASC,QAAQ,EAAEC,cAAc,QAAQ,0BAA0B;AAYnE,OAAO,MAAMC,SAAS,GAAGH,eAAe,CAAC,WAAW,EAAE,CAAC;EAAEI,IAAI;EAAEC;AAAuB,CAAC,KAAK;EACxF,MAAMC,KAAK,GAAGJ,cAAc,CAAC,wBAAwB,CAAC;EAEtD,oBACIH,KAAA,CAAAQ,aAAA,CAACN,QAAQ;IAACO,EAAE,EAAC,SAAS;IAACC,IAAI,EAAE;EAAU,gBACnCV,KAAA,CAAAQ,aAAA,CAACN,QAAQ;IAACO,EAAE,EAAC,MAAM;IAACC,IAAI,EAAE;EAAO,gBAC7BV,KAAA,CAAAQ,aAAA,CAACN,QAAQ;IAACO,EAAE,EAAEF,KAAK,CAACF,IAAI,CAAE;IAACK,IAAI,EAAE,gBAAiB;IAACC,KAAK,EAAE;EAAK,gBAC3DX,KAAA,CAAAQ,aAAA,CAACN,QAAQ;IAACO,EAAE,EAAEF,KAAK,CAACF,IAAI,EAAE,MAAM,CAAE;IAACK,IAAI,EAAE,MAAO;IAACE,KAAK,EAAEP;EAAK,CAAE,CAAC,eAChEL,KAAA,CAAAQ,aAAA,CAACN,QAAQ;IAACO,EAAE,EAAEF,KAAK,CAACF,IAAI,EAAE,SAAS,CAAE;IAACK,IAAI,EAAE,SAAU;IAACE,KAAK,EAAEN;EAAQ,CAAE,CAClE,CACJ,CACJ,CAAC;AAEnB,CAAC,CAAC","ignoreList":[]}
@@ -1,11 +1,11 @@
1
1
  import React from "react";
2
2
  export interface ThumbnailConfig {
3
3
  type: string;
4
- element: JSX.Element;
4
+ element: React.JSX.Element;
5
5
  }
6
6
  export interface RendererProps {
7
7
  type: string;
8
- element: JSX.Element;
8
+ element: React.JSX.Element;
9
9
  }
10
10
  export declare const Thumbnail: (({ type, element }: RendererProps) => React.JSX.Element) & {
11
11
  original: ({ type, element }: RendererProps) => React.JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"names":["React","makeDecoratable","Property","useIdGenerator","Thumbnail","type","element","getId","createElement","id","name","array","value"],"sources":["Thumbnail.tsx"],"sourcesContent":["import React from \"react\";\nimport { makeDecoratable } from \"@webiny/react-composition\";\nimport { Property, useIdGenerator } from \"@webiny/react-properties\";\n\nexport interface ThumbnailConfig {\n type: string;\n element: JSX.Element;\n}\n\nexport interface RendererProps {\n type: string;\n element: JSX.Element;\n}\n\nexport const Thumbnail = makeDecoratable(\"Thumbnail\", ({ type, element }: RendererProps) => {\n const getId = useIdGenerator(\"browser:table:thumbnail\");\n\n return (\n <Property id=\"browser\" name={\"browser\"}>\n <Property id=\"table\" name={\"table\"}>\n <Property id={getId(type)} name={\"cellThumbnails\"} array={true}>\n <Property id={getId(type, \"type\")} name={\"type\"} value={type} />\n <Property id={getId(type, \"element\")} name={\"element\"} value={element} />\n </Property>\n </Property>\n </Property>\n );\n});\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,eAAe,QAAQ,2BAA2B;AAC3D,SAASC,QAAQ,EAAEC,cAAc,QAAQ,0BAA0B;AAYnE,OAAO,MAAMC,SAAS,GAAGH,eAAe,CAAC,WAAW,EAAE,CAAC;EAAEI,IAAI;EAAEC;AAAuB,CAAC,KAAK;EACxF,MAAMC,KAAK,GAAGJ,cAAc,CAAC,yBAAyB,CAAC;EAEvD,oBACIH,KAAA,CAAAQ,aAAA,CAACN,QAAQ;IAACO,EAAE,EAAC,SAAS;IAACC,IAAI,EAAE;EAAU,gBACnCV,KAAA,CAAAQ,aAAA,CAACN,QAAQ;IAACO,EAAE,EAAC,OAAO;IAACC,IAAI,EAAE;EAAQ,gBAC/BV,KAAA,CAAAQ,aAAA,CAACN,QAAQ;IAACO,EAAE,EAAEF,KAAK,CAACF,IAAI,CAAE;IAACK,IAAI,EAAE,gBAAiB;IAACC,KAAK,EAAE;EAAK,gBAC3DX,KAAA,CAAAQ,aAAA,CAACN,QAAQ;IAACO,EAAE,EAAEF,KAAK,CAACF,IAAI,EAAE,MAAM,CAAE;IAACK,IAAI,EAAE,MAAO;IAACE,KAAK,EAAEP;EAAK,CAAE,CAAC,eAChEL,KAAA,CAAAQ,aAAA,CAACN,QAAQ;IAACO,EAAE,EAAEF,KAAK,CAACF,IAAI,EAAE,SAAS,CAAE;IAACK,IAAI,EAAE,SAAU;IAACE,KAAK,EAAEN;EAAQ,CAAE,CAClE,CACJ,CACJ,CAAC;AAEnB,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["React","makeDecoratable","Property","useIdGenerator","Thumbnail","type","element","getId","createElement","id","name","array","value"],"sources":["Thumbnail.tsx"],"sourcesContent":["import React from \"react\";\nimport { makeDecoratable } from \"@webiny/react-composition\";\nimport { Property, useIdGenerator } from \"@webiny/react-properties\";\n\nexport interface ThumbnailConfig {\n type: string;\n element: React.JSX.Element;\n}\n\nexport interface RendererProps {\n type: string;\n element: React.JSX.Element;\n}\n\nexport const Thumbnail = makeDecoratable(\"Thumbnail\", ({ type, element }: RendererProps) => {\n const getId = useIdGenerator(\"browser:table:thumbnail\");\n\n return (\n <Property id=\"browser\" name={\"browser\"}>\n <Property id=\"table\" name={\"table\"}>\n <Property id={getId(type)} name={\"cellThumbnails\"} array={true}>\n <Property id={getId(type, \"type\")} name={\"type\"} value={type} />\n <Property id={getId(type, \"element\")} name={\"element\"} value={element} />\n </Property>\n </Property>\n </Property>\n );\n});\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,eAAe,QAAQ,2BAA2B;AAC3D,SAASC,QAAQ,EAAEC,cAAc,QAAQ,0BAA0B;AAYnE,OAAO,MAAMC,SAAS,GAAGH,eAAe,CAAC,WAAW,EAAE,CAAC;EAAEI,IAAI;EAAEC;AAAuB,CAAC,KAAK;EACxF,MAAMC,KAAK,GAAGJ,cAAc,CAAC,yBAAyB,CAAC;EAEvD,oBACIH,KAAA,CAAAQ,aAAA,CAACN,QAAQ;IAACO,EAAE,EAAC,SAAS;IAACC,IAAI,EAAE;EAAU,gBACnCV,KAAA,CAAAQ,aAAA,CAACN,QAAQ;IAACO,EAAE,EAAC,OAAO;IAACC,IAAI,EAAE;EAAQ,gBAC/BV,KAAA,CAAAQ,aAAA,CAACN,QAAQ;IAACO,EAAE,EAAEF,KAAK,CAACF,IAAI,CAAE;IAACK,IAAI,EAAE,gBAAiB;IAACC,KAAK,EAAE;EAAK,gBAC3DX,KAAA,CAAAQ,aAAA,CAACN,QAAQ;IAACO,EAAE,EAAEF,KAAK,CAACF,IAAI,EAAE,MAAM,CAAE;IAACK,IAAI,EAAE,MAAO;IAACE,KAAK,EAAEP;EAAK,CAAE,CAAC,eAChEL,KAAA,CAAAQ,aAAA,CAACN,QAAQ;IAACO,EAAE,EAAEF,KAAK,CAACF,IAAI,EAAE,SAAS,CAAE;IAACK,IAAI,EAAE,SAAU;IAACE,KAAK,EAAEN;EAAQ,CAAE,CAClE,CACJ,CACJ,CAAC;AAEnB,CAAC,CAAC","ignoreList":[]}
@@ -1,11 +1,11 @@
1
1
  import React from "react";
2
2
  export interface ThumbnailConfig {
3
3
  type: string;
4
- element: JSX.Element;
4
+ element: React.JSX.Element;
5
5
  }
6
6
  export interface RendererProps {
7
7
  type: string;
8
- element: JSX.Element;
8
+ element: React.JSX.Element;
9
9
  }
10
10
  export declare const Thumbnail: (({ type, element }: RendererProps) => React.JSX.Element) & {
11
11
  original: ({ type, element }: RendererProps) => React.JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"names":["React","makeDecoratable","Property","useIdGenerator","Thumbnail","type","element","getId","createElement","id","name","array","value"],"sources":["Thumbnail.tsx"],"sourcesContent":["import React from \"react\";\nimport { makeDecoratable } from \"@webiny/react-composition\";\nimport { Property, useIdGenerator } from \"@webiny/react-properties\";\n\nexport interface ThumbnailConfig {\n type: string;\n element: JSX.Element;\n}\n\nexport interface RendererProps {\n type: string;\n element: JSX.Element;\n}\n\nexport const Thumbnail = makeDecoratable(\"Thumbnail\", ({ type, element }: RendererProps) => {\n const getId = useIdGenerator(\"thumbnail\");\n\n return (\n <Property id=\"fileDetails\" name={\"fileDetails\"}>\n <Property id={getId(type)} name={\"thumbnails\"} array={true}>\n <Property id={getId(type, \"type\")} name={\"type\"} value={type} />\n <Property id={getId(type, \"element\")} name={\"element\"} value={element} />\n </Property>\n </Property>\n );\n});\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,eAAe,QAAQ,2BAA2B;AAC3D,SAASC,QAAQ,EAAEC,cAAc,QAAQ,0BAA0B;AAYnE,OAAO,MAAMC,SAAS,GAAGH,eAAe,CAAC,WAAW,EAAE,CAAC;EAAEI,IAAI;EAAEC;AAAuB,CAAC,KAAK;EACxF,MAAMC,KAAK,GAAGJ,cAAc,CAAC,WAAW,CAAC;EAEzC,oBACIH,KAAA,CAAAQ,aAAA,CAACN,QAAQ;IAACO,EAAE,EAAC,aAAa;IAACC,IAAI,EAAE;EAAc,gBAC3CV,KAAA,CAAAQ,aAAA,CAACN,QAAQ;IAACO,EAAE,EAAEF,KAAK,CAACF,IAAI,CAAE;IAACK,IAAI,EAAE,YAAa;IAACC,KAAK,EAAE;EAAK,gBACvDX,KAAA,CAAAQ,aAAA,CAACN,QAAQ;IAACO,EAAE,EAAEF,KAAK,CAACF,IAAI,EAAE,MAAM,CAAE;IAACK,IAAI,EAAE,MAAO;IAACE,KAAK,EAAEP;EAAK,CAAE,CAAC,eAChEL,KAAA,CAAAQ,aAAA,CAACN,QAAQ;IAACO,EAAE,EAAEF,KAAK,CAACF,IAAI,EAAE,SAAS,CAAE;IAACK,IAAI,EAAE,SAAU;IAACE,KAAK,EAAEN;EAAQ,CAAE,CAClE,CACJ,CAAC;AAEnB,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["React","makeDecoratable","Property","useIdGenerator","Thumbnail","type","element","getId","createElement","id","name","array","value"],"sources":["Thumbnail.tsx"],"sourcesContent":["import React from \"react\";\nimport { makeDecoratable } from \"@webiny/react-composition\";\nimport { Property, useIdGenerator } from \"@webiny/react-properties\";\n\nexport interface ThumbnailConfig {\n type: string;\n element: React.JSX.Element;\n}\n\nexport interface RendererProps {\n type: string;\n element: React.JSX.Element;\n}\n\nexport const Thumbnail = makeDecoratable(\"Thumbnail\", ({ type, element }: RendererProps) => {\n const getId = useIdGenerator(\"thumbnail\");\n\n return (\n <Property id=\"fileDetails\" name={\"fileDetails\"}>\n <Property id={getId(type)} name={\"thumbnails\"} array={true}>\n <Property id={getId(type, \"type\")} name={\"type\"} value={type} />\n <Property id={getId(type, \"element\")} name={\"element\"} value={element} />\n </Property>\n </Property>\n );\n});\n"],"mappings":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,eAAe,QAAQ,2BAA2B;AAC3D,SAASC,QAAQ,EAAEC,cAAc,QAAQ,0BAA0B;AAYnE,OAAO,MAAMC,SAAS,GAAGH,eAAe,CAAC,WAAW,EAAE,CAAC;EAAEI,IAAI;EAAEC;AAAuB,CAAC,KAAK;EACxF,MAAMC,KAAK,GAAGJ,cAAc,CAAC,WAAW,CAAC;EAEzC,oBACIH,KAAA,CAAAQ,aAAA,CAACN,QAAQ;IAACO,EAAE,EAAC,aAAa;IAACC,IAAI,EAAE;EAAc,gBAC3CV,KAAA,CAAAQ,aAAA,CAACN,QAAQ;IAACO,EAAE,EAAEF,KAAK,CAACF,IAAI,CAAE;IAACK,IAAI,EAAE,YAAa;IAACC,KAAK,EAAE;EAAK,gBACvDX,KAAA,CAAAQ,aAAA,CAACN,QAAQ;IAACO,EAAE,EAAEF,KAAK,CAACF,IAAI,EAAE,MAAM,CAAE;IAACK,IAAI,EAAE,MAAO;IAACE,KAAK,EAAEP;EAAK,CAAE,CAAC,eAChEL,KAAA,CAAAQ,aAAA,CAACN,QAAQ;IAACO,EAAE,EAAEF,KAAK,CAACF,IAAI,EAAE,SAAS,CAAE;IAACK,IAAI,EAAE,SAAU;IAACE,KAAK,EAAEN;EAAQ,CAAE,CAClE,CACJ,CAAC;AAEnB,CAAC,CAAC","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webiny/app-file-manager",
3
- "version": "6.0.0",
3
+ "version": "6.1.0-beta.0",
4
4
  "type": "module",
5
5
  "main": "index.js",
6
6
  "repository": {
@@ -14,21 +14,21 @@
14
14
  "@apollo/react-components": "3.1.5",
15
15
  "@apollo/react-hooks": "3.1.5",
16
16
  "@types/react": "18.2.79",
17
- "@webiny/admin-ui": "6.0.0",
18
- "@webiny/app": "6.0.0",
19
- "@webiny/app-aco": "6.0.0",
20
- "@webiny/app-admin": "6.0.0",
21
- "@webiny/app-headless-cms": "6.0.0",
22
- "@webiny/app-headless-cms-common": "6.0.0",
23
- "@webiny/app-websockets": "6.0.0",
24
- "@webiny/error": "6.0.0",
25
- "@webiny/form": "6.0.0",
26
- "@webiny/icons": "6.0.0",
27
- "@webiny/plugins": "6.0.0",
28
- "@webiny/react-composition": "6.0.0",
29
- "@webiny/react-properties": "6.0.0",
30
- "@webiny/utils": "6.0.0",
31
- "@webiny/validation": "6.0.0",
17
+ "@webiny/admin-ui": "6.1.0-beta.0",
18
+ "@webiny/app": "6.1.0-beta.0",
19
+ "@webiny/app-aco": "6.1.0-beta.0",
20
+ "@webiny/app-admin": "6.1.0-beta.0",
21
+ "@webiny/app-headless-cms": "6.1.0-beta.0",
22
+ "@webiny/app-headless-cms-common": "6.1.0-beta.0",
23
+ "@webiny/app-websockets": "6.1.0-beta.0",
24
+ "@webiny/error": "6.1.0-beta.0",
25
+ "@webiny/form": "6.1.0-beta.0",
26
+ "@webiny/icons": "6.1.0-beta.0",
27
+ "@webiny/plugins": "6.1.0-beta.0",
28
+ "@webiny/react-composition": "6.1.0-beta.0",
29
+ "@webiny/react-properties": "6.1.0-beta.0",
30
+ "@webiny/utils": "6.1.0-beta.0",
31
+ "@webiny/validation": "6.1.0-beta.0",
32
32
  "apollo-cache": "1.3.5",
33
33
  "apollo-client": "2.6.10",
34
34
  "apollo-link": "1.2.14",
@@ -36,35 +36,34 @@
36
36
  "bytes": "3.1.2",
37
37
  "cropperjs": "1.6.2",
38
38
  "dataurl-to-blob": "0.0.1",
39
- "dayjs": "1.11.19",
39
+ "dayjs": "1.11.20",
40
40
  "dot-prop-immutable": "2.1.1",
41
- "graphql": "16.13.1",
41
+ "graphql": "16.13.2",
42
42
  "graphql-tag": "2.12.6",
43
- "load-script": "1.0.0",
43
+ "load-script": "2.0.0",
44
44
  "lodash": "4.17.23",
45
- "mime": "3.0.0",
45
+ "mime": "4.1.0",
46
46
  "minimatch": "10.2.4",
47
47
  "mobx": "6.15.0",
48
- "mobx-react-lite": "3.4.3",
48
+ "mobx-react-lite": "4.1.1",
49
49
  "prop-types": "15.8.1",
50
50
  "react": "18.2.0",
51
51
  "react-butterfiles": "1.3.3",
52
52
  "react-custom-scrollbars": "4.2.1",
53
53
  "react-dom": "18.2.0",
54
- "react-hotkeyz": "1.0.4",
55
54
  "react-lazy-load": "4.0.1",
56
- "zod": "3.25.76"
55
+ "zod": "4.3.6"
57
56
  },
58
57
  "devDependencies": {
59
- "@svgr/webpack": "6.5.1",
60
- "@webiny/build-tools": "6.0.0",
58
+ "@svgr/webpack": "8.1.0",
59
+ "@webiny/build-tools": "6.1.0-beta.0",
61
60
  "rimraf": "6.1.3",
62
61
  "typescript": "5.9.3",
63
- "vitest": "4.0.18"
62
+ "vitest": "4.1.2"
64
63
  },
65
64
  "publishConfig": {
66
65
  "access": "public",
67
66
  "directory": "dist"
68
67
  },
69
- "gitHead": "9c6892640a45679ff521e25cd6587dff57393a2e"
68
+ "gitHead": "a3bd3695c66c79238e380d7360d9731b5fcf9c87"
70
69
  }