Compare commits

..

No commits in common. "9597494685d987846dc10cd10b57ae1690ce4ad1" and "979a5ddd9a021e2f0d0392a9060c18d4dcb25ada" have entirely different histories.

7 changed files with 648 additions and 1444 deletions

View File

@ -22,15 +22,6 @@ const router = Router();
// 모든 role 라우트에 인증 미들웨어 적용 // 모든 role 라우트에 인증 미들웨어 적용
router.use(authenticateToken); router.use(authenticateToken);
/**
* (/:id )
*/
// 현재 사용자가 속한 권한 그룹 조회
router.get("/user/my-groups", getUserRoleGroups);
// 특정 사용자가 속한 권한 그룹 조회
router.get("/user/:userId/groups", requireAdmin, getUserRoleGroups);
/** /**
* CRUD * CRUD
*/ */
@ -76,4 +67,13 @@ router.get("/:id/menu-permissions", requireAdmin, getMenuPermissions);
// 메뉴 권한 설정 // 메뉴 권한 설정
router.put("/:id/menu-permissions", requireAdmin, setMenuPermissions); router.put("/:id/menu-permissions", requireAdmin, setMenuPermissions);
/**
*
*/
// 현재 사용자가 속한 권한 그룹 조회
router.get("/user/my-groups", getUserRoleGroups);
// 특정 사용자가 속한 권한 그룹 조회
router.get("/user/:userId/groups", requireAdmin, getUserRoleGroups);
export default router; export default router;

File diff suppressed because it is too large Load Diff

View File

@ -916,7 +916,7 @@ export function CanvasElement({
) : element.type === "widget" && element.subtype === "weather" ? ( ) : element.type === "widget" && element.subtype === "weather" ? (
// 날씨 위젯 렌더링 // 날씨 위젯 렌더링
<div className="widget-interactive-area h-full w-full"> <div className="widget-interactive-area h-full w-full">
<WeatherWidget element={element} city="서울" refreshInterval={600000} /> <WeatherWidget city="서울" refreshInterval={600000} />
</div> </div>
) : element.type === "widget" && element.subtype === "exchange" ? ( ) : element.type === "widget" && element.subtype === "exchange" ? (
// 환율 위젯 렌더링 // 환율 위젯 렌더링

View File

@ -2146,32 +2146,32 @@ export default function DigitalTwinEditor({ layoutId, layoutName, onBack }: Digi
<Table> <Table>
<TableHeader className="bg-muted sticky top-0"> <TableHeader className="bg-muted sticky top-0">
<TableRow> <TableRow>
<TableHead className="w-[70px] whitespace-nowrap px-3 py-3 text-sm"></TableHead> <TableHead className="w-[60px] text-xs"></TableHead>
{(hierarchyConfig?.material?.displayColumns || []).map((col) => ( {(hierarchyConfig?.material?.displayColumns || []).map((col) => (
<TableHead key={col.column} className="px-3 py-3 text-sm"> <TableHead key={col.column} className="text-xs">
{col.label} {col.label}
</TableHead> </TableHead>
))} ))}
</TableRow> </TableRow>
</TableHeader> </TableHeader>
<TableBody> <TableBody>
{materials.map((material, index) => { {materials.map((material, index) => {
const layerColumn = hierarchyConfig?.material?.layerColumn || "LOLAYER"; const layerColumn = hierarchyConfig?.material?.layerColumn || "LOLAYER";
const keyColumn = hierarchyConfig?.material?.keyColumn || "STKKEY"; const keyColumn = hierarchyConfig?.material?.keyColumn || "STKKEY";
const displayColumns = hierarchyConfig?.material?.displayColumns || []; const displayColumns = hierarchyConfig?.material?.displayColumns || [];
const layerNumber = material[layerColumn] || index + 1; const layerNumber = material[layerColumn] || index + 1;
return ( return (
<TableRow key={material[keyColumn] || `material-${index}`}> <TableRow key={material[keyColumn] || `material-${index}`}>
<TableCell className="whitespace-nowrap px-3 py-3 text-sm font-medium">{layerNumber}</TableCell> <TableCell className="text-xs font-medium">{layerNumber}</TableCell>
{displayColumns.map((col) => ( {displayColumns.map((col) => (
<TableCell key={col.column} className="px-3 py-3 text-sm"> <TableCell key={col.column} className="text-xs">
{material[col.column] || "-"} {material[col.column] || "-"}
</TableCell> </TableCell>
))} ))}
</TableRow> </TableRow>
); );
})} })}
</TableBody> </TableBody>
</Table> </Table>
</div> </div>

View File

@ -274,15 +274,15 @@ export function QueryManager() {
</Badge> </Badge>
</div> </div>
</AccordionTrigger> </AccordionTrigger>
<Button <Button
variant="ghost" variant="ghost"
size="sm" size="sm"
onClick={(e) => handleDeleteQuery(query.id, e)} onClick={(e) => handleDeleteQuery(query.id, e)}
className="h-7 w-7 shrink-0 p-0" className="h-7 w-7 shrink-0 p-0"
> >
<Trash2 className="h-4 w-4 text-red-500" /> <Trash2 className="h-4 w-4 text-red-500" />
</Button> </Button>
</div> </div>
<AccordionContent className="space-y-4 pt-1 pr-0 pb-3 pl-0"> <AccordionContent className="space-y-4 pt-1 pr-0 pb-3 pl-0">
{/* 쿼리 이름 */} {/* 쿼리 이름 */}
<div className="space-y-2"> <div className="space-y-2">

View File

@ -486,11 +486,11 @@ export function ReportPreviewModal({ isOpen, onClose }: ReportPreviewModalProps)
} }
} }
return component; return component;
}), }),
); );
return { ...page, components: componentsWithBase64 }; return { ...page, components: componentsWithBase64 };
}), }),
); );
// 쿼리 결과 수집 // 쿼리 결과 수집
const queryResults: Record<string, { fields: string[]; rows: Record<string, unknown>[] }> = {}; const queryResults: Record<string, { fields: string[]; rows: Record<string, unknown>[] }> = {};