diff --git a/components/admin/extra-sheet-editor.tsx b/components/admin/extra-sheet-editor.tsx index 8e77684..d5f4c32 100644 --- a/components/admin/extra-sheet-editor.tsx +++ b/components/admin/extra-sheet-editor.tsx @@ -223,7 +223,7 @@ export function ExtraSheetEditor({ type="color" aria-label="เลือกสีพื้นหลังเซลล์" className="absolute inset-0 cursor-pointer opacity-0" - value={activeRow?.backgrounds[activeColumn?.id ?? ""] ?? DEFAULT_CELL_BACKGROUND} + value={activeRow?.backgrounds?.[activeColumn?.id ?? ""] ?? DEFAULT_CELL_BACKGROUND} onChange={(event) => onChange(updateExtraSheetCells(value, selectedPoints(), { backgroundColor: event.target.value, }))} diff --git a/components/public/structured-guide.tsx b/components/public/structured-guide.tsx index a166afb..2815d2b 100644 --- a/components/public/structured-guide.tsx +++ b/components/public/structured-guide.tsx @@ -1288,7 +1288,7 @@ function ExtraSectionContent({ diff --git a/lib/guides/extra-sheet.test.ts b/lib/guides/extra-sheet.test.ts index dcabf7a..5988e73 100644 --- a/lib/guides/extra-sheet.test.ts +++ b/lib/guides/extra-sheet.test.ts @@ -14,6 +14,7 @@ import { normalizeExtraSheetRichText, updateExtraSheetCell, updateExtraSheetCells, + type ExtraSheet, } from "@/lib/guides/extra-sheet"; function idFactory() { @@ -122,4 +123,17 @@ describe("Extra sheet", () => { expect(updateExtraSheetCells(updated, [{ row: 0, column: 0 }], { backgroundColor: null }) .rows[0].backgrounds).toEqual({}); }); + + it("renders legacy sheets that do not have background metadata yet", () => { + const sheet = createExtraSheet(idFactory()); + const legacy = { + ...sheet, + rows: sheet.rows.map((row) => ({ id: row.id, cells: row.cells })), + } as ExtraSheet; + + expect(extraSheetToMatrix(legacy)[0][0]).toEqual({ + value: "", + backgroundColor: undefined, + }); + }); }); diff --git a/lib/guides/extra-sheet.ts b/lib/guides/extra-sheet.ts index c456d7f..3426ece 100644 --- a/lib/guides/extra-sheet.ts +++ b/lib/guides/extra-sheet.ts @@ -28,7 +28,7 @@ export const extraSheetSchema = z.strictObject({ context.addIssue({ code: "custom", path: ["rows"], message: "รหัสแถวต้องไม่ซ้ำกัน" }); } sheet.rows.forEach((row, rowIndex) => { - [...Object.keys(row.cells), ...Object.keys(row.backgrounds)].forEach((columnId) => { + [...Object.keys(row.cells), ...Object.keys(row.backgrounds ?? {})].forEach((columnId) => { if (!columnIds.has(columnId)) { context.addIssue({ code: "custom", @@ -72,7 +72,7 @@ export function extraSheetToMatrix(sheet: ExtraSheet): ExtraSheetMatrix { return sheet.rows.map((row) => sheet.columns.map((column) => ({ value: row.cells[column.id] ?? "", - backgroundColor: row.backgrounds[column.id], + backgroundColor: row.backgrounds?.[column.id], })), ); } @@ -102,7 +102,7 @@ export function matrixToExtraSheet( ])), backgrounds: Object.fromEntries(columns.flatMap((column, columnIndex) => { const backgroundColor = matrix[rowIndex]?.[columnIndex]?.backgroundColor - ?? sheet.rows[rowIndex]?.backgrounds[column.id]; + ?? sheet.rows[rowIndex]?.backgrounds?.[column.id]; return backgroundColor ? [[column.id, backgroundColor]] : []; })), })); @@ -164,7 +164,7 @@ export function deleteExtraSheetColumn(sheet: ExtraSheet, index: number): ExtraS rows: sheet.rows.map((row) => ({ ...row, cells: Object.fromEntries(Object.entries(row.cells).filter(([key]) => key !== columnId)), - backgrounds: Object.fromEntries(Object.entries(row.backgrounds).filter(([key]) => key !== columnId)), + backgrounds: Object.fromEntries(Object.entries(row.backgrounds ?? {}).filter(([key]) => key !== columnId)), })), }; } @@ -201,7 +201,7 @@ export function updateExtraSheetCells( ...sheet, rows: sheet.rows.map((row, rowIndex) => { const cells = { ...row.cells }; - const backgrounds = { ...row.backgrounds }; + const backgrounds = { ...(row.backgrounds ?? {}) }; sheet.columns.forEach((column, columnIndex) => { if (!selected.has(`${rowIndex}:${columnIndex}`)) return; if (update.value !== undefined) cells[column.id] = update.value;