From b5d8902175f1addeafb2a3373aec8418fa58fd64 Mon Sep 17 00:00:00 2001 From: Ramesh Mane <101566080+rameshmane7218@users.noreply.github.com> Date: Sat, 22 Jun 2024 12:13:54 +0530 Subject: [PATCH] Nc fix: Formula modal UI/UX (#8825) * fix(nc-gui): small changes * fix(nc-gui): formula suggestion popover visibility issue in MFE * fix(nc-gui): console warnings * fix(nc-gui): formula field madal width issue * fix(nc-gui): formula fun or field empty state --- .../smartsheet/column/EditOrAdd.vue | 4 +- .../smartsheet/column/FormulaOptions.vue | 88 +++++++++++++------ .../composables/useColumnCreateStore.ts | 1 + packages/nc-gui/lang/en.json | 1 + 4 files changed, 65 insertions(+), 29 deletions(-) diff --git a/packages/nc-gui/components/smartsheet/column/EditOrAdd.vue b/packages/nc-gui/components/smartsheet/column/EditOrAdd.vue index c61800f518..7b1c191543 100644 --- a/packages/nc-gui/components/smartsheet/column/EditOrAdd.vue +++ b/packages/nc-gui/components/smartsheet/column/EditOrAdd.vue @@ -360,8 +360,8 @@ const isFullUpdateAllowed = computed(() => { :class="{ 'bg-white': !props.fromTableExplorer, 'w-[384px]': !props.embedMode, - 'min-w-500px': formState.uidt === UITypes.LinkToAnotherRecord || formState.uidt === UITypes.Links, - '!w-116 overflow-visible': formState.uidt === UITypes.Formula && !props.embedMode, + 'min-w-[500px]': formState.uidt === UITypes.LinkToAnotherRecord || formState.uidt === UITypes.Links, + 'overflow-visible': formState.uidt === UITypes.Formula, '!w-[600px]': formState.uidt === UITypes.LinkToAnotherRecord || formState.uidt === UITypes.Links, 'shadow-lg border-1 border-gray-200 shadow-gray-300 rounded-xl p-5': !embedMode, }" diff --git a/packages/nc-gui/components/smartsheet/column/FormulaOptions.vue b/packages/nc-gui/components/smartsheet/column/FormulaOptions.vue index fdeae9a644..d9ed58f3b5 100644 --- a/packages/nc-gui/components/smartsheet/column/FormulaOptions.vue +++ b/packages/nc-gui/components/smartsheet/column/FormulaOptions.vue @@ -22,7 +22,7 @@ const uiTypesNotSupportedInFormulas = [UITypes.QrCode, UITypes.Barcode] const vModel = useVModel(props, 'value', emit) -const { setAdditionalValidations, validateInfos, sqlUi, column } = useColumnCreateStoreOrThrow() +const { setAdditionalValidations, validateInfos, sqlUi, column, fromTableExplorer } = useColumnCreateStoreOrThrow() const { t } = useI18n() @@ -48,6 +48,8 @@ const { getMeta } = useMetas() const suggestionPreviewed = ref | undefined>() +const showFunctionList = ref(true) + const validators = { formula_raw: [ { @@ -84,8 +86,6 @@ const autocomplete = ref(false) const formulaRef = ref() -const sugListRef = ref() - const variableListRef = ref<(typeof AntListItem)[]>([]) const sugOptionsRef = ref<(typeof AntListItem)[]>([]) @@ -124,7 +124,7 @@ const suggestionsList = computed(() => { .map((c: any) => ({ text: c.title, type: 'column', - icon: getUIDTIcon(c.uidt), + icon: getUIDTIcon(c.uidt) ? markRaw(getUIDTIcon(c.uidt)!) : undefined, uidt: c.uidt, })), ...availableBinOps.map((op: string) => ({ @@ -218,7 +218,11 @@ function handleInput() { if (!isCurlyBracketBalanced()) { suggestion.value = suggestion.value.filter((v) => v.type === 'column') + showFunctionList.value = false + } else if (!showFunctionList.value) { + showFunctionList.value = true } + autocomplete.value = !!suggestion.value.length } @@ -284,27 +288,62 @@ onMounted(() => { jsep.plugins.register(jsepCurlyHook) }) -const suggestionPreviewLeft = ref('-left-85') - -watch(sugListRef, () => { - nextTick(() => { - setTimeout(() => { - const fieldModal = document.querySelector('.nc-dropdown-edit-column.active') as HTMLDivElement +const suggestionPreviewPostion = ref({ + top: '0px', + left: '-344px', +}) - if (fieldModal && fieldModal.getBoundingClientRect().left < 364) { - suggestionPreviewLeft.value = '-right-85' - } - }, 500) - }) +onMounted(() => { + // wait until MFE field modal transition complete + setTimeout(() => { + const textAreaPosition = formulaRef.value?.$el?.getBoundingClientRect() + if (!textAreaPosition) return + + if (fromTableExplorer?.value) { + suggestionPreviewPostion.value.left = `${textAreaPosition.left - 344}px` + suggestionPreviewPostion.value.top = `${textAreaPosition.top}px` + } else { + suggestionPreviewPostion.value.left = textAreaPosition.left < 352 ? '350px' : '-344px' + suggestionPreviewPostion.value.top = `0px` + } + }, 250) }) + +const handleKeydown = (e: KeyboardEvent) => { + e.stopPropagation() + switch (e.key) { + case 'ArrowUp': { + e.preventDefault() + suggestionListUp() + break + } + case 'ArrowDown': { + e.preventDefault() + suggestionListDown() + break + } + case 'Enter': { + e.preventDefault() + selectText() + break + } + } +}