intelicoreact 0.0.3 → 0.0.7
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/Atomic/FormElements/CheckboxInput/CheckboxInput.js +6 -2
- package/dist/Atomic/FormElements/CheckboxInput/CheckboxInput.scss +92 -63
- package/dist/Atomic/FormElements/CheckboxInput/CheckboxInput.stories.js +2 -4
- package/dist/Atomic/FormElements/DateTime/DateTime.stories.js +1 -3
- package/dist/Atomic/FormElements/DoubleString/DoubleString.stories.js +0 -2
- package/dist/Atomic/FormElements/Dropdown/Dropdown.js +56 -25
- package/dist/Atomic/FormElements/Dropdown/Dropdown.scss +26 -3
- package/dist/Atomic/FormElements/Dropdown/Dropdown.stories.js +40 -11
- package/dist/Atomic/FormElements/Header/Header.js +7 -9
- package/dist/Atomic/FormElements/Header/Header.scss +16 -5
- package/dist/Atomic/FormElements/Header/Header.stories.js +0 -2
- package/dist/Atomic/FormElements/Input/Input.js +101 -98
- package/dist/Atomic/FormElements/Input/Input.scss +26 -19
- package/dist/Atomic/FormElements/Input/Input.stories.js +48 -27
- package/dist/Atomic/FormElements/InputCalendar/InputCalendar.js +89 -0
- package/dist/Atomic/FormElements/InputCalendar/InputCalendar.stories.js +46 -0
- package/dist/Atomic/FormElements/InputDateRange/InputDateRange.js +259 -0
- package/dist/Atomic/FormElements/InputDateRange/InputDateRange.scss +594 -0
- package/dist/Atomic/FormElements/InputDateRange/InputDateRange.stories.js +244 -0
- package/dist/Atomic/FormElements/InputDateRange/components/Datepicker.js +489 -0
- package/dist/Atomic/FormElements/InputDateRange/components/OpenedPart.js +156 -0
- package/dist/Atomic/FormElements/InputDateRange/components/SelectItem.js +46 -0
- package/dist/Atomic/FormElements/InputDateRange/dependencies.js +249 -0
- package/dist/Atomic/FormElements/InputsRow/InputsRow.js +29 -6
- package/dist/Atomic/FormElements/InputsRow/InputsRow.scss +1 -3
- package/dist/Atomic/FormElements/InputsRow/InputsRow.stories.js +0 -2
- package/dist/Atomic/FormElements/Label/Label.js +4 -13
- package/dist/Atomic/FormElements/Label/Label.scss +3 -3
- package/dist/Atomic/FormElements/Label/Label.stories.js +5 -6
- package/dist/Atomic/FormElements/Modal/Modal.js +5 -7
- package/dist/Atomic/FormElements/Modal/Modal.scss +61 -7
- package/dist/Atomic/FormElements/Modal/Modal.stories.js +64 -18
- package/dist/Atomic/FormElements/MultiSelect/MultiSelect.js +3 -5
- package/dist/Atomic/FormElements/MultiSelect/MultiSelect.scss +1 -3
- package/dist/Atomic/FormElements/MultiSelect/MultiSelect.stories.js +0 -2
- package/dist/Atomic/FormElements/NavLine/NavLine.js +1 -1
- package/dist/Atomic/FormElements/NavLine/NavLine.scss +4 -6
- package/dist/Atomic/FormElements/NavLine/NavLine.stories.js +20 -12
- package/dist/Atomic/FormElements/RadioInput/RadioInput.stories.js +0 -2
- package/dist/Atomic/FormElements/RangeCalendar/RangeCalendar.js +167 -0
- package/dist/Atomic/FormElements/RangeCalendar/RangeCalendar.scss +101 -0
- package/dist/Atomic/FormElements/RangeCalendar/RangeCalendar.stories.js +81 -0
- package/dist/Atomic/FormElements/RangeInputs/RangeInputs.stories.js +0 -2
- package/dist/Atomic/FormElements/Switcher/Switcher.stories.js +0 -2
- package/dist/Atomic/FormElements/Table/Partials/TdHeader.js +2 -2
- package/dist/Atomic/FormElements/Table/Table.scss +1 -1
- package/dist/Atomic/FormElements/Table/TdTypes/TdActions.js +4 -4
- package/dist/Atomic/FormElements/Table/TdTypes/TdPriority.js +2 -2
- package/dist/Atomic/FormElements/Table/TdTypes/TdTypes.scss +4 -6
- package/dist/Atomic/FormElements/Table/TdTypes/TdWeight.js +2 -2
- package/dist/Atomic/FormElements/Tag/Tag.js +1 -1
- package/dist/Atomic/FormElements/Tag/Tag.stories.js +0 -2
- package/dist/Atomic/FormElements/TagsDropdown/TagsDropdown.js +2 -2
- package/dist/Atomic/FormElements/TagsDropdown/TagsDropdown.stories.js +0 -2
- package/dist/Atomic/FormElements/TextSwitcher/TextSwitcher.stories.js +0 -2
- package/dist/Atomic/FormElements/Textarea/Textarea.scss +1 -1
- package/dist/Atomic/FormElements/Textarea/Textarea.stories.js +0 -2
- package/dist/Atomic/FormElements/TimeRange/TimeRange.js +1 -1
- package/dist/Atomic/FormElements/TimeRange/TimeRange.stories.js +0 -2
- package/dist/Atomic/MainMenu/MainMenu.js +3 -3
- package/dist/Atomic/MainMenu/MainMenu.scss +2 -2
- package/dist/Atomic/MainMenu/MainMenu.stories.js +11 -11
- package/dist/Atomic/UI/Accordion/Accordion.scss +2 -2
- package/dist/Atomic/UI/Accordion/Accordion.stories.js +4 -4
- package/dist/Atomic/UI/Accordion/AccordionItem.js +1 -1
- package/dist/Atomic/UI/AdvancedTag/AdvTag.js +3 -3
- package/dist/Atomic/UI/AdvancedTag/AdvancedTags.js +4 -3
- package/dist/Atomic/UI/AdvancedTag/AdvancedTags.scss +3 -5
- package/dist/Atomic/UI/AdvancedTag/AdvancedTags.stories.js +1 -3
- package/dist/Atomic/UI/Alert/Alert.scss +7 -0
- package/dist/Atomic/UI/Alert/Alert.stories.js +1 -3
- package/dist/Atomic/UI/Arrow/Arrow.js +80 -0
- package/dist/Atomic/UI/Arrow/Arrow.scss +19 -0
- package/dist/Atomic/UI/Arrow/Arrow.stories.js +46 -0
- package/dist/Atomic/UI/Button/Button.js +10 -19
- package/dist/Atomic/UI/Button/Button.scss +69 -41
- package/dist/Atomic/UI/Button/Button.stories.js +9 -25
- package/dist/Atomic/UI/Calendar/Calendar.js +146 -0
- package/dist/Atomic/UI/Calendar/Calendar.scss +544 -0
- package/dist/Atomic/UI/Calendar/Calendar.stories.js +38 -0
- package/dist/Atomic/UI/Header/partials/default_ava.png +0 -0
- package/dist/Atomic/UI/Hint/Hint.js +8 -13
- package/dist/Atomic/UI/Hint/Hint.scss +8 -12
- package/dist/Atomic/UI/Hint/Hint.stories.js +3 -4
- package/dist/Atomic/UI/Price/Price.js +33 -0
- package/dist/Atomic/UI/Price/Price.stories.js +42 -0
- package/dist/Atomic/UI/Status/Status.scss +1 -1
- package/dist/Atomic/UI/Status/Status.stories.js +4 -3
- package/dist/Functions/useClickOutside.js +25 -0
- package/dist/Functions/utils.js +10 -2
- package/dist/Molecular/Datepicker/Datepicker.js +451 -0
- package/dist/Molecular/Datepicker/Datepicker.scss +8 -0
- package/dist/Molecular/Datepicker/Datepicker.stories.js +44 -0
- package/dist/Molecular/Datepicker/components/Calendar.js +156 -0
- package/dist/Molecular/FormElements/FormElement.js +40 -0
- package/dist/Molecular/FormElements/FormElement.scss +8 -0
- package/dist/Molecular/FormElements/FormElement.stories.js +73 -0
- package/dist/scss/_vars.scss +3 -1
- package/dist/scss/main.scss +3 -3
- package/package.json +11 -6
- package/src/Atomic/FormElements/CheckboxInput/CheckboxInput.js +12 -2
- package/src/Atomic/FormElements/CheckboxInput/CheckboxInput.scss +92 -63
- package/src/Atomic/FormElements/CheckboxInput/CheckboxInput.stories.js +5 -6
- package/src/Atomic/FormElements/DateTime/DateTime.stories.js +1 -3
- package/src/Atomic/FormElements/DoubleString/DoubleString.stories.js +0 -2
- package/src/Atomic/FormElements/Dropdown/Dropdown.js +70 -29
- package/src/Atomic/FormElements/Dropdown/Dropdown.scss +26 -3
- package/src/Atomic/FormElements/Dropdown/Dropdown.stories.js +37 -16
- package/src/Atomic/FormElements/Header/Header.js +8 -9
- package/src/Atomic/FormElements/Header/Header.scss +16 -5
- package/src/Atomic/FormElements/Header/Header.stories.js +0 -2
- package/src/Atomic/FormElements/Input/Input.js +83 -73
- package/src/Atomic/FormElements/Input/Input.scss +26 -19
- package/src/Atomic/FormElements/Input/Input.stories.js +34 -29
- package/src/Atomic/FormElements/InputCalendar/InputCalendar.js +43 -0
- package/src/Atomic/FormElements/InputCalendar/InputCalendar.stories.js +27 -0
- package/src/Atomic/FormElements/InputDateRange/InputDateRange.js +241 -0
- package/src/Atomic/FormElements/InputDateRange/InputDateRange.scss +594 -0
- package/src/Atomic/FormElements/InputDateRange/InputDateRange.stories.js +149 -0
- package/src/Atomic/FormElements/InputDateRange/components/Datepicker.js +409 -0
- package/src/Atomic/FormElements/InputDateRange/components/OpenedPart.js +114 -0
- package/src/Atomic/FormElements/InputDateRange/components/SelectItem.js +24 -0
- package/src/Atomic/FormElements/InputDateRange/dependencies.js +161 -0
- package/src/Atomic/FormElements/InputsRow/InputsRow.js +28 -5
- package/src/Atomic/FormElements/InputsRow/InputsRow.scss +1 -3
- package/src/Atomic/FormElements/InputsRow/InputsRow.stories.js +0 -2
- package/src/Atomic/FormElements/Label/Label.js +3 -6
- package/src/Atomic/FormElements/Label/Label.scss +3 -3
- package/src/Atomic/FormElements/Label/Label.stories.js +6 -6
- package/src/Atomic/FormElements/Modal/Modal.js +5 -8
- package/src/Atomic/FormElements/Modal/Modal.scss +61 -7
- package/src/Atomic/FormElements/Modal/Modal.stories.js +60 -15
- package/src/Atomic/FormElements/MultiSelect/MultiSelect.js +3 -5
- package/src/Atomic/FormElements/MultiSelect/MultiSelect.scss +1 -3
- package/src/Atomic/FormElements/MultiSelect/MultiSelect.stories.js +1 -2
- package/src/Atomic/FormElements/NavLine/NavLine.js +3 -3
- package/src/Atomic/FormElements/NavLine/NavLine.scss +4 -6
- package/src/Atomic/FormElements/NavLine/NavLine.stories.js +23 -13
- package/src/Atomic/FormElements/RadioInput/RadioInput.stories.js +0 -2
- package/src/Atomic/FormElements/RangeCalendar/RangeCalendar.js +146 -0
- package/src/Atomic/FormElements/RangeCalendar/RangeCalendar.scss +101 -0
- package/src/Atomic/FormElements/RangeCalendar/RangeCalendar.stories.js +54 -0
- package/src/Atomic/FormElements/RangeInputs/RangeInputs.stories.js +0 -1
- package/src/Atomic/FormElements/Switcher/Switcher.stories.js +0 -2
- package/src/Atomic/FormElements/Table/Partials/TdHeader.js +1 -1
- package/src/Atomic/FormElements/Table/Table.scss +1 -1
- package/src/Atomic/FormElements/Table/TdTypes/TdActions.js +4 -4
- package/src/Atomic/FormElements/Table/TdTypes/TdPriority.js +3 -3
- package/src/Atomic/FormElements/Table/TdTypes/TdTypes.scss +4 -6
- package/src/Atomic/FormElements/Table/TdTypes/TdWeight.js +2 -2
- package/src/Atomic/FormElements/Tag/Tag.js +2 -2
- package/src/Atomic/FormElements/Tag/Tag.stories.js +0 -2
- package/src/Atomic/FormElements/TagsDropdown/TagsDropdown.js +3 -3
- package/src/Atomic/FormElements/TagsDropdown/TagsDropdown.stories.js +0 -2
- package/src/Atomic/FormElements/TextSwitcher/TextSwitcher.stories.js +0 -2
- package/src/Atomic/FormElements/Textarea/Textarea.scss +1 -1
- package/src/Atomic/FormElements/Textarea/Textarea.stories.js +0 -2
- package/src/Atomic/FormElements/TimeRange/TimeRange.js +1 -1
- package/src/Atomic/FormElements/TimeRange/TimeRange.stories.js +0 -2
- package/src/Atomic/MainMenu/MainMenu.js +3 -3
- package/src/Atomic/MainMenu/MainMenu.scss +2 -2
- package/src/Atomic/MainMenu/MainMenu.stories.js +11 -11
- package/src/Atomic/UI/Accordion/Accordion.scss +2 -2
- package/src/Atomic/UI/Accordion/Accordion.stories.js +4 -4
- package/src/Atomic/UI/Accordion/AccordionItem.js +1 -1
- package/src/Atomic/UI/AdvancedTag/AdvTag.js +3 -3
- package/src/Atomic/UI/AdvancedTag/AdvancedTags.js +3 -3
- package/src/Atomic/UI/AdvancedTag/AdvancedTags.scss +3 -5
- package/src/Atomic/UI/AdvancedTag/AdvancedTags.stories.js +1 -3
- package/src/Atomic/UI/Alert/Alert.scss +7 -0
- package/src/Atomic/UI/Alert/Alert.stories.js +1 -3
- package/src/Atomic/UI/Arrow/Arrow.js +41 -0
- package/src/Atomic/UI/Arrow/Arrow.scss +19 -0
- package/src/Atomic/UI/Arrow/Arrow.stories.js +32 -0
- package/src/Atomic/UI/Button/Button.js +6 -10
- package/src/Atomic/UI/Button/Button.scss +69 -41
- package/src/Atomic/UI/Button/Button.stories.js +9 -25
- package/src/Atomic/UI/Calendar/Calendar.js +109 -0
- package/src/Atomic/UI/Calendar/Calendar.scss +544 -0
- package/src/Atomic/UI/Calendar/Calendar.stories.js +24 -0
- package/src/Atomic/UI/Header/partials/default_ava.png +0 -0
- package/src/Atomic/UI/Hint/Hint.js +6 -9
- package/src/Atomic/UI/Hint/Hint.scss +8 -12
- package/src/Atomic/UI/Hint/Hint.stories.js +3 -3
- package/src/Atomic/UI/Price/Price.js +20 -0
- package/src/Atomic/UI/Price/Price.stories.js +30 -0
- package/src/Atomic/UI/Status/Status.scss +1 -1
- package/src/Atomic/UI/Status/Status.stories.js +4 -3
- package/src/Functions/useClickOutside.js +15 -0
- package/src/Functions/utils.js +6 -0
- package/src/Molecular/Datepicker/Datepicker.js +346 -0
- package/src/Molecular/Datepicker/Datepicker.scss +8 -0
- package/src/Molecular/Datepicker/Datepicker.stories.js +27 -0
- package/src/Molecular/Datepicker/components/Calendar.js +118 -0
- package/src/Molecular/FormElements/FormElement.js +18 -0
- package/src/Molecular/FormElements/FormElement.scss +8 -0
- package/src/Molecular/FormElements/FormElement.stories.js +59 -0
- package/src/scss/_vars.scss +3 -1
- package/src/scss/main.scss +3 -3
- package/dist/scss/anme/_anme-bootstrap-grid.scss +0 -748
- package/dist/scss/anme/_anme-elements.scss +0 -269
- package/dist/scss/anme/_anme-grid.scss +0 -111
- package/dist/scss/anme/_anme-justify.scss +0 -111
- package/dist/scss/anme/_anme-mixins-media.scss +0 -116
- package/dist/scss/anme/_anme-mixins.scss +0 -166
- package/dist/scss/anme/_anme-normalize.scss +0 -8
- package/dist/scss/anme/_anme-overall.scss +0 -34
- package/dist/scss/anme/_anme-padding-margins.scss +0 -419
- package/dist/scss/anme/_anme-table.scss +0 -81
- package/dist/scss/anme/_anme-theme.scss +0 -275
- package/dist/scss/anme/_anme-vars.scss +0 -91
- package/dist/scss/anme/_code-styling.scss +0 -23
- package/dist/scss/anme/styles.scss +0 -12
- package/src/scss/anme/_anme-bootstrap-grid.scss +0 -748
- package/src/scss/anme/_anme-elements.scss +0 -269
- package/src/scss/anme/_anme-grid.scss +0 -111
- package/src/scss/anme/_anme-justify.scss +0 -111
- package/src/scss/anme/_anme-mixins-media.scss +0 -116
- package/src/scss/anme/_anme-mixins.scss +0 -166
- package/src/scss/anme/_anme-normalize.scss +0 -8
- package/src/scss/anme/_anme-overall.scss +0 -34
- package/src/scss/anme/_anme-padding-margins.scss +0 -419
- package/src/scss/anme/_anme-table.scss +0 -81
- package/src/scss/anme/_anme-theme.scss +0 -275
- package/src/scss/anme/_anme-vars.scss +0 -91
- package/src/scss/anme/_code-styling.scss +0 -23
- package/src/scss/anme/styles.scss +0 -12
|
@@ -1,97 +1,138 @@
|
|
|
1
1
|
import React, { useState, useRef, useEffect } from 'react';
|
|
2
2
|
import cn from 'classnames';
|
|
3
|
-
import {
|
|
3
|
+
import { Check, ChevronDown, ChevronUp } from 'react-feather';
|
|
4
4
|
import Label from '../Label/Label';
|
|
5
5
|
|
|
6
6
|
import './Dropdown.scss';
|
|
7
7
|
|
|
8
8
|
const RC = 'dropdown';
|
|
9
9
|
|
|
10
|
-
const Dropdown = ({ options, value, onChange, placeholder, className,
|
|
10
|
+
const Dropdown = ({ options, value, error, onChange, placeholder, className, isSearchable, entity }) => {
|
|
11
11
|
const [isOpen, setIsOpen] = useState(false);
|
|
12
12
|
const [searchValue, setSearchValue] = useState('');
|
|
13
13
|
const dropdownRef = useRef(null);
|
|
14
14
|
|
|
15
15
|
const filteredGroups = options
|
|
16
|
-
.filter(item => item.items?.length)
|
|
17
|
-
.map(item => ({ ...item, items: item.items.filter(el => el?.label?.toLowerCase().includes(searchValue?.toLowerCase() || '')) }))
|
|
18
|
-
.filter(item => item.items?.length > 0);
|
|
16
|
+
.filter((item) => item.items?.length)
|
|
17
|
+
.map((item) => ({ ...item, items: item.items.filter((el) => el?.label?.toLowerCase().includes(searchValue?.toLowerCase() || '')) }))
|
|
18
|
+
.filter((item) => item.items?.length > 0);
|
|
19
19
|
|
|
20
20
|
const filteredItems = options
|
|
21
|
-
.filter(item => !item.items?.length)
|
|
22
|
-
.filter(item => item?.label?.toLowerCase().includes(searchValue?.toLowerCase() || ''));
|
|
23
|
-
|
|
24
|
-
|
|
21
|
+
.filter((item) => !item.items?.length)
|
|
22
|
+
.filter((item) => item?.label?.toLowerCase().includes(searchValue?.toLowerCase() || ''));
|
|
23
|
+
|
|
24
|
+
let filteredOptions = [...filteredItems, ...filteredGroups];
|
|
25
|
+
|
|
26
|
+
const modalBtnTrigger = entity && entity !== '' && typeof entity === 'string';
|
|
27
|
+
//decorator
|
|
28
|
+
const getDepends = (modalBtnTrigger, item) => {
|
|
29
|
+
const newOnChange = (item) => {
|
|
30
|
+
if (item.value === 'open_modal') {
|
|
31
|
+
onChange('open_modal');
|
|
32
|
+
} else {
|
|
33
|
+
onChangeHandler(item);
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
//add pseudo option
|
|
38
|
+
const newOptions = [
|
|
39
|
+
{
|
|
40
|
+
label: 'New ' + entity,
|
|
41
|
+
value: 'open_modal',
|
|
42
|
+
className: 'dropdown__list-item--modal',
|
|
43
|
+
},
|
|
44
|
+
...filteredOptions,
|
|
45
|
+
];
|
|
46
|
+
|
|
47
|
+
return {
|
|
48
|
+
onChange: (item) => (modalBtnTrigger ? newOnChange(item) : onChangeHandler(item)),
|
|
49
|
+
options: modalBtnTrigger ? newOptions : options,
|
|
50
|
+
};
|
|
51
|
+
};
|
|
25
52
|
|
|
26
|
-
const handleClickOutside = event => {
|
|
53
|
+
const handleClickOutside = (event) => {
|
|
27
54
|
if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {
|
|
28
55
|
setIsOpen(false);
|
|
29
56
|
setSearchValue(null);
|
|
30
57
|
}
|
|
31
58
|
};
|
|
32
59
|
|
|
33
|
-
const onChangeHandler = item => {
|
|
60
|
+
const onChangeHandler = (item) => {
|
|
34
61
|
setIsOpen(false);
|
|
35
62
|
setSearchValue(null);
|
|
36
63
|
onChange(item.value);
|
|
37
64
|
};
|
|
38
65
|
|
|
39
|
-
const onSearchHandler = name => {
|
|
66
|
+
const onSearchHandler = (name) => {
|
|
40
67
|
setSearchValue(name);
|
|
41
68
|
};
|
|
42
69
|
|
|
43
|
-
const hightlightedText = text =>
|
|
44
|
-
searchValue ? text?.replace(new RegExp(searchValue, 'i'), match => `<span class="bg--yellow">${match}</span>`) : text;
|
|
70
|
+
const hightlightedText = (text) =>
|
|
71
|
+
searchValue ? text?.replace(new RegExp(searchValue, 'i'), (match) => `<span class="bg--yellow">${match}</span>`) : text;
|
|
72
|
+
|
|
73
|
+
const depend = getDepends(modalBtnTrigger);
|
|
45
74
|
|
|
46
|
-
const getMarkupForElement = item =>
|
|
75
|
+
const getMarkupForElement = (item) =>
|
|
47
76
|
item.label.toLowerCase().includes(searchValue?.toLowerCase() || '') ? (
|
|
48
77
|
<button
|
|
49
78
|
key={item.value}
|
|
50
|
-
onClick={() =>
|
|
79
|
+
onClick={() => depend.onChange(item)}
|
|
51
80
|
className={cn(`${RC}__list-item`, { [`${RC}__list-item_active`]: item.value === value }, { [`${RC}__list-item_disabled`]: item.disabled })}
|
|
52
81
|
>
|
|
53
82
|
<span className={cn(`${RC}__active-icon`, { [`${RC}__active-icon_active`]: item.value === value })}>
|
|
54
|
-
<
|
|
83
|
+
<Check />
|
|
55
84
|
</span>
|
|
56
|
-
<div dangerouslySetInnerHTML={{ __html: hightlightedText(item.label) }} />
|
|
85
|
+
<div className={item.className || ''} dangerouslySetInnerHTML={{ __html: hightlightedText(item.label) }} />
|
|
57
86
|
</button>
|
|
58
87
|
) : null;
|
|
59
88
|
|
|
60
89
|
useEffect(() => {
|
|
90
|
+
if (!value) setSearchValue(null);
|
|
61
91
|
document.addEventListener('click', handleClickOutside, true);
|
|
62
92
|
return () => document.removeEventListener('click', handleClickOutside, true);
|
|
63
|
-
});
|
|
93
|
+
}, [value]);
|
|
64
94
|
|
|
65
|
-
const filteredOptionList = filteredOption =>
|
|
95
|
+
const filteredOptionList = (filteredOption) =>
|
|
66
96
|
filteredOption.items?.length > 0 ? (
|
|
67
97
|
<div key={filteredOption.value} className={`${RC}-group`}>
|
|
68
98
|
<div className={`${RC}-group__name`}>{filteredOption.label}</div>
|
|
69
|
-
{filteredOption.items.map(el => getMarkupForElement(el))}
|
|
99
|
+
{filteredOption.items.map((el) => getMarkupForElement(el))}
|
|
70
100
|
</div>
|
|
71
101
|
) : null;
|
|
72
102
|
|
|
73
103
|
const selectedLabel =
|
|
74
|
-
options.find(el => el.value === value)?.label ||
|
|
104
|
+
options.find((el) => el.value === value)?.label ||
|
|
105
|
+
options.reduce((acc, item) => acc || item.items?.find((el) => el.value === value)?.label, null);
|
|
75
106
|
|
|
76
107
|
return (
|
|
77
108
|
<div className={cn(RC, className)} ref={dropdownRef}>
|
|
78
|
-
|
|
79
|
-
|
|
109
|
+
<button
|
|
110
|
+
className={`${RC}__trigger input__wrap ${!value ? 'placeholder' : ''} ${error ? 'error' : ''}`}
|
|
111
|
+
onClick={() => (!isSearchable ? setIsOpen(!isOpen) : null)}
|
|
112
|
+
>
|
|
80
113
|
{isSearchable ? (
|
|
81
114
|
<input
|
|
82
115
|
className={`${RC}__input`}
|
|
83
|
-
value={searchValue
|
|
84
|
-
onChange={e =>
|
|
116
|
+
value={searchValue || filteredOptions.find(el => el.value === value)?.label || ''}
|
|
117
|
+
onChange={(e) => {
|
|
118
|
+
onSearchHandler(e.target.value)
|
|
119
|
+
}}
|
|
85
120
|
placeholder={placeholder}
|
|
121
|
+
onFocus={e => {
|
|
122
|
+
e.target.select();
|
|
123
|
+
setIsOpen(true);
|
|
124
|
+
}}
|
|
86
125
|
/>
|
|
87
126
|
) : (
|
|
88
|
-
selectedLabel || placeholder
|
|
127
|
+
<span className="text">{selectedLabel || placeholder}</span>
|
|
89
128
|
)}
|
|
90
|
-
<span className={cn(`${RC}__arrow`, { [`${RC}__arrow_active`]: isOpen })}
|
|
129
|
+
<span className={cn(`${RC}__arrow`, { [`${RC}__arrow_active`]: isOpen })} onClick={() => setIsOpen(!isOpen)}>
|
|
130
|
+
{isOpen ? <ChevronUp /> : <ChevronDown />}
|
|
131
|
+
</span>
|
|
91
132
|
</button>
|
|
92
133
|
{isOpen && filteredOptions.length > 0 && (
|
|
93
134
|
<div className={`${RC}__list`}>
|
|
94
|
-
{
|
|
135
|
+
{depend.options.map((filteredOption) =>
|
|
95
136
|
filteredOption.items?.length ? filteredOptionList(filteredOption) : getMarkupForElement(filteredOption)
|
|
96
137
|
)}
|
|
97
138
|
</div>
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
flex-direction: column;
|
|
6
6
|
position: relative;
|
|
7
7
|
width: 100%;
|
|
8
|
+
border-radius: 7px;
|
|
8
9
|
|
|
9
10
|
&__trigger {
|
|
10
11
|
background: #ffffff;
|
|
@@ -13,7 +14,6 @@
|
|
|
13
14
|
border-radius: 3px;
|
|
14
15
|
width: 100%;
|
|
15
16
|
height: 28px;
|
|
16
|
-
display: flex;
|
|
17
17
|
align-items: center;
|
|
18
18
|
cursor: pointer;
|
|
19
19
|
padding-left: 9px;
|
|
@@ -26,9 +26,12 @@
|
|
|
26
26
|
position: relative;
|
|
27
27
|
text-align: left;
|
|
28
28
|
|
|
29
|
-
|
|
29
|
+
&.error {
|
|
30
30
|
border-color: $color--secondary;
|
|
31
31
|
}
|
|
32
|
+
&.placeholder .text {
|
|
33
|
+
opacity: 0.7;
|
|
34
|
+
}
|
|
32
35
|
}
|
|
33
36
|
|
|
34
37
|
&__input {
|
|
@@ -71,6 +74,8 @@
|
|
|
71
74
|
display: flex;
|
|
72
75
|
align-items: center;
|
|
73
76
|
//justify-content: center;
|
|
77
|
+
border: none;
|
|
78
|
+
background: transparent;
|
|
74
79
|
padding: 0 20px 0 30px;
|
|
75
80
|
position: relative;
|
|
76
81
|
cursor: pointer;
|
|
@@ -81,7 +86,24 @@
|
|
|
81
86
|
width: 100%;
|
|
82
87
|
height: 24px;
|
|
83
88
|
white-space: nowrap;
|
|
84
|
-
|
|
89
|
+
overflow-x: hidden;
|
|
90
|
+
|
|
91
|
+
&--modal {
|
|
92
|
+
color: #1f7499;
|
|
93
|
+
font-size: 14px;
|
|
94
|
+
line-height: 20px;
|
|
95
|
+
letter-spacing: 0.2px;
|
|
96
|
+
position: relative;
|
|
97
|
+
&:after {
|
|
98
|
+
content: "";
|
|
99
|
+
position: absolute;
|
|
100
|
+
bottom: -2px;
|
|
101
|
+
height: 1px;
|
|
102
|
+
width: 300%;
|
|
103
|
+
transform: translateX(-50%);
|
|
104
|
+
background-color: #e8e9ec;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
85
107
|
&:hover,
|
|
86
108
|
&_active {
|
|
87
109
|
background: $color--gray--gentle;
|
|
@@ -101,6 +123,7 @@
|
|
|
101
123
|
display: flex;
|
|
102
124
|
align-items: center;
|
|
103
125
|
width: 16px;
|
|
126
|
+
height: 16px;
|
|
104
127
|
position: absolute;
|
|
105
128
|
right: 4px;
|
|
106
129
|
top: 50%;
|
|
@@ -1,34 +1,54 @@
|
|
|
1
1
|
import React, { useState } from 'react';
|
|
2
2
|
import Dropdown from './Dropdown';
|
|
3
3
|
|
|
4
|
-
import '../../../../scss/main.scss';
|
|
5
|
-
|
|
6
4
|
global.lng = 'en';
|
|
7
5
|
export default {
|
|
8
6
|
title: 'Dropdown',
|
|
9
|
-
component: Dropdown
|
|
7
|
+
component: Dropdown,
|
|
8
|
+
argTypes: {
|
|
9
|
+
className: {
|
|
10
|
+
description: 'string',
|
|
11
|
+
},
|
|
12
|
+
value: { description: 'string - current option' },
|
|
13
|
+
isSearchable: {
|
|
14
|
+
description: 'boolean - enable search',
|
|
15
|
+
},
|
|
16
|
+
onChange: { description: 'callback return selected value' },
|
|
17
|
+
entity: {
|
|
18
|
+
description: 'string',
|
|
19
|
+
},
|
|
20
|
+
},
|
|
10
21
|
};
|
|
11
22
|
|
|
12
|
-
const
|
|
13
|
-
|
|
23
|
+
const buttonStyles={
|
|
24
|
+
border: 'solid 1px #000',
|
|
25
|
+
padding: '5px'
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
const Template = (args) => {
|
|
29
|
+
const [value, setValue] = useState('');
|
|
14
30
|
return (
|
|
15
|
-
|
|
16
|
-
<
|
|
17
|
-
|
|
31
|
+
<>
|
|
32
|
+
<div style={{ width: 200 }}>
|
|
33
|
+
<Dropdown {...args} value={value} onChange={setValue} />
|
|
34
|
+
</div>
|
|
35
|
+
<button style={buttonStyles} className='mt10' onClick={() => {console.log('click!'); setValue('')}} >Reset</button>
|
|
36
|
+
</>
|
|
18
37
|
);
|
|
19
38
|
};
|
|
20
39
|
|
|
21
40
|
export const DropdownTemplate = Template.bind({});
|
|
22
41
|
|
|
23
42
|
DropdownTemplate.args = {
|
|
43
|
+
entity: 'entity',
|
|
44
|
+
value: 'drop6',
|
|
24
45
|
placeholder: 'Placeholder',
|
|
25
|
-
label: '',
|
|
26
46
|
isSearchable: true,
|
|
27
47
|
options: [
|
|
28
|
-
{ label: 'Dropdown1', value: 'drop1' },
|
|
29
48
|
{ label: 'Dropdown2', value: 'drop2' },
|
|
30
49
|
{ label: 'Dropdown3', value: 'drop3', disabled: true },
|
|
31
50
|
{ label: 'Dropdown4', value: 'drop4' },
|
|
51
|
+
{ label: 'Dropdown1', value: 'drop1', className: 'status status--approved' },
|
|
32
52
|
{ label: 'Dropdown5', value: 'drop5' },
|
|
33
53
|
{ label: 'Dropdown6', value: 'drop6' },
|
|
34
54
|
{
|
|
@@ -36,16 +56,17 @@ DropdownTemplate.args = {
|
|
|
36
56
|
items: [
|
|
37
57
|
{ label: 'Group 11', value: 'group11' },
|
|
38
58
|
{ label: 'Group 12', value: 'group12', disabled: true },
|
|
39
|
-
{ label: 'Group 13', value: 'group13' }
|
|
40
|
-
]
|
|
59
|
+
{ label: 'Group 13', value: 'group13' },
|
|
60
|
+
],
|
|
41
61
|
},
|
|
42
62
|
{
|
|
43
63
|
label: 'Some Group 2',
|
|
44
64
|
items: [
|
|
45
65
|
{ label: 'Group 21', value: 'group21' },
|
|
46
66
|
{ label: 'Group 22', value: 'group22' },
|
|
47
|
-
{ label: 'Group 23', value: 'group23' }
|
|
48
|
-
]
|
|
49
|
-
}
|
|
50
|
-
]
|
|
67
|
+
{ label: 'Group 23', value: 'group23' },
|
|
68
|
+
],
|
|
69
|
+
},
|
|
70
|
+
],
|
|
71
|
+
error: '',
|
|
51
72
|
};
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import React, { useRef, useState } from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import { ChevronRight, Bell, Power } from 'react-feather';
|
|
3
3
|
import { GoPrimitiveDot } from 'react-icons/go';
|
|
4
4
|
import cn from 'classnames';
|
|
5
5
|
|
|
6
6
|
import { logout, useOutsideToggle } from '../../../Functions/utils';
|
|
7
7
|
import Hint from '../../UI/Hint/Hint';
|
|
8
|
-
import defaultAva from '../../../../assets/images/default_ava.png';
|
|
9
8
|
|
|
10
9
|
import './Header.scss';
|
|
11
10
|
|
|
@@ -30,19 +29,19 @@ const Header = ({ name = 'John', surname = 'Silver', status = 'admin', img = '',
|
|
|
30
29
|
useOutsideToggle(userMenu, handle.closeMenu);
|
|
31
30
|
|
|
32
31
|
return (
|
|
33
|
-
<header className=
|
|
32
|
+
<header className={cn('header', className)}>
|
|
34
33
|
<div className="df">
|
|
35
34
|
<Hint side="bottom" hint={hintText} className="header__hint" label={hintLabel} iconOutline />
|
|
36
35
|
</div>
|
|
37
36
|
|
|
38
|
-
<div className="j6 user-menu
|
|
37
|
+
<div className="j6 user-menu">
|
|
39
38
|
<div onClick={() => {}} className="header--bell">
|
|
40
|
-
<
|
|
41
|
-
<
|
|
39
|
+
<Bell className="header--bell-icon" />
|
|
40
|
+
<div className="header--bell-notification-icon" />
|
|
42
41
|
</div>
|
|
43
42
|
|
|
44
43
|
<div className="header--user-ava">
|
|
45
|
-
<img src={img
|
|
44
|
+
<img src={img} alt="" />
|
|
46
45
|
</div>
|
|
47
46
|
|
|
48
47
|
<div className="dfc mr10">
|
|
@@ -52,11 +51,11 @@ const Header = ({ name = 'John', surname = 'Silver', status = 'admin', img = '',
|
|
|
52
51
|
<span className="header--user-status">{status}</span>
|
|
53
52
|
</div>
|
|
54
53
|
|
|
55
|
-
<
|
|
54
|
+
<ChevronRight onClick={handle.toggleMenu} className={cn('accordion--title-chevron', { 'accordion--title-chevron-open': isOpen })} />
|
|
56
55
|
{isOpen && (
|
|
57
56
|
<div className="user-menu__dropdown" ref={userMenu}>
|
|
58
57
|
<div className="user-menu__item" onClick={handle.logout}>
|
|
59
|
-
<
|
|
58
|
+
<Power className="mr10" /> Logout
|
|
60
59
|
</div>
|
|
61
60
|
</div>
|
|
62
61
|
)}
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
@import "../../../scss/anme/anme-vars";
|
|
2
|
-
|
|
3
1
|
.header {
|
|
4
2
|
display: flex;
|
|
5
3
|
align-items: center;
|
|
@@ -43,12 +41,20 @@
|
|
|
43
41
|
position: relative;
|
|
44
42
|
margin-right: 22px;
|
|
45
43
|
cursor: pointer;
|
|
44
|
+
width: 16px;
|
|
45
|
+
height: 16px;
|
|
46
|
+
max-width: 16px;
|
|
47
|
+
min-width: 16px;
|
|
46
48
|
|
|
47
49
|
&-notification-icon {
|
|
50
|
+
content: "";
|
|
51
|
+
width: 7px;
|
|
52
|
+
height: 7px;
|
|
53
|
+
border-radius: 15px;
|
|
48
54
|
position: absolute;
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
55
|
+
top: -3px;
|
|
56
|
+
right: -6px;
|
|
57
|
+
background-color: #f06d8d;
|
|
52
58
|
}
|
|
53
59
|
}
|
|
54
60
|
|
|
@@ -76,7 +82,12 @@
|
|
|
76
82
|
.user-menu__item {
|
|
77
83
|
padding: 5px 15px;
|
|
78
84
|
cursor: pointer;
|
|
85
|
+
|
|
79
86
|
&:hover {
|
|
80
87
|
background: #e2e5ec;
|
|
81
88
|
}
|
|
82
89
|
}
|
|
90
|
+
|
|
91
|
+
.user-menu {
|
|
92
|
+
position: relative;
|
|
93
|
+
}
|
|
@@ -1,107 +1,117 @@
|
|
|
1
1
|
import React, { useState, useEffect, useRef } from 'react';
|
|
2
2
|
import cn from 'classnames';
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
import Label from '../Label/Label';
|
|
3
|
+
import { Minus, Plus } from 'react-feather';
|
|
4
|
+
import InputMask from 'react-input-mask';
|
|
6
5
|
|
|
7
6
|
import './Input.scss';
|
|
8
7
|
|
|
9
|
-
const RC = 'input-classic';
|
|
10
|
-
|
|
11
8
|
const Input = ({
|
|
12
|
-
error,
|
|
13
9
|
onChange,
|
|
14
10
|
disabled,
|
|
15
11
|
withDelete,
|
|
16
12
|
isNumeric,
|
|
17
|
-
|
|
13
|
+
numStep = 1,
|
|
14
|
+
min = 0,
|
|
18
15
|
max,
|
|
19
|
-
value
|
|
16
|
+
value,
|
|
20
17
|
placeholder,
|
|
21
|
-
hint,
|
|
22
|
-
label,
|
|
23
|
-
hintSide,
|
|
24
18
|
className,
|
|
25
|
-
isLabelBold,
|
|
26
19
|
type = 'text',
|
|
27
|
-
onBlur
|
|
20
|
+
onBlur,
|
|
21
|
+
onFocus,
|
|
22
|
+
onKeyUp,
|
|
23
|
+
mask,
|
|
24
|
+
maskChar,
|
|
25
|
+
formatChars,
|
|
26
|
+
error,
|
|
28
27
|
icon,
|
|
29
|
-
|
|
30
|
-
...props
|
|
28
|
+
symbolsLimit,
|
|
31
29
|
}) => {
|
|
30
|
+
// STATES
|
|
32
31
|
const [isFocused, setIsFocused] = useState(false);
|
|
33
|
-
const [onInputHover, setOnInputHover] = useState(false);
|
|
34
32
|
const [isEditing, setEditing] = useState(false);
|
|
35
33
|
const inputRef = useRef(null);
|
|
36
|
-
|
|
37
|
-
const
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
if (
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
34
|
+
// HANDLES
|
|
35
|
+
const handle = {
|
|
36
|
+
change: e => {
|
|
37
|
+
let inputValue = e.target ? e.target.value : e;
|
|
38
|
+
if (isNumeric || (type === 'number' && inputValue !== '')) {
|
|
39
|
+
inputValue = parseFloat(inputValue) || '';
|
|
40
|
+
if (min && +min > inputValue) {
|
|
41
|
+
inputValue = min;
|
|
42
|
+
} else if (max && +max < inputValue) inputValue = max;
|
|
43
|
+
} else if (symbolsLimit && inputValue.length > +symbolsLimit) inputValue = inputValue.substring(0, +symbolsLimit);
|
|
44
|
+
onChange(inputValue.toString());
|
|
45
|
+
},
|
|
46
|
+
toggleEdit: () => {
|
|
47
|
+
setEditing(!isEditing);
|
|
48
|
+
onChange('');
|
|
49
|
+
},
|
|
50
|
+
focus: e => {
|
|
51
|
+
setIsFocused(true);
|
|
52
|
+
if (onFocus) onFocus(e);
|
|
53
|
+
},
|
|
54
|
+
blur: e => {
|
|
55
|
+
setIsFocused(false);
|
|
56
|
+
setEditing(false);
|
|
57
|
+
if (onBlur) onBlur(e);
|
|
58
|
+
},
|
|
59
|
+
keyUp: e => (onKeyUp ? onKeyUp(e.keyCode, event) : null)
|
|
48
60
|
};
|
|
49
61
|
|
|
50
62
|
useEffect(() => {
|
|
51
|
-
if (isEditing)
|
|
52
|
-
inputRef.current.focus();
|
|
53
|
-
}
|
|
63
|
+
if (isEditing) inputRef.current.focus();
|
|
54
64
|
}, [isEditing, isFocused]);
|
|
55
65
|
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
66
|
+
const uniProps = {
|
|
67
|
+
className: `input ${className}`,
|
|
68
|
+
placeholder,
|
|
69
|
+
value: value || '',
|
|
70
|
+
disabled,
|
|
71
|
+
onChange: handle.change,
|
|
72
|
+
onFocus: handle.focus,
|
|
73
|
+
onBlur: handle.blur,
|
|
74
|
+
onKeyUp: handle.keyUp,
|
|
75
|
+
min,
|
|
76
|
+
max,
|
|
77
|
+
...(maskChar ? { maskChar } : {}),
|
|
78
|
+
...(formatChars ? { formatChars } : {}),
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
function renderInput() {
|
|
82
|
+
if (mask) {
|
|
83
|
+
return <InputMask {...uniProps} ref={inputRef} mask={mask} />;
|
|
84
|
+
}
|
|
59
85
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
className={cn(`${RC}__wrap`, { [`${RC}__wrap_focus`]: isFocused }, { [`${RC}__wrap_error`]: error }, { [`${RC}__wrap_disabled`]: disabled })}
|
|
64
|
-
>
|
|
65
|
-
<input
|
|
66
|
-
ref={inputRef}
|
|
67
|
-
className={cn(`${RC}__input`)}
|
|
68
|
-
type={isNumeric ? 'number' : type}
|
|
69
|
-
onChange={e => changeHandler(e.target.value)}
|
|
70
|
-
value={value || ''}
|
|
71
|
-
disabled={disabled}
|
|
72
|
-
onBlur={() => {
|
|
73
|
-
setIsFocused(false);
|
|
74
|
-
setEditing(false);
|
|
75
|
-
onBlur();
|
|
76
|
-
}}
|
|
77
|
-
onFocus={() => setIsFocused(true)}
|
|
78
|
-
placeholder={placeholder}
|
|
79
|
-
{...props}
|
|
80
|
-
/>
|
|
86
|
+
return (
|
|
87
|
+
<>
|
|
88
|
+
<input {...uniProps} ref={inputRef} type={isNumeric ? 'number' : type} />
|
|
81
89
|
{isNumeric && (
|
|
82
|
-
<div className=
|
|
83
|
-
<button onClick={() =>
|
|
84
|
-
<
|
|
90
|
+
<div className="input__nums">
|
|
91
|
+
<button onClick={() => handle.change(value - numStep)} className={cn(`input__num-btn`, { disabled: value <= min })}>
|
|
92
|
+
<Minus />
|
|
85
93
|
</button>
|
|
86
|
-
<button onClick={() =>
|
|
87
|
-
<
|
|
94
|
+
<button onClick={() => handle.change(+value + +numStep)} className={cn(`input__num-btn`, { disabled: value >= max })}>
|
|
95
|
+
<Plus />
|
|
88
96
|
</button>
|
|
89
97
|
</div>
|
|
90
98
|
)}
|
|
99
|
+
</>
|
|
100
|
+
);
|
|
101
|
+
}
|
|
91
102
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
{error && <span className={`${RC}__error`}>{error}</span>}
|
|
103
|
+
return (
|
|
104
|
+
<div
|
|
105
|
+
className={cn(
|
|
106
|
+
`input__wrap`,
|
|
107
|
+
{ [`input__wrap_focus`]: isFocused },
|
|
108
|
+
{ [`input__wrap_error`]: error },
|
|
109
|
+
{ [`input__wrap_disabled`]: disabled }
|
|
110
|
+
)}
|
|
111
|
+
>
|
|
112
|
+
{renderInput()}
|
|
113
|
+
{icon}
|
|
114
|
+
{withDelete && !isNumeric && <span className={cn(`input__close`, { hidden: !value })} onClick={handle.toggleEdit} />}
|
|
105
115
|
</div>
|
|
106
116
|
);
|
|
107
117
|
};
|