DashboardDesigner 오류 해결
This commit is contained in:
parent
5d1d11869c
commit
9953014b88
|
|
@ -140,12 +140,8 @@ export default function DashboardDesigner({ dashboardId: initialDashboardId }: D
|
||||||
// 대시보드 ID가 props로 전달되면 로드
|
// 대시보드 ID가 props로 전달되면 로드
|
||||||
React.useEffect(() => {
|
React.useEffect(() => {
|
||||||
if (initialDashboardId) {
|
if (initialDashboardId) {
|
||||||
console.log("📝 기존 대시보드 편집 모드");
|
|
||||||
loadDashboard(initialDashboardId);
|
loadDashboard(initialDashboardId);
|
||||||
} else {
|
|
||||||
console.log("✨ 새 대시보드 생성 모드 - 감지된 해상도:", resolution);
|
|
||||||
}
|
}
|
||||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
||||||
}, [initialDashboardId]);
|
}, [initialDashboardId]);
|
||||||
|
|
||||||
// 대시보드 데이터 로드
|
// 대시보드 데이터 로드
|
||||||
|
|
@ -155,35 +151,21 @@ export default function DashboardDesigner({ dashboardId: initialDashboardId }: D
|
||||||
const { dashboardApi } = await import("@/lib/api/dashboard");
|
const { dashboardApi } = await import("@/lib/api/dashboard");
|
||||||
const dashboard = await dashboardApi.getDashboard(id);
|
const dashboard = await dashboardApi.getDashboard(id);
|
||||||
|
|
||||||
console.log("📊 대시보드 로드:", {
|
|
||||||
id: dashboard.id,
|
|
||||||
title: dashboard.title,
|
|
||||||
settings: dashboard.settings,
|
|
||||||
settingsType: typeof dashboard.settings,
|
|
||||||
});
|
|
||||||
|
|
||||||
// 대시보드 정보 설정
|
// 대시보드 정보 설정
|
||||||
setDashboardId(dashboard.id);
|
setDashboardId(dashboard.id);
|
||||||
setDashboardTitle(dashboard.title);
|
setDashboardTitle(dashboard.title);
|
||||||
|
|
||||||
// 저장된 설정 복원
|
// 저장된 설정 복원
|
||||||
const settings = (dashboard as { settings?: { resolution?: Resolution; backgroundColor?: string } }).settings;
|
const settings = (dashboard as { settings?: { resolution?: Resolution; backgroundColor?: string } }).settings;
|
||||||
console.log("🎨 설정 복원:", {
|
|
||||||
settings,
|
|
||||||
resolution: settings?.resolution,
|
|
||||||
backgroundColor: settings?.backgroundColor,
|
|
||||||
});
|
|
||||||
|
|
||||||
// 배경색 설정
|
// 배경색 설정
|
||||||
if (settings?.backgroundColor) {
|
if (settings?.backgroundColor) {
|
||||||
setCanvasBackgroundColor(settings.backgroundColor);
|
setCanvasBackgroundColor(settings.backgroundColor);
|
||||||
console.log("✅ BackgroundColor 설정됨:", settings.backgroundColor);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 해상도와 요소를 함께 설정 (해상도가 먼저 반영되어야 함)
|
// 해상도와 요소를 함께 설정 (해상도가 먼저 반영되어야 함)
|
||||||
const loadedResolution = settings?.resolution || "fhd";
|
const loadedResolution = settings?.resolution || "fhd";
|
||||||
setResolution(loadedResolution);
|
setResolution(loadedResolution);
|
||||||
console.log("✅ Resolution 설정됨:", loadedResolution);
|
|
||||||
|
|
||||||
// 요소들 설정
|
// 요소들 설정
|
||||||
if (dashboard.elements && dashboard.elements.length > 0) {
|
if (dashboard.elements && dashboard.elements.length > 0) {
|
||||||
|
|
@ -221,7 +203,6 @@ export default function DashboardDesigner({ dashboardId: initialDashboardId }: D
|
||||||
(type: ElementType, subtype: ElementSubtype, x: number, y: number) => {
|
(type: ElementType, subtype: ElementSubtype, x: number, y: number) => {
|
||||||
// 좌표 유효성 검사
|
// 좌표 유효성 검사
|
||||||
if (isNaN(x) || isNaN(y)) {
|
if (isNaN(x) || isNaN(y)) {
|
||||||
// console.error("Invalid coordinates:", { x, y });
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -246,14 +227,6 @@ export default function DashboardDesigner({ dashboardId: initialDashboardId }: D
|
||||||
|
|
||||||
// 크기 유효성 검사
|
// 크기 유효성 검사
|
||||||
if (isNaN(defaultWidth) || isNaN(defaultHeight) || defaultWidth <= 0 || defaultHeight <= 0) {
|
if (isNaN(defaultWidth) || isNaN(defaultHeight) || defaultWidth <= 0 || defaultHeight <= 0) {
|
||||||
// console.error("Invalid size calculated:", {
|
|
||||||
// canvasConfig,
|
|
||||||
// cellSize,
|
|
||||||
// cellWithGap,
|
|
||||||
// defaultCells,
|
|
||||||
// defaultWidth,
|
|
||||||
// defaultHeight,
|
|
||||||
// });
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -287,7 +260,6 @@ export default function DashboardDesigner({ dashboardId: initialDashboardId }: D
|
||||||
|
|
||||||
// 좌표 유효성 확인
|
// 좌표 유효성 확인
|
||||||
if (isNaN(centerX) || isNaN(centerY)) {
|
if (isNaN(centerX) || isNaN(centerY)) {
|
||||||
// console.error("Invalid canvas config:", canvasConfig);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -375,16 +347,6 @@ export default function DashboardDesigner({ dashboardId: initialDashboardId }: D
|
||||||
setClearConfirmOpen(false);
|
setClearConfirmOpen(false);
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
// 리스트/야드 위젯 설정 저장 (Partial 업데이트)
|
|
||||||
const saveWidgetConfig = useCallback(
|
|
||||||
(updates: Partial<DashboardElement>) => {
|
|
||||||
if (sidebarElement) {
|
|
||||||
updateElement(sidebarElement.id, updates);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
[sidebarElement, updateElement],
|
|
||||||
);
|
|
||||||
|
|
||||||
// 사이드바 닫기
|
// 사이드바 닫기
|
||||||
const handleCloseSidebar = useCallback(() => {
|
const handleCloseSidebar = useCallback(() => {
|
||||||
setSidebarOpen(false);
|
setSidebarOpen(false);
|
||||||
|
|
@ -436,14 +398,6 @@ export default function DashboardDesigner({ dashboardId: initialDashboardId }: D
|
||||||
const { dashboardApi } = await import("@/lib/api/dashboard");
|
const { dashboardApi } = await import("@/lib/api/dashboard");
|
||||||
|
|
||||||
const elementsData = elements.map((el) => {
|
const elementsData = elements.map((el) => {
|
||||||
// 야드 위젯인 경우 설정 로그 출력
|
|
||||||
// if (el.subtype === "yard-management-3d") {
|
|
||||||
// console.log("💾 야드 위젯 저장:", {
|
|
||||||
// id: el.id,
|
|
||||||
// yardConfig: el.yardConfig,
|
|
||||||
// hasLayoutId: !!el.yardConfig?.layoutId,
|
|
||||||
// });
|
|
||||||
// }
|
|
||||||
return {
|
return {
|
||||||
id: el.id,
|
id: el.id,
|
||||||
type: el.type,
|
type: el.type,
|
||||||
|
|
@ -487,12 +441,6 @@ export default function DashboardDesigner({ dashboardId: initialDashboardId }: D
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
console.log("💾 대시보드 업데이트 요청:", {
|
|
||||||
dashboardId,
|
|
||||||
updateData,
|
|
||||||
elementsCount: elementsData.length,
|
|
||||||
});
|
|
||||||
|
|
||||||
savedDashboard = await dashboardApi.updateDashboard(dashboardId, updateData);
|
savedDashboard = await dashboardApi.updateDashboard(dashboardId, updateData);
|
||||||
} else {
|
} else {
|
||||||
// 새 대시보드 생성
|
// 새 대시보드 생성
|
||||||
|
|
@ -553,18 +501,7 @@ export default function DashboardDesigner({ dashboardId: initialDashboardId }: D
|
||||||
// 성공 모달 표시
|
// 성공 모달 표시
|
||||||
setSuccessModalOpen(true);
|
setSuccessModalOpen(true);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error("❌ 대시보드 저장 실패:", error);
|
|
||||||
const errorMessage = error instanceof Error ? error.message : "알 수 없는 오류";
|
const errorMessage = error instanceof Error ? error.message : "알 수 없는 오류";
|
||||||
|
|
||||||
// 상세한 에러 정보 로깅
|
|
||||||
if (error instanceof Error) {
|
|
||||||
console.error("Error details:", {
|
|
||||||
message: error.message,
|
|
||||||
stack: error.stack,
|
|
||||||
name: error.name,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
alert(`대시보드 저장 중 오류가 발생했습니다.\n\n오류: ${errorMessage}`);
|
alert(`대시보드 저장 중 오류가 발생했습니다.\n\n오류: ${errorMessage}`);
|
||||||
throw error;
|
throw error;
|
||||||
}
|
}
|
||||||
|
|
@ -754,13 +691,13 @@ function getElementTitle(type: ElementType, subtype: ElementSubtype): string {
|
||||||
return "달력 위젯";
|
return "달력 위젯";
|
||||||
case "driver-management":
|
case "driver-management":
|
||||||
return "기사 관리 위젯";
|
return "기사 관리 위젯";
|
||||||
case "list":
|
case "list-v2":
|
||||||
return "리스트 위젯";
|
return "리스트 위젯";
|
||||||
case "map-summary":
|
case "map-summary-v2":
|
||||||
return "커스텀 지도 카드";
|
return "커스텀 지도 카드";
|
||||||
case "status-summary":
|
case "status-summary":
|
||||||
return "커스텀 상태 카드";
|
return "커스텀 상태 카드";
|
||||||
case "risk-alert":
|
case "risk-alert-v2":
|
||||||
return "리스크 알림 위젯";
|
return "리스크 알림 위젯";
|
||||||
case "todo":
|
case "todo":
|
||||||
return "할 일 위젯";
|
return "할 일 위젯";
|
||||||
|
|
@ -814,7 +751,7 @@ function getElementContent(type: ElementType, subtype: ElementSubtype): string {
|
||||||
return "calendar";
|
return "calendar";
|
||||||
case "driver-management":
|
case "driver-management":
|
||||||
return "driver-management";
|
return "driver-management";
|
||||||
case "list":
|
case "list-v2":
|
||||||
return "list-widget";
|
return "list-widget";
|
||||||
case "yard-management-3d":
|
case "yard-management-3d":
|
||||||
return "yard-3d";
|
return "yard-3d";
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue