From e92f8f1b254343926820481064b9d3704a3483c3 Mon Sep 17 00:00:00 2001 From: Pranav C Date: Fri, 28 Oct 2022 12:07:58 +0530 Subject: [PATCH 01/36] fix(gui): block cell level arrow navigation when single select is open Signed-off-by: Pranav C --- .../nc-gui/components/cell/SingleSelect.vue | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/packages/nc-gui/components/cell/SingleSelect.vue b/packages/nc-gui/components/cell/SingleSelect.vue index cb9258505c..bdccb6a872 100644 --- a/packages/nc-gui/components/cell/SingleSelect.vue +++ b/packages/nc-gui/components/cell/SingleSelect.vue @@ -2,7 +2,17 @@ import tinycolor from 'tinycolor2' import type { Select as AntSelect } from 'ant-design-vue' import type { SelectOptionType } from 'nocodb-sdk' -import { ActiveCellInj, ColumnInj, IsKanbanInj, ReadonlyInj, computed, inject, ref, useEventListener, watch } from '#imports' +import { + ActiveCellInj, + ColumnInj, + IsKanbanInj, + ReadonlyInj, + computed, + inject, + ref, + useEventListener, + watch, +} from '#imports' interface Props { modelValue?: string | undefined @@ -34,7 +44,7 @@ const options = computed(() => { if (column?.value.colOptions) { const opts = column.value.colOptions ? // todo: fix colOptions type, options does not exist as a property - (column.value.colOptions as any).options.filter((el: SelectOptionType) => el.title !== '') || [] + (column.value.colOptions as any).options.filter((el: SelectOptionType) => el.title !== '') || [] : [] for (const op of opts.filter((el: any) => el.order === null)) { op.title = op.title.replace(/^'/, '').replace(/'$/, '') @@ -50,6 +60,11 @@ const handleKeys = (e: KeyboardEvent) => { e.preventDefault() isOpen.value = false break + case 'ArrowDown': + case 'ArrowUp': + case 'Enter': + e.stopPropagation() + break } } @@ -110,9 +125,11 @@ watch(isOpen, (n, _o) => { .rounded-tag { @apply py-0 px-[12px] rounded-[12px]; } + :deep(.ant-tag) { @apply "rounded-tag"; } + :deep(.ant-select-clear) { opacity: 1; } From 9f1802b2bdfb9248b980234c3c1eb4ff7317c94b Mon Sep 17 00:00:00 2001 From: Pranav C Date: Fri, 28 Oct 2022 12:08:43 +0530 Subject: [PATCH 02/36] fix(gui): block cell level arrow navigation when multi select is open Signed-off-by: Pranav C --- packages/nc-gui/components/cell/MultiSelect.vue | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/nc-gui/components/cell/MultiSelect.vue b/packages/nc-gui/components/cell/MultiSelect.vue index 0da8f1f871..9fe19858b0 100644 --- a/packages/nc-gui/components/cell/MultiSelect.vue +++ b/packages/nc-gui/components/cell/MultiSelect.vue @@ -91,6 +91,8 @@ const handleKeys = (e: KeyboardEvent) => { e.preventDefault() isOpen.value = false break + case 'ArrowDown': + case 'ArrowUp': case 'Enter': e.stopPropagation() break From 59964d5c383c4516ba06c9ab30c9690ba6c5a5be Mon Sep 17 00:00:00 2001 From: Pranav C Date: Fri, 28 Oct 2022 16:33:09 +0530 Subject: [PATCH 03/36] fix(gui): stop event bubbling at input level Signed-off-by: Pranav C --- packages/nc-gui/components/cell/Currency.vue | 4 ++++ packages/nc-gui/components/cell/Decimal.vue | 4 ++++ packages/nc-gui/components/cell/Duration.vue | 4 ++++ packages/nc-gui/components/cell/Email.vue | 6 +++++- packages/nc-gui/components/cell/Float.vue | 4 ++++ packages/nc-gui/components/cell/Integer.vue | 4 ++++ packages/nc-gui/components/cell/Percent.vue | 4 ++++ packages/nc-gui/components/cell/PhoneNumber.vue | 3 ++- packages/nc-gui/components/cell/Text.vue | 4 ++++ packages/nc-gui/components/cell/TextArea.vue | 4 ++++ packages/nc-gui/components/cell/Url.vue | 4 ++++ 11 files changed, 43 insertions(+), 2 deletions(-) diff --git a/packages/nc-gui/components/cell/Currency.vue b/packages/nc-gui/components/cell/Currency.vue index 5cccfb7cf1..bff861c977 100644 --- a/packages/nc-gui/components/cell/Currency.vue +++ b/packages/nc-gui/components/cell/Currency.vue @@ -61,6 +61,10 @@ onMounted(() => { v-model="vModel" class="w-full h-full border-none outline-none px-2" @blur="submitCurrency" + @keydown.down.stop + @keydown.left.stop + @keydown.right.stop + @keydown.up.stop /> {{ currency }} diff --git a/packages/nc-gui/components/cell/Decimal.vue b/packages/nc-gui/components/cell/Decimal.vue index 9581665304..743186fd30 100644 --- a/packages/nc-gui/components/cell/Decimal.vue +++ b/packages/nc-gui/components/cell/Decimal.vue @@ -30,6 +30,10 @@ const focus: VNodeRef = (el) => (el as HTMLInputElement)?.focus() type="number" step="0.1" @blur="editEnabled = false" + @keydown.down.stop + @keydown.left.stop + @keydown.right.stop + @keydown.up.stop /> {{ vModel }} diff --git a/packages/nc-gui/components/cell/Duration.vue b/packages/nc-gui/components/cell/Duration.vue index 4a8a833369..219bc1280b 100644 --- a/packages/nc-gui/components/cell/Duration.vue +++ b/packages/nc-gui/components/cell/Duration.vue @@ -84,6 +84,10 @@ const focus: VNodeRef = (el) => (el as HTMLInputElement)?.focus() @blur="submitDuration" @keypress="checkDurationFormat($event)" @keydown.enter="submitDuration" + @keydown.down.stop + @keydown.left.stop + @keydown.right.stop + @keydown.up.stop /> {{ localState }} diff --git a/packages/nc-gui/components/cell/Email.vue b/packages/nc-gui/components/cell/Email.vue index 2ab60c42f6..d90bf0f8f5 100644 --- a/packages/nc-gui/components/cell/Email.vue +++ b/packages/nc-gui/components/cell/Email.vue @@ -24,7 +24,11 @@ const focus: VNodeRef = (el) => (el as HTMLInputElement)?.focus() diff --git a/packages/nc-gui/components/cell/Integer.vue b/packages/nc-gui/components/cell/Integer.vue index 63c15a5546..7b441c336b 100644 --- a/packages/nc-gui/components/cell/Integer.vue +++ b/packages/nc-gui/components/cell/Integer.vue @@ -34,6 +34,10 @@ function onKeyDown(evt: KeyboardEvent) { type="number" @blur="editEnabled = false" @keydown="onKeyDown" + @keydown.down.stop + @keydown.left.stop + @keydown.right.stop + @keydown.up.stop /> {{ vModel }} diff --git a/packages/nc-gui/components/cell/Percent.vue b/packages/nc-gui/components/cell/Percent.vue index 381b46df05..c518033aec 100644 --- a/packages/nc-gui/components/cell/Percent.vue +++ b/packages/nc-gui/components/cell/Percent.vue @@ -21,6 +21,10 @@ const vModel = useVModel(props, 'modelValue', emits) class="w-full !border-none text-base" :class="{ '!px-2': editEnabled }" type="number" + @keydown.down.stop + @keydown.left.stop + @keydown.right.stop + @keydown.up.stop /> {{ vModel }} diff --git a/packages/nc-gui/components/cell/PhoneNumber.vue b/packages/nc-gui/components/cell/PhoneNumber.vue index 0397b5ff55..618fb25182 100644 --- a/packages/nc-gui/components/cell/PhoneNumber.vue +++ b/packages/nc-gui/components/cell/PhoneNumber.vue @@ -17,5 +17,6 @@ const vModel = useVModel(props, 'modelValue', emits) diff --git a/packages/nc-gui/components/cell/Text.vue b/packages/nc-gui/components/cell/Text.vue index 53e7aa02b1..9094a4adcb 100644 --- a/packages/nc-gui/components/cell/Text.vue +++ b/packages/nc-gui/components/cell/Text.vue @@ -27,6 +27,10 @@ const focus: VNodeRef = (el) => (el as HTMLInputElement)?.focus() class="h-full w-full outline-none bg-transparent" :class="{ '!px-2': editEnabled }" @blur="editEnabled = false" + @keydown.down.stop + @keydown.left.stop + @keydown.right.stop + @keydown.up.stop /> {{ vModel }} diff --git a/packages/nc-gui/components/cell/TextArea.vue b/packages/nc-gui/components/cell/TextArea.vue index db3b054bcf..421be3d606 100644 --- a/packages/nc-gui/components/cell/TextArea.vue +++ b/packages/nc-gui/components/cell/TextArea.vue @@ -26,6 +26,10 @@ const focus: VNodeRef = (el) => (el as HTMLTextAreaElement)?.focus() @blur="editEnabled = false" @keydown.alt.enter.stop @keydown.shift.enter.stop + @keydown.down.stop + @keydown.left.stop + @keydown.right.stop + @keydown.up.stop /> {{ vModel }} diff --git a/packages/nc-gui/components/cell/Url.vue b/packages/nc-gui/components/cell/Url.vue index 31d0b99be7..b785332aa5 100644 --- a/packages/nc-gui/components/cell/Url.vue +++ b/packages/nc-gui/components/cell/Url.vue @@ -79,6 +79,10 @@ watch( v-model="vModel" class="outline-none text-sm w-full px-2" @blur="editEnabled = false" + @keydown.down.stop + @keydown.left.stop + @keydown.right.stop + @keydown.up.stop /> Date: Sat, 29 Oct 2022 01:40:24 +0530 Subject: [PATCH 04/36] feat: open select options on enter key press Signed-off-by: Pranav C --- .../nc-gui/components/cell/MultiSelect.vue | 32 ++++++++++++++----- .../nc-gui/components/cell/SingleSelect.vue | 3 ++ 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/packages/nc-gui/components/cell/MultiSelect.vue b/packages/nc-gui/components/cell/MultiSelect.vue index 9fe19858b0..d57f4490da 100644 --- a/packages/nc-gui/components/cell/MultiSelect.vue +++ b/packages/nc-gui/components/cell/MultiSelect.vue @@ -16,6 +16,7 @@ import { useProject, watch, } from '#imports' +import { useSelectedCellKeyupListener } from '~/composables/useSelectedCellKeyupListener' import MdiCloseCircle from '~icons/mdi/close-circle' interface Props { @@ -73,13 +74,13 @@ const selectedTitles = computed(() => ? typeof modelValue === 'string' ? isMysql ? modelValue.split(',').sort((a, b) => { - const opa = options.value.find((el) => el.title === a) - const opb = options.value.find((el) => el.title === b) - if (opa && opb) { - return opa.order! - opb.order! - } - return 0 - }) + const opa = options.value.find((el) => el.title === a) + const opb = options.value.find((el) => el.title === b) + if (opa && opb) { + return opa.order! - opb.order! + } + return 0 + }) : modelValue.split(',') : modelValue : [], @@ -93,9 +94,13 @@ const handleKeys = (e: KeyboardEvent) => { break case 'ArrowDown': case 'ArrowUp': + e.stopPropagation() + break case 'Enter': + isOpen.value = true e.stopPropagation() break + } } @@ -135,11 +140,17 @@ watch( watch(isOpen, (n, _o) => { if (!n) aselect.value?.$el.blur() }) + +useEventListener(document, 'keydown', (e) => { + if (active.value && e.key === 'Enter') { + isOpen.value = true + } +})