mirror of https://github.com/nocodb/nocodb
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
84 lines
2.4 KiB
84 lines
2.4 KiB
import type { Input as AntInput } from 'ant-design-vue' |
|
import { formulas } from 'nocodb-sdk' |
|
|
|
const formulaList = Object.keys(formulas) |
|
|
|
// ref : https://stackoverflow.com/a/11077016 |
|
function insertAtCursor(myField: typeof AntInput, myValue: string, len = 0, b = 0) { |
|
// MOZILLA and others |
|
if (myField.selectionStart || myField.selectionStart === 0) { |
|
const startPos = myField.selectionStart |
|
const endPos = myField.selectionEnd |
|
myField.value = myField.value.substring(0, startPos - len) + myValue + myField.value.substring(endPos, myField.value.length) |
|
const pos = +startPos - len + myValue.length - b |
|
// https://stackoverflow.com/a/4302688 |
|
if (myField.setSelectionRange) { |
|
myField.focus() |
|
myField.setSelectionRange(pos, pos) |
|
} else if (myField.createTextRange) { |
|
const range = myField.createTextRange() |
|
range.collapse(true) |
|
range.moveEnd('character', pos) |
|
range.moveStart('character', pos) |
|
range.select() |
|
} |
|
} else { |
|
myField.value += myValue |
|
} |
|
return myField.value |
|
} |
|
|
|
function ReturnWord(text: string, caretPos: number) { |
|
const preText = text.substring(0, caretPos) |
|
if (preText.indexOf(' ') > 0) { |
|
const words = preText.split(' ') |
|
return words[words.length - 1] // return last word |
|
} else { |
|
return preText |
|
} |
|
} |
|
|
|
function getWordUntilCaret(ctrl: typeof AntInput) { |
|
const caretPos = GetCaretPosition(ctrl) |
|
const word = ReturnWord(ctrl.value, caretPos) |
|
return word || '' |
|
} |
|
|
|
function GetCaretPosition(ctrl: typeof AntInput) { |
|
let CaretPos = 0 |
|
if (ctrl.selectionStart || ctrl.selectionStart === 0) { |
|
CaretPos = ctrl.selectionStart |
|
} |
|
return CaretPos |
|
} |
|
|
|
// Function to check if cursor is inside Strings |
|
function isCursorInsideString(text: string, offset: number) { |
|
let inSingleQuoteString = false |
|
let inDoubleQuoteString = false |
|
let escapeNextChar = false |
|
|
|
for (let i = 0; i < offset; i++) { |
|
const char = text[i] |
|
|
|
if (escapeNextChar) { |
|
escapeNextChar = false |
|
continue |
|
} |
|
|
|
if (char === '\\') { |
|
escapeNextChar = true |
|
continue |
|
} |
|
|
|
if (char === "'" && !inDoubleQuoteString) { |
|
inSingleQuoteString = !inSingleQuoteString |
|
} else if (char === '"' && !inSingleQuoteString) { |
|
inDoubleQuoteString = !inDoubleQuoteString |
|
} |
|
} |
|
|
|
return inDoubleQuoteString || inSingleQuoteString |
|
} |
|
|
|
export { formulaList, formulas, getWordUntilCaret, insertAtCursor, isCursorInsideString }
|
|
|