From 8ce0ba921f6f9933fce322fcf74471a6999e6d65 Mon Sep 17 00:00:00 2001 From: Nick the Sick Date: Mon, 17 Nov 2025 13:35:54 +0100 Subject: [PATCH] fix: do not error on invalid backgroundColor or textColor #2176 --- .../src/docx/defaultSchema/blocks.ts | 19 ++++++++++---- .../src/docx/defaultSchema/styles.ts | 17 +++++++------ .../xl-docx-exporter/src/docx/util/Table.tsx | 25 +++++++++++++------ .../src/react-email/reactEmailExporter.tsx | 8 ++---- .../src/odt/defaultSchema/blocks.tsx | 16 ++++-------- .../src/odt/defaultSchema/styles.ts | 13 ++++++---- .../src/pdf/defaultSchema/styles.tsx | 8 ++---- .../xl-pdf-exporter/src/pdf/pdfExporter.tsx | 8 ++---- .../src/pdf/util/table/Table.tsx | 11 +++----- 9 files changed, 64 insertions(+), 61 deletions(-) diff --git a/packages/xl-docx-exporter/src/docx/defaultSchema/blocks.ts b/packages/xl-docx-exporter/src/docx/defaultSchema/blocks.ts index c80818fb96..6e7d7ae161 100644 --- a/packages/xl-docx-exporter/src/docx/defaultSchema/blocks.ts +++ b/packages/xl-docx-exporter/src/docx/defaultSchema/blocks.ts @@ -35,16 +35,25 @@ function blockPropsToStyles( ? undefined : { type: ShadingType.SOLID, - color: - colors[ - props.backgroundColor as keyof typeof colors - ].background.slice(1), + color: (() => { + const color = colors[props.backgroundColor]?.background; + if (!color) { + return undefined; + } + return color.slice(1); + })(), }, run: props.textColor === "default" || !props.textColor ? undefined : { - color: colors[props.textColor as keyof typeof colors].text.slice(1), + color: (() => { + const color = colors[props.textColor]?.text; + if (!color) { + return undefined; + } + return color.slice(1); + })(), }, alignment: !props.textAlignment || props.textAlignment === "left" diff --git a/packages/xl-docx-exporter/src/docx/defaultSchema/styles.ts b/packages/xl-docx-exporter/src/docx/defaultSchema/styles.ts index 1d56e25aaa..c102e034ab 100644 --- a/packages/xl-docx-exporter/src/docx/defaultSchema/styles.ts +++ b/packages/xl-docx-exporter/src/docx/defaultSchema/styles.ts @@ -43,11 +43,13 @@ export const docxStyleMappingForDefaultSchema: StyleMapping< if (!val) { return {}; } + const color = exporter.options.colors[val]?.background; + if (!color) { + return {}; + } return { shading: { - fill: exporter.options.colors[ - val as keyof typeof exporter.options.colors - ].background.slice(1), + fill: color.slice(1), }, }; }, @@ -55,11 +57,12 @@ export const docxStyleMappingForDefaultSchema: StyleMapping< if (!val) { return {}; } + const color = exporter.options.colors[val]?.text; + if (!color) { + return {}; + } return { - color: - exporter.options.colors[ - val as keyof typeof exporter.options.colors - ].text.slice(1), + color: color.slice(1), }; }, code: (val) => { diff --git a/packages/xl-docx-exporter/src/docx/util/Table.tsx b/packages/xl-docx-exporter/src/docx/util/Table.tsx index e9aab7c9ee..0bd70defdc 100644 --- a/packages/xl-docx-exporter/src/docx/util/Table.tsx +++ b/packages/xl-docx-exporter/src/docx/util/Table.tsx @@ -55,11 +55,15 @@ export const Table = ( ? undefined : { type: ShadingType.SOLID, - color: - t.options.colors[ - cell.props - .backgroundColor as keyof typeof t.options.colors - ].background.slice(1), + color: (() => { + const color = + t.options.colors[cell.props.backgroundColor] + ?.background; + if (!color) { + return undefined; + } + return color.slice(1); + })(), }, children: [ new Paragraph({ @@ -88,9 +92,14 @@ export const Table = ( color: cell.props.textColor === "default" || !cell.props.textColor ? undefined - : t.options.colors[ - cell.props.textColor as keyof typeof t.options.colors - ].text.slice(1), + : (() => { + const color = + t.options.colors[cell.props.textColor]?.text; + if (!color) { + return undefined; + } + return color.slice(1); + })(), }, }), ], diff --git a/packages/xl-email-exporter/src/react-email/reactEmailExporter.tsx b/packages/xl-email-exporter/src/react-email/reactEmailExporter.tsx index 3721f569b0..191ae980ad 100644 --- a/packages/xl-email-exporter/src/react-email/reactEmailExporter.tsx +++ b/packages/xl-email-exporter/src/react-email/reactEmailExporter.tsx @@ -333,15 +333,11 @@ export class ReactEmailExporter< backgroundColor: props.backgroundColor === "default" || !props.backgroundColor ? undefined - : this.options.colors[ - props.backgroundColor as keyof typeof this.options.colors - ].background, + : this.options.colors[props.backgroundColor]?.background, color: props.textColor === "default" || !props.textColor ? undefined - : this.options.colors[ - props.textColor as keyof typeof this.options.colors - ].text, + : this.options.colors[props.textColor]?.text, alignItems: props.textAlignment === "right" ? "flex-end" diff --git a/packages/xl-odt-exporter/src/odt/defaultSchema/blocks.tsx b/packages/xl-odt-exporter/src/odt/defaultSchema/blocks.tsx index 85fa80d0ff..c6d6794f78 100644 --- a/packages/xl-odt-exporter/src/odt/defaultSchema/blocks.tsx +++ b/packages/xl-odt-exporter/src/odt/defaultSchema/blocks.tsx @@ -41,9 +41,7 @@ const createParagraphStyle = ( const backgroundColor = props.backgroundColor && props.backgroundColor !== "default" - ? exporter.options.colors[ - props.backgroundColor as keyof typeof exporter.options.colors - ].background + ? exporter.options.colors[props.backgroundColor]?.background : undefined; if (backgroundColor) { @@ -54,7 +52,7 @@ const createParagraphStyle = ( const color = exporter.options.colors[ props.textColor as keyof typeof exporter.options.colors - ].text; + ]?.text ?? props.textColor; textStyles["fo:color"] = color; } @@ -115,18 +113,14 @@ const createTableCellStyle = ( fo:background-color={ cell.props.backgroundColor !== "default" && cell.props.backgroundColor - ? exporter.options.colors[ - cell.props - .backgroundColor as keyof typeof exporter.options.colors - ].background + ? exporter.options.colors?.[cell.props.backgroundColor] + ?.background : undefined } // TODO This is not applying because the children set their own colors fo:color={ cell.props.textColor !== "default" && cell.props.textColor - ? exporter.options.colors[ - cell.props.textColor as keyof typeof exporter.options.colors - ].text + ? exporter.options.colors[cell.props.textColor]?.text : undefined } /> diff --git a/packages/xl-odt-exporter/src/odt/defaultSchema/styles.ts b/packages/xl-odt-exporter/src/odt/defaultSchema/styles.ts index 0034697483..a875e798c7 100644 --- a/packages/xl-odt-exporter/src/odt/defaultSchema/styles.ts +++ b/packages/xl-odt-exporter/src/odt/defaultSchema/styles.ts @@ -35,8 +35,10 @@ export const odtStyleMappingForDefaultSchema: StyleMapping< if (!val) { return {}; } - const color = - exporter.options.colors[val as keyof typeof exporter.options.colors].text; + const color = exporter.options.colors[val]?.text; + if (!color) { + return {}; + } return { "fo:color": color }; }, @@ -44,9 +46,10 @@ export const odtStyleMappingForDefaultSchema: StyleMapping< if (!val) { return {}; } - const color = - exporter.options.colors[val as keyof typeof exporter.options.colors] - .background; + const color = exporter.options.colors[val]?.background; + if (!color) { + return {}; + } return { "fo:background-color": color }; }, diff --git a/packages/xl-pdf-exporter/src/pdf/defaultSchema/styles.tsx b/packages/xl-pdf-exporter/src/pdf/defaultSchema/styles.tsx index 40ee152c3f..2dd479a49a 100644 --- a/packages/xl-pdf-exporter/src/pdf/defaultSchema/styles.tsx +++ b/packages/xl-pdf-exporter/src/pdf/defaultSchema/styles.tsx @@ -42,9 +42,7 @@ export const pdfStyleMappingForDefaultSchema: StyleMapping< return {}; } return { - backgroundColor: - exporter.options.colors[val as keyof typeof exporter.options.colors] - .background, + backgroundColor: exporter.options.colors[val]?.background, }; }, textColor: (val, exporter) => { @@ -52,9 +50,7 @@ export const pdfStyleMappingForDefaultSchema: StyleMapping< return {}; } return { - color: - exporter.options.colors[val as keyof typeof exporter.options.colors] - .text, + color: exporter.options.colors[val]?.text, }; }, code: (val) => { diff --git a/packages/xl-pdf-exporter/src/pdf/pdfExporter.tsx b/packages/xl-pdf-exporter/src/pdf/pdfExporter.tsx index 50ea545e33..87ef5b8ca5 100644 --- a/packages/xl-pdf-exporter/src/pdf/pdfExporter.tsx +++ b/packages/xl-pdf-exporter/src/pdf/pdfExporter.tsx @@ -296,15 +296,11 @@ export class PDFExporter< backgroundColor: props.backgroundColor === "default" || !props.backgroundColor ? undefined - : this.options.colors[ - props.backgroundColor as keyof typeof this.options.colors - ].background, + : this.options.colors[props.backgroundColor]?.background, color: props.textColor === "default" || !props.textColor ? undefined - : this.options.colors[ - props.textColor as keyof typeof this.options.colors - ].text, + : this.options.colors[props.textColor]?.text, alignItems: props.textAlignment === "right" ? "flex-end" diff --git a/packages/xl-pdf-exporter/src/pdf/util/table/Table.tsx b/packages/xl-pdf-exporter/src/pdf/util/table/Table.tsx index 67d75a9b65..93f4cd8ee1 100644 --- a/packages/xl-pdf-exporter/src/pdf/util/table/Table.tsx +++ b/packages/xl-pdf-exporter/src/pdf/util/table/Table.tsx @@ -88,17 +88,14 @@ export const Table = (props: { color: cell.props.textColor === "default" ? undefined - : props.transformer.options.colors[ - cell.props - .textColor as keyof typeof props.transformer.options.colors - ].text, + : props.transformer.options.colors[cell.props.textColor] + ?.text, backgroundColor: cell.props.backgroundColor === "default" ? undefined : props.transformer.options.colors[ - cell.props - .backgroundColor as keyof typeof props.transformer.options.colors - ].background, + cell.props.backgroundColor + ]?.background, textAlign: cell.props.textAlignment, }, ]}