venice-ui 2.4.8 → 2.4.10
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/dist/cjs/components/DatePicker/Calendar.js +21 -1
- package/dist/cjs/components/Dropdown/Dropdown.js +6 -2
- package/dist/cjs/components/Form/Form.js +5 -5
- package/dist/cjs/components/Input/Input.js +6 -2
- package/dist/cjs/components/List/List.js +1 -1
- package/dist/cjs/components/Table/Table.js +7 -1
- package/dist/cjs/components/common/commonComponents.js +6 -0
- package/dist/esm/components/DatePicker/Calendar.js +22 -2
- package/dist/esm/components/Dropdown/Dropdown.js +6 -2
- package/dist/esm/components/Form/Form.js +5 -5
- package/dist/esm/components/Input/Input.js +6 -2
- package/dist/esm/components/List/List.js +1 -1
- package/dist/esm/components/Table/Table.js +8 -2
- package/dist/esm/components/common/commonComponents.js +6 -0
- package/dist/types/components/Dropdown/Dropdown.d.ts +3 -0
- package/dist/types/components/Form/Form.d.ts +2 -0
- package/dist/types/components/Input/Input.d.ts +2 -0
- package/dist/types/components/common/commonComponents.d.ts +2 -1
- package/package.json +1 -1
|
@@ -65,6 +65,7 @@ const Calendar = ({ value, top, left, size, handleClose, handleSelect, isAdvance
|
|
|
65
65
|
};
|
|
66
66
|
});
|
|
67
67
|
const [selectedDate, setSellectedDate] = (0, react_1.useState)(() => (value !== undefined ? new Date(value) : new Date()));
|
|
68
|
+
const wrapperRef = (0, react_1.useRef)(null);
|
|
68
69
|
(0, react_1.useEffect)(() => {
|
|
69
70
|
updateCalendarSettings((prev) => ({
|
|
70
71
|
...prev,
|
|
@@ -103,8 +104,27 @@ const Calendar = ({ value, top, left, size, handleClose, handleSelect, isAdvance
|
|
|
103
104
|
const setToday = () => {
|
|
104
105
|
setSellectedDate(new Date());
|
|
105
106
|
};
|
|
107
|
+
(0, react_1.useEffect)(() => {
|
|
108
|
+
const handleOutside = (e) => {
|
|
109
|
+
const el = wrapperRef.current;
|
|
110
|
+
const target = e.target;
|
|
111
|
+
if (!el)
|
|
112
|
+
return;
|
|
113
|
+
const path = e.composedPath ? e.composedPath() : undefined;
|
|
114
|
+
const clickedOutside = path ? !path.includes(el) : !el.contains(target);
|
|
115
|
+
if (clickedOutside && !isAdvance) {
|
|
116
|
+
handleClose && handleClose();
|
|
117
|
+
}
|
|
118
|
+
};
|
|
119
|
+
document.addEventListener('mousedown', handleOutside);
|
|
120
|
+
document.addEventListener('touchstart', handleOutside);
|
|
121
|
+
return () => {
|
|
122
|
+
document.removeEventListener('mousedown', handleOutside);
|
|
123
|
+
document.removeEventListener('touchstart', handleOutside);
|
|
124
|
+
};
|
|
125
|
+
}, [isAdvance, handleClose]);
|
|
106
126
|
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
107
|
-
react_1.default.createElement(DatePiocker_styles_1.CalendarWrapper, { top: top, left: left, size: size, zIndex: zIndex },
|
|
127
|
+
react_1.default.createElement(DatePiocker_styles_1.CalendarWrapper, { ref: wrapperRef, top: top, left: left, size: size, zIndex: zIndex },
|
|
108
128
|
react_1.default.createElement(Aligment_1.Aligment, { direction: "row" },
|
|
109
129
|
react_1.default.createElement(CalendarHeader_1.CalendarHeader, { mode: calendarSettings.mode, date: calendarSettings.date, yearsScope: calendarSettings.yearsScope, handleChange: setPeriod, handleSelect: setMode, localeLabels: effectiveLocale }),
|
|
110
130
|
react_1.default.createElement(CalendarContent_1.CalendarContent, { date: calendarSettings.date, mode: calendarSettings.mode, handleChange: setNewDate, changeMode: setMode, yearsScope: calendarSettings.yearsScope, localeLabels: effectiveLocale }),
|
|
@@ -33,7 +33,7 @@ const common_1 = require("../common");
|
|
|
33
33
|
const react_dom_1 = require("react-dom");
|
|
34
34
|
const Icons_1 = require("../Icons");
|
|
35
35
|
const Theme_1 = require("../../Theme");
|
|
36
|
-
const Dropdown = ({ size = 'medium', label, labelPosition = 'top', disabled = false, error, errorMsg, width, options, value, placeholder = 'Please select', name, handleSelect, position = 'left', zIndex, readOnly = false, theme = Theme_1.mainTheme, }) => {
|
|
36
|
+
const Dropdown = ({ size = 'medium', label, labelPosition = 'top', disabled = false, error, errorMsg, width, options, value, placeholder = 'Please select', name, handleSelect, position = 'left', zIndex, maxHeight, readOnly = false, theme = Theme_1.mainTheme, handleFieldFocus, handleFieldBlur, }) => {
|
|
37
37
|
const [open, toogleOpen] = (0, react_1.useState)(false);
|
|
38
38
|
const ref = (0, react_1.useRef)(null);
|
|
39
39
|
const sourceRef = (0, react_1.useRef)(null);
|
|
@@ -60,6 +60,7 @@ const Dropdown = ({ size = 'medium', label, labelPosition = 'top', disabled = fa
|
|
|
60
60
|
setDropdownStyles(positionStyle);
|
|
61
61
|
}
|
|
62
62
|
toogleOpen(!open);
|
|
63
|
+
handleFieldFocus && handleFieldFocus(name);
|
|
63
64
|
}
|
|
64
65
|
};
|
|
65
66
|
const selectOption = (e, selectedValue, isDisabled) => {
|
|
@@ -67,17 +68,20 @@ const Dropdown = ({ size = 'medium', label, labelPosition = 'top', disabled = fa
|
|
|
67
68
|
if (!isDisabled) {
|
|
68
69
|
handleSelect(name, selectedValue);
|
|
69
70
|
toogleOpen(false);
|
|
71
|
+
handleFieldBlur && handleFieldBlur();
|
|
70
72
|
}
|
|
71
73
|
};
|
|
72
74
|
(0, react_1.useEffect)(() => {
|
|
73
75
|
const handleClickOutside = (event) => {
|
|
74
76
|
if (ref.current && !ref.current.contains(event.target)) {
|
|
75
77
|
toogleOpen(false);
|
|
78
|
+
handleFieldBlur && handleFieldBlur();
|
|
76
79
|
}
|
|
77
80
|
};
|
|
78
81
|
const handleKeyDown = (e) => {
|
|
79
82
|
if (e.key === 'Escape') {
|
|
80
83
|
close();
|
|
84
|
+
handleFieldBlur && handleFieldBlur();
|
|
81
85
|
}
|
|
82
86
|
};
|
|
83
87
|
if (open) {
|
|
@@ -96,7 +100,7 @@ const Dropdown = ({ size = 'medium', label, labelPosition = 'top', disabled = fa
|
|
|
96
100
|
react_1.default.createElement(Input_1.EyeIconWrapper, { size: size },
|
|
97
101
|
react_1.default.createElement(Icons_1.Icon, { name: open ? 'arrow_drop_up' : 'arrow_drop_down', size: 24, iconColor: theme.inputDefaultTextColor, iconHoverColor: theme.inputDefaultTextColor, iconBgHoverColor: "transparent" })),
|
|
98
102
|
open &&
|
|
99
|
-
(0, react_dom_1.createPortal)(react_1.default.createElement(common_1.Panel, { style: dropdownStyles, ref: ref, size: size, fullWidth: true, zIndex: zIndex }, options &&
|
|
103
|
+
(0, react_dom_1.createPortal)(react_1.default.createElement(common_1.Panel, { style: dropdownStyles, ref: ref, size: size, fullWidth: true, zIndex: zIndex, maxHeight: maxHeight }, options &&
|
|
100
104
|
options.map((option) => (react_1.default.createElement(common_1.PanelOption, { key: option.value, active: option.value === value, onClick: (e) => selectOption(e, option.value, option.disabled), isDisabled: option.disabled || false }, option.label)))), document.body),
|
|
101
105
|
error && errorMsg && react_1.default.createElement(Input_1.InputErrorMsg, null, errorMsg)))));
|
|
102
106
|
};
|
|
@@ -11,7 +11,7 @@ const FormElements_1 = require("./FormElements");
|
|
|
11
11
|
const Dropdown_1 = require("../Dropdown");
|
|
12
12
|
const DatePicker_1 = require("../DatePicker");
|
|
13
13
|
const FillSelect_1 = require("../FillSelect");
|
|
14
|
-
const Form = ({ formData, size = 'medium', read }) => {
|
|
14
|
+
const Form = ({ formData, size = 'medium', read, handleFieldFocus, handleFieldBlur, }) => {
|
|
15
15
|
const onChangeHandler = (name, value) => {
|
|
16
16
|
formData.action(name, value);
|
|
17
17
|
};
|
|
@@ -44,13 +44,13 @@ const Form = ({ formData, size = 'medium', read }) => {
|
|
|
44
44
|
const selectType = (item) => {
|
|
45
45
|
switch (item.type) {
|
|
46
46
|
case 'text':
|
|
47
|
-
return (react_1.default.createElement(Input_1.Input, { label: item.label, value: item.value, name: item.name, type: "text", size: size, handleChange: onChangeHandler, readOnly: read, autoFocus: !!item.isDisabled && item.autofocus, handleSubmit: item.submit, disabled: item.isDisabled, error: item.error }));
|
|
47
|
+
return (react_1.default.createElement(Input_1.Input, { label: item.label, value: item.value, name: item.name, type: "text", size: size, handleChange: onChangeHandler, readOnly: read, autoFocus: !!item.isDisabled && item.autofocus, handleSubmit: item.submit, disabled: item.isDisabled, error: item.error, handleFieldFocus: handleFieldFocus, handleFieldBlur: handleFieldBlur }));
|
|
48
48
|
case 'number':
|
|
49
|
-
return (react_1.default.createElement(Input_1.Input, { label: item.label, value: item.value, name: item.name, type: "number", size: size, min: item.min, max: item.max, step: item.step, handleChange: onIntChangeHandler, readOnly: read, autoFocus: !!item.isDisabled && item.autofocus, handleSubmit: item.submit, disabled: item.isDisabled, error: item.error, placeholder: item.placeholder }));
|
|
49
|
+
return (react_1.default.createElement(Input_1.Input, { label: item.label, value: item.value, name: item.name, type: "number", size: size, min: item.min, max: item.max, step: item.step, handleChange: onIntChangeHandler, readOnly: read, autoFocus: !!item.isDisabled && item.autofocus, handleSubmit: item.submit, disabled: item.isDisabled, error: item.error, placeholder: item.placeholder, handleFieldFocus: handleFieldFocus, handleFieldBlur: handleFieldBlur }));
|
|
50
50
|
case 'increase':
|
|
51
|
-
return (react_1.default.createElement(Input_1.Input, { type: "increase", label: item.label, value: item.value, name: item.name, size: size, handleChange: onIntChangeHandler, min: item.min, max: item.max, step: item.step, readOnly: read, autoFocus: item.autofocus, handleSubmit: item.submit, error: item.error, placeholder: item.placeholder }));
|
|
51
|
+
return (react_1.default.createElement(Input_1.Input, { type: "increase", label: item.label, value: item.value, name: item.name, size: size, handleChange: onIntChangeHandler, min: item.min, max: item.max, step: item.step, readOnly: read, autoFocus: item.autofocus, handleSubmit: item.submit, error: item.error, placeholder: item.placeholder, handleFieldFocus: handleFieldFocus, handleFieldBlur: handleFieldBlur }));
|
|
52
52
|
case 'select':
|
|
53
|
-
return (react_1.default.createElement(Dropdown_1.Dropdown, { options: item.options, handleSelect: onChangeHandler, name: item.name, value: item.value, size: size, label: item.label, position: item.position, zIndex: item.zIndex, readOnly: read, error: item.error, placeholder: item.placeholder }));
|
|
53
|
+
return (react_1.default.createElement(Dropdown_1.Dropdown, { options: item.options, handleSelect: onChangeHandler, name: item.name, value: item.value, size: size, label: item.label, position: item.position, zIndex: item.zIndex, readOnly: read, error: item.error, placeholder: item.placeholder, handleFieldFocus: handleFieldFocus, handleFieldBlur: handleFieldBlur }));
|
|
54
54
|
case 'fill':
|
|
55
55
|
return (react_1.default.createElement(FillSelect_1.FillSelect, { options: item.options, handleSelect: onChangeHandler, handleAddToScope: item.handleAddToScope, name: item.name, value: item.value, size: size, label: item.label, position: item.position, zIndex: item.zIndex, readOnly: read, error: item.error, placeholder: item.placeholder }));
|
|
56
56
|
case 'file':
|
|
@@ -30,7 +30,7 @@ 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 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, }) => {
|
|
33
|
+
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, handleFieldFocus, handleFieldBlur, }) => {
|
|
34
34
|
const [inputValue, setInputValue] = (0, react_1.useState)(value);
|
|
35
35
|
(0, react_1.useEffect)(() => {
|
|
36
36
|
setInputValue(value);
|
|
@@ -61,9 +61,13 @@ const Input = ({ label, labelPosition = 'top', value, type = 'text', name, disab
|
|
|
61
61
|
validateValue = max;
|
|
62
62
|
}
|
|
63
63
|
}
|
|
64
|
+
handleFieldBlur && handleFieldBlur();
|
|
64
65
|
handleChange(name, validateValue);
|
|
65
66
|
}
|
|
66
67
|
};
|
|
68
|
+
const onFocus = () => {
|
|
69
|
+
handleFieldFocus && handleFieldFocus(name);
|
|
70
|
+
};
|
|
67
71
|
const onKeyDown = async (e) => {
|
|
68
72
|
if (handleSubmit && e.key === 'Enter') {
|
|
69
73
|
const currentValue = type === 'number' || type === 'increase'
|
|
@@ -100,7 +104,7 @@ const Input = ({ label, labelPosition = 'top', value, type = 'text', name, disab
|
|
|
100
104
|
label && (react_1.default.createElement(Input_styles_1.InputLabelElement, { size: size, labelPosition: labelPosition }, label)),
|
|
101
105
|
react_1.default.createElement(Input_styles_1.InputWrapper, { width: width },
|
|
102
106
|
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,
|
|
103
|
-
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 }),
|
|
107
|
+
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, onFocus: onFocus, error: error, placeholder: placeholder, min: min, max: max, step: step, prefix: prefix }),
|
|
104
108
|
prefix && react_1.default.createElement(Input_styles_1.Prefix, { inputSize: size }, prefix),
|
|
105
109
|
inputType === 'password' && (react_1.default.createElement(Input_styles_1.EyeIconWrapper, { size: size },
|
|
106
110
|
react_1.default.createElement(Icons_1.Icon, { name: showPassword ? 'visability_off' : 'visibility', size: 24, onClick: tooglePassword, iconColor: theme.inputDefaultTextColor, iconBgHoverColor: "transparent" }))),
|
|
@@ -101,7 +101,7 @@ const List = ({ isCheckbox = false, isCollapsable = false, isSelectable = false,
|
|
|
101
101
|
const rowHaveStatus = row.statusDone || row.statusError || row.statusWarnning;
|
|
102
102
|
return (react_1.default.createElement(react_1.default.Fragment, null,
|
|
103
103
|
react_1.default.createElement(list_styles_1.ListRow, { key: row.id, level: level, selected: isSelectable && selected ? selected === row.id : false, action: isCheckbox || isSelectable, isExtend: row.extend || false, onClick: (e) => handleRowClick(row, e) },
|
|
104
|
-
isCollapsable && (react_1.default.createElement(list_styles_1.ListIconWrapper, { extend: row.extend || (isStatus && rowHaveStatus) ? true : false, onClick: (e) => {
|
|
104
|
+
isCollapsable && (react_1.default.createElement(list_styles_1.ListIconWrapper, { extend: (row.extend && row.children.length !== 0) || (isStatus && rowHaveStatus) ? true : false, onClick: (e) => {
|
|
105
105
|
e.stopPropagation();
|
|
106
106
|
} },
|
|
107
107
|
row.children.length !== 0 && (react_1.default.createElement(Icons_1.Icon, { name: "arrow_drop_down", size: 20, noPadding: true, onClick: () => showRow(row.id), iconBgHoverColor: "transparent" })),
|
|
@@ -123,6 +123,12 @@ const Table = ({ theme = Theme_1.mainTheme, headers, elements, hover = true, sel
|
|
|
123
123
|
setCurrentPage(1);
|
|
124
124
|
setNoResultsMessage(null);
|
|
125
125
|
}, [elements, setCurrentPage, setNoResultsMessage]);
|
|
126
|
+
const tableElements = (0, react_1.useMemo)(() => {
|
|
127
|
+
if (ifPagination) {
|
|
128
|
+
return paginatedElements;
|
|
129
|
+
}
|
|
130
|
+
return tableProps.elements;
|
|
131
|
+
}, [ifPagination, paginatedElements, tableProps.elements]);
|
|
126
132
|
return (react_1.default.createElement(styled_components_1.ThemeProvider, { theme: theme },
|
|
127
133
|
filtrable && (react_1.default.createElement("div", { style: {
|
|
128
134
|
display: 'flex',
|
|
@@ -141,7 +147,7 @@ const Table = ({ theme = Theme_1.mainTheme, headers, elements, hover = true, sel
|
|
|
141
147
|
react_1.default.createElement(Table_styles_1.TableWrapper, { cellPadding: "0", cellSpacing: "0" },
|
|
142
148
|
react_1.default.createElement(Table_styles_1.TableHead, null,
|
|
143
149
|
react_1.default.createElement(Table_styles_1.TableRow, { hover: false, selectable: false, active: false }, tableProps.headers.map((header) => (react_1.default.createElement(HeaderCell_1.HeaderCell, { key: `header_${header.name}`, header: header, sortable: sortable, handleSort: handleHeaderCellClick, sort: tableProps.sort }))))),
|
|
144
|
-
react_1.default.createElement("tbody", null,
|
|
150
|
+
react_1.default.createElement("tbody", null, tableElements.map((item) => {
|
|
145
151
|
return (react_1.default.createElement(Table_styles_1.TableRow, { key: `table_row_${item.id}`, hover: hover, active: selectedRow === item.id, selectable: selectable, onClick: () => handleRowClick(item.id) }, tableProps.headers.map((header, index) => {
|
|
146
152
|
return (react_1.default.createElement(Cell_1.Cell, { key: `cell_${header.name}_${item.id}`, header: header, moreActions: moreActions, item: item, theme: theme, marked: item.marked && index === 0, isDisabled: item.disabled }));
|
|
147
153
|
})));
|
|
@@ -31,6 +31,12 @@ exports.Panel = styled_components_1.default.div `
|
|
|
31
31
|
border: 1px solid ${Theme_1.Theme.colors.gray_2};
|
|
32
32
|
border-top: none;
|
|
33
33
|
min-width: 30px;
|
|
34
|
+
${(p) => p.maxHeight &&
|
|
35
|
+
`
|
|
36
|
+
max-height: ${p.maxHeight};
|
|
37
|
+
overflow: auto;
|
|
38
|
+
|
|
39
|
+
`}
|
|
34
40
|
`;
|
|
35
41
|
exports.PanelOption = styled_components_1.default.div `
|
|
36
42
|
padding: ${Theme_1.Theme.padding.s} ${Theme_1.Theme.padding.m};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React, { useEffect, useState } from 'react';
|
|
1
|
+
import React, { useEffect, useState, useRef } from 'react';
|
|
2
2
|
import { CalendarOverlay, CalendarWrapper } from './DatePiocker.styles';
|
|
3
3
|
import { Aligment } from '../Aligment';
|
|
4
4
|
import { CalendarHeader } from './CalendarHeader';
|
|
@@ -39,6 +39,7 @@ export const Calendar = ({ value, top, left, size, handleClose, handleSelect, is
|
|
|
39
39
|
};
|
|
40
40
|
});
|
|
41
41
|
const [selectedDate, setSellectedDate] = useState(() => (value !== undefined ? new Date(value) : new Date()));
|
|
42
|
+
const wrapperRef = useRef(null);
|
|
42
43
|
useEffect(() => {
|
|
43
44
|
updateCalendarSettings((prev) => ({
|
|
44
45
|
...prev,
|
|
@@ -77,8 +78,27 @@ export const Calendar = ({ value, top, left, size, handleClose, handleSelect, is
|
|
|
77
78
|
const setToday = () => {
|
|
78
79
|
setSellectedDate(new Date());
|
|
79
80
|
};
|
|
81
|
+
useEffect(() => {
|
|
82
|
+
const handleOutside = (e) => {
|
|
83
|
+
const el = wrapperRef.current;
|
|
84
|
+
const target = e.target;
|
|
85
|
+
if (!el)
|
|
86
|
+
return;
|
|
87
|
+
const path = e.composedPath ? e.composedPath() : undefined;
|
|
88
|
+
const clickedOutside = path ? !path.includes(el) : !el.contains(target);
|
|
89
|
+
if (clickedOutside && !isAdvance) {
|
|
90
|
+
handleClose && handleClose();
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
document.addEventListener('mousedown', handleOutside);
|
|
94
|
+
document.addEventListener('touchstart', handleOutside);
|
|
95
|
+
return () => {
|
|
96
|
+
document.removeEventListener('mousedown', handleOutside);
|
|
97
|
+
document.removeEventListener('touchstart', handleOutside);
|
|
98
|
+
};
|
|
99
|
+
}, [isAdvance, handleClose]);
|
|
80
100
|
return (React.createElement(React.Fragment, null,
|
|
81
|
-
React.createElement(CalendarWrapper, { top: top, left: left, size: size, zIndex: zIndex },
|
|
101
|
+
React.createElement(CalendarWrapper, { ref: wrapperRef, top: top, left: left, size: size, zIndex: zIndex },
|
|
82
102
|
React.createElement(Aligment, { direction: "row" },
|
|
83
103
|
React.createElement(CalendarHeader, { mode: calendarSettings.mode, date: calendarSettings.date, yearsScope: calendarSettings.yearsScope, handleChange: setPeriod, handleSelect: setMode, localeLabels: effectiveLocale }),
|
|
84
104
|
React.createElement(CalendarContent, { date: calendarSettings.date, mode: calendarSettings.mode, handleChange: setNewDate, changeMode: setMode, yearsScope: calendarSettings.yearsScope, localeLabels: effectiveLocale }),
|
|
@@ -7,7 +7,7 @@ import { Panel, PanelOption } from '../common';
|
|
|
7
7
|
import { createPortal } from 'react-dom';
|
|
8
8
|
import { Icon } from '../Icons';
|
|
9
9
|
import { mainTheme } from '../../Theme';
|
|
10
|
-
export const Dropdown = ({ size = 'medium', label, labelPosition = 'top', disabled = false, error, errorMsg, width, options, value, placeholder = 'Please select', name, handleSelect, position = 'left', zIndex, readOnly = false, theme = mainTheme, }) => {
|
|
10
|
+
export const Dropdown = ({ size = 'medium', label, labelPosition = 'top', disabled = false, error, errorMsg, width, options, value, placeholder = 'Please select', name, handleSelect, position = 'left', zIndex, maxHeight, readOnly = false, theme = mainTheme, handleFieldFocus, handleFieldBlur, }) => {
|
|
11
11
|
const [open, toogleOpen] = useState(false);
|
|
12
12
|
const ref = useRef(null);
|
|
13
13
|
const sourceRef = useRef(null);
|
|
@@ -34,6 +34,7 @@ export const Dropdown = ({ size = 'medium', label, labelPosition = 'top', disabl
|
|
|
34
34
|
setDropdownStyles(positionStyle);
|
|
35
35
|
}
|
|
36
36
|
toogleOpen(!open);
|
|
37
|
+
handleFieldFocus && handleFieldFocus(name);
|
|
37
38
|
}
|
|
38
39
|
};
|
|
39
40
|
const selectOption = (e, selectedValue, isDisabled) => {
|
|
@@ -41,17 +42,20 @@ export const Dropdown = ({ size = 'medium', label, labelPosition = 'top', disabl
|
|
|
41
42
|
if (!isDisabled) {
|
|
42
43
|
handleSelect(name, selectedValue);
|
|
43
44
|
toogleOpen(false);
|
|
45
|
+
handleFieldBlur && handleFieldBlur();
|
|
44
46
|
}
|
|
45
47
|
};
|
|
46
48
|
useEffect(() => {
|
|
47
49
|
const handleClickOutside = (event) => {
|
|
48
50
|
if (ref.current && !ref.current.contains(event.target)) {
|
|
49
51
|
toogleOpen(false);
|
|
52
|
+
handleFieldBlur && handleFieldBlur();
|
|
50
53
|
}
|
|
51
54
|
};
|
|
52
55
|
const handleKeyDown = (e) => {
|
|
53
56
|
if (e.key === 'Escape') {
|
|
54
57
|
close();
|
|
58
|
+
handleFieldBlur && handleFieldBlur();
|
|
55
59
|
}
|
|
56
60
|
};
|
|
57
61
|
if (open) {
|
|
@@ -70,7 +74,7 @@ export const Dropdown = ({ size = 'medium', label, labelPosition = 'top', disabl
|
|
|
70
74
|
React.createElement(EyeIconWrapper, { size: size },
|
|
71
75
|
React.createElement(Icon, { name: open ? 'arrow_drop_up' : 'arrow_drop_down', size: 24, iconColor: theme.inputDefaultTextColor, iconHoverColor: theme.inputDefaultTextColor, iconBgHoverColor: "transparent" })),
|
|
72
76
|
open &&
|
|
73
|
-
createPortal(React.createElement(Panel, { style: dropdownStyles, ref: ref, size: size, fullWidth: true, zIndex: zIndex }, options &&
|
|
77
|
+
createPortal(React.createElement(Panel, { style: dropdownStyles, ref: ref, size: size, fullWidth: true, zIndex: zIndex, maxHeight: maxHeight }, options &&
|
|
74
78
|
options.map((option) => (React.createElement(PanelOption, { key: option.value, active: option.value === value, onClick: (e) => selectOption(e, option.value, option.disabled), isDisabled: option.disabled || false }, option.label)))), document.body),
|
|
75
79
|
error && errorMsg && React.createElement(InputErrorMsg, null, errorMsg)))));
|
|
76
80
|
};
|
|
@@ -5,7 +5,7 @@ import { FormRow, FormSubRow, FormWrapper } from './FormElements';
|
|
|
5
5
|
import { Dropdown } from '../Dropdown';
|
|
6
6
|
import { DatePicker } from '../DatePicker';
|
|
7
7
|
import { FillSelect } from '../FillSelect';
|
|
8
|
-
export const Form = ({ formData, size = 'medium', read }) => {
|
|
8
|
+
export const Form = ({ formData, size = 'medium', read, handleFieldFocus, handleFieldBlur, }) => {
|
|
9
9
|
const onChangeHandler = (name, value) => {
|
|
10
10
|
formData.action(name, value);
|
|
11
11
|
};
|
|
@@ -38,13 +38,13 @@ export const Form = ({ formData, size = 'medium', read }) => {
|
|
|
38
38
|
const selectType = (item) => {
|
|
39
39
|
switch (item.type) {
|
|
40
40
|
case 'text':
|
|
41
|
-
return (React.createElement(Input, { label: item.label, value: item.value, name: item.name, type: "text", size: size, handleChange: onChangeHandler, readOnly: read, autoFocus: !!item.isDisabled && item.autofocus, handleSubmit: item.submit, disabled: item.isDisabled, error: item.error }));
|
|
41
|
+
return (React.createElement(Input, { label: item.label, value: item.value, name: item.name, type: "text", size: size, handleChange: onChangeHandler, readOnly: read, autoFocus: !!item.isDisabled && item.autofocus, handleSubmit: item.submit, disabled: item.isDisabled, error: item.error, handleFieldFocus: handleFieldFocus, handleFieldBlur: handleFieldBlur }));
|
|
42
42
|
case 'number':
|
|
43
|
-
return (React.createElement(Input, { label: item.label, value: item.value, name: item.name, type: "number", size: size, min: item.min, max: item.max, step: item.step, handleChange: onIntChangeHandler, readOnly: read, autoFocus: !!item.isDisabled && item.autofocus, handleSubmit: item.submit, disabled: item.isDisabled, error: item.error, placeholder: item.placeholder }));
|
|
43
|
+
return (React.createElement(Input, { label: item.label, value: item.value, name: item.name, type: "number", size: size, min: item.min, max: item.max, step: item.step, handleChange: onIntChangeHandler, readOnly: read, autoFocus: !!item.isDisabled && item.autofocus, handleSubmit: item.submit, disabled: item.isDisabled, error: item.error, placeholder: item.placeholder, handleFieldFocus: handleFieldFocus, handleFieldBlur: handleFieldBlur }));
|
|
44
44
|
case 'increase':
|
|
45
|
-
return (React.createElement(Input, { type: "increase", label: item.label, value: item.value, name: item.name, size: size, handleChange: onIntChangeHandler, min: item.min, max: item.max, step: item.step, readOnly: read, autoFocus: item.autofocus, handleSubmit: item.submit, error: item.error, placeholder: item.placeholder }));
|
|
45
|
+
return (React.createElement(Input, { type: "increase", label: item.label, value: item.value, name: item.name, size: size, handleChange: onIntChangeHandler, min: item.min, max: item.max, step: item.step, readOnly: read, autoFocus: item.autofocus, handleSubmit: item.submit, error: item.error, placeholder: item.placeholder, handleFieldFocus: handleFieldFocus, handleFieldBlur: handleFieldBlur }));
|
|
46
46
|
case 'select':
|
|
47
|
-
return (React.createElement(Dropdown, { options: item.options, handleSelect: onChangeHandler, name: item.name, value: item.value, size: size, label: item.label, position: item.position, zIndex: item.zIndex, readOnly: read, error: item.error, placeholder: item.placeholder }));
|
|
47
|
+
return (React.createElement(Dropdown, { options: item.options, handleSelect: onChangeHandler, name: item.name, value: item.value, size: size, label: item.label, position: item.position, zIndex: item.zIndex, readOnly: read, error: item.error, placeholder: item.placeholder, handleFieldFocus: handleFieldFocus, handleFieldBlur: handleFieldBlur }));
|
|
48
48
|
case 'fill':
|
|
49
49
|
return (React.createElement(FillSelect, { options: item.options, handleSelect: onChangeHandler, handleAddToScope: item.handleAddToScope, name: item.name, value: item.value, size: size, label: item.label, position: item.position, zIndex: item.zIndex, readOnly: read, error: item.error, placeholder: item.placeholder }));
|
|
50
50
|
case 'file':
|
|
@@ -4,7 +4,7 @@ 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
|
-
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, }) => {
|
|
7
|
+
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, handleFieldFocus, handleFieldBlur, }) => {
|
|
8
8
|
const [inputValue, setInputValue] = useState(value);
|
|
9
9
|
useEffect(() => {
|
|
10
10
|
setInputValue(value);
|
|
@@ -35,9 +35,13 @@ export const Input = ({ label, labelPosition = 'top', value, type = 'text', name
|
|
|
35
35
|
validateValue = max;
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
|
+
handleFieldBlur && handleFieldBlur();
|
|
38
39
|
handleChange(name, validateValue);
|
|
39
40
|
}
|
|
40
41
|
};
|
|
42
|
+
const onFocus = () => {
|
|
43
|
+
handleFieldFocus && handleFieldFocus(name);
|
|
44
|
+
};
|
|
41
45
|
const onKeyDown = async (e) => {
|
|
42
46
|
if (handleSubmit && e.key === 'Enter') {
|
|
43
47
|
const currentValue = type === 'number' || type === 'increase'
|
|
@@ -74,7 +78,7 @@ export const Input = ({ label, labelPosition = 'top', value, type = 'text', name
|
|
|
74
78
|
label && (React.createElement(InputLabelElement, { size: size, labelPosition: labelPosition }, label)),
|
|
75
79
|
React.createElement(InputWrapper, { width: width },
|
|
76
80
|
React.createElement(React.Fragment, null, readOnly ? (React.createElement(InputReadOnlyElement, { inputSize: size }, inputType === 'password' ? '******' : value)) : (React.createElement(React.Fragment, null,
|
|
77
|
-
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 }),
|
|
81
|
+
React.createElement(InputTextElement, { autoFocus: autoFocus, inputSize: size, type: showPassword ? 'text' : inputType, disabled: disabled, name: name, value: inputValue, onChange: onChange, onKeyDown: onKeyDown, onBlur: onBlurValidation, onFocus: onFocus, error: error, placeholder: placeholder, min: min, max: max, step: step, prefix: prefix }),
|
|
78
82
|
prefix && React.createElement(Prefix, { inputSize: size }, prefix),
|
|
79
83
|
inputType === 'password' && (React.createElement(EyeIconWrapper, { size: size },
|
|
80
84
|
React.createElement(Icon, { name: showPassword ? 'visability_off' : 'visibility', size: 24, onClick: tooglePassword, iconColor: theme.inputDefaultTextColor, iconBgHoverColor: "transparent" }))),
|
|
@@ -95,7 +95,7 @@ export const List = ({ isCheckbox = false, isCollapsable = false, isSelectable =
|
|
|
95
95
|
const rowHaveStatus = row.statusDone || row.statusError || row.statusWarnning;
|
|
96
96
|
return (React.createElement(React.Fragment, null,
|
|
97
97
|
React.createElement(ListRow, { key: row.id, level: level, selected: isSelectable && selected ? selected === row.id : false, action: isCheckbox || isSelectable, isExtend: row.extend || false, onClick: (e) => handleRowClick(row, e) },
|
|
98
|
-
isCollapsable && (React.createElement(ListIconWrapper, { extend: row.extend || (isStatus && rowHaveStatus) ? true : false, onClick: (e) => {
|
|
98
|
+
isCollapsable && (React.createElement(ListIconWrapper, { extend: (row.extend && row.children.length !== 0) || (isStatus && rowHaveStatus) ? true : false, onClick: (e) => {
|
|
99
99
|
e.stopPropagation();
|
|
100
100
|
} },
|
|
101
101
|
row.children.length !== 0 && (React.createElement(Icon, { name: "arrow_drop_down", size: 20, noPadding: true, onClick: () => showRow(row.id), iconBgHoverColor: "transparent" })),
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React, { useEffect, useState, useCallback, useRef } from 'react';
|
|
1
|
+
import React, { useEffect, useState, useCallback, useRef, useMemo, } from 'react';
|
|
2
2
|
import { ThemeProvider } from 'styled-components';
|
|
3
3
|
import { TableHead, TableRow, TableWrapper } from './Table.styles';
|
|
4
4
|
import { mainTheme } from '../../Theme';
|
|
@@ -97,6 +97,12 @@ export const Table = ({ theme = mainTheme, headers, elements, hover = true, sele
|
|
|
97
97
|
setCurrentPage(1);
|
|
98
98
|
setNoResultsMessage(null);
|
|
99
99
|
}, [elements, setCurrentPage, setNoResultsMessage]);
|
|
100
|
+
const tableElements = useMemo(() => {
|
|
101
|
+
if (ifPagination) {
|
|
102
|
+
return paginatedElements;
|
|
103
|
+
}
|
|
104
|
+
return tableProps.elements;
|
|
105
|
+
}, [ifPagination, paginatedElements, tableProps.elements]);
|
|
100
106
|
return (React.createElement(ThemeProvider, { theme: theme },
|
|
101
107
|
filtrable && (React.createElement("div", { style: {
|
|
102
108
|
display: 'flex',
|
|
@@ -115,7 +121,7 @@ export const Table = ({ theme = mainTheme, headers, elements, hover = true, sele
|
|
|
115
121
|
React.createElement(TableWrapper, { cellPadding: "0", cellSpacing: "0" },
|
|
116
122
|
React.createElement(TableHead, null,
|
|
117
123
|
React.createElement(TableRow, { hover: false, selectable: false, active: false }, tableProps.headers.map((header) => (React.createElement(HeaderCell, { key: `header_${header.name}`, header: header, sortable: sortable, handleSort: handleHeaderCellClick, sort: tableProps.sort }))))),
|
|
118
|
-
React.createElement("tbody", null,
|
|
124
|
+
React.createElement("tbody", null, tableElements.map((item) => {
|
|
119
125
|
return (React.createElement(TableRow, { key: `table_row_${item.id}`, hover: hover, active: selectedRow === item.id, selectable: selectable, onClick: () => handleRowClick(item.id) }, tableProps.headers.map((header, index) => {
|
|
120
126
|
return (React.createElement(Cell, { key: `cell_${header.name}_${item.id}`, header: header, moreActions: moreActions, item: item, theme: theme, marked: item.marked && index === 0, isDisabled: item.disabled }));
|
|
121
127
|
})));
|
|
@@ -25,6 +25,12 @@ export const Panel = styled.div `
|
|
|
25
25
|
border: 1px solid ${Theme.colors.gray_2};
|
|
26
26
|
border-top: none;
|
|
27
27
|
min-width: 30px;
|
|
28
|
+
${(p) => p.maxHeight &&
|
|
29
|
+
`
|
|
30
|
+
max-height: ${p.maxHeight};
|
|
31
|
+
overflow: auto;
|
|
32
|
+
|
|
33
|
+
`}
|
|
28
34
|
`;
|
|
29
35
|
export const PanelOption = styled.div `
|
|
30
36
|
padding: ${Theme.padding.s} ${Theme.padding.m};
|
|
@@ -5,7 +5,10 @@ export interface IDropdownProps extends IFormElement {
|
|
|
5
5
|
handleSelect: (name: string, value: string | number) => void;
|
|
6
6
|
position?: string;
|
|
7
7
|
zIndex?: number;
|
|
8
|
+
maxHeight?: string;
|
|
8
9
|
theme?: any;
|
|
10
|
+
handleFieldFocus?: (name: string) => void;
|
|
11
|
+
handleFieldBlur?: () => void;
|
|
9
12
|
}
|
|
10
13
|
export interface IPositionStyle {
|
|
11
14
|
top: number;
|
|
@@ -2,8 +2,9 @@ import { InputSize } from '../../types';
|
|
|
2
2
|
export declare const Container: import("styled-components").StyledComponent<"div", any, {}, never>;
|
|
3
3
|
export declare const ScrollCotainer: import("styled-components").StyledComponent<"div", any, {}, never>;
|
|
4
4
|
interface IPanelStyle {
|
|
5
|
-
height?: string;
|
|
6
5
|
size: InputSize;
|
|
6
|
+
height?: string;
|
|
7
|
+
maxHeight?: string;
|
|
7
8
|
fullWidth?: boolean;
|
|
8
9
|
zIndex?: number;
|
|
9
10
|
}
|