@zohodesk/components 1.0.0-temp-220.11 → 1.0.0-temp-230

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 (161) hide show
  1. package/.cli/propValidation_report.html +1 -1
  2. package/README.md +33 -1
  3. package/assets/Appearance/dark/mode/Component_DarkMode.module.css +8 -0
  4. package/assets/Appearance/light/mode/Component_LightMode.module.css +8 -0
  5. package/assets/Appearance/pureDark/mode/Component_PureDarkMode.module.css +8 -0
  6. package/es/Accordion/Accordion.js +1 -1
  7. package/es/AppContainer/AppContainer.js +1 -1
  8. package/es/Card/Card.js +48 -14
  9. package/es/Card/__tests__/Card.spec.js +81 -2
  10. package/es/Card/__tests__/__snapshots__/Card.spec.js.snap +44 -0
  11. package/es/Card/props/defaultProps.js +2 -1
  12. package/es/Card/props/propTypes.js +2 -1
  13. package/es/ColorSelect/ColorMultiSelect.js +36 -0
  14. package/es/ColorSelect/ColorSingleSelect.js +50 -0
  15. package/es/ColorSelect/__tests__/ColorMultiSelect.spec.js +59 -0
  16. package/es/ColorSelect/__tests__/ColorSingleSelect.spec.js +59 -0
  17. package/es/ColorSelect/__tests__/__snapshots__/ColorMultiSelect.spec.js.snap +547 -0
  18. package/es/ColorSelect/__tests__/__snapshots__/ColorSingleSelect.spec.js.snap +178 -0
  19. package/es/ColorSelect/common/ColorIndicator/ColorIndicator.js +27 -0
  20. package/es/ColorSelect/common/ColorIndicator/ColorIndicator.module.css +18 -0
  21. package/es/ColorSelect/common/ColorIndicator/__tests__/ColorSingleSelect.spec.js +60 -0
  22. package/es/ColorSelect/common/ColorIndicator/__tests__/__snapshots__/ColorSingleSelect.spec.js.snap +95 -0
  23. package/es/ColorSelect/common/ColorIndicator/props/defaultProps.js +7 -0
  24. package/es/ColorSelect/common/ColorIndicator/props/propTypes.js +9 -0
  25. package/es/ColorSelect/common/ColoredTag/ColoredTag.js +33 -0
  26. package/es/ColorSelect/common/ColoredTag/__tests__/ColoredTag.spec.js +50 -0
  27. package/es/ColorSelect/common/ColoredTag/__tests__/__snapshots__/ColoredTag.spec.js.snap +101 -0
  28. package/es/ColorSelect/common/ColoredTag/props/propTypes.js +9 -0
  29. package/es/ColorSelect/common/helpers.js +35 -0
  30. package/es/ColorSelect/props/defaultProps.js +13 -0
  31. package/es/ColorSelect/props/propTypes.js +14 -0
  32. package/es/DateTime/__tests__/__snapshots__/DateTime.spec.js.snap +9 -18
  33. package/es/DateTime/__tests__/__snapshots__/DateWidget.spec.js.snap +3 -6
  34. package/es/DateTime/__tests__/__snapshots__/Time.spec.js.snap +9 -18
  35. package/es/DropBox/DropBoxElement/css/DropBoxElement.module.css +7 -0
  36. package/es/InputFieldLine/InputFieldLine.js +39 -0
  37. package/es/InputFieldLine/InputFieldLine.module.css +90 -0
  38. package/es/InputFieldLine/__tests__/InputFieldLine.spec.js +114 -0
  39. package/es/InputFieldLine/__tests__/__snapshots__/InputFieldLine.spec.js.snap +194 -0
  40. package/es/InputFieldLine/props/defaultProps.js +14 -0
  41. package/es/InputFieldLine/props/propTypes.js +19 -0
  42. package/es/ListItem/ListItem.js +7 -2
  43. package/es/ListItem/ListItem.module.css +6 -0
  44. package/es/ListItem/__tests__/ListItem.spec.js +8 -0
  45. package/es/ListItem/__tests__/__snapshots__/ListItem.spec.js.snap +47 -0
  46. package/es/ListItem/props/propTypes.js +2 -1
  47. package/es/MultiSelect/MultiSelect.js +14 -4
  48. package/es/MultiSelect/SelectedOptions.js +24 -1
  49. package/es/MultiSelect/Suggestions.js +3 -1
  50. package/es/MultiSelect/__tests__/MultiSelect.spec.js +38 -0
  51. package/es/MultiSelect/__tests__/SelectedOptions.spec.js +13 -0
  52. package/es/MultiSelect/__tests__/Suggestions.spec.js +12 -0
  53. package/es/MultiSelect/__tests__/__snapshots__/AdvancedGroupMultiSelect.spec.js.snap +3 -3
  54. package/es/MultiSelect/__tests__/__snapshots__/AdvancedMultiSelect.spec.js.snap +9 -9
  55. package/es/MultiSelect/__tests__/__snapshots__/MultiSelect.spec.js.snap +88 -3
  56. package/es/MultiSelect/__tests__/__snapshots__/MultiSelectWithAvatar.spec.js.snap +3 -3
  57. package/es/MultiSelect/__tests__/__snapshots__/SelectedOptions.spec.js.snap +15 -0
  58. package/es/MultiSelect/__tests__/__snapshots__/Suggestions.spec.js.snap +66 -0
  59. package/es/MultiSelect/props/propTypes.js +9 -3
  60. package/es/Popup/Popup.js +3 -3
  61. package/es/Select/ArrowIcon/ArrowIcon.js +48 -0
  62. package/es/Select/ArrowIcon/ArrowIcon.module.css +22 -0
  63. package/es/Select/Select.js +33 -4
  64. package/es/Select/__tests__/Select.spec.js +25 -0
  65. package/es/Select/__tests__/__snapshots__/GroupSelect.spec.js.snap +3 -6
  66. package/es/Select/__tests__/__snapshots__/Select.spec.js.snap +516 -419
  67. package/es/Select/__tests__/__snapshots__/SelectWithIcon.spec.js.snap +3 -6
  68. package/es/Select/props/propTypes.js +2 -1
  69. package/es/TextBoxIcon/TextBoxIcon.js +18 -12
  70. package/es/TextBoxIcon/TextBoxIcon.module.css +3 -38
  71. package/es/TextBoxIcon/__tests__/TextBoxIcon.spec.js +1 -2
  72. package/es/TextBoxIcon/__tests__/__snapshots__/TextBoxIcon.spec.js.snap +116 -225
  73. package/es/TextBoxIcon/props/propTypes.js +1 -2
  74. package/es/common/basic.module.css +0 -2
  75. package/es/components_layer.module.css +1 -0
  76. package/es/utils/Common.js +3 -1
  77. package/es/utils/dropDownUtils.js +8 -2
  78. package/es/v1/Popup/Popup.js +1 -1
  79. package/es/v1/Select/Select.js +1 -1
  80. package/lib/Accordion/Accordion.js +2 -2
  81. package/lib/AppContainer/AppContainer.js +1 -1
  82. package/lib/Card/Card.js +64 -30
  83. package/lib/Card/__tests__/Card.spec.js +118 -1
  84. package/lib/Card/__tests__/__snapshots__/Card.spec.js.snap +44 -0
  85. package/lib/Card/props/defaultProps.js +2 -1
  86. package/lib/Card/props/propTypes.js +2 -1
  87. package/lib/ColorSelect/ColorMultiSelect.js +65 -0
  88. package/lib/ColorSelect/ColorSingleSelect.js +78 -0
  89. package/lib/ColorSelect/__tests__/ColorMultiSelect.spec.js +70 -0
  90. package/lib/ColorSelect/__tests__/ColorSingleSelect.spec.js +70 -0
  91. package/lib/ColorSelect/__tests__/__snapshots__/ColorMultiSelect.spec.js.snap +547 -0
  92. package/lib/ColorSelect/__tests__/__snapshots__/ColorSingleSelect.spec.js.snap +178 -0
  93. package/lib/ColorSelect/common/ColorIndicator/ColorIndicator.js +40 -0
  94. package/lib/ColorSelect/common/ColorIndicator/ColorIndicator.module.css +18 -0
  95. package/lib/ColorSelect/common/ColorIndicator/__tests__/ColorSingleSelect.spec.js +67 -0
  96. package/lib/ColorSelect/common/ColorIndicator/__tests__/__snapshots__/ColorSingleSelect.spec.js.snap +95 -0
  97. package/lib/ColorSelect/common/ColorIndicator/props/defaultProps.js +14 -0
  98. package/lib/ColorSelect/common/ColorIndicator/props/propTypes.js +20 -0
  99. package/lib/ColorSelect/common/ColoredTag/ColoredTag.js +61 -0
  100. package/lib/ColorSelect/common/ColoredTag/__tests__/ColoredTag.spec.js +58 -0
  101. package/lib/ColorSelect/common/ColoredTag/__tests__/__snapshots__/ColoredTag.spec.js.snap +101 -0
  102. package/lib/ColorSelect/common/ColoredTag/props/propTypes.js +28 -0
  103. package/lib/ColorSelect/common/helpers.js +53 -0
  104. package/lib/ColorSelect/props/defaultProps.js +31 -0
  105. package/lib/ColorSelect/props/propTypes.js +35 -0
  106. package/lib/DateTime/__tests__/__snapshots__/DateTime.spec.js.snap +9 -18
  107. package/lib/DateTime/__tests__/__snapshots__/DateWidget.spec.js.snap +3 -6
  108. package/lib/DateTime/__tests__/__snapshots__/Time.spec.js.snap +9 -18
  109. package/lib/DropBox/DropBoxElement/css/DropBoxElement.module.css +7 -0
  110. package/lib/InputFieldLine/InputFieldLine.js +53 -0
  111. package/lib/InputFieldLine/InputFieldLine.module.css +90 -0
  112. package/lib/InputFieldLine/__tests__/InputFieldLine.spec.js +122 -0
  113. package/lib/InputFieldLine/__tests__/__snapshots__/InputFieldLine.spec.js.snap +194 -0
  114. package/lib/InputFieldLine/props/defaultProps.js +21 -0
  115. package/lib/InputFieldLine/props/propTypes.js +36 -0
  116. package/lib/ListItem/ListItem.js +7 -2
  117. package/lib/ListItem/ListItem.module.css +6 -0
  118. package/lib/ListItem/__tests__/ListItem.spec.js +8 -0
  119. package/lib/ListItem/__tests__/__snapshots__/ListItem.spec.js.snap +47 -0
  120. package/lib/ListItem/props/propTypes.js +2 -1
  121. package/lib/MultiSelect/MultiSelect.js +14 -6
  122. package/lib/MultiSelect/SelectedOptions.js +24 -1
  123. package/lib/MultiSelect/Suggestions.js +3 -1
  124. package/lib/MultiSelect/__tests__/MultiSelect.spec.js +40 -0
  125. package/lib/MultiSelect/__tests__/SelectedOptions.spec.js +15 -0
  126. package/lib/MultiSelect/__tests__/Suggestions.spec.js +14 -0
  127. package/lib/MultiSelect/__tests__/__snapshots__/AdvancedGroupMultiSelect.spec.js.snap +3 -3
  128. package/lib/MultiSelect/__tests__/__snapshots__/AdvancedMultiSelect.spec.js.snap +9 -9
  129. package/lib/MultiSelect/__tests__/__snapshots__/MultiSelect.spec.js.snap +88 -3
  130. package/lib/MultiSelect/__tests__/__snapshots__/MultiSelectWithAvatar.spec.js.snap +3 -3
  131. package/lib/MultiSelect/__tests__/__snapshots__/SelectedOptions.spec.js.snap +15 -0
  132. package/lib/MultiSelect/__tests__/__snapshots__/Suggestions.spec.js.snap +66 -0
  133. package/lib/MultiSelect/props/propTypes.js +9 -3
  134. package/lib/Popup/Popup.js +4 -4
  135. package/lib/Select/ArrowIcon/ArrowIcon.js +62 -0
  136. package/lib/Select/ArrowIcon/ArrowIcon.module.css +22 -0
  137. package/lib/Select/Select.js +34 -4
  138. package/lib/Select/__tests__/Select.spec.js +177 -148
  139. package/lib/Select/__tests__/__snapshots__/GroupSelect.spec.js.snap +3 -6
  140. package/lib/Select/__tests__/__snapshots__/Select.spec.js.snap +516 -419
  141. package/lib/Select/__tests__/__snapshots__/SelectWithIcon.spec.js.snap +3 -6
  142. package/lib/Select/props/propTypes.js +2 -1
  143. package/lib/TextBoxIcon/TextBoxIcon.js +19 -13
  144. package/lib/TextBoxIcon/TextBoxIcon.module.css +3 -38
  145. package/lib/TextBoxIcon/__tests__/TextBoxIcon.spec.js +1 -2
  146. package/lib/TextBoxIcon/__tests__/__snapshots__/TextBoxIcon.spec.js.snap +116 -225
  147. package/lib/TextBoxIcon/props/propTypes.js +1 -2
  148. package/lib/common/basic.module.css +0 -2
  149. package/lib/components_layer.module.css +1 -0
  150. package/lib/utils/Common.js +9 -3
  151. package/lib/utils/dropDownUtils.js +10 -1
  152. package/lib/v1/Popup/Popup.js +2 -2
  153. package/lib/v1/Select/Select.js +2 -2
  154. package/package.json +24 -14
  155. package/css_error.log +0 -1
  156. package/install.md +0 -10
  157. package/postPublish.js +0 -8
  158. package/prePublish.js +0 -70
  159. package/react-cli.config.js +0 -24
  160. package/result.json +0 -1
  161. /package/.cli/{stringContains.js → themeValidate/stringContains.js} +0 -0
package/README.md CHANGED
@@ -2,6 +2,39 @@
2
2
 
3
3
  Dot UI is a customizable React component library built to deliver a clean, accessible, and developer-friendly UI experience. It offers a growing set of reusable components designed to align with modern design systems and streamline application development across projects.
4
4
 
5
+ # 1.4.8
6
+
7
+ - `ColorSingleSelect`, `ColorMultiSelect`, `InputFieldLine`, `ColoredTag` and `ColorIndicator` components added.
8
+
9
+ - **ListItem, Suggestions**
10
+ - `renderBeforeChildren` prop added.
11
+
12
+ - **Select, MultiSelect, SelectedOptions**
13
+ - `renderCustomSelectedValue` prop added.
14
+
15
+ - **dropDownUtils**
16
+ - `colorCode` option added in makeFormatOptions method.
17
+
18
+ - **common/utils**
19
+ - `DUMMY_ARRAY`, `DUMMY_OBJECT` and `DUMMY_FUNCTION` constants added.
20
+
21
+ # 1.4.8
22
+
23
+ - Added UNSAFE_ prefix to deprecated lifecycle methods: componentWillMount, componentWillReceiveProps, and componentWillUpdate.
24
+
25
+ - **Popup**
26
+ - Handled potential memory leaks by `event listeners`.
27
+ - Added unmount handling for `requestAnimationFrame` to ensure proper cleanup.
28
+
29
+
30
+ # 1.4.7
31
+
32
+ - **Card** - Added support for reverse infinite scroll with `isRecentOnBottom`.
33
+
34
+ # 1.4.6
35
+
36
+ - **Popup** - Added fixed popup scroll block behavior support to iframe elements (same-origin only).
37
+
5
38
  # 1.4.5
6
39
 
7
40
  - **Portal**
@@ -10,7 +43,6 @@ Dot UI is a customizable React component library built to deliver a clean, acces
10
43
 
11
44
  - **Popup**
12
45
  - Fixed the auto-repositioning issue during fixed popup resize and improved the position calculation logic.
13
- - Added fixed popup scroll block behavior support to iframe elements (same-origin only).
14
46
 
15
47
  - **Modal**
16
48
  - Refactored to use the new `Portal` component for rendering, resolving unwanted rendering issues.
@@ -361,4 +361,12 @@
361
361
 
362
362
  /* popover */
363
363
  --zdt_popover_default_bg: hsla(217, 23.08%, calc(17.84% + var(--zdc_default)), calc(1 + var(--zdc_alpha_high)));
364
+
365
+ /* inputFieldLine */
366
+ --zdt_inputField_default_border: var(--dot_inputLine);
367
+ --zdt_inputField_dark_border: hsla(228, 16.20%, calc(35.10% + var(--zdc_default_inverse_medium)), calc(1 + var(--zdc_alpha_low)));
368
+ --zdt_inputField_error_border: hsla(1, 63.86%, calc(48.82% + var(--zdc_default_inverse_medium)), calc(1 + var(--zdc_alpha_low)));
369
+ --zdt_inputField_hover_border: var(--dot_inputLineHover);
370
+ --zdt_inputField_dark_active_border: hsla(229, 8.25%, calc(61.96% + var(--zdc_default_inverse_medium)), calc(1 + var(--zdc_alpha_low)));
371
+ --zdt_inputField_focus_border: var(--dot_inputLineFocus);
364
372
  }
@@ -361,4 +361,12 @@
361
361
 
362
362
  /* popover */
363
363
  --zdt_popover_default_bg: hsla(0, 0.00%, calc(100.00% + var(--zdc_default)), calc(1 + var(--zdc_alpha_high)));
364
+
365
+ /* inputFieldLine */
366
+ --zdt_inputField_default_border: var(--dot_inputLine);
367
+ --zdt_inputField_dark_border: hsla(228, 16.20%, calc(35.10% + var(--zdc_default_inverse_medium)), calc(1 + var(--zdc_alpha_low)));
368
+ --zdt_inputField_error_border: hsla(1, 75.38%, calc(38.24% + var(--zdc_default_inverse_medium)), calc(1 + var(--zdc_alpha_low)));
369
+ --zdt_inputField_hover_border: var(--dot_inputLineHover);
370
+ --zdt_inputField_dark_active_border: hsla(229, 8.25%, calc(61.96% + var(--zdc_default_inverse_medium)), calc(1 + var(--zdc_alpha_low)));
371
+ --zdt_inputField_focus_border: var(--dot_inputLineFocus);
364
372
  }
@@ -361,4 +361,12 @@
361
361
 
362
362
  /* popover */
363
363
  --zdt_popover_default_bg: hsla(0, 0.00%, calc(12.94% + var(--zdc_default)), calc(1 + var(--zdc_alpha_high)));
364
+
365
+ /* inputFieldLine */
366
+ --zdt_inputField_default_border: var(--dot_inputLine);
367
+ --zdt_inputField_dark_border: hsla(228, 16.20%, calc(35.10% + var(--zdc_default_inverse_medium)), calc(1 + var(--zdc_alpha_low)));
368
+ --zdt_inputField_error_border: hsla(1, 63.86%, calc(48.82% + var(--zdc_default_inverse_medium)), calc(1 + var(--zdc_alpha_low)));
369
+ --zdt_inputField_hover_border: var(--dot_inputLineHover);
370
+ --zdt_inputField_dark_active_border: hsla(229, 8.25%, calc(61.96% + var(--zdc_default_inverse_medium)), calc(1 + var(--zdc_alpha_low)));
371
+ --zdt_inputField_focus_border: var(--dot_inputLineFocus);
364
372
  }
@@ -25,7 +25,7 @@ export default class Accordion extends React.Component {
25
25
  });
26
26
  }
27
27
 
28
- componentWillReceiveProps(nextProps) {
28
+ UNSAFE_componentWillReceiveProps(nextProps) {
29
29
  if (this.props.selectedItem !== nextProps.selectedItem && !this.props.disableInternalState) {
30
30
  this.setState({
31
31
  selectedItem: nextProps.selectedItem
@@ -8,7 +8,7 @@ import '@zohodesk/variables/assets/colorVariables.module.css';
8
8
  import '@zohodesk/variables/assets/dotVariables.module.css';
9
9
  import '@zohodesk/variables/assets/sizeVariables.module.css';
10
10
  import '@zohodesk/variables/assets/fontsizeVariables.module.css';
11
- import '@zohodesk/variables/lib/fontFamilyVariables.module.css';
11
+ import '@zohodesk/variables/es/fontFamilyVariables.module.css';
12
12
  import '@zohodesk/variables/assets/transitionVariables.module.css';
13
13
  import '@zohodesk/variables/assets/no_transitionVariables.module.css';
14
14
  import "../common/a11y.module.css";
package/es/Card/Card.js CHANGED
@@ -96,11 +96,13 @@ export default class Card extends Component {
96
96
  this.to = from + 3 * limit;
97
97
  this.isFetching = false;
98
98
  this.lastScrollTop = 0;
99
- this.onScroll = this.onScroll.bind(this); //this.onSetScroll = debounce(this.setScroll.bind(this, true), 10, true);
99
+ this.onScroll = this.onScroll.bind(this);
100
+ this.setScrollRef = this.setScrollRef.bind(this);
101
+ this.childEleRef = null; //this.onSetScroll = debounce(this.setScroll.bind(this, true), 10, true);
100
102
  //this.onClearScroll = debounce(this.setScroll.bind(this, false), 500);
101
103
  }
102
104
 
103
- componentWillReceiveProps(nextProps) {
105
+ UNSAFE_componentWillReceiveProps(nextProps) {
104
106
  if (this.from !== nextProps.from) {
105
107
  this.from = nextProps.from;
106
108
  }
@@ -127,25 +129,36 @@ export default class Card extends Component {
127
129
  scrollAt,
128
130
  noNeedUpScroll,
129
131
  // isScrollShadow,
130
- isPercentageScroll
132
+ isPercentageScroll,
133
+ scrollDirection
131
134
  } = this.props;
135
+ const scrollLimitHeight = scrollHeight - scrollAt;
136
+ const currentVisibleBottom = scrollTop + offsetHeight;
132
137
 
133
138
  if (scrollTop > this.lastScrollTop) {
134
- this.scrollDirection = 'down';
139
+ this.scrollingDirection = 'down';
135
140
  } else {
136
- this.scrollDirection = 'up';
141
+ this.scrollingDirection = 'up';
137
142
  }
138
143
 
139
144
  this.lastScrollTop = scrollTop;
140
145
 
141
146
  if (fetchData && !this.isFetching) {
142
- if (this.scrollDirection === 'down' && !noMoreData) {
143
- const scrollingPercentage = (scrollTop + offsetHeight) / (scrollHeight - scrollAt) * 100;
144
- const prefetch = isPercentageScroll ? scrollingPercentage >= getLibraryConfig('scrollFetchLimit') : scrollHeight - scrollAt <= scrollTop + offsetHeight;
147
+ const fetchDirection = scrollDirection === 'bottomToTop' ? 'up' : 'down';
148
+
149
+ if (this.scrollingDirection === fetchDirection && !noMoreData) {
150
+ let prefetch = false;
151
+
152
+ if (isPercentageScroll) {
153
+ const scrollingPercentage = scrollDirection === 'bottomToTop' ? (scrollHeight - scrollTop) / scrollLimitHeight * 100 : currentVisibleBottom / scrollLimitHeight * 100;
154
+ prefetch = scrollingPercentage >= getLibraryConfig('scrollFetchLimit');
155
+ } else {
156
+ prefetch = scrollDirection === 'bottomToTop' ? scrollTop <= scrollAt : scrollLimitHeight <= currentVisibleBottom;
157
+ }
145
158
 
146
159
  if (prefetch) {
147
160
  this.isFetching = true;
148
- fetchData(this.from + this.limit, this.limit + this.to, this.scrollDirection).then(() => {
161
+ fetchData(this.from + this.limit, this.limit + this.to, this.scrollingDirection).then(() => {
149
162
  this.to = this.limit + this.to;
150
163
  this.isFetching = false;
151
164
  }, () => {
@@ -153,9 +166,11 @@ export default class Card extends Component {
153
166
  });
154
167
  }
155
168
  } else {
156
- if (0 >= scrollTop - scrollAt && this.from !== 0 && !noNeedUpScroll) {
169
+ const prefetch = scrollDirection === 'bottomToTop' ? scrollLimitHeight <= currentVisibleBottom : 0 >= scrollTop - scrollAt;
170
+
171
+ if (prefetch && this.from !== 0 && !noNeedUpScroll) {
157
172
  this.isFetching = true;
158
- fetchData(this.from - this.limit, this.to - this.limit, this.scrollDirection).then(() => {
173
+ fetchData(this.from - this.limit, this.to - this.limit, this.scrollingDirection).then(() => {
159
174
  this.to = this.to - this.limit;
160
175
  this.isFetching = false;
161
176
  }, () => {
@@ -166,9 +181,12 @@ export default class Card extends Component {
166
181
  }
167
182
 
168
183
  if (fetchData && !noNeedUpScroll) {
169
- if (this.from !== 0 && scrollTop === 0 && !noNeedUpScroll) {
184
+ const topFetch = scrollDirection === 'bottomToTop' ? !noMoreData : !noNeedUpScroll && this.from !== 0;
185
+ const bottomFetch = scrollDirection === 'bottomToTop' ? !noNeedUpScroll && this.from !== 0 : !noMoreData;
186
+
187
+ if (scrollTop === 0 && topFetch) {
170
188
  scrollContainerObj.scrollTop = scrollTop + offsetHeight / 3;
171
- } else if (scrollHeight === scrollTop + offsetHeight && !noMoreData) {
189
+ } else if (scrollHeight === currentVisibleBottom && bottomFetch) {
172
190
  scrollContainerObj.scrollTop = scrollTop - offsetHeight / 2;
173
191
  }
174
192
  } // if (isScrollShadow) {
@@ -187,6 +205,21 @@ export default class Card extends Component {
187
205
  // }
188
206
 
189
207
 
208
+ setScrollRef(el) {
209
+ const {
210
+ scrollAt,
211
+ scrollDirection
212
+ } = this.props;
213
+
214
+ if (el && scrollDirection === 'bottomToTop') {
215
+ requestAnimationFrame(() => {
216
+ el.scrollTop = el.scrollHeight + Number(scrollAt);
217
+ });
218
+ }
219
+
220
+ this.childEleRef && this.childEleRef(el);
221
+ }
222
+
190
223
  render() {
191
224
  let {
192
225
  onClick,
@@ -220,6 +253,7 @@ export default class Card extends Component {
220
253
  isScroll
221
254
  });
222
255
  } else if (child.type === CardContent || this.props.childTypes && child.type === this.props.childTypes.cardContent) {
256
+ this.childEleRef = child.props.eleRef;
223
257
  return /*#__PURE__*/React.createElement(Box, {
224
258
  id: htmlId,
225
259
  role: role,
@@ -227,7 +261,7 @@ export default class Card extends Component {
227
261
  scroll: child.props.scroll,
228
262
  preventParentScroll: child.props.preventParentScroll,
229
263
  onScroll: this.onScroll,
230
- eleRef: child.props.eleRef,
264
+ eleRef: this.setScrollRef,
231
265
  isScrollAttribute: child.props.isScrollAttribute,
232
266
  dataId: child.props.dataId,
233
267
  shrink: child.props.shrink,
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
- import { render } from '@testing-library/react';
3
- import Card from "../Card";
2
+ import { render, fireEvent, within, waitFor } from '@testing-library/react';
3
+ import Card, { CardContent } from "../Card";
4
4
  describe('Card', () => {
5
5
  test('rendering the defult props', () => {
6
6
  const {
@@ -8,4 +8,83 @@ describe('Card', () => {
8
8
  } = render( /*#__PURE__*/React.createElement(Card, null));
9
9
  expect(asFragment()).toMatchSnapshot();
10
10
  });
11
+ test('should trigger fetch, when scroll to the bottom of the card while isRecentOnBottom = false', async () => {
12
+ const mockGetNextOptions = jest.fn(() => {
13
+ return new Promise(resolve => {
14
+ resolve();
15
+ });
16
+ });
17
+ const {
18
+ getByTestId,
19
+ asFragment
20
+ } = render( /*#__PURE__*/React.createElement(Card, {
21
+ from: 0,
22
+ limit: 10,
23
+ fetchData: mockGetNextOptions
24
+ }, /*#__PURE__*/React.createElement(CardContent, {
25
+ dataId: "scrollToBottomCardContent"
26
+ }, /*#__PURE__*/React.createElement("div", null, "Hello Zam"))));
27
+ const cardContent = getByTestId('scrollToBottomCardContent');
28
+ Object.defineProperty(cardContent, 'scrollHeight', {
29
+ value: 1000,
30
+ writable: true
31
+ });
32
+ Object.defineProperty(cardContent, 'clientHeight', {
33
+ value: 600,
34
+ writable: true
35
+ });
36
+ Object.defineProperty(cardContent, 'offsetHeight', {
37
+ value: 600,
38
+ writable: true
39
+ });
40
+ fireEvent.scroll(cardContent, {
41
+ target: {
42
+ scrollTop: 401
43
+ }
44
+ });
45
+ await waitFor(() => {
46
+ expect(asFragment()).toMatchSnapshot();
47
+ expect(mockGetNextOptions).toHaveBeenCalledWith(10, 40, 'down');
48
+ });
49
+ });
50
+ test('should trigger fetch, when scroll to the top of the card while scrollDirection = bottomToTop', async () => {
51
+ const mockGetNextOptions = jest.fn(() => {
52
+ return new Promise(resolve => {
53
+ resolve();
54
+ });
55
+ });
56
+ const {
57
+ getByTestId,
58
+ asFragment
59
+ } = render( /*#__PURE__*/React.createElement(Card, {
60
+ from: 0,
61
+ limit: 10,
62
+ scrollDirection: "bottomToTop",
63
+ fetchData: mockGetNextOptions
64
+ }, /*#__PURE__*/React.createElement(CardContent, {
65
+ dataId: "scrollToTopCardContent"
66
+ }, /*#__PURE__*/React.createElement("div", null, "Hello Zam"))));
67
+ const cardContent = getByTestId('scrollToTopCardContent');
68
+ Object.defineProperty(cardContent, 'scrollHeight', {
69
+ value: 1000,
70
+ writable: true
71
+ });
72
+ Object.defineProperty(cardContent, 'clientHeight', {
73
+ value: 600,
74
+ writable: true
75
+ });
76
+ Object.defineProperty(cardContent, 'offsetHeight', {
77
+ value: 600,
78
+ writable: true
79
+ });
80
+ fireEvent.scroll(cardContent, {
81
+ target: {
82
+ scrollTop: 0
83
+ }
84
+ });
85
+ await waitFor(() => {
86
+ expect(asFragment()).toMatchSnapshot();
87
+ expect(mockGetNextOptions).toHaveBeenCalledWith(10, 40, 'up');
88
+ });
89
+ });
11
90
  });
@@ -10,3 +10,47 @@ exports[`Card rendering the defult props 1`] = `
10
10
  />
11
11
  </DocumentFragment>
12
12
  `;
13
+
14
+ exports[`Card should trigger fetch, when scroll to the bottom of the card while isRecentOnBottom = false 1`] = `
15
+ <DocumentFragment>
16
+ <div
17
+ class="flex cover coldir"
18
+ data-id="containerComponent"
19
+ data-selector-id="container"
20
+ data-test-id="containerComponent"
21
+ >
22
+ <div
23
+ class="grow basis shrinkOff scrolly"
24
+ data-id="scrollToBottomCardContent"
25
+ data-selector-id="cardContent"
26
+ data-test-id="scrollToBottomCardContent"
27
+ >
28
+ <div>
29
+ Hello Zam
30
+ </div>
31
+ </div>
32
+ </div>
33
+ </DocumentFragment>
34
+ `;
35
+
36
+ exports[`Card should trigger fetch, when scroll to the top of the card while scrollDirection = bottomToTop 1`] = `
37
+ <DocumentFragment>
38
+ <div
39
+ class="flex cover coldir"
40
+ data-id="containerComponent"
41
+ data-selector-id="container"
42
+ data-test-id="containerComponent"
43
+ >
44
+ <div
45
+ class="grow basis shrinkOff scrolly"
46
+ data-id="scrollToTopCardContent"
47
+ data-selector-id="cardContent"
48
+ data-test-id="scrollToTopCardContent"
49
+ >
50
+ <div>
51
+ Hello Zam
52
+ </div>
53
+ </div>
54
+ </div>
55
+ </DocumentFragment>
56
+ `;
@@ -4,7 +4,8 @@ export const Card_defaultProps = {
4
4
  onClick: null,
5
5
  scrollAt: '10',
6
6
  a11y: {},
7
- isPercentageScroll: false
7
+ isPercentageScroll: false,
8
+ scrollDirection: 'topToBottom'
8
9
  };
9
10
  export const CardHeader_defaultProps = {
10
11
  dataId: 'CardHeader',
@@ -38,7 +38,8 @@ export const Card_propTypes = {
38
38
  role: PropTypes.string
39
39
  }),
40
40
  isPercentageScroll: PropTypes.bool,
41
- eleRef: PropTypes.func
41
+ eleRef: PropTypes.func,
42
+ scrollDirection: PropTypes.oneOf(['topToBottom', 'bottomToTop'])
42
43
  };
43
44
  export const CardFooter_propTypes = {
44
45
  children: PropTypes.node,
@@ -0,0 +1,36 @@
1
+ import React from 'react';
2
+ import MultiSelect from "../MultiSelect/MultiSelect";
3
+ import { ColorMultiSelect_propTypes } from "./props/propTypes";
4
+ import { ColorMultiSelect_defaultProps } from "./props/defaultProps";
5
+ import { renderColoredTag, renderColorIndicator } from "./common/helpers";
6
+
7
+ function ColorMultiSelect(props) {
8
+ const {
9
+ options,
10
+ renderCustomColorIndicator,
11
+ renderCustomSelectedValue,
12
+ customProps,
13
+ ...rest
14
+ } = props;
15
+ const renderSelectedValue = renderCustomSelectedValue || renderColoredTag;
16
+ const colorIndicator = renderCustomColorIndicator || renderColorIndicator;
17
+ const optionsWithOptionType = options.map(option => {
18
+ if (typeof option !== 'object') return option;
19
+ return { ...option,
20
+ optionType: 'custom'
21
+ };
22
+ });
23
+ return /*#__PURE__*/React.createElement(MultiSelect, { ...rest,
24
+ options: optionsWithOptionType,
25
+ renderCustomSelectedValue: renderSelectedValue,
26
+ customProps: { ...customProps,
27
+ SuggestionsProps: { ...customProps.SuggestionsProps,
28
+ renderBeforeChildren: colorIndicator
29
+ }
30
+ }
31
+ });
32
+ }
33
+
34
+ ColorMultiSelect.propTypes = ColorMultiSelect_propTypes;
35
+ ColorMultiSelect.defaultProps = ColorMultiSelect_defaultProps;
36
+ export default ColorMultiSelect;
@@ -0,0 +1,50 @@
1
+ import React from 'react';
2
+ import Select from "../Select/Select";
3
+ import { ColorSingleSelect_propTypes } from "./props/propTypes";
4
+ import { ColorSingleSelect_defaultProps } from "./props/defaultProps";
5
+ import { renderColoredTag, renderColorIndicator } from "./common/helpers";
6
+ import Box from "../Layout/Box";
7
+ import Container from "../Layout/Container";
8
+ import ArrowIcon from "../Select/ArrowIcon/ArrowIcon";
9
+ import arrowIconStyle from "../Select/ArrowIcon/ArrowIcon.module.css";
10
+
11
+ function ColorSingleSelect(props) {
12
+ const {
13
+ options,
14
+ renderCustomColorIndicator,
15
+ renderCustomSelectedValue,
16
+ customClass,
17
+ customProps,
18
+ ...rest
19
+ } = props;
20
+
21
+ const renderSelectedValue = data => {
22
+ const {
23
+ isPopupOpen
24
+ } = data;
25
+ return /*#__PURE__*/React.createElement(Container, {
26
+ alignBox: "row",
27
+ align: "between"
28
+ }, /*#__PURE__*/React.createElement(Box, {
29
+ shrink: true
30
+ }, renderCustomSelectedValue ? renderCustomSelectedValue(data) : renderColoredTag(data)), /*#__PURE__*/React.createElement(ArrowIcon, {
31
+ isRotated: isPopupOpen
32
+ }));
33
+ };
34
+
35
+ const colorIndicator = renderCustomColorIndicator || renderColorIndicator;
36
+ return /*#__PURE__*/React.createElement(Select, { ...rest,
37
+ className: `${arrowIconStyle.arrowIconContainer} ${customClass}`,
38
+ options: options,
39
+ renderCustomSelectedValue: renderSelectedValue,
40
+ customProps: { ...customProps,
41
+ SuggestionsProps: { ...customProps.SuggestionsProps,
42
+ renderBeforeChildren: colorIndicator
43
+ }
44
+ }
45
+ });
46
+ }
47
+
48
+ ColorSingleSelect.propTypes = ColorSingleSelect_propTypes;
49
+ ColorSingleSelect.defaultProps = ColorSingleSelect_defaultProps;
50
+ export default ColorSingleSelect;
@@ -0,0 +1,59 @@
1
+ import React from 'react';
2
+ import { render } from '@testing-library/react';
3
+ import ColorMultiSelect from "../ColorMultiSelect";
4
+ const options = [{
5
+ id: 1,
6
+ text: 'Red',
7
+ colorCode: '#ff6e6e'
8
+ }, {
9
+ id: 2,
10
+ text: 'Green',
11
+ colorCode: '#77d779'
12
+ }, {
13
+ id: 3,
14
+ text: 'Blue',
15
+ colorCode: '#649cff'
16
+ }];
17
+ describe('ColorMultiSelect', () => {
18
+ test('rendering the defult props', () => {
19
+ const {
20
+ asFragment
21
+ } = render( /*#__PURE__*/React.createElement(ColorMultiSelect, null));
22
+ expect(asFragment()).toMatchSnapshot();
23
+ });
24
+ test('Should render the default selected value', () => {
25
+ const {
26
+ asFragment
27
+ } = render( /*#__PURE__*/React.createElement(ColorMultiSelect, {
28
+ options: options
29
+ }));
30
+ expect(asFragment()).toMatchSnapshot();
31
+ });
32
+ test('Should render the selected value', () => {
33
+ const {
34
+ asFragment
35
+ } = render( /*#__PURE__*/React.createElement(ColorMultiSelect, {
36
+ options: options,
37
+ selectedOptions: [1, 2]
38
+ }));
39
+ expect(asFragment()).toMatchSnapshot();
40
+ });
41
+ test('renders with renderCustomColorIndicator', () => {
42
+ const {
43
+ asFragment
44
+ } = render( /*#__PURE__*/React.createElement(ColorMultiSelect, {
45
+ options: options,
46
+ renderCustomColorIndicator: () => /*#__PURE__*/React.createElement("div", null, " custom color indicator")
47
+ }));
48
+ expect(asFragment()).toMatchSnapshot();
49
+ });
50
+ test('renders with renderCustomSelectedValue', () => {
51
+ const {
52
+ asFragment
53
+ } = render( /*#__PURE__*/React.createElement(ColorMultiSelect, {
54
+ options: options,
55
+ renderCustomSelectedValue: () => /*#__PURE__*/React.createElement("span", null, "custom selected value")
56
+ }));
57
+ expect(asFragment()).toMatchSnapshot();
58
+ });
59
+ });
@@ -0,0 +1,59 @@
1
+ import React from 'react';
2
+ import { render } from '@testing-library/react';
3
+ import ColorSingleSelect from "../ColorSingleSelect";
4
+ const options = [{
5
+ id: 1,
6
+ text: 'Red',
7
+ colorCode: '#ff6e6e'
8
+ }, {
9
+ id: 2,
10
+ text: 'Green',
11
+ colorCode: '#77d779'
12
+ }, {
13
+ id: 3,
14
+ text: 'Blue',
15
+ colorCode: '#649cff'
16
+ }];
17
+ describe('ColorSingleSelect', () => {
18
+ test('rendering the defult props', () => {
19
+ const {
20
+ asFragment
21
+ } = render( /*#__PURE__*/React.createElement(ColorSingleSelect, null));
22
+ expect(asFragment()).toMatchSnapshot();
23
+ });
24
+ test('Should render the default selected value', () => {
25
+ const {
26
+ asFragment
27
+ } = render( /*#__PURE__*/React.createElement(ColorSingleSelect, {
28
+ options: options
29
+ }));
30
+ expect(asFragment()).toMatchSnapshot();
31
+ });
32
+ test('Should render the selected value', () => {
33
+ const {
34
+ asFragment
35
+ } = render( /*#__PURE__*/React.createElement(ColorSingleSelect, {
36
+ options: options,
37
+ selectedValue: "green"
38
+ }));
39
+ expect(asFragment()).toMatchSnapshot();
40
+ });
41
+ test('renders with renderCustomColorIndicator', () => {
42
+ const {
43
+ asFragment
44
+ } = render( /*#__PURE__*/React.createElement(ColorSingleSelect, {
45
+ options: options,
46
+ renderCustomColorIndicator: () => /*#__PURE__*/React.createElement("div", null, " custom color indicator")
47
+ }));
48
+ expect(asFragment()).toMatchSnapshot();
49
+ });
50
+ test('renders with renderCustomSelectedValue', () => {
51
+ const {
52
+ asFragment
53
+ } = render( /*#__PURE__*/React.createElement(ColorSingleSelect, {
54
+ options: options,
55
+ renderCustomSelectedValue: () => /*#__PURE__*/React.createElement("span", null, "custom selected value")
56
+ }));
57
+ expect(asFragment()).toMatchSnapshot();
58
+ });
59
+ });