import type { NotebookSchemaPayload } from '@/lib/structured-views/types' export type BootstrapStructuredTarget = 'table' | 'kanban' export type BootstrapStructuredLabels = { statusName: string statusOptions: string[] } export type BootstrapStructuredActions = { getSchema: () => NotebookSchemaPayload | null enableStructuredMode: () => Promise addProperty: (name: string, type: string, options?: string[]) => Promise setKanbanGroupProperty: (propertyId: string | null) => Promise } function pickGroupProperty(schema: NotebookSchemaPayload, statusName: string) { return ( schema.properties.find((p) => p.type === 'select' && p.name === statusName) ?? schema.properties.find((p) => p.type === 'select') ?? null ) } /** Active une base organisable avec champs par défaut (Statut) si nécessaire. */ export async function bootstrapStructuredNotebook( target: BootstrapStructuredTarget, labels: BootstrapStructuredLabels, actions: BootstrapStructuredActions, ): Promise { let schema = actions.getSchema() if (!schema) { schema = await actions.enableStructuredMode() } if (!schema) { throw new Error('enable_failed') } const selectProps = schema.properties.filter((p) => p.type === 'select') const needsDefaultStatus = target === 'kanban' ? selectProps.length === 0 : schema.properties.length === 0 if (needsDefaultStatus) { schema = (await actions.addProperty(labels.statusName, 'select', labels.statusOptions)) ?? schema } if (target === 'kanban') { const groupProp = pickGroupProperty(schema, labels.statusName) if (!groupProp) { throw new Error('kanban_needs_select') } if (schema.viewSettings.kanbanGroupPropertyId !== groupProp.id) { await actions.setKanbanGroupProperty(groupProp.id) schema = { ...schema, viewSettings: { ...schema.viewSettings, kanbanGroupPropertyId: groupProp.id }, } } } return schema } /** Ajoute un champ Statut + colonnes kanban sur une base déjà active. */ export async function ensureKanbanStatusField( labels: BootstrapStructuredLabels, actions: BootstrapStructuredActions, ): Promise { return bootstrapStructuredNotebook('kanban', labels, actions) }