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.
Files changed (227) hide show
  1. package/dist/Atomic/FormElements/CheckboxInput/CheckboxInput.js +6 -2
  2. package/dist/Atomic/FormElements/CheckboxInput/CheckboxInput.scss +92 -63
  3. package/dist/Atomic/FormElements/CheckboxInput/CheckboxInput.stories.js +2 -4
  4. package/dist/Atomic/FormElements/DateTime/DateTime.stories.js +1 -3
  5. package/dist/Atomic/FormElements/DoubleString/DoubleString.stories.js +0 -2
  6. package/dist/Atomic/FormElements/Dropdown/Dropdown.js +56 -25
  7. package/dist/Atomic/FormElements/Dropdown/Dropdown.scss +26 -3
  8. package/dist/Atomic/FormElements/Dropdown/Dropdown.stories.js +40 -11
  9. package/dist/Atomic/FormElements/Header/Header.js +7 -9
  10. package/dist/Atomic/FormElements/Header/Header.scss +16 -5
  11. package/dist/Atomic/FormElements/Header/Header.stories.js +0 -2
  12. package/dist/Atomic/FormElements/Input/Input.js +101 -98
  13. package/dist/Atomic/FormElements/Input/Input.scss +26 -19
  14. package/dist/Atomic/FormElements/Input/Input.stories.js +48 -27
  15. package/dist/Atomic/FormElements/InputCalendar/InputCalendar.js +89 -0
  16. package/dist/Atomic/FormElements/InputCalendar/InputCalendar.stories.js +46 -0
  17. package/dist/Atomic/FormElements/InputDateRange/InputDateRange.js +259 -0
  18. package/dist/Atomic/FormElements/InputDateRange/InputDateRange.scss +594 -0
  19. package/dist/Atomic/FormElements/InputDateRange/InputDateRange.stories.js +244 -0
  20. package/dist/Atomic/FormElements/InputDateRange/components/Datepicker.js +489 -0
  21. package/dist/Atomic/FormElements/InputDateRange/components/OpenedPart.js +156 -0
  22. package/dist/Atomic/FormElements/InputDateRange/components/SelectItem.js +46 -0
  23. package/dist/Atomic/FormElements/InputDateRange/dependencies.js +249 -0
  24. package/dist/Atomic/FormElements/InputsRow/InputsRow.js +29 -6
  25. package/dist/Atomic/FormElements/InputsRow/InputsRow.scss +1 -3
  26. package/dist/Atomic/FormElements/InputsRow/InputsRow.stories.js +0 -2
  27. package/dist/Atomic/FormElements/Label/Label.js +4 -13
  28. package/dist/Atomic/FormElements/Label/Label.scss +3 -3
  29. package/dist/Atomic/FormElements/Label/Label.stories.js +5 -6
  30. package/dist/Atomic/FormElements/Modal/Modal.js +5 -7
  31. package/dist/Atomic/FormElements/Modal/Modal.scss +61 -7
  32. package/dist/Atomic/FormElements/Modal/Modal.stories.js +64 -18
  33. package/dist/Atomic/FormElements/MultiSelect/MultiSelect.js +3 -5
  34. package/dist/Atomic/FormElements/MultiSelect/MultiSelect.scss +1 -3
  35. package/dist/Atomic/FormElements/MultiSelect/MultiSelect.stories.js +0 -2
  36. package/dist/Atomic/FormElements/NavLine/NavLine.js +1 -1
  37. package/dist/Atomic/FormElements/NavLine/NavLine.scss +4 -6
  38. package/dist/Atomic/FormElements/NavLine/NavLine.stories.js +20 -12
  39. package/dist/Atomic/FormElements/RadioInput/RadioInput.stories.js +0 -2
  40. package/dist/Atomic/FormElements/RangeCalendar/RangeCalendar.js +167 -0
  41. package/dist/Atomic/FormElements/RangeCalendar/RangeCalendar.scss +101 -0
  42. package/dist/Atomic/FormElements/RangeCalendar/RangeCalendar.stories.js +81 -0
  43. package/dist/Atomic/FormElements/RangeInputs/RangeInputs.stories.js +0 -2
  44. package/dist/Atomic/FormElements/Switcher/Switcher.stories.js +0 -2
  45. package/dist/Atomic/FormElements/Table/Partials/TdHeader.js +2 -2
  46. package/dist/Atomic/FormElements/Table/Table.scss +1 -1
  47. package/dist/Atomic/FormElements/Table/TdTypes/TdActions.js +4 -4
  48. package/dist/Atomic/FormElements/Table/TdTypes/TdPriority.js +2 -2
  49. package/dist/Atomic/FormElements/Table/TdTypes/TdTypes.scss +4 -6
  50. package/dist/Atomic/FormElements/Table/TdTypes/TdWeight.js +2 -2
  51. package/dist/Atomic/FormElements/Tag/Tag.js +1 -1
  52. package/dist/Atomic/FormElements/Tag/Tag.stories.js +0 -2
  53. package/dist/Atomic/FormElements/TagsDropdown/TagsDropdown.js +2 -2
  54. package/dist/Atomic/FormElements/TagsDropdown/TagsDropdown.stories.js +0 -2
  55. package/dist/Atomic/FormElements/TextSwitcher/TextSwitcher.stories.js +0 -2
  56. package/dist/Atomic/FormElements/Textarea/Textarea.scss +1 -1
  57. package/dist/Atomic/FormElements/Textarea/Textarea.stories.js +0 -2
  58. package/dist/Atomic/FormElements/TimeRange/TimeRange.js +1 -1
  59. package/dist/Atomic/FormElements/TimeRange/TimeRange.stories.js +0 -2
  60. package/dist/Atomic/MainMenu/MainMenu.js +3 -3
  61. package/dist/Atomic/MainMenu/MainMenu.scss +2 -2
  62. package/dist/Atomic/MainMenu/MainMenu.stories.js +11 -11
  63. package/dist/Atomic/UI/Accordion/Accordion.scss +2 -2
  64. package/dist/Atomic/UI/Accordion/Accordion.stories.js +4 -4
  65. package/dist/Atomic/UI/Accordion/AccordionItem.js +1 -1
  66. package/dist/Atomic/UI/AdvancedTag/AdvTag.js +3 -3
  67. package/dist/Atomic/UI/AdvancedTag/AdvancedTags.js +4 -3
  68. package/dist/Atomic/UI/AdvancedTag/AdvancedTags.scss +3 -5
  69. package/dist/Atomic/UI/AdvancedTag/AdvancedTags.stories.js +1 -3
  70. package/dist/Atomic/UI/Alert/Alert.scss +7 -0
  71. package/dist/Atomic/UI/Alert/Alert.stories.js +1 -3
  72. package/dist/Atomic/UI/Arrow/Arrow.js +80 -0
  73. package/dist/Atomic/UI/Arrow/Arrow.scss +19 -0
  74. package/dist/Atomic/UI/Arrow/Arrow.stories.js +46 -0
  75. package/dist/Atomic/UI/Button/Button.js +10 -19
  76. package/dist/Atomic/UI/Button/Button.scss +69 -41
  77. package/dist/Atomic/UI/Button/Button.stories.js +9 -25
  78. package/dist/Atomic/UI/Calendar/Calendar.js +146 -0
  79. package/dist/Atomic/UI/Calendar/Calendar.scss +544 -0
  80. package/dist/Atomic/UI/Calendar/Calendar.stories.js +38 -0
  81. package/dist/Atomic/UI/Header/partials/default_ava.png +0 -0
  82. package/dist/Atomic/UI/Hint/Hint.js +8 -13
  83. package/dist/Atomic/UI/Hint/Hint.scss +8 -12
  84. package/dist/Atomic/UI/Hint/Hint.stories.js +3 -4
  85. package/dist/Atomic/UI/Price/Price.js +33 -0
  86. package/dist/Atomic/UI/Price/Price.stories.js +42 -0
  87. package/dist/Atomic/UI/Status/Status.scss +1 -1
  88. package/dist/Atomic/UI/Status/Status.stories.js +4 -3
  89. package/dist/Functions/useClickOutside.js +25 -0
  90. package/dist/Functions/utils.js +10 -2
  91. package/dist/Molecular/Datepicker/Datepicker.js +451 -0
  92. package/dist/Molecular/Datepicker/Datepicker.scss +8 -0
  93. package/dist/Molecular/Datepicker/Datepicker.stories.js +44 -0
  94. package/dist/Molecular/Datepicker/components/Calendar.js +156 -0
  95. package/dist/Molecular/FormElements/FormElement.js +40 -0
  96. package/dist/Molecular/FormElements/FormElement.scss +8 -0
  97. package/dist/Molecular/FormElements/FormElement.stories.js +73 -0
  98. package/dist/scss/_vars.scss +3 -1
  99. package/dist/scss/main.scss +3 -3
  100. package/package.json +11 -6
  101. package/src/Atomic/FormElements/CheckboxInput/CheckboxInput.js +12 -2
  102. package/src/Atomic/FormElements/CheckboxInput/CheckboxInput.scss +92 -63
  103. package/src/Atomic/FormElements/CheckboxInput/CheckboxInput.stories.js +5 -6
  104. package/src/Atomic/FormElements/DateTime/DateTime.stories.js +1 -3
  105. package/src/Atomic/FormElements/DoubleString/DoubleString.stories.js +0 -2
  106. package/src/Atomic/FormElements/Dropdown/Dropdown.js +70 -29
  107. package/src/Atomic/FormElements/Dropdown/Dropdown.scss +26 -3
  108. package/src/Atomic/FormElements/Dropdown/Dropdown.stories.js +37 -16
  109. package/src/Atomic/FormElements/Header/Header.js +8 -9
  110. package/src/Atomic/FormElements/Header/Header.scss +16 -5
  111. package/src/Atomic/FormElements/Header/Header.stories.js +0 -2
  112. package/src/Atomic/FormElements/Input/Input.js +83 -73
  113. package/src/Atomic/FormElements/Input/Input.scss +26 -19
  114. package/src/Atomic/FormElements/Input/Input.stories.js +34 -29
  115. package/src/Atomic/FormElements/InputCalendar/InputCalendar.js +43 -0
  116. package/src/Atomic/FormElements/InputCalendar/InputCalendar.stories.js +27 -0
  117. package/src/Atomic/FormElements/InputDateRange/InputDateRange.js +241 -0
  118. package/src/Atomic/FormElements/InputDateRange/InputDateRange.scss +594 -0
  119. package/src/Atomic/FormElements/InputDateRange/InputDateRange.stories.js +149 -0
  120. package/src/Atomic/FormElements/InputDateRange/components/Datepicker.js +409 -0
  121. package/src/Atomic/FormElements/InputDateRange/components/OpenedPart.js +114 -0
  122. package/src/Atomic/FormElements/InputDateRange/components/SelectItem.js +24 -0
  123. package/src/Atomic/FormElements/InputDateRange/dependencies.js +161 -0
  124. package/src/Atomic/FormElements/InputsRow/InputsRow.js +28 -5
  125. package/src/Atomic/FormElements/InputsRow/InputsRow.scss +1 -3
  126. package/src/Atomic/FormElements/InputsRow/InputsRow.stories.js +0 -2
  127. package/src/Atomic/FormElements/Label/Label.js +3 -6
  128. package/src/Atomic/FormElements/Label/Label.scss +3 -3
  129. package/src/Atomic/FormElements/Label/Label.stories.js +6 -6
  130. package/src/Atomic/FormElements/Modal/Modal.js +5 -8
  131. package/src/Atomic/FormElements/Modal/Modal.scss +61 -7
  132. package/src/Atomic/FormElements/Modal/Modal.stories.js +60 -15
  133. package/src/Atomic/FormElements/MultiSelect/MultiSelect.js +3 -5
  134. package/src/Atomic/FormElements/MultiSelect/MultiSelect.scss +1 -3
  135. package/src/Atomic/FormElements/MultiSelect/MultiSelect.stories.js +1 -2
  136. package/src/Atomic/FormElements/NavLine/NavLine.js +3 -3
  137. package/src/Atomic/FormElements/NavLine/NavLine.scss +4 -6
  138. package/src/Atomic/FormElements/NavLine/NavLine.stories.js +23 -13
  139. package/src/Atomic/FormElements/RadioInput/RadioInput.stories.js +0 -2
  140. package/src/Atomic/FormElements/RangeCalendar/RangeCalendar.js +146 -0
  141. package/src/Atomic/FormElements/RangeCalendar/RangeCalendar.scss +101 -0
  142. package/src/Atomic/FormElements/RangeCalendar/RangeCalendar.stories.js +54 -0
  143. package/src/Atomic/FormElements/RangeInputs/RangeInputs.stories.js +0 -1
  144. package/src/Atomic/FormElements/Switcher/Switcher.stories.js +0 -2
  145. package/src/Atomic/FormElements/Table/Partials/TdHeader.js +1 -1
  146. package/src/Atomic/FormElements/Table/Table.scss +1 -1
  147. package/src/Atomic/FormElements/Table/TdTypes/TdActions.js +4 -4
  148. package/src/Atomic/FormElements/Table/TdTypes/TdPriority.js +3 -3
  149. package/src/Atomic/FormElements/Table/TdTypes/TdTypes.scss +4 -6
  150. package/src/Atomic/FormElements/Table/TdTypes/TdWeight.js +2 -2
  151. package/src/Atomic/FormElements/Tag/Tag.js +2 -2
  152. package/src/Atomic/FormElements/Tag/Tag.stories.js +0 -2
  153. package/src/Atomic/FormElements/TagsDropdown/TagsDropdown.js +3 -3
  154. package/src/Atomic/FormElements/TagsDropdown/TagsDropdown.stories.js +0 -2
  155. package/src/Atomic/FormElements/TextSwitcher/TextSwitcher.stories.js +0 -2
  156. package/src/Atomic/FormElements/Textarea/Textarea.scss +1 -1
  157. package/src/Atomic/FormElements/Textarea/Textarea.stories.js +0 -2
  158. package/src/Atomic/FormElements/TimeRange/TimeRange.js +1 -1
  159. package/src/Atomic/FormElements/TimeRange/TimeRange.stories.js +0 -2
  160. package/src/Atomic/MainMenu/MainMenu.js +3 -3
  161. package/src/Atomic/MainMenu/MainMenu.scss +2 -2
  162. package/src/Atomic/MainMenu/MainMenu.stories.js +11 -11
  163. package/src/Atomic/UI/Accordion/Accordion.scss +2 -2
  164. package/src/Atomic/UI/Accordion/Accordion.stories.js +4 -4
  165. package/src/Atomic/UI/Accordion/AccordionItem.js +1 -1
  166. package/src/Atomic/UI/AdvancedTag/AdvTag.js +3 -3
  167. package/src/Atomic/UI/AdvancedTag/AdvancedTags.js +3 -3
  168. package/src/Atomic/UI/AdvancedTag/AdvancedTags.scss +3 -5
  169. package/src/Atomic/UI/AdvancedTag/AdvancedTags.stories.js +1 -3
  170. package/src/Atomic/UI/Alert/Alert.scss +7 -0
  171. package/src/Atomic/UI/Alert/Alert.stories.js +1 -3
  172. package/src/Atomic/UI/Arrow/Arrow.js +41 -0
  173. package/src/Atomic/UI/Arrow/Arrow.scss +19 -0
  174. package/src/Atomic/UI/Arrow/Arrow.stories.js +32 -0
  175. package/src/Atomic/UI/Button/Button.js +6 -10
  176. package/src/Atomic/UI/Button/Button.scss +69 -41
  177. package/src/Atomic/UI/Button/Button.stories.js +9 -25
  178. package/src/Atomic/UI/Calendar/Calendar.js +109 -0
  179. package/src/Atomic/UI/Calendar/Calendar.scss +544 -0
  180. package/src/Atomic/UI/Calendar/Calendar.stories.js +24 -0
  181. package/src/Atomic/UI/Header/partials/default_ava.png +0 -0
  182. package/src/Atomic/UI/Hint/Hint.js +6 -9
  183. package/src/Atomic/UI/Hint/Hint.scss +8 -12
  184. package/src/Atomic/UI/Hint/Hint.stories.js +3 -3
  185. package/src/Atomic/UI/Price/Price.js +20 -0
  186. package/src/Atomic/UI/Price/Price.stories.js +30 -0
  187. package/src/Atomic/UI/Status/Status.scss +1 -1
  188. package/src/Atomic/UI/Status/Status.stories.js +4 -3
  189. package/src/Functions/useClickOutside.js +15 -0
  190. package/src/Functions/utils.js +6 -0
  191. package/src/Molecular/Datepicker/Datepicker.js +346 -0
  192. package/src/Molecular/Datepicker/Datepicker.scss +8 -0
  193. package/src/Molecular/Datepicker/Datepicker.stories.js +27 -0
  194. package/src/Molecular/Datepicker/components/Calendar.js +118 -0
  195. package/src/Molecular/FormElements/FormElement.js +18 -0
  196. package/src/Molecular/FormElements/FormElement.scss +8 -0
  197. package/src/Molecular/FormElements/FormElement.stories.js +59 -0
  198. package/src/scss/_vars.scss +3 -1
  199. package/src/scss/main.scss +3 -3
  200. package/dist/scss/anme/_anme-bootstrap-grid.scss +0 -748
  201. package/dist/scss/anme/_anme-elements.scss +0 -269
  202. package/dist/scss/anme/_anme-grid.scss +0 -111
  203. package/dist/scss/anme/_anme-justify.scss +0 -111
  204. package/dist/scss/anme/_anme-mixins-media.scss +0 -116
  205. package/dist/scss/anme/_anme-mixins.scss +0 -166
  206. package/dist/scss/anme/_anme-normalize.scss +0 -8
  207. package/dist/scss/anme/_anme-overall.scss +0 -34
  208. package/dist/scss/anme/_anme-padding-margins.scss +0 -419
  209. package/dist/scss/anme/_anme-table.scss +0 -81
  210. package/dist/scss/anme/_anme-theme.scss +0 -275
  211. package/dist/scss/anme/_anme-vars.scss +0 -91
  212. package/dist/scss/anme/_code-styling.scss +0 -23
  213. package/dist/scss/anme/styles.scss +0 -12
  214. package/src/scss/anme/_anme-bootstrap-grid.scss +0 -748
  215. package/src/scss/anme/_anme-elements.scss +0 -269
  216. package/src/scss/anme/_anme-grid.scss +0 -111
  217. package/src/scss/anme/_anme-justify.scss +0 -111
  218. package/src/scss/anme/_anme-mixins-media.scss +0 -116
  219. package/src/scss/anme/_anme-mixins.scss +0 -166
  220. package/src/scss/anme/_anme-normalize.scss +0 -8
  221. package/src/scss/anme/_anme-overall.scss +0 -34
  222. package/src/scss/anme/_anme-padding-margins.scss +0 -419
  223. package/src/scss/anme/_anme-table.scss +0 -81
  224. package/src/scss/anme/_anme-theme.scss +0 -275
  225. package/src/scss/anme/_anme-vars.scss +0 -91
  226. package/src/scss/anme/_code-styling.scss +0 -23
  227. 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 { FiCheck, FiChevronDown, FiChevronUp } from 'react-feather';
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, label, isLabelBold, hint, hintSide, isSearchable }) => {
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
- const filteredOptions = [...filteredItems, ...filteredGroups];
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={() => onChangeHandler(item)}
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
- <FiCheck />
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 || options.reduce((acc, item) => acc || item.items?.find(el => el.value === value)?.label, null);
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
- {label && <Label className={`${RC}-label`} isBold={isLabelBold} label={label} hint={hint} hintSide={hintSide} />}
79
- <button className={`${RC}__trigger`} onClick={() => setIsOpen(!isOpen)}>
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 ?? selectedLabel}
84
- onChange={e => onSearchHandler(e.target.value)}
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 })}>{isOpen ? <FiChevronUp /> : <FiChevronDown />}</span>
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
- {filteredOptions.map(filteredOption =>
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
- &_error {
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 Template = args => {
13
- const [value, setValue] = useState({});
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
- <div style={{ width: 200 }}>
16
- <Dropdown {...args} value={value} onChange={setValue} />
17
- </div>
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 { FiChevronRight, FiBell, FiPower } from 'react-feather';
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="header">
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 rel">
37
+ <div className="j6 user-menu">
39
38
  <div onClick={() => {}} className="header--bell">
40
- <FiBell className="header--bell-icon" />
41
- <GoPrimitiveDot className="header--bell-notification-icon" />
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 || defaultAva} alt="" />
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
- <FiChevronRight onClick={handle.toggleMenu} className={cn('accordion--title-chevron', { 'accordion--title-chevron-open': isOpen })} />
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
- <FiPower className="mr10" /> Logout
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
- color: #f06d8d;
50
- top: -8px;
51
- left: 10px;
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,8 +1,6 @@
1
1
  import React from 'react';
2
2
  import Header from './Header';
3
3
 
4
- import '../../../../scss/main.scss';
5
-
6
4
  global.lng = 'en';
7
5
 
8
6
  export default {
@@ -1,107 +1,117 @@
1
1
  import React, { useState, useEffect, useRef } from 'react';
2
2
  import cn from 'classnames';
3
- import { FiMinus, FiPlus } from 'react-feather';
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
- min,
13
+ numStep = 1,
14
+ min = 0,
18
15
  max,
19
- value = min,
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
- isRequired,
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 changeHandler = inputValue => {
38
- if (isNumeric || (type === 'number' && inputValue !== '')) {
39
- const totalValue = Number(+inputValue);
40
- if (totalValue >= (min ?? -Infinity) && totalValue <= (max ?? Infinity)) onChange(totalValue);
41
- return;
42
- }
43
- onChange(inputValue);
44
- };
45
-
46
- const toggleEditing = () => {
47
- setEditing(!isEditing);
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
- return (
57
- <div className={cn(className, RC)}>
58
- {label && <Label className={`${RC}-label`} isBold={isLabelBold} label={label} hint={hint} hintSide={hintSide} isRequired={isRequired} />}
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
- <div
61
- onMouseEnter={() => setOnInputHover(true)}
62
- onMouseLeave={() => setOnInputHover(false)}
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={`${RC}__nums`}>
83
- <button onClick={() => changeHandler(value - 1)} className={cn(`${RC}__num-btn`, { disabled: value === min })}>
84
- <FiMinus />
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={() => changeHandler(value + 1)} className={cn(`${RC}__num-btn`, { disabled: value === max })}>
87
- <FiPlus />
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
- {withDelete && onInputHover && !isNumeric && (
93
- <button
94
- className={cn(`${RC}__close`, { hidden: !value })}
95
- onClick={() => {
96
- toggleEditing();
97
- onChange('');
98
- }}
99
- />
100
- )}
101
- {icon ?? null}
102
- </div>
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
  };