diff --git a/packages/nc-gui/components/smartsheet/column/LookupOptions.vue b/packages/nc-gui/components/smartsheet/column/LookupOptions.vue index 6c08af0cc0..01cdb90ca4 100644 --- a/packages/nc-gui/components/smartsheet/column/LookupOptions.vue +++ b/packages/nc-gui/components/smartsheet/column/LookupOptions.vue @@ -22,7 +22,7 @@ const baseStore = useBase() const { tables } = storeToRefs(baseStore) -const { metas } = useMetas() +const { metas, getMeta } = useMetas() setAdditionalValidations({ fk_relation_column_id: [{ required: true, message: t('general.required') }], @@ -48,12 +48,15 @@ const refTables = computed(() => { return _refTables as Required }>[] }) +const selectedTable = computed(() => { + return refTables.value.find((t) => t.column.id === vModel.value.fk_relation_column_id) +}) + const columns = computed(() => { - const selectedTable = refTables.value.find((t) => t.column.id === vModel.value.fk_relation_column_id) - if (!selectedTable?.id) { + if (!selectedTable.value?.id) { return [] } - return metas.value[selectedTable.id].columns.filter( + return metas.value[selectedTable.value.id]?.columns.filter( (c: ColumnType) => vModel.value.fk_lookup_column_id === c.id || (!isSystemColumn(c) && c.id !== vModel.value.id && c.uidt !== UITypes.Links), ) @@ -66,7 +69,10 @@ onMounted(() => { } }) -const onRelationColChange = () => { +const onRelationColChange = async () => { + if (selectedTable.value) { + await getMeta(selectedTable.value.id) + } vModel.value.fk_lookup_column_id = columns.value?.[0]?.id onDataTypeChange() } diff --git a/packages/nc-gui/components/smartsheet/column/RollupOptions.vue b/packages/nc-gui/components/smartsheet/column/RollupOptions.vue index f1170621f9..4681f03bd0 100644 --- a/packages/nc-gui/components/smartsheet/column/RollupOptions.vue +++ b/packages/nc-gui/components/smartsheet/column/RollupOptions.vue @@ -35,7 +35,7 @@ const baseStore = useBase() const { tables } = storeToRefs(baseStore) -const { metas } = useMetas() +const { metas, getMeta } = useMetas() const { t } = useI18n() @@ -70,14 +70,16 @@ const refTables = computed(() => { return _refTables as Required }>[] }) -const columns = computed(() => { - const selectedTable = refTables.value.find((t) => t.column.id === vModel.value.fk_relation_column_id) +const selectedTable = computed(() => { + return refTables.value.find((t) => t.column.id === vModel.value.fk_relation_column_id) +}) - if (!selectedTable?.id) { +const columns = computed(() => { + if (!selectedTable.value?.id) { return [] } - return metas.value[selectedTable.id].columns.filter( + return metas.value[selectedTable.value.id]?.columns.filter( (c: ColumnType) => !isVirtualCol(c.uidt as UITypes) && (!isSystemColumn(c) || c.pk), ) }) @@ -90,7 +92,10 @@ onMounted(() => { } }) -const onRelationColChange = () => { +const onRelationColChange = async () => { + if (selectedTable.value) { + await getMeta(selectedTable.value.id) + } vModel.value.fk_rollup_column_id = columns.value?.[0]?.id onDataTypeChange() } diff --git a/packages/nc-gui/composables/useApi/interceptors.ts b/packages/nc-gui/composables/useApi/interceptors.ts index e8f26da9be..cf6032b2a0 100644 --- a/packages/nc-gui/composables/useApi/interceptors.ts +++ b/packages/nc-gui/composables/useApi/interceptors.ts @@ -84,11 +84,15 @@ export function addAxiosInterceptors(api: Api) { // ignore since it could have already been handled and redirected to sign in }) } else { - // if refreshTokenPromise = new Promise((resolve, reject) => { refreshTokenPromiseRes = resolve refreshTokenPromiseRej = reject }) + + // set a catch on the promise to avoid unhandled promise rejection + refreshTokenPromise.catch(() => { + // ignore + }) } // Try request again with new token diff --git a/packages/nc-gui/composables/useGlobal/index.ts b/packages/nc-gui/composables/useGlobal/index.ts index 1e538b016d..12259b4419 100644 --- a/packages/nc-gui/composables/useGlobal/index.ts +++ b/packages/nc-gui/composables/useGlobal/index.ts @@ -66,6 +66,8 @@ export const useGlobal = createGlobalState((): UseGlobalReturn => { (nextPayload) => { if (nextPayload) { state.user.value = { + // keep existing props if user id same as before + ...(state.user.value?.id === nextPayload.id ? state.user.value || {} : {}), id: nextPayload.id, email: nextPayload.email, firstname: nextPayload.firstname, diff --git a/packages/nc-gui/composables/useSmartsheetStore.ts b/packages/nc-gui/composables/useSmartsheetStore.ts index 9f26b9de5c..9a50975408 100644 --- a/packages/nc-gui/composables/useSmartsheetStore.ts +++ b/packages/nc-gui/composables/useSmartsheetStore.ts @@ -21,7 +21,7 @@ const [useProvideSmartsheetStore, useSmartsheetStore] = useInjectionState( const { sqlUis } = storeToRefs(baseStore) - const sqlUi = ref( + const sqlUi = computed(() => (meta.value as TableType)?.source_id ? sqlUis.value[(meta.value as TableType).source_id!] : Object.values(sqlUis.value)[0], ) diff --git a/packages/nc-gui/composables/useViewData.ts b/packages/nc-gui/composables/useViewData.ts index 545fb95b22..ef44dc5cd4 100644 --- a/packages/nc-gui/composables/useViewData.ts +++ b/packages/nc-gui/composables/useViewData.ts @@ -211,7 +211,8 @@ export function useViewData( if (error.code === 'ERR_CANCELED') { return } - throw error + console.error(error) + return message.error(await extractSdkResponseErrorMsg(error)) } formattedData.value = formatData(response.list) paginationData.value = response.pageInfo @@ -238,10 +239,13 @@ export function useViewData( async function changePage(page: number) { paginationData.value.page = page - await loadData({ - offset: (page - 1) * (paginationData.value.pageSize || appInfoDefaultLimit), - where: where?.value, - } as any) + await loadData( + { + offset: (page - 1) * (paginationData.value.pageSize || appInfoDefaultLimit), + where: where?.value, + } as any, + true, + ) } const { diff --git a/packages/nc-gui/utils/columnUtils.ts b/packages/nc-gui/utils/columnUtils.ts index a83333067b..316056a332 100644 --- a/packages/nc-gui/utils/columnUtils.ts +++ b/packages/nc-gui/utils/columnUtils.ts @@ -184,6 +184,7 @@ const isColumnRequired = (col?: ColumnType) => col && col.rqd && !col.cdf && !co const isVirtualColRequired = (col: ColumnType, columns: ColumnType[]) => col.uidt === UITypes.LinkToAnotherRecord && + col.colOptions && (col.colOptions).type === RelationTypes.BELONGS_TO && isColumnRequired(columns.find((c) => c.id === (col.colOptions).fk_child_column_id)) diff --git a/packages/nocodb/src/cache/RedisCacheMgr.ts b/packages/nocodb/src/cache/RedisCacheMgr.ts index 9bf39eebc3..5e22447617 100644 --- a/packages/nocodb/src/cache/RedisCacheMgr.ts +++ b/packages/nocodb/src/cache/RedisCacheMgr.ts @@ -14,7 +14,10 @@ export default class RedisCacheMgr extends CacheMgr { this.client = new Redis(config); // avoid flushing db in worker container - if (process.env.NC_WORKER_CONTAINER !== 'true' && process.env.NC_CLOUD !== 'true') { + if ( + process.env.NC_WORKER_CONTAINER !== 'true' && + process.env.NC_CLOUD !== 'true' + ) { // flush the existing db with selected key (Default: 0) this.client.flushdb(); } diff --git a/packages/nocodb/src/db/BaseModelSqlv2.ts b/packages/nocodb/src/db/BaseModelSqlv2.ts index c8d36bc8c9..b30079ca59 100644 --- a/packages/nocodb/src/db/BaseModelSqlv2.ts +++ b/packages/nocodb/src/db/BaseModelSqlv2.ts @@ -5757,7 +5757,7 @@ class BaseModelSqlv2 { if (Object.keys(updateObject).length === 0) return; - const qb = knex(model.table_name).update(updateObject); + const qb = knex(this.getTnPath(model.table_name)).update(updateObject); for (const rowId of Array.isArray(rowIds) ? rowIds : [rowIds]) { qb.orWhere(await this._wherePk(rowId));