1- import React , { memo , useState } from 'react' ;
1+ import React , { memo , useContext , useEffect , useState } from 'react' ;
22import styles from './index.less' ;
33import classnames from 'classnames' ;
44import { MenuOutlined } from '@ant-design/icons' ;
55import type { DragEndEvent } from '@dnd-kit/core' ;
66import { DndContext } from '@dnd-kit/core' ;
77import { restrictToVerticalAxis } from '@dnd-kit/modifiers' ;
8+ import { Table , InputNumber , Input , Form , Select , Checkbox , Button } from 'antd' ;
9+ import { v4 as uuidv4 } from 'uuid' ;
810import {
911 arrayMove ,
1012 SortableContext ,
1113 useSortable ,
1214 verticalListSortingStrategy ,
1315} from '@dnd-kit/sortable' ;
1416import { CSS } from '@dnd-kit/utilities' ;
15- import { Table , InputNumber , Input , Form , Select , Checkbox , Button } from 'antd' ;
16- import { v4 as uuidv4 } from 'uuid'
17-
18- interface IProps {
19- className ?: string ;
20- }
21-
22- // 数据库字段类型 枚举
23- enum DatabaseFieldType {
24- // 数字
25- Number = 'number' ,
26- // 字符串
27- String = 'string' ,
28- // 日期
29- Date = 'date' ,
30- // 布尔
31- Boolean = 'boolean' ,
32- // 二进制
33- Binary = 'binary' ,
34- // 对象
35- Object = 'object' ,
36- }
37-
38- const databaseFieldTypeList = [ DatabaseFieldType [ 'Number' ] , DatabaseFieldType [ 'String' ] , DatabaseFieldType [ 'Date' ] , DatabaseFieldType [ 'Boolean' ] , DatabaseFieldType [ 'Binary' ] , DatabaseFieldType [ 'Object' ] ]
17+ import sqlService from '@/service/sql' ;
18+ import { Context } from '../index'
3919
4020interface Item {
4121 key : string ;
4222 columnName : string ;
4323 length : number | null ;
44- fieldType : DatabaseFieldType ;
24+ fieldType : string | null ;
25+ nullable : boolean ;
4526}
4627
47- const mockData : Item [ ] = [
48- {
49- key : uuidv4 ( ) ,
50- columnName : 'John Brown' ,
51- length : 32 ,
52- fieldType : DatabaseFieldType . Binary ,
53- } ,
54- {
55- key : uuidv4 ( ) ,
56- columnName : 'Jim Green' ,
57- length : 42 ,
58- fieldType : DatabaseFieldType . Number ,
59- } ,
60- {
61- key : uuidv4 ( ) ,
62- columnName : 'Joe Black' ,
63- length : 32 ,
64- fieldType : DatabaseFieldType . String ,
65- } ,
66- ]
67-
6828interface RowProps extends React . HTMLAttributes < HTMLTableRowElement > {
6929 'data-row-key' : string ;
7030}
@@ -109,10 +69,12 @@ const Row = ({ children, ...props }: RowProps) => {
10969 ) ;
11070} ;
11171
112- const ColumnList : React . FC = ( ) => {
113- const [ dataSource , setDataSource ] = useState < Item [ ] > ( mockData ) ;
72+ const ColumnList = memo ( ( ) => {
73+ const { dataSourceId, databaseName, tableDetails } = useContext ( Context ) ;
74+ const [ dataSource , setDataSource ] = useState < Item [ ] > ( [ ] ) ;
11475 const [ form ] = Form . useForm ( ) ;
11576 const [ editingKey , setEditingKey ] = useState ( '' ) ;
77+ const [ databaseFieldTypeList , setDatabaseFieldTypeList ] = useState < string [ ] > ( [ ] )
11678
11779 const isEditing = ( record : Item ) => record . key === editingKey ;
11880
@@ -121,6 +83,31 @@ const ColumnList: React.FC = () => {
12183 setEditingKey ( record . key ) ;
12284 } ;
12385
86+ useEffect ( ( ) => {
87+ if ( tableDetails ) {
88+ const list = tableDetails ?. columnList ?. map ( t => {
89+ return {
90+ key : uuidv4 ( ) ,
91+ columnName : t . name ,
92+ length : t . dataType ,
93+ fieldType : t . columnType ,
94+ nullable : t . nullable === 0 ,
95+ comment : t . comment ,
96+ }
97+ } ) || [ ]
98+ setDataSource ( list )
99+ }
100+ } , [ tableDetails ] )
101+
102+ useEffect ( ( ) => {
103+ sqlService . getDatabaseFieldTypeList ( {
104+ dataSourceId,
105+ databaseName,
106+ } ) . then ( res => {
107+ setDatabaseFieldTypeList ( res . map ( i => i . typeName ) )
108+ } )
109+ } , [ ] )
110+
124111 const columns = [
125112 {
126113 key : 'sort' ,
@@ -200,23 +187,24 @@ const ColumnList: React.FC = () => {
200187 {
201188 title : 'nullable' ,
202189 dataIndex : 'nullable' ,
203- render : ( text : string , record : Item ) => {
190+ width : '100px' ,
191+ render : ( text : boolean , record : Item ) => {
204192 return < Form . Item
205- name = "fieldType "
193+ name = "nullable "
206194 style = { { margin : 0 } }
207195 >
208- < Checkbox />
196+ < Checkbox checked = { text } />
209197 </ Form . Item >
210198 }
211199 } ,
212200 {
213- title : 'annotation ' ,
214- dataIndex : 'annotation ' ,
201+ title : 'comment ' ,
202+ dataIndex : 'comment ' ,
215203 render : ( text : string , record : Item ) => {
216204 const editable = isEditing ( record ) ;
217205 return editable ? (
218206 < Form . Item
219- name = "annotation "
207+ name = "comment "
220208 style = { { margin : 0 } }
221209 >
222210 < Input />
@@ -261,7 +249,8 @@ const ColumnList: React.FC = () => {
261249 key : uuidv4 ( ) ,
262250 columnName : '' ,
263251 length : null ,
264- fieldType : DatabaseFieldType . String ,
252+ fieldType : null ,
253+ nullable : false ,
265254 }
266255 setDataSource ( [ ...dataSource , newData ] )
267256 edit ( newData )
@@ -296,35 +285,38 @@ const ColumnList: React.FC = () => {
296285 }
297286
298287 return (
299- < div className = ' box' >
288+ < div className = { styles . box } >
300289 < div className = { styles . columnListHeader } >
301290 < Button onClick = { addData } > 新增</ Button >
302291 < Button onClick = { deleteData } > 删除</ Button >
303292 < Button onClick = { moveData . bind ( null , 'up' ) } > 上移</ Button >
304293 < Button onClick = { moveData . bind ( null , 'down' ) } > 下移</ Button >
305294 </ div >
306- < Form form = { form } onChange = { formChange } >
307- < DndContext modifiers = { [ restrictToVerticalAxis ] } onDragEnd = { onDragEnd } >
308- < SortableContext
309- items = { dataSource . map ( ( i ) => i . key ) }
310- strategy = { verticalListSortingStrategy }
311- >
312- < Table
313- components = { {
314- body : {
315- row : Row ,
316- } ,
317- } }
318- pagination = { false }
319- rowKey = "key"
320- columns = { columns }
321- dataSource = { dataSource }
322- />
323- </ SortableContext >
324- </ DndContext >
325- </ Form >
295+ < div className = { styles . tableBox } >
296+ < Form form = { form } onChange = { formChange } >
297+ < DndContext modifiers = { [ restrictToVerticalAxis ] } onDragEnd = { onDragEnd } >
298+ < SortableContext
299+ items = { dataSource . map ( ( i ) => i . key ) }
300+ strategy = { verticalListSortingStrategy }
301+ >
302+ < Table
303+ components = { {
304+ body : {
305+ row : Row ,
306+ } ,
307+ } }
308+ pagination = { false }
309+ rowKey = "key"
310+ columns = { columns as any }
311+ dataSource = { dataSource }
312+ />
313+ </ SortableContext >
314+ </ DndContext >
315+ </ Form >
316+ </ div >
326317 </ div >
327318 ) ;
328- } ;
319+ } )
320+
329321
330322export default ColumnList ;
0 commit comments