venice-ui 2.1.4 → 2.1.6

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.
@@ -75,6 +75,9 @@ exports.ButtonElement = styled_components_1.default.button `
75
75
  &:disabled {
76
76
  cursor: not-allowed;
77
77
  }
78
+ &:focus {
79
+ outline: none;
80
+ }
78
81
  `;
79
82
  exports.ButtonLoader = styled_components_1.default.div `
80
83
  display: flex;
@@ -73,9 +73,18 @@ const Dropdown = ({ size = 'medium', label, labelPosition = 'top', disabled = fa
73
73
  toogleOpen(false);
74
74
  }
75
75
  };
76
- document.addEventListener('click', handleClickOutside, true);
76
+ const handleKeyDown = (e) => {
77
+ if (e.key === 'Escape') {
78
+ close();
79
+ }
80
+ };
81
+ if (open) {
82
+ document.addEventListener('click', handleClickOutside, true);
83
+ document.addEventListener('keydown', handleKeyDown);
84
+ }
77
85
  return () => {
78
86
  document.removeEventListener('click', handleClickOutside, true);
87
+ document.removeEventListener('keydown', handleKeyDown);
79
88
  };
80
89
  }, [open]);
81
90
  return (react_1.default.createElement(Aligment_1.Aligment, { align: labelPosition === 'top' ? 'flex-start' : 'center', direction: labelPosition === 'top' ? 'column' : 'row', wrap: 'nowrap', width: width },
@@ -87,6 +96,6 @@ const Dropdown = ({ size = 'medium', label, labelPosition = 'top', disabled = fa
87
96
  open &&
88
97
  (0, react_dom_1.createPortal)(react_1.default.createElement(common_1.Panel, { style: dropdownStyles, ref: ref, size: size, fullWidth: true, zIndex: zIndex }, options &&
89
98
  options.map((option) => (react_1.default.createElement(common_1.PanelOption, { key: option.value, active: option.value === value, onClick: (e) => selectOption(e, option.value) }, option.label)))), document.body),
90
- (error && errorMsg) && react_1.default.createElement(Input_1.InputErrorMsg, null, errorMsg)))));
99
+ error && errorMsg && react_1.default.createElement(Input_1.InputErrorMsg, null, errorMsg)))));
91
100
  };
92
101
  exports.Dropdown = Dropdown;
@@ -89,12 +89,21 @@ const DropdownMenu = ({ size = 'medium', iconName = 'more_vert', header = false,
89
89
  const mouseleave = (e) => {
90
90
  close();
91
91
  };
92
- document.addEventListener('click', handleClickOutside, true);
93
- if (panel) {
94
- panel.addEventListener('mouseleave', mouseleave);
92
+ const handleKeyDown = (e) => {
93
+ if (e.key === 'Escape') {
94
+ close();
95
+ }
96
+ };
97
+ if (open) {
98
+ document.addEventListener('click', handleClickOutside, true);
99
+ document.addEventListener('keydown', handleKeyDown);
100
+ if (panel) {
101
+ panel.addEventListener('mouseleave', mouseleave);
102
+ }
95
103
  }
96
104
  return () => {
97
105
  document.removeEventListener('click', handleClickOutside, true);
106
+ document.removeEventListener('keydown', handleKeyDown);
98
107
  if (panel) {
99
108
  panel.removeEventListener('mouseleave', mouseleave);
100
109
  }
@@ -179,7 +179,7 @@ const Filters = ({ theme = Theme_1.mainTheme, title = 'Select filters', labelCon
179
179
  react_1.default.createElement(Filters_styles_1.FilterIconArea, null,
180
180
  react_1.default.createElement(Icons_1.Icon, { name: "filters", onClick: toogleFilter, iconColor: setIconColor() }),
181
181
  isAnyFilterActive() && (react_1.default.createElement(Chips_1.Chips, { label: labelClearAll, handleClose: resetAllFiltersAndSubmit }))),
182
- openFilters && (react_1.default.createElement(Modal_1.Modal, { title: title, handleConfirm: applyFilter, handleClose: toogleFilter, handleAdditional: resetAllFilters, labelConfirm: labelConfirm, labelClose: labelClose, labelAdditional: labelClearAll },
182
+ openFilters && (react_1.default.createElement(Modal_1.Modal, { title: title, handleConfirm: applyFilter, handleClose: toogleFilter, handleAdditional: resetAllFilters, labelConfirm: labelConfirm, labelClose: labelClose, labelAdditional: labelClearAll, isOpen: openFilters },
183
183
  react_1.default.createElement(Aligment_1.Aligment, { direction: "column", align: 'flex-end' },
184
184
  react_1.default.createElement(Filters_styles_1.FiltersArea, null, filters.map((filter) => (react_1.default.createElement(Filters_styles_1.FilterSection, null,
185
185
  react_1.default.createElement(Aligment_1.Aligment, { wrap: "nowrap" },
@@ -19,6 +19,7 @@ const Form = ({ formData, size = 'medium', read }) => {
19
19
  };
20
20
  const onIntChangeHandler = (name, value) => {
21
21
  let valueString = value;
22
+ console.log('onIntChangeHandler', valueString);
22
23
  if (valueString.length > 0) {
23
24
  const modify = valueString
24
25
  .replaceAll(',', '.')
@@ -30,29 +30,35 @@ const Aligment_1 = require("../Aligment");
30
30
  const Input_styles_1 = require("./Input.styles");
31
31
  const Icons_1 = require("../Icons");
32
32
  const Theme_1 = require("../../Theme");
33
+ const lodash_1 = require("lodash");
33
34
  const Input = ({ label, labelPosition = 'top', value, type = 'text', name, disabled = false, size = 'medium', handleChange, handleSubmit, width, error = false, errorMsg, placeholder, min, max, step = 0.1, autoFocus, theme = Theme_1.mainTheme, readOnly = false, prefix, }) => {
35
+ const [inputValue, setInputValue] = (0, react_1.useState)(value);
34
36
  const calculateNumberValue = (numberValue) => {
35
37
  return isNaN(parseFloat(numberValue))
36
38
  ? numberValue
37
39
  : parseFloat(numberValue);
38
40
  };
41
+ const debouncedHandleChange = (0, react_1.useCallback)((0, lodash_1.debounce)((name, value) => {
42
+ handleChange(name, value);
43
+ }, 300), [handleChange]);
39
44
  const onChange = (e) => {
40
45
  let returnedValue = type === 'number' || type === 'increase'
41
46
  ? calculateNumberValue(e.target.value)
42
47
  : e.target.value.toString();
43
- handleChange(name, returnedValue);
48
+ setInputValue(returnedValue);
49
+ debouncedHandleChange(name, inputValue);
44
50
  };
45
51
  const onBlurValidation = () => {
46
52
  if (type === 'number' || type === 'increase') {
47
- let validateValue = value;
53
+ let validateValue = inputValue;
48
54
  if (isNaN(parseFloat(validateValue.toString()))) {
49
55
  validateValue = min !== undefined ? min : 0;
50
56
  }
51
- if (typeof value === 'number') {
52
- if (min !== undefined && value < min) {
57
+ if (typeof inputValue === 'number') {
58
+ if (min !== undefined && inputValue < min) {
53
59
  validateValue = min;
54
60
  }
55
- else if (max !== undefined && value > max) {
61
+ else if (max !== undefined && inputValue > max) {
56
62
  validateValue = max;
57
63
  }
58
64
  }
@@ -86,19 +92,18 @@ const Input = ({ label, labelPosition = 'top', value, type = 'text', name, disab
86
92
  }
87
93
  handleChange(name, newValue);
88
94
  };
89
- // ${Theme.fontSize.m}/
90
95
  return (react_1.default.createElement(styled_components_1.ThemeProvider, { theme: theme },
91
96
  react_1.default.createElement(Aligment_1.Aligment, { align: labelPosition === 'top' ? 'flex-start' : 'center', direction: labelPosition === 'top' ? 'column' : 'row', wrap: 'nowrap' },
92
97
  label && (react_1.default.createElement(Input_styles_1.InputLabelElement, { size: size, labelPosition: labelPosition }, label)),
93
98
  react_1.default.createElement(Input_styles_1.InputWrapper, { width: width },
94
99
  react_1.default.createElement(react_1.default.Fragment, null, readOnly ? (react_1.default.createElement(Input_styles_1.InputReadOnlyElement, { inputSize: size }, inputType === 'password' ? '******' : value)) : (react_1.default.createElement(react_1.default.Fragment, null,
95
- react_1.default.createElement(Input_styles_1.InputTextElement, { autoFocus: autoFocus, inputSize: size, type: showPassword ? 'text' : inputType, disabled: disabled, name: name, value: value, onChange: onChange, onKeyDown: onKeyDown, onBlur: onBlurValidation, error: error, placeholder: placeholder, min: min, max: max, step: step, prefix: prefix }),
100
+ react_1.default.createElement(Input_styles_1.InputTextElement, { autoFocus: autoFocus, inputSize: size, type: showPassword ? 'text' : inputType, disabled: disabled, name: name, value: inputValue, onChange: onChange, onKeyDown: onKeyDown, onBlur: onBlurValidation, error: error, placeholder: placeholder, min: min, max: max, step: step, prefix: prefix }),
96
101
  prefix && react_1.default.createElement(Input_styles_1.Prefix, { inputSize: size }, prefix),
97
102
  inputType === 'password' && (react_1.default.createElement(Input_styles_1.EyeIconWrapper, { size: size },
98
103
  react_1.default.createElement(Icons_1.Icon, { name: showPassword ? 'visability_off' : 'visibility', size: 24, onClick: tooglePassword, iconColor: theme.inputDefaultTextColor, iconBgHoverColor: "transparent" }))),
99
104
  type === 'increase' && (react_1.default.createElement(Input_styles_1.IconsWrapper, null,
100
- react_1.default.createElement(Icons_1.Icon, { name: "add", size: size === 'small' ? 16 : 24, onClick: () => increaseValue(value), iconColor: theme.inputDefaultTextColor }),
101
- react_1.default.createElement(Icons_1.Icon, { name: "remove", size: size === 'small' ? 16 : 24, onClick: () => decreaseValue(value), iconColor: theme.inputDefaultTextColor }))),
102
- (error && errorMsg) && react_1.default.createElement(Input_styles_1.InputErrorMsg, null, errorMsg))))))));
105
+ react_1.default.createElement(Icons_1.Icon, { name: "add", size: size === 'small' ? 16 : 24, onClick: () => increaseValue(inputValue), iconColor: theme.inputDefaultTextColor }),
106
+ react_1.default.createElement(Icons_1.Icon, { name: "remove", size: size === 'small' ? 16 : 24, onClick: () => decreaseValue(inputValue), iconColor: theme.inputDefaultTextColor }))),
107
+ error && errorMsg && react_1.default.createElement(Input_styles_1.InputErrorMsg, null, errorMsg))))))));
103
108
  };
104
109
  exports.Input = Input;
@@ -1,17 +1,50 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
4
24
  };
5
25
  Object.defineProperty(exports, "__esModule", { value: true });
6
26
  exports.Modal = void 0;
7
- const react_1 = __importDefault(require("react"));
27
+ const react_1 = __importStar(require("react"));
8
28
  const ElementHeader_1 = require("../ElementHeader");
9
29
  const Theme_1 = require("../../Theme/Theme");
10
30
  const common_1 = require("../common");
11
31
  const Modal_styles_1 = require("./Modal.styles");
12
32
  const styled_components_1 = require("styled-components");
13
33
  const ButtonsFooter_1 = require("../ButtonsFooter");
14
- const Modal = ({ theme = Theme_1.mainTheme, children, title, handleConfirm, handleClose, handleAdditional, labelConfirm, labelClose = 'Cancel', labelAdditional, submitDisabled, size = 'small', submitLoader = false, additionalType = 'button', additionalValue = false, headerDivader = false, additionaNormalMode = false }) => {
34
+ const Modal = ({ isOpen, theme = Theme_1.mainTheme, children, title, handleConfirm, handleClose, handleAdditional, labelConfirm, labelClose = 'Cancel', labelAdditional, submitDisabled, size = 'small', submitLoader = false, additionalType = 'button', additionalValue = false, headerDivader = false, additionaNormalMode = false, exitOnEsc = false }) => {
35
+ (0, react_1.useEffect)(() => {
36
+ const handleKeyDown = (e) => {
37
+ if (e.key === 'Escape') {
38
+ handleClose();
39
+ }
40
+ };
41
+ if (isOpen && exitOnEsc) {
42
+ document.addEventListener('keydown', handleKeyDown);
43
+ }
44
+ return () => {
45
+ document.removeEventListener('keydown', handleKeyDown);
46
+ };
47
+ }, [isOpen]);
15
48
  return (react_1.default.createElement(styled_components_1.ThemeProvider, { theme: theme },
16
49
  react_1.default.createElement(Modal_styles_1.ModalOverlayer, null,
17
50
  react_1.default.createElement(Modal_styles_1.ModalElement, { size: size },
@@ -50,7 +50,7 @@ const Selector = ({ theme = Theme_1.mainTheme, label, labelPosition = 'top', siz
50
50
  value ? (react_1.default.createElement(react_1.default.Fragment, null,
51
51
  react_1.default.createElement(Selector_styles_1.SelectorValue, { onClick: () => toogleOpen(true), size: size }, getLabelForValue(value)),
52
52
  react_1.default.createElement(Icons_1.Icon, { name: 'close', onClick: () => handleClear(), size: (0, common_1.setIconSize)(size) }))) : (react_1.default.createElement(Icons_1.Icon, { name: iconName, onClick: () => toogleOpen(true), size: (0, common_1.setIconSize)(size) })),
53
- open && (react_1.default.createElement(Modal_1.Modal, { title: optionsPanelTitle, labelClose: "Close", handleClose: () => toogleOpen(false) }, options?.length > 0 ? (options.map((option) => (react_1.default.createElement(common_1.PanelOption, { key: option.value, active: option.value === value, onClick: () => selectOption(option.value) }, option.label)))) : (react_1.default.createElement(Typography_1.Text, null, optionsPanelEmptyMsg)))),
53
+ open && (react_1.default.createElement(Modal_1.Modal, { title: optionsPanelTitle, labelClose: "Close", handleClose: () => toogleOpen(false), isOpen: open, exitOnEsc: true }, options?.length > 0 ? (options.map((option) => (react_1.default.createElement(common_1.PanelOption, { key: option.value, active: option.value === value, onClick: () => selectOption(option.value) }, option.label)))) : (react_1.default.createElement(Typography_1.Text, null, optionsPanelEmptyMsg)))),
54
54
  error && react_1.default.createElement(Input_1.InputErrorMsg, null, error)))));
55
55
  };
56
56
  exports.Selector = Selector;
@@ -38,9 +38,16 @@ const Sidepanel = ({ isOpen, handleClose, children, right = false, overlayer = t
38
38
  handleClose && handleClose();
39
39
  }
40
40
  };
41
+ const handleKeyDown = (e) => {
42
+ if (e.key === 'Escape') {
43
+ handleClose && handleClose();
44
+ }
45
+ };
41
46
  document.addEventListener('click', handleClickOutside, true);
47
+ document.addEventListener('keydown', handleKeyDown);
42
48
  return () => {
43
49
  document.removeEventListener('click', handleClickOutside, true);
50
+ document.removeEventListener('keydown', handleKeyDown);
44
51
  };
45
52
  }, [isOpen]);
46
53
  const modalRoot = document.getElementById('root');
@@ -69,6 +69,9 @@ export const ButtonElement = styled.button `
69
69
  &:disabled {
70
70
  cursor: not-allowed;
71
71
  }
72
+ &:focus {
73
+ outline: none;
74
+ }
72
75
  `;
73
76
  export const ButtonLoader = styled.div `
74
77
  display: flex;
@@ -47,9 +47,18 @@ export const Dropdown = ({ size = 'medium', label, labelPosition = 'top', disabl
47
47
  toogleOpen(false);
48
48
  }
49
49
  };
50
- document.addEventListener('click', handleClickOutside, true);
50
+ const handleKeyDown = (e) => {
51
+ if (e.key === 'Escape') {
52
+ close();
53
+ }
54
+ };
55
+ if (open) {
56
+ document.addEventListener('click', handleClickOutside, true);
57
+ document.addEventListener('keydown', handleKeyDown);
58
+ }
51
59
  return () => {
52
60
  document.removeEventListener('click', handleClickOutside, true);
61
+ document.removeEventListener('keydown', handleKeyDown);
53
62
  };
54
63
  }, [open]);
55
64
  return (React.createElement(Aligment, { align: labelPosition === 'top' ? 'flex-start' : 'center', direction: labelPosition === 'top' ? 'column' : 'row', wrap: 'nowrap', width: width },
@@ -61,5 +70,5 @@ export const Dropdown = ({ size = 'medium', label, labelPosition = 'top', disabl
61
70
  open &&
62
71
  createPortal(React.createElement(Panel, { style: dropdownStyles, ref: ref, size: size, fullWidth: true, zIndex: zIndex }, options &&
63
72
  options.map((option) => (React.createElement(PanelOption, { key: option.value, active: option.value === value, onClick: (e) => selectOption(e, option.value) }, option.label)))), document.body),
64
- (error && errorMsg) && React.createElement(InputErrorMsg, null, errorMsg)))));
73
+ error && errorMsg && React.createElement(InputErrorMsg, null, errorMsg)))));
65
74
  };
@@ -63,12 +63,21 @@ export const DropdownMenu = ({ size = 'medium', iconName = 'more_vert', header =
63
63
  const mouseleave = (e) => {
64
64
  close();
65
65
  };
66
- document.addEventListener('click', handleClickOutside, true);
67
- if (panel) {
68
- panel.addEventListener('mouseleave', mouseleave);
66
+ const handleKeyDown = (e) => {
67
+ if (e.key === 'Escape') {
68
+ close();
69
+ }
70
+ };
71
+ if (open) {
72
+ document.addEventListener('click', handleClickOutside, true);
73
+ document.addEventListener('keydown', handleKeyDown);
74
+ if (panel) {
75
+ panel.addEventListener('mouseleave', mouseleave);
76
+ }
69
77
  }
70
78
  return () => {
71
79
  document.removeEventListener('click', handleClickOutside, true);
80
+ document.removeEventListener('keydown', handleKeyDown);
72
81
  if (panel) {
73
82
  panel.removeEventListener('mouseleave', mouseleave);
74
83
  }
@@ -153,7 +153,7 @@ export const Filters = ({ theme = mainTheme, title = 'Select filters', labelConf
153
153
  React.createElement(FilterIconArea, null,
154
154
  React.createElement(Icon, { name: "filters", onClick: toogleFilter, iconColor: setIconColor() }),
155
155
  isAnyFilterActive() && (React.createElement(Chips, { label: labelClearAll, handleClose: resetAllFiltersAndSubmit }))),
156
- openFilters && (React.createElement(Modal, { title: title, handleConfirm: applyFilter, handleClose: toogleFilter, handleAdditional: resetAllFilters, labelConfirm: labelConfirm, labelClose: labelClose, labelAdditional: labelClearAll },
156
+ openFilters && (React.createElement(Modal, { title: title, handleConfirm: applyFilter, handleClose: toogleFilter, handleAdditional: resetAllFilters, labelConfirm: labelConfirm, labelClose: labelClose, labelAdditional: labelClearAll, isOpen: openFilters },
157
157
  React.createElement(Aligment, { direction: "column", align: 'flex-end' },
158
158
  React.createElement(FiltersArea, null, filters.map((filter) => (React.createElement(FilterSection, null,
159
159
  React.createElement(Aligment, { wrap: "nowrap" },
@@ -13,6 +13,7 @@ export const Form = ({ formData, size = 'medium', read }) => {
13
13
  };
14
14
  const onIntChangeHandler = (name, value) => {
15
15
  let valueString = value;
16
+ console.log('onIntChangeHandler', valueString);
16
17
  if (valueString.length > 0) {
17
18
  const modify = valueString
18
19
  .replaceAll(',', '.')
@@ -1,32 +1,38 @@
1
- import React, { useState } from 'react';
1
+ import React, { useCallback, useState } from 'react';
2
2
  import { ThemeProvider } from 'styled-components';
3
3
  import { Aligment } from '../Aligment';
4
4
  import { InputTextElement, InputLabelElement, InputErrorMsg, InputWrapper, EyeIconWrapper, IconsWrapper, InputReadOnlyElement, Prefix, } from './Input.styles';
5
5
  import { Icon } from '../Icons';
6
6
  import { mainTheme } from '../../Theme';
7
+ import { debounce } from 'lodash';
7
8
  export const Input = ({ label, labelPosition = 'top', value, type = 'text', name, disabled = false, size = 'medium', handleChange, handleSubmit, width, error = false, errorMsg, placeholder, min, max, step = 0.1, autoFocus, theme = mainTheme, readOnly = false, prefix, }) => {
9
+ const [inputValue, setInputValue] = useState(value);
8
10
  const calculateNumberValue = (numberValue) => {
9
11
  return isNaN(parseFloat(numberValue))
10
12
  ? numberValue
11
13
  : parseFloat(numberValue);
12
14
  };
15
+ const debouncedHandleChange = useCallback(debounce((name, value) => {
16
+ handleChange(name, value);
17
+ }, 300), [handleChange]);
13
18
  const onChange = (e) => {
14
19
  let returnedValue = type === 'number' || type === 'increase'
15
20
  ? calculateNumberValue(e.target.value)
16
21
  : e.target.value.toString();
17
- handleChange(name, returnedValue);
22
+ setInputValue(returnedValue);
23
+ debouncedHandleChange(name, inputValue);
18
24
  };
19
25
  const onBlurValidation = () => {
20
26
  if (type === 'number' || type === 'increase') {
21
- let validateValue = value;
27
+ let validateValue = inputValue;
22
28
  if (isNaN(parseFloat(validateValue.toString()))) {
23
29
  validateValue = min !== undefined ? min : 0;
24
30
  }
25
- if (typeof value === 'number') {
26
- if (min !== undefined && value < min) {
31
+ if (typeof inputValue === 'number') {
32
+ if (min !== undefined && inputValue < min) {
27
33
  validateValue = min;
28
34
  }
29
- else if (max !== undefined && value > max) {
35
+ else if (max !== undefined && inputValue > max) {
30
36
  validateValue = max;
31
37
  }
32
38
  }
@@ -60,18 +66,17 @@ export const Input = ({ label, labelPosition = 'top', value, type = 'text', name
60
66
  }
61
67
  handleChange(name, newValue);
62
68
  };
63
- // ${Theme.fontSize.m}/
64
69
  return (React.createElement(ThemeProvider, { theme: theme },
65
70
  React.createElement(Aligment, { align: labelPosition === 'top' ? 'flex-start' : 'center', direction: labelPosition === 'top' ? 'column' : 'row', wrap: 'nowrap' },
66
71
  label && (React.createElement(InputLabelElement, { size: size, labelPosition: labelPosition }, label)),
67
72
  React.createElement(InputWrapper, { width: width },
68
73
  React.createElement(React.Fragment, null, readOnly ? (React.createElement(InputReadOnlyElement, { inputSize: size }, inputType === 'password' ? '******' : value)) : (React.createElement(React.Fragment, null,
69
- React.createElement(InputTextElement, { autoFocus: autoFocus, inputSize: size, type: showPassword ? 'text' : inputType, disabled: disabled, name: name, value: value, onChange: onChange, onKeyDown: onKeyDown, onBlur: onBlurValidation, error: error, placeholder: placeholder, min: min, max: max, step: step, prefix: prefix }),
74
+ React.createElement(InputTextElement, { autoFocus: autoFocus, inputSize: size, type: showPassword ? 'text' : inputType, disabled: disabled, name: name, value: inputValue, onChange: onChange, onKeyDown: onKeyDown, onBlur: onBlurValidation, error: error, placeholder: placeholder, min: min, max: max, step: step, prefix: prefix }),
70
75
  prefix && React.createElement(Prefix, { inputSize: size }, prefix),
71
76
  inputType === 'password' && (React.createElement(EyeIconWrapper, { size: size },
72
77
  React.createElement(Icon, { name: showPassword ? 'visability_off' : 'visibility', size: 24, onClick: tooglePassword, iconColor: theme.inputDefaultTextColor, iconBgHoverColor: "transparent" }))),
73
78
  type === 'increase' && (React.createElement(IconsWrapper, null,
74
- React.createElement(Icon, { name: "add", size: size === 'small' ? 16 : 24, onClick: () => increaseValue(value), iconColor: theme.inputDefaultTextColor }),
75
- React.createElement(Icon, { name: "remove", size: size === 'small' ? 16 : 24, onClick: () => decreaseValue(value), iconColor: theme.inputDefaultTextColor }))),
76
- (error && errorMsg) && React.createElement(InputErrorMsg, null, errorMsg))))))));
79
+ React.createElement(Icon, { name: "add", size: size === 'small' ? 16 : 24, onClick: () => increaseValue(inputValue), iconColor: theme.inputDefaultTextColor }),
80
+ React.createElement(Icon, { name: "remove", size: size === 'small' ? 16 : 24, onClick: () => decreaseValue(inputValue), iconColor: theme.inputDefaultTextColor }))),
81
+ error && errorMsg && React.createElement(InputErrorMsg, null, errorMsg))))))));
77
82
  };
@@ -1,11 +1,24 @@
1
- import React from 'react';
1
+ import React, { useEffect } from 'react';
2
2
  import { ElementHeader } from '../ElementHeader';
3
3
  import { mainTheme } from '../../Theme/Theme';
4
4
  import { ScrollCotainer } from '../common';
5
5
  import { ModalElement, ModalOverlayer } from './Modal.styles';
6
6
  import { ThemeProvider } from 'styled-components';
7
7
  import { ButtonsFooter } from '../ButtonsFooter';
8
- export const Modal = ({ theme = mainTheme, children, title, handleConfirm, handleClose, handleAdditional, labelConfirm, labelClose = 'Cancel', labelAdditional, submitDisabled, size = 'small', submitLoader = false, additionalType = 'button', additionalValue = false, headerDivader = false, additionaNormalMode = false }) => {
8
+ export const Modal = ({ isOpen, theme = mainTheme, children, title, handleConfirm, handleClose, handleAdditional, labelConfirm, labelClose = 'Cancel', labelAdditional, submitDisabled, size = 'small', submitLoader = false, additionalType = 'button', additionalValue = false, headerDivader = false, additionaNormalMode = false, exitOnEsc = false }) => {
9
+ useEffect(() => {
10
+ const handleKeyDown = (e) => {
11
+ if (e.key === 'Escape') {
12
+ handleClose();
13
+ }
14
+ };
15
+ if (isOpen && exitOnEsc) {
16
+ document.addEventListener('keydown', handleKeyDown);
17
+ }
18
+ return () => {
19
+ document.removeEventListener('keydown', handleKeyDown);
20
+ };
21
+ }, [isOpen]);
9
22
  return (React.createElement(ThemeProvider, { theme: theme },
10
23
  React.createElement(ModalOverlayer, null,
11
24
  React.createElement(ModalElement, { size: size },
@@ -24,6 +24,6 @@ export const Selector = ({ theme = mainTheme, label, labelPosition = 'top', size
24
24
  value ? (React.createElement(React.Fragment, null,
25
25
  React.createElement(SelectorValue, { onClick: () => toogleOpen(true), size: size }, getLabelForValue(value)),
26
26
  React.createElement(Icon, { name: 'close', onClick: () => handleClear(), size: setIconSize(size) }))) : (React.createElement(Icon, { name: iconName, onClick: () => toogleOpen(true), size: setIconSize(size) })),
27
- open && (React.createElement(Modal, { title: optionsPanelTitle, labelClose: "Close", handleClose: () => toogleOpen(false) }, options?.length > 0 ? (options.map((option) => (React.createElement(PanelOption, { key: option.value, active: option.value === value, onClick: () => selectOption(option.value) }, option.label)))) : (React.createElement(Text, null, optionsPanelEmptyMsg)))),
27
+ open && (React.createElement(Modal, { title: optionsPanelTitle, labelClose: "Close", handleClose: () => toogleOpen(false), isOpen: open, exitOnEsc: true }, options?.length > 0 ? (options.map((option) => (React.createElement(PanelOption, { key: option.value, active: option.value === value, onClick: () => selectOption(option.value) }, option.label)))) : (React.createElement(Text, null, optionsPanelEmptyMsg)))),
28
28
  error && React.createElement(InputErrorMsg, null, error)))));
29
29
  };
@@ -12,9 +12,16 @@ export const Sidepanel = ({ isOpen, handleClose, children, right = false, overla
12
12
  handleClose && handleClose();
13
13
  }
14
14
  };
15
+ const handleKeyDown = (e) => {
16
+ if (e.key === 'Escape') {
17
+ handleClose && handleClose();
18
+ }
19
+ };
15
20
  document.addEventListener('click', handleClickOutside, true);
21
+ document.addEventListener('keydown', handleKeyDown);
16
22
  return () => {
17
23
  document.removeEventListener('click', handleClickOutside, true);
24
+ document.removeEventListener('keydown', handleKeyDown);
18
25
  };
19
26
  }, [isOpen]);
20
27
  const modalRoot = document.getElementById('root');
@@ -1,5 +1,6 @@
1
1
  import React, { FC } from 'react';
2
2
  export interface IModalProps {
3
+ isOpen: boolean;
3
4
  theme?: any;
4
5
  children: React.ReactNode;
5
6
  title?: string;
@@ -16,5 +17,6 @@ export interface IModalProps {
16
17
  additionalValue?: boolean;
17
18
  headerDivader?: boolean;
18
19
  additionaNormalMode?: boolean;
20
+ exitOnEsc?: boolean;
19
21
  }
20
22
  export declare const Modal: FC<IModalProps>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "venice-ui",
3
- "version": "2.1.4",
3
+ "version": "2.1.6",
4
4
  "description": "Component library",
5
5
  "main": "index.js",
6
6
  "module": "./dist/esm/index.js",
@@ -80,6 +80,7 @@
80
80
  "date-fns": "^2.30.0",
81
81
  "ftp-deploy": "^2.4.4",
82
82
  "lodash": "^4.17.21",
83
+ "lodash.debounce": "^4.0.8",
83
84
  "polished": "^4.2.2",
84
85
  "react-docgen-typescript-plugin": "^1.0.5",
85
86
  "styled-components": "^5.3.10"