feat: 채번 규칙 저장 API 및 테이블 관리 기능 개선

- 채번 규칙 저장 API에서 ruleName을 필수로 설정하고, tableName과 columnName은 선택적으로 변경하였습니다.
- 테이블 관리 페이지에서 자동 저장 기능을 제거하고, 전체 저장 버튼으로 저장하도록 수정하였습니다.
- 카테고리 컬럼 선택 시, 선택된 컬럼의 테이블 이름과 컬럼 이름을 함께 전달하도록 개선하였습니다.
This commit is contained in:
kjs 2026-01-26 14:55:36 +09:00
parent 607d686535
commit 351d53cd0c
3 changed files with 13 additions and 14 deletions

View File

@ -284,6 +284,7 @@ router.get("/test/by-column/:tableName/:columnName", authenticateToken, async (r
}); });
// [테스트] 테스트 테이블에 채번 규칙 저장 // [테스트] 테스트 테이블에 채번 규칙 저장
// 채번 규칙은 독립적으로 생성 가능 (나중에 테이블 타입 관리에서 컬럼에 연결)
router.post("/test/save", authenticateToken, async (req: AuthenticatedRequest, res: Response) => { router.post("/test/save", authenticateToken, async (req: AuthenticatedRequest, res: Response) => {
const companyCode = req.user!.companyCode; const companyCode = req.user!.companyCode;
const userId = req.user!.userId; const userId = req.user!.userId;
@ -291,15 +292,17 @@ router.post("/test/save", authenticateToken, async (req: AuthenticatedRequest, r
logger.info("[테스트] 채번 규칙 저장 요청", { logger.info("[테스트] 채번 규칙 저장 요청", {
ruleId: ruleConfig.ruleId, ruleId: ruleConfig.ruleId,
tableName: ruleConfig.tableName, ruleName: ruleConfig.ruleName,
columnName: ruleConfig.columnName, tableName: ruleConfig.tableName || "(미지정)",
columnName: ruleConfig.columnName || "(미지정)",
}); });
try { try {
if (!ruleConfig.tableName || !ruleConfig.columnName) { // ruleName만 필수, tableName/columnName은 선택 (나중에 테이블 타입 관리에서 연결)
if (!ruleConfig.ruleName) {
return res.status(400).json({ return res.status(400).json({
success: false, success: false,
error: "tableName and columnName are required" error: "ruleName is required"
}); });
} }

View File

@ -1810,7 +1810,7 @@ export default function TableManagementPage() {
<CommandGroup> <CommandGroup>
<CommandItem <CommandItem
value="none" value="none"
onSelect={async () => { onSelect={() => {
const columnIndex = columns.findIndex( const columnIndex = columns.findIndex(
(c) => c.columnName === column.columnName, (c) => c.columnName === column.columnName,
); );
@ -1819,9 +1819,7 @@ export default function TableManagementPage() {
...prev, ...prev,
[column.columnName]: false, [column.columnName]: false,
})); }));
// 🆕 자동 저장 (선택 해제) // 자동 저장 제거 - 전체 저장 버튼으로 저장
const updatedColumn = { ...column, numberingRuleId: undefined };
await handleSaveColumn(updatedColumn);
}} }}
className="text-xs" className="text-xs"
> >
@ -1837,19 +1835,17 @@ export default function TableManagementPage() {
<CommandItem <CommandItem
key={rule.ruleId} key={rule.ruleId}
value={`${rule.ruleName} ${rule.ruleId}`} value={`${rule.ruleName} ${rule.ruleId}`}
onSelect={async () => { onSelect={() => {
const columnIndex = columns.findIndex( const columnIndex = columns.findIndex(
(c) => c.columnName === column.columnName, (c) => c.columnName === column.columnName,
); );
// 상태 업데이트 // 상태 업데이트만 (자동 저장 제거)
handleColumnChange(columnIndex, "numberingRuleId", rule.ruleId); handleColumnChange(columnIndex, "numberingRuleId", rule.ruleId);
setNumberingComboboxOpen((prev) => ({ setNumberingComboboxOpen((prev) => ({
...prev, ...prev,
[column.columnName]: false, [column.columnName]: false,
})); }));
// 🆕 자동 저장 // 전체 저장 버튼으로 저장
const updatedColumn = { ...column, numberingRuleId: rule.ruleId };
await handleSaveColumn(updatedColumn);
}} }}
className="text-xs" className="text-xs"
> >

View File

@ -196,7 +196,7 @@ export function CategoryColumnList({ tableName, selectedColumn, onColumnSelect,
// 첫 번째 컬럼 자동 선택 // 첫 번째 컬럼 자동 선택
if (columnsWithCount.length > 0 && !selectedColumn) { if (columnsWithCount.length > 0 && !selectedColumn) {
const firstCol = columnsWithCount[0]; const firstCol = columnsWithCount[0];
onColumnSelect(firstCol.columnName, firstCol.columnLabel, firstCol.tableName); onColumnSelect(`${firstCol.tableName}.${firstCol.columnName}`, firstCol.columnLabel, firstCol.tableName);
} }
} catch (error) { } catch (error) {
console.error("❌ 카테고리 컬럼 조회 실패:", error); console.error("❌ 카테고리 컬럼 조회 실패:", error);