@webiny/ui 5.23.1 → 5.25.0-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Accordion/Accordion.d.ts +4 -4
- package/Accordion/Accordion.js +1 -1
- package/Accordion/Accordion.js.map +1 -0
- package/Accordion/Accordion.stories.js.map +1 -0
- package/Accordion/AccordionItem.d.ts +4 -8
- package/Accordion/AccordionItem.js +5 -1
- package/Accordion/AccordionItem.js.map +1 -0
- package/Accordion/index.js.map +1 -0
- package/Alert/Alert.d.ts +4 -4
- package/Alert/Alert.js +1 -1
- package/Alert/Alert.js.map +1 -0
- package/Alert/Alert.stories.js.map +1 -0
- package/Alert/index.js.map +1 -0
- package/AutoComplete/AutoComplete.d.ts +11 -27
- package/AutoComplete/AutoComplete.js +9 -8
- package/AutoComplete/AutoComplete.js.map +1 -0
- package/AutoComplete/AutoComplete.stories.js.map +1 -0
- package/AutoComplete/MultiAutoComplete.d.ts +20 -43
- package/AutoComplete/MultiAutoComplete.js +13 -13
- package/AutoComplete/MultiAutoComplete.js.map +1 -0
- package/AutoComplete/MultiAutoComplete.stories.js.map +1 -0
- package/AutoComplete/index.js.map +1 -0
- package/AutoComplete/styles.js.map +1 -0
- package/AutoComplete/types.d.ts +4 -3
- package/AutoComplete/types.js.map +1 -0
- package/AutoComplete/utils.d.ts +11 -5
- package/AutoComplete/utils.js +2 -2
- package/AutoComplete/utils.js.map +1 -0
- package/Avatar/Avatar.d.ts +5 -11
- package/Avatar/Avatar.js +12 -7
- package/Avatar/Avatar.js.map +1 -0
- package/Avatar/Avatar.stories.js.map +1 -0
- package/Avatar/index.js.map +1 -0
- package/Button/Button.d.ts +8 -23
- package/Button/Button.js +7 -22
- package/Button/Button.js.map +1 -0
- package/Button/Button.stories.js.map +1 -0
- package/Button/CopyButton/CopyButton.d.ts +4 -7
- package/Button/CopyButton/CopyButton.js +1 -4
- package/Button/CopyButton/CopyButton.js.map +1 -0
- package/Button/CopyButton/CopyButton.stories.js.map +1 -0
- package/Button/IconButton/IconButton.d.ts +4 -7
- package/Button/IconButton/IconButton.js +1 -4
- package/Button/IconButton/IconButton.js.map +1 -0
- package/Button/IconButton/IconButton.stories.js.map +1 -0
- package/Button/index.js.map +1 -0
- package/Carousel/Carousel.d.ts +3 -3
- package/Carousel/Carousel.js +1 -1
- package/Carousel/Carousel.js.map +1 -0
- package/Carousel/Carouser.stories.js.map +1 -0
- package/Carousel/index.js.map +1 -0
- package/Checkbox/Checkbox.d.ts +4 -9
- package/Checkbox/Checkbox.js +8 -9
- package/Checkbox/Checkbox.js.map +1 -0
- package/Checkbox/Checkbox.stories.js.map +1 -0
- package/Checkbox/Checkbox.styles.js.map +1 -0
- package/Checkbox/CheckboxGroup.d.ts +1 -1
- package/Checkbox/CheckboxGroup.js +1 -1
- package/Checkbox/CheckboxGroup.js.map +1 -0
- package/Checkbox/CheckboxGroup.stories.js +1 -1
- package/Checkbox/CheckboxGroup.stories.js.map +1 -0
- package/Checkbox/index.js.map +1 -0
- package/Chips/Chip.d.ts +3 -8
- package/Chips/Chip.js +1 -1
- package/Chips/Chip.js.map +1 -0
- package/Chips/ChipIcon.d.ts +2 -2
- package/Chips/ChipIcon.js +1 -1
- package/Chips/ChipIcon.js.map +1 -0
- package/Chips/Chips.d.ts +4 -4
- package/Chips/Chips.js +1 -1
- package/Chips/Chips.js.map +1 -0
- package/Chips/Chips.stories.js.map +1 -0
- package/Chips/index.js.map +1 -0
- package/Chips/styles.js.map +1 -0
- package/CodeEditor/CodeEditor.d.ts +3 -8
- package/CodeEditor/CodeEditor.js +7 -9
- package/CodeEditor/CodeEditor.js.map +1 -0
- package/CodeEditor/CodeEditor.stories.js.map +1 -0
- package/CodeEditor/index.js.map +1 -0
- package/ColorPicker/ColorPicker.d.ts +9 -10
- package/ColorPicker/ColorPicker.js +8 -10
- package/ColorPicker/ColorPicker.js.map +1 -0
- package/ColorPicker/ColorPicker.stories.js +1 -1
- package/ColorPicker/ColorPicker.stories.js.map +1 -0
- package/ColorPicker/index.js.map +1 -0
- package/ConfirmationDialog/ConfirmationDialog.d.ts +13 -13
- package/ConfirmationDialog/ConfirmationDialog.js +7 -4
- package/ConfirmationDialog/ConfirmationDialog.js.map +1 -0
- package/ConfirmationDialog/ConfirmationDialog.stories.js +1 -1
- package/ConfirmationDialog/ConfirmationDialog.stories.js.map +1 -0
- package/ConfirmationDialog/index.js.map +1 -0
- package/ConfirmationDialog/withConfirmation.d.ts +2 -2
- package/ConfirmationDialog/withConfirmation.js +1 -1
- package/ConfirmationDialog/withConfirmation.js.map +1 -0
- package/Dialog/Dialog.d.ts +21 -30
- package/Dialog/Dialog.js +4 -1
- package/Dialog/Dialog.js.map +1 -0
- package/Dialog/Dialog.stories.js.map +1 -0
- package/Dialog/index.js.map +1 -0
- package/Drawer/Drawer.d.ts +1 -1
- package/Drawer/Drawer.js +1 -1
- package/Drawer/Drawer.js.map +1 -0
- package/Drawer/Drawer.stories.js.map +1 -0
- package/Drawer/index.js.map +1 -0
- package/DynamicFieldset/Fieldset.d.ts +26 -16
- package/DynamicFieldset/Fieldset.js +24 -14
- package/DynamicFieldset/Fieldset.js.map +1 -0
- package/DynamicFieldset/index.js.map +1 -0
- package/Elevation/Elevation.d.ts +1 -1
- package/Elevation/Elevation.js +1 -1
- package/Elevation/Elevation.js.map +1 -0
- package/Elevation/Elevation.stories.js +1 -1
- package/Elevation/Elevation.stories.js.map +1 -0
- package/Elevation/index.js.map +1 -0
- package/FormElementMessage/FormElementMessage.d.ts +1 -1
- package/FormElementMessage/FormElementMessage.js +1 -1
- package/FormElementMessage/FormElementMessage.js.map +1 -0
- package/FormElementMessage/index.js.map +1 -0
- package/FullName/FullName.js.map +1 -0
- package/FullName/index.js.map +1 -0
- package/Grid/Grid.d.ts +1 -1
- package/Grid/Grid.js +1 -1
- package/Grid/Grid.js.map +1 -0
- package/Grid/Grid.stories.js.map +1 -0
- package/Grid/index.js.map +1 -0
- package/Helpers/ClassNames.d.ts +4 -3
- package/Helpers/ClassNames.js +5 -3
- package/Helpers/ClassNames.js.map +1 -0
- package/Helpers/index.js.map +1 -0
- package/Icon/Icon.d.ts +3 -6
- package/Icon/Icon.js +1 -4
- package/Icon/Icon.js.map +1 -0
- package/Icon/Icon.stories.js.map +1 -0
- package/Icon/index.js.map +1 -0
- package/Image/Image.d.ts +4 -4
- package/Image/Image.js +6 -4
- package/Image/Image.js.map +1 -0
- package/Image/Image.stories.js +1 -1
- package/Image/Image.stories.js.map +1 -0
- package/Image/index.js.map +1 -0
- package/ImageEditor/ImageEditor.d.ts +32 -34
- package/ImageEditor/ImageEditor.js +41 -26
- package/ImageEditor/ImageEditor.js.map +1 -0
- package/ImageEditor/index.js.map +1 -0
- package/ImageEditor/toolbar/crop.js +5 -3
- package/ImageEditor/toolbar/crop.js.map +1 -0
- package/ImageEditor/toolbar/filter.js +3 -1
- package/ImageEditor/toolbar/filter.js.map +1 -0
- package/ImageEditor/toolbar/flip.js +4 -2
- package/ImageEditor/toolbar/flip.js.map +1 -0
- package/ImageEditor/toolbar/icons/index.js.map +1 -0
- package/ImageEditor/toolbar/index.js.map +1 -0
- package/ImageEditor/toolbar/rotate.js +8 -2
- package/ImageEditor/toolbar/rotate.js.map +1 -0
- package/ImageEditor/toolbar/types.d.ts +22 -12
- package/ImageEditor/toolbar/types.js.map +1 -0
- package/ImageUpload/Image.d.ts +6 -6
- package/ImageUpload/Image.js +1 -1
- package/ImageUpload/Image.js.map +1 -0
- package/ImageUpload/ImageEditorDialog.d.ts +11 -6
- package/ImageUpload/ImageEditorDialog.js +7 -2
- package/ImageUpload/ImageEditorDialog.js.map +1 -0
- package/ImageUpload/MultiImageUpload.d.ts +10 -31
- package/ImageUpload/MultiImageUpload.js +33 -15
- package/ImageUpload/MultiImageUpload.js.map +1 -0
- package/ImageUpload/MultiImageUpload.stories.js.map +1 -0
- package/ImageUpload/SingleImageUpload.d.ts +16 -37
- package/ImageUpload/SingleImageUpload.js +20 -12
- package/ImageUpload/SingleImageUpload.js.map +1 -0
- package/ImageUpload/SingleImageUpload.stories.js.map +1 -0
- package/ImageUpload/index.js.map +1 -0
- package/ImageUpload/styled.d.ts +18 -14
- package/ImageUpload/styled.js.map +1 -0
- package/Input/Input.d.ts +2 -8
- package/Input/Input.js +8 -8
- package/Input/Input.js.map +1 -0
- package/Input/Input.stories.js +1 -1
- package/Input/Input.stories.js.map +1 -0
- package/Input/__tests__/Input.test.js +32 -26
- package/Input/__tests__/Input.test.js.map +1 -0
- package/Input/index.js.map +1 -0
- package/List/CollapsibleList/CollapsibleList.stories.js.map +1 -0
- package/List/CollapsibleList/index.d.ts +2 -2
- package/List/CollapsibleList/index.js +1 -1
- package/List/CollapsibleList/index.js.map +1 -0
- package/List/DataList/DataList.d.ts +23 -43
- package/List/DataList/DataList.js +43 -9
- package/List/DataList/DataList.js.map +1 -0
- package/List/DataList/DataList.stories.js.map +1 -0
- package/List/DataList/DataListModalOverlay/DataListModalOverlay.d.ts +7 -8
- package/List/DataList/DataListModalOverlay/DataListModalOverlay.js.map +1 -0
- package/List/DataList/DataListModalOverlay/DataListModalOverlayAction.d.ts +3 -3
- package/List/DataList/DataListModalOverlay/DataListModalOverlayAction.js.map +1 -0
- package/List/DataList/DataListModalOverlay/DataListModalOverlayContext.d.ts +9 -4
- package/List/DataList/DataListModalOverlay/DataListModalOverlayContext.js +6 -1
- package/List/DataList/DataListModalOverlay/DataListModalOverlayContext.js.map +1 -0
- package/List/DataList/DataListModalOverlay/index.js.map +1 -0
- package/List/DataList/Loader.d.ts +2 -2
- package/List/DataList/Loader.js +6 -1
- package/List/DataList/Loader.js.map +1 -0
- package/List/DataList/NoData.d.ts +2 -2
- package/List/DataList/NoData.js +1 -1
- package/List/DataList/NoData.js.map +1 -0
- package/List/DataList/icons/index.d.ts +1 -1
- package/List/DataList/icons/index.js +1 -1
- package/List/DataList/icons/index.js.map +1 -0
- package/List/DataList/index.js.map +1 -0
- package/List/DataList/types.d.ts +1 -1
- package/List/DataList/types.js.map +1 -0
- package/List/List.d.ts +1 -1
- package/List/List.js +1 -1
- package/List/List.js.map +1 -0
- package/List/List.stories.js.map +1 -0
- package/List/icons/index.js.map +1 -0
- package/List/index.js.map +1 -0
- package/Menu/Menu.d.ts +14 -19
- package/Menu/Menu.js +1 -2
- package/Menu/Menu.js.map +1 -0
- package/Menu/Menu.stories.js +1 -1
- package/Menu/Menu.stories.js.map +1 -0
- package/Menu/index.js.map +1 -0
- package/Mosaic/Mosaic.d.ts +4 -14
- package/Mosaic/Mosaic.js +11 -3
- package/Mosaic/Mosaic.js.map +1 -0
- package/Mosaic/Mosaic.stories.js +1 -1
- package/Mosaic/Mosaic.stories.js.map +1 -0
- package/Mosaic/index.js.map +1 -0
- package/Progress/CircularProgress.d.ts +8 -16
- package/Progress/CircularProgress.js +12 -8
- package/Progress/CircularProgress.js.map +1 -0
- package/Progress/index.js.map +1 -0
- package/Radio/Radio.d.ts +1 -6
- package/Radio/Radio.js +8 -9
- package/Radio/Radio.js.map +1 -0
- package/Radio/Radio.styles.js.map +1 -0
- package/Radio/RadioGroup.d.ts +1 -6
- package/Radio/RadioGroup.js +8 -10
- package/Radio/RadioGroup.js.map +1 -0
- package/Radio/RadioGroup.stories.js +1 -1
- package/Radio/RadioGroup.stories.js.map +1 -0
- package/Radio/index.js.map +1 -0
- package/RichTextEditor/RichTextEditor.d.ts +6 -6
- package/RichTextEditor/RichTextEditor.js +26 -4
- package/RichTextEditor/RichTextEditor.js.map +1 -0
- package/RichTextEditor/RichTextEditor.stories.js +1 -1
- package/RichTextEditor/RichTextEditor.stories.js.map +1 -0
- package/RichTextEditor/createPropsFromConfig.d.ts +11 -1
- package/RichTextEditor/createPropsFromConfig.js +7 -3
- package/RichTextEditor/createPropsFromConfig.js.map +1 -0
- package/RichTextEditor/index.js.map +1 -0
- package/Ripple/Ripple.d.ts +4 -5
- package/Ripple/Ripple.js +1 -1
- package/Ripple/Ripple.js.map +1 -0
- package/Ripple/Ripple.stories.js +2 -2
- package/Ripple/Ripple.stories.js.map +1 -0
- package/Ripple/index.js.map +1 -0
- package/Scrollbar/Scrollbar.d.ts +5 -5
- package/Scrollbar/Scrollbar.js +1 -1
- package/Scrollbar/Scrollbar.js.map +1 -0
- package/Scrollbar/Scrollbar.stories.js +1 -1
- package/Scrollbar/Scrollbar.stories.js.map +1 -0
- package/Scrollbar/index.js.map +1 -0
- package/Section/Section.stories.js.map +1 -0
- package/Section/index.d.ts +4 -5
- package/Section/index.js +1 -1
- package/Section/index.js.map +1 -0
- package/Select/Select.d.ts +6 -9
- package/Select/Select.js +69 -11
- package/Select/Select.js.map +1 -0
- package/Select/Select.stories.js.map +1 -0
- package/Select/index.js.map +1 -0
- package/Slider/Slider.d.ts +1 -6
- package/Slider/Slider.js +7 -9
- package/Slider/Slider.js.map +1 -0
- package/Slider/Slider.stories.js +1 -1
- package/Slider/Slider.stories.js.map +1 -0
- package/Slider/index.js.map +1 -0
- package/Snackbar/Snackbar.d.ts +4 -7
- package/Snackbar/Snackbar.js +2 -5
- package/Snackbar/Snackbar.js.map +1 -0
- package/Snackbar/Snackbar.stories.js +1 -1
- package/Snackbar/Snackbar.stories.js.map +1 -0
- package/Snackbar/index.js.map +1 -0
- package/Switch/Switch.d.ts +1 -6
- package/Switch/Switch.js +8 -9
- package/Switch/Switch.js.map +1 -0
- package/Switch/Switch.stories.js.map +1 -0
- package/Switch/index.js.map +1 -0
- package/Tabs/Tab.d.ts +6 -2
- package/Tabs/Tab.js +1 -1
- package/Tabs/Tab.js.map +1 -0
- package/Tabs/Tabs.d.ts +19 -13
- package/Tabs/Tabs.js +30 -18
- package/Tabs/Tabs.js.map +1 -0
- package/Tabs/Tabs.stories.js +1 -1
- package/Tabs/Tabs.stories.js.map +1 -0
- package/Tabs/index.js.map +1 -0
- package/Tags/Tags.d.ts +5 -10
- package/Tags/Tags.js +12 -12
- package/Tags/Tags.js.map +1 -0
- package/Tags/Tags.stories.js.map +1 -0
- package/Tags/index.js.map +1 -0
- package/Tooltip/Tooltip.d.ts +8 -7
- package/Tooltip/Tooltip.js +8 -3
- package/Tooltip/Tooltip.js.map +1 -0
- package/Tooltip/Tooltip.stories.js.map +1 -0
- package/Tooltip/index.js.map +1 -0
- package/TopAppBar/TopAppBar.d.ts +1 -1
- package/TopAppBar/TopAppBar.js +1 -1
- package/TopAppBar/TopAppBar.js.map +1 -0
- package/TopAppBar/TopAppBar.stories.js.map +1 -0
- package/TopAppBar/TopAppBarActionItem.js +1 -1
- package/TopAppBar/TopAppBarActionItem.js.map +1 -0
- package/TopAppBar/TopAppBarNavigationIcon.js +1 -1
- package/TopAppBar/TopAppBarNavigationIcon.js.map +1 -0
- package/TopAppBar/TopAppBarPrimary.js +1 -1
- package/TopAppBar/TopAppBarPrimary.js.map +1 -0
- package/TopAppBar/TopAppBarSecondary.js +1 -1
- package/TopAppBar/TopAppBarSecondary.js.map +1 -0
- package/TopAppBar/TopAppBarSection.d.ts +1 -1
- package/TopAppBar/TopAppBarSection.js +1 -1
- package/TopAppBar/TopAppBarSection.js.map +1 -0
- package/TopAppBar/TopAppBarTitle.d.ts +1 -1
- package/TopAppBar/TopAppBarTitle.js +1 -1
- package/TopAppBar/TopAppBarTitle.js.map +1 -0
- package/TopAppBar/index.js.map +1 -0
- package/TopProgressBar/TopProgressBar.d.ts +7 -7
- package/TopProgressBar/TopProgressBar.js.map +1 -0
- package/TopProgressBar/TopProgressBar.stories.js +1 -1
- package/TopProgressBar/TopProgressBar.stories.js.map +1 -0
- package/TopProgressBar/hoc/index.js.map +1 -0
- package/TopProgressBar/hoc/withTopProgressBar.d.ts +1 -1
- package/TopProgressBar/hoc/withTopProgressBar.js +1 -1
- package/TopProgressBar/hoc/withTopProgressBar.js.map +1 -0
- package/TopProgressBar/index.js.map +1 -0
- package/Typography/Typography.d.ts +4 -4
- package/Typography/Typography.js +1 -1
- package/Typography/Typography.js.map +1 -0
- package/Typography/Typography.stories.js +1 -1
- package/Typography/Typography.stories.js.map +1 -0
- package/Typography/index.js.map +1 -0
- package/package.json +21 -12
- package/rmwc/base/LICENSE +21 -0
- package/rmwc/base/README.md +3 -0
- package/rmwc/base/code/component.d.ts +18 -0
- package/rmwc/base/code/component.js +163 -0
- package/rmwc/base/code/foundation-component.d.ts +79 -0
- package/rmwc/base/code/foundation-component.js +354 -0
- package/rmwc/base/code/index.d.ts +16 -0
- package/rmwc/base/code/index.js +25 -0
- package/rmwc/base/code/test-polyfill.d.ts +3 -0
- package/rmwc/base/code/test-polyfill.js +33 -0
- package/rmwc/base/code/utils/apply-passive.d.ts +8 -0
- package/rmwc/base/code/utils/apply-passive.js +63 -0
- package/rmwc/base/code/utils/debounce.d.ts +2 -0
- package/rmwc/base/code/utils/debounce.js +17 -0
- package/rmwc/base/code/utils/deprecation.d.ts +6 -0
- package/rmwc/base/code/utils/deprecation.js +76 -0
- package/rmwc/base/code/utils/emitter.d.ts +13 -0
- package/rmwc/base/code/utils/emitter.js +120 -0
- package/rmwc/base/code/utils/events-map.d.ts +87 -0
- package/rmwc/base/code/utils/events-map.js +90 -0
- package/rmwc/base/code/utils/index.d.ts +10 -0
- package/rmwc/base/code/utils/index.js +19 -0
- package/rmwc/base/code/utils/ponyfills.d.ts +3 -0
- package/rmwc/base/code/utils/ponyfills.js +29 -0
- package/rmwc/base/code/utils/random-id.d.ts +6 -0
- package/rmwc/base/code/utils/random-id.js +14 -0
- package/rmwc/base/code/utils/strings.d.ts +3 -0
- package/rmwc/base/code/utils/strings.js +13 -0
- package/rmwc/base/code/utils/use-knob.d.ts +2 -0
- package/rmwc/base/code/utils/use-knob.js +64 -0
- package/rmwc/base/code/utils/wrap-child.d.ts +3 -0
- package/rmwc/base/code/utils/wrap-child.js +55 -0
- package/rmwc/base/code/with-theme.d.ts +15 -0
- package/rmwc/base/code/with-theme.js +106 -0
- package/rmwc/base/package.json +40 -0
- package/types.d.ts +2 -2
- package/types.js.map +1 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["rotate.tsx"],"names":["React","ReactComponent","RotateRight","Slider","Tooltip","IconButton","Cropper","cropper","RenderForm","rangeInput","width","margin","state","value","setState","rotateTo","parseInt","Component","tool","name","icon","activateTool","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","height"],"mappings":"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","sourcesContent":["import React from \"react\";\nimport { ReactComponent as RotateRight } from \"./icons/rotateRight.svg\";\nimport { ImageEditorTool } from \"./types\";\nimport { Slider } from \"../../Slider\";\nimport { Tooltip } from \"~/Tooltip\";\nimport { IconButton } from \"~/Button\";\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 style={{ width: \"500px\", margin: \"0 auto\" }}>\n <Slider\n label={\"Range Input\"}\n value={this.state.rangeInput}\n min={0}\n max={360}\n step={10}\n discrete={true}\n displayMarkers={true}\n onInput={(value: string) => {\n this.setState({ rangeInput: value }, async () => {\n if (cropper) {\n cropper.rotateTo(parseInt(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 placement={\"bottom\"} content={\"Rotate\"}>\n <IconButton icon={<RotateRight />} onClick={() => activateTool(\"rotate\")} />\n </Tooltip>\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"]}
|
|
@@ -1,22 +1,32 @@
|
|
|
1
|
-
import
|
|
1
|
+
import React from "react";
|
|
2
|
+
export declare type ToolbarTool = "crop" | "flip" | "rotate" | "filter";
|
|
2
3
|
interface RenderFormParams {
|
|
3
|
-
canvas:
|
|
4
|
-
|
|
4
|
+
canvas: React.RefObject<HTMLCanvasElement>;
|
|
5
|
+
image: HTMLImageElement;
|
|
6
|
+
renderApplyCancel?: Function;
|
|
5
7
|
options?: {
|
|
6
8
|
[key: string]: any;
|
|
7
9
|
};
|
|
8
10
|
}
|
|
11
|
+
interface OnActivateParams {
|
|
12
|
+
options: any;
|
|
13
|
+
canvas: React.RefObject<HTMLCanvasElement>;
|
|
14
|
+
}
|
|
15
|
+
interface IconParams {
|
|
16
|
+
activateTool: (tool: ToolbarTool) => void;
|
|
17
|
+
}
|
|
18
|
+
interface ApplyParams {
|
|
19
|
+
canvas: React.RefObject<HTMLCanvasElement>;
|
|
20
|
+
}
|
|
21
|
+
interface CancelParams {
|
|
22
|
+
canvas: React.RefObject<HTMLCanvasElement>;
|
|
23
|
+
}
|
|
9
24
|
export interface ImageEditorTool {
|
|
10
25
|
name: string;
|
|
11
|
-
apply?:
|
|
12
|
-
cancel?:
|
|
13
|
-
onActivate?: (
|
|
14
|
-
|
|
15
|
-
canvas: any;
|
|
16
|
-
}) => void;
|
|
17
|
-
icon: ({ activateTool: Function }: {
|
|
18
|
-
activateTool: any;
|
|
19
|
-
}) => React.ReactElement<any>;
|
|
26
|
+
apply?: (params: ApplyParams) => void;
|
|
27
|
+
cancel?: (params: CancelParams) => void;
|
|
28
|
+
onActivate?: (params: OnActivateParams) => void;
|
|
29
|
+
icon: (params: IconParams) => React.ReactElement<any>;
|
|
20
30
|
renderForm?: (params: RenderFormParams) => React.ReactNode;
|
|
21
31
|
}
|
|
22
32
|
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","sourcesContent":[]}
|
package/ImageUpload/Image.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
uploadImage:
|
|
4
|
-
removeImage?:
|
|
1
|
+
import React from "react";
|
|
2
|
+
interface ImageProps {
|
|
3
|
+
uploadImage: () => void;
|
|
4
|
+
removeImage?: (value: string | null) => void;
|
|
5
5
|
editImage?: Function;
|
|
6
6
|
value?: any;
|
|
7
7
|
disabled?: boolean;
|
|
@@ -11,8 +11,8 @@ declare type Props = {
|
|
|
11
11
|
renderImagePreview?: (props: any) => React.ReactElement<any>;
|
|
12
12
|
round?: boolean;
|
|
13
13
|
containerStyle?: React.CSSProperties;
|
|
14
|
-
}
|
|
15
|
-
declare class Image extends React.Component<
|
|
14
|
+
}
|
|
15
|
+
declare class Image extends React.Component<ImageProps> {
|
|
16
16
|
static defaultProps: {
|
|
17
17
|
placeholder: string;
|
|
18
18
|
containerStyle: {
|
package/ImageUpload/Image.js
CHANGED
|
@@ -3,7 +3,7 @@ import _createClass from "@babel/runtime/helpers/createClass";
|
|
|
3
3
|
import _inherits from "@babel/runtime/helpers/inherits";
|
|
4
4
|
import _createSuper from "@babel/runtime/helpers/createSuper";
|
|
5
5
|
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
6
|
-
import
|
|
6
|
+
import React from "react";
|
|
7
7
|
import classNames from "classnames";
|
|
8
8
|
import { ReactComponent as AddImageIcon } from "./icons/round-add_photo_alternate-24px.svg";
|
|
9
9
|
import { ReactComponent as RemoveImageIcon } from "./icons/round-close-24px.svg";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["Image.tsx"],"names":["React","classNames","ReactComponent","AddImageIcon","RemoveImageIcon","EditImageIcon","Typography","CircularProgress","AddImageIconWrapper","AddImageWrapper","AddImageWrapperRound","EditImage","ImagePreviewWrapper","RemoveImage","Image","props","uploadImage","round","ImageWrapper","placeholder","removeImage","editImage","value","renderImagePreview","imagePreviewProps","src","style","onClick","width","height","imagePreview","disabled","containerStyle","loading","renderImg","renderBlank","Component"],"mappings":"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","sourcesContent":["import React from \"react\";\nimport classNames from \"classnames\";\nimport { ReactComponent as AddImageIcon } from \"./icons/round-add_photo_alternate-24px.svg\";\nimport { ReactComponent as RemoveImageIcon } from \"./icons/round-close-24px.svg\";\nimport { ReactComponent as EditImageIcon } from \"./icons/round-edit-24px.svg\";\nimport { Typography } from \"../Typography\";\nimport { CircularProgress } from \"../Progress\";\nimport {\n AddImageIconWrapper,\n AddImageWrapper,\n AddImageWrapperRound,\n EditImage,\n ImagePreviewWrapper,\n RemoveImage\n} from \"./styled\";\n\ninterface ImageProps {\n uploadImage: () => void;\n removeImage?: (value: string | null) => void;\n editImage?: Function;\n value?: any;\n disabled?: boolean;\n loading?: boolean;\n placeholder: string;\n style?: React.CSSProperties;\n renderImagePreview?: (props: any) => React.ReactElement<any>;\n round?: boolean;\n containerStyle?: React.CSSProperties;\n}\n\nclass Image extends React.Component<ImageProps> {\n static defaultProps = {\n placeholder: \"Select an image\",\n containerStyle: { height: \"100%\" }\n };\n\n renderBlank() {\n const { uploadImage, round } = this.props;\n\n const ImageWrapper = round ? AddImageWrapperRound : AddImageWrapper;\n\n return (\n <ImageWrapper\n data-role={\"select-image\"}\n onClick={() => {\n uploadImage();\n }}\n >\n <AddImageIconWrapper>\n <AddImageIcon />\n <Typography use={\"caption\"}>{this.props.placeholder}</Typography>\n </AddImageIconWrapper>\n </ImageWrapper>\n );\n }\n\n renderImg() {\n const { removeImage, editImage, uploadImage, value, renderImagePreview } = this.props;\n\n const imagePreviewProps: any = {\n src: value ? value.src : null,\n style: this.props.style ? this.props.style : null,\n onClick: () => uploadImage()\n };\n\n if (!imagePreviewProps.style) {\n imagePreviewProps.style = {};\n }\n\n if (!imagePreviewProps.style.width && !imagePreviewProps.style.height) {\n imagePreviewProps.style.width = \"100%\";\n imagePreviewProps.style.height = \"100%\";\n }\n\n let imagePreview = null;\n if (typeof renderImagePreview === \"function\") {\n imagePreview = renderImagePreview(imagePreviewProps);\n } else {\n imagePreview = <img {...imagePreviewProps} />;\n }\n\n return (\n <ImagePreviewWrapper>\n {imagePreview}\n\n {typeof removeImage === \"function\" && (\n <RemoveImage onClick={() => removeImage(null)}>\n <RemoveImageIcon />\n </RemoveImage>\n )}\n\n {typeof editImage === \"function\" && (\n <EditImage onClick={() => editImage(value)}>\n <EditImageIcon />\n </EditImage>\n )}\n\n <AddImageWrapper\n data-role={\"select-image\"}\n onClick={() => {\n uploadImage();\n }}\n >\n <AddImageIconWrapper>\n <AddImageIcon />\n <Typography use={\"caption\"}>{this.props.placeholder}</Typography>\n </AddImageIconWrapper>\n </AddImageWrapper>\n </ImagePreviewWrapper>\n );\n }\n\n public override render() {\n const { value, disabled, containerStyle } = this.props;\n return (\n <div className={classNames({ disabled })} style={containerStyle}>\n {this.props.loading && <CircularProgress />}\n {value && value.src ? this.renderImg() : this.renderBlank()}\n </div>\n );\n }\n}\n\nexport default Image;\n"]}
|
|
@@ -1,18 +1,23 @@
|
|
|
1
|
-
import
|
|
1
|
+
import React from "react";
|
|
2
2
|
import { ImageEditor } from "../ImageEditor";
|
|
3
3
|
import { DialogOnClose } from "../Dialog";
|
|
4
|
-
|
|
4
|
+
interface ImageEditorDialogProps {
|
|
5
5
|
dialogZIndex?: number;
|
|
6
6
|
onClose?: DialogOnClose;
|
|
7
7
|
open?: boolean;
|
|
8
|
-
|
|
8
|
+
/**
|
|
9
|
+
* We would need to drill down a lot to give correct options.
|
|
10
|
+
* TODO: figure out some other way.
|
|
11
|
+
*/
|
|
12
|
+
options?: any;
|
|
9
13
|
src?: string;
|
|
10
14
|
onAccept: (src: string) => void;
|
|
11
15
|
"data-testid"?: string;
|
|
12
|
-
}
|
|
13
|
-
|
|
16
|
+
}
|
|
17
|
+
interface ImageEditorDialogState {
|
|
14
18
|
imageProcessing: boolean;
|
|
15
|
-
}
|
|
19
|
+
}
|
|
20
|
+
declare class ImageEditorDialog extends React.Component<ImageEditorDialogProps, ImageEditorDialogState> {
|
|
16
21
|
imageEditor: React.RefObject<ImageEditor>;
|
|
17
22
|
render(): JSX.Element;
|
|
18
23
|
}
|
|
@@ -6,7 +6,7 @@ import _inherits from "@babel/runtime/helpers/inherits";
|
|
|
6
6
|
import _createSuper from "@babel/runtime/helpers/createSuper";
|
|
7
7
|
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
8
8
|
var _excluded = ["src", "options", "onAccept", "open", "dialogZIndex"];
|
|
9
|
-
import
|
|
9
|
+
import React from "react";
|
|
10
10
|
import { ImageEditor } from "../ImageEditor";
|
|
11
11
|
import { Tooltip } from "../Tooltip";
|
|
12
12
|
import { css } from "emotion";
|
|
@@ -81,7 +81,12 @@ var ImageEditorDialog = /*#__PURE__*/function (_React$Component) {
|
|
|
81
81
|
disabled: true
|
|
82
82
|
}, "Save")) : /*#__PURE__*/React.createElement(DialogAccept, {
|
|
83
83
|
onClick: function onClick() {
|
|
84
|
-
|
|
84
|
+
var url = _this2.imageEditor.current ? _this2.imageEditor.current.getCanvasDataUrl() : "";
|
|
85
|
+
/**
|
|
86
|
+
* We are certain that ref exists.
|
|
87
|
+
*/
|
|
88
|
+
|
|
89
|
+
onAccept(url);
|
|
85
90
|
}
|
|
86
91
|
}, "Save")));
|
|
87
92
|
}));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["ImageEditorDialog.tsx"],"names":["React","ImageEditor","Tooltip","css","Dialog","DialogAccept","DialogCancel","DialogActions","DialogContent","imageEditorDialog","width","height","maxWidth","maxHeight","paddingTop","ImageEditorDialog","createRef","props","src","options","onAccept","open","dialogZIndex","dialogProps","zIndex","imageEditor","render","activeTool","url","current","getCanvasDataUrl","Component"],"mappings":";;;;;;;;AAAA,OAAOA,KAAP,MAAkB,OAAlB;AACA,SAASC,WAAT;AACA,SAASC,OAAT;AACA,SAASC,GAAT,QAAoB,SAApB;AACA,SACIC,MADJ,EAEIC,YAFJ,EAGIC,YAHJ,EAIIC,aAJJ,EAKIC,aALJ;AA6BA,IAAMC,iBAAiB,gBAAGN,GAAG,CAAC;AAC1BO,EAAAA,KAAK,EAAE,OADmB;AAE1BC,EAAAA,MAAM,EAAE,OAFkB;AAG1B,0BAAwB;AACpBC,IAAAA,QAAQ,EAAE,iBADU;AAEpBC,IAAAA,SAAS,EAAE,iBAFS;AAGpB,kCAA8B;AAC1BD,MAAAA,QAAQ,EAAE,iBADgB;AAE1BC,MAAAA,SAAS,EAAE,iBAFe;AAG1BH,MAAAA,KAAK,EAAE,OAHmB;AAI1BC,MAAAA,MAAM,EAAE,OAJkB;AAK1BG,MAAAA,UAAU,EAAE;AALc;AAHV;AAHE,CAAD,6BAA7B;;IAgBMC,iB;;;;;;;;;;;;;;;;+EACmBf,KAAK,CAACgB,SAAN,E;;;;;;;WAErB,kBAAyB;AAAA;;AACrB,wBAAuE,KAAKC,KAA5E;AAAA,UAAQC,GAAR,eAAQA,GAAR;AAAA,UAAaC,OAAb,eAAaA,OAAb;AAAA,UAAsBC,QAAtB,eAAsBA,QAAtB;AAAA,UAAgCC,IAAhC,eAAgCA,IAAhC;AAAA,UAAsCC,YAAtC,eAAsCA,YAAtC;AAAA,UAAuDC,WAAvD;;AAEA,0BACI,oBAAC,MAAD;AACI,QAAA,SAAS,EAAEd,iBADf;AAEI,QAAA,KAAK,EAAE;AAAEe,UAAAA,MAAM,EAAEF;AAAV,SAFX;AAGI,QAAA,IAAI,EAAED;AAHV,SAIQE,WAJR,GAMKF,IAAI,iBACD,oBAAC,WAAD;AAAa,QAAA,GAAG,EAAE,KAAKI,WAAvB;AAAoC,QAAA,GAAG,EAAEP,GAAzC;AAA8C,QAAA,OAAO,EAAEC;AAAvD,SACK;AAAA,YAAGO,MAAH,QAAGA,MAAH;AAAA,YAAWC,UAAX,QAAWA,UAAX;AAAA,4BACG,uDACI,oBAAC,aAAD,QAAgBD,MAAM,EAAtB,CADJ,eAEI,oBAAC,aAAD,qBACI,oBAAC,YAAD,iBADJ,EAEKC,UAAU,gBACP,oBAAC,OAAD;AACI,UAAA,OAAO,EAAE,qCADb;AAEI,UAAA,SAAS,EAAE;AAFf,wBAII,oBAAC,YAAD;AAAc,UAAA,QAAQ;AAAtB,kBAJJ,CADO,gBAQP,oBAAC,YAAD;AACI,UAAA,OAAO,EAAE,mBAAM;AACX,gBAAMC,GAAG,GAAG,MAAI,CAACH,WAAL,CAAiBI,OAAjB,GACN,MAAI,CAACJ,WAAL,CAAiBI,OAAjB,CAAyBC,gBAAzB,EADM,GAEN,EAFN;AAGA;AAChD;AACA;;AACgDV,YAAAA,QAAQ,CAACQ,GAAD,CAAR;AACH;AATL,kBAVR,CAFJ,CADH;AAAA,OADL,CAPR,CADJ;AA2CH;;;;EAjD2B5B,KAAK,CAAC+B,S;;AAmDtC,eAAehB,iBAAf","sourcesContent":["import React from \"react\";\nimport { ImageEditor } from \"~/ImageEditor\";\nimport { Tooltip } from \"~/Tooltip\";\nimport { css } from \"emotion\";\nimport {\n Dialog,\n DialogAccept,\n DialogCancel,\n DialogActions,\n DialogContent,\n DialogOnClose\n} from \"../Dialog\";\n\ninterface ImageEditorDialogProps {\n dialogZIndex?: number;\n onClose?: DialogOnClose;\n open?: boolean;\n /**\n * We would need to drill down a lot to give correct options.\n * TODO: figure out some other way.\n */\n options?: any;\n src?: string;\n onAccept: (src: string) => void;\n\n // For testing purposes.\n \"data-testid\"?: string;\n}\n\ninterface ImageEditorDialogState {\n imageProcessing: boolean;\n}\n\nconst imageEditorDialog = css({\n width: \"100vw\",\n height: \"100vh\",\n \".mdc-dialog__surface\": {\n maxWidth: \"100% !important\",\n maxHeight: \"100% !important\",\n \".webiny-ui-dialog__content\": {\n maxWidth: \"100% !important\",\n maxHeight: \"100% !important\",\n width: \"100vw\",\n height: \"100vh\",\n paddingTop: \"0 !important\"\n }\n }\n});\n\nclass ImageEditorDialog extends React.Component<ImageEditorDialogProps, ImageEditorDialogState> {\n public imageEditor = React.createRef<ImageEditor>();\n\n public override render() {\n const { src, options, onAccept, open, dialogZIndex, ...dialogProps } = this.props;\n\n return (\n <Dialog\n className={imageEditorDialog}\n style={{ zIndex: dialogZIndex }}\n open={open}\n {...dialogProps}\n >\n {open && (\n <ImageEditor ref={this.imageEditor} src={src} options={options}>\n {({ render, activeTool }) => (\n <>\n <DialogContent>{render()}</DialogContent>\n <DialogActions>\n <DialogCancel>Cancel</DialogCancel>\n {activeTool ? (\n <Tooltip\n content={\"Please close currently active tool.\"}\n placement={\"top\"}\n >\n <DialogAccept disabled>Save</DialogAccept>\n </Tooltip>\n ) : (\n <DialogAccept\n onClick={() => {\n const url = this.imageEditor.current\n ? this.imageEditor.current.getCanvasDataUrl()\n : \"\";\n /**\n * We are certain that ref exists.\n */\n onAccept(url);\n }}\n >\n Save\n </DialogAccept>\n )}\n </DialogActions>\n </>\n )}\n </ImageEditor>\n )}\n </Dialog>\n );\n }\n}\nexport default ImageEditorDialog;\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import
|
|
1
|
+
import React from "react";
|
|
2
2
|
import { SelectedFile, FileError } from "react-butterfiles";
|
|
3
3
|
import { FormComponentProps } from "../types";
|
|
4
|
-
|
|
4
|
+
interface MultiImageUploadProps extends FormComponentProps {
|
|
5
5
|
label?: string;
|
|
6
6
|
disabled?: boolean;
|
|
7
7
|
description?: string;
|
|
@@ -17,41 +17,20 @@ declare type Props = FormComponentProps & {
|
|
|
17
17
|
cropper?: {
|
|
18
18
|
[key: string]: any;
|
|
19
19
|
};
|
|
20
|
-
}
|
|
21
|
-
|
|
20
|
+
}
|
|
21
|
+
interface State {
|
|
22
22
|
errors?: FileError[];
|
|
23
|
-
selectedImages:
|
|
23
|
+
selectedImages: Record<string, any>;
|
|
24
24
|
loading: boolean;
|
|
25
25
|
imageEditor: {
|
|
26
|
-
image
|
|
26
|
+
image: SelectedFile | null;
|
|
27
27
|
open: boolean;
|
|
28
28
|
index?: number;
|
|
29
29
|
};
|
|
30
|
-
}
|
|
31
|
-
declare class MultiImageUpload extends React.Component<
|
|
32
|
-
static defaultProps:
|
|
33
|
-
|
|
34
|
-
isValid: any;
|
|
35
|
-
};
|
|
36
|
-
accept: string[];
|
|
37
|
-
maxSize: string;
|
|
38
|
-
imageEditor: {};
|
|
39
|
-
errorMessages: {
|
|
40
|
-
maxSizeExceeded: string;
|
|
41
|
-
unsupportedFileType: string;
|
|
42
|
-
default: string;
|
|
43
|
-
};
|
|
44
|
-
};
|
|
45
|
-
state: {
|
|
46
|
-
errors: any;
|
|
47
|
-
selectedImages: {};
|
|
48
|
-
loading: boolean;
|
|
49
|
-
imageEditor: {
|
|
50
|
-
open: boolean;
|
|
51
|
-
image: any;
|
|
52
|
-
index: any;
|
|
53
|
-
};
|
|
54
|
-
};
|
|
30
|
+
}
|
|
31
|
+
declare class MultiImageUpload extends React.Component<MultiImageUploadProps, State> {
|
|
32
|
+
static defaultProps: Partial<MultiImageUploadProps>;
|
|
33
|
+
state: State;
|
|
55
34
|
onChange: (value: any) => Promise<void>;
|
|
56
35
|
handleSelectedImages: (images: Array<SelectedFile>, selectedIndex?: number) => Promise<void>;
|
|
57
36
|
handleErrors: (errors: Array<FileError>) => void;
|
|
@@ -8,7 +8,7 @@ import _inherits from "@babel/runtime/helpers/inherits";
|
|
|
8
8
|
import _createSuper from "@babel/runtime/helpers/createSuper";
|
|
9
9
|
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
10
10
|
import _regeneratorRuntime from "@babel/runtime/regenerator";
|
|
11
|
-
import
|
|
11
|
+
import React from "react";
|
|
12
12
|
import BrowseFiles from "react-butterfiles";
|
|
13
13
|
import { css } from "emotion";
|
|
14
14
|
import classNames from "classnames";
|
|
@@ -55,13 +55,13 @@ var MultiImageUpload = /*#__PURE__*/function (_React$Component) {
|
|
|
55
55
|
_this = _super.call.apply(_super, [this].concat(args));
|
|
56
56
|
|
|
57
57
|
_defineProperty(_assertThisInitialized(_this), "state", {
|
|
58
|
-
errors:
|
|
58
|
+
errors: undefined,
|
|
59
59
|
selectedImages: {},
|
|
60
60
|
loading: false,
|
|
61
61
|
imageEditor: {
|
|
62
62
|
open: false,
|
|
63
63
|
image: null,
|
|
64
|
-
index:
|
|
64
|
+
index: undefined
|
|
65
65
|
}
|
|
66
66
|
});
|
|
67
67
|
|
|
@@ -119,7 +119,7 @@ var MultiImageUpload = /*#__PURE__*/function (_React$Component) {
|
|
|
119
119
|
selectedIndex = _args4.length > 1 && _args4[1] !== undefined ? _args4[1] : 0;
|
|
120
120
|
|
|
121
121
|
_this.setState({
|
|
122
|
-
errors:
|
|
122
|
+
errors: undefined,
|
|
123
123
|
loading: true
|
|
124
124
|
}, /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee3() {
|
|
125
125
|
var selectedImages, i, image;
|
|
@@ -232,12 +232,27 @@ var MultiImageUpload = /*#__PURE__*/function (_React$Component) {
|
|
|
232
232
|
accept = _this$props3.accept,
|
|
233
233
|
maxSize = _this$props3.maxSize,
|
|
234
234
|
className = _this$props3.className;
|
|
235
|
+
/**
|
|
236
|
+
* TODO: figure out the correct type
|
|
237
|
+
*/
|
|
238
|
+
|
|
235
239
|
var imageEditorImageSrc = "";
|
|
236
240
|
|
|
237
241
|
if (this.state.imageEditor.image) {
|
|
242
|
+
// @ts-ignore
|
|
238
243
|
imageEditorImageSrc = this.state.imageEditor.image.src;
|
|
244
|
+
console.warn("Figure out correct type if this.state.imageEditor.image.src");
|
|
245
|
+
console.log(this.state.imageEditor.image.src);
|
|
239
246
|
}
|
|
240
247
|
|
|
248
|
+
var _ref5 = validation || {},
|
|
249
|
+
validationIsValid = _ref5.isValid,
|
|
250
|
+
validationMessage = _ref5.message;
|
|
251
|
+
/**
|
|
252
|
+
* accept can safely be cast because we have default value
|
|
253
|
+
*/
|
|
254
|
+
|
|
255
|
+
|
|
241
256
|
return /*#__PURE__*/React.createElement("div", {
|
|
242
257
|
className: classNames(imagesStyle, className)
|
|
243
258
|
}, label && /*#__PURE__*/React.createElement("div", {
|
|
@@ -275,7 +290,7 @@ var MultiImageUpload = /*#__PURE__*/function (_React$Component) {
|
|
|
275
290
|
imageEditor: {
|
|
276
291
|
image: null,
|
|
277
292
|
open: false,
|
|
278
|
-
index:
|
|
293
|
+
index: undefined
|
|
279
294
|
}
|
|
280
295
|
});
|
|
281
296
|
|
|
@@ -299,9 +314,9 @@ var MultiImageUpload = /*#__PURE__*/function (_React$Component) {
|
|
|
299
314
|
onError: function onError(errors) {
|
|
300
315
|
return _this2.handleErrors(errors);
|
|
301
316
|
}
|
|
302
|
-
}, function (
|
|
303
|
-
var browseFiles =
|
|
304
|
-
getDropZoneProps =
|
|
317
|
+
}, function (_ref7) {
|
|
318
|
+
var browseFiles = _ref7.browseFiles,
|
|
319
|
+
getDropZoneProps = _ref7.getDropZoneProps;
|
|
305
320
|
var images = Array.isArray(value) ? _toConsumableArray(value) : [];
|
|
306
321
|
return /*#__PURE__*/React.createElement("div", getDropZoneProps({
|
|
307
322
|
className: classNames({
|
|
@@ -351,14 +366,20 @@ var MultiImageUpload = /*#__PURE__*/function (_React$Component) {
|
|
|
351
366
|
});
|
|
352
367
|
}
|
|
353
368
|
}))));
|
|
354
|
-
}),
|
|
369
|
+
}), validationIsValid === false && /*#__PURE__*/React.createElement(FormElementMessage, {
|
|
355
370
|
error: true
|
|
356
|
-
},
|
|
371
|
+
}, validationMessage), validationIsValid !== false && description && /*#__PURE__*/React.createElement(FormElementMessage, null, description), Array.isArray(this.state.errors) && /*#__PURE__*/React.createElement(FormElementMessage, {
|
|
357
372
|
error: true
|
|
358
373
|
}, "Your selection of images failed because of the following images:", /*#__PURE__*/React.createElement("ul", null, this.state.errors.map(function (error, index) {
|
|
374
|
+
/**
|
|
375
|
+
* We need to cast as existing keys in errorMessages, otherwise TS throws an error
|
|
376
|
+
*/
|
|
377
|
+
var errorType = error.type;
|
|
378
|
+
var message = _this2.props.errorMessages[errorType];
|
|
379
|
+
var errorFileName = error.file ? error.file.name : "";
|
|
359
380
|
return /*#__PURE__*/React.createElement("li", {
|
|
360
|
-
key:
|
|
361
|
-
}, index + 1, ". ", /*#__PURE__*/React.createElement("strong", null,
|
|
381
|
+
key: errorFileName + index
|
|
382
|
+
}, index + 1, ". ", /*#__PURE__*/React.createElement("strong", null, errorFileName), " -\xA0", message || _this2.props.errorMessages.default);
|
|
362
383
|
}))));
|
|
363
384
|
}
|
|
364
385
|
}]);
|
|
@@ -367,9 +388,6 @@ var MultiImageUpload = /*#__PURE__*/function (_React$Component) {
|
|
|
367
388
|
}(React.Component);
|
|
368
389
|
|
|
369
390
|
_defineProperty(MultiImageUpload, "defaultProps", {
|
|
370
|
-
validation: {
|
|
371
|
-
isValid: null
|
|
372
|
-
},
|
|
373
391
|
accept: ["image/jpeg", "image/png", "image/gif", "image/svg+xml"],
|
|
374
392
|
maxSize: "5mb",
|
|
375
393
|
imageEditor: {},
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["MultiImageUpload.tsx"],"names":["React","BrowseFiles","css","classNames","FormElementMessage","Image","ImageEditorDialog","imagesStyle","opacity","pointerEvents","listStyle","li","verticalAlign","margin","display","width","height","border","cursor","textAlign","MultiImageUpload","errors","undefined","selectedImages","loading","imageEditor","open","image","index","value","props","onChange","validate","images","selectedIndex","setState","i","length","newValue","Array","isArray","convertedImages","push","src","base64","name","size","type","splice","indexOf","validation","label","description","disabled","accept","maxSize","className","imageEditorImageSrc","state","console","warn","log","validationIsValid","isValid","validationMessage","message","setTimeout","imageEditorImageIndex","files","handleSelectedImages","handleErrors","browseFiles","getDropZoneProps","map","file","removeImage","onSuccess","onError","error","errorType","errorMessages","errorFileName","default","Component","maxSizeExceeded","unsupportedFileType"],"mappings":"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","sourcesContent":["import React from \"react\";\nimport BrowseFiles, { SelectedFile, FileError } from \"react-butterfiles\";\nimport { css } from \"emotion\";\nimport classNames from \"classnames\";\nimport { FormElementMessage } from \"../FormElementMessage\";\nimport Image from \"./Image\";\nimport ImageEditorDialog from \"./ImageEditorDialog\";\nimport { FormComponentProps } from \"../types\";\n\nconst imagesStyle = css({\n \".disabled\": {\n opacity: 0.75,\n pointerEvents: \"none\"\n },\n \"ul.images\": {\n listStyle: \"none\",\n li: {\n verticalAlign: \"top\",\n margin: 2,\n display: \"inline-block\",\n width: 150,\n height: 150,\n \"&:last-child\": {\n border: \"1px solid lightgray\",\n cursor: \"pointer\",\n textAlign: \"center\"\n }\n }\n }\n});\n\n// Do not apply editping for following image types.\n// const noImageEditorTypes = [\"image/svg+xml\", \"image/gif\"];\n\ninterface MultiImageUploadProps extends FormComponentProps {\n // Component label.\n label?: string;\n\n // Is component disabled?\n disabled?: boolean;\n\n // Description beneath the image.\n description?: string;\n\n // A className for the root element.\n className?: string;\n\n // Define a list of accepted image types.\n accept?: Array<string>;\n\n // Define file's max allowed size (default is \"5mb\").\n // Uses \"bytes\" (https://www.npmjs.com/package/bytes) library to convert string notation to actual number.\n maxSize: string;\n\n // Image editor options.\n // Please check the docs of ImageEditor component for the list of all available options.\n imageEditor?: Object;\n\n // Use these to customize error messages (eg. if i18n supported is needed).\n errorMessages: {\n maxSizeExceeded: string;\n unsupportedFileType: string;\n default: string;\n };\n\n // Cropper options\n cropper?: { [key: string]: any };\n}\n\ninterface State {\n errors?: FileError[];\n selectedImages: Record<string, any>;\n loading: boolean;\n imageEditor: {\n image: SelectedFile | null;\n open: boolean;\n index?: number;\n };\n}\n\nclass MultiImageUpload extends React.Component<MultiImageUploadProps, State> {\n static defaultProps: Partial<MultiImageUploadProps> = {\n accept: [\"image/jpeg\", \"image/png\", \"image/gif\", \"image/svg+xml\"],\n maxSize: \"5mb\",\n imageEditor: {},\n errorMessages: {\n maxSizeExceeded: \"Max size exceeded.\",\n unsupportedFileType: \"Unsupported file type.\",\n default: \"An error occurred.\"\n }\n };\n\n public override state: State = {\n errors: undefined,\n selectedImages: {},\n loading: false,\n imageEditor: {\n open: false,\n image: null,\n index: undefined\n }\n };\n\n onChange = async (value: any) => {\n const { onChange, validate } = this.props;\n onChange && (await onChange(value));\n validate && (await validate());\n };\n\n handleSelectedImages = async (images: Array<SelectedFile>, selectedIndex = 0) => {\n this.setState(\n {\n errors: undefined,\n loading: true\n },\n async () => {\n const selectedImages: Record<number, any> = {};\n for (let i = 0; i < images.length; i++) {\n const image = images[i];\n selectedImages[selectedIndex + i] = { ...image };\n }\n\n this.setState({ selectedImages }, async () => {\n const newValue = Array.isArray(this.props.value) ? [...this.props.value] : [];\n\n const convertedImages = [];\n for (let i = 0; i < images.length; i++) {\n const image = images[i];\n convertedImages.push({\n src: image.src.base64,\n name: image.name,\n size: image.size,\n type: image.type\n });\n }\n\n newValue.splice(selectedIndex, 0, ...convertedImages);\n await this.onChange(newValue);\n this.setState({ loading: false });\n });\n }\n );\n };\n\n handleErrors = (errors: Array<FileError>) => {\n this.setState({ errors });\n };\n\n removeImage = (image: SelectedFile) => {\n const { value, onChange } = this.props;\n if (!onChange) {\n return;\n }\n\n const images = Array.isArray(value) ? [...value] : [];\n images.splice(images.indexOf(image), 1);\n onChange(images);\n };\n\n public override render() {\n const {\n value,\n validation,\n label,\n description,\n disabled,\n imageEditor,\n accept,\n maxSize,\n className\n } = this.props;\n /**\n * TODO: figure out the correct type\n */\n let imageEditorImageSrc = \"\";\n if (this.state.imageEditor.image) {\n // @ts-ignore\n imageEditorImageSrc = this.state.imageEditor.image.src;\n console.warn(\"Figure out correct type if this.state.imageEditor.image.src\");\n console.log(this.state.imageEditor.image.src);\n }\n\n const { isValid: validationIsValid, message: validationMessage } = validation || {};\n /**\n * accept can safely be cast because we have default value\n */\n return (\n <div className={classNames(imagesStyle, className)}>\n {label && (\n <div className=\"mdc-floating-label mdc-floating-label--float-above\">\n {label}\n </div>\n )}\n\n <ImageEditorDialog\n options={imageEditor}\n open={this.state.imageEditor.open}\n src={imageEditorImageSrc}\n onClose={() => {\n this.setState(state => {\n state.imageEditor.open = false;\n return state;\n });\n }}\n onAccept={src => {\n // We wrapped everything into setTimeout - prevents dialog freeze when larger image is selected.\n setTimeout(() => {\n this.setState({ loading: true }, async () => {\n const newValue = Array.isArray(this.props.value)\n ? [...this.props.value]\n : [];\n\n const imageEditorImageIndex = this.state.imageEditor\n .index as number;\n newValue[imageEditorImageIndex].src = src;\n\n await this.onChange(newValue);\n this.setState({\n loading: false,\n imageEditor: {\n image: null,\n open: false,\n index: undefined\n }\n });\n });\n });\n }}\n />\n\n <BrowseFiles\n accept={accept as string[]}\n maxSize={maxSize}\n multiple\n convertToBase64\n onSuccess={files => {\n this.handleSelectedImages(files, Array.isArray(value) ? value.length : 0);\n }}\n onError={errors => this.handleErrors(errors)}\n >\n {({ browseFiles, getDropZoneProps }) => {\n const images = Array.isArray(value) ? [...value] : [];\n\n return (\n <div {...getDropZoneProps({ className: classNames({ disabled }) })}>\n <ul className=\"images\">\n {images.map((image, index) => (\n <li key={index}>\n <Image\n loading={\n this.state.selectedImages[index] &&\n this.state.loading\n }\n value={image.file || image}\n removeImage={() =>\n this.removeImage(image.file || image)\n }\n editImage={\n this.state.selectedImages[index] &&\n (() => {\n this.setState({\n imageEditor: {\n index,\n open: true,\n image: this.state.selectedImages[\n index\n ]\n }\n });\n })\n }\n uploadImage={() => {\n browseFiles({\n onSuccess: files => {\n this.handleSelectedImages(\n files,\n index + 1\n );\n },\n onError: errors => this.handleErrors(errors)\n });\n }}\n />\n </li>\n ))}\n <li>\n <Image\n disabled={this.state.loading}\n uploadImage={() => {\n browseFiles({\n onSuccess: files => {\n this.handleSelectedImages(\n files,\n Array.isArray(value) ? value.length : 0\n );\n },\n onError: errors => this.handleErrors(errors)\n });\n }}\n />\n </li>\n </ul>\n </div>\n );\n }}\n </BrowseFiles>\n\n {validationIsValid === false && (\n <FormElementMessage error>{validationMessage}</FormElementMessage>\n )}\n\n {validationIsValid !== false && description && (\n <FormElementMessage>{description}</FormElementMessage>\n )}\n\n {Array.isArray(this.state.errors) && (\n <FormElementMessage error>\n Your selection of images failed because of the following images:\n <ul>\n {this.state.errors.map((error: FileError, index) => {\n /**\n * We need to cast as existing keys in errorMessages, otherwise TS throws an error\n */\n const errorType = error.type as\n | \"maxSizeExceeded\"\n | \"unsupportedFileType\"\n | \"default\";\n const message = this.props.errorMessages[errorType];\n\n const errorFileName = error.file ? error.file.name : \"\";\n\n return (\n <li key={errorFileName + index}>\n {index + 1}. <strong>{errorFileName}</strong> - \n {message || this.props.errorMessages.default}\n </li>\n );\n })}\n </ul>\n </FormElementMessage>\n )}\n </div>\n );\n }\n}\n\nexport { MultiImageUpload };\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["MultiImageUpload.stories.tsx"],"names":["React","storiesOf","Story","StoryReadme","StorySandboxCode","StorySandbox","StorySandboxExample","withKnobs","boolean","readme","Form","MultiImageUpload","story","module","addDecorator","images","id","name","src","type","size","add","disabled","Bind","aspectRatio","JSON","stringify","info","propTables"],"mappings":"AAAA,OAAOA,KAAP,MAAkB,OAAlB;AACA,SAASC,SAAT,QAA0B,kBAA1B;AACA,SACIC,KADJ,EAEIC,WAFJ,EAGIC,gBAHJ,EAIIC,YAJJ,EAKIC,mBALJ,QAMO,+BANP;AAOA,SAASC,SAAT,EAAoBC,OAApB,QAAmC,wBAAnC;AACA,OAAOC,MAAP;AAEA,SAASC,IAAT,QAAqB,cAArB;AACA,SAASC,gBAAT;AAEA,IAAMC,KAAK,GAAGX,SAAS,CAAC,wBAAD,EAA2BY,MAA3B,CAAvB;AACAD,KAAK,CAACE,YAAN,CAAmBP,SAAnB;AAEA,IAAMQ,MAAM,GAAG,CACX;AACIC,EAAAA,EAAE,EAAE,CADR;AAEIC,EAAAA,IAAI,EAAE,eAFV;AAGIC,EAAAA,GAAG,EAAE,iCAHT;AAIIC,EAAAA,IAAI,EAAE,YAJV;AAKIC,EAAAA,IAAI,EAAE;AALV,CADW,EAQX;AACIJ,EAAAA,EAAE,EAAE,CADR;AAEIC,EAAAA,IAAI,EAAE,eAFV;AAGIC,EAAAA,GAAG,EAAE,iCAHT;AAIIC,EAAAA,IAAI,EAAE,YAJV;AAKIC,EAAAA,IAAI,EAAE;AALV,CARW,EAeX;AACIJ,EAAAA,EAAE,EAAE,CADR;AAEIC,EAAAA,IAAI,EAAE,eAFV;AAGIC,EAAAA,GAAG,EAAE,iCAHT;AAIIC,EAAAA,IAAI,EAAE,YAJV;AAKIC,EAAAA,IAAI,EAAE;AALV,CAfW,EAsBX;AACIJ,EAAAA,EAAE,EAAE,CADR;AAEIC,EAAAA,IAAI,EAAE,eAFV;AAGIC,EAAAA,GAAG,EAAE,iCAHT;AAIIC,EAAAA,IAAI,EAAE,YAJV;AAKIC,EAAAA,IAAI,EAAE;AALV,CAtBW,EA6BX;AACIJ,EAAAA,EAAE,EAAE,CADR;AAEIC,EAAAA,IAAI,EAAE,eAFV;AAGIC,EAAAA,GAAG,EAAE,iCAHT;AAIIC,EAAAA,IAAI,EAAE,YAJV;AAKIC,EAAAA,IAAI,EAAE;AALV,CA7BW,CAAf;AAsCAR,KAAK,CAACS,GAAN,CACI,oBADJ,EAEI,YAAM;AACF,MAAMC,QAAQ,GAAGd,OAAO,CAAC,UAAD,EAAa,KAAb,CAAxB;AAEA,sBACI,oBAAC,KAAD,qBACI,oBAAC,WAAD,QAAcC,MAAd,CADJ,eAEI,oBAAC,YAAD,qBACI,oBAAC,mBAAD,qBACI,oBAAC,IAAD;AAAM,IAAA,IAAI,EAAE;AAAEM,MAAAA,MAAM,EAANA;AAAF;AAAZ,KACK;AAAA,QAAGQ,IAAH,QAAGA,IAAH;AAAA,wBACG,oBAAC,IAAD;AAAM,MAAA,IAAI,EAAC;AAAX,oBACI,oBAAC,gBAAD;AACI,MAAA,KAAK,EAAC,kCADV;AAEI,MAAA,QAAQ,EAAED,QAFd;AAGI,MAAA,WAAW,EAAC,6CAHhB;AAII,MAAA,OAAO,EAAE;AACLE,QAAAA,WAAW,EAAE;AADR;AAJb,MADJ,CADH;AAAA,GADL,CADJ,CADJ,eAiBI,oBAAC,gBAAD,wDAEkBC,IAAI,CAACC,SAAL,CAAe;AAAEX,IAAAA,MAAM,EAAEA;AAAV,GAAf,CAFlB,okBAjBJ,CAFJ,CADJ;AAsCH,CA3CL,EA4CI;AAAEY,EAAAA,IAAI,EAAE;AAAEC,IAAAA,UAAU,EAAE,CAACjB,gBAAD;AAAd;AAAR,CA5CJ","sourcesContent":["import React from \"react\";\nimport { storiesOf } from \"@storybook/react\";\nimport {\n Story,\n StoryReadme,\n StorySandboxCode,\n StorySandbox,\n StorySandboxExample\n} from \"@webiny/storybook-utils/Story\";\nimport { withKnobs, boolean } from \"@storybook/addon-knobs\";\nimport readme from \"./README.md\";\n\nimport { Form } from \"@webiny/form\";\nimport { MultiImageUpload } from \"./MultiImageUpload\";\n\nconst story = storiesOf(\"Components/ImageUpload\", module);\nstory.addDecorator(withKnobs);\n\nconst images = [\n {\n id: 1,\n name: \"1st_image.jpg\",\n src: \"http://i.pravatar.cc/150?img=49\",\n type: \"image/jpeg\",\n size: 901611\n },\n {\n id: 2,\n name: \"2nd_image.jpg\",\n src: \"http://i.pravatar.cc/150?img=63\",\n type: \"image/jpeg\",\n size: 902612\n },\n {\n id: 3,\n name: \"3rd_image.jpg\",\n src: \"http://i.pravatar.cc/150?img=24\",\n type: \"image/jpeg\",\n size: 903613\n },\n {\n id: 4,\n name: \"4th_image.jpg\",\n src: \"http://i.pravatar.cc/150?img=57\",\n type: \"image/jpeg\",\n size: 904614\n },\n {\n id: 5,\n name: \"5th_image.jpg\",\n src: \"http://i.pravatar.cc/150?img=31\",\n type: \"image/jpeg\",\n size: 905615\n }\n];\n\nstory.add(\n \"Multi Image Upload\",\n () => {\n const disabled = boolean(\"Disabled\", false);\n\n return (\n <Story>\n <StoryReadme>{readme}</StoryReadme>\n <StorySandbox>\n <StorySandboxExample>\n <Form data={{ images }}>\n {({ Bind }) => (\n <Bind name=\"images\">\n <MultiImageUpload\n label=\"Your previously uploaded images:\"\n disabled={disabled}\n description=\"This list will not be shown to other users.\"\n cropper={{\n aspectRatio: 1\n }}\n />\n </Bind>\n )}\n </Form>\n </StorySandboxExample>\n <StorySandboxCode>\n {`\n <Form data={${JSON.stringify({ images: images })}}>\n {({ Bind }) => (\n <Bind name=\"images\">\n <MultiImageUpload\n label=\"Your previously uploaded images:\"\n disabled={disabled}\n description=\"This list will not be shown to other users.\"\n />\n </Bind>\n )}\n </Form>\n `}\n </StorySandboxCode>\n </StorySandbox>\n </Story>\n );\n },\n { info: { propTables: [MultiImageUpload] } }\n);\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import
|
|
1
|
+
import React from "react";
|
|
2
2
|
import { FormComponentProps } from "../types";
|
|
3
3
|
import { SelectedFile, FileError } from "react-butterfiles";
|
|
4
|
-
|
|
4
|
+
interface SingleImageUploadProps extends FormComponentProps {
|
|
5
5
|
label?: string;
|
|
6
6
|
disabled?: boolean;
|
|
7
7
|
description?: string;
|
|
@@ -18,45 +18,24 @@ declare type Props = FormComponentProps & {
|
|
|
18
18
|
multipleNotAllowed: string;
|
|
19
19
|
multipleMaxSizeExceeded: string;
|
|
20
20
|
};
|
|
21
|
-
}
|
|
22
|
-
|
|
21
|
+
}
|
|
22
|
+
interface StateImage {
|
|
23
|
+
name: string;
|
|
24
|
+
type: string;
|
|
25
|
+
size: number;
|
|
26
|
+
src?: string;
|
|
27
|
+
}
|
|
28
|
+
interface State {
|
|
23
29
|
loading: boolean;
|
|
24
|
-
error
|
|
30
|
+
error: FileError | null;
|
|
25
31
|
imageEditor: {
|
|
26
|
-
image
|
|
27
|
-
name: string;
|
|
28
|
-
type: string;
|
|
29
|
-
size: number;
|
|
30
|
-
src?: string;
|
|
31
|
-
};
|
|
32
|
+
image: StateImage | null;
|
|
32
33
|
open: boolean;
|
|
33
34
|
};
|
|
34
|
-
}
|
|
35
|
-
export declare class SingleImageUpload extends React.Component<
|
|
36
|
-
static defaultProps:
|
|
37
|
-
|
|
38
|
-
isValid: any;
|
|
39
|
-
};
|
|
40
|
-
maxSize: string;
|
|
41
|
-
imageEditor: {};
|
|
42
|
-
accept: string[];
|
|
43
|
-
showRemoveImageButton: boolean;
|
|
44
|
-
errorMessages: {
|
|
45
|
-
maxSizeExceeded: string;
|
|
46
|
-
multipleMaxSizeExceeded: string;
|
|
47
|
-
multipleNotAllowed: string;
|
|
48
|
-
unsupportedFileType: string;
|
|
49
|
-
default: string;
|
|
50
|
-
};
|
|
51
|
-
};
|
|
52
|
-
state: {
|
|
53
|
-
loading: boolean;
|
|
54
|
-
error: any;
|
|
55
|
-
imageEditor: {
|
|
56
|
-
open: boolean;
|
|
57
|
-
image: any;
|
|
58
|
-
};
|
|
59
|
-
};
|
|
35
|
+
}
|
|
36
|
+
export declare class SingleImageUpload extends React.Component<SingleImageUploadProps, State> {
|
|
37
|
+
static defaultProps: Partial<SingleImageUploadProps>;
|
|
38
|
+
state: State;
|
|
60
39
|
handleFiles: (images: SelectedFile[]) => void;
|
|
61
40
|
handleErrors: (errors: FileError[]) => void;
|
|
62
41
|
render(): JSX.Element;
|
|
@@ -8,7 +8,7 @@ import _inherits from "@babel/runtime/helpers/inherits";
|
|
|
8
8
|
import _createSuper from "@babel/runtime/helpers/createSuper";
|
|
9
9
|
import _defineProperty from "@babel/runtime/helpers/defineProperty";
|
|
10
10
|
import _regeneratorRuntime from "@babel/runtime/regenerator";
|
|
11
|
-
import
|
|
11
|
+
import React from "react";
|
|
12
12
|
import BrowseFiles from "react-butterfiles";
|
|
13
13
|
import { FormElementMessage } from "../FormElementMessage";
|
|
14
14
|
import styled from "@emotion/styled";
|
|
@@ -119,11 +119,22 @@ export var SingleImageUpload = /*#__PURE__*/function (_React$Component) {
|
|
|
119
119
|
renderImagePreview = _this$props2.renderImagePreview;
|
|
120
120
|
var imageEditorImageSrc = "";
|
|
121
121
|
|
|
122
|
-
if (this.state.imageEditor.image) {
|
|
122
|
+
if (this.state.imageEditor.image && this.state.imageEditor.image.src) {
|
|
123
123
|
imageEditorImageSrc = this.state.imageEditor.image.src;
|
|
124
124
|
}
|
|
125
125
|
|
|
126
126
|
var src = value ? value.src : null;
|
|
127
|
+
var errorType = this.state.error ? this.state.error.type : null;
|
|
128
|
+
|
|
129
|
+
var _ref = validation || {},
|
|
130
|
+
validationIsValid = _ref.isValid,
|
|
131
|
+
validationMessage = _ref.message;
|
|
132
|
+
/**
|
|
133
|
+
* accept can be safely cast because of default value
|
|
134
|
+
* errorType as keyof Props["errorMessages"] can be safely
|
|
135
|
+
*/
|
|
136
|
+
|
|
137
|
+
|
|
127
138
|
return /*#__PURE__*/React.createElement(ImageUploadWrapper, {
|
|
128
139
|
className: classNames(className)
|
|
129
140
|
}, label && !src && /*#__PURE__*/React.createElement("div", {
|
|
@@ -184,22 +195,22 @@ export var SingleImageUpload = /*#__PURE__*/function (_React$Component) {
|
|
|
184
195
|
convertToBase64: true,
|
|
185
196
|
onSuccess: this.handleFiles,
|
|
186
197
|
onError: this.handleErrors
|
|
187
|
-
}, function (
|
|
188
|
-
var browseFiles =
|
|
189
|
-
getDropZoneProps =
|
|
198
|
+
}, function (_ref3) {
|
|
199
|
+
var browseFiles = _ref3.browseFiles,
|
|
200
|
+
getDropZoneProps = _ref3.getDropZoneProps;
|
|
190
201
|
return /*#__PURE__*/React.createElement("div", getDropZoneProps(), /*#__PURE__*/React.createElement(Image, {
|
|
191
202
|
renderImagePreview: renderImagePreview,
|
|
192
203
|
loading: _this2.state.loading,
|
|
193
204
|
value: value,
|
|
194
|
-
removeImage: showRemoveImageButton ? onChange :
|
|
205
|
+
removeImage: showRemoveImageButton ? onChange : undefined,
|
|
195
206
|
uploadImage: browseFiles,
|
|
196
207
|
editImage: browseFiles
|
|
197
208
|
}));
|
|
198
|
-
}),
|
|
209
|
+
}), validationIsValid === false && /*#__PURE__*/React.createElement(FormElementMessage, {
|
|
199
210
|
error: true
|
|
200
|
-
},
|
|
211
|
+
}, validationMessage), validationIsValid !== false && description && /*#__PURE__*/React.createElement(FormElementMessage, null, description), this.state.error && /*#__PURE__*/React.createElement(FormElementMessage, {
|
|
201
212
|
error: true
|
|
202
|
-
}, this.props.errorMessages[
|
|
213
|
+
}, this.props.errorMessages[errorType] || this.props.errorMessages.default));
|
|
203
214
|
}
|
|
204
215
|
}]);
|
|
205
216
|
|
|
@@ -207,9 +218,6 @@ export var SingleImageUpload = /*#__PURE__*/function (_React$Component) {
|
|
|
207
218
|
}(React.Component);
|
|
208
219
|
|
|
209
220
|
_defineProperty(SingleImageUpload, "defaultProps", {
|
|
210
|
-
validation: {
|
|
211
|
-
isValid: null
|
|
212
|
-
},
|
|
213
221
|
maxSize: "10mb",
|
|
214
222
|
imageEditor: {},
|
|
215
223
|
accept: ["image/jpeg", "image/png", "image/gif", "image/svg+xml"],
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["SingleImageUpload.tsx"],"names":["React","BrowseFiles","FormElementMessage","styled","classNames","Image","ImageEditorDialog","ImageUploadWrapper","position","opacity","pointerEvents","transform","top","left","color","noImageEditingTypes","SingleImageUpload","loading","error","imageEditor","open","image","images","props","onChange","name","type","size","src","base64","setState","includes","errors","className","value","validation","label","description","accept","maxSize","showRemoveImageButton","renderImagePreview","imageEditorImageSrc","state","errorType","validationIsValid","isValid","validationMessage","message","setTimeout","handleFiles","handleErrors","browseFiles","getDropZoneProps","undefined","errorMessages","default","Component","maxSizeExceeded","multipleMaxSizeExceeded","multipleNotAllowed","unsupportedFileType"],"mappings":"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","sourcesContent":["import React from \"react\";\nimport { FormComponentProps } from \"~/types\";\nimport BrowseFiles, { SelectedFile, FileError } from \"react-butterfiles\";\nimport { FormElementMessage } from \"~/FormElementMessage\";\nimport styled from \"@emotion/styled\";\nimport classNames from \"classnames\";\nimport Image from \"./Image\";\nimport ImageEditorDialog from \"./ImageEditorDialog\";\n\nconst ImageUploadWrapper = styled(\"div\")({\n position: \"relative\",\n \".disabled\": {\n opacity: 0.75,\n pointerEvents: \"none\"\n },\n \".mdc-floating-label--float-above\": {\n transform: \"scale(0.75)\",\n top: 10,\n left: 10,\n color: \"var(--mdc-theme-text-secondary-on-background)\"\n },\n \".mdc-text-field-helper-text\": {\n color: \"var(--mdc-theme-text-secondary-on-background)\"\n }\n});\n\ninterface SingleImageUploadProps extends FormComponentProps {\n // Component label.\n label?: string;\n\n // Is component disabled?\n disabled?: boolean;\n\n // Description beneath the image.\n description?: string;\n\n // A className for the root element.\n className?: string;\n\n // Define a list of accepted image types.\n accept?: Array<string>;\n\n // Define file's max allowed size (default is \"10mb\").\n // Uses \"bytes\" (https://www.npmjs.com/package/bytes) library to convert string notation to actual number.\n maxSize: string;\n\n // Image editor options.\n // Please check the docs of ImageEditor component for the list of all available options.\n imageEditor?: Object;\n\n // Custom image preview renderer. By default images are rendered via simple <img> element.\n renderImagePreview?: () => React.ReactElement<any>;\n\n // Should remove image button (top right ✕) be shown? Default is set to `true`.\n showRemoveImageButton?: boolean;\n\n // Use these to customize error messages (eg. if i18n supported is needed).\n errorMessages: {\n maxSizeExceeded: string;\n unsupportedFileType: string;\n default: string;\n multipleNotAllowed: string;\n multipleMaxSizeExceeded: string;\n };\n}\n\ninterface StateImage {\n name: string;\n type: string;\n size: number;\n src?: string;\n}\ninterface State {\n loading: boolean;\n error: FileError | null;\n imageEditor: {\n image: StateImage | null;\n open: boolean;\n };\n}\n\n// Do not apply editing for following image types.\nconst noImageEditingTypes = [\"image/svg+xml\", \"image/gif\"];\n\ntype ErrorType =\n | \"maxSizeExceeded\"\n | \"unsupportedFileType\"\n | \"default\"\n | \"multipleNotAllowed\"\n | \"multipleMaxSizeExceeded\";\n\nexport class SingleImageUpload extends React.Component<SingleImageUploadProps, State> {\n static defaultProps: Partial<SingleImageUploadProps> = {\n maxSize: \"10mb\",\n imageEditor: {},\n accept: [\"image/jpeg\", \"image/png\", \"image/gif\", \"image/svg+xml\"],\n showRemoveImageButton: true,\n errorMessages: {\n maxSizeExceeded: \"Max size exceeded.\",\n multipleMaxSizeExceeded: \"Selected fields exceed max file size.\",\n multipleNotAllowed: \"Multiple selection not allowed.\",\n unsupportedFileType: \"Unsupported file type.\",\n default: \"An error occurred.\"\n }\n };\n\n public override state: State = {\n loading: false,\n error: null,\n imageEditor: {\n open: false,\n image: null\n }\n };\n\n handleFiles = (images: SelectedFile[]) => {\n const { onChange, imageEditor } = this.props;\n const image = {\n name: images[0].name,\n type: images[0].type,\n size: images[0].size,\n src: images[0].src.base64\n };\n\n this.setState({ error: null }, () => {\n if (imageEditor && !noImageEditingTypes.includes(image.type)) {\n this.setState({ imageEditor: { image, open: true } });\n } else {\n onChange && onChange(image);\n }\n });\n };\n\n handleErrors = (errors: FileError[]) => {\n const [error] = errors;\n this.setState({ error });\n };\n\n public override render() {\n const {\n className,\n value,\n validation,\n label,\n description,\n accept,\n maxSize,\n onChange,\n imageEditor,\n showRemoveImageButton,\n renderImagePreview\n } = this.props;\n\n let imageEditorImageSrc = \"\";\n if (this.state.imageEditor.image && this.state.imageEditor.image.src) {\n imageEditorImageSrc = this.state.imageEditor.image.src;\n }\n\n const src = value ? value.src : null;\n\n const errorType = this.state.error ? (this.state.error.type as ErrorType) : null;\n\n const { isValid: validationIsValid, message: validationMessage } = validation || {};\n /**\n * accept can be safely cast because of default value\n * errorType as keyof Props[\"errorMessages\"] can be safely\n */\n return (\n <ImageUploadWrapper className={classNames(className)}>\n {label && !src && (\n <div className=\"mdc-floating-label mdc-floating-label--float-above\">\n {label}\n </div>\n )}\n\n <ImageEditorDialog\n options={imageEditor}\n open={this.state.imageEditor.open}\n src={imageEditorImageSrc}\n onClose={() => {\n this.setState(state => {\n state.imageEditor.open = false;\n return state;\n });\n }}\n onAccept={src => {\n // We wrapped everything into setTimeout - prevents dialog freeze when larger image is selected.\n setTimeout(() => {\n this.setState({ loading: true }, async () => {\n onChange &&\n (await onChange({ ...this.state.imageEditor.image, src }));\n this.setState({\n loading: false,\n imageEditor: {\n image: null,\n open: false\n }\n });\n });\n });\n }}\n />\n <BrowseFiles\n accept={accept as string[]}\n maxSize={maxSize}\n convertToBase64\n onSuccess={this.handleFiles}\n onError={this.handleErrors}\n >\n {({ browseFiles, getDropZoneProps }) => (\n <div {...getDropZoneProps()}>\n <Image\n renderImagePreview={renderImagePreview}\n loading={this.state.loading}\n value={value}\n removeImage={showRemoveImageButton ? onChange : undefined}\n uploadImage={browseFiles}\n editImage={browseFiles}\n />\n </div>\n )}\n </BrowseFiles>\n\n {validationIsValid === false && (\n <FormElementMessage error>{validationMessage}</FormElementMessage>\n )}\n\n {validationIsValid !== false && description && (\n <FormElementMessage>{description}</FormElementMessage>\n )}\n\n {this.state.error && (\n <FormElementMessage error>\n {this.props.errorMessages[\n errorType as keyof SingleImageUploadProps[\"errorMessages\"]\n ] || this.props.errorMessages.default}\n </FormElementMessage>\n )}\n </ImageUploadWrapper>\n );\n }\n}\n"]}
|