index.tsx 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. import { PageContainer } from '@ant-design/pro-layout';
  2. import { Card, Input, message, Spin, Tooltip, Tree } from 'antd';
  3. import { useEffect, useState } from 'react';
  4. import { service } from '@/pages/system/DataSource';
  5. import { useLocation } from 'umi';
  6. import { PlusOutlined } from '@ant-design/icons';
  7. import DataTable from './DataTable';
  8. import styles from './index.less';
  9. import EditTable from './EditTable';
  10. import _ from 'lodash';
  11. import { useDomFullHeight } from '@/hooks';
  12. import { Store } from 'jetlinks-store';
  13. import { Empty } from '@/components';
  14. const Management = () => {
  15. const location = useLocation<{ id: string }>();
  16. const id = (location as any).query?.id;
  17. const [info, setInfo] = useState<Partial<DataSourceItem>>({});
  18. const [rdbList, setRdbList] = useState<any[]>([]);
  19. const [allList, setAllList] = useState<any[]>([]);
  20. const [defaultSelectedKeys, setDefaultSelectedKeys] = useState<any[]>([]);
  21. const [visible, setVisible] = useState<boolean>(false);
  22. const [tableList, setTableList] = useState<any[]>([]);
  23. const [param, setParam] = useState<string | undefined>(undefined);
  24. const [loading, setLoading] = useState<boolean>(true);
  25. const { minHeight } = useDomFullHeight(`.management`, 52);
  26. const queryTables = (key: string) => {
  27. setLoading(true);
  28. service.rdbTables(id, key).then((resp) => {
  29. if (resp.status === 200) {
  30. setTableList(resp.result?.columns || []);
  31. }
  32. setLoading(false);
  33. });
  34. };
  35. console.log(minHeight)
  36. const handleSearch = (refresh: boolean) => {
  37. service.rdbTree(id).then((resp) => {
  38. if (resp.status === 200) {
  39. Store.set('datasource-detail-list', resp.result);
  40. setAllList(resp.result);
  41. if (refresh) {
  42. setDefaultSelectedKeys([resp.result[0]?.name]);
  43. queryTables(resp.result[0]?.name);
  44. } else {
  45. queryTables(defaultSelectedKeys[0]);
  46. }
  47. }
  48. });
  49. };
  50. useEffect(() => {
  51. if (id) {
  52. service.detail(id).then((resp) => {
  53. if (resp.status === 200) {
  54. setInfo(resp.result);
  55. }
  56. });
  57. handleSearch(true);
  58. }
  59. }, [id]);
  60. useEffect(() => {
  61. if (!!param) {
  62. const list = allList.filter((item) => {
  63. return item.name.includes(param);
  64. });
  65. setRdbList([...list]);
  66. if (!_.map(list, 'name').includes(defaultSelectedKeys[0])) {
  67. setDefaultSelectedKeys([list[0]?.name]);
  68. queryTables(list[0]?.name);
  69. }
  70. } else {
  71. setRdbList([...allList]);
  72. }
  73. }, [allList, param]);
  74. const saveTables = async (name: string, data: any) => {
  75. const resp = await service.saveRdbTables(id, {
  76. name: name,
  77. columns: [...data.array],
  78. });
  79. if (resp.status === 200) {
  80. message.success('保存成功');
  81. handleSearch(false);
  82. }
  83. };
  84. return (
  85. <PageContainer>
  86. <Spin spinning={loading}>
  87. <Card className="management">
  88. <div className={styles.datasourceBox} style={{ minHeight }}>
  89. <div className={styles.left}>
  90. <Input.Search
  91. placeholder="请输入"
  92. onSearch={(val: string) => {
  93. setParam(val);
  94. }}
  95. allowClear
  96. style={{ width: '100%', marginBottom: 20 }}
  97. />
  98. <div className={styles.tables}>
  99. <Tree
  100. showLine
  101. showIcon
  102. selectedKeys={defaultSelectedKeys}
  103. defaultExpandAll
  104. height={500}
  105. onSelect={(value: any) => {
  106. setDefaultSelectedKeys(value);
  107. queryTables(value[0]);
  108. }}
  109. >
  110. <Tree.TreeNode
  111. selectable={false}
  112. title={() => {
  113. return (
  114. <div
  115. style={{ display: 'flex', justifyContent: 'space-between', width: 230 }}
  116. >
  117. <div>{info?.shareConfig?.schema || '数据源名称'}</div>
  118. <div>
  119. <a>
  120. <PlusOutlined
  121. onClick={() => {
  122. setVisible(true);
  123. }}
  124. />
  125. </a>
  126. </div>
  127. </div>
  128. );
  129. }}
  130. key={'tables'}
  131. >
  132. {rdbList.map((item) => (
  133. <Tree.TreeNode
  134. key={item.name}
  135. title={() => {
  136. return (
  137. <div className={styles.treeTitle}>
  138. <div className={styles.title}>
  139. <Tooltip title={item.name}>{item.name}</Tooltip>
  140. </div>
  141. </div>
  142. );
  143. }}
  144. />
  145. ))}
  146. </Tree.TreeNode>
  147. </Tree>
  148. </div>
  149. </div>
  150. <div className={styles.right}>
  151. {defaultSelectedKeys.length && !!defaultSelectedKeys[0] ? (
  152. <EditTable
  153. table={{ id, table: defaultSelectedKeys[0] }}
  154. data={tableList}
  155. onChange={(data: any) => {
  156. saveTables(defaultSelectedKeys[0], data);
  157. }}
  158. />
  159. ) : (
  160. <Empty />
  161. )}
  162. </div>
  163. </div>
  164. </Card>
  165. </Spin>
  166. {visible && (
  167. <DataTable
  168. data={{}}
  169. save={(data) => {
  170. const list = [...rdbList];
  171. list.unshift(data);
  172. setAllList([...list]);
  173. setDefaultSelectedKeys([data.name]);
  174. setTableList([]);
  175. setVisible(false);
  176. }}
  177. close={() => {
  178. setVisible(false);
  179. }}
  180. />
  181. )}
  182. </PageContainer>
  183. );
  184. };
  185. export default Management;