@publishfx/publish-components 2.0.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/README.md +191 -0
- package/dist/ActionButton/index.d.ts +10 -0
- package/dist/ActionButton/index.js +40 -0
- package/dist/ActionButton/index.module.js +9 -0
- package/dist/ActionButton/index_module.css +23 -0
- package/dist/ActionButton/interface.d.ts +12 -0
- package/dist/ActionButton/interface.js +9 -0
- package/dist/CommonModal/config.d.ts +8 -0
- package/dist/CommonModal/config.js +13 -0
- package/dist/CommonModal/confirm.d.ts +7 -0
- package/dist/CommonModal/confirm.js +132 -0
- package/dist/CommonModal/index.d.ts +2 -0
- package/dist/CommonModal/index.js +3 -0
- package/dist/CommonModal/interface.d.ts +17 -0
- package/dist/CommonModal/interface.js +0 -0
- package/dist/CommonModal/modal.d.ts +11 -0
- package/dist/CommonModal/modal.js +161 -0
- package/dist/CompareChange/index.d.ts +20 -0
- package/dist/CompareChange/index.js +66 -0
- package/dist/CustomTransfer/BaseTransfer.d.ts +35 -0
- package/dist/CustomTransfer/BaseTransfer.js +155 -0
- package/dist/CustomTransfer/SelectItemList.d.ts +9 -0
- package/dist/CustomTransfer/SelectItemList.js +54 -0
- package/dist/CustomTransfer/SelectTreeList.d.ts +43 -0
- package/dist/CustomTransfer/SelectTreeList.js +248 -0
- package/dist/CustomTransfer/SelectedItemList.d.ts +21 -0
- package/dist/CustomTransfer/SelectedItemList.js +132 -0
- package/dist/CustomTransfer/SimpleLink.d.ts +4 -0
- package/dist/CustomTransfer/SimpleLink.js +20 -0
- package/dist/CustomTransfer/index.d.ts +22 -0
- package/dist/CustomTransfer/index.js +92 -0
- package/dist/CustomTransfer/styled.d.ts +27 -0
- package/dist/CustomTransfer/styled.js +181 -0
- package/dist/PerformanceTable/ResizableTitle.d.ts +12 -0
- package/dist/PerformanceTable/ResizableTitle.js +85 -0
- package/dist/PerformanceTable/index.d.ts +4 -0
- package/dist/PerformanceTable/index.js +417 -0
- package/dist/PerformanceTable/interface.d.ts +47 -0
- package/dist/PerformanceTable/interface.js +0 -0
- package/dist/PerformanceTable/style.d.ts +19 -0
- package/dist/PerformanceTable/style.js +402 -0
- package/dist/PerformanceTable/useResizable.d.ts +29 -0
- package/dist/PerformanceTable/useResizable.js +108 -0
- package/dist/ReactSticky/Container.d.ts +19 -0
- package/dist/ReactSticky/Container.js +93 -0
- package/dist/ReactSticky/Sticky.d.ts +27 -0
- package/dist/ReactSticky/Sticky.js +123 -0
- package/dist/ReactSticky/index.d.ts +5 -0
- package/dist/ReactSticky/index.js +4 -0
- package/dist/assets/icons/403.js +15 -0
- package/dist/assets/icons/Icon403.d.ts +3 -0
- package/dist/assets/icons/Icon403.js +14 -0
- package/dist/assets/icons/IconAdd.d.ts +3 -0
- package/dist/assets/icons/IconAdd.js +24 -0
- package/dist/assets/icons/IconAim.d.ts +3 -0
- package/dist/assets/icons/IconAim.js +36 -0
- package/dist/assets/icons/IconBatchupload.d.ts +3 -0
- package/dist/assets/icons/IconBatchupload.js +23 -0
- package/dist/assets/icons/IconClose.d.ts +3 -0
- package/dist/assets/icons/IconClose.js +15 -0
- package/dist/assets/icons/IconDrag_sort.d.ts +3 -0
- package/dist/assets/icons/IconDrag_sort.js +28 -0
- package/dist/assets/icons/IconError.d.ts +3 -0
- package/dist/assets/icons/IconError.js +42 -0
- package/dist/assets/icons/IconExport.d.ts +3 -0
- package/dist/assets/icons/IconExport.js +15 -0
- package/dist/assets/icons/IconFolder.d.ts +3 -0
- package/dist/assets/icons/IconFolder.js +126 -0
- package/dist/assets/icons/IconOpen_down.d.ts +3 -0
- package/dist/assets/icons/IconOpen_down.js +13 -0
- package/dist/assets/icons/IconOpen_right.d.ts +3 -0
- package/dist/assets/icons/IconOpen_right.js +13 -0
- package/dist/assets/icons/IconPlus.d.ts +3 -0
- package/dist/assets/icons/IconPlus.js +17 -0
- package/dist/assets/icons/IconSearch.d.ts +3 -0
- package/dist/assets/icons/IconSearch.js +15 -0
- package/dist/assets/icons/IconSelected_transfer.d.ts +3 -0
- package/dist/assets/icons/IconSelected_transfer.js +15 -0
- package/dist/assets/icons/IconSettings.d.ts +3 -0
- package/dist/assets/icons/IconSettings.js +15 -0
- package/dist/assets/icons/IconUp_down.d.ts +3 -0
- package/dist/assets/icons/IconUp_down.js +15 -0
- package/dist/assets/icons/IconUpload.d.ts +3 -0
- package/dist/assets/icons/IconUpload.js +20 -0
- package/dist/assets/icons/Up_down.js +17 -0
- package/dist/assets/icons/add.js +28 -0
- package/dist/assets/icons/batchupload.js +24 -0
- package/dist/assets/icons/close.js +17 -0
- package/dist/assets/icons/data_increase.js +31 -0
- package/dist/assets/icons/data_no_change.js +19 -0
- package/dist/assets/icons/data_reduction.js +31 -0
- package/dist/assets/icons/drag_sort.js +30 -0
- package/dist/assets/icons/error.js +44 -0
- package/dist/assets/icons/export.js +16 -0
- package/dist/assets/icons/folder.js +128 -0
- package/dist/assets/icons/open_down.js +15 -0
- package/dist/assets/icons/open_right.js +15 -0
- package/dist/assets/icons/plus.js +19 -0
- package/dist/assets/icons/search.js +17 -0
- package/dist/assets/icons/selected.js +17 -0
- package/dist/assets/icons/selected_transfer.js +17 -0
- package/dist/assets/icons/settings.js +17 -0
- package/dist/assets/icons/upload.js +23 -0
- package/dist/assets/images/book.js +2 -0
- package/dist/assets/images/emptyVideo.js +2 -0
- package/dist/assets/images/excel.js +2 -0
- package/dist/assets/images/fail.js +2 -0
- package/dist/assets/images/file.js +2 -0
- package/dist/assets/images/noResult.js +2 -0
- package/dist/assets/images/platform/Apple.js +23 -0
- package/dist/assets/images/platform/Facebook.js +42 -0
- package/dist/assets/images/platform/Google.js +54 -0
- package/dist/assets/images/platform/Instagram.js +2 -0
- package/dist/assets/images/platform/TikTok.js +42 -0
- package/dist/assets/images/platform/Twitch.js +2 -0
- package/dist/assets/images/platform/Twitter.js +2 -0
- package/dist/assets/images/platform/Youtube.js +2 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +4 -0
- package/dist/static/image/Instagram.png +0 -0
- package/dist/static/image/Twitch.png +0 -0
- package/dist/static/image/Twitter.png +0 -0
- package/dist/static/image/Youtube.png +0 -0
- package/dist/static/image/book.png +0 -0
- package/dist/static/image/emptyVideo.png +0 -0
- package/dist/static/image/excel.png +0 -0
- package/dist/static/image/fail.png +0 -0
- package/dist/static/image/file.png +0 -0
- package/dist/static/image/noResult.png +0 -0
- package/dist/static/svg/403.svg +22 -0
- package/dist/static/svg/Apple.svg +4 -0
- package/dist/static/svg/Facebook.svg +9 -0
- package/dist/static/svg/Google.svg +14 -0
- package/dist/static/svg/TikTok.svg +9 -0
- package/dist/static/svg/Up_down.svg +1 -0
- package/dist/static/svg/add.svg +1 -0
- package/dist/static/svg/batchupload.svg +1 -0
- package/dist/static/svg/close.svg +1 -0
- package/dist/static/svg/data_increase.svg +15 -0
- package/dist/static/svg/data_no_change.svg +1 -0
- package/dist/static/svg/data_reduction.svg +15 -0
- package/dist/static/svg/drag_sort.svg +1 -0
- package/dist/static/svg/error.svg +8 -0
- package/dist/static/svg/export.svg +1 -0
- package/dist/static/svg/folder.svg +36 -0
- package/dist/static/svg/open_down.svg +1 -0
- package/dist/static/svg/open_right.svg +8 -0
- package/dist/static/svg/plus.svg +3 -0
- package/dist/static/svg/search.svg +1 -0
- package/dist/static/svg/selected.svg +3 -0
- package/dist/static/svg/selected_transfer.svg +3 -0
- package/dist/static/svg/settings.svg +1 -0
- package/dist/static/svg/upload.svg +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import styled_components from "styled-components";
|
|
3
|
+
import { isNil } from "lodash";
|
|
4
|
+
import { ReactComponent } from "../assets/icons/data_increase.js";
|
|
5
|
+
import { ReactComponent as data_reduction_js_ReactComponent } from "../assets/icons/data_reduction.js";
|
|
6
|
+
import { ReactComponent as data_no_change_js_ReactComponent } from "../assets/icons/data_no_change.js";
|
|
7
|
+
const formatPercentage = (value, decimalPlaces = 2)=>{
|
|
8
|
+
const num = 'string' == typeof value ? parseFloat(value) : Number(value);
|
|
9
|
+
if (isNaN(num)) return '-';
|
|
10
|
+
const percentage = (100 * num).toFixed(decimalPlaces);
|
|
11
|
+
return `${percentage}%`;
|
|
12
|
+
};
|
|
13
|
+
const Container = styled_components.span`
|
|
14
|
+
display: inline-flex;
|
|
15
|
+
align-items: center;
|
|
16
|
+
gap: 4px;
|
|
17
|
+
font-size: 14px;
|
|
18
|
+
`;
|
|
19
|
+
const ValueSpan = styled_components.span`
|
|
20
|
+
font-weight: ${(props)=>props.fontWeight};
|
|
21
|
+
color: ${(props)=>props.isPositive ? '#05a76f' : props.isNegative ? '#d0324b' : '#86909c'};
|
|
22
|
+
font-size: ${(props)=>props.fontSize}px;
|
|
23
|
+
`;
|
|
24
|
+
const IconWrapper = styled_components.span`
|
|
25
|
+
display: inline-flex;
|
|
26
|
+
align-items: center;
|
|
27
|
+
justify-content: center;
|
|
28
|
+
width: 10px;
|
|
29
|
+
height: 10px;
|
|
30
|
+
color: ${(props)=>props.isPositive ? '#05a76f' : props.isNegative ? '#d0324b' : '#86909c'};
|
|
31
|
+
svg {
|
|
32
|
+
width: 100%;
|
|
33
|
+
height: 100%;
|
|
34
|
+
fill: currentColor;
|
|
35
|
+
}
|
|
36
|
+
`;
|
|
37
|
+
const CompareChange = ({ value, fontSize = 14, fontWeight = 600 })=>{
|
|
38
|
+
if (isNil(value) || '' === value || '-' === value) return /*#__PURE__*/ jsx("span", {
|
|
39
|
+
children: "-"
|
|
40
|
+
});
|
|
41
|
+
const numValue = Number(value);
|
|
42
|
+
if (isNaN(numValue)) return /*#__PURE__*/ jsx("span", {
|
|
43
|
+
children: "-"
|
|
44
|
+
});
|
|
45
|
+
const isPositive = numValue > 0;
|
|
46
|
+
const isNegative = numValue < 0;
|
|
47
|
+
const formattedValue = formatPercentage(Math.abs(numValue));
|
|
48
|
+
return /*#__PURE__*/ jsxs(Container, {
|
|
49
|
+
children: [
|
|
50
|
+
/*#__PURE__*/ jsx(IconWrapper, {
|
|
51
|
+
isPositive: isPositive,
|
|
52
|
+
isNegative: isNegative,
|
|
53
|
+
children: isNegative ? /*#__PURE__*/ jsx(data_reduction_js_ReactComponent, {}) : isPositive ? /*#__PURE__*/ jsx(ReactComponent, {}) : /*#__PURE__*/ jsx(data_no_change_js_ReactComponent, {})
|
|
54
|
+
}),
|
|
55
|
+
/*#__PURE__*/ jsx(ValueSpan, {
|
|
56
|
+
isPositive: isPositive,
|
|
57
|
+
isNegative: isNegative,
|
|
58
|
+
fontSize: fontSize,
|
|
59
|
+
fontWeight: fontWeight,
|
|
60
|
+
children: formattedValue
|
|
61
|
+
})
|
|
62
|
+
]
|
|
63
|
+
});
|
|
64
|
+
};
|
|
65
|
+
const src_CompareChange = CompareChange;
|
|
66
|
+
export { src_CompareChange as default, formatPercentage };
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { FunctionComponent, ReactNode } from 'react';
|
|
2
|
+
interface GroupOption {
|
|
3
|
+
value: string | number;
|
|
4
|
+
label: string;
|
|
5
|
+
options?: Array<{
|
|
6
|
+
id?: string | number;
|
|
7
|
+
value: string | number;
|
|
8
|
+
label: string;
|
|
9
|
+
disabled?: boolean;
|
|
10
|
+
options?: Array<{
|
|
11
|
+
id?: string | number;
|
|
12
|
+
value: string | number;
|
|
13
|
+
label: string;
|
|
14
|
+
}>;
|
|
15
|
+
[key: string]: any;
|
|
16
|
+
}>;
|
|
17
|
+
[key: string]: any;
|
|
18
|
+
}
|
|
19
|
+
interface BaseTransferProps {
|
|
20
|
+
selectedWidth?: number | string;
|
|
21
|
+
groupOptions?: GroupOption[];
|
|
22
|
+
selected?: (string | number)[];
|
|
23
|
+
setSelectedValue: (selected: (string | number)[]) => void;
|
|
24
|
+
setSelectedOptions: (selectedOptions: any[]) => void;
|
|
25
|
+
limit?: number;
|
|
26
|
+
selectedTitle?: string;
|
|
27
|
+
needSelectedNum?: boolean;
|
|
28
|
+
needActionBtn?: boolean;
|
|
29
|
+
leftContent?: Array<(props: any) => ReactNode>;
|
|
30
|
+
isNotDrag?: boolean;
|
|
31
|
+
needSelectedBacground?: boolean;
|
|
32
|
+
selectTreeNeedScroll?: boolean;
|
|
33
|
+
}
|
|
34
|
+
declare const BaseTransfer: FunctionComponent<BaseTransferProps>;
|
|
35
|
+
export default BaseTransfer;
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useEffect, useMemo, useState } from "react";
|
|
3
|
+
import { Checkbox } from "@arco-design/web-react";
|
|
4
|
+
import { DimensionContainer } from "./styled.js";
|
|
5
|
+
import SelectedItemList from "./SelectedItemList.js";
|
|
6
|
+
const useCheckbox = Checkbox.useCheckbox;
|
|
7
|
+
const BaseTransfer = ({ selectedWidth, groupOptions, selected: outerSelected, setSelectedValue, setSelectedOptions, limit, selectedTitle, needSelectedNum, needActionBtn, leftContent, isNotDrag, needSelectedBacground, selectTreeNeedScroll })=>{
|
|
8
|
+
const [dataList, setDataList] = useState([]);
|
|
9
|
+
const [currentValue, setCurrentValue] = useState(0);
|
|
10
|
+
const { selected, setSelected, unSelectAll, setValueSelected } = useCheckbox([]);
|
|
11
|
+
useEffect(()=>{
|
|
12
|
+
if (groupOptions?.length) {
|
|
13
|
+
setDataList(groupOptions);
|
|
14
|
+
setCurrentValue(groupOptions[0]?.value);
|
|
15
|
+
}
|
|
16
|
+
}, [
|
|
17
|
+
groupOptions
|
|
18
|
+
]);
|
|
19
|
+
const dataSelectedMap = useMemo(()=>{
|
|
20
|
+
const res = {};
|
|
21
|
+
dataList?.forEach((data)=>{
|
|
22
|
+
res[data.value] = data?.options?.filter((o)=>selected?.indexOf(o?.id || o?.value) >= 0 || o?.options?.some((c)=>selected?.indexOf(c?.id || c?.value) >= 0))?.length || 0;
|
|
23
|
+
});
|
|
24
|
+
return res;
|
|
25
|
+
}, [
|
|
26
|
+
dataList,
|
|
27
|
+
selected
|
|
28
|
+
]);
|
|
29
|
+
const currentOptions = useMemo(()=>{
|
|
30
|
+
if (selectTreeNeedScroll) return dataList;
|
|
31
|
+
const selectedGroupOptions = dataList?.find((o)=>o.value === currentValue)?.options;
|
|
32
|
+
if (limit && selected?.length >= limit) return selectedGroupOptions?.map((option)=>({
|
|
33
|
+
...option,
|
|
34
|
+
disabled: !selected?.includes(option.value)
|
|
35
|
+
}));
|
|
36
|
+
return selectedGroupOptions?.map((option)=>({
|
|
37
|
+
...option,
|
|
38
|
+
disabled: false
|
|
39
|
+
}));
|
|
40
|
+
}, [
|
|
41
|
+
limit,
|
|
42
|
+
dataList,
|
|
43
|
+
selected,
|
|
44
|
+
currentValue,
|
|
45
|
+
selectTreeNeedScroll
|
|
46
|
+
]);
|
|
47
|
+
const dataMap = useMemo(()=>{
|
|
48
|
+
let optionsNew = [];
|
|
49
|
+
dataList?.forEach((option)=>{
|
|
50
|
+
optionsNew = optionsNew?.concat(option?.options || []) || [];
|
|
51
|
+
});
|
|
52
|
+
const optionsAll = optionsNew;
|
|
53
|
+
return optionsAll?.reduce((prev, { id, label, value, options, ...props })=>{
|
|
54
|
+
prev[id || value] = {
|
|
55
|
+
id: id || value,
|
|
56
|
+
label,
|
|
57
|
+
value,
|
|
58
|
+
...props
|
|
59
|
+
};
|
|
60
|
+
return prev;
|
|
61
|
+
}, {}) || {};
|
|
62
|
+
}, [
|
|
63
|
+
dataList
|
|
64
|
+
]);
|
|
65
|
+
const selectedOptions = useMemo(()=>selected?.map((value)=>dataMap[value]).filter(Boolean) || [], [
|
|
66
|
+
selected,
|
|
67
|
+
dataMap
|
|
68
|
+
]);
|
|
69
|
+
const handleSelectItemClick = (currentData)=>{
|
|
70
|
+
setCurrentValue(currentData?.value);
|
|
71
|
+
};
|
|
72
|
+
const deleteItem = (value)=>{
|
|
73
|
+
setValueSelected(value, false);
|
|
74
|
+
};
|
|
75
|
+
const reset = useCallback(()=>{
|
|
76
|
+
if (outerSelected && outerSelected?.length) setSelected(outerSelected);
|
|
77
|
+
}, [
|
|
78
|
+
outerSelected
|
|
79
|
+
]);
|
|
80
|
+
useEffect(()=>{
|
|
81
|
+
reset();
|
|
82
|
+
}, [
|
|
83
|
+
reset
|
|
84
|
+
]);
|
|
85
|
+
useEffect(()=>{
|
|
86
|
+
setSelectedValue(selected);
|
|
87
|
+
setSelectedOptions(selectedOptions);
|
|
88
|
+
}, [
|
|
89
|
+
selected,
|
|
90
|
+
selectedOptions,
|
|
91
|
+
setSelectedValue,
|
|
92
|
+
setSelectedOptions
|
|
93
|
+
]);
|
|
94
|
+
const renderLeftContent = ()=>{
|
|
95
|
+
if (leftContent && leftContent.length >= 2) return /*#__PURE__*/ jsxs(Fragment, {
|
|
96
|
+
children: [
|
|
97
|
+
leftContent[0]({
|
|
98
|
+
dataList,
|
|
99
|
+
currentValue,
|
|
100
|
+
dataSelectedMap,
|
|
101
|
+
handleSelectItemClick
|
|
102
|
+
}),
|
|
103
|
+
leftContent[1]({
|
|
104
|
+
dataMap,
|
|
105
|
+
dataList,
|
|
106
|
+
setDataList,
|
|
107
|
+
currentOptions,
|
|
108
|
+
currentValue,
|
|
109
|
+
selected,
|
|
110
|
+
setSelected,
|
|
111
|
+
setValueSelected
|
|
112
|
+
})
|
|
113
|
+
]
|
|
114
|
+
});
|
|
115
|
+
return leftContent && leftContent.length > 0 && leftContent[0]({
|
|
116
|
+
dataMap,
|
|
117
|
+
dataList,
|
|
118
|
+
setDataList,
|
|
119
|
+
currentOptions,
|
|
120
|
+
currentValue,
|
|
121
|
+
selected,
|
|
122
|
+
setSelected,
|
|
123
|
+
setValueSelected
|
|
124
|
+
});
|
|
125
|
+
};
|
|
126
|
+
return /*#__PURE__*/ jsxs(DimensionContainer, {
|
|
127
|
+
children: [
|
|
128
|
+
/*#__PURE__*/ jsx("div", {
|
|
129
|
+
style: {
|
|
130
|
+
display: 'flex',
|
|
131
|
+
flex: 1,
|
|
132
|
+
marginRight: '16px'
|
|
133
|
+
},
|
|
134
|
+
children: renderLeftContent()
|
|
135
|
+
}),
|
|
136
|
+
/*#__PURE__*/ jsx(SelectedItemList, {
|
|
137
|
+
selectedWidth: selectedWidth,
|
|
138
|
+
selectedTitle: selectedTitle,
|
|
139
|
+
limit: limit,
|
|
140
|
+
isNotDrag: isNotDrag,
|
|
141
|
+
needSelectedBacground: needSelectedBacground,
|
|
142
|
+
needSelectedNum: needSelectedNum,
|
|
143
|
+
needActionBtn: needActionBtn,
|
|
144
|
+
dataMap: dataMap,
|
|
145
|
+
selected: selected,
|
|
146
|
+
setSelected: setSelected,
|
|
147
|
+
deleteItem: deleteItem,
|
|
148
|
+
clear: unSelectAll,
|
|
149
|
+
reset: reset
|
|
150
|
+
})
|
|
151
|
+
]
|
|
152
|
+
});
|
|
153
|
+
};
|
|
154
|
+
const CustomTransfer_BaseTransfer = BaseTransfer;
|
|
155
|
+
export { CustomTransfer_BaseTransfer as default };
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
declare const SelectItemList: ({ selectWidth, selectTitle, dataList, currentValue, handleSelectItemClick, dataSelectedMap, }: {
|
|
2
|
+
selectWidth?: number | string;
|
|
3
|
+
selectTitle?: string;
|
|
4
|
+
dataList: any[];
|
|
5
|
+
currentValue: any;
|
|
6
|
+
handleSelectItemClick: (currentData: any) => void;
|
|
7
|
+
dataSelectedMap: any;
|
|
8
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
9
|
+
export default SelectItemList;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { ReactComponent } from "../assets/icons/selected.js";
|
|
3
|
+
import styled_components from "styled-components";
|
|
4
|
+
import { ClassifyItem, ColumnContent, StyledDivider, Title } from "./styled.js";
|
|
5
|
+
const ScrollableContainer = styled_components.div`
|
|
6
|
+
flex: 1;
|
|
7
|
+
overflow: auto;
|
|
8
|
+
padding: 12px;
|
|
9
|
+
`;
|
|
10
|
+
const SelectItemList = ({ selectWidth = 180, selectTitle = '筛选条件分类', dataList, currentValue, handleSelectItemClick, dataSelectedMap })=>/*#__PURE__*/ jsxs(ColumnContent, {
|
|
11
|
+
style: {
|
|
12
|
+
width: selectWidth,
|
|
13
|
+
borderRight: 'none',
|
|
14
|
+
borderTopRightRadius: '0px',
|
|
15
|
+
borderBottomRightRadius: '0px'
|
|
16
|
+
},
|
|
17
|
+
children: [
|
|
18
|
+
/*#__PURE__*/ jsxs("div", {
|
|
19
|
+
children: [
|
|
20
|
+
/*#__PURE__*/ jsxs(Title, {
|
|
21
|
+
children: [
|
|
22
|
+
/*#__PURE__*/ jsx(ReactComponent, {
|
|
23
|
+
className: "selected-icon"
|
|
24
|
+
}),
|
|
25
|
+
/*#__PURE__*/ jsx("span", {
|
|
26
|
+
children: selectTitle
|
|
27
|
+
})
|
|
28
|
+
]
|
|
29
|
+
}),
|
|
30
|
+
/*#__PURE__*/ jsx(StyledDivider, {})
|
|
31
|
+
]
|
|
32
|
+
}),
|
|
33
|
+
/*#__PURE__*/ jsx(ScrollableContainer, {
|
|
34
|
+
children: dataList.map((data)=>/*#__PURE__*/ jsxs(ClassifyItem, {
|
|
35
|
+
selected: currentValue === data.value,
|
|
36
|
+
onClick: ()=>{
|
|
37
|
+
handleSelectItemClick(data);
|
|
38
|
+
},
|
|
39
|
+
children: [
|
|
40
|
+
/*#__PURE__*/ jsx("span", {
|
|
41
|
+
className: "group-name",
|
|
42
|
+
children: data.label
|
|
43
|
+
}),
|
|
44
|
+
/*#__PURE__*/ jsx("span", {
|
|
45
|
+
className: "group-selected-num",
|
|
46
|
+
children: dataSelectedMap[data.value]
|
|
47
|
+
})
|
|
48
|
+
]
|
|
49
|
+
}, data.value))
|
|
50
|
+
})
|
|
51
|
+
]
|
|
52
|
+
});
|
|
53
|
+
const CustomTransfer_SelectItemList = SelectItemList;
|
|
54
|
+
export { CustomTransfer_SelectItemList as default };
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { FunctionComponent } from 'react';
|
|
2
|
+
interface Option {
|
|
3
|
+
id?: string | number;
|
|
4
|
+
value: string | number;
|
|
5
|
+
label: string;
|
|
6
|
+
options?: Option[];
|
|
7
|
+
description?: string;
|
|
8
|
+
tooltip?: string;
|
|
9
|
+
subPackageLimit?: boolean;
|
|
10
|
+
disabled?: boolean;
|
|
11
|
+
}
|
|
12
|
+
interface GroupOption {
|
|
13
|
+
value: string | number;
|
|
14
|
+
label: string;
|
|
15
|
+
options?: Option[];
|
|
16
|
+
}
|
|
17
|
+
interface DataItem {
|
|
18
|
+
id?: string | number;
|
|
19
|
+
value: string | number;
|
|
20
|
+
label: string;
|
|
21
|
+
[key: string]: any;
|
|
22
|
+
}
|
|
23
|
+
type SelectableListProps = {
|
|
24
|
+
dataList: GroupOption[];
|
|
25
|
+
setDataList: (dataList: GroupOption[]) => void;
|
|
26
|
+
selectTreeTitle?: string;
|
|
27
|
+
selectTreePlaceholder?: string;
|
|
28
|
+
needSearchInput?: boolean;
|
|
29
|
+
canSelectAll?: boolean;
|
|
30
|
+
disableCheckAll?: boolean;
|
|
31
|
+
currentValue?: string | number;
|
|
32
|
+
currentOptions: Option[];
|
|
33
|
+
selected: (string | number)[];
|
|
34
|
+
setSelected: (selected: (string | number)[]) => void;
|
|
35
|
+
setValueSelected: (value: string | number | (string | number)[], checked: boolean) => void;
|
|
36
|
+
dataMap?: Record<string | number, DataItem>;
|
|
37
|
+
selectTreeNeedScroll?: boolean;
|
|
38
|
+
maxLabelLength?: number;
|
|
39
|
+
leftContentCols?: number;
|
|
40
|
+
customSelectTreeComponent?: FunctionComponent<any>;
|
|
41
|
+
};
|
|
42
|
+
declare const _default: import("react").NamedExoticComponent<SelectableListProps>;
|
|
43
|
+
export default _default;
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { memo, useEffect, useMemo, useRef, useState } from "react";
|
|
3
|
+
import { Checkbox, Input, Tooltip } from "@arco-design/web-react";
|
|
4
|
+
import { ReactComponent } from "../assets/icons/selected.js";
|
|
5
|
+
import { AuthTip, ColumnContent, StyledDivider, StyledTree, Title } from "./styled.js";
|
|
6
|
+
const hasAll = (origin, target)=>target.every((t)=>origin?.some((o)=>t === o));
|
|
7
|
+
const isPartialSelected = (origin, target)=>!hasAll(origin, target) && target.some((t)=>origin?.some((o)=>t === o));
|
|
8
|
+
const SelectTreeList = ({ dataList, setDataList, selectTreeTitle = '筛选条件', selectTreePlaceholder = '请搜索维度名称', needSearchInput = true, canSelectAll, disableCheckAll, currentOptions, currentValue, selected, setSelected, setValueSelected, selectTreeNeedScroll, maxLabelLength = 15, leftContentCols, customSelectTreeComponent: CustomSelectTreeComponent })=>{
|
|
9
|
+
const [inputValue, setInputValue] = useState('');
|
|
10
|
+
const groupsLast = useMemo(()=>currentOptions?.map((v)=>({
|
|
11
|
+
...v,
|
|
12
|
+
disabled: selectTreeNeedScroll ? !v.options?.length : false
|
|
13
|
+
})) || [], [
|
|
14
|
+
currentOptions,
|
|
15
|
+
selectTreeNeedScroll
|
|
16
|
+
]);
|
|
17
|
+
const contentStyle = useMemo(()=>{
|
|
18
|
+
if (2 === leftContentCols) return {
|
|
19
|
+
borderTopLeftRadius: '0px',
|
|
20
|
+
borderBottomLeftRadius: '0px'
|
|
21
|
+
};
|
|
22
|
+
}, [
|
|
23
|
+
leftContentCols
|
|
24
|
+
]);
|
|
25
|
+
const [treeData, setTreeData] = useState([]);
|
|
26
|
+
useEffect(()=>{
|
|
27
|
+
if (!selectTreeNeedScroll) return;
|
|
28
|
+
setTimeout(()=>{
|
|
29
|
+
setInputValue('');
|
|
30
|
+
}, 10);
|
|
31
|
+
treeRef.current && treeRef.current.scrollIntoView(String(currentValue));
|
|
32
|
+
setTimeout(()=>{
|
|
33
|
+
treeRef.current && treeRef.current.scrollIntoView(String(currentValue));
|
|
34
|
+
}, 100);
|
|
35
|
+
const element = document.getElementById(String(currentValue));
|
|
36
|
+
if (element) element.scrollIntoView({
|
|
37
|
+
behavior: 'smooth',
|
|
38
|
+
block: 'start',
|
|
39
|
+
inline: 'start'
|
|
40
|
+
});
|
|
41
|
+
setTimeout(()=>{
|
|
42
|
+
const element = document.getElementById(String(currentValue));
|
|
43
|
+
if (element) element.scrollIntoView({
|
|
44
|
+
behavior: 'smooth',
|
|
45
|
+
block: 'start',
|
|
46
|
+
inline: 'start'
|
|
47
|
+
});
|
|
48
|
+
}, 100);
|
|
49
|
+
}, [
|
|
50
|
+
currentValue,
|
|
51
|
+
selectTreeNeedScroll
|
|
52
|
+
]);
|
|
53
|
+
const treeRef = useRef(null);
|
|
54
|
+
const groupData = useMemo(()=>{
|
|
55
|
+
if (selectTreeNeedScroll) {
|
|
56
|
+
const treeOptions = [];
|
|
57
|
+
treeData?.forEach((data)=>{
|
|
58
|
+
if (data?.options) treeOptions.push(...data.options);
|
|
59
|
+
});
|
|
60
|
+
return treeOptions?.map((option)=>option.value);
|
|
61
|
+
}
|
|
62
|
+
return treeData?.map((option)=>option.value) || [];
|
|
63
|
+
}, [
|
|
64
|
+
treeData,
|
|
65
|
+
selectTreeNeedScroll
|
|
66
|
+
]);
|
|
67
|
+
function searchData(inputValue) {
|
|
68
|
+
const loop = (data)=>{
|
|
69
|
+
const result = [];
|
|
70
|
+
data.forEach((item)=>{
|
|
71
|
+
if (item.title.toLowerCase().indexOf(inputValue.toLowerCase()) > -1) result.push({
|
|
72
|
+
...item
|
|
73
|
+
});
|
|
74
|
+
else if (item.options) {
|
|
75
|
+
const filterData = loop(item.options);
|
|
76
|
+
if (filterData.length) result.push({
|
|
77
|
+
...item,
|
|
78
|
+
options: filterData
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
return result;
|
|
83
|
+
};
|
|
84
|
+
return loop(groupsLast);
|
|
85
|
+
}
|
|
86
|
+
useEffect(()=>{
|
|
87
|
+
if (inputValue) {
|
|
88
|
+
const result = searchData(inputValue);
|
|
89
|
+
setTreeData([
|
|
90
|
+
...result
|
|
91
|
+
]);
|
|
92
|
+
} else setTreeData(groupsLast);
|
|
93
|
+
}, [
|
|
94
|
+
inputValue,
|
|
95
|
+
groupsLast
|
|
96
|
+
]);
|
|
97
|
+
const handleChange = (current)=>{
|
|
98
|
+
const value = current?.id;
|
|
99
|
+
const copyDataList = [
|
|
100
|
+
...dataList
|
|
101
|
+
];
|
|
102
|
+
const currentData = copyDataList.find((item)=>item.value === currentValue);
|
|
103
|
+
if (current && currentData && Array.isArray(currentData?.options)) {
|
|
104
|
+
if (selected?.includes(value)) {
|
|
105
|
+
const currentIndex = currentData.options.findIndex((item)=>item.id === value);
|
|
106
|
+
if (-1 !== currentIndex) currentData.options[currentIndex] = current;
|
|
107
|
+
} else {
|
|
108
|
+
currentData.options.push(current);
|
|
109
|
+
setValueSelected(value, true);
|
|
110
|
+
}
|
|
111
|
+
setDataList(copyDataList);
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
const handleDeleteItem = (value)=>{
|
|
115
|
+
setValueSelected(value, false);
|
|
116
|
+
};
|
|
117
|
+
return /*#__PURE__*/ jsxs(ColumnContent, {
|
|
118
|
+
style: {
|
|
119
|
+
flex: 1,
|
|
120
|
+
...contentStyle
|
|
121
|
+
},
|
|
122
|
+
children: [
|
|
123
|
+
/*#__PURE__*/ jsxs(Title, {
|
|
124
|
+
children: [
|
|
125
|
+
/*#__PURE__*/ jsx(ReactComponent, {
|
|
126
|
+
className: "selected-icon"
|
|
127
|
+
}),
|
|
128
|
+
/*#__PURE__*/ jsx("span", {
|
|
129
|
+
children: selectTreeTitle
|
|
130
|
+
})
|
|
131
|
+
]
|
|
132
|
+
}),
|
|
133
|
+
/*#__PURE__*/ jsx(StyledDivider, {
|
|
134
|
+
style: {
|
|
135
|
+
marginBottom: '12px'
|
|
136
|
+
}
|
|
137
|
+
}),
|
|
138
|
+
'resultFilter' === currentValue && CustomSelectTreeComponent ? /*#__PURE__*/ jsx(CustomSelectTreeComponent, {
|
|
139
|
+
currentOptions: groupsLast,
|
|
140
|
+
handleChange: handleChange,
|
|
141
|
+
handleDeleteItem: handleDeleteItem
|
|
142
|
+
}) : /*#__PURE__*/ jsxs(Fragment, {
|
|
143
|
+
children: [
|
|
144
|
+
needSearchInput && /*#__PURE__*/ jsx(Input.Search, {
|
|
145
|
+
style: {
|
|
146
|
+
width: 'auto',
|
|
147
|
+
padding: '0 16px 12px'
|
|
148
|
+
},
|
|
149
|
+
value: inputValue,
|
|
150
|
+
onChange: setInputValue,
|
|
151
|
+
placeholder: selectTreePlaceholder
|
|
152
|
+
}),
|
|
153
|
+
treeData?.length > 0 && canSelectAll && /*#__PURE__*/ jsx(Checkbox, {
|
|
154
|
+
style: {
|
|
155
|
+
margin: '0 0 6px 11px',
|
|
156
|
+
fontWeight: 600
|
|
157
|
+
},
|
|
158
|
+
disabled: disableCheckAll,
|
|
159
|
+
onChange: (checked)=>{
|
|
160
|
+
setValueSelected(groupData, checked);
|
|
161
|
+
},
|
|
162
|
+
checked: hasAll(selected, groupData),
|
|
163
|
+
indeterminate: isPartialSelected(selected, groupData),
|
|
164
|
+
children: "全选"
|
|
165
|
+
}),
|
|
166
|
+
treeData?.length > 0 && /*#__PURE__*/ jsx(StyledTree, {
|
|
167
|
+
ref: treeRef,
|
|
168
|
+
checkable: true,
|
|
169
|
+
treeData: treeData,
|
|
170
|
+
autoExpandParent: true,
|
|
171
|
+
virtualListProps: {
|
|
172
|
+
height: '100%'
|
|
173
|
+
},
|
|
174
|
+
style: {
|
|
175
|
+
height: '100%',
|
|
176
|
+
flex: 1,
|
|
177
|
+
overflow: 'auto'
|
|
178
|
+
},
|
|
179
|
+
multiple: true,
|
|
180
|
+
blockNode: true,
|
|
181
|
+
checkedKeys: selected,
|
|
182
|
+
defaultCheckedKeys: selected,
|
|
183
|
+
icons: {
|
|
184
|
+
switcherIcon: null,
|
|
185
|
+
dragIcon: null
|
|
186
|
+
},
|
|
187
|
+
fieldNames: {
|
|
188
|
+
key: 'value',
|
|
189
|
+
title: 'label',
|
|
190
|
+
children: 'options'
|
|
191
|
+
},
|
|
192
|
+
onCheck: setSelected,
|
|
193
|
+
actionOnClick: "check",
|
|
194
|
+
checkedStrategy: "child",
|
|
195
|
+
renderTitle: (items)=>{
|
|
196
|
+
const { title, value, description, tooltip, subPackageLimit } = items;
|
|
197
|
+
if (inputValue && title) {
|
|
198
|
+
const index = title.toLowerCase().indexOf(inputValue.toLowerCase());
|
|
199
|
+
if (-1 === index) return /*#__PURE__*/ jsx(Tooltip, {
|
|
200
|
+
content: description,
|
|
201
|
+
children: /*#__PURE__*/ jsx("span", {
|
|
202
|
+
children: title
|
|
203
|
+
}, value)
|
|
204
|
+
});
|
|
205
|
+
const formatTitle = title?.length > maxLabelLength ? title.substr(0, maxLabelLength) + '...' : title;
|
|
206
|
+
const prefix = formatTitle.substr(0, index);
|
|
207
|
+
const suffix = formatTitle.substr(index + inputValue.length);
|
|
208
|
+
return /*#__PURE__*/ jsx(Tooltip, {
|
|
209
|
+
content: description || tooltip || title,
|
|
210
|
+
children: /*#__PURE__*/ jsxs("span", {
|
|
211
|
+
children: [
|
|
212
|
+
prefix,
|
|
213
|
+
/*#__PURE__*/ jsx("span", {
|
|
214
|
+
style: {
|
|
215
|
+
color: '#6549f2',
|
|
216
|
+
fontWeight: 400
|
|
217
|
+
},
|
|
218
|
+
children: formatTitle.substr(index, inputValue.length)
|
|
219
|
+
}),
|
|
220
|
+
suffix,
|
|
221
|
+
subPackageLimit && /*#__PURE__*/ jsx(AuthTip, {
|
|
222
|
+
children: "二级包名相关"
|
|
223
|
+
})
|
|
224
|
+
]
|
|
225
|
+
}, value)
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
return /*#__PURE__*/ jsx(Tooltip, {
|
|
229
|
+
content: description || tooltip || title,
|
|
230
|
+
children: /*#__PURE__*/ jsxs("span", {
|
|
231
|
+
id: value,
|
|
232
|
+
children: [
|
|
233
|
+
title?.length > maxLabelLength ? title.substr(0, maxLabelLength) + '...' : title,
|
|
234
|
+
subPackageLimit && /*#__PURE__*/ jsx(AuthTip, {
|
|
235
|
+
children: "二级包名相关"
|
|
236
|
+
})
|
|
237
|
+
]
|
|
238
|
+
}, value)
|
|
239
|
+
});
|
|
240
|
+
}
|
|
241
|
+
}, "value")
|
|
242
|
+
]
|
|
243
|
+
})
|
|
244
|
+
]
|
|
245
|
+
});
|
|
246
|
+
};
|
|
247
|
+
const CustomTransfer_SelectTreeList = /*#__PURE__*/ memo(SelectTreeList);
|
|
248
|
+
export { CustomTransfer_SelectTreeList as default };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
type DivAttributes = React.HTMLAttributes<HTMLDivElement>;
|
|
2
|
+
export declare const SortableDivContainer: import("react").ComponentClass<DivAttributes & import("react-sortable-hoc").SortableContainerProps, any>;
|
|
3
|
+
export declare const SortableDivItem: import("react").ComponentClass<DivAttributes & import("react-sortable-hoc").SortableElementProps, any>;
|
|
4
|
+
export declare const DivDragHandle: import("react").ComponentClass<unknown, any>;
|
|
5
|
+
declare const SelectedItemList: ({ selectedWidth, selectedTitle, limit, needActionBtn, reset, clear, deleteItem, dataMap, selected, setSelected, isNotDrag, needSelectedNum, needSelectedBacground, maxLabelLength, }: {
|
|
6
|
+
selectedWidth?: number | string;
|
|
7
|
+
selectedTitle?: string;
|
|
8
|
+
limit?: number;
|
|
9
|
+
needActionBtn?: boolean;
|
|
10
|
+
reset?: () => void;
|
|
11
|
+
clear?: () => void;
|
|
12
|
+
deleteItem?: (value: any) => void;
|
|
13
|
+
dataMap: Record<string, any>;
|
|
14
|
+
selected: any[];
|
|
15
|
+
setSelected: (selected: any) => void;
|
|
16
|
+
isNotDrag?: boolean;
|
|
17
|
+
needSelectedNum?: boolean;
|
|
18
|
+
needSelectedBacground?: boolean;
|
|
19
|
+
maxLabelLength?: number;
|
|
20
|
+
}) => import("react/jsx-runtime").JSX.Element;
|
|
21
|
+
export default SelectedItemList;
|