AI assistant place

This commit is contained in:
SPRINX0\prochazka
2025-02-03 17:38:15 +01:00
parent d2192c4772
commit f62462fcc5
2 changed files with 89 additions and 63 deletions

View File

@@ -148,6 +148,7 @@
'icon parent-filter-outline': 'mdi mdi-home-alert-outline', 'icon parent-filter-outline': 'mdi mdi-home-alert-outline',
'icon download': 'mdi mdi-download', 'icon download': 'mdi mdi-download',
'icon text': 'mdi mdi-text', 'icon text': 'mdi mdi-text',
'icon ai': 'mdi mdi-head-lightbulb',
'icon run': 'mdi mdi-play', 'icon run': 'mdi mdi-play',
'icon chevron-down': 'mdi mdi-chevron-down', 'icon chevron-down': 'mdi mdi-chevron-down',

View File

@@ -12,6 +12,15 @@
testEnabled: () => getCurrentEditor()?.isSqlEditor(), testEnabled: () => getCurrentEditor()?.isSqlEditor(),
onClick: () => getCurrentEditor().formatCode(), 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({ registerCommand({
id: 'query.insertSqlJoin', id: 'query.insertSqlJoin',
category: 'Query', category: 'Query',
@@ -89,6 +98,8 @@
import ToolStripDropDownButton from '../buttons/ToolStripDropDownButton.svelte'; import ToolStripDropDownButton from '../buttons/ToolStripDropDownButton.svelte';
import { extractQueryParameters, replaceQueryParameters } from 'dbgate-query-splitter'; import { extractQueryParameters, replaceQueryParameters } from 'dbgate-query-splitter';
import QueryParametersModal from '../modals/QueryParametersModal.svelte'; import QueryParametersModal from '../modals/QueryParametersModal.svelte';
import { isProApp } from '../utility/proTools';
import HorizontalSplitter from '../elements/HorizontalSplitter.svelte';
export let tabid; export let tabid;
export let conid; export let conid;
@@ -137,6 +148,7 @@
let domEditor; let domEditor;
let domToolStrip; let domToolStrip;
let intervalId; let intervalId;
let isAiAssistantVisible = false;
onMount(() => { onMount(() => {
intervalId = setInterval(() => { intervalId = setInterval(() => {
@@ -210,6 +222,10 @@
visibleResultTabs = !visibleResultTabs; visibleResultTabs = !visibleResultTabs;
} }
export function toggleAiAssistant() {
isAiAssistantVisible = !isAiAssistantVisible;
}
function getParameterSplitterOptions() { function getParameterSplitterOptions() {
if (!queryParameterStyle) { if (!queryParameterStyle) {
return null; return null;
@@ -401,6 +417,7 @@
{ command: 'query.replace' }, { command: 'query.replace' },
{ divider: true }, { divider: true },
{ command: 'query.toggleVisibleResultTabs' }, { command: 'query.toggleVisibleResultTabs' },
{ command: 'query.switchAiAssistant', hideDisabled: true },
]; ];
} }
@@ -423,73 +440,80 @@
</script> </script>
<ToolStripContainer bind:this={domToolStrip}> <ToolStripContainer bind:this={domToolStrip}>
<VerticalSplitter isSplitter={visibleResultTabs}> <HorizontalSplitter isSplitter={isAiAssistantVisible} initialSizeRight={300}>
<svelte:fragment slot="1"> <svelte:fragment slot="1">
{#if driver?.databaseEngineTypes?.includes('sql')} <VerticalSplitter isSplitter={visibleResultTabs}>
<SqlEditor <svelte:fragment slot="1">
engine={$connection && $connection.engine} {#if driver?.databaseEngineTypes?.includes('sql')}
{conid} <SqlEditor
{database} engine={$connection && $connection.engine}
splitterOptions={driver?.getQuerySplitterOptions('editor')} {conid}
options={{ {database}
wrap: enableWrap, splitterOptions={driver?.getQuerySplitterOptions('editor')}
}} options={{
value={$editorState.value || ''} wrap: enableWrap,
menu={createMenu()} }}
on:input={e => { value={$editorState.value || ''}
setEditorData(e.detail); menu={createMenu()}
if (isInitialized) { on:input={e => {
markTabUnsaved(tabid); setEditorData(e.detail);
} if (isInitialized) {
errorMessages = []; markTabUnsaved(tabid);
}} }
on:focus={() => { errorMessages = [];
activator.activate(); }}
domToolStrip?.activate(); on:focus={() => {
invalidateCommands(); activator.activate();
setTimeout(() => { domToolStrip?.activate();
isInitialized = true; invalidateCommands();
}, 100); setTimeout(() => {
}} isInitialized = true;
bind:this={domEditor} }, 100);
onExecuteFragment={(sql, startLine) => executeCore(sql, startLine)} }}
{errorMessages} bind:this={domEditor}
/> onExecuteFragment={(sql, startLine) => executeCore(sql, startLine)}
{:else} {errorMessages}
<AceEditor />
mode={driver?.editorMode || 'sql'} {:else}
value={$editorState.value || ''} <AceEditor
splitterOptions={driver?.getQuerySplitterOptions('editor')} mode={driver?.editorMode || 'sql'}
options={{ value={$editorState.value || ''}
wrap: enableWrap, splitterOptions={driver?.getQuerySplitterOptions('editor')}
}} options={{
menu={createMenu()} wrap: enableWrap,
on:input={e => setEditorData(e.detail)} }}
on:focus={() => { menu={createMenu()}
activator.activate(); on:input={e => setEditorData(e.detail)}
domToolStrip?.activate(); on:focus={() => {
invalidateCommands(); activator.activate();
}} domToolStrip?.activate();
bind:this={domEditor} invalidateCommands();
/> }}
{/if} bind:this={domEditor}
/>
{/if}
</svelte:fragment>
<svelte:fragment slot="2">
<ResultTabs tabs={[{ label: 'Messages', slot: 0 }]} {sessionId} {executeNumber} bind:resultCount {driver}>
<svelte:fragment slot="0">
<SocketMessageView
eventName={sessionId ? `session-info-${sessionId}` : null}
onMessageClick={handleMesageClick}
{executeNumber}
startLine={executeStartLine}
showProcedure
showLine
onChangeErrors={handleChangeErrors}
/>
</svelte:fragment>
</ResultTabs>
</svelte:fragment>
</VerticalSplitter>
</svelte:fragment> </svelte:fragment>
<svelte:fragment slot="2"> <svelte:fragment slot="2">
<ResultTabs tabs={[{ label: 'Messages', slot: 0 }]} {sessionId} {executeNumber} bind:resultCount {driver}> <div>AI Assistant</div>
<svelte:fragment slot="0">
<SocketMessageView
eventName={sessionId ? `session-info-${sessionId}` : null}
onMessageClick={handleMesageClick}
{executeNumber}
startLine={executeStartLine}
showProcedure
showLine
onChangeErrors={handleChangeErrors}
/>
</svelte:fragment>
</ResultTabs>
</svelte:fragment> </svelte:fragment>
</VerticalSplitter> </HorizontalSplitter>
<svelte:fragment slot="toolstrip"> <svelte:fragment slot="toolstrip">
<ToolStripCommandSplitButton commands={['query.execute', 'query.executeCurrent']} /> <ToolStripCommandSplitButton commands={['query.execute', 'query.executeCurrent']} />
<ToolStripCommandButton command="query.kill" /> <ToolStripCommandButton command="query.kill" />
@@ -511,6 +535,7 @@
icon="icon at" icon="icon at"
title="Query parameter style" title="Query parameter style"
/> />
<ToolStripCommandButton command="query.switchAiAssistant" hideDisabled />
</svelte:fragment> </svelte:fragment>
</ToolStripContainer> </ToolStripContainer>