@capillarytech/blaze-ui 0.3.3-alpha.1 → 0.3.4-beta.0

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 (279) hide show
  1. package/README.md +168 -65
  2. package/dist/CapAlert/CapAlert.d.ts +12 -0
  3. package/dist/CapAlert/CapAlert.d.ts.map +1 -0
  4. package/dist/CapAlert/CapAlert.test.d.ts +2 -0
  5. package/dist/CapAlert/CapAlert.test.d.ts.map +1 -0
  6. package/dist/CapAlert/index.d.ts +3 -0
  7. package/dist/CapAlert/index.d.ts.map +1 -0
  8. package/dist/CapAlert/index.js +696 -0
  9. package/dist/CapAlert/index.js.map +1 -0
  10. package/dist/CapButton/CapButton.d.ts +11 -0
  11. package/dist/CapButton/CapButton.d.ts.map +1 -0
  12. package/dist/CapButton/CapButton.test.d.ts +2 -0
  13. package/dist/CapButton/CapButton.test.d.ts.map +1 -0
  14. package/dist/CapButton/index.d.ts +3 -0
  15. package/dist/CapButton/index.d.ts.map +1 -0
  16. package/dist/CapButton/index.js +991 -0
  17. package/dist/CapButton/index.js.map +1 -0
  18. package/dist/CapCard/CapCard.d.ts +9 -0
  19. package/dist/CapCard/CapCard.d.ts.map +1 -0
  20. package/dist/CapCard/CapCard.test.d.ts +2 -0
  21. package/dist/CapCard/CapCard.test.d.ts.map +1 -0
  22. package/dist/CapCard/index.d.ts +3 -0
  23. package/dist/CapCard/index.d.ts.map +1 -0
  24. package/dist/CapCard/index.js +697 -0
  25. package/dist/CapCard/index.js.map +1 -0
  26. package/dist/CapCheckbox/CapCheckbox.d.ts +17 -0
  27. package/dist/CapCheckbox/CapCheckbox.d.ts.map +1 -0
  28. package/dist/CapCheckbox/CapCheckbox.test.d.ts +2 -0
  29. package/dist/CapCheckbox/CapCheckbox.test.d.ts.map +1 -0
  30. package/dist/CapCheckbox/index.d.ts +3 -0
  31. package/dist/CapCheckbox/index.d.ts.map +1 -0
  32. package/dist/CapCheckbox/index.js +917 -0
  33. package/dist/CapCheckbox/index.js.map +1 -0
  34. package/dist/CapColumn/CapColumn.d.ts +9 -0
  35. package/dist/CapColumn/CapColumn.d.ts.map +1 -0
  36. package/dist/CapColumn/CapColumn.test.d.ts +2 -0
  37. package/dist/CapColumn/CapColumn.test.d.ts.map +1 -0
  38. package/dist/CapColumn/index.d.ts +3 -0
  39. package/dist/CapColumn/index.d.ts.map +1 -0
  40. package/dist/CapColumn/index.js +694 -0
  41. package/dist/CapColumn/index.js.map +1 -0
  42. package/dist/CapDivider/CapDivider.d.ts +9 -0
  43. package/dist/CapDivider/CapDivider.d.ts.map +1 -0
  44. package/dist/CapDivider/CapDivider.test.d.ts +2 -0
  45. package/dist/CapDivider/CapDivider.test.d.ts.map +1 -0
  46. package/dist/CapDivider/index.d.ts +3 -0
  47. package/dist/CapDivider/index.d.ts.map +1 -0
  48. package/dist/CapDivider/index.js +696 -0
  49. package/dist/CapDivider/index.js.map +1 -0
  50. package/dist/CapDropdown/CapDropdown.d.ts +20 -0
  51. package/dist/CapDropdown/CapDropdown.d.ts.map +1 -0
  52. package/dist/CapDropdown/CapDropdown.test.d.ts +2 -0
  53. package/dist/CapDropdown/CapDropdown.test.d.ts.map +1 -0
  54. package/dist/CapDropdown/index.d.ts +3 -0
  55. package/dist/CapDropdown/index.d.ts.map +1 -0
  56. package/dist/CapDropdown/index.js +715 -0
  57. package/dist/CapDropdown/index.js.map +1 -0
  58. package/dist/CapForm/CapForm.d.ts +10 -0
  59. package/dist/CapForm/CapForm.d.ts.map +1 -0
  60. package/dist/CapForm/CapForm.test.d.ts +2 -0
  61. package/dist/CapForm/CapForm.test.d.ts.map +1 -0
  62. package/dist/CapForm/index.d.ts +3 -0
  63. package/dist/CapForm/index.d.ts.map +1 -0
  64. package/dist/CapForm/index.js +696 -0
  65. package/dist/CapForm/index.js.map +1 -0
  66. package/dist/CapFormItem/CapFormItem.d.ts +13 -0
  67. package/dist/CapFormItem/CapFormItem.d.ts.map +1 -0
  68. package/dist/CapFormItem/CapFormItem.test.d.ts +2 -0
  69. package/dist/CapFormItem/CapFormItem.test.d.ts.map +1 -0
  70. package/dist/CapFormItem/index.d.ts +3 -0
  71. package/dist/CapFormItem/index.d.ts.map +1 -0
  72. package/dist/CapFormItem/index.js +697 -0
  73. package/dist/CapFormItem/index.js.map +1 -0
  74. package/dist/CapIcon/CapIcon.d.ts +30 -0
  75. package/dist/CapIcon/CapIcon.d.ts.map +1 -0
  76. package/dist/CapIcon/CapIcon.test.d.ts +2 -0
  77. package/dist/CapIcon/CapIcon.test.d.ts.map +1 -0
  78. package/dist/CapIcon/index.d.ts +3 -0
  79. package/dist/CapIcon/index.d.ts.map +1 -0
  80. package/dist/CapIcon/index.js +836 -0
  81. package/dist/CapIcon/index.js.map +1 -0
  82. package/dist/CapInput/CapInput.d.ts +11 -0
  83. package/dist/CapInput/CapInput.d.ts.map +1 -0
  84. package/dist/CapInput/CapInput.test.d.ts +2 -0
  85. package/dist/CapInput/CapInput.test.d.ts.map +1 -0
  86. package/dist/CapInput/Number.d.ts +9 -0
  87. package/dist/CapInput/Number.d.ts.map +1 -0
  88. package/dist/CapInput/Number.test.d.ts +2 -0
  89. package/dist/CapInput/Number.test.d.ts.map +1 -0
  90. package/dist/CapInput/Search.d.ts +9 -0
  91. package/dist/CapInput/Search.d.ts.map +1 -0
  92. package/dist/CapInput/Search.test.d.ts +2 -0
  93. package/dist/CapInput/Search.test.d.ts.map +1 -0
  94. package/dist/CapInput/TextArea.d.ts +9 -0
  95. package/dist/CapInput/TextArea.d.ts.map +1 -0
  96. package/dist/CapInput/TextArea.test.d.ts +2 -0
  97. package/dist/CapInput/TextArea.test.d.ts.map +1 -0
  98. package/dist/CapInput/index.d.ts +9 -0
  99. package/dist/CapInput/index.d.ts.map +1 -0
  100. package/dist/CapInput/index.js +744 -0
  101. package/dist/CapInput/index.js.map +1 -0
  102. package/dist/CapLabel/CapLabel.d.ts +23 -0
  103. package/dist/CapLabel/CapLabel.d.ts.map +1 -0
  104. package/dist/CapLabel/CapLabel.test.d.ts +2 -0
  105. package/dist/CapLabel/CapLabel.test.d.ts.map +1 -0
  106. package/dist/CapLabel/index.d.ts +3 -0
  107. package/dist/CapLabel/index.d.ts.map +1 -0
  108. package/dist/CapLabel/index.js +760 -0
  109. package/dist/CapLabel/index.js.map +1 -0
  110. package/dist/CapMenu/CapMenu.d.ts +27 -0
  111. package/dist/CapMenu/CapMenu.d.ts.map +1 -0
  112. package/dist/CapMenu/CapMenu.test.d.ts +2 -0
  113. package/dist/CapMenu/CapMenu.test.d.ts.map +1 -0
  114. package/dist/CapMenu/index.d.ts +3 -0
  115. package/dist/CapMenu/index.d.ts.map +1 -0
  116. package/dist/CapMenu/index.js +716 -0
  117. package/dist/CapMenu/index.js.map +1 -0
  118. package/dist/CapRadio/CapRadio.d.ts +18 -0
  119. package/dist/CapRadio/CapRadio.d.ts.map +1 -0
  120. package/dist/CapRadio/CapRadio.test.d.ts +2 -0
  121. package/dist/CapRadio/CapRadio.test.d.ts.map +1 -0
  122. package/dist/CapRadio/index.d.ts +3 -0
  123. package/dist/CapRadio/index.d.ts.map +1 -0
  124. package/dist/CapRadio/index.js +918 -0
  125. package/dist/CapRadio/index.js.map +1 -0
  126. package/dist/CapRow/CapRow.d.ts +27 -0
  127. package/dist/CapRow/CapRow.d.ts.map +1 -0
  128. package/dist/CapRow/CapRow.test.d.ts +2 -0
  129. package/dist/CapRow/CapRow.test.d.ts.map +1 -0
  130. package/dist/CapRow/index.d.ts +3 -0
  131. package/dist/CapRow/index.d.ts.map +1 -0
  132. package/dist/CapRow/index.js +751 -0
  133. package/dist/CapRow/index.js.map +1 -0
  134. package/dist/CapSkeleton/CapSkeleton.d.ts +8 -0
  135. package/dist/CapSkeleton/CapSkeleton.d.ts.map +1 -0
  136. package/dist/CapSkeleton/CapSkeleton.test.d.ts +2 -0
  137. package/dist/CapSkeleton/CapSkeleton.test.d.ts.map +1 -0
  138. package/dist/CapSkeleton/index.d.ts +3 -0
  139. package/dist/CapSkeleton/index.d.ts.map +1 -0
  140. package/dist/CapSkeleton/index.js +124 -0
  141. package/dist/CapSkeleton/index.js.map +1 -0
  142. package/dist/CapSpin/CapSpin.d.ts +8 -0
  143. package/dist/CapSpin/CapSpin.d.ts.map +1 -0
  144. package/dist/CapSpin/CapSpin.test.d.ts +2 -0
  145. package/dist/CapSpin/CapSpin.test.d.ts.map +1 -0
  146. package/dist/CapSpin/index.d.ts +3 -0
  147. package/dist/CapSpin/index.d.ts.map +1 -0
  148. package/dist/CapSpin/index.js +123 -0
  149. package/dist/CapSpin/index.js.map +1 -0
  150. package/dist/CapSwitch/CapSwitch.d.ts +12 -0
  151. package/dist/CapSwitch/CapSwitch.d.ts.map +1 -0
  152. package/dist/CapSwitch/CapSwitch.test.d.ts +2 -0
  153. package/dist/CapSwitch/CapSwitch.test.d.ts.map +1 -0
  154. package/dist/CapSwitch/index.d.ts +3 -0
  155. package/dist/CapSwitch/index.d.ts.map +1 -0
  156. package/dist/CapSwitch/index.js +700 -0
  157. package/dist/CapSwitch/index.js.map +1 -0
  158. package/dist/CapTab/CapTab.d.ts +21 -0
  159. package/dist/CapTab/CapTab.d.ts.map +1 -0
  160. package/dist/CapTab/CapTab.test.d.ts +2 -0
  161. package/dist/CapTab/CapTab.test.d.ts.map +1 -0
  162. package/dist/CapTab/index.d.ts +3 -0
  163. package/dist/CapTab/index.d.ts.map +1 -0
  164. package/dist/CapTab/index.js +729 -0
  165. package/dist/CapTab/index.js.map +1 -0
  166. package/dist/CapTable/CapTable.d.ts +27 -0
  167. package/dist/CapTable/CapTable.d.ts.map +1 -0
  168. package/dist/CapTable/CapTable.test.d.ts +2 -0
  169. package/dist/CapTable/CapTable.test.d.ts.map +1 -0
  170. package/dist/CapTable/index.d.ts +3 -0
  171. package/dist/CapTable/index.d.ts.map +1 -0
  172. package/dist/CapTable/index.js +18314 -0
  173. package/dist/CapTable/index.js.map +1 -0
  174. package/dist/CapTable/loadable.d.ts +5 -0
  175. package/dist/CapTable/loadable.d.ts.map +1 -0
  176. package/dist/CapTable/loadable.test.d.ts +2 -0
  177. package/dist/CapTable/loadable.test.d.ts.map +1 -0
  178. package/dist/CapTestSelect/CapTestSelect.d.ts +24 -0
  179. package/dist/CapTestSelect/CapTestSelect.d.ts.map +1 -0
  180. package/dist/CapTestSelect/CapTestSelect.test.d.ts +2 -0
  181. package/dist/CapTestSelect/CapTestSelect.test.d.ts.map +1 -0
  182. package/dist/CapTestSelect/index.d.ts +3 -0
  183. package/dist/CapTestSelect/index.d.ts.map +1 -0
  184. package/dist/CapTestSelect/index.js +130 -0
  185. package/dist/CapTestSelect/index.js.map +1 -0
  186. package/dist/CapTooltip/CapTooltip.d.ts +10 -0
  187. package/dist/CapTooltip/CapTooltip.d.ts.map +1 -0
  188. package/dist/CapTooltip/CapTooltip.test.d.ts +2 -0
  189. package/dist/CapTooltip/CapTooltip.test.d.ts.map +1 -0
  190. package/dist/CapTooltip/index.d.ts +3 -0
  191. package/dist/CapTooltip/index.d.ts.map +1 -0
  192. package/dist/CapTooltip/index.js +730 -0
  193. package/dist/CapTooltip/index.js.map +1 -0
  194. package/dist/CapTooltipWithInfo/CapTooltipWithInfo.d.ts +18 -0
  195. package/dist/CapTooltipWithInfo/CapTooltipWithInfo.d.ts.map +1 -0
  196. package/dist/CapTooltipWithInfo/CapTooltipWithInfo.test.d.ts +2 -0
  197. package/dist/CapTooltipWithInfo/CapTooltipWithInfo.test.d.ts.map +1 -0
  198. package/dist/CapTooltipWithInfo/index.d.ts +3 -0
  199. package/dist/CapTooltipWithInfo/index.d.ts.map +1 -0
  200. package/dist/CapTooltipWithInfo/index.js +1139 -0
  201. package/dist/CapTooltipWithInfo/index.js.map +1 -0
  202. package/dist/CapUnifiedSelect/CapUnifiedSelect.d.ts +52 -0
  203. package/dist/CapUnifiedSelect/CapUnifiedSelect.d.ts.map +1 -0
  204. package/dist/CapUnifiedSelect/CapUnifiedSelect.test.d.ts +2 -0
  205. package/dist/CapUnifiedSelect/CapUnifiedSelect.test.d.ts.map +1 -0
  206. package/dist/CapUnifiedSelect/index.d.ts +3 -0
  207. package/dist/CapUnifiedSelect/index.d.ts.map +1 -0
  208. package/dist/CapUnifiedSelect/index.js +2075 -0
  209. package/dist/CapUnifiedSelect/index.js.map +1 -0
  210. package/dist/CapUnifiedSelect/messages.d.ts +24 -0
  211. package/dist/CapUnifiedSelect/messages.d.ts.map +1 -0
  212. package/dist/LocaleHoc/index.d.ts +9 -0
  213. package/dist/LocaleHoc/index.d.ts.map +1 -0
  214. package/{translations/en.js → dist/LocaleHoc/index.js} +169 -35
  215. package/dist/LocaleHoc/index.js.map +1 -0
  216. package/dist/LocaleHoc/index.test.d.ts +2 -0
  217. package/dist/LocaleHoc/index.test.d.ts.map +1 -0
  218. package/dist/index.d.ts +54 -0
  219. package/dist/index.d.ts.map +1 -0
  220. package/dist/index.js +23028 -0
  221. package/dist/index.js.map +1 -0
  222. package/dist/styled/variables.d.ts +150 -0
  223. package/dist/styled/variables.d.ts.map +1 -0
  224. package/dist/styled/variables.scss +194 -0
  225. package/dist/utils/fonts.d.ts +49 -0
  226. package/dist/utils/fonts.d.ts.map +1 -0
  227. package/dist/utils/fonts.test.d.ts +2 -0
  228. package/dist/utils/fonts.test.d.ts.map +1 -0
  229. package/dist/utils/index.d.ts +44 -0
  230. package/dist/utils/index.d.ts.map +1 -0
  231. package/dist/utils/index.js +1161 -0
  232. package/dist/utils/index.js.map +1 -0
  233. package/dist/utils/styles.d.ts +19 -0
  234. package/dist/utils/styles.d.ts.map +1 -0
  235. package/package.json +263 -20
  236. package/CapIcon/CapIcon.js +0 -183
  237. package/CapIcon/index.js +0 -3
  238. package/CapIcon/styles.js +0 -76
  239. package/CapInput/CapInput.js +0 -67
  240. package/CapInput/Number.js +0 -38
  241. package/CapInput/Search.js +0 -32
  242. package/CapInput/TextArea.js +0 -45
  243. package/CapInput/index.js +0 -10
  244. package/CapInput/messages.js +0 -27
  245. package/CapInput/styles.js +0 -81
  246. package/CapLabel/CapLabel.js +0 -83
  247. package/CapLabel/index.js +0 -3
  248. package/CapLabel/styles.js +0 -259
  249. package/CapRow/CapRow.js +0 -123
  250. package/CapRow/index.js +0 -3
  251. package/CapRow/styles.js +0 -50
  252. package/CapSkeleton/CapSkeleton.js +0 -17
  253. package/CapSkeleton/index.js +0 -1
  254. package/CapSpin/CapSpin.js +0 -23
  255. package/CapSpin/index.js +0 -1
  256. package/CapTable/CapTable.js +0 -146
  257. package/CapTable/index.js +0 -3
  258. package/CapTable/loadable.js +0 -13
  259. package/CapTable/styles.js +0 -134
  260. package/CapTestSelect/CapTestSelect.js +0 -47
  261. package/CapTestSelect/index.js +0 -1
  262. package/CapTooltip/CapTooltip.js +0 -98
  263. package/CapTooltip/index.js +0 -3
  264. package/CapTooltip/styles.js +0 -34
  265. package/CapTooltipWithInfo/CapTooltipWithInfo.js +0 -74
  266. package/CapTooltipWithInfo/index.js +0 -3
  267. package/CapTooltipWithInfo/styles.js +0 -22
  268. package/CapUnifiedSelect/CapUnifiedSelect.js +0 -541
  269. package/CapUnifiedSelect/index.js +0 -1
  270. package/CapUnifiedSelect/messages.js +0 -24
  271. package/CapUnifiedSelect/styles.js +0 -441
  272. package/LocaleHoc/index.js +0 -38
  273. package/index.js +0 -21
  274. package/styled/index.js +0 -6
  275. package/styled/variables.js +0 -91
  276. package/utils/index.js +0 -1
  277. package/utils/withMemo.js +0 -33
  278. package/utils/withStyles.js +0 -24
  279. /package/{assets → dist/assets}/upload.svg +0 -0
@@ -1,541 +0,0 @@
1
- import React, { useState, useEffect, useMemo, useCallback, memo } from 'react';
2
- import PropTypes from 'prop-types';
3
- import classnames from 'classnames';
4
- import { TreeSelect, Input, Button, Checkbox } from 'antd-v5';
5
- import styled from 'styled-components';
6
- import * as styledVars from '../styled/variables';
7
- import { CapLabel, CapTooltipWithInfo, CapRow, CapIcon, CapTooltip } from '../';
8
- import withStyles from '../utils/withStyles';
9
- import withMemo from '../utils/withMemo';
10
- import { HeaderWrapper, selectStyles } from './styles';
11
-
12
- const SELECT_TYPES = {
13
- SELECT: 'select',
14
- MULTI_SELECT: 'multiSelect',
15
- TREE_SELECT: 'treeSelect',
16
- MULTI_TREE_SELECT: 'multiTreeSelect'
17
- };
18
-
19
- const StyledTreeSelect = styled(TreeSelect)`
20
- ${selectStyles}
21
- `;
22
-
23
- const NoResult = memo(({ noResultCustomText, className, showUpload, options, noResultCustomIcon }) => (
24
- <CapRow
25
- className={classnames(className, 'cap-unified-select-no-result')}
26
- align="middle"
27
- gap={8}
28
- >
29
- <CapIcon type={noResultCustomIcon} size="m" />
30
- <CapLabel className="cap-unified-select-no-result-text">
31
- {showUpload && options?.length === 0
32
- ? noResultCustomText
33
- : 'No results found'}
34
- </CapLabel>
35
- </CapRow>
36
- ));
37
-
38
- const SelectAllCheckbox = memo(({ currentItems, tempValue, setTempValue, processTreeData }) => {
39
- const { leafValues = [] } = processTreeData ? processTreeData(currentItems) : {};
40
- const totalAvailable = leafValues.length;
41
- const leafSet = new Set(leafValues);
42
- const selectedInScope = Array.isArray(tempValue)
43
- ? tempValue.filter((v) => leafSet.has(v)).length
44
- : 0;
45
-
46
- const allChecked = totalAvailable > 0 && selectedInScope === totalAvailable;
47
- const indeterminate = selectedInScope > 0 && selectedInScope < totalAvailable;
48
-
49
- const handleChange = (e) => {
50
- if (e.target.checked) {
51
- const merged = new Set(Array.isArray(tempValue) ? tempValue : []);
52
- leafValues.forEach((v) => merged.add(v));
53
- setTempValue(Array.from(merged));
54
- } else {
55
- const toRemove = new Set(leafValues);
56
- const next = (Array.isArray(tempValue) ? tempValue : []).filter(
57
- (v) => !toRemove.has(v)
58
- );
59
- setTempValue(next);
60
- }
61
- };
62
-
63
- return (
64
- <CapRow className="cap-unified-select-select-all-container" align="middle">
65
- <Checkbox
66
- className="cap-unified-select-select-all-checkbox"
67
- checked={allChecked}
68
- indeterminate={indeterminate}
69
- onChange={handleChange}
70
- >
71
- <CapLabel type="label14" className="cap-unified-select-select-all-label">Select all</CapLabel>
72
- </Checkbox>
73
- </CapRow>
74
- );
75
- });
76
-
77
- const buildTreeMaps = (nodes) => {
78
- const result = {
79
- leafValues: [],
80
- parentChildMap: {},
81
- nodeMap: {},
82
- };
83
- if (!nodes) return result;
84
-
85
- const traverse = (items) => {
86
- items?.forEach((item) => {
87
- result.nodeMap[item.value] = item;
88
- if (item?.children && item.children.length > 0) {
89
- result.parentChildMap[item.value] = item.children.map(child => child?.value);
90
- traverse(item.children);
91
- } else {
92
- result.leafValues.push(item.value);
93
- }
94
- });
95
- };
96
- traverse(nodes);
97
- return result;
98
- };
99
-
100
- const countSelectedLeaves = (treeMaps, selectedValues) => {
101
- if (!Array.isArray(selectedValues) || !selectedValues?.length) return 0;
102
- const expandedSet = new Set(selectedValues);
103
- const processNode = (value) => {
104
- const children = treeMaps?.parentChildMap?.[value];
105
- if (!children) return;
106
- children?.forEach(childValue => {
107
- expandedSet.add(childValue);
108
- processNode(childValue);
109
- });
110
- };
111
- selectedValues?.forEach(processNode);
112
- return treeMaps?.leafValues?.reduce((count, leaf) => expandedSet.has(leaf) ? count + 1 : count, 0) || 0;
113
- };
114
-
115
- const filterTreeData = (data, search, searchBasedOn) => {
116
- if (!data?.length || !search) return data;
117
- const searchLower = search.toLowerCase();
118
- const nodeMatchesSearch = (node) => {
119
- const target = searchBasedOn === 'value'
120
- ? String(node?.value ?? '')
121
- : searchBasedOn === 'key'
122
- ? String(node?.key ?? '')
123
- : String(node?.label ?? node?.title ?? '');
124
- return target.toLowerCase().includes(searchLower);
125
- };
126
- const loop = (items) =>
127
- items.reduce((acc, item) => {
128
- if (!item) return acc;
129
- const children = item?.children?.length ? loop(item.children) : [];
130
- if (nodeMatchesSearch(item) || children.length) {
131
- acc.push({ ...item, children });
132
- }
133
- return acc;
134
- }, []);
135
- return loop(data);
136
- };
137
-
138
- const CapUnifiedSelect = ({
139
- type,
140
- options = [],
141
- value,
142
- onChange,
143
- placeholder,
144
- className,
145
- style,
146
- isError,
147
- errorMessage,
148
- containerClassName,
149
- popoverClassName,
150
- allowClear,
151
- headerLabel,
152
- onUpload,
153
- tooltip,
154
- bylineText,
155
- disabled,
156
- showUpload,
157
- customPopupRender,
158
- showSearch,
159
- readOnly,
160
- searchBasedOn,
161
- onConfirm,
162
- clearText,
163
- noResultCustomText,
164
- noResultCustomIcon,
165
- ...rest
166
- }) => {
167
- const [searchText, setSearchText] = useState('');
168
- const [tempValue, setTempValue] = useState(value);
169
- const [dropdownOpen, setDropdownOpen] = useState(false);
170
-
171
- useEffect(() => {
172
- const isEqual = Array.isArray(value) && Array.isArray(tempValue)
173
- ? value?.length === tempValue?.length && value.every((v) => tempValue.includes(v))
174
- : value === tempValue;
175
- if (!isEqual) setTempValue(value);
176
- }, [value]);
177
-
178
- const isMulti = useMemo(() => type === SELECT_TYPES.MULTI_SELECT || type === SELECT_TYPES.MULTI_TREE_SELECT, [type]);
179
- const isTree = useMemo(() => type === SELECT_TYPES.TREE_SELECT || type === SELECT_TYPES.MULTI_TREE_SELECT, [type]);
180
-
181
- const dataSource = useMemo(() => {
182
- if (!options?.length) return [];
183
- const enhanceOptions = (opts) =>
184
- opts.map((opt) => {
185
- const decoratedTitle = (
186
- <CapRow className="cap-unified-select-option-with-suffix">
187
- <CapLabel type="label14" className="cap-unified-select-option-label">{opt?.label}</CapLabel>
188
- {opt?.optionSuffix && <div className="cap-unified-select-option-suffix">
189
- {opt?.optionSuffix} {opt?.optionSuffixInfo && <CapTooltipWithInfo title={opt?.optionSuffixInfo} />}
190
- </div>}
191
- {opt?.optionTooltipInfo && <CapTooltipWithInfo title={opt?.optionTooltipInfo} />}
192
- </CapRow>
193
- );
194
-
195
- return {
196
- ...opt,
197
- title: decoratedTitle,
198
- label: opt?.label,
199
- children: opt?.children ? enhanceOptions(opt.children) : [],
200
- };
201
- });
202
-
203
- return isTree ? enhanceOptions(options) : options.map((opt) => ({
204
- ...opt,
205
- title: (
206
- <CapRow className="cap-unified-select-option-with-suffix">
207
- <CapLabel type="label14" className="cap-unified-select-option-label">{opt?.label}</CapLabel>
208
- {opt?.optionSuffix && <div className="cap-unified-select-option-suffix">
209
- {opt?.optionSuffix} {opt?.optionSuffixInfo && <CapTooltipWithInfo title={opt?.optionSuffixInfo} />}
210
- </div>}
211
- {opt?.optionTooltipInfo && <CapTooltipWithInfo title={opt?.optionTooltipInfo} />}
212
- </CapRow>
213
- ),
214
- label: opt?.label,
215
- }));
216
- }, [isTree, options]);
217
-
218
- const filteredTree = useMemo(
219
- () => filterTreeData(dataSource, searchText, searchBasedOn),
220
- [dataSource, searchText, searchBasedOn]
221
- );
222
-
223
- const treeMaps = useMemo(() => buildTreeMaps(options), [options]);
224
- const selectedLeafCount = useMemo(() => countSelectedLeaves(treeMaps, tempValue), [treeMaps, tempValue]);
225
-
226
- const displayValue = dropdownOpen ? tempValue : value;
227
-
228
- const suffix = useMemo(() => {
229
- const count = Array.isArray(displayValue) ? displayValue?.length : (displayValue ? 1 : 0);
230
- const renderTooltipTitle = (values) => {
231
- return (
232
- <div className="cap-unified-select-more-tooltip-content">
233
- {values.map((val, idx) => (
234
- <div key={idx}>{val}</div>
235
- ))}
236
- </div>
237
- );
238
- };
239
-
240
- return (
241
- <>
242
- {isMulti && count > 1 && (
243
- <span className="cap-unified-select-more-text">
244
- <CapTooltip
245
- title={renderTooltipTitle(displayValue.slice(1))}
246
- placement="bottom"
247
- overlayClassName="cap-unified-select-more-tooltip"
248
- arrowPointAtCenter={true}
249
- >
250
- <span>+{count - 1} more</span>
251
- </CapTooltip>
252
- </span>
253
- )}
254
- <CapIcon
255
- className="cap-unified-select-suffix-icon"
256
- type={dropdownOpen ? 'up' : 'down'}
257
- size="s"
258
- />
259
- </>
260
- );
261
- }, [isMulti, displayValue, dropdownOpen]);
262
-
263
- const prefix = useMemo(() => {
264
- if (isMulti && Array.isArray(displayValue) && displayValue?.length > 0) {
265
- const firstLeafValue = displayValue.find(val => treeMaps?.leafValues?.includes(val));
266
- return treeMaps?.nodeMap?.[firstLeafValue]?.label || null;
267
- }
268
- return null;
269
- }, [isMulti, displayValue, treeMaps]);
270
-
271
- const handleConfirm = useCallback(() => {
272
- onChange?.(tempValue);
273
- setDropdownOpen(false);
274
- setSearchText('');
275
- onConfirm?.(tempValue);
276
- }, [onChange, onConfirm, tempValue]);
277
-
278
- const handleClearAll = useCallback(() => {
279
- const cleared = isMulti ? [] : undefined;
280
- setTempValue(cleared);
281
- onChange?.(cleared);
282
- setDropdownOpen(false);
283
- }, [isMulti, onChange]);
284
-
285
-
286
- const handleDropdownVisibilityChange = useCallback((open) => {
287
- if (readOnly) {
288
- return;
289
- }
290
- if (!open && !customPopupRender) {
291
- onChange?.(tempValue);
292
- } else if (!open) {
293
- setTempValue(value);
294
- }
295
- setDropdownOpen(open);
296
- }, [customPopupRender, value, onChange, tempValue, readOnly]);
297
-
298
- const renderHeader = useMemo(() => {
299
- if (!headerLabel && !tooltip) return null;
300
- return (
301
- <>
302
- <HeaderWrapper className={classnames(disabled && 'disabled', 'cap-unified-select-header')}>
303
- {headerLabel && (
304
- <CapLabel
305
- type="label16"
306
- className={classnames(disabled && 'disabled', 'cap-unified-select-header-label')}
307
- >
308
- {headerLabel}
309
- </CapLabel>
310
- )}
311
- {tooltip && (
312
- <CapTooltipWithInfo
313
- title={tooltip}
314
- className={classnames(disabled && 'disabled', 'cap-unified-select-header-tooltip')}
315
- iconProps={{ disabled }}
316
- />
317
- )}
318
- </HeaderWrapper>
319
- {bylineText && (
320
- <div className="cap-unified-select-header-byline-text">
321
- <CapLabel
322
- className={classnames(disabled && 'disabled', 'cap-unified-select-header-byline-text')}
323
- >
324
- {bylineText}
325
- </CapLabel>
326
- </div>
327
- )}
328
- </>
329
- );
330
- }, [headerLabel, tooltip, bylineText, disabled]);
331
-
332
- const renderCustomDropdown = useCallback(
333
- (menu) => {
334
- if (!customPopupRender) return menu;
335
- const currentItems = filteredTree;
336
-
337
- return (
338
- <div className={classnames(popoverClassName, `${type}-popup-container`)}>
339
- {showSearch && (
340
- <CapRow className="cap-unified-select-search-container" align="middle">
341
- <Input
342
- prefix={<CapIcon type="search" size="s" style={{ color: styledVars.CAP_G06 }} />}
343
- placeholder="Search"
344
- variant="borderless"
345
- value={searchText}
346
- onChange={(e) => setSearchText(e.target.value)}
347
- allowClear
348
- />
349
- </CapRow>
350
- )}
351
-
352
- {isMulti && showUpload && (
353
- <CapRow className="cap-unified-select-upload-container" align="middle" onClick={onUpload}>
354
- <CapIcon type="upload" size="s" style={{ color: styledVars.CAP_SECONDARY.base }} />
355
- <CapLabel type="label14" className="cap-unified-select-upload-label">Upload</CapLabel>
356
- </CapRow>
357
- )}
358
-
359
- {isMulti && currentItems.length > 0 && (
360
- <SelectAllCheckbox
361
- currentItems={currentItems}
362
- tempValue={tempValue}
363
- setTempValue={setTempValue}
364
- processTreeData={buildTreeMaps}
365
- />
366
- )}
367
-
368
- {currentItems.length === 0 ? (
369
- <NoResult
370
- noResultCustomText={noResultCustomText}
371
- className={className}
372
- showUpload={showUpload}
373
- options={options}
374
- noResultCustomIcon={noResultCustomIcon}
375
- />
376
- ) : (
377
- menu
378
- )}
379
-
380
- {currentItems.length > 0 && isMulti && (
381
- <div className="cap-unified-select-confirm-container">
382
- <div className="cap-unified-select-confirm-button-group">
383
- <Button
384
- type="primary"
385
- size="small"
386
- className="cap-unified-select-confirm-button"
387
- onClick={handleConfirm}
388
- disabled={selectedLeafCount === 0}
389
- >
390
- Confirm
391
- </Button>
392
- <Button
393
- type="text"
394
- className="cap-unified-select-cancel-button"
395
- size="small"
396
- onClick={handleClearAll}
397
- >
398
- {clearText}
399
- </Button>
400
- <CapLabel className="cap-unified-select-selected-count">
401
- {selectedLeafCount} selected
402
- </CapLabel>
403
- </div>
404
- </div>
405
- )}
406
-
407
- {(type === SELECT_TYPES.SELECT || type === SELECT_TYPES.TREE_SELECT) && allowClear && (
408
- <CapRow className="cap-unified-select-tree-clear-container" onClick={handleClearAll}>
409
- <CapLabel className="cap-unified-select-tree-clear-label">{clearText}</CapLabel>
410
- </CapRow>
411
- )}
412
- </div>
413
- );
414
- },
415
- [
416
- customPopupRender,
417
- filteredTree,
418
- searchText,
419
- isMulti,
420
- showUpload,
421
- onUpload,
422
- noResultCustomText,
423
- noResultCustomIcon,
424
- options,
425
- type,
426
- tempValue,
427
- handleConfirm,
428
- handleClearAll,
429
- popoverClassName,
430
- className,
431
- selectedLeafCount,
432
- ]
433
- );
434
-
435
- const combinedClassName = useMemo(
436
- () => classnames(
437
- containerClassName,
438
- 'cap-unified-tree-select',
439
- { 'cap-unified-tree-select-readonly': readOnly },
440
- className
441
- ),
442
- [containerClassName, className, readOnly]
443
- );
444
-
445
- return (
446
- <CapRow className={classnames(className, 'cap-unified-select-container')}>
447
- {renderHeader}
448
- <StyledTreeSelect
449
- type={type}
450
- treeData={filteredTree}
451
- value={customPopupRender ? tempValue : value}
452
- treeNodeLabelProp='label'
453
- onChange={isMulti ? setTempValue : onChange}
454
- placeholder={placeholder}
455
- showSearch={false}
456
- maxTagCount={0}
457
- maxTagPlaceholder={() => null}
458
- prefix={prefix || undefined}
459
- suffixIcon={suffix}
460
- className={combinedClassName}
461
- classNames={{
462
- popup: { root: classnames('custom-popup-container', className) },
463
- }}
464
- style={style}
465
- status={isError ? 'error' : ''}
466
- allowClear={allowClear}
467
- multiple={isMulti}
468
- treeCheckable={isMulti}
469
- treeCheckStrictly={false}
470
- showCheckedStrategy={TreeSelect.SHOW_CHILD}
471
- open={dropdownOpen}
472
- onOpenChange={handleDropdownVisibilityChange}
473
- virtual
474
- popupMatchSelectWidth={false}
475
- disabled={disabled}
476
- filterTreeNode={false}
477
- listHeight={256}
478
- listItemHeight={32}
479
- popupRender={renderCustomDropdown}
480
- {...rest}
481
- />
482
- {isError && (
483
- <CapLabel className="cap-unified-select-status" style={{ color: styledVars.CAP_RED }}>
484
- {errorMessage}
485
- </CapLabel>
486
- )}
487
- </CapRow>
488
- );
489
- };
490
-
491
- CapUnifiedSelect.propTypes = {
492
- type: PropTypes.oneOf(Object.values(SELECT_TYPES)),
493
- options: PropTypes.array,
494
- value: PropTypes.any,
495
- containerClassName: PropTypes.string,
496
- onChange: PropTypes.func,
497
- placeholder: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),
498
- className: PropTypes.string,
499
- style: PropTypes.object,
500
- allowClear: PropTypes.bool,
501
- headerLabel: PropTypes.string,
502
- tooltip: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),
503
- disabled: PropTypes.bool,
504
- readOnly: PropTypes.bool,
505
- bylineText: PropTypes.string,
506
- customPopupRender: PropTypes.bool,
507
- showSearch: PropTypes.bool,
508
- searchBasedOn: PropTypes.oneOf(['label', 'value', 'key']),
509
- onConfirm: PropTypes.func,
510
- isError: PropTypes.bool,
511
- errorMessage: PropTypes.string,
512
- popoverClassName: PropTypes.string,
513
- showUpload: PropTypes.bool,
514
- onUpload: PropTypes.func,
515
- clearText: PropTypes.string,
516
- noResultCustomText: PropTypes.string,
517
- noResultCustomIcon: PropTypes.string,
518
- };
519
-
520
- CapUnifiedSelect.defaultProps = {
521
- type: SELECT_TYPES.SELECT,
522
- placeholder: 'Select an option',
523
- searchBasedOn: 'label',
524
- noResultCustomText: 'No results found',
525
- noResultCustomIcon: 'warning',
526
- clearText: 'Clear',
527
- options: [],
528
- allowClear: false,
529
- customPopupRender: true,
530
- showSearch: true,
531
- className: '',
532
- disabled: false,
533
- readOnly: false,
534
- showUpload: false,
535
- isError: false,
536
- onUpload: () => {},
537
- onChange: () => {},
538
- onConfirm: () => {},
539
- };
540
-
541
- export default withMemo(withStyles(CapUnifiedSelect, selectStyles));
@@ -1 +0,0 @@
1
- export { default } from './CapUnifiedSelect';
@@ -1,24 +0,0 @@
1
- import { defineMessages } from 'react-intl';
2
-
3
- export default defineMessages({
4
- selectPlaceholder: {
5
- id: 'cap.unified.select.placeholder',
6
- defaultMessage: 'Select an option',
7
- },
8
- searchPlaceholder: {
9
- id: 'cap.unified.select.search.placeholder',
10
- defaultMessage: 'Search...',
11
- },
12
- noData: {
13
- id: 'cap.unified.select.no.data',
14
- defaultMessage: 'No data',
15
- },
16
- loading: {
17
- id: 'cap.unified.select.loading',
18
- defaultMessage: 'Loading...',
19
- },
20
- selected: {
21
- id: 'cap.unified.select.selected',
22
- defaultMessage: '{count} items selected',
23
- },
24
- });