@@ -27,7 +27,6 @@ import styled from "styled-components"
27
27
import { Tree } from "../../../components"
28
28
import { TreeNode , TreeNodeRenderParams , Text } from "../../../components"
29
29
import { ContextMenu , ContextMenuTrigger , ContextMenuContent , MenuItem } from "../../../components/ContextMenu"
30
- import { color } from "../../../utils"
31
30
import * as QuestDB from "../../../utils/questdb"
32
31
import Row from "../Row"
33
32
import { useDispatch } from "react-redux"
@@ -37,6 +36,7 @@ import { NotificationType } from "../../../types"
37
36
import { TreeNodeKind } from "../../../components/Tree"
38
37
import { SuspensionDialog } from '../SuspensionDialog'
39
38
import { FileCopy , Restart } from "@styled-icons/remix-line"
39
+ import { getTableExpanded , setMatViewExpanded , setTableExpanded , getFolderExpanded , setFolderExpanded } from "../localStorageUtils"
40
40
41
41
type Props = QuestDB . Table &
42
42
Readonly < {
@@ -47,8 +47,11 @@ type Props = QuestDB.Table &
47
47
walTableData ?: QuestDB . WalTable
48
48
matViewData ?: QuestDB . MaterializedView
49
49
selected : boolean
50
+ onSelectToggle : ( { name, type} : { name : string , type : TreeNodeKind } ) => void
50
51
selectOpen : boolean
51
- onSelectToggle : ( { name, type} : { name : string , type : TreeNodeKind } ) => void
52
+ cachedColumns ?: QuestDB . Column [ ]
53
+ onCacheColumns ?: ( columns : QuestDB . Column [ ] ) => void
54
+ onClearColumnsCache ?: ( tableName : string ) => void
52
55
} >
53
56
54
57
const Title = styled ( Row ) `
@@ -104,18 +107,29 @@ const Table = ({
104
107
matViewData,
105
108
dedup,
106
109
selected,
107
- selectOpen,
108
110
onSelectToggle,
111
+ selectOpen,
109
112
matView,
113
+ cachedColumns,
114
+ onCacheColumns,
115
+ onClearColumnsCache,
110
116
} : Props ) => {
111
117
const { quest } = useContext ( QuestContext )
112
118
const dispatch = useDispatch ( )
113
119
const [ suspensionDialogOpen , setSuspensionDialogOpen ] = useState ( false )
114
120
115
121
const showColumns = async ( name : string ) => {
116
122
try {
123
+ if ( cachedColumns ) {
124
+ return {
125
+ type : QuestDB . Type . DQL ,
126
+ data : cachedColumns
127
+ } ;
128
+ }
129
+
117
130
const response = await quest . showColumns ( name )
118
131
if ( response && response . type === QuestDB . Type . DQL ) {
132
+ onCacheColumns ?.( response . data ) ;
119
133
return response
120
134
}
121
135
} catch ( error : any ) {
@@ -164,6 +178,7 @@ const Table = ({
164
178
{
165
179
name : table_name ,
166
180
kind : matView ? 'matview' : 'table' ,
181
+ initiallyOpen : getTableExpanded ( table_name ) ,
167
182
render : ( { toggleOpen, isOpen, isLoading } ) => {
168
183
return (
169
184
< ContextMenu >
@@ -174,7 +189,15 @@ const Table = ({
174
189
table_id = { id }
175
190
name = { table_name }
176
191
baseTable = { matViewData ?. base_table_name }
177
- onClick = { toggleOpen }
192
+ onClick = { ( ) => {
193
+ toggleOpen ( )
194
+ if ( matView ) {
195
+ setMatViewExpanded ( table_name , ! isOpen )
196
+ } else {
197
+ setTableExpanded ( table_name , ! isOpen )
198
+ }
199
+ onClearColumnsCache ?.( table_name ) ;
200
+ } }
178
201
isLoading = { isLoading }
179
202
selectOpen = { selectOpen }
180
203
selected = { selected }
@@ -198,7 +221,6 @@ const Table = ({
198
221
{ walTableData ?. suspended && (
199
222
< MenuItem
200
223
data-hook = "table-context-menu-resume-wal"
201
- // Suspension dialog & context menu modifies pointer events -- to prevent a race condition
202
224
onClick = { ( ) => setTimeout ( ( ) => setSuspensionDialogOpen ( true ) ) }
203
225
icon = { < Restart size = { 14 } /> }
204
226
>
@@ -212,7 +234,7 @@ const Table = ({
212
234
async onOpen ( { setChildren } ) {
213
235
const columns : TreeNode = {
214
236
name : "Columns" ,
215
- initiallyOpen : true ,
237
+ initiallyOpen : getFolderExpanded ( matView ? 'matview' : 'table' , table_name , "Columns" ) ,
216
238
async onOpen ( { setChildren } ) {
217
239
const response = await showColumns ( table_name )
218
240
@@ -243,21 +265,26 @@ const Table = ({
243
265
kind = "folder"
244
266
table_id = { id }
245
267
name = "Columns"
246
- onClick = { ( ) => toggleOpen ( ) }
268
+ onClick = { ( ) => {
269
+ setFolderExpanded ( matView ? 'matview' : 'table' , table_name , "Columns" , isOpen ? false : true ) ;
270
+ onClearColumnsCache ?.( table_name ) ;
271
+ toggleOpen ( ) ;
272
+ } }
247
273
isLoading = { isLoading }
248
274
/>
249
275
)
250
276
} ,
251
277
}
252
278
253
279
const storageDetails : TreeNode = {
254
- name : 'Storage Details ' ,
280
+ name : 'Storage details ' ,
255
281
kind : 'folder' ,
282
+ initiallyOpen : getFolderExpanded ( matView ? 'matview' : 'table' , table_name , "Storage details" ) ,
256
283
async onOpen ( { setChildren } ) {
257
284
const details = [
258
285
{
259
- name : 'WAL Enabled ' ,
260
- value : walEnabled ? 'Yes ' : 'No ' ,
286
+ name : 'WAL' ,
287
+ value : walEnabled ? 'Enabled ' : 'Disabled ' ,
261
288
} ,
262
289
{
263
290
name : 'Partitioning' ,
@@ -276,7 +303,10 @@ const Table = ({
276
303
expanded = { isOpen && ! isLoading }
277
304
table_id = { id }
278
305
name = "Storage details"
279
- onClick = { ( ) => toggleOpen ( ) }
306
+ onClick = { ( ) => {
307
+ setFolderExpanded ( matView ? 'matview' : 'table' , table_name , "Storage details" , isOpen ? false : true ) ;
308
+ toggleOpen ( ) ;
309
+ } }
280
310
isLoading = { isLoading }
281
311
/>
282
312
)
@@ -286,6 +316,7 @@ const Table = ({
286
316
const baseTables : TreeNode [ ] = matViewData ? [ {
287
317
name : 'Base tables' ,
288
318
kind : 'folder' ,
319
+ initiallyOpen : getFolderExpanded ( "matview" , table_name , "Base tables" ) ,
289
320
async onOpen ( { setChildren } ) {
290
321
setChildren ( [ {
291
322
name : matViewData . base_table_name ,
@@ -299,7 +330,10 @@ const Table = ({
299
330
expanded = { isOpen && ! isLoading }
300
331
table_id = { id }
301
332
name = "Base tables"
302
- onClick = { ( ) => toggleOpen ( ) }
333
+ onClick = { ( ) => {
334
+ setFolderExpanded ( "matview" , table_name , "Base tables" , isOpen ? false : true ) ;
335
+ toggleOpen ( ) ;
336
+ } }
303
337
isLoading = { isLoading }
304
338
/>
305
339
)
0 commit comments