mirror of https://github.com/nocodb/nocodb
Wing-Kam Wong
2 years ago
1 changed files with 123 additions and 0 deletions
@ -0,0 +1,123 @@
|
||||
<script setup lang="ts"> |
||||
import jsep from 'jsep'; |
||||
import { UITypes, jsepCurlyHook } from 'nocodb-sdk'; |
||||
import { formulaList, formulas, formulaTypes } from '@/utils' |
||||
|
||||
|
||||
const formula = ref({}) |
||||
|
||||
const availableFunctions = formulaList |
||||
|
||||
const availableBinOps = ['+', '-', '*', '/', '>', '<', '==', '<=', '>=', '!='] |
||||
|
||||
const autocomplete = ref(false) |
||||
|
||||
const suggestion = ref() |
||||
|
||||
const wordToComplete = ref('') |
||||
|
||||
const selected = ref(0) |
||||
|
||||
const tooltip = ref(true) |
||||
|
||||
const sortOrder = { |
||||
column: 0, |
||||
function: 1, |
||||
op: 2, |
||||
} |
||||
</script> |
||||
|
||||
<template> |
||||
<div class="formula-wrapper"> |
||||
<a-text-field |
||||
ref="input" |
||||
v-model:value="formula.value" |
||||
dense |
||||
outlined |
||||
class="caption" |
||||
hide-details="auto" |
||||
label="Formula" |
||||
:rules="[(v) => !!v || 'Required', (v) => parseAndValidateFormula(v)]" |
||||
autocomplete="off" |
||||
@input="handleInputDeb" |
||||
@keydown.down.prevent="suggestionListDown" |
||||
@keydown.up.prevent="suggestionListUp" |
||||
@keydown.enter.prevent="selectText" |
||||
/> |
||||
<div class="hint"> |
||||
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>. |
||||
</div> |
||||
<v-card v-if="suggestion && suggestion.length" class="formula-suggestion"> |
||||
<v-card-text>Suggestions</v-card-text> |
||||
<v-divider /> |
||||
<v-list ref="sugList" dense max-height="50vh" style="overflow: auto"> |
||||
<v-list-item-group v-model="selected" color="primary"> |
||||
<v-list-item |
||||
v-for="(it, i) in suggestion" |
||||
:key="i" |
||||
ref="sugOptions" |
||||
dense |
||||
selectable |
||||
@mousedown.prevent="appendText(it)" |
||||
> |
||||
<!-- Function --> |
||||
<template v-if="it.type === 'function'"> |
||||
<v-tooltip right offset-x nudge-right="100"> |
||||
<template #activator="{ on }"> |
||||
<v-list-item-content v-on="on"> |
||||
<span class="caption primary--text text--lighten-2 font-weight-bold"> |
||||
<v-icon color="primary lighten-2" small class="mr-1"> mdi-function </v-icon> |
||||
{{ it.text }} |
||||
</span> |
||||
</v-list-item-content> |
||||
<v-list-item-action> |
||||
<span class="caption"> Function </span> |
||||
</v-list-item-action> |
||||
</template> |
||||
<div> |
||||
{{ it.description }} <br /><br /> |
||||
Syntax: <br /> |
||||
{{ it.syntax }} <br /><br /> |
||||
Examples: <br /> |
||||
<div v-for="(example, idx) in it.examples" :key="idx"> |
||||
<pre>({{ idx + 1 }}): {{ example }}</pre> |
||||
</div> |
||||
</div> |
||||
</v-tooltip> |
||||
</template> |
||||
|
||||
<!-- Column --> |
||||
<template v-if="it.type === 'column'"> |
||||
<v-list-item-content> |
||||
<span class="caption text--darken-3 font-weight-bold"> |
||||
<v-icon color="grey darken-4" small class="mr-1"> |
||||
{{ it.icon }} |
||||
</v-icon> |
||||
{{ it.text }} |
||||
</span> |
||||
</v-list-item-content> |
||||
<v-list-item-action> |
||||
<span class="caption"> Column </span> |
||||
</v-list-item-action> |
||||
</template> |
||||
|
||||
<!-- Operator --> |
||||
<template v-if="it.type === 'op'"> |
||||
<v-list-item-content> |
||||
<span class="caption indigo--text text--darken-3 font-weight-bold"> |
||||
<v-icon color="indigo darken-3" small class="mr-1"> mdi-calculator-variant </v-icon> |
||||
{{ it.text }} |
||||
</span> |
||||
</v-list-item-content> |
||||
|
||||
<v-list-item-action> |
||||
<span class="caption"> Operator </span> |
||||
</v-list-item-action> |
||||
</template> |
||||
</v-list-item> |
||||
</v-list-item-group> |
||||
</v-list> |
||||
</v-card> |
||||
</div> |
||||
</template> |
Loading…
Reference in new issue