From 6b83782bd73df0b3aeef12896ff0e17acc4d3b0b Mon Sep 17 00:00:00 2001 From: William Gorge Date: Tue, 25 Nov 2025 09:10:23 +0100 Subject: [PATCH 1/2] LKE-13676 fix(thumbnails): have coherent thumbnails --- src/api/Visualization/types.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/api/Visualization/types.ts b/src/api/Visualization/types.ts index 84501d6f..8458cfd3 100644 --- a/src/api/Visualization/types.ts +++ b/src/api/Visualization/types.ts @@ -147,6 +147,10 @@ export interface IVisualizationTimeline { zoomLevel?: ZoomLevel; } +export interface VisualizationThumbnailData { + svg: string; +} + export interface BaseVisualization { nodes: IVizNodeInfo[]; nodeGroups?: IVizNodeGroupInfo[]; @@ -218,6 +222,7 @@ export interface ICreateVisualizationParams extends IDataSourceParams { timeline?: IVisualizationTimeline; layout?: VisualizationLayout; geo?: IVisualizationGeo; + thumbnail?: VisualizationThumbnailData; } export interface IDuplicateVisualizationParams extends IDataSourceParams { @@ -254,6 +259,7 @@ export interface SharedVisualization { locked: boolean; lastLockedByUser: Pick; lastEditedByUser: Pick; + thumbnail?: VisualizationThumbnailData; } export type GetSharedVisualizationsResponse = SharedVisualization[]; @@ -291,6 +297,7 @@ export interface VisualizationTreeItem { lastLockedByUser: Pick; lastEditedByUser: Pick; locked: boolean; + thumbnail?: VisualizationThumbnailData; } export type VisualizationTree = Tree; From 8d3d4d24003f7fea3389e18ddde995ebe49889a1 Mon Sep 17 00:00:00 2001 From: William Gorge Date: Thu, 27 Nov 2025 15:28:34 +0100 Subject: [PATCH 2/2] LKE-13676 fix: limit thumbnail size --- src/api/Visualization/types.ts | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/api/Visualization/types.ts b/src/api/Visualization/types.ts index 8458cfd3..0030d01e 100644 --- a/src/api/Visualization/types.ts +++ b/src/api/Visualization/types.ts @@ -148,7 +148,17 @@ export interface IVisualizationTimeline { } export interface VisualizationThumbnailData { - svg: string; + svg: string; // Should not exceed a certain size, cf isThumbnailTooLarge +} + +export const MAX_VISUALIZATION_THUMBNAIL_SIZE_BYTES = 2_097_152; // 2MB + +export function isThumbnailTooLarge( + thumbnail: VisualizationThumbnailData | null | undefined +): boolean { + const thumbnailContent = thumbnail?.svg ?? ''; + const thumbnailSizeBytes = new TextEncoder().encode(thumbnailContent).byteLength; + return thumbnailSizeBytes > MAX_VISUALIZATION_THUMBNAIL_SIZE_BYTES; } export interface BaseVisualization { @@ -222,7 +232,7 @@ export interface ICreateVisualizationParams extends IDataSourceParams { timeline?: IVisualizationTimeline; layout?: VisualizationLayout; geo?: IVisualizationGeo; - thumbnail?: VisualizationThumbnailData; + thumbnail?: VisualizationThumbnailData | null; // Set explicitly to null to remove an existing thumbnail } export interface IDuplicateVisualizationParams extends IDataSourceParams {