Browse Source

fix(gui-v2): insertAtCursor logic

pull/2998/head
Wing-Kam Wong 2 years ago
parent
commit
e7da0fc798
  1. 20
      packages/nc-gui-v2/components/smartsheet-column/FormulaOptions.vue

20
packages/nc-gui-v2/components/smartsheet-column/FormulaOptions.vue

@ -313,10 +313,13 @@ function validateAgainstMeta(parsedTree: any, errors = new Set(), typeErrors = n
function isCurlyBracketBalanced() { function isCurlyBracketBalanced() {
// count number of opening curly brackets and closing curly brackets // count number of opening curly brackets and closing curly brackets
const cntCurlyBrackets = (formulaRef.value.value.match(/\{|}/g) || []).reduce((acc: Record<number, number>, cur: number) => { const cntCurlyBrackets = (formulaRef.value.$el.value.match(/\{|}/g) || []).reduce(
(acc: Record<number, number>, cur: number) => {
acc[cur] = (acc[cur] || 0) + 1 acc[cur] = (acc[cur] || 0) + 1
return acc return acc
}, {}) },
{},
)
return (cntCurlyBrackets['{'] || 0) === (cntCurlyBrackets['}'] || 0) return (cntCurlyBrackets['{'] || 0) === (cntCurlyBrackets['}'] || 0)
} }
@ -324,11 +327,11 @@ function appendText(it: Record<string, any>) {
const text = it.text const text = it.text
const len = wordToComplete.value?.length || 0 const len = wordToComplete.value?.length || 0
if (it.type === 'function') { if (it.type === 'function') {
formula.value = insertAtCursor(formula.value, text, len, 1) formState.value.colOptions.formula_raw = insertAtCursor(formulaRef.value.$el, text, len, 1)
} else if (it.type === 'column') { } else if (it.type === 'column') {
formula.value = insertAtCursor(formula.value, `{${text}}`, len + +!isCurlyBracketBalanced()) formState.value.colOptions.formula_raw = insertAtCursor(formulaRef.value.$el, `{${text}}`, len + +!isCurlyBracketBalanced())
} else { } else {
formula.value = insertAtCursor(formula.value, text, len) formState.value.colOptions.formula_raw = insertAtCursor(formulaRef.value.$el, text, len)
} }
autocomplete.value = false autocomplete.value = false
suggestion.value = null suggestion.value = null
@ -341,7 +344,7 @@ const handleInputDeb = useDebounceFn(function () {
function handleInput() { function handleInput() {
selected.value = 0 selected.value = 0
suggestion.value = null suggestion.value = null
const query = getWordUntilCaret(formulaRef.value) const query = getWordUntilCaret(formulaRef.value.$el)
const parts = query.split(/\W+/) const parts = query.split(/\W+/)
wordToComplete.value = parts.pop() || '' wordToComplete.value = parts.pop() || ''
suggestion.value = acTree.value.complete(wordToComplete.value)?.sort((x, y) => sortOrder[x.type] - sortOrder[y.type]) // TODO: check .type suggestion.value = acTree.value.complete(wordToComplete.value)?.sort((x, y) => sortOrder[x.type] - sortOrder[y.type]) // TODO: check .type
@ -421,9 +424,11 @@ formState.value.colOptions = {
Hint: Use {} to reference columns, e.g: {column_name}. For more, please check out Hint: Use {} to reference columns, e.g: {column_name}. For more, please check out
<a href="https://docs.nocodb.com/setup-and-usages/formulas#available-formula-features" target="_blank">Formulas</a>. <a href="https://docs.nocodb.com/setup-and-usages/formulas#available-formula-features" target="_blank">Formulas</a>.
</div> </div>
<!-- TODO: close drawer when EditOrAdd is closed -->
<a-drawer <a-drawer
v-model:visible="formulaSuggestionDrawer" v-model:visible="formulaSuggestionDrawer"
:closable="false" :closable="false"
:mask-closable="false"
placement="right" placement="right"
width="500px" width="500px"
class="h-full overflow-auto" class="h-full overflow-auto"
@ -437,7 +442,8 @@ formState.value.colOptions = {
sugOptionsRef[index] = el sugOptionsRef[index] = el
} }
" "
@mousedown.prevent="appendText(item)" class="cursor-pointer"
@mousedown.stop="appendText(item)"
> >
<a-list-item-meta> <a-list-item-meta>
<template v-if="item.type === 'function'" #description> <template v-if="item.type === 'function'" #description>

Loading…
Cancel
Save