intelicoreact 0.0.6 → 0.0.9

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 (117) hide show
  1. package/dist/Atomic/FormElements/CheckboxInput/CheckboxInput.js +6 -2
  2. package/dist/Atomic/FormElements/CheckboxInput/CheckboxInput.scss +91 -60
  3. package/dist/Atomic/FormElements/CheckboxInput/CheckboxInput.stories.js +2 -1
  4. package/dist/Atomic/FormElements/Dropdown/Dropdown.js +84 -28
  5. package/dist/Atomic/FormElements/Dropdown/Dropdown.scss +27 -3
  6. package/dist/Atomic/FormElements/Dropdown/Dropdown.stories.js +50 -7
  7. package/dist/Atomic/FormElements/Dropdown/components/DropdownLoader.js +20 -0
  8. package/dist/Atomic/FormElements/Dropdown/components/Loader.scss +57 -0
  9. package/dist/Atomic/FormElements/Input/Input.js +124 -50
  10. package/dist/Atomic/FormElements/Input/Input.stories.js +19 -15
  11. package/dist/Atomic/FormElements/InputCalendar/InputCalendar.js +33 -31
  12. package/dist/Atomic/FormElements/InputCalendar/InputCalendar.stories.js +29 -19
  13. package/dist/Atomic/FormElements/InputDateRange/{components/InputDateRange.js → InputDateRange.js} +54 -62
  14. package/dist/Atomic/FormElements/InputDateRange/{components/InputDateRange.scss → InputDateRange.scss} +254 -228
  15. package/dist/Atomic/FormElements/InputDateRange/InputDateRange.stories.js +15 -160
  16. package/dist/Atomic/FormElements/InputDateRange/components/Datepicker.js +72 -34
  17. package/dist/Atomic/FormElements/InputDateRange/components/OpenedPart.js +26 -11
  18. package/dist/Atomic/FormElements/InputDateRange/components/SelectItem.js +14 -6
  19. package/dist/Atomic/FormElements/InputDateRange/{index.js → dependencies.js} +19 -18
  20. package/dist/Atomic/FormElements/NumericInput/NumericInput.js +292 -0
  21. package/dist/Atomic/FormElements/NumericInput/NumericInput.scss +135 -0
  22. package/dist/Atomic/FormElements/NumericInput/NumericInput.stories.js +117 -0
  23. package/dist/Atomic/FormElements/RangeCalendar/RangeCalendar.js +10 -3
  24. package/dist/Atomic/FormElements/RangeCalendar/RangeCalendar.scss +4 -4
  25. package/dist/Atomic/FormElements/Table/Table.scss +1 -1
  26. package/dist/Atomic/FormElements/Textarea/Textarea.scss +1 -1
  27. package/dist/Atomic/MainMenu/MainMenu.scss +2 -2
  28. package/dist/Atomic/UI/Accordion/Accordion.scss +2 -2
  29. package/dist/Atomic/UI/Arrow/Arrow.js +6 -6
  30. package/dist/Atomic/UI/Arrow/Arrow.scss +0 -3
  31. package/dist/Atomic/UI/Calendar/Calendar.js +8 -5
  32. package/dist/Atomic/UI/Calendar/Calendar.scss +19 -3
  33. package/dist/Atomic/UI/Calendar/Calendar.stories.js +3 -2
  34. package/dist/Atomic/UI/Status/Status.scss +1 -1
  35. package/dist/Constants/index.constants.js +8 -0
  36. package/dist/Functions/inputExecutor.js +58 -0
  37. package/dist/Molecular/Datepicker/Datepicker.js +451 -0
  38. package/dist/Molecular/Datepicker/Datepicker.scss +8 -0
  39. package/dist/Molecular/Datepicker/Datepicker.stories.js +44 -0
  40. package/dist/{Atomic/FormElements/Calendar → Molecular/Datepicker/components}/Calendar.js +50 -39
  41. package/dist/scss/_vars.scss +3 -1
  42. package/dist/scss/main.scss +1 -1
  43. package/package.json +5 -4
  44. package/src/Atomic/FormElements/CheckboxInput/CheckboxInput.js +12 -2
  45. package/src/Atomic/FormElements/CheckboxInput/CheckboxInput.scss +91 -60
  46. package/src/Atomic/FormElements/CheckboxInput/CheckboxInput.stories.js +4 -3
  47. package/src/Atomic/FormElements/Dropdown/Dropdown.js +104 -39
  48. package/src/Atomic/FormElements/Dropdown/Dropdown.scss +27 -3
  49. package/src/Atomic/FormElements/Dropdown/Dropdown.stories.js +42 -15
  50. package/src/Atomic/FormElements/Dropdown/components/DropdownLoader.js +16 -0
  51. package/src/Atomic/FormElements/Dropdown/components/Loader.scss +57 -0
  52. package/src/Atomic/FormElements/Input/Input.js +108 -37
  53. package/src/Atomic/FormElements/Input/Input.stories.js +43 -22
  54. package/src/Atomic/FormElements/InputCalendar/InputCalendar.js +18 -17
  55. package/src/Atomic/FormElements/InputCalendar/InputCalendar.stories.js +17 -14
  56. package/src/Atomic/FormElements/InputDateRange/InputDateRange.js +219 -0
  57. package/src/Atomic/FormElements/InputDateRange/{components/InputDateRange.scss → InputDateRange.scss} +254 -228
  58. package/src/Atomic/FormElements/InputDateRange/InputDateRange.stories.js +38 -117
  59. package/src/Atomic/FormElements/InputDateRange/components/Datepicker.js +92 -53
  60. package/src/Atomic/FormElements/InputDateRange/components/OpenedPart.js +14 -5
  61. package/src/Atomic/FormElements/InputDateRange/components/SelectItem.js +5 -3
  62. package/src/Atomic/FormElements/InputDateRange/{index.js → dependencies.js} +16 -12
  63. package/src/Atomic/FormElements/NumericInput/NumericInput.js +263 -0
  64. package/src/Atomic/FormElements/NumericInput/NumericInput.scss +135 -0
  65. package/src/Atomic/FormElements/NumericInput/NumericInput.stories.js +78 -0
  66. package/src/Atomic/FormElements/RangeCalendar/RangeCalendar.js +6 -3
  67. package/src/Atomic/FormElements/RangeCalendar/RangeCalendar.scss +4 -4
  68. package/src/Atomic/FormElements/Table/Table.scss +1 -1
  69. package/src/Atomic/FormElements/Textarea/Textarea.scss +1 -1
  70. package/src/Atomic/MainMenu/MainMenu.scss +2 -2
  71. package/src/Atomic/UI/Accordion/Accordion.scss +2 -2
  72. package/src/Atomic/UI/Arrow/Arrow.js +4 -4
  73. package/src/Atomic/UI/Arrow/Arrow.scss +0 -3
  74. package/src/Atomic/UI/Calendar/Calendar.js +4 -4
  75. package/src/Atomic/UI/Calendar/Calendar.scss +19 -3
  76. package/src/Atomic/UI/Calendar/Calendar.stories.js +2 -1
  77. package/src/Atomic/UI/Status/Status.scss +1 -1
  78. package/src/Constants/index.constants.js +41 -0
  79. package/src/Functions/inputExecutor.js +53 -0
  80. package/src/Functions/utils.js +4 -1
  81. package/src/Molecular/Datepicker/Datepicker.js +346 -0
  82. package/src/Molecular/Datepicker/Datepicker.scss +8 -0
  83. package/src/Molecular/Datepicker/Datepicker.stories.js +27 -0
  84. package/src/Molecular/Datepicker/components/Calendar.js +118 -0
  85. package/src/scss/_vars.scss +3 -1
  86. package/src/scss/main.scss +1 -1
  87. package/dist/Atomic/FormElements/Calendar/Calendar.scss +0 -543
  88. package/dist/Atomic/FormElements/Calendar/Calendar.stories.js +0 -33
  89. package/dist/scss/anme/_anme-bootstrap-grid.scss +0 -748
  90. package/dist/scss/anme/_anme-elements.scss +0 -269
  91. package/dist/scss/anme/_anme-grid.scss +0 -111
  92. package/dist/scss/anme/_anme-justify.scss +0 -111
  93. package/dist/scss/anme/_anme-mixins-media.scss +0 -116
  94. package/dist/scss/anme/_anme-mixins.scss +0 -166
  95. package/dist/scss/anme/_anme-normalize.scss +0 -8
  96. package/dist/scss/anme/_anme-overall.scss +0 -34
  97. package/dist/scss/anme/_anme-padding-margins.scss +0 -419
  98. package/dist/scss/anme/_anme-table.scss +0 -81
  99. package/dist/scss/anme/_anme-theme.scss +0 -275
  100. package/dist/scss/anme/_anme-vars.scss +0 -91
  101. package/dist/scss/anme/_code-styling.scss +0 -23
  102. package/dist/scss/anme/styles.scss +0 -12
  103. package/src/Atomic/FormElements/InputDateRange/components/InputDateRange.js +0 -230
  104. package/src/scss/anme/_anme-bootstrap-grid.scss +0 -748
  105. package/src/scss/anme/_anme-elements.scss +0 -269
  106. package/src/scss/anme/_anme-grid.scss +0 -111
  107. package/src/scss/anme/_anme-justify.scss +0 -111
  108. package/src/scss/anme/_anme-mixins-media.scss +0 -116
  109. package/src/scss/anme/_anme-mixins.scss +0 -166
  110. package/src/scss/anme/_anme-normalize.scss +0 -8
  111. package/src/scss/anme/_anme-overall.scss +0 -34
  112. package/src/scss/anme/_anme-padding-margins.scss +0 -419
  113. package/src/scss/anme/_anme-table.scss +0 -81
  114. package/src/scss/anme/_anme-theme.scss +0 -275
  115. package/src/scss/anme/_anme-vars.scss +0 -91
  116. package/src/scss/anme/_code-styling.scss +0 -23
  117. package/src/scss/anme/styles.scss +0 -12
@@ -1,4 +1,6 @@
1
1
  /* THEME COLORS*/
2
+ @use "sass:math";
3
+
2
4
  $color--secondary: #f06d8d;
3
5
  $color--primary: #6b81dd;
4
6
  $color--dark: #1e1e2d;
@@ -43,4 +45,4 @@ $h4-fs: 22px;
43
45
  $h4-lh: 1.18;
44
46
 
45
47
  $txt: 14px;
46
- $txt--lh: (20 / 14);
48
+ $txt--lh: math.div(20, 14);
@@ -1,5 +1,5 @@
1
1
  @import './fonts';
2
- @import './anme/styles.scss';
2
+ @import '~anme/scss/styles.scss';
3
3
 
4
4
  body {
5
5
  font-family: 'Roboto', sans-serif;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "intelicoreact",
3
- "version": "0.0.6",
4
- "description": "Add date range selector",
3
+ "version": "0.0.9",
4
+ "description": "fix input-calendar",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {
7
7
  "test": "echo \"Error: no test specified\" && exit 1",
@@ -14,13 +14,14 @@
14
14
  "moment-timezone": "^0.5.34",
15
15
  "react": "^17.0.2",
16
16
  "react-feather": "^2.0.9",
17
- "react-input-mask": "^2.0.4"
17
+ "react-input-mask": "^2.0.4",
18
+ "classnames": "^2.3.1"
18
19
  },
19
20
  "devDependencies": {
20
21
  "@babel/cli": "^7.15.7",
21
22
  "@babel/core": "^7.15.5",
22
23
  "@babel/polyfill": "^7.12.1",
23
24
  "@babel/preset-env": "^7.15.6",
24
- "classnames": "^2.3.1"
25
+ "anme": "^1.0.0"
25
26
  }
26
27
  }
@@ -3,11 +3,21 @@ import cn from 'classnames';
3
3
 
4
4
  import './CheckboxInput.scss';
5
5
 
6
- const CheckboxInput = ({ label, id, value, onChange, disabled, className }) => {
6
+ const CheckboxInput = ({ label, id, value, onChange, disabled, className, isStark }) => {
7
7
  return (
8
8
  <label className={cn('checkbox-input', className, { [`checkbox-input_disabled`]: disabled })} htmlFor={id}>
9
9
  <div className={cn(`checkbox-input__input`, { [`checkbox-input__input_checked`]: value })}>
10
- <input id={id} type="checkbox" className="checkbox-input__checkbox" onChange={e => onChange(!value, e)} checked={value} disabled={disabled} />
10
+ <input
11
+ id={id}
12
+ type="checkbox"
13
+ className="checkbox-input__checkbox"
14
+ onChange={(e) => onChange(!value, e)}
15
+ checked={value}
16
+ disabled={disabled}
17
+ ref={(elem) => {
18
+ if (elem) elem.indeterminate = isStark;
19
+ }}
20
+ />
11
21
  <span className="checkbox-input__mark" />
12
22
  </div>
13
23
  {label && <div className="checkbox-input__label">{label}</div>}
@@ -1,76 +1,107 @@
1
1
  .checkbox-input {
2
- display: flex;
3
- align-items: center;
4
- cursor: pointer;
2
+ display: flex;
3
+ align-items: center;
4
+ cursor: pointer;
5
+
6
+ &_disabled {
7
+ opacity: 0.5;
8
+ pointer-events: none;
9
+ cursor: auto;
10
+ }
5
11
 
6
- &_disabled {
7
- opacity: .5;
8
- pointer-events: none;
9
- cursor: auto;
12
+ &:hover {
13
+ .checkbox-input__input {
14
+ background-color: rgba(#6b81dd, 0.2);
10
15
  }
16
+ }
17
+
18
+ &__input {
19
+ position: relative;
20
+ height: 14px;
21
+ width: 14px;
22
+ min-width: 14px;
23
+ border: 1px solid #9aa0b9;
24
+ border-radius: 2px;
25
+ overflow: hidden;
26
+ margin-right: 5px;
27
+ cursor: pointer;
28
+ transition: background-color 0.2s ease;
29
+ background-color: #ffff;
11
30
 
12
- &:hover {
13
- .checkbox-input__input {
14
- background-color: rgba(#6b81dd, .2);
15
- }
31
+ &_checked {
32
+ border-color: #6b81dd;
16
33
  }
17
34
 
18
- &__input {
19
- position: relative;
20
- height: 14px;
21
- width: 14px;
22
- min-width: 14px;
23
- border: 1px solid #9AA0B9;
24
- border-radius: 2px;
25
- overflow: hidden;
26
- margin-right: 5px;
27
- cursor: pointer;
28
- transition: background-color .2s ease;
29
- background-color: #ffff;
35
+ .checkbox-input__checkbox:checked ~ .checkbox-input__mark {
36
+ display: block;
37
+ }
38
+ }
30
39
 
31
- &_checked {
32
- border-color: #6b81dd;
33
- }
40
+ &__checkbox {
41
+ opacity: 0;
42
+ position: absolute;
43
+ height: 0;
44
+ width: 0;
45
+ }
34
46
 
35
- .checkbox-input__checkbox:checked ~ .checkbox-input__mark {
36
- display: block;
37
- }
47
+ &__mark {
48
+ display: none;
49
+ position: absolute;
50
+ width: 14px;
51
+ height: 14px;
52
+ background-color: #6b81dd;
38
53
 
54
+ &:after {
55
+ content: "";
56
+ position: absolute;
57
+ top: -2px;
58
+ bottom: 0;
59
+ left: 0;
60
+ right: 0;
61
+ margin: auto;
62
+ width: 4px;
63
+ height: 8px;
64
+ border: solid white;
65
+ border-radius: 2px;
66
+ border-width: 0 2px 2px 0;
67
+ transform: rotate(45deg);
39
68
  }
69
+ }
40
70
 
41
- &__checkbox {
42
- opacity: 0;
43
- position: absolute;
44
- height: 0;
45
- width: 0;
46
- }
71
+ &__label {
72
+ font-size: 13px;
73
+ user-select: none;
74
+ }
47
75
 
48
- &__mark {
49
- display: none;
76
+ input[type="checkbox" i] {
77
+ &:indeterminate {
78
+ display: block;
79
+ width: 100%;
80
+ height: 100%;
81
+ &:after {
82
+ content: "";
50
83
  position: absolute;
51
- width: 14px;
52
- height: 14px;
84
+ top: 0;
85
+ bottom: 0;
86
+ left: 0;
87
+ right: 0;
88
+ margin: auto;
89
+ width: 100%;
90
+ height: 100%;
53
91
  background-color: #6b81dd;
54
-
55
- &:after {
56
- content: '';
57
- position: absolute;
58
- top: -2px;
59
- bottom: 0;
60
- left: 0;
61
- right: 0;
62
- margin: auto;
63
- width: 4px;
64
- height: 8px;
65
- border: solid white;
66
- border-radius: 2px;
67
- border-width: 0 2px 2px 0;
68
- transform: rotate(45deg);
69
- }
70
- }
71
-
72
- &__label{
73
- font-size: 13px;
74
- user-select: none;
92
+ }
93
+ &:before {
94
+ content: "";
95
+ position: absolute;
96
+ top: 50%;
97
+ left: 50%;
98
+ transform: translate(-50%, -50%);
99
+ width: 65%;
100
+ border: solid white;
101
+ border-radius: 2px;
102
+ border-width: 0 2px 2px 0;
103
+ z-index: 1;
104
+ }
75
105
  }
106
+ }
76
107
  }
@@ -5,10 +5,10 @@ global.lng = 'en';
5
5
 
6
6
  export default {
7
7
  title: 'Form Elements/CheckboxInput',
8
- component: CheckboxInput
8
+ component: CheckboxInput,
9
9
  };
10
10
 
11
- const Template = args => {
11
+ const Template = (args) => {
12
12
  const { value: argsValue } = args;
13
13
  const [value, setValue] = useState(argsValue);
14
14
 
@@ -21,5 +21,6 @@ Checkbox.args = {
21
21
  label: 'Test label',
22
22
  value: true,
23
23
  disabled: false,
24
- forced: false
24
+ forced: false,
25
+ isStark: true,
25
26
  };
@@ -1,53 +1,84 @@
1
- import React, { useState, useRef, useEffect } from 'react';
1
+ import React, { useState, useRef, useEffect, useCallback } from 'react';
2
2
  import cn from 'classnames';
3
3
  import { Check, ChevronDown, ChevronUp } from 'react-feather';
4
- import Label from '../Label/Label';
4
+
5
+ import DropdownLoader from './components/DropdownLoader';
5
6
 
6
7
  import './Dropdown.scss';
7
8
 
8
9
  const RC = 'dropdown';
9
10
 
10
- const Dropdown = ({ options, value, error, onChange, placeholder, className, isSearchable }) => {
11
+ const Dropdown = ({ options = [], value, error, disabled, onChange, placeholder, className, isSearchable, entity, scrollReactionObj }) => {
11
12
  const [isOpen, setIsOpen] = useState(false);
12
- const [searchValue, setSearchValue] = useState('');
13
+ const [searchValue, setSearchValue] = useState();
13
14
  const dropdownRef = useRef(null);
15
+ const dropdownListRef = useRef(null);
14
16
 
17
+ if (!options) return null;
15
18
  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);
19
+ .filter((item) => item.items?.length)
20
+ .map((item) => ({ ...item, items: item.items.filter((el) => el?.label?.toLowerCase().includes(searchValue?.toLowerCase() || '')) }))
21
+ .filter((item) => item.items?.length > 0);
19
22
 
20
23
  const filteredItems = options
21
- .filter(item => !item.items?.length)
22
- .filter(item => item?.label?.toLowerCase().includes(searchValue?.toLowerCase() || ''));
24
+ .filter((item) => !item.items?.length)
25
+ .filter((item) => item?.label?.toLowerCase().includes(searchValue?.toLowerCase() || ''));
23
26
 
24
27
  const filteredOptions = [...filteredItems, ...filteredGroups];
25
28
 
26
- const handleClickOutside = event => {
29
+ const modalBtnTrigger = entity && entity !== '' && typeof entity === 'string';
30
+ const onChangeHandler = (item) => {
31
+ setIsOpen(false);
32
+ setSearchValue(null);
33
+ onChange(item.value);
34
+ };
35
+ // decorator
36
+ const getDepends = (getDependsTrigger) => {
37
+ const newOnChange = (e) => {
38
+ if (e.value === 'open_modal') {
39
+ onChange('open_modal');
40
+ } else {
41
+ onChangeHandler(e);
42
+ }
43
+ };
44
+
45
+ // add pseudo option
46
+ const newOptions = [
47
+ {
48
+ label: `New ${entity}`,
49
+ value: 'open_modal',
50
+ className: 'dropdown__list-item--modal',
51
+ },
52
+ ...filteredOptions,
53
+ ];
54
+
55
+ return {
56
+ onChange: (changeItem) => (getDependsTrigger ? newOnChange(changeItem) : onChangeHandler(changeItem)),
57
+ options: getDependsTrigger ? newOptions : options,
58
+ };
59
+ };
60
+
61
+ const handleClickOutside = (event) => {
27
62
  if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {
28
63
  setIsOpen(false);
29
64
  setSearchValue(null);
30
65
  }
31
66
  };
32
67
 
33
- const onChangeHandler = item => {
34
- setIsOpen(false);
35
- setSearchValue(null);
36
- onChange(item.value);
37
- };
38
-
39
- const onSearchHandler = name => {
68
+ const onSearchHandler = (name) => {
40
69
  setSearchValue(name);
41
70
  };
42
71
 
43
- const hightlightedText = text =>
44
- searchValue ? text?.replace(new RegExp(searchValue, 'i'), match => `<span class="bg--yellow">${match}</span>`) : text;
72
+ const hightlightedText = (text) =>
73
+ searchValue ? text?.replace(new RegExp(searchValue, 'i'), (match) => `<span class="bg--yellow">${match}</span>`) : text;
74
+
75
+ const depend = getDepends(modalBtnTrigger);
45
76
 
46
- const getMarkupForElement = item =>
77
+ const getMarkupForElement = (item) =>
47
78
  item.label.toLowerCase().includes(searchValue?.toLowerCase() || '') ? (
48
79
  <button
49
80
  key={item.value}
50
- onClick={() => onChangeHandler(item)}
81
+ onClick={() => depend.onChange(item)}
51
82
  className={cn(`${RC}__list-item`, { [`${RC}__list-item_active`]: item.value === value }, { [`${RC}__list-item_disabled`]: item.disabled })}
52
83
  >
53
84
  <span className={cn(`${RC}__active-icon`, { [`${RC}__active-icon_active`]: item.value === value })}>
@@ -57,47 +88,81 @@ const Dropdown = ({ options, value, error, onChange, placeholder, className, isS
57
88
  </button>
58
89
  ) : null;
59
90
 
60
- useEffect(() => {
61
- document.addEventListener('click', handleClickOutside, true);
62
- return () => document.removeEventListener('click', handleClickOutside, true);
63
- });
64
-
65
- const filteredOptionList = filteredOption =>
91
+ const filteredOptionList = (filteredOption) =>
66
92
  filteredOption.items?.length > 0 ? (
67
93
  <div key={filteredOption.value} className={`${RC}-group`}>
68
94
  <div className={`${RC}-group__name`}>{filteredOption.label}</div>
69
- {filteredOption.items.map(el => getMarkupForElement(el))}
95
+ {filteredOption.items.map((el) => getMarkupForElement(el))}
70
96
  </div>
71
97
  ) : null;
72
98
 
73
99
  const selectedLabel =
74
- options.find(el => el.value === value)?.label || options.reduce((acc, item) => acc || item.items?.find(el => el.value === value)?.label, null);
100
+ options.find((el) => el.value === value)?.label ||
101
+ options.reduce((acc, item) => acc || item.items?.find((el) => el.value === value)?.label, null);
102
+
103
+ const doScrollCallback = useCallback(
104
+ (e) => {
105
+ const { callback, isWithAnyScrolling } = scrollReactionObj;
106
+ if (callback && typeof callback === 'function') {
107
+ if (isWithAnyScrolling) callback(e);
108
+ else if (e.target.clientHeight + e.target.scrollTop >= e.target.scrollHeight) callback(e);
109
+ }
110
+ },
111
+ [filteredOptions]
112
+ );
113
+
114
+ useEffect(() => {
115
+ if (!value) setSearchValue(null);
116
+ document.addEventListener('click', handleClickOutside, true);
117
+ return () => document.removeEventListener('click', handleClickOutside, true);
118
+ }, [value]);
119
+
120
+ useEffect(() => {
121
+ if (scrollReactionObj && typeof scrollReactionObj === 'object' && isOpen && dropdownListRef && dropdownListRef.current) {
122
+ dropdownListRef.current.addEventListener('scroll', doScrollCallback);
123
+ }
124
+ return () => {
125
+ if (scrollReactionObj && typeof scrollReactionObj === 'object') removeEventListener('scroll', doScrollCallback);
126
+ };
127
+ }, [isOpen, dropdownListRef]);
75
128
 
76
129
  return (
77
- <div className={cn(RC, className)} ref={dropdownRef}>
78
- <button className={`${RC}__trigger input__wrap ${!value ? 'placeholder' : ''} ${error ? 'error' : ''}`} onClick={() => !isSearchable ? setIsOpen(!isOpen) : null}>
130
+ <div
131
+ className={cn(RC, className, {
132
+ disabled: disabled,
133
+ })}
134
+ ref={dropdownRef}
135
+ >
136
+ <button
137
+ className={`${RC}__trigger input__wrap ${!value ? 'placeholder' : ''} ${error ? 'error' : ''}`}
138
+ onClick={() => (!isSearchable ? setIsOpen(!isOpen) : null)}
139
+ >
79
140
  {isSearchable ? (
80
141
  <input
81
142
  className={`${RC}__input`}
82
- value={searchValue ?? selectedLabel}
83
- onChange={e => onSearchHandler(e.target.value)}
143
+ value={searchValue || selectedLabel || ''}
144
+ onChange={(e) => {
145
+ onSearchHandler(e.target.value);
146
+ }}
84
147
  placeholder={placeholder}
85
- onFocus={() => setIsOpen(true)}
148
+ onFocus={(e) => {
149
+ e.target.select();
150
+ setIsOpen(true);
151
+ }}
86
152
  />
87
153
  ) : (
88
- <span className="text">
89
- {selectedLabel || placeholder}
90
- </span>
154
+ <span className="text">{selectedLabel || placeholder}</span>
91
155
  )}
92
156
  <span className={cn(`${RC}__arrow`, { [`${RC}__arrow_active`]: isOpen })} onClick={() => setIsOpen(!isOpen)}>
93
157
  {isOpen ? <ChevronUp /> : <ChevronDown />}
94
158
  </span>
95
159
  </button>
96
160
  {isOpen && filteredOptions.length > 0 && (
97
- <div className={`${RC}__list`}>
98
- {filteredOptions.map(filteredOption =>
161
+ <div className={`${RC}__list`} ref={dropdownListRef}>
162
+ {depend.options.map((filteredOption) =>
99
163
  filteredOption.items?.length ? filteredOptionList(filteredOption) : getMarkupForElement(filteredOption)
100
164
  )}
165
+ {disabled && isOpen && <DropdownLoader />}
101
166
  </div>
102
167
  )}
103
168
  </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;
@@ -28,8 +29,8 @@
28
29
  &.error {
29
30
  border-color: $color--secondary;
30
31
  }
31
- &.placeholder .text{
32
- opacity: .7;
32
+ &.placeholder .text {
33
+ opacity: 0.7;
33
34
  }
34
35
  }
35
36
 
@@ -44,6 +45,7 @@
44
45
  }
45
46
 
46
47
  &__list {
48
+ position: relative;
47
49
  background: #ffffff;
48
50
  border: 1px solid #e2e5ec;
49
51
  box-shadow: 0 5px 20px rgb(0 0 0 / 15%);
@@ -85,7 +87,24 @@
85
87
  width: 100%;
86
88
  height: 24px;
87
89
  white-space: nowrap;
88
-
90
+ overflow-x: hidden;
91
+
92
+ &--modal {
93
+ color: #1f7499;
94
+ font-size: 14px;
95
+ line-height: 20px;
96
+ letter-spacing: 0.2px;
97
+ position: relative;
98
+ &:after {
99
+ content: "";
100
+ position: absolute;
101
+ bottom: -2px;
102
+ height: 1px;
103
+ width: 300%;
104
+ transform: translateX(-50%);
105
+ background-color: #e8e9ec;
106
+ }
107
+ }
89
108
  &:hover,
90
109
  &_active {
91
110
  background: $color--gray--gentle;
@@ -159,4 +178,9 @@
159
178
  font-size: 10px;
160
179
  color: $color--secondary;
161
180
  }
181
+
182
+ &.disabled {
183
+ pointer-events: none;
184
+ opacity: 0.5;
185
+ }
162
186
  }
@@ -7,21 +7,46 @@ export default {
7
7
  component: Dropdown,
8
8
  argTypes: {
9
9
  className: {
10
- description: 'string'
10
+ description: 'string',
11
11
  },
12
- value: { description: 'string - current option'},
12
+ value: { description: 'string - current option' },
13
13
  isSearchable: {
14
14
  description: 'boolean - enable search',
15
15
  },
16
- onChange: { description: 'callback return selected value'}
17
- }
16
+ onChange: { description: 'callback return selected value' },
17
+ entity: {
18
+ description: 'string',
19
+ },
20
+ },
21
+ };
22
+
23
+ const blockStyles = {
24
+ display: 'flex',
25
+ flexFlow: 'row no-wrap',
26
+ alignItems: 'center',
27
+ };
28
+
29
+ const buttonStyles = {
30
+ border: 'solid 1px #000',
31
+ padding: '5px',
32
+ margin: '0 0 0 50px',
18
33
  };
19
34
 
20
- const Template = args => {
21
- const [value, setValue] = useState('');
35
+ const Template = (args) => {
36
+ const [value, setValue] = useState(args.value);
37
+ const [disabled, setDisabled] = useState(false);
22
38
  return (
23
- <div style={{ width: 200 }}>
24
- <Dropdown {...args} value={value} onChange={setValue} />
39
+ <div style={blockStyles}>
40
+ <div key="dropdown" style={{ width: 200 }}>
41
+ <Dropdown {...args} value={value} onChange={setValue} disabled={disabled} scrollReactionObj={{ callback: (e) => setDisabled(true) }} />
42
+ </div>
43
+ <button key="reset" style={buttonStyles} className="mt10" onClick={() => setValue('')}>
44
+ Reset
45
+ </button>
46
+
47
+ <button key="enable/disable" style={buttonStyles} className="mt10" onClick={() => setDisabled(!disabled)}>
48
+ {disabled ? 'enable' : 'disable'}
49
+ </button>
25
50
  </div>
26
51
  );
27
52
  };
@@ -29,13 +54,15 @@ const Template = args => {
29
54
  export const DropdownTemplate = Template.bind({});
30
55
 
31
56
  DropdownTemplate.args = {
57
+ entity: 'entity',
58
+ value: 'drop6',
32
59
  placeholder: 'Placeholder',
33
60
  isSearchable: true,
34
61
  options: [
35
- { label: 'Dropdown1', value: 'drop1', className: 'status status--approved' },
36
62
  { label: 'Dropdown2', value: 'drop2' },
37
63
  { label: 'Dropdown3', value: 'drop3', disabled: true },
38
64
  { label: 'Dropdown4', value: 'drop4' },
65
+ { label: 'Dropdown1', value: 'drop1', className: 'status status--approved' },
39
66
  { label: 'Dropdown5', value: 'drop5' },
40
67
  { label: 'Dropdown6', value: 'drop6' },
41
68
  {
@@ -43,17 +70,17 @@ DropdownTemplate.args = {
43
70
  items: [
44
71
  { label: 'Group 11', value: 'group11' },
45
72
  { label: 'Group 12', value: 'group12', disabled: true },
46
- { label: 'Group 13', value: 'group13' }
47
- ]
73
+ { label: 'Group 13', value: 'group13' },
74
+ ],
48
75
  },
49
76
  {
50
77
  label: 'Some Group 2',
51
78
  items: [
52
79
  { label: 'Group 21', value: 'group21' },
53
80
  { label: 'Group 22', value: 'group22' },
54
- { label: 'Group 23', value: 'group23' }
55
- ]
56
- }
81
+ { label: 'Group 23', value: 'group23' },
82
+ ],
83
+ },
57
84
  ],
58
- error: ''
85
+ error: '',
59
86
  };
@@ -0,0 +1,16 @@
1
+ import './Loader.scss';
2
+
3
+ const DropdownLoader = function ({ variant }) {
4
+ return (
5
+ <div className="dropdown-loader-box j5">
6
+ <div className={`lds-ring${variant === 'little' ? ' lds-ring_little' : ''}`}>
7
+ <div />
8
+ <div />
9
+ <div />
10
+ <div />
11
+ </div>
12
+ </div>
13
+ );
14
+ };
15
+
16
+ export default DropdownLoader;