@capillarytech/blaze-ui 0.1.6-alpha.28 → 0.1.6-alpha.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CapHeading/CapHeading.js +71 -0
- package/CapHeading/index.js +1 -0
- package/CapHeading/styles.js +125 -0
- package/CapInfoNote/CapInfoNote.js +54 -0
- package/CapInfoNote/index.js +1 -0
- package/CapInfoNote/styles.js +63 -0
- package/CapInput/loadable.js +9 -0
- package/CapLabel/CapLabel.js +106 -0
- package/CapLabel/index.js +1 -0
- package/CapLabel/styles.js +221 -0
- package/CapRow/CapRow.js +22 -0
- package/CapRow/index.js +1 -0
- package/CapRow/styles.js +9 -0
- package/CapTable/loadable.js +4 -4
- package/CapTooltip/CapTooltip.js +36 -0
- package/CapTooltip/index.js +1 -0
- package/CapTooltip/styles.js +42 -0
- package/CapUnifiedSelect/CapUnifiedSelect.js +51 -304
- package/CapUnifiedSelect/index.js +4 -1
- package/CapUnifiedSelect/loadable.js +3 -0
- package/CapUnifiedSelect/styles.js +174 -62
- package/dist/235.index.js +2 -0
- package/dist/235.index.js.LICENSE.txt +29 -0
- package/dist/603.index.js +1 -0
- package/dist/CapTable/loadable.js +4 -4
- package/dist/esm/CapHeading/CapHeading.js +41 -0
- package/dist/esm/CapHeading/index.js +1 -0
- package/dist/esm/CapHeading/styles.js +123 -0
- package/dist/esm/CapInfoNote/CapInfoNote.js +62 -0
- package/dist/esm/CapInfoNote/index.js +1 -0
- package/dist/esm/CapInfoNote/styles.js +6 -0
- package/dist/esm/CapInput/loadable.js +9 -0
- package/dist/esm/CapLabel/CapLabel.js +50 -0
- package/dist/esm/CapLabel/index.js +1 -0
- package/dist/esm/CapLabel/styles.js +219 -0
- package/dist/esm/{CapSkeleton/CapSkeleton.js → CapRow/CapRow.js} +12 -12
- package/dist/esm/CapRow/index.js +1 -0
- package/dist/esm/CapRow/styles.js +5 -0
- package/dist/esm/CapTable/loadable.js +4 -4
- package/dist/esm/CapTooltip/CapTooltip.js +34 -0
- package/dist/esm/CapTooltip/index.js +1 -0
- package/dist/esm/CapTooltip/styles.js +6 -0
- package/dist/esm/CapUnifiedSelect/CapUnifiedSelect.js +38 -335
- package/dist/esm/CapUnifiedSelect/index.js +3 -1
- package/dist/esm/CapUnifiedSelect/loadable.js +4 -0
- package/dist/esm/CapUnifiedSelect/styles.js +3 -19
- package/dist/esm/index.js +1 -5
- package/dist/index.js +0 -27
- package/dist/index.js.LICENSE.txt +7 -0
- package/index.js +1 -5
- package/package.json +10 -8
- package/CapSkeleton/CapSkeleton.js +0 -17
- package/CapSkeleton/index.js +0 -1
- package/CapSpin/CapSpin.js +0 -23
- package/CapSpin/index.js +0 -1
- package/CapTestSelect/CapTestSelect.js +0 -47
- package/CapTestSelect/index.js +0 -1
- package/components/CapInput/CapInput.js +0 -67
- package/components/CapInput/Number.js +0 -38
- package/components/CapInput/Search.js +0 -32
- package/components/CapInput/TextArea.js +0 -45
- package/components/CapInput/index.js +0 -10
- package/components/CapInput/messages.js +0 -27
- package/components/CapInput/styles.js +0 -81
- package/components/CapSkeleton/CapSkeleton.js +0 -17
- package/components/CapSkeleton/index.js +0 -1
- package/components/CapSpin/CapSpin.js +0 -23
- package/components/CapSpin/index.js +0 -1
- package/components/CapTable/CapTable.js +0 -146
- package/components/CapTable/index.js +0 -3
- package/components/CapTable/loadable.js +0 -13
- package/components/CapTable/styles.js +0 -134
- package/components/CapTestSelect/CapTestSelect.js +0 -47
- package/components/CapTestSelect/index.js +0 -1
- package/components/CapUnifiedSelect/CapUnifiedSelect.js +0 -374
- package/components/CapUnifiedSelect/index.js +0 -1
- package/components/CapUnifiedSelect/messages.js +0 -24
- package/components/CapUnifiedSelect/styles.js +0 -111
- package/components/LocaleHoc/index.js +0 -38
- package/components/index.js +0 -14
- package/components/styled/index.js +0 -6
- package/components/styled/variables.js +0 -89
- package/components/translations/en.js +0 -331
- package/dist/CapSkeleton/CapSkeleton.js +0 -29
- package/dist/CapSkeleton/index.js +0 -13
- package/dist/CapSpin/CapSpin.js +0 -35
- package/dist/CapSpin/index.js +0 -13
- package/dist/CapTestSelect/CapTestSelect.js +0 -40
- package/dist/CapTestSelect/index.js +0 -13
- package/dist/CapUnifiedSelect/CapUnifiedSelect.js +0 -405
- package/dist/CapUnifiedSelect/index.js +0 -13
- package/dist/CapUnifiedSelect/messages.js +0 -29
- package/dist/CapUnifiedSelect/styles.js +0 -39
- package/dist/components/CapInput/CapInput.js +0 -66
- package/dist/components/CapInput/Number.js +0 -42
- package/dist/components/CapInput/Search.js +0 -35
- package/dist/components/CapInput/TextArea.js +0 -42
- package/dist/components/CapInput/index.js +0 -15
- package/dist/components/CapInput/messages.js +0 -32
- package/dist/components/CapInput/styles.js +0 -11
- package/dist/components/CapSkeleton/CapSkeleton.js +0 -29
- package/dist/components/CapSkeleton/index.js +0 -13
- package/dist/components/CapSpin/CapSpin.js +0 -35
- package/dist/components/CapSpin/index.js +0 -13
- package/dist/components/CapTable/CapTable.js +0 -148
- package/dist/components/CapTable/index.js +0 -9
- package/dist/components/CapTable/loadable.js +0 -23
- package/dist/components/CapTable/styles.js +0 -26
- package/dist/components/CapTestSelect/CapTestSelect.js +0 -40
- package/dist/components/CapTestSelect/index.js +0 -13
- package/dist/components/CapUnifiedSelect/CapUnifiedSelect.js +0 -406
- package/dist/components/CapUnifiedSelect/index.js +0 -13
- package/dist/components/CapUnifiedSelect/messages.js +0 -29
- package/dist/components/CapUnifiedSelect/styles.js +0 -39
- package/dist/components/LocaleHoc/index.js +0 -40
- package/dist/components/index.js +0 -66
- package/dist/components/styled/index.js +0 -22
- package/dist/components/styled/variables.js +0 -94
- package/dist/components/translations/en.js +0 -335
- package/dist/esm/CapSkeleton/index.js +0 -1
- package/dist/esm/CapSpin/CapSpin.js +0 -28
- package/dist/esm/CapSpin/index.js +0 -1
- package/dist/esm/CapTestSelect/CapTestSelect.js +0 -34
- package/dist/esm/CapTestSelect/index.js +0 -1
- package/dist/esm/components/CapInput/CapInput.js +0 -57
- package/dist/esm/components/CapInput/Number.js +0 -35
- package/dist/esm/components/CapInput/Search.js +0 -28
- package/dist/esm/components/CapInput/TextArea.js +0 -35
- package/dist/esm/components/CapInput/index.js +0 -8
- package/dist/esm/components/CapInput/messages.js +0 -25
- package/dist/esm/components/CapInput/styles.js +0 -3
- package/dist/esm/components/CapSkeleton/CapSkeleton.js +0 -22
- package/dist/esm/components/CapSkeleton/index.js +0 -1
- package/dist/esm/components/CapSpin/CapSpin.js +0 -28
- package/dist/esm/components/CapSpin/index.js +0 -1
- package/dist/esm/components/CapTable/CapTable.js +0 -140
- package/dist/esm/components/CapTable/index.js +0 -2
- package/dist/esm/components/CapTable/loadable.js +0 -12
- package/dist/esm/components/CapTable/styles.js +0 -17
- package/dist/esm/components/CapTestSelect/CapTestSelect.js +0 -34
- package/dist/esm/components/CapTestSelect/index.js +0 -1
- package/dist/esm/components/CapUnifiedSelect/CapUnifiedSelect.js +0 -398
- package/dist/esm/components/CapUnifiedSelect/index.js +0 -1
- package/dist/esm/components/CapUnifiedSelect/messages.js +0 -23
- package/dist/esm/components/CapUnifiedSelect/styles.js +0 -31
- package/dist/esm/components/LocaleHoc/index.js +0 -31
- package/dist/esm/components/index.js +0 -15
- package/dist/esm/components/styled/index.js +0 -5
- package/dist/esm/components/styled/variables.js +0 -88
- package/dist/esm/components/translations/en.js +0 -329
- package/dist/esm/utils/index.js +0 -1
- package/dist/esm/utils/withStyles.js +0 -23
- package/dist/esm/withStyles.js +0 -23
- package/dist/utils/index.js +0 -13
- package/dist/utils/withStyles.js +0 -29
- package/dist/withStyles.js +0 -29
- package/utils/index.js +0 -1
- package/utils/withStyles.js +0 -24
package/CapTable/loadable.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import
|
|
1
|
+
import CapSpin from '@capillarytech/cap-ui-library/CapSpin';
|
|
2
2
|
import { loadable } from '@capillarytech/cap-ui-utils';
|
|
3
3
|
import React, { Suspense } from 'react';
|
|
4
4
|
|
|
5
5
|
const LoadableComponent = loadable(() => import('./CapTable'));
|
|
6
6
|
|
|
7
|
-
const CapTableLoadable = (
|
|
8
|
-
<Suspense fallback={<
|
|
9
|
-
<LoadableComponent
|
|
7
|
+
const CapTableLoadable = () => (
|
|
8
|
+
<Suspense fallback={<CapSpin />}>
|
|
9
|
+
<LoadableComponent />
|
|
10
10
|
</Suspense>
|
|
11
11
|
);
|
|
12
12
|
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import PropTypes from 'prop-types';
|
|
3
|
+
import { Tooltip } from 'antd';
|
|
4
|
+
import classNames from 'classnames';
|
|
5
|
+
import { TooltipWrapper } from './styles';
|
|
6
|
+
|
|
7
|
+
const CapTooltip = ({ overlayClassName, children, ...rest }) => {
|
|
8
|
+
return (
|
|
9
|
+
<TooltipWrapper>
|
|
10
|
+
<Tooltip
|
|
11
|
+
overlayClassName={classNames('cap-tooltip', overlayClassName)}
|
|
12
|
+
{...rest}
|
|
13
|
+
>
|
|
14
|
+
{children}
|
|
15
|
+
</Tooltip>
|
|
16
|
+
</TooltipWrapper>
|
|
17
|
+
);
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
/*
|
|
21
|
+
NOTE:
|
|
22
|
+
While using a disabled button with tooltip, wrap the button with an element with className "button-disabled-tooltip-wrapper".
|
|
23
|
+
|
|
24
|
+
<CapTooltip title="disabled button with tooltip">
|
|
25
|
+
<span className="button-disabled-tooltip-wrapper">
|
|
26
|
+
<CapButton disabled>Button</CapButton>
|
|
27
|
+
</span>
|
|
28
|
+
</CapTooltip>
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
CapTooltip.propTypes = {
|
|
32
|
+
overlayClassName: PropTypes.string,
|
|
33
|
+
children: PropTypes.node,
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
export default CapTooltip;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default } from './CapTooltip';
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import styled from 'styled-components';
|
|
2
|
+
import * as styledVars from '../styled/variables';
|
|
3
|
+
|
|
4
|
+
export const TooltipWrapper = styled.span`
|
|
5
|
+
.cap-tooltip {
|
|
6
|
+
max-width: 324px;
|
|
7
|
+
|
|
8
|
+
.ant-tooltip-inner {
|
|
9
|
+
background-color: ${styledVars.FONT_COLOR_01};
|
|
10
|
+
font-size: ${styledVars.FONT_SIZE_M};
|
|
11
|
+
font-weight: ${styledVars.FONT_WEIGHT_MEDIUM};
|
|
12
|
+
padding: 6px 8px;
|
|
13
|
+
min-height: 32px;
|
|
14
|
+
border-radius: ${styledVars.RADIUS_04};
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
&.cap-bgcolor-tooltip {
|
|
18
|
+
.ant-tooltip-inner {
|
|
19
|
+
background-color: ${styledVars.FONT_COLOR_05};
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
&.hide-tooltip-pointer {
|
|
24
|
+
.ant-tooltip-arrow {
|
|
25
|
+
display: none;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.button-disabled-tooltip-wrapper {
|
|
31
|
+
display: inline-flex;
|
|
32
|
+
cursor: not-allowed;
|
|
33
|
+
|
|
34
|
+
.cap-button.ant-btn[disabled] {
|
|
35
|
+
pointer-events: none;
|
|
36
|
+
& > * {
|
|
37
|
+
pointer-events: auto;
|
|
38
|
+
cursor: not-allowed;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
`;
|
|
@@ -1,14 +1,12 @@
|
|
|
1
|
-
//
|
|
2
|
-
import React
|
|
1
|
+
// CapUnifiedSelect component using Ant Design v5 Select and TreeSelect directly
|
|
2
|
+
import React from 'react';
|
|
3
3
|
import PropTypes from 'prop-types';
|
|
4
|
-
import
|
|
5
|
-
import {
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
import withStyles from '../../utils/withStyles';
|
|
9
|
-
import styled from 'styled-components';
|
|
4
|
+
import { Select, TreeSelect } from 'antd';
|
|
5
|
+
import { SelectWrapper, HeaderWrapper, StyledInfoIcon } from './styles';
|
|
6
|
+
import CapLabel from '../CapLabel';
|
|
7
|
+
import CapTooltip from '../CapTooltip';
|
|
10
8
|
|
|
11
|
-
|
|
9
|
+
function CapUnifiedSelect({
|
|
12
10
|
type,
|
|
13
11
|
options = [],
|
|
14
12
|
treeData,
|
|
@@ -17,33 +15,12 @@ const CapUnifiedSelect = ({
|
|
|
17
15
|
placeholder = 'Select an option',
|
|
18
16
|
className,
|
|
19
17
|
style,
|
|
20
|
-
status,
|
|
21
|
-
statusMessage,
|
|
22
18
|
allowClear = false,
|
|
19
|
+
showSearch = false,
|
|
23
20
|
label,
|
|
24
21
|
tooltip,
|
|
25
22
|
disabled = false,
|
|
26
|
-
|
|
27
|
-
customPopupRender = false,
|
|
28
|
-
onConfirm,
|
|
29
|
-
onCancel
|
|
30
|
-
}) => {
|
|
31
|
-
const StyledSelect = styled(Select)`
|
|
32
|
-
${selectStyles}
|
|
33
|
-
`;
|
|
34
|
-
const StyledTreeSelect = styled(TreeSelect)`
|
|
35
|
-
${selectStyles}
|
|
36
|
-
`;
|
|
37
|
-
|
|
38
|
-
const [searchText, setSearchText] = useState('');
|
|
39
|
-
const [tempValue, setTempValue] = useState(value);
|
|
40
|
-
const [allSelected, setAllSelected] = useState(false);
|
|
41
|
-
|
|
42
|
-
// Update tempValue when value changes
|
|
43
|
-
useEffect(() => {
|
|
44
|
-
setTempValue(value);
|
|
45
|
-
}, [value]);
|
|
46
|
-
|
|
23
|
+
}) {
|
|
47
24
|
const selectVirtualizationProps = {
|
|
48
25
|
listHeight: 256,
|
|
49
26
|
};
|
|
@@ -53,296 +30,71 @@ const CapUnifiedSelect = ({
|
|
|
53
30
|
listItemHeight: 32,
|
|
54
31
|
};
|
|
55
32
|
|
|
56
|
-
// No results component
|
|
57
|
-
const NoResult = () => (
|
|
58
|
-
<div style={{
|
|
59
|
-
display: 'flex',
|
|
60
|
-
flexDirection: 'column',
|
|
61
|
-
alignItems: 'center',
|
|
62
|
-
justifyContent: 'center',
|
|
63
|
-
height: 200,
|
|
64
|
-
color: '#8c8c8c',
|
|
65
|
-
fontSize: 14
|
|
66
|
-
}}>
|
|
67
|
-
<WarningFilled style={{ fontSize: 36, marginBottom: 8, color: '#bfbfbf' }} />
|
|
68
|
-
<div style={{ fontWeight: 500 }}>No results found</div>
|
|
69
|
-
</div>
|
|
70
|
-
);
|
|
71
|
-
|
|
72
|
-
// Filter tree data based on search text
|
|
73
|
-
const getFilteredTreeData = (data, search) => {
|
|
74
|
-
if (!search) return data;
|
|
75
|
-
|
|
76
|
-
const filterNode = node => {
|
|
77
|
-
const titleText = node.title?.toLowerCase() || '';
|
|
78
|
-
const labelText = node.label?.toLowerCase() || '';
|
|
79
|
-
return titleText.includes(search.toLowerCase()) || labelText.includes(search.toLowerCase());
|
|
80
|
-
};
|
|
81
|
-
|
|
82
|
-
const loop = data =>
|
|
83
|
-
data.map(item => {
|
|
84
|
-
const children = item.children ? loop(item.children) : [];
|
|
85
|
-
if (filterNode(item) || children.length) {
|
|
86
|
-
return { ...item, children };
|
|
87
|
-
}
|
|
88
|
-
return null;
|
|
89
|
-
}).filter(Boolean);
|
|
90
|
-
|
|
91
|
-
return loop(data);
|
|
92
|
-
};
|
|
93
|
-
|
|
94
|
-
// Get all leaf node values from tree data
|
|
95
|
-
const flattenedLeafValues = (nodes) =>
|
|
96
|
-
nodes?.flatMap((node) =>
|
|
97
|
-
node.children ? flattenedLeafValues(node.children) : [node.value]
|
|
98
|
-
) || [];
|
|
99
|
-
|
|
100
|
-
const filteredTree = getFilteredTreeData(treeData || options, searchText);
|
|
101
|
-
const filteredOptions = !searchText ? options : options.filter(opt =>
|
|
102
|
-
opt.label?.toLowerCase().includes(searchText.toLowerCase())
|
|
103
|
-
);
|
|
104
|
-
|
|
105
|
-
// All available leaf values for the current filtered tree data
|
|
106
|
-
const leafValues = flattenedLeafValues(filteredTree);
|
|
107
|
-
|
|
108
|
-
// Handles select all checkbox click
|
|
109
|
-
const handleSelectAll = (isTree = false) => {
|
|
110
|
-
const availableValues = isTree ? leafValues : filteredOptions.map(opt => opt.value);
|
|
111
|
-
|
|
112
|
-
if (allSelected) {
|
|
113
|
-
setTempValue([]);
|
|
114
|
-
} else {
|
|
115
|
-
setTempValue(availableValues);
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
setAllSelected(!allSelected);
|
|
119
|
-
};
|
|
120
|
-
|
|
121
|
-
// Update allSelected state when value changes
|
|
122
|
-
useEffect(() => {
|
|
123
|
-
const isMultipleMode = type === 'multiSelect' || type === 'multiTreeSelect';
|
|
124
|
-
if (isMultipleMode && Array.isArray(tempValue)) {
|
|
125
|
-
const availableValues = type.includes('tree') ? leafValues : filteredOptions.map(opt => opt.value);
|
|
126
|
-
setAllSelected(tempValue.length > 0 && tempValue.length === availableValues.length);
|
|
127
|
-
}
|
|
128
|
-
}, [tempValue, filteredOptions, leafValues, type]);
|
|
129
|
-
|
|
130
|
-
// Handle confirmation
|
|
131
|
-
const handleConfirm = () => {
|
|
132
|
-
if (onConfirm) {
|
|
133
|
-
onConfirm(tempValue);
|
|
134
|
-
} else {
|
|
135
|
-
onChange(tempValue);
|
|
136
|
-
}
|
|
137
|
-
setSearchText('');
|
|
138
|
-
};
|
|
139
|
-
|
|
140
|
-
// Handle cancellation
|
|
141
|
-
const handleCancel = () => {
|
|
142
|
-
if (onCancel) {
|
|
143
|
-
onCancel();
|
|
144
|
-
}
|
|
145
|
-
setTempValue(value);
|
|
146
|
-
setSearchText('');
|
|
147
|
-
};
|
|
148
|
-
|
|
149
|
-
// Handle temporary value change
|
|
150
|
-
const handleTempChange = (newValue) => {
|
|
151
|
-
setTempValue(newValue);
|
|
152
|
-
};
|
|
153
|
-
|
|
154
|
-
const suffix =
|
|
155
|
-
(type === "multiTreeSelect" || type === "multiSelect") && Array.isArray(value) && value.length > 1 ? (
|
|
156
|
-
<>
|
|
157
|
-
<span>
|
|
158
|
-
+{value.length - 1} more
|
|
159
|
-
<DownOutlined />
|
|
160
|
-
</span>
|
|
161
|
-
</>
|
|
162
|
-
) : (
|
|
163
|
-
<DownOutlined />
|
|
164
|
-
);
|
|
165
|
-
|
|
166
|
-
const prefix = () => {
|
|
167
|
-
if((type === "multiTreeSelect" || type === "multiSelect") && Array.isArray(value) && value.length > 0) {
|
|
168
|
-
const selectedLabels = options
|
|
169
|
-
.filter((opt) => value.includes(opt.value))
|
|
170
|
-
.map((opt) => opt.label);
|
|
171
|
-
|
|
172
|
-
return selectedLabels[0];
|
|
173
|
-
} else {
|
|
174
|
-
return null;
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
|
|
178
33
|
const renderHeader = () => {
|
|
179
34
|
if (!label && !tooltip) return null;
|
|
35
|
+
|
|
180
36
|
return (
|
|
181
37
|
<HeaderWrapper className={disabled ? 'disabled' : ''}>
|
|
182
|
-
{label &&
|
|
38
|
+
{label && (
|
|
39
|
+
<CapLabel type="label16" className={disabled ? 'disabled' : ''}>
|
|
40
|
+
{label}
|
|
41
|
+
</CapLabel>
|
|
42
|
+
)}
|
|
183
43
|
{tooltip && (
|
|
184
|
-
<
|
|
185
|
-
<
|
|
186
|
-
</
|
|
44
|
+
<CapTooltip title={tooltip}>
|
|
45
|
+
<StyledInfoIcon className={disabled ? 'disabled' : ''} />
|
|
46
|
+
</CapTooltip>
|
|
187
47
|
)}
|
|
188
48
|
</HeaderWrapper>
|
|
189
49
|
);
|
|
190
50
|
};
|
|
191
51
|
|
|
192
52
|
const renderDropdown = () => {
|
|
193
|
-
const isMultipleSelect = type === 'multiSelect' || type === 'multiTreeSelect';
|
|
194
|
-
const isTreeMode = type === 'treeSelect' || type === 'multiTreeSelect';
|
|
195
|
-
const currentItems = isTreeMode ? filteredTree : filteredOptions;
|
|
196
|
-
const selectedCount = Array.isArray(tempValue) ? tempValue.length : (tempValue ? 1 : 0);
|
|
197
|
-
|
|
198
|
-
// Custom dropdown render for both Select and TreeSelect
|
|
199
|
-
const renderCustomDropdown = (menu) => {
|
|
200
|
-
if (!customPopupRender) return menu;
|
|
201
|
-
|
|
202
|
-
return (
|
|
203
|
-
<>
|
|
204
|
-
<div style={{ borderBottom: '1px solid #f0f0f0'}}>
|
|
205
|
-
<Input
|
|
206
|
-
prefix={<SearchOutlined style={{ color: "#B3BAC5" }} />}
|
|
207
|
-
placeholder="Search"
|
|
208
|
-
variant="borderless"
|
|
209
|
-
value={searchText}
|
|
210
|
-
onChange={(e) => setSearchText(e.target.value)}
|
|
211
|
-
onKeyDown={(e) => e.stopPropagation()}
|
|
212
|
-
/>
|
|
213
|
-
</div>
|
|
214
|
-
|
|
215
|
-
{isMultipleSelect && currentItems.length > 0 && (
|
|
216
|
-
<div style={{
|
|
217
|
-
padding: '8px 12px',
|
|
218
|
-
cursor: 'pointer',
|
|
219
|
-
display: 'flex',
|
|
220
|
-
alignItems: 'center',
|
|
221
|
-
borderBottom: '1px solid #f0f0f0'
|
|
222
|
-
}}
|
|
223
|
-
onClick={(e) => {
|
|
224
|
-
// Prevent event propagation to keep dropdown open
|
|
225
|
-
e.stopPropagation();
|
|
226
|
-
handleSelectAll(isTreeMode);
|
|
227
|
-
}}>
|
|
228
|
-
<input
|
|
229
|
-
type="checkbox"
|
|
230
|
-
checked={allSelected}
|
|
231
|
-
readOnly
|
|
232
|
-
style={{ cursor: 'pointer' }}
|
|
233
|
-
onClick={(e) => e.stopPropagation()}
|
|
234
|
-
/>
|
|
235
|
-
<label style={{ marginLeft: 8, cursor: 'pointer' }}>Select all</label>
|
|
236
|
-
</div>
|
|
237
|
-
)}
|
|
238
|
-
|
|
239
|
-
{currentItems.length === 0 ? <NoResult /> : menu}
|
|
240
|
-
|
|
241
|
-
{currentItems.length > 0 && isMultipleSelect && (
|
|
242
|
-
<div style={{
|
|
243
|
-
display: 'flex',
|
|
244
|
-
justifyContent: 'space-between',
|
|
245
|
-
alignItems: 'center',
|
|
246
|
-
padding: '8px 12px',
|
|
247
|
-
borderTop: '1px solid #f0f0f0'
|
|
248
|
-
}}>
|
|
249
|
-
<div>
|
|
250
|
-
<Button
|
|
251
|
-
type="primary"
|
|
252
|
-
size="small"
|
|
253
|
-
style={{ marginRight: 8 }}
|
|
254
|
-
onClick={(e) => {
|
|
255
|
-
e.stopPropagation();
|
|
256
|
-
handleConfirm();
|
|
257
|
-
}}>
|
|
258
|
-
Confirm
|
|
259
|
-
</Button>
|
|
260
|
-
<Button
|
|
261
|
-
type="text"
|
|
262
|
-
size="small"
|
|
263
|
-
onClick={(e) => {
|
|
264
|
-
e.stopPropagation();
|
|
265
|
-
handleCancel();
|
|
266
|
-
}}>
|
|
267
|
-
Cancel
|
|
268
|
-
</Button>
|
|
269
|
-
</div>
|
|
270
|
-
{selectedCount > 0 && (
|
|
271
|
-
<span style={{ color: '#8c8c8c', fontSize: '14px' }}>
|
|
272
|
-
{selectedCount} selected
|
|
273
|
-
</span>
|
|
274
|
-
)}
|
|
275
|
-
</div>
|
|
276
|
-
)}
|
|
277
|
-
</>
|
|
278
|
-
);
|
|
279
|
-
};
|
|
280
|
-
|
|
281
53
|
if (type === 'treeSelect' || type === 'multiTreeSelect') {
|
|
282
54
|
return (
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
onChange={customPopupRender ? handleTempChange : onChange}
|
|
288
|
-
placeholder={placeholder}
|
|
289
|
-
maxTagCount={0}
|
|
290
|
-
maxTagPlaceholder={() => null}
|
|
291
|
-
prefix={type === "multiTreeSelect" && value.length > 0 && prefix()}
|
|
292
|
-
suffixIcon={suffix}
|
|
293
|
-
className={classnames(`cap-unified-tree-select ${className || ''}`)}
|
|
294
|
-
style={style}
|
|
295
|
-
status={status}
|
|
296
|
-
allowClear={allowClear}
|
|
297
|
-
showSearch={false}
|
|
298
|
-
multiple={type === 'multiTreeSelect'}
|
|
299
|
-
treeCheckable={treeCheckable}
|
|
300
|
-
showCheckedStrategy={TreeSelect.SHOW_PARENT}
|
|
301
|
-
virtual
|
|
302
|
-
disabled={disabled}
|
|
303
|
-
filterTreeNode={false}
|
|
304
|
-
{...treeSelectVirtualizationProps}
|
|
305
|
-
popupRender={renderCustomDropdown}
|
|
306
|
-
/>
|
|
307
|
-
{status === 'error' && <div style={{ color: '#E83135' }} className="cap-unified-select-status">{statusMessage}</div>}
|
|
308
|
-
</>
|
|
309
|
-
);
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
return (
|
|
313
|
-
<>
|
|
314
|
-
<StyledSelect
|
|
315
|
-
options={filteredOptions}
|
|
316
|
-
value={customPopupRender ? tempValue : value}
|
|
317
|
-
onChange={customPopupRender ? handleTempChange : onChange}
|
|
55
|
+
<TreeSelect
|
|
56
|
+
treeData={treeData || options}
|
|
57
|
+
value={value}
|
|
58
|
+
onChange={onChange}
|
|
318
59
|
placeholder={placeholder}
|
|
319
|
-
|
|
320
|
-
maxTagPlaceholder={() => null}
|
|
321
|
-
prefix={type === "multiSelect" && value.length > 0 && prefix()}
|
|
322
|
-
suffixIcon={suffix}
|
|
323
|
-
className={classnames('cap-unified-select', className)}
|
|
60
|
+
className={className}
|
|
324
61
|
style={style}
|
|
325
62
|
allowClear={allowClear}
|
|
326
|
-
showSearch={
|
|
327
|
-
|
|
63
|
+
showSearch={showSearch}
|
|
64
|
+
multiple={type === 'multiTreeSelect' ? true : false}
|
|
328
65
|
virtual
|
|
66
|
+
treeDefaultExpandAll
|
|
329
67
|
disabled={disabled}
|
|
330
|
-
|
|
331
|
-
{...selectVirtualizationProps}
|
|
332
|
-
popupRender={renderCustomDropdown}
|
|
68
|
+
{...treeSelectVirtualizationProps}
|
|
333
69
|
/>
|
|
334
|
-
|
|
335
|
-
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return (
|
|
74
|
+
<Select
|
|
75
|
+
value={value}
|
|
76
|
+
onChange={onChange}
|
|
77
|
+
placeholder={placeholder}
|
|
78
|
+
className={className}
|
|
79
|
+
style={style}
|
|
80
|
+
allowClear={allowClear}
|
|
81
|
+
showSearch={showSearch}
|
|
82
|
+
options={options}
|
|
83
|
+
mode={type === 'multiSelect' ? 'multiple' : undefined}
|
|
84
|
+
virtual
|
|
85
|
+
disabled={disabled}
|
|
86
|
+
{...selectVirtualizationProps}
|
|
87
|
+
/>
|
|
336
88
|
);
|
|
337
|
-
};
|
|
89
|
+
};
|
|
338
90
|
|
|
339
91
|
return (
|
|
340
|
-
<SelectWrapper
|
|
92
|
+
<SelectWrapper>
|
|
341
93
|
{renderHeader()}
|
|
342
94
|
{renderDropdown()}
|
|
343
95
|
</SelectWrapper>
|
|
344
96
|
);
|
|
345
|
-
}
|
|
97
|
+
}
|
|
346
98
|
|
|
347
99
|
CapUnifiedSelect.propTypes = {
|
|
348
100
|
type: PropTypes.oneOf(['select', 'multiSelect', 'treeSelect', 'multiTreeSelect']),
|
|
@@ -354,21 +106,16 @@ CapUnifiedSelect.propTypes = {
|
|
|
354
106
|
className: PropTypes.string,
|
|
355
107
|
style: PropTypes.object,
|
|
356
108
|
allowClear: PropTypes.bool,
|
|
109
|
+
showSearch: PropTypes.bool,
|
|
357
110
|
label: PropTypes.string,
|
|
358
111
|
tooltip: PropTypes.oneOfType([PropTypes.string, PropTypes.node]),
|
|
359
112
|
disabled: PropTypes.bool,
|
|
360
|
-
treeCheckable: PropTypes.bool,
|
|
361
|
-
customPopupRender: PropTypes.bool,
|
|
362
|
-
onConfirm: PropTypes.func,
|
|
363
|
-
onCancel: PropTypes.func,
|
|
364
113
|
};
|
|
365
114
|
|
|
366
115
|
CapUnifiedSelect.defaultProps = {
|
|
367
116
|
type: 'select',
|
|
368
117
|
allowClear: false,
|
|
369
|
-
|
|
370
|
-
treeCheckable: false,
|
|
371
|
-
className: '',
|
|
118
|
+
showSearch: false,
|
|
372
119
|
};
|
|
373
120
|
|
|
374
|
-
export default
|
|
121
|
+
export default CapUnifiedSelect;
|