diff --git a/frontend/lib/registry/components/table-list/TableListComponent.tsx b/frontend/lib/registry/components/table-list/TableListComponent.tsx index 22c26e45..5b397d57 100644 --- a/frontend/lib/registry/components/table-list/TableListComponent.tsx +++ b/frontend/lib/registry/components/table-list/TableListComponent.tsx @@ -365,6 +365,10 @@ export const TableListComponent: React.FC = ({ const [columnMeta, setColumnMeta] = useState< Record >({}); + // ๐Ÿ†• ์—”ํ‹ฐํ‹ฐ ์กฐ์ธ ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ (ํ…Œ์ด๋ธ”๋ช….์ปฌ๋Ÿผ๋ช… โ†’ inputType) + const [joinedColumnMeta, setJoinedColumnMeta] = useState< + Record + >({}); const [categoryMappings, setCategoryMappings] = useState< Record> >({}); @@ -1044,58 +1048,119 @@ export const TableListComponent: React.FC = ({ } } - // ๐Ÿ†• ์—”ํ‹ฐํ‹ฐ ์กฐ์ธ ์ปฌ๋Ÿผ ์ค‘ ์นดํ…Œ๊ณ ๋ฆฌ ํƒ€์ž…์ด ์•„๋‹ˆ์ง€๋งŒ ์กฐ์ธ๋œ ํ…Œ์ด๋ธ”์˜ ์นดํ…Œ๊ณ ๋ฆฌ ํ•„๋“œ์ธ ๊ฒฝ์šฐ๋„ ๋กœ๋“œ - // ํ™”๋ฉด ์„ค์ •์˜ columns์—์„œ "ํ…Œ์ด๋ธ”๋ช….์ปฌ๋Ÿผ๋ช…" ํ˜•ํƒœ์˜ ์กฐ์ธ ์ปฌ๋Ÿผ ์ถ”์ถœ + // ๐Ÿ†• ์—”ํ‹ฐํ‹ฐ ์กฐ์ธ ์ปฌ๋Ÿผ์˜ inputType ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ ๋ฐ ์นดํ…Œ๊ณ ๋ฆฌ ๋งคํ•‘ ๋กœ๋“œ + // 1. "ํ…Œ์ด๋ธ”๋ช….์ปฌ๋Ÿผ๋ช…" ํ˜•ํƒœ์˜ ์กฐ์ธ ์ปฌ๋Ÿผ ์ถ”์ถœ const joinedColumns = tableConfig.columns ?.filter((col) => col.columnName?.includes(".")) .map((col) => col.columnName) || []; - // ์•Œ๋ ค์ง„ ์นดํ…Œ๊ณ ๋ฆฌ ํ•„๋“œ ๋ชฉ๋ก (์กฐ์ธ๋œ ํ…Œ์ด๋ธ”์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์นดํ…Œ๊ณ ๋ฆฌ ์ปฌ๋Ÿผ) - const knownCategoryFields = ["material", "division", "status", "currency_code", "inbound_type", "outbound_type"]; + // 2. additionalJoinInfo๊ฐ€ ์žˆ๋Š” ์ปฌ๋Ÿผ๋„ ์ถ”์ถœ (์˜ˆ: item_code_material โ†’ item_info.material) + const additionalJoinColumns = tableConfig.columns + ?.filter((col: any) => col.additionalJoinInfo?.referenceTable) + .map((col: any) => ({ + columnName: col.columnName, // ์˜ˆ: item_code_material + referenceTable: col.additionalJoinInfo.referenceTable, // ์˜ˆ: item_info + // joinAlias์—์„œ ์‹ค์ œ ์ปฌ๋Ÿผ๋ช… ์ถ”์ถœ (item_code_material โ†’ material) + actualColumn: col.additionalJoinInfo.joinAlias?.replace(`${col.additionalJoinInfo.sourceColumn}_`, '') || col.columnName, + })) || []; + console.log("๐Ÿ” [TableList] additionalJoinInfo ์ปฌ๋Ÿผ:", additionalJoinColumns); + + // ์กฐ์ธ ํ…Œ์ด๋ธ”๋ณ„๋กœ ๊ทธ๋ฃนํ™” + const joinedTableColumns: Record = {}; + + // "ํ…Œ์ด๋ธ”๋ช….์ปฌ๋Ÿผ๋ช…" ํ˜•ํƒœ ์ฒ˜๋ฆฌ for (const joinedColumn of joinedColumns) { - // ์ด๋ฏธ ๋กœ๋“œ๋œ ์ปฌ๋Ÿผ์€ ์Šคํ‚ต - if (mappings[joinedColumn]) continue; - const parts = joinedColumn.split("."); if (parts.length !== 2) continue; const joinedTable = parts[0]; const joinedColumnName = parts[1]; - // ์•Œ๋ ค์ง„ ์นดํ…Œ๊ณ ๋ฆฌ ํ•„๋“œ์ธ ๊ฒฝ์šฐ๋งŒ ๋กœ๋“œ ์‹œ๋„ - if (!knownCategoryFields.includes(joinedColumnName)) continue; - + if (!joinedTableColumns[joinedTable]) { + joinedTableColumns[joinedTable] = []; + } + joinedTableColumns[joinedTable].push({ + columnName: joinedColumn, + actualColumn: joinedColumnName, + }); + } + + // additionalJoinInfo ํ˜•ํƒœ ์ฒ˜๋ฆฌ + for (const col of additionalJoinColumns) { + if (!joinedTableColumns[col.referenceTable]) { + joinedTableColumns[col.referenceTable] = []; + } + joinedTableColumns[col.referenceTable].push({ + columnName: col.columnName, // ์˜ˆ: item_code_material + actualColumn: col.actualColumn, // ์˜ˆ: material + }); + } + + console.log("๐Ÿ” [TableList] ์กฐ์ธ ํ…Œ์ด๋ธ”๋ณ„ ์ปฌ๋Ÿผ:", joinedTableColumns); + + // ์กฐ์ธ๋œ ํ…Œ์ด๋ธ”๋ณ„๋กœ inputType ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ + const newJoinedColumnMeta: Record = {}; + + for (const [joinedTable, columns] of Object.entries(joinedTableColumns)) { try { - console.log(`๐Ÿ“ก [TableList] ์กฐ์ธ ํ…Œ์ด๋ธ” ์นดํ…Œ๊ณ ๋ฆฌ ๋กœ๋“œ ์‹œ๋„ [${joinedColumn}]:`, { - url: `/table-categories/${joinedTable}/${joinedColumnName}/values`, - }); + // ์กฐ์ธ ํ…Œ์ด๋ธ”์˜ ์ปฌ๋Ÿผ inputType ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ (์ด๋ฏธ import๋œ tableTypeApi ์‚ฌ์šฉ) + const inputTypes = await tableTypeApi.getColumnInputTypes(joinedTable); - const response = await apiClient.get(`/table-categories/${joinedTable}/${joinedColumnName}/values`); + console.log(`๐Ÿ“ก [TableList] ์กฐ์ธ ํ…Œ์ด๋ธ” inputType ๋กœ๋“œ [${joinedTable}]:`, inputTypes); - if (response.data.success && response.data.data && Array.isArray(response.data.data)) { - const mapping: Record = {}; + for (const col of columns) { + const inputTypeInfo = inputTypes.find((it: any) => it.columnName === col.actualColumn); - response.data.data.forEach((item: any) => { - const key = String(item.valueCode); - mapping[key] = { - label: item.valueLabel, - color: item.color, - }; - }); + // ์ปฌ๋Ÿผ๋ช… ๊ทธ๋Œ€๋กœ ์ €์žฅ (item_code_material ๋˜๋Š” item_info.material) + newJoinedColumnMeta[col.columnName] = { + inputType: inputTypeInfo?.inputType, + }; - if (Object.keys(mapping).length > 0) { - mappings[joinedColumn] = mapping; - console.log(`โœ… [TableList] ์กฐ์ธ ํ…Œ์ด๋ธ” ์นดํ…Œ๊ณ ๋ฆฌ ๋งคํ•‘ ๋กœ๋“œ ์™„๋ฃŒ [${joinedColumn}]:`, { - mappingCount: Object.keys(mapping).length, - }); + console.log(` ๐Ÿ”— [${col.columnName}] (์‹ค์ œ: ${col.actualColumn}) inputType: ${inputTypeInfo?.inputType || "unknown"}`); + + // inputType์ด category์ธ ๊ฒฝ์šฐ ์นดํ…Œ๊ณ ๋ฆฌ ๋งคํ•‘ ๋กœ๋“œ + if (inputTypeInfo?.inputType === "category" && !mappings[col.columnName]) { + try { + console.log(`๐Ÿ“ก [TableList] ์กฐ์ธ ํ…Œ์ด๋ธ” ์นดํ…Œ๊ณ ๋ฆฌ ๋กœ๋“œ ์‹œ๋„ [${col.columnName}]:`, { + url: `/table-categories/${joinedTable}/${col.actualColumn}/values`, + }); + + const response = await apiClient.get(`/table-categories/${joinedTable}/${col.actualColumn}/values`); + + if (response.data.success && response.data.data && Array.isArray(response.data.data)) { + const mapping: Record = {}; + + response.data.data.forEach((item: any) => { + const key = String(item.valueCode); + mapping[key] = { + label: item.valueLabel, + color: item.color, + }; + }); + + if (Object.keys(mapping).length > 0) { + mappings[col.columnName] = mapping; + console.log(`โœ… [TableList] ์กฐ์ธ ํ…Œ์ด๋ธ” ์นดํ…Œ๊ณ ๋ฆฌ ๋งคํ•‘ ๋กœ๋“œ ์™„๋ฃŒ [${col.columnName}]:`, { + mappingCount: Object.keys(mapping).length, + }); + } + } + } catch (error) { + console.log(`โ„น๏ธ [TableList] ์กฐ์ธ ํ…Œ์ด๋ธ” ์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ (${col.columnName})`); + } } } } catch (error) { - // ์กฐ์ธ ํ…Œ์ด๋ธ” ์นดํ…Œ๊ณ ๋ฆฌ ๋กœ๋“œ ์‹คํŒจ๋Š” ๋ฌด์‹œ (์นดํ…Œ๊ณ ๋ฆฌ๊ฐ€ ์•„๋‹Œ ํ•„๋“œ์ผ ์ˆ˜ ์žˆ์Œ) - console.log(`โ„น๏ธ [TableList] ์กฐ์ธ ํ…Œ์ด๋ธ” ์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ (${joinedColumn})`); + console.error(`โŒ [TableList] ์กฐ์ธ ํ…Œ์ด๋ธ” inputType ๋กœ๋“œ ์‹คํŒจ [${joinedTable}]:`, error); } } + + // ์กฐ์ธ ์ปฌ๋Ÿผ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ƒํƒœ ์—…๋ฐ์ดํŠธ + if (Object.keys(newJoinedColumnMeta).length > 0) { + setJoinedColumnMeta(newJoinedColumnMeta); + console.log("โœ… [TableList] ์กฐ์ธ ์ปฌ๋Ÿผ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์„ค์ •:", newJoinedColumnMeta); + } console.log("๐Ÿ“Š [TableList] ์ „์ฒด ์นดํ…Œ๊ณ ๋ฆฌ ๋งคํ•‘ ์„ค์ •:", { mappingsCount: Object.keys(mappings).length, @@ -1929,7 +1994,8 @@ export const TableListComponent: React.FC = ({ return rowData.writer_name; } - const meta = columnMeta[column.columnName]; + // ๐Ÿ†• ๋ฉ”์ธ ํ…Œ์ด๋ธ” ๋ฉ”ํƒ€ ๋˜๋Š” ์กฐ์ธ ํ…Œ์ด๋ธ” ๋ฉ”ํƒ€์—์„œ ์ •๋ณด ๊ฐ€์ ธ์˜ค๊ธฐ + const meta = columnMeta[column.columnName] || joinedColumnMeta[column.columnName]; // inputType ๊ธฐ๋ฐ˜ ํฌ๋งทํŒ… (columnMeta์—์„œ ๊ฐ€์ ธ์˜จ inputType ์šฐ์„ ) const inputType = meta?.inputType || column.inputType; @@ -2119,7 +2185,7 @@ export const TableListComponent: React.FC = ({ return String(value); } }, - [columnMeta, optimizedConvertCode, categoryMappings], + [columnMeta, joinedColumnMeta, optimizedConvertCode, categoryMappings], ); // ======================================== diff --git a/ํ™”๋ฉด_์ž„๋ฒ ๋”ฉ_๋ฐ_๋ฐ์ดํ„ฐ_์ „๋‹ฌ_์‹œ์Šคํ…œ_๊ตฌํ˜„_๊ณ„ํš์„œ.md b/ํ™”๋ฉด_์ž„๋ฒ ๋”ฉ_๋ฐ_๋ฐ์ดํ„ฐ_์ „๋‹ฌ_์‹œ์Šคํ…œ_๊ตฌํ˜„_๊ณ„ํš์„œ.md index 687896c1..313a7567 100644 --- a/ํ™”๋ฉด_์ž„๋ฒ ๋”ฉ_๋ฐ_๋ฐ์ดํ„ฐ_์ „๋‹ฌ_์‹œ์Šคํ…œ_๊ตฌํ˜„_๊ณ„ํš์„œ.md +++ b/ํ™”๋ฉด_์ž„๋ฒ ๋”ฉ_๋ฐ_๋ฐ์ดํ„ฐ_์ „๋‹ฌ_์‹œ์Šคํ…œ_๊ตฌํ˜„_๊ณ„ํš์„œ.md @@ -1681,3 +1681,4 @@ const ์ถœ๊ณ ๋“ฑ๋ก_์„ค์ •: ScreenSplitPanel = { + diff --git a/ํ™”๋ฉด_์ž„๋ฒ ๋”ฉ_์‹œ์Šคํ…œ_Phase1-4_๊ตฌํ˜„_์™„๋ฃŒ.md b/ํ™”๋ฉด_์ž„๋ฒ ๋”ฉ_์‹œ์Šคํ…œ_Phase1-4_๊ตฌํ˜„_์™„๋ฃŒ.md index bc025b41..373b6ec7 100644 --- a/ํ™”๋ฉด_์ž„๋ฒ ๋”ฉ_์‹œ์Šคํ…œ_Phase1-4_๊ตฌํ˜„_์™„๋ฃŒ.md +++ b/ํ™”๋ฉด_์ž„๋ฒ ๋”ฉ_์‹œ์Šคํ…œ_Phase1-4_๊ตฌํ˜„_์™„๋ฃŒ.md @@ -528,3 +528,4 @@ const { data: config } = await getScreenSplitPanel(screenId); + diff --git a/ํ™”๋ฉด_์ž„๋ฒ ๋”ฉ_์‹œ์Šคํ…œ_์ถฉ๋Œ_๋ถ„์„_๋ณด๊ณ ์„œ.md b/ํ™”๋ฉด_์ž„๋ฒ ๋”ฉ_์‹œ์Šคํ…œ_์ถฉ๋Œ_๋ถ„์„_๋ณด๊ณ ์„œ.md index cdd94d36..5d315706 100644 --- a/ํ™”๋ฉด_์ž„๋ฒ ๋”ฉ_์‹œ์Šคํ…œ_์ถฉ๋Œ_๋ถ„์„_๋ณด๊ณ ์„œ.md +++ b/ํ™”๋ฉด_์ž„๋ฒ ๋”ฉ_์‹œ์Šคํ…œ_์ถฉ๋Œ_๋ถ„์„_๋ณด๊ณ ์„œ.md @@ -515,3 +515,4 @@ function ScreenViewPage() { +