diff --git a/packages/nocodb/src/helpers/populateMeta.ts b/packages/nocodb/src/helpers/populateMeta.ts index 39ca7d1d2b..9e90114430 100644 --- a/packages/nocodb/src/helpers/populateMeta.ts +++ b/packages/nocodb/src/helpers/populateMeta.ts @@ -1,5 +1,6 @@ import { ModelTypes, UITypes, ViewTypes } from 'nocodb-sdk'; import { isVirtualCol, RelationTypes } from 'nocodb-sdk'; +import { GridViewColumn } from '../models'; import Column from '../models/Column'; import Model from '../models/Model'; import NcConnectionMgrv2 from '../utils/common/NcConnectionMgrv2'; @@ -9,6 +10,7 @@ import getTableNameAlias, { getColumnNameAlias } from '../helpers/getTableName'; import getColumnUiType from '../helpers/getColumnUiType'; import mapDefaultDisplayValue from '../helpers/mapDefaultDisplayValue'; import { getUniqueColumnAliasName } from './getUniqueName'; +import type { RollupColumn } from '../models'; import type LinkToAnotherRecordColumn from '../models/LinkToAnotherRecordColumn'; import type Base from '../models/Base'; import type Project from '../models/Project'; @@ -435,3 +437,49 @@ export async function populateMeta(base: Base, project: Project): Promise { return info; } + +export async function populateRollupColumnAndHideLTAR( + base: Base, + project: Project, +) { + for (const model of await Model.list({ + project_id: project.id, + base_id: base.id, + })) { + const columns = await model.getColumns(); + const hmAndMmLTARColumns = columns.filter( + (c) => + c.uidt === UITypes.LinkToAnotherRecord && + c.colOptions.type !== RelationTypes.BELONGS_TO && + !c.system, + ); + + const views = await model.getViews(); + + for (const column of hmAndMmLTARColumns) { + const relatedModel = await column + .getColOptions() + .then((colOpt) => colOpt.getRelatedTable()); + await relatedModel.getColumns(); + const pkId = + relatedModel.primaryKey?.id || (await relatedModel.getColumns())[0]?.id; + + await Column.insert({ + uidt: 'Rollup', + title: getUniqueColumnAliasName( + await model.getColumns(), + `${relatedModel.title} Count`, + ), + fk_rollup_column_id: pkId, + fk_model_id: model.id, + rollup_function: 'count', + fk_relation_column_id: column.id, + }); + + const viewCol = await GridViewColumn.list(views[0].id).then((cols) => + cols.find((c) => c.fk_column_id === column.id), + ); + await GridViewColumn.update(viewCol.id, { show: false }); + } + } +} diff --git a/packages/nocodb/src/services/bases.service.ts b/packages/nocodb/src/services/bases.service.ts index 48bd9e6130..f68b6c01ee 100644 --- a/packages/nocodb/src/services/bases.service.ts +++ b/packages/nocodb/src/services/bases.service.ts @@ -1,6 +1,7 @@ import { Injectable } from '@nestjs/common'; import { T } from 'nc-help'; import { populateMeta, validatePayload } from '../helpers'; +import { populateRollupColumnAndHideLTAR } from '../helpers/populateMeta' import { syncBaseMigration } from '../helpers/syncMigration'; import { Base, Project } from '../models'; import type { BaseReqType } from 'nocodb-sdk'; @@ -69,6 +70,8 @@ export class BasesService { const info = await populateMeta(base, project); + await populateRollupColumnAndHideLTAR(base, project); + T.emit('evt_api_created', info); delete base.config; diff --git a/packages/nocodb/src/services/projects.service.ts b/packages/nocodb/src/services/projects.service.ts index eb93634a4f..f5ace226c6 100644 --- a/packages/nocodb/src/services/projects.service.ts +++ b/packages/nocodb/src/services/projects.service.ts @@ -7,6 +7,7 @@ import { OrgUserRoles } from 'nocodb-sdk'; import { populateMeta, validatePayload } from '../helpers'; import { NcError } from '../helpers/catchError'; import { extractPropsAndSanitize } from '../helpers/extractProps'; +import { populateRollupColumnAndHideLTAR } from '../helpers/populateMeta' import syncMigration from '../helpers/syncMigration'; import { Project, ProjectUser } from '../models'; import Noco from '../Noco'; @@ -167,6 +168,8 @@ export class ProjectsService { for (const base of await project.getBases()) { const info = await populateMeta(base, project); + await populateRollupColumnAndHideLTAR(base, project); + T.emit('evt_api_created', info); delete base.config; }