diff --git a/packages/web/src/icons/FontIcon.svelte b/packages/web/src/icons/FontIcon.svelte index 95feb253f..084ef9b7b 100644 --- a/packages/web/src/icons/FontIcon.svelte +++ b/packages/web/src/icons/FontIcon.svelte @@ -148,6 +148,7 @@ 'icon parent-filter-outline': 'mdi mdi-home-alert-outline', 'icon download': 'mdi mdi-download', 'icon text': 'mdi mdi-text', + 'icon ai': 'mdi mdi-head-lightbulb', 'icon run': 'mdi mdi-play', 'icon chevron-down': 'mdi mdi-chevron-down', diff --git a/packages/web/src/tabs/QueryTab.svelte b/packages/web/src/tabs/QueryTab.svelte index b8198c89b..f01692cac 100644 --- a/packages/web/src/tabs/QueryTab.svelte +++ b/packages/web/src/tabs/QueryTab.svelte @@ -12,6 +12,15 @@ testEnabled: () => getCurrentEditor()?.isSqlEditor(), onClick: () => getCurrentEditor().formatCode(), }); + registerCommand({ + id: 'query.switchAiAssistant', + category: 'Query', + name: 'AI Assistant', + keyText: 'Shift+Alt+A', + icon: 'icon ai', + testEnabled: () => isProApp(), + onClick: () => getCurrentEditor().toggleAiAssistant(), + }); registerCommand({ id: 'query.insertSqlJoin', category: 'Query', @@ -89,6 +98,8 @@ import ToolStripDropDownButton from '../buttons/ToolStripDropDownButton.svelte'; import { extractQueryParameters, replaceQueryParameters } from 'dbgate-query-splitter'; import QueryParametersModal from '../modals/QueryParametersModal.svelte'; + import { isProApp } from '../utility/proTools'; + import HorizontalSplitter from '../elements/HorizontalSplitter.svelte'; export let tabid; export let conid; @@ -137,6 +148,7 @@ let domEditor; let domToolStrip; let intervalId; + let isAiAssistantVisible = false; onMount(() => { intervalId = setInterval(() => { @@ -210,6 +222,10 @@ visibleResultTabs = !visibleResultTabs; } + export function toggleAiAssistant() { + isAiAssistantVisible = !isAiAssistantVisible; + } + function getParameterSplitterOptions() { if (!queryParameterStyle) { return null; @@ -401,6 +417,7 @@ { command: 'query.replace' }, { divider: true }, { command: 'query.toggleVisibleResultTabs' }, + { command: 'query.switchAiAssistant', hideDisabled: true }, ]; } @@ -423,73 +440,80 @@ - + - {#if driver?.databaseEngineTypes?.includes('sql')} - { - setEditorData(e.detail); - if (isInitialized) { - markTabUnsaved(tabid); - } - errorMessages = []; - }} - on:focus={() => { - activator.activate(); - domToolStrip?.activate(); - invalidateCommands(); - setTimeout(() => { - isInitialized = true; - }, 100); - }} - bind:this={domEditor} - onExecuteFragment={(sql, startLine) => executeCore(sql, startLine)} - {errorMessages} - /> - {:else} - setEditorData(e.detail)} - on:focus={() => { - activator.activate(); - domToolStrip?.activate(); - invalidateCommands(); - }} - bind:this={domEditor} - /> - {/if} + + + {#if driver?.databaseEngineTypes?.includes('sql')} + { + setEditorData(e.detail); + if (isInitialized) { + markTabUnsaved(tabid); + } + errorMessages = []; + }} + on:focus={() => { + activator.activate(); + domToolStrip?.activate(); + invalidateCommands(); + setTimeout(() => { + isInitialized = true; + }, 100); + }} + bind:this={domEditor} + onExecuteFragment={(sql, startLine) => executeCore(sql, startLine)} + {errorMessages} + /> + {:else} + setEditorData(e.detail)} + on:focus={() => { + activator.activate(); + domToolStrip?.activate(); + invalidateCommands(); + }} + bind:this={domEditor} + /> + {/if} + + + + + + + + + - - - - - +
AI Assistant
-
+ @@ -511,6 +535,7 @@ icon="icon at" title="Query parameter style" /> +