Compare commits

...

3 commits

Author SHA1 Message Date
a23f836358 fix(database-view): resolve default Grid view on insert
After createTable, fetch the auto-created views via the new
GET /admin/tables/:tableId/views endpoint and use the Grid view id
when inserting the embed node. Previously viewId was an empty string,
so the renderer always rendered 'No rows found in this view'.
2026-05-12 09:08:03 +00:00
3c1b7a094d fix(backlinks): match database-view node type in kebab-case
The shared schema in @docmost/editor-ext registers the node as
'database-view'; the parser was comparing against the camelCase
form so database_embed links were never extracted.
2026-05-12 09:08:03 +00:00
60654d5d2f fix(backlinks): read workspaceId from camelCased Kysely row
Kysely's CamelCasePlugin (configured globally) rewrites snake_case
columns to camelCase on result rows, so result.rows[0].workspace_id
was undefined and the subsequent insert hit UNDEFINED_VALUE, leaving
acadenice_backlink empty and the Knowledge Graph blank.
2026-05-12 09:08:03 +00:00
4 changed files with 32 additions and 8 deletions

View file

@ -164,6 +164,16 @@ export async function deleteField(
await api.delete(`/api/v1/admin/fields/${fieldId}`); await api.delete(`/api/v1/admin/fields/${fieldId}`);
} }
export async function listViews(
tableId: number,
bridgeUrl?: string | null,
): Promise<Array<{ id: number; name: string; type: string }>> {
const api = getBridgeClient(resolveBridgeUrl(bridgeUrl));
return unwrap<Array<{ id: number; name: string; type: string }>>(
api.get(`/api/v1/admin/tables/${tableId}/views`),
);
}
export async function createView( export async function createView(
tableId: number, tableId: number,
payload: { name: string; type: 'grid' | 'gallery' | 'kanban' | 'calendar' | 'timeline' | 'form' }, payload: { name: string; type: 'grid' | 'gallery' | 'kanban' | 'calendar' | 'timeline' | 'form' },

View file

@ -31,6 +31,7 @@ import {
createDatabase, createDatabase,
createTable, createTable,
createField, createField,
listViews,
} from "../services/admin-client"; } from "../services/admin-client";
type Step = "name" | "fields" | "creating"; type Step = "name" | "fields" | "creating";
@ -184,15 +185,24 @@ export function CreateDatabaseModal({
await createField(table.id, payload as never, bridgeUrl); await createField(table.id, payload as never, bridgeUrl);
} }
// Step 4: insert the new table as a Tiptap node into the editor. // Step 4: resolve the auto-created Grid view of the new table, then
// We don't have a viewId here yet — Baserow auto-creates a default Grid // insert the embed node with a real viewId (without it the renderer
// view at table creation. We let the rendererfetch the first view. // shows "No rows found in this view").
const views = await listViews(table.id, bridgeUrl);
const defaultView =
views.find((v) => v.type === "grid") ?? views[0] ?? null;
if (!defaultView) {
throw new Error(
"Table creee mais aucune vue par defaut trouvee. Reessayez ou contactez un admin.",
);
}
editor editor
.chain() .chain()
.focus() .focus()
.insertDatabaseView({ .insertDatabaseView({
tableId: String(table.id), tableId: String(table.id),
viewId: "", viewId: String(defaultView.id),
viewType: "grid", viewType: "grid",
bridgeUrl: bridgeUrl ?? null, bridgeUrl: bridgeUrl ?? null,
}) })

View file

@ -35,7 +35,10 @@ export class BacklinkIndexerService {
let page: { content: any; workspaceId: string } | null = null; let page: { content: any; workspaceId: string } | null = null;
try { try {
const result = await sql<{ content: any; workspace_id: string }>` // Kysely's CamelCasePlugin (configured in database.module.ts) maps
// snake_case columns to camelCase keys at runtime, so the row type
// must reflect the post-plugin shape.
const result = await sql<{ content: any; workspaceId: string }>`
SELECT p.content, s.workspace_id SELECT p.content, s.workspace_id
FROM pages p FROM pages p
JOIN spaces s ON s.id = p.space_id JOIN spaces s ON s.id = p.space_id
@ -51,7 +54,7 @@ export class BacklinkIndexerService {
page = { page = {
content: result.rows[0].content, content: result.rows[0].content,
workspaceId: result.rows[0].workspace_id, workspaceId: result.rows[0].workspaceId,
}; };
} catch (err) { } catch (err) {
this.logger.error( this.logger.error(

View file

@ -137,8 +137,9 @@ export class BacklinkParserService {
}); });
} }
// --- R3.1.c databaseView node (embed links a page indirectly via pageId attr) --- // --- R3.1.c database-view node (embed links a page indirectly via pageId attr) ---
if (type === 'databaseView' && attrs.pageId) { // The shared schema in @docmost/editor-ext uses kebab-case as the node name.
if (type === 'database-view' && attrs.pageId) {
out.push({ out.push({
linkType: 'database_embed', linkType: 'database_embed',
pageId: attrs.pageId, pageId: attrs.pageId,