From d9cdaf622e3eeb05c9186b926651f1f698c1a0a4 Mon Sep 17 00:00:00 2001 From: Hyungi Ahn Date: Sun, 26 Oct 2025 10:36:58 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=ED=98=84=ED=99=A9=ED=8C=90=20UI?= =?UTF-8?q?=EB=A5=BC=20=EA=B0=80=EB=A1=9C=20=ED=85=8C=EC=9D=B4=EB=B8=94=20?= =?UTF-8?q?=ED=98=95=EC=8B=9D=EC=9C=BC=EB=A1=9C=20=EC=99=84=EC=A0=84=20?= =?UTF-8?q?=EA=B0=9C=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ๐Ÿ”„ Major UI Redesign: - โŒ ์„ธ๋กœ ์นด๋“œ ๋ ˆ์ด์•„์›ƒ (๊ฐ€๋…์„ฑ ์ €ํ•˜) - โœ… ๊ฐ€๋กœ ํ…Œ์ด๋ธ” ๋ ˆ์ด์•„์›ƒ (ํ•œ๋ˆˆ์— ์ •๋ณด ํ™•์ธ) ๐Ÿ“Š Table Structure: - 11๊ฐœ ์ปฌ๋Ÿผ: No., ํ”„๋กœ์ ํŠธ, ๋ถ€์ ํ•ฉ๋‚ด์šฉ, ์นดํ…Œ๊ณ ๋ฆฌ, ํ•ด๊ฒฐ๋ฐฉ์•ˆ, ๋‹ด๋‹น๋ถ€์„œ, ๋‹ด๋‹น์ž, ์˜ˆ์ƒ์™„๋ฃŒ์ผ, ์›์ธ๋ถ€์„œ, ์‚ฌ์ง„, ๋“ฑ๋ก์ผ - ๊ฐ€๋กœ ์Šคํฌ๋กค ์ง€์›์œผ๋กœ ๋ชจ๋“  ์ •๋ณด ํ‘œ์‹œ - ๊ฐ ์ปฌ๋Ÿผ๋ณ„ ์ตœ์ ํ™”๋œ ๋„ˆ๋น„ ์„ค์ • ๐ŸŽฏ UX Improvements: - ๊ธด๊ธ‰ ํ‘œ์‹œ: ์˜ˆ์ƒ์™„๋ฃŒ์ผ 3์ผ ์ด๋‚ด ์‹œ ๋นจ๊ฐ„ ๋ฐฐ์ง€ - ํ…์ŠคํŠธ truncate: ๊ธด ๋‚ด์šฉ์€ ๋ง์ค„์ž„ํ‘œ๋กœ ์ฒ˜๋ฆฌ (hover์‹œ ์ „์ฒด ๋‚ด์šฉ ํ‘œ์‹œ) - ์‚ฌ์ง„ ์•„์ด์ฝ˜: ํด๋ฆญ ์‹œ ๋ชจ๋‹ฌ๋กœ ํ™•๋Œ€ - ํ–‰ hover ํšจ๊ณผ: ๋งˆ์šฐ์Šค ์˜ค๋ฒ„ ์‹œ ๋ฐฐ๊ฒฝ์ƒ‰ ๋ณ€๊ฒฝ ๐Ÿ“ฑ Responsive Features: - ๊ฐ€๋กœ ์Šคํฌ๋กค๋กœ ๋ชจ๋ฐ”์ผ์—์„œ๋„ ๋ชจ๋“  ์ •๋ณด ํ™•์ธ ๊ฐ€๋Šฅ - Sticky ํ—ค๋”: ์Šคํฌ๋กค ์‹œ ํ—ค๋” ๊ณ ์ • - ์ตœ์†Œ ๋„ˆ๋น„ ๋ณด์žฅ์œผ๋กœ ์ •๋ณด ์••์ถ• ๋ฐฉ์ง€ ๐ŸŽจ Visual Enhancements: - ๊น”๋”ํ•œ ํ…Œ์ด๋ธ” ๋””์ž์ธ - ์ ์ ˆํ•œ ํŒจ๋”ฉ๊ณผ ๊ฐ„๊ฒฉ - ์ผ๊ด€๋œ ์ƒ‰์ƒ ์ฒด๊ณ„ - ๋ถ€๋“œ๋Ÿฌ์šด hover ์• ๋‹ˆ๋ฉ”์ด์…˜ Expected Result: โœ… ๋Œ€ํญ ํ–ฅ์ƒ๋œ ๊ฐ€๋…์„ฑ โœ… ํ•œ ํ™”๋ฉด์—์„œ ๋ชจ๋“  ์ •๋ณด ํ™•์ธ โœ… ํšจ์œจ์ ์ธ ๊ณต๊ฐ„ ํ™œ์šฉ โœ… ๊ด€๋ฆฌํ•จ๊ณผ ์ผ๊ด€๋œ UX --- frontend/issues-dashboard.html | 217 ++++++++++++++++++--------------- 1 file changed, 117 insertions(+), 100 deletions(-) diff --git a/frontend/issues-dashboard.html b/frontend/issues-dashboard.html index 0ecc823..407f07b 100644 --- a/frontend/issues-dashboard.html +++ b/frontend/issues-dashboard.html @@ -27,31 +27,34 @@ box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04); } - /* ์ด์Šˆ ์นด๋“œ ์Šคํƒ€์ผ (๊ด€๋ฆฌํ•จ ์ง„ํ–‰ ์ค‘ ์Šคํƒ€์ผ) */ - .issue-card { - transition: all 0.2s ease; - border-left: 4px solid transparent; + /* ์ด์Šˆ ํ…Œ์ด๋ธ” ์Šคํƒ€์ผ (๊ฐ€๋กœ ํ…Œ์ด๋ธ” ๋ ˆ์ด์•„์›ƒ) */ + .dashboard-table { + min-width: 1200px; } - .issue-card:hover { - transform: translateY(-2px); - border-left-color: #3b82f6; - box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05); - } - - .issue-card label { - font-weight: 600; - color: #374151; - } - - .issue-card .bg-gray-50 { + .dashboard-table th { + position: sticky; + top: 0; background-color: #f9fafb; - border: 1px solid #e5e7eb; - transition: all 0.2s ease; + z-index: 10; } - .issue-card .bg-gray-50:hover { - background-color: #f3f4f6; + .dashboard-table td { + vertical-align: middle; + } + + .dashboard-table tr:hover { + background-color: #f8fafc; + } + + .truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + + .dashboard-table .fas.fa-image:hover { + transform: scale(1.1); } .progress-bar { @@ -366,7 +369,7 @@ document.getElementById('activeProjects').textContent = activeProjectIds.size; } - // ์ด์Šˆ ์นด๋“œ ์—…๋ฐ์ดํŠธ (๊ด€๋ฆฌํ•จ ์ง„ํ–‰ ์ค‘ ์Šคํƒ€์ผ) + // ์ด์Šˆ ํ…Œ์ด๋ธ” ์—…๋ฐ์ดํŠธ (๊ฐ€๋กœ ํ…Œ์ด๋ธ” ์Šคํƒ€์ผ) function updateProjectCards() { const container = document.getElementById('projectDashboard'); const emptyState = document.getElementById('emptyState'); @@ -379,13 +382,39 @@ emptyState.classList.add('hidden'); - // ์ด์Šˆ ์นด๋“œ๋“ค์„ ์ƒ์„ฑ (๊ด€๋ฆฌํ•จ ์ง„ํ–‰ ์ค‘ ์Šคํƒ€์ผ) - const issueCards = filteredIssues.map(issue => createIssueCard(issue)).join(''); - container.innerHTML = `
${issueCards}
`; + // ๊ฐ€๋กœ ์Šคํฌ๋กค ํ…Œ์ด๋ธ” ์ƒ์„ฑ + const tableHTML = ` +
+
+ + + + + + + + + + + + + + + + + + ${filteredIssues.map(issue => createIssueRow(issue)).join('')} + +
No.ํ”„๋กœ์ ํŠธ๋ถ€์ ํ•ฉ ๋‚ด์šฉ์นดํ…Œ๊ณ ๋ฆฌํ•ด๊ฒฐ๋ฐฉ์•ˆ๋‹ด๋‹น๋ถ€์„œ๋‹ด๋‹น์ž์˜ˆ์ƒ์™„๋ฃŒ์ผ์›์ธ๋ถ€์„œ์‚ฌ์ง„๋“ฑ๋ก์ผ
+
+
+ `; + + container.innerHTML = tableHTML; } - // ์ด์Šˆ ์นด๋“œ ์ƒ์„ฑ (๊ด€๋ฆฌํ•จ ์ง„ํ–‰ ์ค‘ ์Šคํƒ€์ผ, ์ฝ๊ธฐ ์ „์šฉ) - function createIssueCard(issue) { + // ์ด์Šˆ ํ…Œ์ด๋ธ” ํ–‰ ์ƒ์„ฑ (๊ฐ€๋กœ ํ…Œ์ด๋ธ” ์Šคํƒ€์ผ, ์ฝ๊ธฐ ์ „์šฉ) + function createIssueRow(issue) { const project = projects.find(p => p.id === issue.project_id); const projectName = project ? project.project_name : '๋ฏธ์ง€์ •'; @@ -435,84 +464,72 @@ return diffDays <= 3; // 3์ผ ์ด๋‚ด ๋˜๋Š” ์ง€์—ฐ }; + // ์‚ฌ์ง„ ์•„์ด์ฝ˜ ์ƒ์„ฑ + const getPhotoIcons = () => { + const photos = []; + if (issue.photo_path) photos.push(issue.photo_path); + if (issue.photo_path2) photos.push(issue.photo_path2); + + if (photos.length === 0) return '-'; + + return photos.map(photo => + `` + ).join(''); + }; + + // ๊ธด๊ธ‰ ํ‘œ์‹œ๊ฐ€ ์žˆ๋Š” No. ์ƒ์„ฑ + const getNoWithUrgent = () => { + const noText = issue.project_sequence_no || '-'; + if (isUrgent()) { + return `
+ ${noText} + ๊ธด๊ธ‰ +
`; + } + return `${noText}`; + }; + return ` -
- -
-
- No.${issue.project_sequence_no || '-'} - ${isUrgent() ? '๊ธด๊ธ‰' : ''} + + ${getNoWithUrgent()} + +
${projectName}
+ + +
+ ${issue.final_description || issue.description || '-'}
- ${formatKSTDate(issue.report_date)} -
- - -
-
- -
${projectName}
+ + + ${getCategoryText(issue.final_category || issue.category)} + + +
+ ${issue.solution || '-'}
- -
- -
${issue.final_description || issue.description || '-'}
+ + + ${getDepartmentText(issue.responsible_department)} + + +
+ ${issue.responsible_person || '-'}
- -
- -
${getCategoryText(issue.final_category || issue.category)}
-
-
- - -
-
-
- -
${issue.solution || '-'}
-
-
- -
${getDepartmentText(issue.responsible_department)}
-
-
- -
-
- -
${issue.responsible_person || '-'}
-
-
- -
${formatKSTDate(issue.expected_completion_date)}
-
-
- -
- -
${getDepartmentText(issue.cause_department)}
-
-
- - - ${issue.photo_path || issue.photo_path2 ? ` -
- -
- ${issue.photo_path ? ` -
- -
- ` : ''} - ${issue.photo_path2 ? ` -
- -
- ` : ''} -
-
- ` : ''} -
+ + + ${formatKSTDate(issue.expected_completion_date)} + + + ${getDepartmentText(issue.cause_department)} + + + ${getPhotoIcons()} + + + ${formatKSTDate(issue.report_date)} + + `; }