From f3967b57dc339892a19e561cda5e7f94da7411dc Mon Sep 17 00:00:00 2001 From: Nathan Arthur Date: Wed, 17 Apr 2024 16:03:38 -0400 Subject: [PATCH] use user field name when getting linked rows --- src/codegen/makeGetter.spec.ts | 20 +++++++++++++++++++- src/codegen/makeGetter.ts | 12 +++++++----- src/row.spec.ts | 4 ++-- src/row.ts | 5 ++--- tsconfig.dev.json | 5 +++-- tsconfig.json | 2 +- 6 files changed, 34 insertions(+), 14 deletions(-) diff --git a/src/codegen/makeGetter.spec.ts b/src/codegen/makeGetter.spec.ts index 831e824..b0f1cda 100644 --- a/src/codegen/makeGetter.spec.ts +++ b/src/codegen/makeGetter.spec.ts @@ -8,7 +8,17 @@ function run(field: Partial = {}): string { { id: 1, name: "table_name", - fields: [], + fields: [ + { + id: 2, + name: "field_name", + table_id: 0, + order: 0, + type: "", + primary: false, + read_only: false, + }, + ], }, ]); } @@ -98,6 +108,14 @@ describe("makeGetter", () => { }, "this.getLinkedRows", ], + [ + { + type: "link_row", + link_row_table_id: 1, + link_row_related_field_id: 2, + }, + `"field_name"`, + ], ])("%s => `%s`", (field, expected) => { expect(run(field)).toContain(expected); }); diff --git a/src/codegen/makeGetter.ts b/src/codegen/makeGetter.ts index e7b3b38..0b5cd25 100644 --- a/src/codegen/makeGetter.ts +++ b/src/codegen/makeGetter.ts @@ -3,10 +3,7 @@ import { FieldDefinition, ListFieldsResponse } from "../index.js"; import { getRawType } from "./getRawType.js"; import { toCamelCase } from "./toCamelCase.js"; -function getForeignTable( - field: FieldDefinition, - tables: Table[], -): { id: number; name: string } { +function getForeignTable(field: FieldDefinition, tables: Table[]): Table { if (!field.link_row_table_id) { throw new Error("link_row_table_id is missing"); } @@ -59,7 +56,12 @@ function getBody(field: FieldDefinition, tables: Table[]): string { if (field.type === "link_row") { const foreignTable = getForeignTable(field, tables); - return `return this.getLinkedRows(${field.link_row_table_id}, ${field.link_row_related_field_id}, ${foreignTable.name}Row);`; + const tableId = field.link_row_table_id; + const fieldId = field.link_row_related_field_id; + const foreignField = foreignTable.fields.find((f) => f.id === fieldId); + const fieldName = foreignField?.name; + const className = `${foreignTable.name}Row`; + return `return this.getLinkedRows(${tableId}, "${fieldName}", ${className});`; } if (field.type === "date" || field.formula_type === "date") { diff --git a/src/row.spec.ts b/src/row.spec.ts index 3de16bb..b211557 100644 --- a/src/row.spec.ts +++ b/src/row.spec.ts @@ -4,7 +4,7 @@ import { describe, it, expect, vi } from "vitest"; class MyRow extends Row { public async doSomething(): Promise[]> { - return this.getLinkedRows(1, 2, MyRow); + return this.getLinkedRows(1, "the_field", MyRow); } } @@ -31,7 +31,7 @@ describe("Row", () => { filters: expect.objectContaining({ filters: expect.arrayContaining([ expect.objectContaining({ - field: 2, + field: "the_field", }), ]), }), diff --git a/src/row.ts b/src/row.ts index a40f28a..349b397 100644 --- a/src/row.ts +++ b/src/row.ts @@ -52,17 +52,16 @@ export abstract class Row< protected getLinkedRows( tableId: number, - fieldId: number, + field: string, defaultClass: RowClass, ): Promise { return this.repository.getMany(tableId, defaultClass, { - user_field_names: false, filters: { filter_type: "AND", filters: [ { type: "link_row_has", - field: fieldId, + field, value: this.getId().toString(), }, ], diff --git a/tsconfig.dev.json b/tsconfig.dev.json index 3ec03bf..b21c370 100644 --- a/tsconfig.dev.json +++ b/tsconfig.dev.json @@ -1,7 +1,8 @@ { "extends": "./tsconfig.json", "compilerOptions": { - "noEmit": true + "noEmit": true, + "outDir": null }, - "exclude": ["dist", ".baserowrc"] + "exclude": ["./dist/**/*", ".baserowrc"] } diff --git a/tsconfig.json b/tsconfig.json index 149652a..7b5faaa 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -14,7 +14,7 @@ "types": ["node"] }, "exclude": [ - "dist", + "./dist/**/*", "**/*.spec.ts", "vitest.config.ts", "vitest.setup.ts",