From 2eb8c3a61ba35e57f16dcd4396ad84ef8c897494 Mon Sep 17 00:00:00 2001 From: dohyeons Date: Fri, 14 Nov 2025 11:16:03 +0900 Subject: [PATCH] =?UTF-8?q?=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EC=B9=B4?= =?UTF-8?q?=EB=93=9C=20=EB=A0=8C=EB=8D=94=EB=A7=81=20=EB=AC=B8=EC=A0=9C=20?= =?UTF-8?q?=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/dashboard/WidgetConfigSidebar.tsx | 4 + .../dashboard/widgets/ListTestWidget.tsx | 138 ++++++++++++------ 2 files changed, 97 insertions(+), 45 deletions(-) diff --git a/frontend/components/admin/dashboard/WidgetConfigSidebar.tsx b/frontend/components/admin/dashboard/WidgetConfigSidebar.tsx index d126d8d9..a18abf9a 100644 --- a/frontend/components/admin/dashboard/WidgetConfigSidebar.tsx +++ b/frontend/components/admin/dashboard/WidgetConfigSidebar.tsx @@ -352,6 +352,10 @@ export function WidgetConfigSidebar({ element, isOpen, onClose, onApply }: Widge console.log("๐Ÿ”ง [WidgetConfigSidebar] handleApply ํ˜ธ์ถœ:", { subtype: element.subtype, + isMultiDataSourceWidget, + dataSources, + listConfig, + finalChartConfig, customMetricConfig, updatedElement, }); diff --git a/frontend/components/dashboard/widgets/ListTestWidget.tsx b/frontend/components/dashboard/widgets/ListTestWidget.tsx index fdddb234..c46244b1 100644 --- a/frontend/components/dashboard/widgets/ListTestWidget.tsx +++ b/frontend/components/dashboard/widgets/ListTestWidget.tsx @@ -37,8 +37,19 @@ export function ListTestWidget({ element }: ListTestWidgetProps) { // // console.log("๐Ÿงช ListTestWidget ๋ Œ๋”๋ง!", element); const dataSources = useMemo(() => { - return element?.dataSources || element?.chartConfig?.dataSources; - }, [element?.dataSources, element?.chartConfig?.dataSources]); + // ๋‹ค์ค‘ ๋ฐ์ดํ„ฐ ์†Œ์Šค ์šฐ์„  + const multiSources = element?.dataSources || element?.chartConfig?.dataSources; + if (multiSources && multiSources.length > 0) { + return multiSources; + } + + // ๋‹จ์ผ ๋ฐ์ดํ„ฐ ์†Œ์Šค fallback (๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜) + if (element?.dataSource) { + return [element.dataSource]; + } + + return []; + }, [element?.dataSources, element?.chartConfig?.dataSources, element?.dataSource]); // // console.log("๐Ÿ“Š dataSources ํ™•์ธ:", { // hasDataSources: !!dataSources, @@ -58,6 +69,27 @@ export function ListTestWidget({ element }: ListTestWidgetProps) { cardColumns: 3, }; + // visible ์ปฌ๋Ÿผ ์„ค์ • ๊ฐ์ฒด ๋ฐฐ์—ด (field + label) + const visibleColumnConfigs = useMemo(() => { + if (config.columns && config.columns.length > 0 && typeof config.columns[0] === "object") { + return config.columns.filter((col: any) => col.visible !== false); + } + return []; + }, [config.columns]); + + // ํ‘œ์‹œํ•  ์ปฌ๋Ÿผ ํ•„๋“œ๋ช… (๋ฐ์ดํ„ฐ ์ ‘๊ทผ์šฉ) + const displayColumns = useMemo(() => { + if (!data?.columns) return []; + + // ์ปฌ๋Ÿผ ์„ค์ •์ด ์žˆ์œผ๋ฉด field ์‚ฌ์šฉ + if (visibleColumnConfigs.length > 0) { + return visibleColumnConfigs.map((col: any) => col.field); + } + + // ์ž๋™ ๋ชจ๋“œ: ๋ชจ๋“  ์ปฌ๋Ÿผ ํ‘œ์‹œ + return data.columns; + }, [data?.columns, visibleColumnConfigs]); + // ๋‹ค์ค‘ ๋ฐ์ดํ„ฐ ์†Œ์Šค ๋กœ๋”ฉ const loadMultipleDataSources = useCallback(async () => { if (!dataSources || dataSources.length === 0) { @@ -313,50 +345,66 @@ export function ListTestWidget({ element }: ListTestWidgetProps) { const paginatedRows = data?.rows.slice(startIndex, endIndex) || []; // ํ…Œ์ด๋ธ” ๋ทฐ - const renderTable = () => ( -
- - {config.showHeader && ( - - - {data?.columns.map((col) => ( - - {col} - - ))} - - - )} - - {paginatedRows.map((row, idx) => ( - - {data?.columns.map((col) => ( - - {String(row[col] ?? "")} - - ))} - - ))} - -
-
- ); + const renderTable = () => { + // ํ—ค๋”๋ช… ๊ฐ€์ ธ์˜ค๊ธฐ (label ์šฐ์„ , ์—†์œผ๋ฉด field ๊ทธ๋Œ€๋กœ) + const getHeaderLabel = (field: string) => { + const colConfig = visibleColumnConfigs.find((col: any) => col.field === field); + return colConfig?.label || field; + }; + + return ( +
+ + {config.showHeader && ( + + + {displayColumns.map((field) => ( + + {getHeaderLabel(field)} + + ))} + + + )} + + {paginatedRows.map((row, idx) => ( + + {displayColumns.map((field) => ( + + {String(row[field] ?? "")} + + ))} + + ))} + +
+
+ ); + }; // ์นด๋“œ ๋ทฐ - const renderCards = () => ( -
- {paginatedRows.map((row, idx) => ( - - {data?.columns.map((col) => ( -
- {col}: - {String(row[col] ?? "")} -
- ))} -
- ))} -
- ); + const renderCards = () => { + // ํ—ค๋”๋ช… ๊ฐ€์ ธ์˜ค๊ธฐ (label ์šฐ์„ , ์—†์œผ๋ฉด field ๊ทธ๋Œ€๋กœ) + const getLabel = (field: string) => { + const colConfig = visibleColumnConfigs.find((col: any) => col.field === field); + return colConfig?.label || field; + }; + + return ( +
+ {paginatedRows.map((row, idx) => ( + + {displayColumns.map((field) => ( +
+ {getLabel(field)}: + {String(row[field] ?? "")} +
+ ))} +
+ ))} +
+ ); + }; return (
@@ -396,7 +444,7 @@ export function ListTestWidget({ element }: ListTestWidgetProps) {

{error}

- ) : !(element?.dataSources || element?.chartConfig?.dataSources) || (element?.dataSources || element?.chartConfig?.dataSources)?.length === 0 ? ( + ) : !dataSources || dataSources.length === 0 ? (

๋ฐ์ดํ„ฐ ์†Œ์Šค๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ์„ธ์š”