venice-ui 2.1.2 → 2.1.5

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.
@@ -100,6 +100,7 @@ exports.mainTheme = {
100
100
  contentBackground: exports.Theme.colors.white,
101
101
  // selector / dropdown
102
102
  optionActiveColor: exports.Theme.colors.primary,
103
+ optionColor: exports.Theme.colors.text,
103
104
  optionHoverBackground: (0, polished_1.lighten)(0.3, exports.Theme.colors.primary),
104
105
  //table
105
106
  tableBorderColor: exports.Theme.colors.gray_3,
@@ -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;
@@ -32,7 +32,7 @@ const DropdownMenu_styles_1 = require("./DropdownMenu.styles");
32
32
  const Aligment_1 = require("../Aligment");
33
33
  const Typography_1 = require("../Typography");
34
34
  const react_dom_1 = require("react-dom");
35
- const DropdownMenu = ({ size = 'medium', iconName = 'more_vert', header = false, headerTitle, headerSubtitle, footer = false, footerText, footerAction, options, right = false, left = false, targetID, iconColor = Theme_1.mainTheme.iconColor, iconHoverColor = Theme_1.mainTheme.iconHoverColor, iconBgColor = Theme_1.mainTheme.iconBgColor, iconBgHoverColor = Theme_1.mainTheme.iconBgHoverColor, position = 'left', zIndex, textMode = false, label = '', }) => {
35
+ const DropdownMenu = ({ size = 'medium', iconName = 'more_vert', header = false, headerTitle, headerSubtitle, footer = false, footerText, footerAction, options, right = false, left = false, targetID, iconColor = Theme_1.mainTheme.iconColor, iconHoverColor = Theme_1.mainTheme.iconHoverColor, iconBgColor = Theme_1.mainTheme.iconBgColor, iconBgHoverColor = Theme_1.mainTheme.iconBgHoverColor, position = 'left', zIndex, textMode = false, label = '', isTextActive = false }) => {
36
36
  const [open, toogleOpen] = (0, react_1.useState)(false);
37
37
  const ref = (0, react_1.useRef)(null);
38
38
  const sourceRef = (0, react_1.useRef)(null);
@@ -89,19 +89,28 @@ 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
  }
101
110
  };
102
111
  }, [open]);
103
112
  return (react_1.default.createElement(DropdownMenu_styles_1.DropdownMenuElement, null,
104
- react_1.default.createElement("div", { ref: sourceRef, onClick: () => toogle(!open) }, textMode ? (react_1.default.createElement(DropdownMenu_styles_1.DropdownMenuLabel, { size: size }, label)) : (react_1.default.createElement(Icons_1.Icon, { name: iconName, size: (0, common_1.setIconSize)(size), isActive: open, right: right, left: left, iconColor: iconColor, iconHoverColor: iconHoverColor, iconBgColor: iconBgColor, iconBgHoverColor: iconBgHoverColor }))),
113
+ react_1.default.createElement("div", { ref: sourceRef, onClick: () => toogle(!open) }, textMode ? (react_1.default.createElement(DropdownMenu_styles_1.DropdownMenuLabel, { size: size, isActive: isTextActive }, label)) : (react_1.default.createElement(Icons_1.Icon, { name: iconName, size: (0, common_1.setIconSize)(size), isActive: open, right: right, left: left, iconColor: iconColor, iconHoverColor: iconHoverColor, iconBgColor: iconBgColor, iconBgHoverColor: iconBgHoverColor }))),
105
114
  open &&
106
115
  (0, react_dom_1.createPortal)(react_1.default.createElement(common_1.Panel, { style: dropdownStyles, ref: ref, size: size, zIndex: zIndex },
107
116
  react_1.default.createElement(Aligment_1.Aligment, { direction: "column" },
@@ -109,7 +118,7 @@ const DropdownMenu = ({ size = 'medium', iconName = 'more_vert', header = false,
109
118
  headerTitle && (react_1.default.createElement(Typography_1.TextAccent, { color: Theme_1.Theme.colors.text }, headerTitle)),
110
119
  headerSubtitle && (react_1.default.createElement(Typography_1.TextLabel, { color: Theme_1.Theme.colors.text }, headerSubtitle)))),
111
120
  react_1.default.createElement(DropdownMenu_styles_1.DropdownMenuContent, null, options &&
112
- options.map((option) => (react_1.default.createElement(DropdownMenu_styles_1.DropdownMenuOption, { key: option.label, isDisable: isDisable(option.disableID), onClick: () => handleClick(option.action, option.disableID) }, option.label)))),
121
+ options.map((option) => (react_1.default.createElement(DropdownMenu_styles_1.DropdownMenuOption, { key: option.label, isDisable: isDisable(option.disableID), onClick: () => handleClick(option.action, option.disableID), isActive: option.isActive }, option.label)))),
113
122
  footer && (react_1.default.createElement(DropdownMenu_styles_1.DropdownMenuFooter, null, footerText && (react_1.default.createElement(Typography_1.Text, { action: true, onClick: handleFooterAction }, footerText)))))), document.body)));
114
123
  };
115
124
  exports.DropdownMenu = DropdownMenu;
@@ -37,7 +37,11 @@ exports.DropdownMenuOption = styled_components_1.default.div `
37
37
  min-width: 80px;
38
38
  cursor: ${(p) => (p.isDisable ? 'not-allowed' : 'pointer')};
39
39
  white-space: nowrap;
40
- color: ${(p) => (p.isDisable ? Theme_1.Theme.colors.gray_1 : Theme_1.Theme.colors.text)};
40
+ color: ${(p) => p.isActive
41
+ ? Theme_1.Theme.colors.primary
42
+ : p.isDisable
43
+ ? Theme_1.Theme.colors.gray_1
44
+ : Theme_1.Theme.colors.text};
41
45
  font-size: 16px;
42
46
  :hover {
43
47
  background-color: ${(p) => p.isDisable ? Theme_1.Theme.colors.gray_4 : (0, polished_1.lighten)(0.4, Theme_1.Theme.colors.primary)};
@@ -45,6 +49,6 @@ exports.DropdownMenuOption = styled_components_1.default.div `
45
49
  `;
46
50
  exports.DropdownMenuLabel = styled_components_1.default.div `
47
51
  display: flex;
48
- ${(p) => (0, common_1.setSize)(p.size)}
49
- color:${p => p.theme.optionActiveColor};
52
+ ${(p) => (0, common_1.setSize)(p.size)};
53
+ color:${(p) => p.isActive ? Theme_1.Theme.colors.primary : p.theme.optionColor};
50
54
  `;
@@ -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" },
@@ -30,17 +30,23 @@ 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, setInputValue);
44
50
  };
45
51
  const onBlurValidation = () => {
46
52
  if (type === 'number' || type === 'increase') {
@@ -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');
@@ -97,6 +97,7 @@ export const mainTheme = {
97
97
  contentBackground: Theme.colors.white,
98
98
  // selector / dropdown
99
99
  optionActiveColor: Theme.colors.primary,
100
+ optionColor: Theme.colors.text,
100
101
  optionHoverBackground: lighten(0.3, Theme.colors.primary),
101
102
  //table
102
103
  tableBorderColor: Theme.colors.gray_3,
@@ -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
  };
@@ -6,7 +6,7 @@ import { DropdownMenuOption, DropdownMenuElement, DropdownMenuContent, DropdownM
6
6
  import { Aligment } from '../Aligment';
7
7
  import { TextAccent, TextLabel, Text } from '../Typography';
8
8
  import { createPortal } from 'react-dom';
9
- export const DropdownMenu = ({ size = 'medium', iconName = 'more_vert', header = false, headerTitle, headerSubtitle, footer = false, footerText, footerAction, options, right = false, left = false, targetID, iconColor = mainTheme.iconColor, iconHoverColor = mainTheme.iconHoverColor, iconBgColor = mainTheme.iconBgColor, iconBgHoverColor = mainTheme.iconBgHoverColor, position = 'left', zIndex, textMode = false, label = '', }) => {
9
+ export const DropdownMenu = ({ size = 'medium', iconName = 'more_vert', header = false, headerTitle, headerSubtitle, footer = false, footerText, footerAction, options, right = false, left = false, targetID, iconColor = mainTheme.iconColor, iconHoverColor = mainTheme.iconHoverColor, iconBgColor = mainTheme.iconBgColor, iconBgHoverColor = mainTheme.iconBgHoverColor, position = 'left', zIndex, textMode = false, label = '', isTextActive = false }) => {
10
10
  const [open, toogleOpen] = useState(false);
11
11
  const ref = useRef(null);
12
12
  const sourceRef = useRef(null);
@@ -63,19 +63,28 @@ 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
  }
75
84
  };
76
85
  }, [open]);
77
86
  return (React.createElement(DropdownMenuElement, null,
78
- React.createElement("div", { ref: sourceRef, onClick: () => toogle(!open) }, textMode ? (React.createElement(DropdownMenuLabel, { size: size }, label)) : (React.createElement(Icon, { name: iconName, size: setIconSize(size), isActive: open, right: right, left: left, iconColor: iconColor, iconHoverColor: iconHoverColor, iconBgColor: iconBgColor, iconBgHoverColor: iconBgHoverColor }))),
87
+ React.createElement("div", { ref: sourceRef, onClick: () => toogle(!open) }, textMode ? (React.createElement(DropdownMenuLabel, { size: size, isActive: isTextActive }, label)) : (React.createElement(Icon, { name: iconName, size: setIconSize(size), isActive: open, right: right, left: left, iconColor: iconColor, iconHoverColor: iconHoverColor, iconBgColor: iconBgColor, iconBgHoverColor: iconBgHoverColor }))),
79
88
  open &&
80
89
  createPortal(React.createElement(Panel, { style: dropdownStyles, ref: ref, size: size, zIndex: zIndex },
81
90
  React.createElement(Aligment, { direction: "column" },
@@ -83,6 +92,6 @@ export const DropdownMenu = ({ size = 'medium', iconName = 'more_vert', header =
83
92
  headerTitle && (React.createElement(TextAccent, { color: Theme.colors.text }, headerTitle)),
84
93
  headerSubtitle && (React.createElement(TextLabel, { color: Theme.colors.text }, headerSubtitle)))),
85
94
  React.createElement(DropdownMenuContent, null, options &&
86
- options.map((option) => (React.createElement(DropdownMenuOption, { key: option.label, isDisable: isDisable(option.disableID), onClick: () => handleClick(option.action, option.disableID) }, option.label)))),
95
+ options.map((option) => (React.createElement(DropdownMenuOption, { key: option.label, isDisable: isDisable(option.disableID), onClick: () => handleClick(option.action, option.disableID), isActive: option.isActive }, option.label)))),
87
96
  footer && (React.createElement(DropdownMenuFooter, null, footerText && (React.createElement(Text, { action: true, onClick: handleFooterAction }, footerText)))))), document.body)));
88
97
  };
@@ -31,7 +31,11 @@ export const DropdownMenuOption = styled.div `
31
31
  min-width: 80px;
32
32
  cursor: ${(p) => (p.isDisable ? 'not-allowed' : 'pointer')};
33
33
  white-space: nowrap;
34
- color: ${(p) => (p.isDisable ? Theme.colors.gray_1 : Theme.colors.text)};
34
+ color: ${(p) => p.isActive
35
+ ? Theme.colors.primary
36
+ : p.isDisable
37
+ ? Theme.colors.gray_1
38
+ : Theme.colors.text};
35
39
  font-size: 16px;
36
40
  :hover {
37
41
  background-color: ${(p) => p.isDisable ? Theme.colors.gray_4 : lighten(0.4, Theme.colors.primary)};
@@ -39,6 +43,6 @@ export const DropdownMenuOption = styled.div `
39
43
  `;
40
44
  export const DropdownMenuLabel = styled.div `
41
45
  display: flex;
42
- ${(p) => setSize(p.size)}
43
- color:${p => p.theme.optionActiveColor};
46
+ ${(p) => setSize(p.size)};
47
+ color:${(p) => p.isActive ? Theme.colors.primary : p.theme.optionColor};
44
48
  `;
@@ -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" },
@@ -1,20 +1,26 @@
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, setInputValue);
18
24
  };
19
25
  const onBlurValidation = () => {
20
26
  if (type === 'number' || type === 'increase') {
@@ -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');
@@ -90,6 +90,7 @@ export declare const mainTheme: {
90
90
  inputErrorTextColor: string;
91
91
  contentBackground: string;
92
92
  optionActiveColor: string;
93
+ optionColor: string;
93
94
  optionHoverBackground: string;
94
95
  tableBorderColor: string;
95
96
  tableHeaderBackground: string;
@@ -21,6 +21,7 @@ interface IDropdownMenuProps {
21
21
  zIndex?: number;
22
22
  textMode?: boolean;
23
23
  label?: string;
24
+ isTextActive?: boolean;
24
25
  }
25
26
  export declare const DropdownMenu: FC<IDropdownMenuProps>;
26
27
  export {};
@@ -6,11 +6,13 @@ export declare const DropdownMenuContent: import("styled-components").StyledComp
6
6
  interface IPanelOptionStyle {
7
7
  onClick?: any;
8
8
  isDisable: boolean;
9
+ isActive?: boolean;
9
10
  }
10
11
  export declare const DropdownMenuOption: import("styled-components").StyledComponent<"div", any, IPanelOptionStyle, never>;
11
12
  interface IDropdownMenuLabel {
12
13
  size: InputSize;
13
14
  theme: any;
15
+ isActive?: boolean;
14
16
  }
15
17
  export declare const DropdownMenuLabel: import("styled-components").StyledComponent<"div", any, IDropdownMenuLabel, never>;
16
18
  export {};
@@ -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>;
@@ -6,6 +6,7 @@ export interface IAction {
6
6
  action: (id?: string) => void;
7
7
  label: string | number;
8
8
  disableID?: string;
9
+ isActive?: boolean;
9
10
  }
10
11
  export interface IIconsActions {
11
12
  iconName: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "venice-ui",
3
- "version": "2.1.2",
3
+ "version": "2.1.5",
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"