@hzab/group-user-selector 0.0.1 → 0.0.2

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hzab/group-user-selector",
3
- "version": "0.0.1",
3
+ "version": "0.0.2",
4
4
  "description": "",
5
5
  "main": "src",
6
6
  "scripts": {
@@ -0,0 +1,46 @@
1
+ import { forwardRef } from "react";
2
+ import { Checkbox } from "antd";
3
+
4
+ import defaultAvatar from "../../assets/imgs/defaultAvatar.png";
5
+ import department from "../../assets/imgs/department.png";
6
+
7
+ import "./index.less";
8
+
9
+ function ItemRenter(props, ref) {
10
+ const {
11
+ labelKey = "label",
12
+ valueKey = "value",
13
+ isUserKey = "isUser",
14
+ imgKey = "img",
15
+ isCheck = false,
16
+ item,
17
+ handleClickItem,
18
+ handleCheckItem
19
+ } = props;
20
+
21
+
22
+ return (
23
+ <>
24
+ <div className="group-selection-list-item" key={item[valueKey]}>
25
+ <div className="avatar" onClick={() => handleCheckItem(item)}>
26
+ <Checkbox checked={isCheck} />
27
+ <img src={item[imgKey] ? item[imgKey] : item[isUserKey] ? defaultAvatar : department} />
28
+ <div className="label">{item[labelKey]}</div>
29
+ </div>
30
+ {item[isUserKey] ? null : <div
31
+ className={`next ${isCheck ? "noNext" : ""}`}
32
+ onClick={() => {
33
+ if (isCheck) {
34
+ return;
35
+ }
36
+ handleClickItem(item);
37
+ }}
38
+ >
39
+ 下级
40
+ </div>}
41
+ </div>
42
+ </>
43
+ );
44
+ }
45
+
46
+ export default forwardRef(ItemRenter);
@@ -0,0 +1,33 @@
1
+ .group-selection-list-item {
2
+ display: flex;
3
+ align-items: center;
4
+ justify-content: space-between;
5
+ margin-bottom: 24px;
6
+
7
+ .avatar {
8
+ display: flex;
9
+ align-items: center;
10
+ cursor: pointer;
11
+
12
+ img {
13
+ width: 32px;
14
+ height: auto;
15
+ margin: 0 12px;
16
+ }
17
+
18
+ .label {
19
+ font-size: 16px;
20
+ color: #141414;
21
+ }
22
+ }
23
+
24
+ .next {
25
+ color: rgb(64, 62, 245);
26
+ cursor: pointer;
27
+ flex-shrink: 0;
28
+ }
29
+
30
+ .noNext {
31
+ opacity: 0.5;
32
+ }
33
+ }
@@ -0,0 +1,87 @@
1
+ import { useEffect, useState, forwardRef } from "react";
2
+ import { Input,message, Pagination, } from "antd";
3
+
4
+ import "./index.less";
5
+
6
+ function SearchRenter(props, ref) {
7
+ const {
8
+ searchModel,
9
+ searchQueryKey = "search",
10
+ hasPagination = true,
11
+ hasSearch = true,
12
+ ItemRenter,
13
+ setLoading = () => { },
14
+ } = props;
15
+
16
+ const [search, setSearch] = useState("");
17
+ const [searchList, setSearchList] = useState([]);
18
+ const [total, setTotal] = useState(0);
19
+ const [pageData, setPageData] = useState(hasPagination ? {
20
+ pageSize: 10,
21
+ pageNum: 1
22
+ } : {});
23
+
24
+
25
+
26
+ const handleSearch = (data) => {
27
+ setLoading && setLoading(true);
28
+ searchModel &&
29
+ searchModel.getList({ ...data }).then((res) => {
30
+ console.log(res, 2222222);
31
+
32
+ setSearchList(res?.list || res || []);
33
+ setTotal(res?.pagination?.total||res?.total);
34
+ }).catch((err) => {
35
+ message.error(err._message || "未知错误");
36
+ })
37
+ .finally(() => {
38
+ setLoading && setLoading(false);
39
+ });
40
+ }
41
+
42
+ const handleChangePage = (pageNum, pageSize) => {
43
+ const pages = {
44
+ pageNum: pageSize !== pageData?.pageSize ? 1 : pageNum,
45
+ pageSize
46
+ }
47
+ setPageData({
48
+ ...pages
49
+ })
50
+ handleSearch({
51
+ [searchQueryKey]: search,
52
+ ...pages
53
+ })
54
+ }
55
+
56
+ const onSearch = (value) => {
57
+
58
+ setSearch(value);
59
+ if (!value) return;
60
+ handleSearch({
61
+ [searchQueryKey]: value,
62
+ ...pageData
63
+ })
64
+ };
65
+
66
+
67
+ return (
68
+ <>
69
+ {hasSearch ? <Input.Search onSearch={onSearch} enterButton placeholder="搜索成员" allowClear /> : null}
70
+ {search ? (
71
+ <div className="group-selection-search-view">
72
+ <div className="group-selection-search-list">
73
+ {searchList.map((item, index) => {
74
+ return ItemRenter(item);
75
+ })}
76
+ </div>
77
+
78
+ {hasPagination ? <div className="group-selection-search-pagination">
79
+ <Pagination current={pageData?.pageNum} total={total} pageSize={pageData?.pageSize} onChange={handleChangePage} size="small" />
80
+ </div> : null}
81
+ </div>
82
+ ) : null}
83
+ </>
84
+ );
85
+ }
86
+
87
+ export default forwardRef(SearchRenter);
@@ -0,0 +1,36 @@
1
+ .group-selection-search-view {
2
+ display: flex;
3
+ flex-direction: column;
4
+ box-sizing: border-box;
5
+ position: absolute;
6
+ top: 56px;
7
+ left: 24px;
8
+ width: calc(100% - 48px);
9
+ height: calc(100% - 80px);
10
+ overflow-y: hidden;
11
+ z-index: 10;
12
+ background-color: #fff;
13
+
14
+ .group-selection-search-list {
15
+ box-sizing: border-box;
16
+ flex: 1;
17
+ overflow-y: auto;
18
+ padding: 24px ;
19
+
20
+ &::-webkit-scrollbar {
21
+ display: none;
22
+ }
23
+ }
24
+
25
+ .group-selection-search-pagination {
26
+ position: absolute;
27
+ left: 0;
28
+ bottom: 0;
29
+ width: 100%;
30
+ height: 40px;
31
+ display: flex;
32
+ align-items: center;
33
+ justify-content: center;
34
+ background-color: #fff;
35
+ }
36
+ }
@@ -29,45 +29,48 @@
29
29
  padding: 24px;
30
30
  border-right: 1px solid #e8e8e8;
31
31
 
32
- .group-selection-search-view {
33
- display: flex;
34
- flex-direction: column;
35
- box-sizing: border-box;
36
- position: absolute;
37
- top: 56px;
38
- left: 24px;
39
- width: calc(100% - 48px);
40
- height: calc(100% - 80px);
41
- overflow-y: hidden;
42
- z-index: 10;
43
- background-color: #fff;
44
-
45
- .group-selection-search-list {
46
- box-sizing: border-box;
47
- flex: 1;
48
- overflow-y: auto;
49
- padding: 24px ;
50
-
51
- &::-webkit-scrollbar {
52
- display: none;
53
- }
54
- }
55
-
56
- .group-selection-search-pagination {
57
- position: absolute;
58
- left: 0;
59
- bottom: 0;
60
- width: 100%;
61
- height: 40px;
62
- display: flex;
63
- align-items: center;
64
- justify-content: center;
65
- background-color: #fff;
66
- }
67
- }
32
+ // .group-selection-search-view {
33
+ // display: flex;
34
+ // flex-direction: column;
35
+ // box-sizing: border-box;
36
+ // position: absolute;
37
+ // top: 56px;
38
+ // left: 24px;
39
+ // width: calc(100% - 48px);
40
+ // height: calc(100% - 80px);
41
+ // overflow-y: hidden;
42
+ // z-index: 10;
43
+ // background-color: #fff;
44
+
45
+ // .group-selection-search-list {
46
+ // box-sizing: border-box;
47
+ // flex: 1;
48
+ // overflow-y: auto;
49
+ // padding: 24px ;
50
+
51
+ // &::-webkit-scrollbar {
52
+ // display: none;
53
+ // }
54
+ // }
55
+
56
+ // .group-selection-search-pagination {
57
+ // position: absolute;
58
+ // left: 0;
59
+ // bottom: 0;
60
+ // width: 100%;
61
+ // height: 40px;
62
+ // display: flex;
63
+ // align-items: center;
64
+ // justify-content: center;
65
+ // background-color: #fff;
66
+ // }
67
+ // }
68
68
 
69
69
  .group-selection-breadcrumb {
70
70
  margin-top: 12px;
71
+ .group-selection-breadcrumb-item {
72
+ cursor: pointer;
73
+ }
71
74
  }
72
75
 
73
76
  .group-selection-list-check {
@@ -83,39 +86,39 @@
83
86
  }
84
87
  }
85
88
 
86
- .group-selection-list-item {
87
- display: flex;
88
- align-items: center;
89
- justify-content: space-between;
90
- margin-bottom: 24px;
91
-
92
- .avatar {
93
- display: flex;
94
- align-items: center;
95
- cursor: pointer;
96
-
97
- img {
98
- width: 32px;
99
- height: auto;
100
- margin: 0 12px;
101
- }
102
-
103
- .label {
104
- font-size: 16px;
105
- color: #141414;
106
- }
107
- }
108
-
109
- .next {
110
- color: rgb(64, 62, 245);
111
- cursor: pointer;
112
- flex-shrink: 0;
113
- }
114
-
115
- .noNext {
116
- opacity: 0.5;
117
- }
118
- }
89
+ // .group-selection-list-item {
90
+ // display: flex;
91
+ // align-items: center;
92
+ // justify-content: space-between;
93
+ // margin-bottom: 24px;
94
+
95
+ // .avatar {
96
+ // display: flex;
97
+ // align-items: center;
98
+ // cursor: pointer;
99
+
100
+ // img {
101
+ // width: 32px;
102
+ // height: auto;
103
+ // margin: 0 12px;
104
+ // }
105
+
106
+ // .label {
107
+ // font-size: 16px;
108
+ // color: #141414;
109
+ // }
110
+ // }
111
+
112
+ // .next {
113
+ // color: rgb(64, 62, 245);
114
+ // cursor: pointer;
115
+ // flex-shrink: 0;
116
+ // }
117
+
118
+ // .noNext {
119
+ // opacity: 0.5;
120
+ // }
121
+ // }
119
122
  }
120
123
 
121
124
  .group-selection-detail {
package/src/index.tsx CHANGED
@@ -1,5 +1,181 @@
1
- function Test() {
2
- return <div>Test</div>;
1
+ import { useEffect, useState, useImperativeHandle, forwardRef } from "react";
2
+ import { Input, Breadcrumb, Checkbox, message, Spin, Pagination, ConfigProvider } from "antd";
3
+ import zhCN from 'antd/es/locale/zh_CN';
4
+ import { CloseCircleFilled, SearchOutlined } from "@ant-design/icons";
5
+ import 'moment/locale/zh-cn';
6
+ import _ from "lodash";
7
+
8
+ import defaultAvatar from "./assets/imgs/defaultAvatar.png";
9
+ import department from "./assets/imgs/department.png";
10
+ import SearchRenter from './components/SearchRenter'
11
+ import ItemRenter from './components/ItemRenter'
12
+
13
+ import "./index.less";
14
+
15
+ function GroupSelection(props, ref) {
16
+ const {
17
+ model,
18
+ queryKey = "parentId",
19
+ value = [],
20
+ labelKey = "label",
21
+ valueKey = "value",
22
+ isUserKey = "isUser",
23
+ imgKey = "img",
24
+ } = props;
25
+ const [breadcrumb, setBreadcrumb] = useState([
26
+ {
27
+ [labelKey]: "首页",
28
+ [valueKey]: undefined,
29
+ },
30
+ ]);
31
+ const [loading, setLoading] = useState(false);
32
+ const [checkAll, setCheckAll] = useState(false);
33
+ const [selectList, setSelectList] = useState([]);
34
+ const [selectedList, setSelectedList] = useState([...value]);
35
+
36
+ // 通过useImperativeHandle定义要抛出的值或方法
37
+ useImperativeHandle(ref, () => ({
38
+ selectedList,
39
+ }));
40
+
41
+ useEffect(() => {
42
+ const selectedValues = new Set(selectedList.map((item) => item[valueKey]));
43
+ const isAllSelected = selectList.every((item) => selectedValues.has(item[valueKey]));
44
+ setCheckAll(isAllSelected);
45
+ }, [selectList, selectedList]);
46
+
47
+ const getTreeData = (value?: string | number) => {
48
+ setLoading(true);
49
+ model &&
50
+ model.getList({ [queryKey]: value }).then((res) => {
51
+ setSelectList(res?.list || res || []);
52
+ })
53
+ .catch((err) => {
54
+ message.error(err._message || "未知错误");
55
+ })
56
+ .finally(() => {
57
+ setLoading(false);
58
+ });
59
+ };
60
+
61
+
62
+ useEffect(() => {
63
+ getTreeData();
64
+ }, []);
65
+
66
+
67
+
68
+
69
+
70
+ const handleBreadcrumb = (e) => {
71
+ const index = breadcrumb.findIndex((item) => item[valueKey] === e[valueKey]);
72
+ const arr = [...breadcrumb];
73
+ arr.splice(index + 1);
74
+ setBreadcrumb(arr);
75
+ getTreeData(e[valueKey]);
76
+ };
77
+
78
+ const handleClickItem = (item) => {
79
+ const arr = [...breadcrumb];
80
+ arr.push(item);
81
+ setBreadcrumb(arr);
82
+
83
+ getTreeData(item[valueKey]);
84
+ };
85
+
86
+ const handleCheckDelete = (item) => {
87
+ setSelectedList(selectedList.filter((i) => i[valueKey] !== item[valueKey]));
88
+ };
89
+
90
+ const handleCheckItem = (item) => {
91
+ const is = selectedList.some((i) => i[valueKey] === item[valueKey]);
92
+ if (is) {
93
+ handleCheckDelete(item);
94
+ } else {
95
+ setSelectedList([...selectedList, item]);
96
+ }
97
+ };
98
+
99
+ const handleCheckAll = (e) => {
100
+ const isChecked = e.target.checked;
101
+ if (isChecked) {
102
+ // 全选:合并 selectList 并去重
103
+ setSelectedList((prev) => {
104
+ const selectedValues = new Set(prev.map((item) => item[valueKey])); // 已选值的 Set
105
+ const newItems = selectList.filter((item) => !selectedValues.has(item[valueKey]));
106
+ return [...prev, ...newItems]; // 合并新项
107
+ });
108
+ } else {
109
+ // 取消全选:仅移除 selectList 中的项
110
+ setSelectedList((prev) => {
111
+ const selectValues = new Set(selectList.map((item) => item[valueKey])); // 需移除值的 Set
112
+ return prev.filter((item) => !selectValues.has(item[valueKey])); // 过滤保留其他项
113
+ });
114
+ }
115
+ };
116
+
117
+ const handleCheck = (item) => {
118
+ const is = selectedList.some((i) => i[valueKey] === item[valueKey]);
119
+ return is;
120
+ };
121
+
122
+ const Renter = (item) => {
123
+ const isCheck = handleCheck(item);
124
+ return (
125
+ <ItemRenter
126
+ {...props}
127
+ item={item}
128
+ isCheck={isCheck}
129
+ handleCheckItem={handleCheckItem}
130
+ handleCheckDelete={handleCheckDelete}
131
+ handleClickItem={handleClickItem}
132
+ />
133
+ );
134
+ };
135
+
136
+ return (
137
+ <ConfigProvider locale={zhCN}>
138
+
139
+ <div className="group-selection">
140
+ {loading ? <div className="group-selection-loading">
141
+ <Spin tip="Loading..." spinning={loading} />
142
+ </div> : null}
143
+ <div className="group-selection-list">
144
+ <SearchRenter {...props} setLoading={setLoading} ItemRenter={Renter} />
145
+ <Breadcrumb className="group-selection-breadcrumb">
146
+ {breadcrumb.map((item) => {
147
+ return (
148
+ <Breadcrumb.Item className="group-selection-breadcrumb-item" onClick={() => handleBreadcrumb(item)} key={item[valueKey]}>
149
+ {item[labelKey]}
150
+ </Breadcrumb.Item>
151
+ );
152
+ })}
153
+ </Breadcrumb>
154
+ <div className="group-selection-list-check">
155
+ <Checkbox onChange={handleCheckAll} checked={checkAll && !!selectList.length} /> 全选
156
+ </div>
157
+ <div className="group-selection-list-view">
158
+ {selectList.map((item, index) => {
159
+ return Renter(item);
160
+ })}
161
+ </div>
162
+ </div>
163
+ <div className="group-selection-detail">
164
+ <div className="group-selection-detail-list">
165
+ {selectedList.map((item, index) => {
166
+ return (
167
+ <div className="group-selection-detail-item" key={item[valueKey]}>
168
+ <img src={item[imgKey] ? item[imgKey] : item[isUserKey] ? defaultAvatar : department} />
169
+ <div className="label">{item[labelKey]}</div>
170
+ <CloseCircleFilled style={{ cursor: "pointer" }} onClick={() => handleCheckDelete(item)} />
171
+ </div>
172
+ );
173
+ })}
174
+ </div>
175
+ </div>
176
+ </div>
177
+ </ConfigProvider>
178
+ );
3
179
  }
4
180
 
5
- export default Test;
181
+ export default forwardRef(GroupSelection);
@@ -1,250 +0,0 @@
1
- import { useEffect, useState, useImperativeHandle, forwardRef } from "react";
2
- import { Input, Breadcrumb, Checkbox, message, Spin, Pagination, ConfigProvider } from "antd";
3
- import zhCN from 'antd/es/locale/zh_CN';
4
- import { CloseCircleFilled, SearchOutlined } from "@ant-design/icons";
5
- import 'moment/locale/zh-cn';
6
- import _ from "lodash";
7
- import defaultAvatar from "../assets/imgs/defaultAvatar.png";
8
- import department from "../assets/imgs/department.png";
9
-
10
- import "./index.less";
11
-
12
- function GroupSelection(props, ref) {
13
- const {
14
- model,
15
- searchModel,
16
- queryKey = "parentId",
17
- searchQueryKey = "search",
18
- value = [],
19
- labelKey = "label",
20
- valueKey = "value",
21
- isUserKey = "isUser",
22
- imgKey = "img",
23
- hasPagination = true,
24
- hasSearch = true
25
- } = props;
26
- const [breadcrumb, setBreadcrumb] = useState([
27
- {
28
- [labelKey]: "首页",
29
- [valueKey]: undefined,
30
- },
31
- ]);
32
- const [loading, setLoading] = useState(false);
33
- const [checkAll, setCheckAll] = useState(false);
34
- const [selectList, setSelectList] = useState([]);
35
- const [selectedList, setSelectedList] = useState([...value]);
36
- const [search, setSearch] = useState("");
37
- const [searchList, setSearchList] = useState([]);
38
- const [total, setTotal] = useState(0);
39
- const [pageData, setPageData] = useState(hasPagination ? {
40
- pageSize: 10,
41
- pageNum: 1
42
- } : {});
43
-
44
- // 通过useImperativeHandle定义要抛出的值或方法
45
- useImperativeHandle(ref, () => ({
46
- selectedList,
47
- }));
48
-
49
- useEffect(() => {
50
- const selectedValues = new Set(selectedList.map((item) => item[valueKey]));
51
- const isAllSelected = selectList.every((item) => selectedValues.has(item[valueKey]));
52
- setCheckAll(isAllSelected);
53
- }, [selectList, selectedList]);
54
-
55
- const getTreeData = (value) => {
56
- setLoading(true);
57
- model &&
58
- model.get({ [queryKey]: value }).then((res) => {
59
- setSelectList(res);
60
- })
61
- .catch((err) => {
62
- message.error(err._message || "未知错误");
63
- })
64
- .finally(() => {
65
- setLoading(false);
66
- });
67
- };
68
-
69
-
70
- useEffect(() => {
71
- getTreeData();
72
- }, []);
73
-
74
-
75
- const handleSearch = (data) => {
76
- setLoading(true);
77
- searchModel &&
78
- searchModel.get({ ...data }).then((res) => {
79
- const list = res?.list || [];
80
- setSearchList(list);
81
- setTotal(res?.total);
82
- }).catch((err) => {
83
- message.error(err._message || "未知错误");
84
- })
85
- .finally(() => {
86
- setLoading(false);
87
- });
88
- }
89
-
90
- const handleChangePage = (pageNum, pageSize) => {
91
- const pages = {
92
- pageNum: pageSize !== pageData?.pageSize ? 1 : pageNum,
93
- pageSize
94
- }
95
- setPageData({
96
- ...pages
97
- })
98
- handleSearch({
99
- [searchQueryKey]: search,
100
- ...pages
101
- })
102
- }
103
-
104
- const onSearch = (value) => {
105
-
106
- setSearch(value);
107
- if (!value) return;
108
- handleSearch({
109
- [searchQueryKey]: value,
110
- ...pageData
111
- })
112
- };
113
-
114
- const handleBreadcrumb = (e) => {
115
- const index = breadcrumb.findIndex((item) => item[valueKey] === e[valueKey]);
116
- const arr = [...breadcrumb];
117
- arr.splice(index + 1);
118
- setBreadcrumb(arr);
119
- getTreeData(e[valueKey]);
120
- };
121
-
122
- const handleClickItem = (item) => {
123
- const arr = [...breadcrumb];
124
- arr.push(item);
125
- setBreadcrumb(arr);
126
-
127
- getTreeData(item[valueKey]);
128
- };
129
-
130
- const handleCheckDelete = (item) => {
131
- setSelectedList(selectedList.filter((i) => i[valueKey] !== item[valueKey]));
132
- };
133
-
134
- const handleCheckItem = (item) => {
135
- const is = selectedList.some((i) => i[valueKey] === item[valueKey]);
136
- if (is) {
137
- handleCheckDelete(item);
138
- } else {
139
- setSelectedList([...selectedList, item]);
140
- }
141
- };
142
-
143
- const handleCheckAll = (e) => {
144
- const isChecked = e.target.checked;
145
- if (isChecked) {
146
- // 全选:合并 selectList 并去重(基于 value)
147
- setSelectedList((prev) => {
148
- const selectedValues = new Set(prev.map((item) => item[valueKey])); // 已选值的 Set
149
- const newItems = selectList.filter((item) => !selectedValues.has(item[valueKey]));
150
- return [...prev, ...newItems]; // 合并新项
151
- });
152
- } else {
153
- // 取消全选:仅移除 selectList 中的项(基于 value)
154
- setSelectedList((prev) => {
155
- const selectValues = new Set(selectList.map((item) => item[valueKey])); // 需移除值的 Set
156
- return prev.filter((item) => !selectValues.has(item[valueKey])); // 过滤保留其他项
157
- });
158
- }
159
- };
160
-
161
- const handleCheck = (item) => {
162
- const is = selectedList.some((i) => i[valueKey] === item[valueKey]);
163
- return is;
164
- };
165
-
166
- const ItemRenter = (item) => {
167
- const isCheck = handleCheck(item);
168
- return (
169
- <div className="group-selection-list-item" key={item[valueKey]}>
170
- <div className="avatar" onClick={() => handleCheckItem(item)}>
171
- <Checkbox checked={isCheck} />
172
- <img src={item[imgKey] ? item[imgKey] : item[isUserKey] ? defaultAvatar : department} />
173
- <div className="label">{item[labelKey]}</div>
174
- </div>
175
- {item[isUserKey] ? null : <div
176
- className={`next ${isCheck ? "noNext" : ""}`}
177
- onClick={() => {
178
- if (isCheck) {
179
- return;
180
- }
181
- handleClickItem(item);
182
- }}
183
- >
184
- 下级
185
- </div>}
186
- </div>
187
- );
188
- };
189
-
190
- return (
191
- <ConfigProvider locale={zhCN}>
192
-
193
- <div className="group-selection">
194
- {loading ? <div className="group-selection-loading">
195
- <Spin tip="Loading..." spinning={loading} />
196
- </div> : null}
197
- <div className="group-selection-list">
198
- {hasSearch ? <Input.Search onSearch={onSearch} enterButton placeholder="搜索成员" allowClear /> : null}
199
-
200
- {/* <Input addonBefore={<SearchOutlined />} allowClear placeholder="搜索成员" onChange={onSearch} /> */}
201
- {search ? (
202
- <div className="group-selection-search-view">
203
- <div className="group-selection-search-list">
204
- {searchList.map((item, index) => {
205
- return ItemRenter(item);
206
- })}
207
- </div>
208
-
209
- {hasPagination ? <div className="group-selection-search-pagination">
210
- <Pagination current={pageData?.pageNum} total={total} pageSize={pageData?.pageSize} onChange={handleChangePage} size="small" />
211
- </div> : null}
212
- </div>
213
- ) : null}
214
- <Breadcrumb className="group-selection-breadcrumb">
215
- {breadcrumb.map((item) => {
216
- return (
217
- <Breadcrumb.Item style={{ cursor: "pointer" }} onClick={() => handleBreadcrumb(item)} key={item[valueKey]}>
218
- {item[labelKey]}
219
- </Breadcrumb.Item>
220
- );
221
- })}
222
- </Breadcrumb>
223
- <div className="group-selection-list-check">
224
- <Checkbox onChange={handleCheckAll} checked={checkAll && selectList.length} /> 全选
225
- </div>
226
- <div className="group-selection-list-view">
227
- {selectList.map((item, index) => {
228
- return ItemRenter(item);
229
- })}
230
- </div>
231
- </div>
232
- <div className="group-selection-detail">
233
- <div className="group-selection-detail-list">
234
- {selectedList.map((item, index) => {
235
- return (
236
- <div className="group-selection-detail-item" key={item[valueKey]}>
237
- <img src={item[imgKey] ? item[imgKey] : item[isUserKey] ? defaultAvatar : department} />
238
- <div className="label">{item[labelKey]}</div>
239
- <CloseCircleFilled style={{ cursor: "pointer" }} onClick={() => handleCheckDelete(item)} />
240
- </div>
241
- );
242
- })}
243
- </div>
244
- </div>
245
- </div>
246
- </ConfigProvider>
247
- );
248
- }
249
-
250
- export default forwardRef(GroupSelection);