@@ -16,6 +16,7 @@ import { useContextMenu } from 'renderer/contexts/ContextMenuProvider';
1616import SqlTableSchemaTab from 'renderer/screens/DatabaseScreen/SqlTableSchemaTab' ;
1717import Layout from '../Layout' ;
1818import DatabaseSelection from './DatabaseSelection' ;
19+ import ListViewEmptyState from '../ListView/ListViewEmptyState' ;
1920
2021export default function DatabaseTableList ( ) {
2122 const { schema, currentDatabase } = useSchmea ( ) ;
@@ -27,9 +28,11 @@ export default function DatabaseTableList() {
2728 } >
2829 > ( ) ;
2930 const { newWindow } = useWindowTab ( ) ;
30- const [ collapsed , setCollapsed ] = useState < string [ ] | undefined > (
31- currentDatabase ? [ `database/${ currentDatabase } ` ] : [ ]
32- ) ;
31+ const [ collapsed , setCollapsed ] = useState < string [ ] | undefined > ( [
32+ 'tables' ,
33+ 'events' ,
34+ 'triggers' ,
35+ ] ) ;
3336
3437 const { handleContextMenu } = useContextMenu ( ( ) => {
3538 const tableName = selected ?. data ?. name ;
@@ -71,65 +74,61 @@ export default function DatabaseTableList() {
7174
7275 const schemaListItem = useMemo ( ( ) => {
7376 if ( ! schema ) return [ ] ;
77+ if ( ! currentDatabase ) return [ ] ;
7478
75- return Object . values ( schema ) . map ( ( database ) => {
76- let children = Object . values ( database . tables ) . map ( ( table ) => ( {
77- id : `database/${ database . name } /table/${ table . name } ` ,
78- text : table . name ,
79- icon :
80- table . type === 'TABLE' ? (
81- < FontAwesomeIcon icon = { faTableList } color = "#3498db" />
82- ) : (
83- < FontAwesomeIcon icon = { faEye } color = "#e67e22" />
84- ) ,
85- data : {
86- name : table . name ,
87- type : table . type === 'TABLE' ? 'table' : 'view' ,
88- database : database . name ,
89- } ,
90- } ) ) ;
91-
92- if ( database . events . length > 0 ) {
93- children = children . concat (
94- database . events . map ( ( event ) => ( {
95- id : `database/${ database . name } /event/${ event } ` ,
96- text : event ,
97- icon : < FontAwesomeIcon icon = { faCalendar } color = "#27ae60" /> ,
98- data : {
99- name : event ,
100- type : 'event' ,
101- database : database . name ,
102- } ,
103- } ) )
104- ) ;
105- }
79+ const currentDatabaseSchema = schema [ currentDatabase ] ;
80+ if ( ! currentDatabaseSchema ) return [ ] ;
10681
107- if ( database . triggers . length > 0 ) {
108- children = children . concat (
109- database . triggers . map ( ( trigger ) => ( {
110- id : `database/${ database . name } /trigger/${ trigger } ` ,
111- text : trigger ,
112- icon : < FontAwesomeIcon icon = { faGear } color = "#bdc3c7" /> ,
113- data : {
114- name : trigger ,
115- database : database . name ,
116- type : 'trigger' ,
117- } ,
118- } ) )
119- ) ;
120- }
121-
122- children . sort ( ( item1 , item2 ) => {
123- return item1 . text . localeCompare ( item2 . text ) ;
124- } ) ;
125-
126- return {
127- id : `database/${ database . name } ` ,
128- text : database . name ,
129- children,
130- } ;
131- } ) ;
132- } , [ schema ] ) ;
82+ return [
83+ {
84+ id : 'tables' ,
85+ text : `Tables (${ Object . values ( currentDatabaseSchema . tables ) . length } )` ,
86+ children : Object . values ( currentDatabaseSchema . tables ) . map ( ( table ) => ( {
87+ id : `table/${ table . name } ` ,
88+ text : table . name ,
89+ icon :
90+ table . type === 'TABLE' ? (
91+ < FontAwesomeIcon icon = { faTableList } color = "#3498db" />
92+ ) : (
93+ < FontAwesomeIcon icon = { faEye } color = "#e67e22" />
94+ ) ,
95+ data : {
96+ name : table . name ,
97+ type : table . type === 'TABLE' ? 'table' : 'view' ,
98+ database : currentDatabase ,
99+ } ,
100+ } ) ) ,
101+ } ,
102+ {
103+ id : 'events' ,
104+ text : `Events (${ currentDatabaseSchema . events . length } )` ,
105+ children : currentDatabaseSchema . events . map ( ( event ) => ( {
106+ id : `event/${ event } ` ,
107+ text : event ,
108+ icon : < FontAwesomeIcon icon = { faCalendar } color = "#27ae60" /> ,
109+ data : {
110+ name : event ,
111+ type : 'event' ,
112+ database : currentDatabase ,
113+ } ,
114+ } ) ) ,
115+ } ,
116+ {
117+ id : 'triggers' ,
118+ text : `Triggers (${ currentDatabaseSchema . triggers . length } )` ,
119+ children : currentDatabaseSchema . triggers . map ( ( trigger ) => ( {
120+ id : `trigger/${ trigger } ` ,
121+ text : trigger ,
122+ icon : < FontAwesomeIcon icon = { faGear } color = "#bdc3c7" /> ,
123+ data : {
124+ name : trigger ,
125+ database : currentDatabase ,
126+ type : 'trigger' ,
127+ } ,
128+ } ) ) ,
129+ } ,
130+ ] ;
131+ } , [ schema , currentDatabase ] ) ;
133132
134133 if ( ! schema ) return < div /> ;
135134
@@ -140,33 +139,36 @@ export default function DatabaseTableList() {
140139 < DatabaseSelection />
141140 </ Layout . Fixed >
142141 < Layout . Grow >
143- < TreeView
144- selected = { selected }
145- onSelectChange = { setSelected }
146- collapsedKeys = { collapsed }
147- onCollapsedChange = { setCollapsed }
148- onContextMenu = { handleContextMenu }
149- onDoubleClick = { ( item ) => {
150- const tableName = item . data ?. name ;
151- const type = item . data ?. type ;
152- if ( ( type === 'table' || type === 'view' ) && tableName ) {
153- newWindow ( `SELECT ${ tableName } ` , ( key , name ) => (
154- < QueryWindow
155- initialSql = { new QueryBuilder ( 'mysql' )
156- . table ( tableName )
157- . limit ( 200 )
158- . toRawSQL ( ) }
159- initialRun
160- tabKey = { key }
161- name = { name }
162- />
163- ) ) ;
164- }
165- } }
166- items = { schemaListItem }
167- />
142+ { currentDatabase ? (
143+ < TreeView
144+ selected = { selected }
145+ onSelectChange = { setSelected }
146+ collapsedKeys = { collapsed }
147+ onCollapsedChange = { setCollapsed }
148+ onContextMenu = { handleContextMenu }
149+ onDoubleClick = { ( item ) => {
150+ const tableName = item . data ?. name ;
151+ const type = item . data ?. type ;
152+ if ( ( type === 'table' || type === 'view' ) && tableName ) {
153+ newWindow ( `SELECT ${ tableName } ` , ( key , name ) => (
154+ < QueryWindow
155+ initialSql = { new QueryBuilder ( 'mysql' )
156+ . table ( tableName )
157+ . limit ( 200 )
158+ . toRawSQL ( ) }
159+ initialRun
160+ tabKey = { key }
161+ name = { name }
162+ />
163+ ) ) ;
164+ }
165+ } }
166+ items = { schemaListItem }
167+ />
168+ ) : (
169+ < ListViewEmptyState text = "Please select database to see tables, events, triggers, etc..." />
170+ ) }
168171 </ Layout . Grow >
169- < Layout . Fixed > Footer</ Layout . Fixed >
170172 </ Layout >
171173 </ div >
172174 ) ;
0 commit comments