feat(frontend): preprocessor snippet completion in code editor (#6502)

* feat(frontend): preprocessor snippet completion in code editor

* fix: only for main script editor
This commit is contained in:
hugocasa
2025-09-01 14:36:06 +02:00
committed by GitHub
parent e5d15dccae
commit 00b3ccdfcb
3 changed files with 65 additions and 2 deletions
+60 -1
View File
@@ -155,6 +155,7 @@
import { aiChatManager } from './copilot/chat/AIChatManager.svelte'
import type { Selection } from 'monaco-editor'
import { getDbSchemas } from './apps/components/display/dbtable/utils'
import { PYTHON_PREPROCESSOR_MODULE_CODE, TS_PREPROCESSOR_MODULE_CODE } from '$lib/script_helpers'
// import EditorTheme from './EditorTheme.svelte'
let divEl: HTMLDivElement | null = $state(null)
@@ -185,6 +186,7 @@
key?: string | undefined
class?: string | undefined
moduleId?: string
enablePreprocessorSnippet?: boolean
}
let {
@@ -211,7 +213,8 @@
loadAsync = false,
key = undefined,
class: clazz = undefined,
moduleId = undefined
moduleId = undefined,
enablePreprocessorSnippet = false
}: Props = $props()
$effect.pre(() => {
@@ -665,6 +668,55 @@
}
}
let preprocessorCompletor: IDisposable | undefined = undefined
function addPreprocessorCompletions(lang: 'typescript' | 'python') {
if (preprocessorCompletor) {
preprocessorCompletor.dispose()
}
const preprocessorCode =
lang === 'typescript' ? TS_PREPROCESSOR_MODULE_CODE : PYTHON_PREPROCESSOR_MODULE_CODE
preprocessorCompletor = languages.registerCompletionItemProvider(lang, {
provideCompletionItems: function (model, position) {
const word = model.getWordUntilPosition(position)
if (word.word.length >= 3 && 'preprocessor'.startsWith(word.word)) {
const range = {
startLineNumber: position.lineNumber,
endLineNumber: position.lineNumber,
startColumn: word.startColumn,
endColumn: word.endColumn
}
return {
suggestions: [
{
label: 'preprocessor (windmill)',
kind: languages.CompletionItemKind.Function,
insertTextRules: languages.CompletionItemInsertTextRule.InsertAsSnippet,
insertText: preprocessorCode,
range,
additionalTextEdits: [
{
range: {
startLineNumber: position.lineNumber,
endLineNumber: position.lineNumber,
startColumn: 0,
endColumn: word.startColumn
},
text: ''
}
]
}
]
}
}
return {
suggestions: []
}
}
})
}
let reviewingChanges = $state(writable(false))
let aiChatEditorHandler: AIChatEditorHandler | undefined = $state(undefined)
@@ -1568,6 +1620,7 @@
sqlSchemaCompletor && sqlSchemaCompletor.dispose()
autocompletor && autocompletor.dispose()
sqlTypeCompletor && sqlTypeCompletor.dispose()
preprocessorCompletor && preprocessorCompletor.dispose()
timeoutModel && clearTimeout(timeoutModel)
loadTimeout && clearTimeout(loadTimeout)
aiChatEditorHandler?.clear()
@@ -1620,6 +1673,12 @@
: sqlTypeCompletor?.dispose()
})
$effect(() => {
initialized && (lang === 'typescript' || lang === 'python') && enablePreprocessorSnippet
? untrack(() => addPreprocessorCompletions(lang as 'typescript' | 'python'))
: preprocessorCompletor?.dispose()
})
let lastArg = undefined
$effect(() => {
let newArg = lang === 'graphql' ? args?.api : args?.database
@@ -1791,6 +1791,7 @@
bind:hasPreprocessor
bind:captureTable
bind:assets={script.assets}
enablePreprocessorSnippet
/>
</div>
{:else}
@@ -81,6 +81,7 @@
disableAi?: boolean
assets?: AssetWithAltAccessType[]
editor_bar_right?: import('svelte').Snippet
enablePreprocessorSnippet?: boolean
}
let {
@@ -111,7 +112,8 @@
lastDeployedCode = undefined,
disableAi = false,
assets = $bindable(),
editor_bar_right
editor_bar_right,
enablePreprocessorSnippet = false
}: Props = $props()
$effect.pre(() => {
@@ -625,6 +627,7 @@
automaticLayout={true}
{fixedOverflowWidgets}
{args}
{enablePreprocessorSnippet}
/>
<DiffEditor
className="h-full"