mirror of
https://github.com/lana-k/sqliteviz.git
synced 2026-02-04 15:38:55 +08:00
59 lines
1.5 KiB
JavaScript
59 lines
1.5 KiB
JavaScript
import CM from 'codemirror'
|
|
import 'codemirror/addon/hint/show-hint.js'
|
|
import 'codemirror/addon/hint/sql-hint.js'
|
|
import store from '@/store'
|
|
|
|
function _getHintText(hint) {
|
|
return typeof hint === 'string' ? hint : hint.text
|
|
}
|
|
export function getHints(cm, options) {
|
|
const result = CM.hint.sql(cm, options)
|
|
|
|
// Don't show the hint if there is only one option
|
|
// and the replacingText is already equals to this option
|
|
const replacedText = cm.getRange(result.from, result.to).toUpperCase()
|
|
if (
|
|
result.list.length === 1 &&
|
|
_getHintText(result.list[0]).toUpperCase() === replacedText
|
|
) {
|
|
result.list = []
|
|
}
|
|
|
|
return result
|
|
}
|
|
|
|
const hintOptions = {
|
|
get tables() {
|
|
const tables = {}
|
|
if (store.state.db.schema) {
|
|
store.state.db.schema.forEach(table => {
|
|
tables[table.name] = table.columns.map(column => column.name)
|
|
})
|
|
}
|
|
return tables
|
|
},
|
|
get defaultTable() {
|
|
const schema = store.state.db.schema
|
|
return schema && schema.length === 1 ? schema[0].name : null
|
|
},
|
|
completeSingle: false,
|
|
completeOnSingleClick: true,
|
|
alignWithWord: false
|
|
}
|
|
|
|
export function showHintOnDemand(editor) {
|
|
CM.showHint(editor, getHints, hintOptions)
|
|
}
|
|
|
|
export default function showHint(editor) {
|
|
// Don't show autocomplete after a space or semicolon or in string literals
|
|
const token = editor.getTokenAt(editor.getCursor())
|
|
const ch = token.string.slice(-1)
|
|
const tokenType = token.type
|
|
if (tokenType === 'string' || !ch || ch === ' ' || ch === ';') {
|
|
return
|
|
}
|
|
|
|
CM.showHint(editor, getHints, hintOptions)
|
|
}
|