From 40baf5aa94aaabfb1e7a7c0fe46c3935b514f486 Mon Sep 17 00:00:00 2001 From: Pranav C Date: Sat, 17 Sep 2022 00:12:16 +0530 Subject: [PATCH 1/5] fix(api): default form validation re #3652 Signed-off-by: Pranav C --- packages/nc-gui/components/smartsheet/Form.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/nc-gui/components/smartsheet/Form.vue b/packages/nc-gui/components/smartsheet/Form.vue index 9f797dec50..6cc2670532 100644 --- a/packages/nc-gui/components/smartsheet/Form.vue +++ b/packages/nc-gui/components/smartsheet/Form.vue @@ -641,7 +641,7 @@ onMounted(async () => { v-if="isVirtualCol(element)" class="!m-0 gap-0 p-0" :name="element.title" - :rules="[{ required: element.required, message: `${element.title} is required` }]" + :rules="[{ required: isRequired(element, element.required), message: `${element.title} is required` }]" > { v-else class="!m-0 gap-0 p-0" :name="element.title" - :rules="[{ required: element.required, message: `${element.title} is required` }]" + :rules="[{ required: isRequired(element, element.required), message: `${element.title} is required` }]" > Date: Sat, 17 Sep 2022 00:23:11 +0530 Subject: [PATCH 2/5] fix(api): email me enabling error re #3651 Signed-off-by: Pranav C --- packages/nc-gui/components/smartsheet/Form.vue | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/nc-gui/components/smartsheet/Form.vue b/packages/nc-gui/components/smartsheet/Form.vue index 6cc2670532..d2c955ffaa 100644 --- a/packages/nc-gui/components/smartsheet/Form.vue +++ b/packages/nc-gui/components/smartsheet/Form.vue @@ -243,8 +243,10 @@ async function checkSMTPStatus() { emailMe.value = false // Please activate SMTP plugin in App store for enabling email notification message.info(t('msg.toast.formEmailSMTP')) + return false } } + return true } function setFormData() { @@ -263,7 +265,6 @@ function setFormData() { } catch (e) {} emailMe.value = data[state.user.value?.email as string] - checkSMTPStatus() localColumns.value = col .filter( @@ -306,12 +307,13 @@ function isRequired(_columnObj: Record, required = false) { return required || (columnObj && columnObj.rqd && !columnObj.cdf) } -function updateEmail() { +async function updateEmail() { try { + if (!(await checkSMTPStatus())) return + const data = formViewData.value?.email ? JSON.parse(formViewData.value?.email) : {} data[state.user.value?.email as string] = emailMe.value formViewData.value!.email = JSON.stringify(data) - checkSMTPStatus() } catch (e) {} } From 3680b14ee76821bf0f19b184cd3c40e9f96c81ac Mon Sep 17 00:00:00 2001 From: Pranav C Date: Sat, 17 Sep 2022 00:32:05 +0530 Subject: [PATCH 3/5] chore(gui): lint Signed-off-by: Pranav C --- packages/nc-gui/components.d.ts | 38 ------------------- .../composables/useColumnCreateStore.ts | 1 - 2 files changed, 39 deletions(-) diff --git a/packages/nc-gui/components.d.ts b/packages/nc-gui/components.d.ts index abfefb9a7b..30edfc757b 100644 --- a/packages/nc-gui/components.d.ts +++ b/packages/nc-gui/components.d.ts @@ -8,7 +8,6 @@ export {} declare module '@vue/runtime-core' { export interface GlobalComponents { AAlert: typeof import('ant-design-vue/es')['Alert'] - AAutoComplete: typeof import('ant-design-vue/es')['AutoComplete'] ABadgeRibbon: typeof import('ant-design-vue/es')['BadgeRibbon'] AButton: typeof import('ant-design-vue/es')['Button'] ACard: typeof import('ant-design-vue/es')['Card'] @@ -24,7 +23,6 @@ declare module '@vue/runtime-core' { ADivider: typeof import('ant-design-vue/es')['Divider'] ADrawer: typeof import('ant-design-vue/es')['Drawer'] ADropdown: typeof import('ant-design-vue/es')['Dropdown'] - ADropdownButton: typeof import('ant-design-vue/es')['DropdownButton'] AEmpty: typeof import('ant-design-vue/es')['Empty'] AForm: typeof import('ant-design-vue/es')['Form'] AFormItem: typeof import('ant-design-vue/es')['FormItem'] @@ -67,21 +65,16 @@ declare module '@vue/runtime-core' { ATextarea: typeof import('ant-design-vue/es')['Textarea'] ATimePicker: typeof import('ant-design-vue/es')['TimePicker'] ATooltip: typeof import('ant-design-vue/es')['Tooltip'] - ATypography: typeof import('ant-design-vue/es')['Typography'] ATypographyTitle: typeof import('ant-design-vue/es')['TypographyTitle'] AUploadDragger: typeof import('ant-design-vue/es')['UploadDragger'] BiFiletypeJson: typeof import('~icons/bi/filetype-json')['default'] BiFiletypeXlsx: typeof import('~icons/bi/filetype-xlsx')['default'] CilFullscreen: typeof import('~icons/cil/fullscreen')['default'] CilFullscreenExit: typeof import('~icons/cil/fullscreen-exit')['default'] - ClarityColorPickerLine: typeof import('~icons/clarity/color-picker-line')['default'] ClarityColorPickerSolid: typeof import('~icons/clarity/color-picker-solid')['default'] ClarityImageLine: typeof import('~icons/clarity/image-line')['default'] - ClaritySuccessLine: typeof import('~icons/clarity/success-line')['default'] EvaEmailOutline: typeof import('~icons/eva/email-outline')['default'] - 'Ic:twotoneWidthFull': typeof import('~icons/ic/twotone-width-full')['default'] IcBaselineMoreVert: typeof import('~icons/ic/baseline-more-vert')['default'] - IcBaselineWidthFull: typeof import('~icons/ic/baseline-width-full')['default'] IcOutlineInsertDriveFile: typeof import('~icons/ic/outline-insert-drive-file')['default'] IcRoundEdit: typeof import('~icons/ic/round-edit')['default'] IcRoundKeyboardArrowDown: typeof import('~icons/ic/round-keyboard-arrow-down')['default'] @@ -94,7 +87,6 @@ declare module '@vue/runtime-core' { MaterialSymbolsArrowCircleLeftRounded: typeof import('~icons/material-symbols/arrow-circle-left-rounded')['default'] MaterialSymbolsArrowCircleRightRounded: typeof import('~icons/material-symbols/arrow-circle-right-rounded')['default'] MaterialSymbolsAttachFile: typeof import('~icons/material-symbols/attach-file')['default'] - MaterialSymbolsChevronLeftRounded: typeof import('~icons/material-symbols/chevron-left-rounded')['default'] MaterialSymbolsChevronRightRounded: typeof import('~icons/material-symbols/chevron-right-rounded')['default'] MaterialSymbolsCloseRounded: typeof import('~icons/material-symbols/close-rounded')['default'] MaterialSymbolsFileCopyOutline: typeof import('~icons/material-symbols/file-copy-outline')['default'] @@ -102,28 +94,18 @@ declare module '@vue/runtime-core' { MaterialSymbolsSendOutline: typeof import('~icons/material-symbols/send-outline')['default'] MaterialSymbolsTranslate: typeof import('~icons/material-symbols/translate')['default'] MaterialSymbolsWarning: typeof import('~icons/material-symbols/warning')['default'] - MaterialSymbolsWidthFull: typeof import('~icons/material-symbols/width-full')['default'] - MaterialSymbolsWidthWideOutline: typeof import('~icons/material-symbols/width-wide-outline')['default'] - 'Mdi:arrowExpandHorizontal': typeof import('~icons/mdi/arrow-expand-horizontal')['default'] MdiAccount: typeof import('~icons/mdi/account')['default'] MdiAccountCircle: typeof import('~icons/mdi/account-circle')['default'] - MdiAccountGroup: typeof import('~icons/mdi/account-group')['default'] - MdiAccountGroupIcon: typeof import('~icons/mdi/account-group-icon')['default'] - MdiAccountIcon: typeof import('~icons/mdi/account-icon')['default'] MdiAccountOutline: typeof import('~icons/mdi/account-outline')['default'] - MdiAccountPlus: typeof import('~icons/mdi/account-plus')['default'] MdiAccountPlusOutline: typeof import('~icons/mdi/account-plus-outline')['default'] - MdiAccountSupervisorOutline: typeof import('~icons/mdi/account-supervisor-outline')['default'] MdiAlpha: typeof import('~icons/mdi/alpha')['default'] MdiAlphaA: typeof import('~icons/mdi/alpha-a')['default'] MdiApi: typeof import('~icons/mdi/api')['default'] MdiArrowExpand: typeof import('~icons/mdi/arrow-expand')['default'] - MdiArrowExpandHorizontal: typeof import('~icons/mdi/arrow-expand-horizontal')['default'] MdiArrowLeftBold: typeof import('~icons/mdi/arrow-left-bold')['default'] MdiAt: typeof import('~icons/mdi/at')['default'] MdiBackburger: typeof import('~icons/mdi/backburger')['default'] MdiBookOpenOutline: typeof import('~icons/mdi/book-open-outline')['default'] - MdiBookOpenPageVariantOutline: typeof import('~icons/mdi/book-open-page-variant-outline')['default'] MdiBugOutline: typeof import('~icons/mdi/bug-outline')['default'] MdiCalculator: typeof import('~icons/mdi/calculator')['default'] MdiCalendarMonth: typeof import('~icons/mdi/calendar-month')['default'] @@ -131,7 +113,6 @@ declare module '@vue/runtime-core' { MdiCellphoneMessage: typeof import('~icons/mdi/cellphone-message')['default'] MdiChat: typeof import('~icons/mdi/chat')['default'] MdiCheck: typeof import('~icons/mdi/check')['default'] - MdiChevronDoubleLeft: typeof import('~icons/mdi/chevron-double-left')['default'] MdiChevronDown: typeof import('~icons/mdi/chevron-down')['default'] MdiChevronLeft: typeof import('~icons/mdi/chevron-left')['default'] MdiClose: typeof import('~icons/mdi/close')['default'] @@ -145,7 +126,6 @@ declare module '@vue/runtime-core' { MdiContentCopy: typeof import('~icons/mdi/content-copy')['default'] MdiContentSave: typeof import('~icons/mdi/content-save')['default'] MdiCurrencyUsd: typeof import('~icons/mdi/currency-usd')['default'] - MdiDatabase: typeof import('~icons/mdi/database')['default'] MdiDatabaseOutline: typeof import('~icons/mdi/database-outline')['default'] MdiDelete: typeof import('~icons/mdi/delete')['default'] MdiDeleteOutline: typeof import('~icons/mdi/delete-outline')['default'] @@ -169,28 +149,20 @@ declare module '@vue/runtime-core' { MdiFileUploadOutline: typeof import('~icons/mdi/file-upload-outline')['default'] MdiFilterOutline: typeof import('~icons/mdi/filter-outline')['default'] MdiFlag: typeof import('~icons/mdi/flag')['default'] - MdiFlashOutline: typeof import('~icons/mdi/flash-outline')['default'] MdiFolder: typeof import('~icons/mdi/folder')['default'] - MdiFullscreen: typeof import('~icons/mdi/fullscreen')['default'] - MdiFullscreenExit: typeof import('~icons/mdi/fullscreen-exit')['default'] MdiFunction: typeof import('~icons/mdi/function')['default'] MdiGestureDoubleTap: typeof import('~icons/mdi/gesture-double-tap')['default'] MdiGithub: typeof import('~icons/mdi/github')['default'] - MdiGmail: typeof import('~icons/mdi/gmail')['default'] - MdiGridLarge: typeof import('~icons/mdi/grid-large')['default'] MdiHeart: typeof import('~icons/mdi/heart')['default'] MdiHook: typeof import('~icons/mdi/hook')['default'] MdiInformation: typeof import('~icons/mdi/information')['default'] MdiJson: typeof import('~icons/mdi/json')['default'] MdiKeyboardReturn: typeof import('~icons/mdi/keyboard-return')['default'] - MdiKeyChange: typeof import('~icons/mdi/key-change')['default'] - MdiKeyPlus: typeof import('~icons/mdi/key-plus')['default'] MdiKeyStar: typeof import('~icons/mdi/key-star')['default'] MdiLink: typeof import('~icons/mdi/link')['default'] MdiLinkVariant: typeof import('~icons/mdi/link-variant')['default'] MdiLinkVariantRemove: typeof import('~icons/mdi/link-variant-remove')['default'] MdiLoading: typeof import('~icons/mdi/loading')['default'] - MdiLockOutlineIcon: typeof import('~icons/mdi/lock-outline-icon')['default'] MdiLogin: typeof import('~icons/mdi/login')['default'] MdiLogout: typeof import('~icons/mdi/logout')['default'] MdiMagnify: typeof import('~icons/mdi/magnify')['default'] @@ -199,32 +171,23 @@ declare module '@vue/runtime-core' { MdiMicrosoftTeams: typeof import('~icons/mdi/microsoft-teams')['default'] MdiMinusCircleOutline: typeof import('~icons/mdi/minus-circle-outline')['default'] MdiMoonFull: typeof import('~icons/mdi/moon-full')['default'] - MdiNotebookCheckOutline: typeof import('~icons/mdi/notebook-check-outline')['default'] - MdiNull: typeof import('~icons/mdi/null')['default'] MdiNumeric: typeof import('~icons/mdi/numeric')['default'] MdiOpenInNew: typeof import('~icons/mdi/open-in-new')['default'] MdiPencil: typeof import('~icons/mdi/pencil')['default'] MdiPlus: typeof import('~icons/mdi/plus')['default'] - MdiPlusBoxOutline: typeof import('~icons/mdi/plus-box-outline')['default'] MdiPlusCircleOutline: typeof import('~icons/mdi/plus-circle-outline')['default'] MdiPlusOutline: typeof import('~icons/mdi/plus-outline')['default'] - MdiPlusRoundedOutline: typeof import('~icons/mdi/plus-rounded-outline')['default'] MdiRefresh: typeof import('~icons/mdi/refresh')['default'] MdiReload: typeof import('~icons/mdi/reload')['default'] MdiRocketLaunchOutline: typeof import('~icons/mdi/rocket-launch-outline')['default'] MdiScriptTextKeyOutline: typeof import('~icons/mdi/script-text-key-outline')['default'] MdiScriptTextOutline: typeof import('~icons/mdi/script-text-outline')['default'] - MdiSearch: typeof import('~icons/mdi/search')['default'] - MdiShieldLockOutline: typeof import('~icons/mdi/shield-lock-outline')['default'] MdiSlack: typeof import('~icons/mdi/slack')['default'] MdiSort: typeof import('~icons/mdi/sort')['default'] MdiStar: typeof import('~icons/mdi/star')['default'] MdiStarOutline: typeof import('~icons/mdi/star-outline')['default'] - MdiStore: typeof import('~icons/mdi/store')['default'] MdiTable: typeof import('~icons/mdi/table')['default'] MdiTableArrowRight: typeof import('~icons/mdi/table-arrow-right')['default'] - MdiTableBorder: typeof import('~icons/mdi/table-border')['default'] - MdiTableLarge: typeof import('~icons/mdi/table-large')['default'] MdiText: typeof import('~icons/mdi/text')['default'] MdiThumbUp: typeof import('~icons/mdi/thumb-up')['default'] MdiTrashCan: typeof import('~icons/mdi/trash-can')['default'] @@ -238,6 +201,5 @@ declare module '@vue/runtime-core' { PhFileCsv: typeof import('~icons/ph/file-csv')['default'] RouterLink: typeof import('vue-router')['RouterLink'] RouterView: typeof import('vue-router')['RouterView'] - SystemUiconsExpandWidth: typeof import('~icons/system-uicons/expand-width')['default'] } } diff --git a/packages/nc-gui/composables/useColumnCreateStore.ts b/packages/nc-gui/composables/useColumnCreateStore.ts index 1d01368c63..4f287356a5 100644 --- a/packages/nc-gui/composables/useColumnCreateStore.ts +++ b/packages/nc-gui/composables/useColumnCreateStore.ts @@ -4,7 +4,6 @@ import type { ColumnType, TableType } from 'nocodb-sdk' import { UITypes } from 'nocodb-sdk' import type { Ref } from 'vue' import { useI18n } from 'vue-i18n' -import { useColumn } from './useColumn' import { computed, createInjectionState, extractSdkResponseErrorMsg, useNuxtApp } from '#imports' const useForm = Form.useForm From ed2d640da4861d49dbddb068d65dac2f8387dc05 Mon Sep 17 00:00:00 2001 From: Pranav C Date: Sat, 17 Sep 2022 00:50:20 +0530 Subject: [PATCH 4/5] enhancement(gui): add not found page for handling invalid base url re #3648 Signed-off-by: Pranav C --- packages/nc-gui/composables/useProject.ts | 13 +++++++++++-- packages/nc-gui/pages/404.vue | 14 ++++++++++++++ 2 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 packages/nc-gui/pages/404.vue diff --git a/packages/nc-gui/composables/useProject.ts b/packages/nc-gui/composables/useProject.ts index 5aa7b15bb9..676a137cba 100644 --- a/packages/nc-gui/composables/useProject.ts +++ b/packages/nc-gui/composables/useProject.ts @@ -64,6 +64,8 @@ const [setup, use] = useInjectionState((_projectId?: MaybeRef) => { const isPg = computed(() => projectBaseType === 'pg') const isSharedBase = computed(() => projectType === 'base') + const router = useRouter() + async function loadProjectMetaInfo(force?: boolean) { if (!projectMetaInfo.value || force) { projectMetaInfo.value = await api.project.metaGet(project.value.id!, {}, {}) @@ -104,8 +106,15 @@ const [setup, use] = useInjectionState((_projectId?: MaybeRef) => { if (id) { project.value = await api.project.read(projectId.value) } else if (projectType === 'base') { - const baseData = await api.public.sharedBaseGet(route.params.projectId as string) - project.value = await api.project.read(baseData.project_id!) + try { + const baseData = await api.public.sharedBaseGet(route.params.projectId as string) + project.value = await api.project.read(baseData.project_id!) + } catch (e) { + if (e?.response?.status === 404) { + return router.push('/404') + } + throw e + } } else if (projectId.value) { project.value = await api.project.read(projectId.value) } else { diff --git a/packages/nc-gui/pages/404.vue b/packages/nc-gui/pages/404.vue new file mode 100644 index 0000000000..7197e8ef53 --- /dev/null +++ b/packages/nc-gui/pages/404.vue @@ -0,0 +1,14 @@ + + + From 07e248dc69f004d9f15ad2c655dacf9ed29ecd83 Mon Sep 17 00:00:00 2001 From: Pranav C Date: Sat, 17 Sep 2022 12:49:42 +0530 Subject: [PATCH 5/5] refactor(gui): move 404 page Signed-off-by: Pranav C --- packages/nc-gui/components.d.ts | 1 + packages/nc-gui/composables/useProject.ts | 4 ++-- packages/nc-gui/pages/{ => error}/404.vue | 7 +++++-- 3 files changed, 8 insertions(+), 4 deletions(-) rename packages/nc-gui/pages/{ => error}/404.vue (62%) diff --git a/packages/nc-gui/components.d.ts b/packages/nc-gui/components.d.ts index 30edfc757b..377cd11c6a 100644 --- a/packages/nc-gui/components.d.ts +++ b/packages/nc-gui/components.d.ts @@ -195,6 +195,7 @@ declare module '@vue/runtime-core' { MdiUpload: typeof import('~icons/mdi/upload')['default'] MdiUploadOutline: typeof import('~icons/mdi/upload-outline')['default'] MdiViewListOutline: typeof import('~icons/mdi/view-list-outline')['default'] + MdiWarning: typeof import('~icons/mdi/warning')['default'] MdiWhatsapp: typeof import('~icons/mdi/whatsapp')['default'] MdiXml: typeof import('~icons/mdi/xml')['default'] MiCircleWarning: typeof import('~icons/mi/circle-warning')['default'] diff --git a/packages/nc-gui/composables/useProject.ts b/packages/nc-gui/composables/useProject.ts index 676a137cba..f5b728d4f0 100644 --- a/packages/nc-gui/composables/useProject.ts +++ b/packages/nc-gui/composables/useProject.ts @@ -109,9 +109,9 @@ const [setup, use] = useInjectionState((_projectId?: MaybeRef) => { try { const baseData = await api.public.sharedBaseGet(route.params.projectId as string) project.value = await api.project.read(baseData.project_id!) - } catch (e) { + } catch (e: any) { if (e?.response?.status === 404) { - return router.push('/404') + return router.push('/error/404') } throw e } diff --git a/packages/nc-gui/pages/404.vue b/packages/nc-gui/pages/error/404.vue similarity index 62% rename from packages/nc-gui/pages/404.vue rename to packages/nc-gui/pages/error/404.vue index 7197e8ef53..0948eb7d08 100644 --- a/packages/nc-gui/pages/404.vue +++ b/packages/nc-gui/pages/error/404.vue @@ -2,13 +2,16 @@ import { definePageMeta } from '#imports' definePageMeta({ - title: 'Page Not Found', + requiresAuth: false, public: true, })