@@ -10,7 +10,6 @@ import {
1010 Download ,
1111 Eye ,
1212 FileText ,
13- History ,
1413 Info ,
1514 MoreHorizontal ,
1615 Play ,
@@ -30,7 +29,9 @@ import {
3029} from '../components/Filtre.tsx'
3130import { effect , Signal } from '@preact/signals'
3231import { api } from '../lib/api.ts'
33- import { QueryHistory } from '../components/QueryHistory.tsx'
32+ import { QueryHistory , QueryHistoryItem } from '../components/QueryHistory.tsx'
33+ import { jsx } from 'preact/compat/jsx-dev-runtime'
34+ import { JSX } from 'preact'
3435
3536type AnyRecord = Record < string , unknown >
3637
@@ -50,7 +51,7 @@ const comparators = {
5051
5152const tableData = api [ 'POST/api/deployment/table/data' ] . signal ( )
5253const querier = api [ 'GET/api/deployment/query' ] . signal ( )
53- const queriesHistory = new Signal < AnyRecord > (
54+ export const queriesHistory = new Signal < Record < string , QueryHistoryItem > > (
5455 JSON . parse ( localStorage . getItem ( 'savedQueries' ) || '{}' ) ,
5556)
5657type Order = 'ASC' | 'DESC'
@@ -112,18 +113,19 @@ effect(() => {
112113 }
113114} )
114115
115- const onRun = ( ) => {
116+ export const onRun = ( query ?: string ) => {
116117 if ( querier . pending ) return
117118 const { dep, tab, q } = url . params
118- if ( dep && tab === 'queries' && q ) {
119- querier . fetch ( { deployment : dep , sql : q } )
119+ if ( dep && tab === 'queries' && ( query || q ) ) {
120+ querier . fetch ( { deployment : dep , sql : query || q || '' } )
120121 }
121122}
122123
123124function sha ( message : string ) {
124125 const data = new TextEncoder ( ) . encode ( message )
125126 return crypto . subtle . digest ( 'SHA-1' , data )
126127}
128+
127129function hashQuery ( query : string ) {
128130 const hash = sha ( query ) . then ( ( hashBuffer ) => {
129131 const hashArray = Array . from ( new Uint8Array ( hashBuffer ) )
@@ -138,10 +140,14 @@ function hashQuery(query: string) {
138140const onSave = ( ) => {
139141 const query = ( url . params . q || '' ) . trim ( )
140142 if ( query ) {
141- console . log ( 'queryHash' , queryHash . value )
142-
143143 if ( ! queryHash . value ) return
144- queriesHistory . value = { ...queriesHistory . value , [ queryHash . value ] : query }
144+ queriesHistory . value = {
145+ ...queriesHistory . value ,
146+ [ queryHash . value ] : {
147+ query,
148+ timestamp : new Date ( ) . toISOString ( ) ,
149+ } ,
150+ }
145151 }
146152}
147153
@@ -434,11 +440,14 @@ export function Header() {
434440 </ div >
435441 < div class = 'flex-none' >
436442 < label
437- htmlFor = 'my-drawer-4'
443+ htmlFor = 'drawer-right'
444+ onClick = { ( ) => {
445+ drawerTab . value = 'history'
446+ } }
438447 class = 'btn btn-outline btn-xs md:btn-sm drawer-button'
439448 >
440- < History class = 'h-4 w-4 mr-2' />
441- < span class = 'hidden sm:inline' > History </ span >
449+ < FileText class = 'h-4 w-4 mr-2' />
450+ < span class = 'hidden sm:inline' > Saved Queries </ span >
442451 </ label >
443452 </ div >
444453 </ div >
@@ -669,7 +678,7 @@ export function TabNavigation({
669678 ) }
670679 { activeTab !== 'logs' && (
671680 < label
672- onClick = { activeTab === 'queries' ? onRun : undefined }
681+ onClick = { activeTab === 'queries' ? ( ) => onRun ( ) : undefined }
673682 htmlFor = { activeTab === 'tables' ? 'my-drawer-4' : undefined }
674683 class = 'btn btn-primary btn-sm'
675684 >
@@ -751,7 +760,7 @@ export function LogsViewer() {
751760 < div class = 'flex-1 min-h-0 overflow-hidden' >
752761 < div class = 'w-full overflow-x-auto overflow-y-auto h-full' >
753762 < table class = 'table table-zebra w-full' >
754- < thead class = 'sticky top-0 z-20 bg-base-100 shadow-sm' >
763+ < thead class = 'sticky top-0 bg-base-100 shadow-sm' >
755764 < tr class = 'border-b border-base-300' >
756765 { logThreads . map ( ( header ) => (
757766 < th
@@ -879,29 +888,37 @@ export function LogsViewer() {
879888 )
880889}
881890
882- const TabViews = {
883- tables : < DataTable /> ,
884- queries : < QueryEditor /> ,
885- logs : < LogsViewer /> ,
886- }
891+ type DrawerTab = 'history'
892+
893+ const drawerTab = new Signal < DrawerTab > ( 'history' )
894+
895+ const drawerViews : Record < DrawerTab , JSX . Element > = {
896+ history : < QueryHistory /> ,
897+ } as const
887898
888899const Drawer = ( ) => (
889900 < div class = 'drawer drawer-end' >
890- < input id = 'my- drawer-4 ' type = 'checkbox' class = 'drawer-toggle' />
901+ < input id = 'drawer-right ' type = 'checkbox' class = 'drawer-toggle' />
891902 < div class = 'drawer-side' >
892903 < label
893- htmlFor = 'my- drawer-4 '
904+ htmlFor = 'drawer-right '
894905 aria-label = 'close sidebar'
895906 class = 'drawer-overlay'
896907 >
897908 </ label >
898909 < div class = 'bg-base-200 text-base-content min-h-full w-96' >
899- < QueryHistory />
910+ { drawerViews [ drawerTab . value ] }
900911 </ div >
901912 </ div >
902913 </ div >
903914)
904915
916+ const TabViews = {
917+ tables : < DataTable /> ,
918+ queries : < QueryEditor /> ,
919+ logs : < LogsViewer /> ,
920+ }
921+
905922export const DeploymentPage = ( ) => {
906923 const tab = ( url . params . tab as 'tables' | 'queries' | 'logs' ) || 'tables'
907924 const view = TabViews [ tab ]
0 commit comments