@webiny/app-file-manager 6.0.0 → 6.1.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) 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/modules/FileManagerRenderer/FileManagerView/FileManagerView.js +1 -2
  15. package/modules/FileManagerRenderer/FileManagerView/FileManagerView.js.map +1 -1
  16. package/modules/FileManagerRenderer/FileManagerView/configComponents/Browser/Grid/Thumbnail.d.ts +2 -2
  17. package/modules/FileManagerRenderer/FileManagerView/configComponents/Browser/Grid/Thumbnail.js.map +1 -1
  18. package/modules/FileManagerRenderer/FileManagerView/configComponents/Browser/Table/Thumbnail.d.ts +2 -2
  19. package/modules/FileManagerRenderer/FileManagerView/configComponents/Browser/Table/Thumbnail.js.map +1 -1
  20. package/modules/FileManagerRenderer/FileManagerView/configComponents/FileDetails/Thumbnail.d.ts +2 -2
  21. package/modules/FileManagerRenderer/FileManagerView/configComponents/FileDetails/Thumbnail.js.map +1 -1
  22. package/package.json +25 -29
  23. package/components/ImageEditor/ImageEditor.d.ts +0 -45
  24. package/components/ImageEditor/ImageEditor.js +0 -218
  25. package/components/ImageEditor/ImageEditor.js.map +0 -1
  26. package/components/ImageEditor/ImageEditorDialog.d.ts +0 -16
  27. package/components/ImageEditor/ImageEditorDialog.js +0 -53
  28. package/components/ImageEditor/ImageEditorDialog.js.map +0 -1
  29. package/components/ImageEditor/index.d.ts +0 -1
  30. package/components/ImageEditor/index.js +0 -3
  31. package/components/ImageEditor/index.js.map +0 -1
  32. package/components/ImageEditor/toolbar/crop.d.ts +0 -4
  33. package/components/ImageEditor/toolbar/crop.js +0 -67
  34. package/components/ImageEditor/toolbar/crop.js.map +0 -1
  35. package/components/ImageEditor/toolbar/filter.d.ts +0 -3
  36. package/components/ImageEditor/toolbar/filter.js +0 -167
  37. package/components/ImageEditor/toolbar/filter.js.map +0 -1
  38. package/components/ImageEditor/toolbar/flip.d.ts +0 -4
  39. package/components/ImageEditor/toolbar/flip.js +0 -94
  40. package/components/ImageEditor/toolbar/flip.js.map +0 -1
  41. package/components/ImageEditor/toolbar/index.d.ts +0 -4
  42. package/components/ImageEditor/toolbar/index.js +0 -6
  43. package/components/ImageEditor/toolbar/index.js.map +0 -1
  44. package/components/ImageEditor/toolbar/rotate.d.ts +0 -4
  45. package/components/ImageEditor/toolbar/rotate.js +0 -93
  46. package/components/ImageEditor/toolbar/rotate.js.map +0 -1
  47. package/components/ImageEditor/toolbar/types.d.ts +0 -32
  48. package/components/ImageEditor/toolbar/types.js +0 -3
  49. package/components/ImageEditor/toolbar/types.js.map +0 -1
  50. package/modules/FileManagerRenderer/FileActions/FileDetails/EditImage.d.ts +0 -2
  51. package/modules/FileManagerRenderer/FileActions/FileDetails/EditImage.js +0 -111
  52. package/modules/FileManagerRenderer/FileActions/FileDetails/EditImage.js.map +0 -1
@@ -1,167 +0,0 @@
1
- /**
2
- * When using Caman, we added @ts-expect-error because it does not exist in packages, but it is loaded in packages/ui/src/ImageEditor/ImageEditor.tsx:38.
3
- * TODO: use some other library to edit images
4
- */
5
- import React from "react";
6
- import { ReactComponent as FilterIcon } from "@webiny/icons/tune.svg";
7
- import debounce from "lodash/debounce.js";
8
- import { Button, Grid, IconButton, Slider, Tooltip } from "@webiny/admin-ui";
9
- const sliders = [{
10
- key: "brightness",
11
- label: "Brightness",
12
- min: -100
13
- }, {
14
- key: "vibrance",
15
- label: "Vibrance",
16
- min: -100
17
- }, {
18
- key: "hue",
19
- label: "Hue",
20
- min: -100
21
- }, {
22
- key: "gamma",
23
- label: "Gamma"
24
- }, {
25
- key: "clip",
26
- label: "Clip"
27
- }, {
28
- key: "stackBlur",
29
- label: "Blur"
30
- }, {
31
- key: "contrast",
32
- label: "Contrast",
33
- min: -100
34
- }, {
35
- key: "saturation",
36
- label: "Saturation",
37
- min: -100
38
- }, {
39
- key: "exposure",
40
- label: "Exposure",
41
- min: -100
42
- }, {
43
- key: "sepia",
44
- label: "Sepia"
45
- }, {
46
- key: "noise",
47
- label: "Noise"
48
- }, {
49
- key: "sharpen",
50
- label: "Sharpen"
51
- }];
52
- class RenderForm extends React.Component {
53
- state = {
54
- processing: false,
55
- values: {}
56
- };
57
- componentDidMount() {
58
- this.resetFiltersValues();
59
- }
60
- applyFilters = debounce(() => {
61
- const {
62
- canvas
63
- } = this.props;
64
- const {
65
- values
66
- } = this.state;
67
- // eslint-disable-next-line @typescript-eslint/no-this-alias
68
- const component = this;
69
-
70
- // @ts-expect-error
71
- Caman(canvas.current, function () {
72
- // @ts-expect-error
73
- this.revert(false);
74
- Object.keys(values).forEach(
75
- // @ts-expect-error
76
- key => values[key] !== 0 && this[key] && this[key](values[key]));
77
- // @ts-expect-error
78
- this.render();
79
- component.setState({
80
- processing: false
81
- });
82
- });
83
- }, 200);
84
- resetFiltersValues = () => {
85
- this.setState(state => {
86
- sliders.reduce((output, current) => {
87
- state.values[current.key] = 0;
88
- return output;
89
- }, {});
90
- return state;
91
- });
92
- };
93
- render() {
94
- return /*#__PURE__*/React.createElement(Grid, null, /*#__PURE__*/React.createElement(React.Fragment, null, sliders.map(props => /*#__PURE__*/React.createElement(Grid.Column, {
95
- span: 4,
96
- key: props.key
97
- }, /*#__PURE__*/React.createElement(Slider, Object.assign({
98
- value: Number(this.state.values[props.key]),
99
- min: 0,
100
- max: 100,
101
- disabled: this.state.processing,
102
- onValueChange: value => {
103
- this.setState(state => {
104
- const values = {
105
- ...state.values
106
- };
107
- values[props.key] = value;
108
- return {
109
- ...state,
110
- processing: true,
111
- values
112
- };
113
- }, this.applyFilters);
114
- }
115
- }, props))))), /*#__PURE__*/React.createElement(Grid.Column, {
116
- span: 12,
117
- className: "text-center"
118
- }, /*#__PURE__*/React.createElement(Button, {
119
- text: "Reset filters",
120
- variant: "secondary",
121
- onClick: () => {
122
- this.setState({
123
- processing: true
124
- }, () => {
125
- this.resetFiltersValues();
126
- this.applyFilters();
127
- this.setState({
128
- processing: false
129
- });
130
- });
131
- }
132
- })));
133
- }
134
- }
135
- const tool = {
136
- name: "filter",
137
- icon({
138
- activateTool
139
- }) {
140
- return /*#__PURE__*/React.createElement(Tooltip, {
141
- trigger: /*#__PURE__*/React.createElement(IconButton, {
142
- variant: "ghost",
143
- icon: /*#__PURE__*/React.createElement(FilterIcon, null),
144
- onClick: () => activateTool("filter"),
145
- "data-testid": "filter-item"
146
- }),
147
- content: "Filter"
148
- });
149
- },
150
- renderForm(props) {
151
- return /*#__PURE__*/React.createElement(RenderForm, props);
152
- },
153
- cancel: ({
154
- canvas
155
- }) => {
156
- // @ts-expect-error
157
- Caman(canvas.current, function () {
158
- // @ts-expect-error
159
- this.revert(false);
160
- // @ts-expect-error
161
- this.render();
162
- });
163
- }
164
- };
165
- export default tool;
166
-
167
- //# sourceMappingURL=filter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["React","ReactComponent","FilterIcon","debounce","Button","Grid","IconButton","Slider","Tooltip","sliders","key","label","min","RenderForm","Component","state","processing","values","componentDidMount","resetFiltersValues","applyFilters","canvas","props","component","Caman","current","revert","Object","keys","forEach","render","setState","reduce","output","createElement","Fragment","map","Column","span","assign","value","Number","max","disabled","onValueChange","className","text","variant","onClick","tool","name","icon","activateTool","trigger","content","renderForm","cancel"],"sources":["filter.tsx"],"sourcesContent":["/**\n * When using Caman, we added @ts-expect-error because it does not exist in packages, but it is loaded in packages/ui/src/ImageEditor/ImageEditor.tsx:38.\n * TODO: use some other library to edit images\n */\nimport React from \"react\";\nimport { ReactComponent as FilterIcon } from \"@webiny/icons/tune.svg\";\nimport debounce from \"lodash/debounce.js\";\nimport { Button, Grid, IconButton, Slider, Tooltip } from \"@webiny/admin-ui\";\nimport type { ImageEditorTool } from \"./types.js\";\n\ninterface RenderFormState {\n values: Record<string, any>;\n processing: boolean;\n}\n\ninterface RenderFormProps {\n canvas: any;\n renderApplyCancel?: () => void;\n}\n\nconst sliders = [\n {\n key: \"brightness\",\n label: \"Brightness\",\n min: -100\n },\n {\n key: \"vibrance\",\n label: \"Vibrance\",\n min: -100\n },\n {\n key: \"hue\",\n label: \"Hue\",\n min: -100\n },\n {\n key: \"gamma\",\n label: \"Gamma\"\n },\n {\n key: \"clip\",\n label: \"Clip\"\n },\n {\n key: \"stackBlur\",\n label: \"Blur\"\n },\n {\n key: \"contrast\",\n label: \"Contrast\",\n min: -100\n },\n {\n key: \"saturation\",\n label: \"Saturation\",\n min: -100\n },\n {\n key: \"exposure\",\n label: \"Exposure\",\n min: -100\n },\n {\n key: \"sepia\",\n label: \"Sepia\"\n },\n {\n key: \"noise\",\n label: \"Noise\"\n },\n {\n key: \"sharpen\",\n label: \"Sharpen\"\n }\n];\n\nclass RenderForm extends React.Component<RenderFormProps, RenderFormState> {\n public override state: RenderFormState = {\n processing: false,\n values: {}\n };\n\n public override componentDidMount() {\n this.resetFiltersValues();\n }\n\n private readonly applyFilters = debounce(() => {\n const { canvas } = this.props;\n const { values } = this.state;\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const component = this;\n\n // @ts-expect-error\n Caman(canvas.current, function () {\n // @ts-expect-error\n this.revert(false);\n Object.keys(values).forEach(\n // @ts-expect-error\n key => values[key] !== 0 && this[key] && this[key](values[key])\n );\n // @ts-expect-error\n this.render();\n component.setState({ processing: false });\n });\n }, 200);\n\n private readonly resetFiltersValues = () => {\n this.setState(state => {\n sliders.reduce((output, current) => {\n state.values[current.key] = 0;\n return output;\n }, {});\n\n return state;\n });\n };\n\n public override render() {\n return (\n <Grid>\n <>\n {sliders.map(props => (\n <Grid.Column span={4} key={props.key}>\n <Slider\n value={Number(this.state.values[props.key])}\n min={0}\n max={100}\n disabled={this.state.processing}\n onValueChange={(value: number) => {\n this.setState(state => {\n const values = { ...state.values };\n values[props.key] = value;\n\n return { ...state, processing: true, values };\n }, this.applyFilters);\n }}\n {...props}\n />\n </Grid.Column>\n ))}\n </>\n <Grid.Column span={12} className={\"text-center\"}>\n <Button\n text={\"Reset filters\"}\n variant={\"secondary\"}\n onClick={() => {\n this.setState({ processing: true }, () => {\n this.resetFiltersValues();\n this.applyFilters();\n this.setState({ processing: false });\n });\n }}\n />\n </Grid.Column>\n </Grid>\n );\n }\n}\n\nconst tool: ImageEditorTool = {\n name: \"filter\",\n icon({ activateTool }) {\n return (\n <Tooltip\n trigger={\n <IconButton\n variant={\"ghost\"}\n icon={<FilterIcon />}\n onClick={() => activateTool(\"filter\")}\n data-testid={\"filter-item\"}\n />\n }\n content={\"Filter\"}\n />\n );\n },\n renderForm(props) {\n return <RenderForm {...props} />;\n },\n cancel: ({ canvas }) => {\n // @ts-expect-error\n Caman(canvas.current, function () {\n // @ts-expect-error\n this.revert(false);\n // @ts-expect-error\n this.render();\n });\n }\n};\n\nexport default tool;\n"],"mappings":"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","ignoreList":[]}
@@ -1,4 +0,0 @@
1
- import "cropperjs/dist/cropper.css";
2
- import type { ImageEditorTool } from "./types.js";
3
- declare const tool: ImageEditorTool;
4
- export default tool;
@@ -1,94 +0,0 @@
1
- import React from "react";
2
- import { Button, IconButton, Tooltip } from "@webiny/admin-ui";
3
- import { ReactComponent as FlipIcon } from "@webiny/icons/flip.svg";
4
- import Cropper from "cropperjs";
5
- import "cropperjs/dist/cropper.css";
6
- let cropper;
7
- const flipped = {
8
- x: 1,
9
- y: 1
10
- };
11
- const renderForm = () => {
12
- return /*#__PURE__*/React.createElement("div", {
13
- className: "flex justify-center gap-sm"
14
- }, /*#__PURE__*/React.createElement(Button, {
15
- text: "FlipX",
16
- variant: "secondary",
17
- onClick: () => {
18
- if (!cropper) {
19
- return;
20
- }
21
- flipped.x = flipped.x === 1 ? -1 : 1;
22
- cropper.scaleX(flipped.x);
23
- }
24
- }), /*#__PURE__*/React.createElement(Button, {
25
- text: "FlipY",
26
- variant: "secondary",
27
- onClick: () => {
28
- if (!cropper) {
29
- return;
30
- }
31
- flipped.y = flipped.y === 1 ? -1 : 1;
32
- cropper.scaleY(flipped.y);
33
- }
34
- }));
35
- };
36
- const tool = {
37
- name: "flip",
38
- icon({
39
- activateTool
40
- }) {
41
- return /*#__PURE__*/React.createElement(Tooltip, {
42
- side: "bottom",
43
- content: "Flip",
44
- trigger: /*#__PURE__*/React.createElement(IconButton, {
45
- variant: "ghost",
46
- icon: /*#__PURE__*/React.createElement(FlipIcon, null),
47
- onClick: () => activateTool("flip"),
48
- "data-testid": "flip-item"
49
- })
50
- });
51
- },
52
- renderForm,
53
- cancel: () => cropper && cropper.destroy(),
54
- onActivate: ({
55
- canvas
56
- }) => {
57
- cropper = new Cropper(canvas.current, {
58
- background: false,
59
- modal: false,
60
- guides: false,
61
- dragMode: "none",
62
- highlight: false,
63
- autoCrop: false
64
- });
65
- },
66
- apply: ({
67
- canvas
68
- }) => {
69
- return new Promise(resolve => {
70
- if (!cropper) {
71
- resolve();
72
- return;
73
- }
74
- const current = canvas.current;
75
- const src = cropper.getCroppedCanvas().toDataURL();
76
- if (current) {
77
- const image = new window.Image();
78
- const ctx = current.getContext("2d");
79
- image.onload = () => {
80
- ctx.drawImage(image, 0, 0);
81
- current.width = image.width;
82
- current.height = image.height;
83
- ctx.drawImage(image, 0, 0);
84
- resolve();
85
- };
86
- image.src = src;
87
- }
88
- cropper.destroy();
89
- });
90
- }
91
- };
92
- export default tool;
93
-
94
- //# sourceMappingURL=flip.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["React","Button","IconButton","Tooltip","ReactComponent","FlipIcon","Cropper","cropper","flipped","x","y","renderForm","createElement","className","text","variant","onClick","scaleX","scaleY","tool","name","icon","activateTool","side","content","trigger","cancel","destroy","onActivate","canvas","current","background","modal","guides","dragMode","highlight","autoCrop","apply","Promise","resolve","src","getCroppedCanvas","toDataURL","image","window","Image","ctx","getContext","onload","drawImage","width","height"],"sources":["flip.tsx"],"sourcesContent":["import React from \"react\";\nimport { Button, IconButton, Tooltip } from \"@webiny/admin-ui\";\nimport { ReactComponent as FlipIcon } from \"@webiny/icons/flip.svg\";\nimport Cropper from \"cropperjs\";\nimport \"cropperjs/dist/cropper.css\";\nimport type { ImageEditorTool } from \"./types.js\";\n\nlet cropper: Cropper;\n\nconst flipped = { x: 1, y: 1 };\n\nconst renderForm = () => {\n return (\n <div className={\"flex justify-center gap-sm\"}>\n <Button\n text={\"FlipX\"}\n variant={\"secondary\"}\n onClick={() => {\n if (!cropper) {\n return;\n }\n\n flipped.x = flipped.x === 1 ? -1 : 1;\n cropper.scaleX(flipped.x);\n }}\n />\n <Button\n text={\"FlipY\"}\n variant={\"secondary\"}\n onClick={() => {\n if (!cropper) {\n return;\n }\n\n flipped.y = flipped.y === 1 ? -1 : 1;\n cropper.scaleY(flipped.y);\n }}\n />\n </div>\n );\n};\n\nconst tool: ImageEditorTool = {\n name: \"flip\",\n icon({ activateTool }) {\n return (\n <Tooltip\n side={\"bottom\"}\n content={\"Flip\"}\n trigger={\n <IconButton\n variant={\"ghost\"}\n icon={<FlipIcon />}\n onClick={() => activateTool(\"flip\")}\n data-testid={\"flip-item\"}\n />\n }\n />\n );\n },\n renderForm,\n cancel: () => cropper && cropper.destroy(),\n onActivate: ({ canvas }) => {\n cropper = new Cropper(canvas.current as HTMLCanvasElement, {\n background: false,\n modal: false,\n guides: false,\n dragMode: \"none\",\n highlight: false,\n autoCrop: false\n });\n },\n apply: ({ canvas }) => {\n return new Promise((resolve: any) => {\n if (!cropper) {\n resolve();\n return;\n }\n\n const current = canvas.current;\n const src = cropper.getCroppedCanvas().toDataURL();\n if (current) {\n const image = new window.Image();\n const ctx = current.getContext(\"2d\") as CanvasRenderingContext2D;\n image.onload = () => {\n ctx.drawImage(image, 0, 0);\n current.width = image.width;\n current.height = image.height;\n\n ctx.drawImage(image, 0, 0);\n resolve();\n };\n image.src = src;\n }\n\n cropper.destroy();\n });\n }\n};\n\nexport default tool;\n"],"mappings":"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","ignoreList":[]}
@@ -1,4 +0,0 @@
1
- export { default as crop } from "./crop.js";
2
- export { default as flip } from "./flip.js";
3
- export { default as filter } from "./filter.js";
4
- export { default as rotate } from "./rotate.js";
@@ -1,6 +0,0 @@
1
- export { default as crop } from "./crop.js";
2
- export { default as flip } from "./flip.js";
3
- export { default as filter } from "./filter.js";
4
- export { default as rotate } from "./rotate.js";
5
-
6
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["default","crop","flip","filter","rotate"],"sources":["index.ts"],"sourcesContent":["export { default as crop } from \"./crop.js\";\nexport { default as flip } from \"./flip.js\";\nexport { default as filter } from \"./filter.js\";\nexport { default as rotate } from \"./rotate.js\";\n"],"mappings":"AAAA,SAASA,OAAO,IAAIC,IAAI;AACxB,SAASD,OAAO,IAAIE,IAAI;AACxB,SAASF,OAAO,IAAIG,MAAM;AAC1B,SAASH,OAAO,IAAII,MAAM","ignoreList":[]}
@@ -1,4 +0,0 @@
1
- import type { ImageEditorTool } from "./types.js";
2
- import "cropperjs/dist/cropper.css";
3
- declare const tool: ImageEditorTool;
4
- export default tool;
@@ -1,93 +0,0 @@
1
- import React from "react";
2
- import { IconButton, Slider, Tooltip } from "@webiny/admin-ui";
3
- import { ReactComponent as RotateRight } from "@webiny/icons/rotate_right.svg";
4
- import Cropper from "cropperjs";
5
- import "cropperjs/dist/cropper.css";
6
- let cropper;
7
- class RenderForm extends React.Component {
8
- state = {
9
- rangeInput: 0
10
- };
11
- render() {
12
- return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(Slider, {
13
- label: "Range Input",
14
- value: Number(this.state.rangeInput),
15
- min: 0,
16
- max: 360,
17
- step: 10,
18
- onValueChange: value => {
19
- this.setState({
20
- rangeInput: value
21
- }, async () => {
22
- if (cropper) {
23
- cropper.rotateTo(parseInt(String(value), 10));
24
- }
25
- });
26
- }
27
- }));
28
- }
29
- }
30
- const tool = {
31
- name: "rotate",
32
- icon({
33
- activateTool
34
- }) {
35
- return /*#__PURE__*/React.createElement(Tooltip, {
36
- side: "bottom",
37
- content: "Rotate",
38
- trigger: /*#__PURE__*/React.createElement(IconButton, {
39
- variant: "ghost",
40
- icon: /*#__PURE__*/React.createElement(RotateRight, null),
41
- onClick: () => activateTool("rotate"),
42
- "data-testid": "rotate-item"
43
- })
44
- });
45
- },
46
- renderForm(props) {
47
- return /*#__PURE__*/React.createElement(RenderForm, props);
48
- },
49
- onActivate: ({
50
- canvas
51
- }) => {
52
- /**
53
- * We can safely cast canvas.current as HTMLCanvasElement
54
- */
55
- cropper = new Cropper(canvas.current, {
56
- background: false,
57
- modal: false,
58
- guides: false,
59
- dragMode: "none",
60
- highlight: false,
61
- autoCrop: false
62
- });
63
- },
64
- cancel: () => cropper && cropper.destroy(),
65
- apply: ({
66
- canvas
67
- }) => {
68
- return new Promise(resolve => {
69
- if (!cropper) {
70
- resolve();
71
- return;
72
- }
73
- const current = canvas.current;
74
- const src = cropper.getCroppedCanvas().toDataURL();
75
- if (current) {
76
- const image = new window.Image();
77
- const ctx = current.getContext("2d");
78
- image.onload = () => {
79
- ctx.drawImage(image, 0, 0);
80
- current.width = image.width;
81
- current.height = image.height;
82
- ctx.drawImage(image, 0, 0);
83
- };
84
- image.src = src;
85
- resolve();
86
- }
87
- cropper.destroy();
88
- });
89
- }
90
- };
91
- export default tool;
92
-
93
- //# sourceMappingURL=rotate.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":["React","IconButton","Slider","Tooltip","ReactComponent","RotateRight","Cropper","cropper","RenderForm","Component","state","rangeInput","render","createElement","label","value","Number","min","max","step","onValueChange","setState","rotateTo","parseInt","String","tool","name","icon","activateTool","side","content","trigger","variant","onClick","renderForm","props","onActivate","canvas","current","background","modal","guides","dragMode","highlight","autoCrop","cancel","destroy","apply","Promise","resolve","src","getCroppedCanvas","toDataURL","image","window","Image","ctx","getContext","onload","drawImage","width","height"],"sources":["rotate.tsx"],"sourcesContent":["import React from \"react\";\nimport { IconButton, Slider, Tooltip } from \"@webiny/admin-ui\";\nimport { ReactComponent as RotateRight } from \"@webiny/icons/rotate_right.svg\";\nimport type { ImageEditorTool } from \"./types.js\";\n\nimport Cropper from \"cropperjs\";\nimport \"cropperjs/dist/cropper.css\";\n\nlet cropper: Cropper;\n\nclass RenderForm extends React.Component<any, any> {\n public override state = {\n rangeInput: 0\n };\n\n public override render() {\n return (\n <div>\n <Slider\n label={\"Range Input\"}\n value={Number(this.state.rangeInput)}\n min={0}\n max={360}\n step={10}\n onValueChange={(value: number) => {\n this.setState({ rangeInput: value }, async () => {\n if (cropper) {\n cropper.rotateTo(parseInt(String(value), 10));\n }\n });\n }}\n />\n </div>\n );\n }\n}\n\nconst tool: ImageEditorTool = {\n name: \"rotate\",\n icon({ activateTool }) {\n return (\n <Tooltip\n side={\"bottom\"}\n content={\"Rotate\"}\n trigger={\n <IconButton\n variant={\"ghost\"}\n icon={<RotateRight />}\n onClick={() => activateTool(\"rotate\")}\n data-testid={\"rotate-item\"}\n />\n }\n />\n );\n },\n renderForm(props) {\n return <RenderForm {...props} />;\n },\n onActivate: ({ canvas }) => {\n /**\n * We can safely cast canvas.current as HTMLCanvasElement\n */\n cropper = new Cropper(canvas.current as HTMLCanvasElement, {\n background: false,\n modal: false,\n guides: false,\n dragMode: \"none\",\n highlight: false,\n autoCrop: false\n });\n },\n cancel: () => cropper && cropper.destroy(),\n apply: ({ canvas }) => {\n return new Promise((resolve: any) => {\n if (!cropper) {\n resolve();\n return;\n }\n\n const current = canvas.current;\n const src = cropper.getCroppedCanvas().toDataURL();\n if (current) {\n const image = new window.Image();\n const ctx = current.getContext(\"2d\") as CanvasRenderingContext2D;\n image.onload = () => {\n ctx.drawImage(image, 0, 0);\n current.width = image.width;\n current.height = image.height;\n\n ctx.drawImage(image, 0, 0);\n };\n image.src = src;\n resolve();\n }\n\n cropper.destroy();\n });\n }\n};\n\nexport default tool;\n"],"mappings":"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","ignoreList":[]}
@@ -1,32 +0,0 @@
1
- import type React from "react";
2
- export type ToolbarTool = "crop" | "flip" | "rotate" | "filter";
3
- interface RenderFormParams {
4
- canvas: React.RefObject<HTMLCanvasElement | null>;
5
- image: HTMLImageElement;
6
- renderApplyCancel?: () => void;
7
- options?: {
8
- [key: string]: any;
9
- };
10
- }
11
- interface OnActivateParams {
12
- options: any;
13
- canvas: React.RefObject<HTMLCanvasElement | null>;
14
- }
15
- interface IconParams {
16
- activateTool: (tool: ToolbarTool) => void;
17
- }
18
- interface ApplyParams {
19
- canvas: React.RefObject<HTMLCanvasElement | null>;
20
- }
21
- interface CancelParams {
22
- canvas: React.RefObject<HTMLCanvasElement | null>;
23
- }
24
- export interface ImageEditorTool {
25
- name: string;
26
- apply?: (params: ApplyParams) => void;
27
- cancel?: (params: CancelParams) => void;
28
- onActivate?: (params: OnActivateParams) => void;
29
- icon: (params: IconParams) => React.ReactElement<any>;
30
- renderForm?: (params: RenderFormParams) => React.ReactNode;
31
- }
32
- export {};
@@ -1,3 +0,0 @@
1
- export {};
2
-
3
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"names":[],"sources":["types.ts"],"sourcesContent":["import type React from \"react\";\n\nexport type ToolbarTool = \"crop\" | \"flip\" | \"rotate\" | \"filter\";\n\ninterface RenderFormParams {\n canvas: React.RefObject<HTMLCanvasElement | null>;\n image: HTMLImageElement;\n renderApplyCancel?: () => void;\n options?: { [key: string]: any };\n}\n\ninterface OnActivateParams {\n options: any;\n canvas: React.RefObject<HTMLCanvasElement | null>;\n}\n\ninterface IconParams {\n activateTool: (tool: ToolbarTool) => void;\n}\n\ninterface ApplyParams {\n canvas: React.RefObject<HTMLCanvasElement | null>;\n}\n\ninterface CancelParams {\n canvas: React.RefObject<HTMLCanvasElement | null>;\n}\n\nexport interface ImageEditorTool {\n name: string;\n apply?: (params: ApplyParams) => void;\n cancel?: (params: CancelParams) => void;\n onActivate?: (params: OnActivateParams) => void;\n icon: (params: IconParams) => React.ReactElement<any>;\n renderForm?: (params: RenderFormParams) => React.ReactNode;\n}\n"],"mappings":"","ignoreList":[]}
@@ -1,2 +0,0 @@
1
- import React from "react";
2
- export declare const EditImage: () => React.JSX.Element | null;
@@ -1,111 +0,0 @@
1
- import React from "react";
2
- // @ts-expect-error
3
- import { Hotkeys } from "react-hotkeyz";
4
- // @ts-expect-error
5
- import dataURLtoBlob from "dataurl-to-blob";
6
- import { ImageEditorDialog } from "../../../../components/ImageEditor/ImageEditorDialog.js";
7
- import { ReactComponent as EditIcon } from "@webiny/icons/edit.svg";
8
- import { FileManagerViewConfig, useFile, useFileDetails, useFileManagerApi, useFileManagerView } from "../../../../index.js";
9
- import { useSnackbar } from "@webiny/app-admin";
10
- function toDataUrl(url) {
11
- return new Promise(resolve => {
12
- const xhr = new window.XMLHttpRequest();
13
- xhr.onload = function () {
14
- const reader = new window.FileReader();
15
- reader.onloadend = function () {
16
- resolve(reader.result);
17
- };
18
- reader.readAsDataURL(xhr.response);
19
- };
20
- xhr.open("GET", url);
21
- xhr.responseType = "blob";
22
- xhr.send();
23
- });
24
- }
25
- const initialState = {
26
- showImageEditor: false,
27
- dataUrl: null
28
- };
29
- const reducer = (state, action) => {
30
- const next = {
31
- ...state
32
- };
33
- switch (action.type) {
34
- case "setDataUrl":
35
- next.dataUrl = action.dataUrl;
36
- next.showImageEditor = true;
37
- break;
38
- case "hideImageEditor":
39
- next.dataUrl = null;
40
- next.showImageEditor = false;
41
- break;
42
- }
43
- return next;
44
- };
45
- const {
46
- FileDetails
47
- } = FileManagerViewConfig;
48
- export const EditImage = () => {
49
- const {
50
- file
51
- } = useFile();
52
- const {
53
- canEdit
54
- } = useFileManagerApi();
55
- const fileDetails = useFileDetails();
56
- const {
57
- uploadFile
58
- } = useFileManagerView();
59
- const [state, dispatch] = React.useReducer(reducer, initialState);
60
- const {
61
- showSnackbar
62
- } = useSnackbar();
63
- if (!file.type.startsWith("image/")) {
64
- return null;
65
- }
66
-
67
- // Render nothing if the user doesn't have the required permissions for "edit".
68
- if (!canEdit(file)) {
69
- return null;
70
- }
71
- return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(FileDetails.Action.Button, {
72
- className: "order-last ml-auto",
73
- label: "Edit image",
74
- "data-testid": "fm-edit-image-button",
75
- icon: /*#__PURE__*/React.createElement(EditIcon, null),
76
- onAction: async () => {
77
- const dataUrl = await toDataUrl(file.src);
78
- dispatch({
79
- type: "setDataUrl",
80
- dataUrl
81
- });
82
- }
83
- }), /*#__PURE__*/React.createElement(Hotkeys, {
84
- zIndex: 100,
85
- disabled: !state.dataUrl
86
- }, /*#__PURE__*/React.createElement(ImageEditorDialog, {
87
- "data-testid": "fm-image-editor-dialog",
88
- dialogZIndex: 100,
89
- open: state.showImageEditor,
90
- src: state.dataUrl,
91
- onClose: () => dispatch({
92
- type: "hideImageEditor"
93
- }),
94
- onAccept: async src => {
95
- const blob = dataURLtoBlob(src);
96
- blob.name = file.name;
97
- blob.key = file.key.split("/").pop();
98
- const newFile = await uploadFile(blob);
99
- if (newFile) {
100
- showSnackbar("A new version of the image has been created!");
101
- dispatch({
102
- type: "hideImageEditor"
103
- });
104
- fileDetails.setFile(newFile);
105
- fileDetails.close();
106
- }
107
- }
108
- })));
109
- };
110
-
111
- //# sourceMappingURL=EditImage.js.map
@@ -1 +0,0 @@
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":[]}