@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,19 @@
1
+ .search-dropdown-page{
2
+ &-pro{
3
+ .ant-dropdown-menu{
4
+ max-height: 300px;
5
+ overflow-y: auto;
6
+ }
7
+ }
8
+ &-org{
9
+ display: flex;
10
+ justify-content: space-between;
11
+ padding: 0px 10px;
12
+ height: 37px;
13
+ width: 100%;
14
+ align-items: center;
15
+ background-color: #fafafa;
16
+ border-bottom: 1px solid #e7e7e7;
17
+ font-size: 12px;
18
+ }
19
+ }
@@ -0,0 +1,86 @@
1
+ import React, { useEffect, useRef, useState } from 'react';
2
+ import TabList from '../tabList';
3
+ import { recentUserPage } from '../../api/tabList';
4
+ import { Pagination } from 'dcp-design-react';
5
+
6
+ const RecentlyPageIndex = (props) => {
7
+ const {
8
+ mode,
9
+ selectedKeys,
10
+ targetKeys,
11
+ onDataChange,
12
+ onValueChange,
13
+ onItemSelect,
14
+ onDoubleClickChange,
15
+ } = props;
16
+ const [dataSource, setDataSource] = useState<any[]>([]);
17
+ const [itemKeys, setItemKeys] = useState<any[]>([]);
18
+ const [total, setTotal] = useState(0);
19
+ const [page, setPage] = useState(1);
20
+ const [fetchParams, setFetchParams] = useState<any>({
21
+ currentPage: 1,
22
+ pageSize: 10,
23
+ });
24
+ const dataList = useRef<any[]>([]);
25
+ useEffect(() => {
26
+ setItemKeys(selectedKeys || []);
27
+ }, [selectedKeys]);
28
+ const itemSelect = (value, checked) => {
29
+ if (mode === 'multiple') {
30
+ onItemSelect && onItemSelect(value, checked);
31
+ return;
32
+ }
33
+ setItemKeys([value]);
34
+ const field = dataSource.find((item) => item.id === value);
35
+ onValueChange && onValueChange(field);
36
+ };
37
+ const getData = async (params) => {
38
+ const res = await recentUserPage(params);
39
+ if (res.code === 200) {
40
+ const list = res?.data?.map((item) => {
41
+ return {
42
+ ...item,
43
+ key: item.id,
44
+ title: item.name,
45
+ // deptName: item.departmentName,
46
+ };
47
+ });
48
+ setDataSource(list || []);
49
+ list.forEach((item) => {
50
+ if (!dataList.current.find((items) => items.id === item.id)) {
51
+ dataList.current.push(item);
52
+ }
53
+ });
54
+ onDataChange && onDataChange(dataList.current);
55
+ setTotal(res.data.total);
56
+ }
57
+ };
58
+ const pageChange = (page, pageSize) => {
59
+ setPage(page);
60
+ setFetchParams({ ...fetchParams, currentPage: page });
61
+ };
62
+ useEffect(() => {
63
+ getData({});
64
+ // eslint-disable-next-line react-hooks/exhaustive-deps
65
+ }, []);
66
+ return (
67
+ <div className="recetly-page-index search-page-list">
68
+ <TabList
69
+ onDoubleClickChange={onDoubleClickChange}
70
+ onItemSelect={itemSelect}
71
+ selectedKeys={itemKeys}
72
+ dataSource={dataSource.filter((item) => !targetKeys.includes(item.id))}
73
+ />
74
+ {/* <Pagination
75
+ simple
76
+ size="small"
77
+ current={page}
78
+ defaultCurrent={1}
79
+ showTotal={(total) => `共 ${total} 条`}
80
+ total={total}
81
+ onChange={pageChange}
82
+ /> */}
83
+ </div>
84
+ );
85
+ };
86
+ export default RecentlyPageIndex;
@@ -0,0 +1,61 @@
1
+ import React, { useState, useEffect } from "react";
2
+ import TabList from "../tabList";
3
+ import { getRoleList } from "../../api/tabList";
4
+ import { getUserInfo } from "@/utils/cookies";
5
+
6
+ const RoleListPage = (props) => {
7
+ const {
8
+ mode,
9
+ selectedKeys,
10
+ targetKeys,
11
+ onDataChange,
12
+ onValueChange,
13
+ onItemSelect,
14
+ params = {},
15
+ } = props;
16
+ const [dataSource, setDataSource] = useState<any[]>([]);
17
+ useEffect(() => {
18
+ getData({ loginUserId: getUserInfo().id, ...params });
19
+ // eslint-disable-next-line react-hooks/exhaustive-deps
20
+ }, [params]);
21
+ const getData = async (params) => {
22
+ const res = await getRoleList(params);
23
+ if (res.code === 200) {
24
+ const list = res.data.map((item) => {
25
+ return {
26
+ ...item,
27
+ key: item.id,
28
+ title: item.name,
29
+ };
30
+ });
31
+ setDataSource(list || []);
32
+ onDataChange && onDataChange(list);
33
+ }
34
+ };
35
+
36
+ const [itemKeys, setItemKeys] = useState<any[]>([]);
37
+ useEffect(() => {
38
+ setItemKeys(selectedKeys || []);
39
+ }, [selectedKeys]);
40
+ const itemSelect = (value, checked) => {
41
+ if (mode === "multiple") {
42
+ onItemSelect && onItemSelect(value, checked);
43
+ return;
44
+ }
45
+ setItemKeys([value]);
46
+ const field = dataSource.find((item) => item.id === value);
47
+ onValueChange &&
48
+ onValueChange({ ...field, value: field.id, label: field.userName });
49
+ };
50
+
51
+ return (
52
+ <div className="dept-page">
53
+ <TabList
54
+ onItemSelect={itemSelect}
55
+ selectedKeys={itemKeys}
56
+ dataSource={dataSource.filter((item) => !targetKeys.includes(item.id))}
57
+ />
58
+ </div>
59
+ );
60
+ };
61
+ export default RoleListPage;
@@ -0,0 +1,109 @@
1
+ import React, { useEffect, useRef, useState } from 'react';
2
+ import TabList from '../tabList';
3
+ import { getUsersByConditions, getOrgsByConditions } from '../../api/tabList';
4
+ import { Pagination } from 'dcp-design-react';
5
+
6
+ const SearchPageIndex = (props) => {
7
+ const {
8
+ mode,
9
+ selectedKeys,
10
+ targetKeys,
11
+ onDataChange,
12
+ onValueChange,
13
+ onItemSelect,
14
+ searchValue,
15
+ params = {},
16
+ onDoubleClickChange,
17
+ type,
18
+ } = props;
19
+ const [dataSource, setDataSource] = useState<any[]>([]);
20
+ const [itemKeys, setItemKeys] = useState<any[]>([]);
21
+ const [total, setTotal] = useState(0);
22
+ const [page, setPage] = useState(1);
23
+ const [fetchParams, setFetchParams] = useState<any>({});
24
+ const [loading, setLoading] = useState<boolean>(false);
25
+ const dataList = useRef<any[]>([]);
26
+ useEffect(() => {
27
+ setItemKeys(selectedKeys || []);
28
+ }, [selectedKeys]);
29
+ const itemSelect = (value, checked) => {
30
+ if (mode === 'multiple') {
31
+ onItemSelect && onItemSelect(value, checked);
32
+ return;
33
+ }
34
+ setItemKeys([value]);
35
+ const field = dataSource.find((item) => item.id === value);
36
+ onValueChange && onValueChange({ ...field, value: field.id, label: field.userName });
37
+ };
38
+ const fetchHandleApi = async (params) => {
39
+ if (type !== 'org') {
40
+ return getUsersByConditions(params);
41
+ }
42
+ return getOrgsByConditions(params);
43
+ };
44
+ const getData = async (params) => {
45
+ setLoading(true);
46
+ const res = await fetchHandleApi(params).finally(() => {
47
+ setLoading(false);
48
+ });
49
+
50
+ if (res.code === 200) {
51
+ const data = res.data?.records || res.data?.list;
52
+ const list = data.map((item) => {
53
+ return {
54
+ ...item,
55
+ key: item.id,
56
+ title: item.userName || item.name,
57
+ // deptName: item.departmentName | item.parentOrgName,
58
+ };
59
+ });
60
+ setDataSource(list || []);
61
+ list.forEach((item) => {
62
+ if (!dataList.current.find((items) => items.id === item.id)) {
63
+ dataList.current.push(item);
64
+ }
65
+ });
66
+ onDataChange && onDataChange(dataList.current);
67
+ setTotal(res.data.total);
68
+ }
69
+ };
70
+ const pageChange = (page, pageSize) => {
71
+ setPage(page);
72
+ setFetchParams({ ...fetchParams, currentPage: page });
73
+ };
74
+ useEffect(() => {
75
+ if (fetchParams.currentPage) {
76
+ getData(fetchParams);
77
+ }
78
+
79
+ // eslint-disable-next-line react-hooks/exhaustive-deps
80
+ }, [fetchParams]);
81
+ useEffect(() => {
82
+ setFetchParams({ pageSize: 10, currentPage: 1, ...params });
83
+ }, [params]);
84
+ // const ondrownChange = (field) => {
85
+ // setFetchParams({ pageSize: 10, currentPage: 1, orgTypeCode: field.key });
86
+ // };
87
+ return (
88
+ <div className="recetly-page-index search-page-list">
89
+ {/* <DropDownList onDataChange={ondrownChange} /> */}
90
+ <TabList
91
+ onItemSelect={itemSelect}
92
+ loading={loading}
93
+ onDoubleClickChange={onDoubleClickChange}
94
+ selectedKeys={itemKeys}
95
+ dataSource={dataSource.filter((item) => !targetKeys.includes(item.id))}
96
+ />
97
+ <Pagination
98
+ simple
99
+ size="small"
100
+ current={page}
101
+ defaultCurrent={1}
102
+ showTotal={(total) => `共 ${total} 条`}
103
+ total={total}
104
+ onChange={pageChange}
105
+ />
106
+ </div>
107
+ );
108
+ };
109
+ export default SearchPageIndex;
@@ -0,0 +1,64 @@
1
+ import React, { useState, useEffect } from 'react';
2
+ import DropDownList from '../dropdownList';
3
+ import TabList from '../tabList';
4
+ import { getMySubordinates } from '../../api/tabList';
5
+ import { getUserInfo } from '@/utils/cookies';
6
+
7
+ const SubordinateIndex = (props) => {
8
+ const {
9
+ mode,
10
+ selectedKeys,
11
+ targetKeys,
12
+ onDataChange,
13
+ onValueChange,
14
+ onDoubleClickChange,
15
+ onItemSelect,
16
+ } = props;
17
+ const [dataSource, setDataSource] = useState<any[]>([]);
18
+ const ondrownChange = (field) => {
19
+ getData({ userId: getUserInfo().id, orgTypeCode: field.key });
20
+ };
21
+ const getData = async (params) => {
22
+ const res = await getMySubordinates(params);
23
+ if (res.code === 200) {
24
+ const list =
25
+ res.data?.map((item) => {
26
+ return {
27
+ ...item,
28
+ key: item.id,
29
+ title: item.userName,
30
+ deptName: item.departmentName,
31
+ };
32
+ }) || [];
33
+ setDataSource(list || []);
34
+ onDataChange && onDataChange(list);
35
+ }
36
+ };
37
+
38
+ const [itemKeys, setItemKeys] = useState<any[]>([]);
39
+ useEffect(() => {
40
+ setItemKeys(selectedKeys || []);
41
+ }, [selectedKeys]);
42
+ const itemSelect = (value, checked) => {
43
+ if (mode === 'multiple') {
44
+ onItemSelect && onItemSelect(value, checked);
45
+ return;
46
+ }
47
+ setItemKeys([value]);
48
+ const field = dataSource.find((item) => item.id === value);
49
+ onValueChange && onValueChange({ ...field, value: field.id, label: field.userName });
50
+ };
51
+
52
+ return (
53
+ <div className="dept-page">
54
+ <DropDownList onDataChange={ondrownChange} />
55
+ <TabList
56
+ onDoubleClickChange={onDoubleClickChange}
57
+ onItemSelect={itemSelect}
58
+ selectedKeys={itemKeys}
59
+ dataSource={dataSource.filter((item) => !targetKeys.includes(item.id))}
60
+ />
61
+ </div>
62
+ );
63
+ };
64
+ export default SubordinateIndex;
@@ -0,0 +1,99 @@
1
+ import React, { useEffect, useRef, useState } from 'react';
2
+ import { List } from 'dcp-design-react';
3
+ import { CheckOutlined, EditOutlined, DeleteOutlined } from '@/icons';
4
+ import './style.less';
5
+ const AvaNode = ({ title }) => {
6
+ return <div className="tab-list-page-avatar">{title?.slice(-2)}</div>;
7
+ };
8
+ const TabList = (props) => {
9
+ const {
10
+ dataSource,
11
+ selectedKeys,
12
+ onItemSelect,
13
+ onDoubleClickChange,
14
+ type = 'default',
15
+ onItemAction,
16
+ loading = false,
17
+ } = props;
18
+ const [dataList, setDataList] = useState<any[]>([]);
19
+ const timer = useRef<any>(null);
20
+ useEffect(() => {
21
+ setDataList(dataSource || []);
22
+ }, [dataSource]);
23
+ const actionHandle = (e, flag, info) => {
24
+ e.stopPropagation();
25
+ if (flag === 'edit') {
26
+ onItemAction && onItemAction('edit', info);
27
+ return;
28
+ }
29
+ if (flag === 'del') {
30
+ onItemAction && onItemAction('del', info);
31
+ }
32
+ };
33
+ return (
34
+ <div className="tab-list-page">
35
+ <List
36
+ itemLayout="horizontal"
37
+ dataSource={dataList}
38
+ loading={loading}
39
+ size="small"
40
+ renderItem={(item) => (
41
+ <List.Item
42
+ onClick={() => {
43
+ clearTimeout(timer.current);
44
+ timer.current = setTimeout(() => {
45
+ onItemSelect(item.id, !selectedKeys.includes(item.id));
46
+ }, 300);
47
+ }}
48
+ onDoubleClick={() => {
49
+ clearTimeout(timer.current);
50
+ onDoubleClickChange(item.id);
51
+ }}
52
+ className={selectedKeys.includes(item.id) ? 'tab-list-page-field-selected' : ''}
53
+ >
54
+ <List.Item.Meta
55
+ avatar={<AvaNode title={item.title} />}
56
+ title={
57
+ <>
58
+ <div>
59
+ <span>{item.title}</span> <span>{item.jobName}</span>
60
+ </div>
61
+ {selectedKeys.includes(item.id) && (
62
+ <>
63
+ <span className="sanjiao"></span>
64
+ <CheckOutlined />
65
+ </>
66
+ )}
67
+ {type === 'edit' ? (
68
+ <div className="item-action">
69
+ <EditOutlined
70
+ onClick={(e) => actionHandle(e, 'edit', item)}
71
+ style={{ marginRight: 8, fontSize: 14 }}
72
+ />
73
+ <DeleteOutlined
74
+ onClick={(e) => actionHandle(e, 'del', item)}
75
+ style={{ marginRight: 8, fontSize: 14 }}
76
+ />
77
+ </div>
78
+ ) : (
79
+ <></>
80
+ )}
81
+ </>
82
+ }
83
+ description={
84
+ item.orgName ? (
85
+ <div>
86
+ <span>{item.orgName}</span> <span>{item.departmentName}</span>
87
+ </div>
88
+ ) : (
89
+ <></>
90
+ )
91
+ }
92
+ />
93
+ </List.Item>
94
+ )}
95
+ />
96
+ </div>
97
+ );
98
+ };
99
+ export default TabList;
@@ -0,0 +1,86 @@
1
+ .tab-list-page{
2
+ padding: 0px 0px 0px 10px;
3
+ .ant-list{
4
+ // height: 378px;
5
+ height: 100%;
6
+ overflow-y: auto;
7
+ }
8
+ &-org{
9
+ width: 100%;
10
+ display: flex;
11
+ justify-content: space-between;
12
+ align-items: center;
13
+ }
14
+ .ant-list-sm .ant-list-item{
15
+ position: relative;
16
+ .ant-list-item-meta-title{
17
+ display: flex;
18
+ justify-content: space-between;
19
+ align-items: center;
20
+ .item-action{
21
+ .anticon{
22
+ cursor: pointer;
23
+ }
24
+ }
25
+ }
26
+ }
27
+ &-field-selected{
28
+ background-color:#eaf8fe;
29
+ .sanjiao{
30
+ position: absolute;
31
+ top: 0;
32
+ right: 0;
33
+ height: 0;
34
+ width: 0;
35
+ border-top: 21px solid #0b93da;
36
+ border-left: 22px solid transparent;
37
+ }
38
+ .anticon-check{
39
+ position: absolute;
40
+ font-size: 12px;
41
+ color: #fff;
42
+ top: 0;
43
+ right: 1px
44
+ }
45
+ }
46
+ .ant-list-item:hover{
47
+ cursor: pointer;
48
+ background-color:#eaf8fe;
49
+ }
50
+ &-avatar{
51
+ width: 30px;
52
+ height: 30px;
53
+ border-radius: 50%;
54
+ background:rgb(85, 177, 249) ;
55
+ color: rgb(255, 255, 255);
56
+ text-align: center;
57
+ line-height: 30px;
58
+ font-size: 12px;
59
+ }
60
+ .ant-list-sm .ant-list-item{
61
+ padding: 6px;
62
+ }
63
+ .ant-list-item-meta{
64
+ align-items: center;
65
+ }
66
+ .ant-list-item-meta-title{
67
+ font-size: 12px;
68
+ }
69
+ .ant-list-item-meta-description{
70
+ font-size: 12px;
71
+ }
72
+
73
+ }
74
+ .search-page-list{
75
+ height: 100%;
76
+ display: flex;
77
+ flex-direction: column;
78
+ .tab-list-page{
79
+ flex: 1;
80
+ overflow-y: auto;
81
+ }
82
+ .ant-pagination{
83
+ text-align: center;
84
+ font-size: 12px;
85
+ }
86
+ }