SYNC: AI assistant

This commit is contained in:
SPRINX0\prochazka
2025-12-10 08:12:48 +01:00
committed by Diflow
parent de6acfa1ce
commit a71129df4b
3 changed files with 55 additions and 30 deletions

View File

@@ -170,6 +170,9 @@
import QueryAiAssistant from '../ai/QueryAiAssistant.svelte'; import QueryAiAssistant from '../ai/QueryAiAssistant.svelte';
import { getCurrentSettings } from '../stores'; import { getCurrentSettings } from '../stores';
import { Messages } from 'openai/resources/chat/completions'; import { Messages } from 'openai/resources/chat/completions';
import WidgetColumnBar from '../widgets/WidgetColumnBar.svelte';
import WidgetsInnerContainer from '../widgets/WidgetsInnerContainer.svelte';
import WidgetColumnBarItem from '../widgets/WidgetColumnBarItem.svelte';
export let tabid; export let tabid;
export let conid; export let conid;
@@ -791,33 +794,44 @@
</VerticalSplitter> </VerticalSplitter>
</svelte:fragment> </svelte:fragment>
<svelte:fragment slot="2"> <svelte:fragment slot="2">
<QueryAiAssistant <WidgetColumnBar>
bind:this={domAiAssistant} <WidgetColumnBarItem
{conid} title={_t('query.AiAssistant', { defaultMessage: 'AI Assistant' })}
{database} onClose={() => {
{driver} isAiAssistantVisible = false;
onClose={() => { }}
isAiAssistantVisible = false; >
}} <WidgetsInnerContainer skipDefineWidth flexContainer>
text={$editorValue} <QueryAiAssistant
getLine={() => domEditor.getEditor().getSelectionRange().start.row} bind:this={domAiAssistant}
onInsertAtCursor={text => { {conid}
const editor = domEditor.getEditor(); {database}
editor.session.insert(editor.getCursorPosition(), text); {driver}
domEditor?.getEditor()?.focus(); onClose={() => {
}} isAiAssistantVisible = false;
getTextOrSelectedText={() => domEditor.getEditor().getSelectedText() || $editorValue} }}
onSetSelectedText={text => { text={$editorValue}
const editor = domEditor.getEditor(); getLine={() => domEditor.getEditor().getSelectionRange().start.row}
if (editor.getSelectedText()) { onInsertAtCursor={text => {
const range = editor.selection.getRange(); const editor = domEditor.getEditor();
editor.session.replace(range, text); editor.session.insert(editor.getCursorPosition(), text);
} else { domEditor?.getEditor()?.focus();
editor.setValue(text); }}
} getTextOrSelectedText={() => domEditor.getEditor().getSelectedText() || $editorValue}
}} onSetSelectedText={text => {
{tabid} const editor = domEditor.getEditor();
/> if (editor.getSelectedText()) {
const range = editor.selection.getRange();
editor.session.replace(range, text);
} else {
editor.setValue(text);
}
}}
{tabid}
/>
</WidgetsInnerContainer>
</WidgetColumnBarItem>
</WidgetColumnBar>
</svelte:fragment> </svelte:fragment>
</HorizontalSplitter> </HorizontalSplitter>
<svelte:fragment slot="toolstrip"> <svelte:fragment slot="toolstrip">
@@ -839,11 +853,17 @@
}, },
})} })}
> >
{queryRowsLimit ? _t('query.limitRows', { defaultMessage: 'Limit {queryRowsLimit} rows', values: { queryRowsLimit } }) : _t('query.unlimitedRows', { defaultMessage: 'Unlimited rows' })}</ToolStripButton {queryRowsLimit
? _t('query.limitRows', { defaultMessage: 'Limit {queryRowsLimit} rows', values: { queryRowsLimit } })
: _t('query.unlimitedRows', { defaultMessage: 'Unlimited rows' })}</ToolStripButton
> >
{/if} {/if}
{#if resultCount == 1} {#if resultCount == 1}
<ToolStripExportButton command="jslTableGrid.export" {quickExportHandlerRef} label={_t('export.result', { defaultMessage: 'Export result' })} /> <ToolStripExportButton
command="jslTableGrid.export"
{quickExportHandlerRef}
label={_t('export.result', { defaultMessage: 'Export result' })}
/>
{/if} {/if}
<ToolStripDropDownButton <ToolStripDropDownButton
menu={() => menu={() =>

View File

@@ -10,7 +10,6 @@
import { getLocalStorage, setLocalStorage } from '../utility/storageCache'; import { getLocalStorage, setLocalStorage } from '../utility/storageCache';
export let title; export let title;
export let name;
export let skip = false; export let skip = false;
export let positiveCondition = true; export let positiveCondition = true;
export let height = null; export let height = null;

View File

@@ -4,6 +4,7 @@
export let hideContent = false; export let hideContent = false;
export let fixedWidth = 0; export let fixedWidth = 0;
export let skipDefineWidth = false; export let skipDefineWidth = false;
export let flexContainer = false;
export function scrollTop() { export function scrollTop() {
domDiv.scrollTop = 0; domDiv.scrollTop = 0;
@@ -14,6 +15,7 @@
on:drop on:drop
bind:this={domDiv} bind:this={domDiv}
class:hideContent class:hideContent
class:flexContainer
class:leftFixedWidth={!fixedWidth && !skipDefineWidth} class:leftFixedWidth={!fixedWidth && !skipDefineWidth}
data-testid={$$props['data-testid']} data-testid={$$props['data-testid']}
style:width={fixedWidth ? `${fixedWidth}px` : undefined} style:width={fixedWidth ? `${fixedWidth}px` : undefined}
@@ -35,4 +37,8 @@
div.hideContent { div.hideContent {
visibility: hidden; visibility: hidden;
} }
div.flexContainer {
display: flex;
}
</style> </style>