@@ -58,16 +58,13 @@ const sqlEditor = ref<{
5858} | null >(null );
5959const sqlUploadInput = ref <HTMLInputElement | null >(null );
6060const hasSelection = ref (false );
61- const messageOpen = ref (false );
6261const saveSnippetDialogOpen = ref (false );
6362const selectSnippetDialogOpen = ref (false );
6463const queryPanel = ref <HTMLElement | null >(null );
6564const editorHeightRatio = ref (58 );
6665const resizingQueryPanel = ref (false );
6766const QUERY_PANEL_MIN_RATIO = 20 ;
6867const QUERY_PANEL_RESIZE_STEP = 5 ;
69- const DEFAULT_MESSAGE_CLOSE_DELAY_SECONDS = 5 ;
70- let messageCloseTimer: ReturnType <typeof setTimeout > | null = null ;
7168const toast = useToast ();
7269const { t } = useI18n ();
7370const { addErrorToast } = useErrorToast ();
@@ -273,20 +270,8 @@ async function deleteSqlSnippet(snippet: ChenSqlSnippet) {
273270 }
274271}
275272
276- function clearMessageTimer() {
277- if (messageCloseTimer === null ) return ;
278- clearTimeout (messageCloseTimer );
279- messageCloseTimer = null ;
280- }
281-
282- function dismissMessage() {
283- clearMessageTimer ();
284- messageOpen .value = false ;
285- if (props .tab .message ) emit (" dismissMessage" , props .tab );
286- }
287-
288273function handleMessageOpen(open : boolean ) {
289- if (! open ) dismissMessage ( );
274+ if (! open && props . tab . message ) emit ( " dismissMessage " , props . tab );
290275}
291276
292277function setEditorHeightRatio(ratio : number ) {
@@ -328,24 +313,7 @@ function resizeQueryPanelWithKeyboard(event: KeyboardEvent) {
328313 event .preventDefault ();
329314}
330315
331- watch (
332- () => props .tab .message ,
333- (message ) => {
334- clearMessageTimer ();
335- messageOpen .value = Boolean (message );
336- if (! message ) return ;
337-
338- const closeDelay =
339- typeof message .closeDelay === " number" && message .closeDelay > 0
340- ? message .closeDelay
341- : DEFAULT_MESSAGE_CLOSE_DELAY_SECONDS ;
342- messageCloseTimer = setTimeout (dismissMessage , closeDelay * 1000 );
343- },
344- { immediate: true }
345- );
346-
347316onBeforeUnmount (() => {
348- clearMessageTimer ();
349317 if (! resizingQueryPanel .value ) return ;
350318 document .body .style .cursor = " " ;
351319 document .body .style .userSelect = " " ;
@@ -449,16 +417,6 @@ defineExpose({ editorSnapshot });
449417 <div v-if =" tab.state.loading" class =" absolute inset-0 z-10 grid place-items-center rounded-md bg-default/65" >
450418 <UIcon name="i-lucide-loader-circle" class="size-5 animate-spin text-muted" />
451419 </div >
452- <UAlert
453- v-if =" tab .message && messageOpen "
454- class="absolute bottom-3 left-1/2 z-20 max-h-32 w-3/4 -translate-x-1/2 overflow-y-auto"
455- :color =" messageColor "
456- variant="subtle"
457- :title =" tab .message .title || t (' Chen.Message' )"
458- :description =" tab .message .message "
459- close
460- @update :open =" handleMessageOpen "
461- />
462420 </div >
463421 </div >
464422
@@ -498,6 +456,16 @@ defineExpose({ editorSnapshot });
498456 {{ t("ExecutionPlan.title") }}
499457 </button >
500458 </div >
459+ <div v-if =" tab.message" class =" mx-2 my-2 max-h-32 shrink-0 overflow-y-auto" >
460+ <UAlert
461+ :color =" messageColor "
462+ variant="subtle"
463+ :title =" tab .message .title || t (' Chen.Message' )"
464+ :description =" tab .message .message "
465+ close
466+ @update :open =" handleMessageOpen "
467+ />
468+ </div >
501469 <QueryResultTabs
502470 v-if =" tab .activeBottomPane !== ' plan' "
503471 class="min-h-0 min-w-0 flex-1"
0 commit comments