@qmlight/web-platform-components 1.0.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 (52) hide show
  1. package/AsyncExe/index.tsx +9 -0
  2. package/AsyncExe/src/index.tsx +118 -0
  3. package/AsyncExe/src/lang/en.tsx +11 -0
  4. package/AsyncExe/src/lang/index.tsx +21 -0
  5. package/AsyncExe/src/lang/zh-cn.tsx +11 -0
  6. package/Demo/index.module.less +11 -0
  7. package/Demo/index.tsx +32 -0
  8. package/LICENSE +21 -0
  9. package/README.md +9 -0
  10. package/SearchAssistanceSelect/index.tsx +3 -0
  11. package/SearchAssistanceSelect/src/SearchAssistanceComponent/AdvancedSearch/api/index.js +6 -0
  12. package/SearchAssistanceSelect/src/SearchAssistanceComponent/AdvancedSearch/api/server.js +14 -0
  13. package/SearchAssistanceSelect/src/SearchAssistanceComponent/AdvancedSearch/index.less +23 -0
  14. package/SearchAssistanceSelect/src/SearchAssistanceComponent/AdvancedSearch/index.tsx +115 -0
  15. package/SearchAssistanceSelect/src/SearchAssistanceComponent/AdvancedSearch/popover.tsx +42 -0
  16. package/SearchAssistanceSelect/src/SearchAssistanceComponent/AdvancedSearch/searchboard.tsx +359 -0
  17. package/SearchAssistanceSelect/src/SearchAssistanceComponent/api/server.js +15 -0
  18. package/SearchAssistanceSelect/src/SearchAssistanceComponent/api/tabList/index.js +55 -0
  19. package/SearchAssistanceSelect/src/SearchAssistanceComponent/api/treeData/index.js +26 -0
  20. package/SearchAssistanceSelect/src/SearchAssistanceComponent/component/customNode/index.tsx +62 -0
  21. package/SearchAssistanceSelect/src/SearchAssistanceComponent/component/customNode/style.less +9 -0
  22. package/SearchAssistanceSelect/src/SearchAssistanceComponent/component/customOrg/customModal.tsx +234 -0
  23. package/SearchAssistanceSelect/src/SearchAssistanceComponent/component/customOrg/index.tsx +245 -0
  24. package/SearchAssistanceSelect/src/SearchAssistanceComponent/component/customOrg/style.less +27 -0
  25. package/SearchAssistanceSelect/src/SearchAssistanceComponent/component/dept/index.tsx +104 -0
  26. package/SearchAssistanceSelect/src/SearchAssistanceComponent/component/dept/style.less +9 -0
  27. package/SearchAssistanceSelect/src/SearchAssistanceComponent/component/dropdownList/index.tsx +74 -0
  28. package/SearchAssistanceSelect/src/SearchAssistanceComponent/component/dropdownList/style.less +19 -0
  29. package/SearchAssistanceSelect/src/SearchAssistanceComponent/component/recently/index.tsx +86 -0
  30. package/SearchAssistanceSelect/src/SearchAssistanceComponent/component/roleList/index.tsx +61 -0
  31. package/SearchAssistanceSelect/src/SearchAssistanceComponent/component/search/index.tsx +109 -0
  32. package/SearchAssistanceSelect/src/SearchAssistanceComponent/component/subordinate/index.tsx +64 -0
  33. package/SearchAssistanceSelect/src/SearchAssistanceComponent/component/tabList/index.tsx +99 -0
  34. package/SearchAssistanceSelect/src/SearchAssistanceComponent/component/tabList/style.less +86 -0
  35. package/SearchAssistanceSelect/src/SearchAssistanceComponent/index.tsx +298 -0
  36. package/SearchAssistanceSelect/src/SearchAssistanceComponent/searchModal.tsx +109 -0
  37. package/SearchAssistanceSelect/src/SearchAssistanceComponent/searchTabs.tsx +153 -0
  38. package/SearchAssistanceSelect/src/SearchAssistanceComponent/style.less +41 -0
  39. package/SearchAssistanceSelect/src/SearchAssistanceComponent/transfer/index.tsx +211 -0
  40. package/SearchAssistanceSelect/src/SearchAssistanceComponent/transfer/searchTransferRight.tsx +93 -0
  41. package/SearchAssistanceSelect/src/SearchAssistanceComponent/transfer/style.less +69 -0
  42. package/SearchAssistanceSelect/src/SearchAssistanceComponent/treeData/index.tsx +407 -0
  43. package/SearchAssistanceSelect/src/SearchAssistanceComponent/treeData/style.less +9 -0
  44. package/SearchAssistanceSelect/src/index.tsx +73 -0
  45. package/SearchAssistanceSelect/src/style.less +29 -0
  46. package/UploadFileMenu/download.ts +15 -0
  47. package/UploadFileMenu/index.tsx +3 -0
  48. package/UploadFileMenu/src/api/index.js +44 -0
  49. package/UploadFileMenu/src/api/server.js +9 -0
  50. package/UploadFileMenu/src/index.tsx +256 -0
  51. package/index.js +10 -0
  52. package/package.json +22 -0
@@ -0,0 +1,407 @@
1
+ import React, { useEffect, useRef, useState } from 'react';
2
+ import { message, QmSearchTree } from 'dcp-design-react';
3
+ import { getTreeDataList, getOrgPerson, getDeptTreeNode } from '../api/treeData';
4
+ import DropDownList from '../component/dropdownList';
5
+ import isEmpty from 'lodash-es/isEmpty';
6
+ import { ApartmentOutlined, UserOutlined, BankOutlined, FolderOutlined } from '@/icons';
7
+ import './style.less';
8
+
9
+ const TreeData = (props) => {
10
+ const {
11
+ mode,
12
+ onDataChange,
13
+ selectedKeys = [],
14
+ targetKeys = [],
15
+ onItemSelectAll,
16
+ onTypeChange,
17
+ onValueChange,
18
+ type = 'default',
19
+ onDoubleClickChange,
20
+ } = props;
21
+ const [fetchParams, setFetchParams] = useState<any>({ orgTypeCode: 'def' });
22
+ const treeData = useRef<any[]>([]);
23
+ const searchTreeRef = useRef<any>();
24
+ const [itemKeys, setItemKeys] = useState<any[]>([]);
25
+ const timer = useRef<any>(null);
26
+ useEffect(() => {
27
+ setItemKeys(selectedKeys || []);
28
+ }, [selectedKeys]);
29
+ const updateTreeData = (list, key, children) =>
30
+ list.map((node) => {
31
+ if (node.id === key) {
32
+ return {
33
+ ...node,
34
+ children,
35
+ };
36
+ }
37
+ if (node.children) {
38
+ return {
39
+ ...node,
40
+ children: updateTreeData(node.children, key, children),
41
+ };
42
+ }
43
+ return node;
44
+ });
45
+ const getNodeData = (data, id, field) => {
46
+ for (let i = 0; i < data.length; i++) {
47
+ if (data[i].id === id) {
48
+ return data[i];
49
+ }
50
+ if (!isEmpty(data[i].children)) {
51
+ return getNodeData(data[i].children, id, field);
52
+ }
53
+ }
54
+ return field;
55
+ };
56
+ const getIsLeft = (a1, a2) => {
57
+ if (type === 'default' || type === 'customOrg') {
58
+ return !a1;
59
+ }
60
+ return !a2;
61
+ };
62
+ const getCheckAble = (item) => {
63
+ if (type === 'default' || type === 'org') {
64
+ return !(targetKeys.includes(item.id) || targetKeys.includes(item.parentId));
65
+ }
66
+ if (type === 'customOrg') {
67
+ return (
68
+ !item.orgtype &&
69
+ item.orgtype !== 0 &&
70
+ !(targetKeys.includes(item.id) || targetKeys.includes(item.parentId))
71
+ );
72
+ }
73
+ if (type === 'doc') {
74
+ return !(targetKeys.includes(item.id) || targetKeys.includes(item.parentId));
75
+ }
76
+ return (
77
+ item.orgtype === 2 &&
78
+ !(
79
+ targetKeys.includes(item.id) ||
80
+ targetKeys.includes(item.parentId) ||
81
+ targetKeys.includes(`${item.parentId}_${item.id}`)
82
+ )
83
+ );
84
+ };
85
+
86
+ const getData = async (params) => {
87
+ params.id = params.newId;
88
+ const treeList = getTreeList(treeData.current, []);
89
+ const field = treeList.find((item) => item.id === params['id']) || {
90
+ hasChildren: true,
91
+ };
92
+ const { newId, ...newParams } = params;
93
+ console.log(newParams);
94
+ const res = await (field.hasChildren
95
+ ? getTreeDataList({ ...fetchParams, ...newParams })
96
+ : getOrgPerson({ id: params.id }));
97
+
98
+ if (res.code === 200) {
99
+ if (!params['id']) {
100
+ // const list = getNodeData(res.data, !hasChildren);
101
+ const list = res.data.map((item) => {
102
+ return {
103
+ ...item,
104
+ checkable: getCheckAble(item),
105
+ parentId: params.id,
106
+ newId: item.id,
107
+ isLeaf: getIsLeft(field.hasChildren, item.hasChildren),
108
+ };
109
+ });
110
+
111
+ treeData.current = list;
112
+ const treeList = getTreeList(list, []);
113
+ onDataChange &&
114
+ onDataChange(
115
+ treeList.map((item) => {
116
+ return {
117
+ ...item,
118
+ key: item.id,
119
+ title: item.name,
120
+ };
121
+ })
122
+ );
123
+ return {
124
+ ...res,
125
+ data: list,
126
+ };
127
+ } else {
128
+ const resPer: any = await (type === 'default'
129
+ ? getOrgPerson({ id: params.id })
130
+ : new Promise((resolve) => {
131
+ resolve({
132
+ code: 200,
133
+ data: [],
134
+ message: '',
135
+ });
136
+ }));
137
+ const person = resPer?.data?.map((item) => {
138
+ return {
139
+ ...item,
140
+ isLeaf: true,
141
+ parentId: params.id,
142
+ newId: `${params.id}_${item.id}`,
143
+ checkable: getCheckAble(item),
144
+ };
145
+ });
146
+
147
+ const list = res.data.map((item) => {
148
+ return {
149
+ ...item,
150
+ isLeaf: getIsLeft(field.hasChildren, item.hasChildren),
151
+ parentId: params.id,
152
+ newId: field.hasChildren ? item.id : `${params.id}_${item.id}`,
153
+ checkable: getCheckAble(item),
154
+ };
155
+ });
156
+
157
+ treeData.current = updateTreeData(treeData.current, params.id, list.concat(person));
158
+ const treeList = getTreeList(treeData.current, []);
159
+ onDataChange &&
160
+ onDataChange(
161
+ treeList.map((item) => {
162
+ return {
163
+ ...item,
164
+ key: item.id,
165
+ title: item.name,
166
+ };
167
+ })
168
+ );
169
+ console.log(list.concat(person));
170
+ return {
171
+ ...res,
172
+ data: list.concat(person),
173
+ };
174
+ }
175
+ }
176
+
177
+ return res;
178
+ };
179
+ const getTreeList = (treeData, list) => {
180
+ treeData.forEach((item) => {
181
+ list.push(item);
182
+ if (item.children) {
183
+ getTreeList(item.children, list);
184
+ }
185
+ });
186
+ return list;
187
+ };
188
+ const onDropDataChange = (value) => {
189
+ treeData.current = [
190
+ // {
191
+ // id: value.key,
192
+ // newId: value.key,
193
+ // name: value.label,
194
+ // orgtype: 0,
195
+ // checkable: false,
196
+ // hasChildren: true,
197
+ // },
198
+ ];
199
+ onTypeChange && onTypeChange(value);
200
+
201
+ setFetchParams({ orgTypeCode: value.key });
202
+ };
203
+ const onItemChange = async (node) => {
204
+ if (node.length > 0) {
205
+ onItemSelectAll(
206
+ node.map((item) => item.id),
207
+ true
208
+ );
209
+ if (selectedKeys.length) {
210
+ return;
211
+ }
212
+ } else {
213
+ onItemSelectAll(selectedKeys, false);
214
+ }
215
+ };
216
+ useEffect(() => {
217
+ if (searchTreeRef.current) {
218
+ console.log(targetKeys);
219
+ const treeList = getTreeList(treeData.current, []);
220
+ console.log(treeList);
221
+ treeList.forEach((item) => {
222
+ if (item.orgtype === 0) {
223
+ searchTreeRef.current.UPDATE_RECORD(item.id, {
224
+ checkable: false,
225
+ });
226
+ } else {
227
+ searchTreeRef.current.UPDATE_RECORD(item.newId, {
228
+ checkable: getCheckAble(item),
229
+ });
230
+ }
231
+ });
232
+ }
233
+ // eslint-disable-next-line react-hooks/exhaustive-deps
234
+ }, [targetKeys]);
235
+
236
+ const getDocData = async (params) => {
237
+ const res: any = await getDeptTreeNode({ ...params, orgTypeCode: '' });
238
+ if (res.code === '200') {
239
+ if (params.id) {
240
+ const list = res.data.map((item) => {
241
+ return {
242
+ ...item,
243
+ oldId: item.id,
244
+ id: item.code,
245
+ checkable: getCheckAble({ id: item.code, parentId: item.parentId }),
246
+ isLeaf: item.treeLevel === 3,
247
+ orgtype: item.orgType || null,
248
+ };
249
+ });
250
+ treeData.current = updateTreeData(treeData.current, params.id, list);
251
+ const treeList = getTreeList(treeData.current, []);
252
+ onDataChange &&
253
+ onDataChange(
254
+ treeList.map((item) => {
255
+ return {
256
+ ...item,
257
+ key: item.id,
258
+ title: item.name,
259
+ };
260
+ })
261
+ );
262
+ return {
263
+ code: 200,
264
+ data: list,
265
+ message: res.message,
266
+ };
267
+ } else {
268
+ const list = res.data.map((item) => {
269
+ return {
270
+ ...item,
271
+ oldId: item.id,
272
+ id: item.code,
273
+ checkable: getCheckAble({ id: item.code, parentId: item.parentId }),
274
+ isLeaf: item.treeLevel === 3,
275
+ orgtype: item.orgType || null,
276
+ };
277
+ });
278
+ treeData.current = list;
279
+ const treeList = getTreeList(list, []);
280
+ onDataChange &&
281
+ onDataChange(
282
+ treeList.map((item) => {
283
+ return {
284
+ ...item,
285
+ key: item.id,
286
+ title: item.name,
287
+ };
288
+ })
289
+ );
290
+ return {
291
+ code: 200,
292
+ data: list,
293
+ message: res.message,
294
+ };
295
+ }
296
+ }
297
+ return res;
298
+ };
299
+
300
+ return (
301
+ <div className="search-tree-page">
302
+ {/* {type !== 'doc' && <DropDownList onDataChange={onDropDataChange} />} */}
303
+
304
+ <div className="search-tree-page-content">
305
+ <QmSearchTree
306
+ ref={searchTreeRef}
307
+ filterable={false}
308
+ showCollapse={false}
309
+ asyncLoad={true}
310
+ multiple={mode === 'multiple'}
311
+ fetch={{
312
+ api: type === 'doc' ? getDocData : getData,
313
+ params: fetchParams,
314
+ }}
315
+ // checkStrictly={true}
316
+ value={itemKeys}
317
+ checkStrategy={'SHOW_PARENT'}
318
+ onCheckChange={(node: any) => {
319
+ clearTimeout(timer.current);
320
+ timer.current = setTimeout(async () => {
321
+ await onItemSelectAll(selectedKeys, false);
322
+ onItemChange(node);
323
+ }, 300);
324
+ }}
325
+ onSelectChange={(node: any) => {
326
+ if (!mode) {
327
+ if (
328
+ (!node?.orgtype && node.orgtype !== 0) ||
329
+ (type === 'org' && node.orgtype !== 0)
330
+ ) {
331
+ setItemKeys([node.id]);
332
+ onValueChange && onValueChange({ ...node, value: node.id, title: node.name });
333
+ }
334
+ }
335
+ }}
336
+ titleRender={(node) => {
337
+ return node.orgtype === 0 ? (
338
+ <span
339
+ onDoubleClick={(e) => {
340
+ if (!node?.checkable) {
341
+ return;
342
+ }
343
+ clearTimeout(timer.current);
344
+ if (!targetKeys?.includes(node.id)) {
345
+ onDoubleClickChange(node.id);
346
+ }
347
+ }}
348
+ >
349
+ <ApartmentOutlined /> {node.name}
350
+ </span>
351
+ ) : node.orgtype === 1 ? (
352
+ <span
353
+ onDoubleClick={(e) => {
354
+ if (!node?.checkable) {
355
+ return;
356
+ }
357
+ clearTimeout(timer.current);
358
+ if (!targetKeys?.includes(node.id)) {
359
+ onDoubleClickChange(node.id);
360
+ }
361
+ }}
362
+ >
363
+ <BankOutlined /> {node.name}
364
+ </span>
365
+ ) : node.orgtype === 2 ? (
366
+ <span
367
+ onDoubleClick={(e) => {
368
+ if (!node?.checkable) {
369
+ return;
370
+ }
371
+ clearTimeout(timer.current);
372
+ if (!targetKeys?.includes(node.id)) {
373
+ onDoubleClickChange(node.id);
374
+ }
375
+ }}
376
+ >
377
+ <FolderOutlined /> {node.name}
378
+ </span>
379
+ ) : (
380
+ <span
381
+ onDoubleClick={(e) => {
382
+ if (!node?.checkable) {
383
+ return;
384
+ }
385
+ clearTimeout(timer.current);
386
+ if (!targetKeys?.includes(node.id)) {
387
+ onDoubleClickChange(node.id);
388
+ }
389
+ }}
390
+ >
391
+ <UserOutlined /> {node.name}
392
+ </span>
393
+ );
394
+ }}
395
+ fieldsDefine={{
396
+ valueKey: 'newId',
397
+ textKey: 'name',
398
+ }}
399
+ showSearchBar={false}
400
+ // dataSource={treeData}
401
+ />
402
+ </div>
403
+ </div>
404
+ );
405
+ };
406
+
407
+ export default TreeData;
@@ -0,0 +1,9 @@
1
+ .search-tree-page{
2
+ height: 100%;
3
+ display: flex;
4
+ flex-direction: column;
5
+ &-content{
6
+ flex: 1;
7
+ overflow-y: auto;
8
+ }
9
+ }
@@ -0,0 +1,73 @@
1
+ import React from 'react';
2
+ import SearchAssistanceSelectSelect from './SearchAssistanceComponent';
3
+ import {
4
+ getUsersByConditions,
5
+ getOrgsByConditions,
6
+ } from '../../SearchAssistanceSelect/src/SearchAssistanceComponent/api/tabList';
7
+ const SearchAssistanceSelect = (props) => {
8
+ const { value, onChange, option, $$form, modalVisible, type, mode, items, title, customData } =
9
+ props;
10
+ const getTypeCondtions = (type) => {
11
+ switch (type) {
12
+ case 'org':
13
+ return getOrgsByConditions;
14
+ case 'doc':
15
+ return async () => {};
16
+ default:
17
+ return getUsersByConditions;
18
+ }
19
+ };
20
+ const getTypeItems = (type) => {
21
+ switch (type) {
22
+ case 'org':
23
+ return [
24
+ {
25
+ label: '组织结构',
26
+ key: '4',
27
+ type: 'org',
28
+ },
29
+ {
30
+ label: '按列表',
31
+ key: '5',
32
+ type: 'org',
33
+ },
34
+ ];
35
+ case 'doc':
36
+ return [
37
+ {
38
+ label: '组织结构',
39
+ key: '4',
40
+ type: 'doc',
41
+ },
42
+ ];
43
+ case 'customNode':
44
+ return [
45
+ {
46
+ label: '组织结构',
47
+ key: '8',
48
+ type: 'customNode',
49
+ },
50
+ ];
51
+ default:
52
+ return items;
53
+ }
54
+ };
55
+
56
+ return (
57
+ <SearchAssistanceSelectSelect
58
+ mode={mode}
59
+ value={value}
60
+ type={type}
61
+ title={title}
62
+ fetchOptions={getTypeCondtions(type)}
63
+ params={type === 'org' ? { currentPage: 1, pageSize: 20 } : {}}
64
+ onChange={onChange}
65
+ option={option}
66
+ $$form={$$form}
67
+ modalVisible={modalVisible}
68
+ items={getTypeItems(type)}
69
+ customData={customData}
70
+ />
71
+ );
72
+ };
73
+ export default SearchAssistanceSelect;
@@ -0,0 +1,29 @@
1
+ .search-select-page{
2
+ display: flex;
3
+ flex: 1 auto;
4
+ .ant-select{
5
+ width: 100%;
6
+
7
+ }
8
+ .ant-select-selector{
9
+ padding-right: 32px;
10
+ }
11
+ .ant-select:hover .search-clear{
12
+ opacity: 1;
13
+ }
14
+ .search-clear{
15
+ opacity: 0;
16
+ }
17
+ .active-search-clear{
18
+ opacity:1 !important;
19
+ }
20
+ .ant-select .ant-select-arrow{
21
+ right: 5px;
22
+ }
23
+ &-search-button {
24
+ width: 32px;
25
+ border-radius: 0 2px 2px 0;
26
+ padding: 2.4px 0;
27
+ left: -1px;
28
+ }
29
+ }
@@ -0,0 +1,15 @@
1
+ import { Nullable } from '@/utils/types';
2
+
3
+ export const download = (blob: Blob, fileName: string) => {
4
+ // ie10+
5
+ if (navigator.msSaveBlob) {
6
+ navigator.msSaveBlob(blob, decodeURI(fileName));
7
+ } else {
8
+ const downloadUrl: string = window.URL.createObjectURL(blob);
9
+ let a: Nullable<HTMLAnchorElement> = document.createElement('a');
10
+ a.href = downloadUrl;
11
+ a.download = decodeURI(fileName);
12
+ a.click();
13
+ a = null;
14
+ }
15
+ };
@@ -0,0 +1,3 @@
1
+ import UploadFileMenu from "./src/index";
2
+
3
+ export default UploadFileMenu;
@@ -0,0 +1,44 @@
1
+ import axios from '@/api/fetch';
2
+ import SERVER from './server';
3
+
4
+ export const getFileTreeData = (params) => {
5
+ return axios.post(
6
+ `${SERVER.QFC_FILE}/cms/category/fileTreeData
7
+ `,
8
+ params
9
+ );
10
+ };
11
+ export const multiSecurityDown = (params) => {
12
+ return axios.post(
13
+ `${SERVER.QFC_CMS}/cms/articleFile/multiSecurityDown
14
+ `,
15
+ params,
16
+ {
17
+ responseType: 'blob',
18
+ }
19
+ );
20
+ };
21
+
22
+ export const multiUpload = (params) => {
23
+ return axios.post(
24
+ `${SERVER.QFC_CMS}/cms/articleFile/uploadAndSave
25
+ `,
26
+ params,
27
+ {
28
+ header: {
29
+ 'content-type': 'multipart/form-data',
30
+ },
31
+ }
32
+ );
33
+ };
34
+
35
+ export const rename = (params) => {
36
+ return axios.post(
37
+ `${SERVER.QFC_FILE}/cms/articleFile/rename
38
+ `,
39
+ params
40
+ );
41
+ };
42
+ export const filePreview = (params) => {
43
+ return axios.post(`${SERVER.QFC_FILE}/cms/articleFile/filePreview`, params);
44
+ };
@@ -0,0 +1,9 @@
1
+ import env from '@/config/envMaps';
2
+ const { prefix } = env;
3
+
4
+ export default {
5
+ QFC_BASE: `${prefix}/dcp-base-user`,
6
+ QFC_PUBLIC: `${prefix}/dcp-base-public`,
7
+ QFC_FILE: `${prefix}/dcp-base-cms-file`,
8
+ QFC_CMS: `${prefix}/dcp-base-cms`,
9
+ };