fix: 경영성과 대시보드 iframe 제거·인라인 렌더, 업로드 오류 메시지 개선
- embed 404/검은 화면 방지: 한 페이지에서 페이로드+차트 로드 - fetch 비JSON 응답 시 상태코드 표시, 성공 시 새로고침 - 전역 .container grid와 충돌 시 .mgmt-perf-embed 스코프 CSS Made-with: Cursor
This commit is contained in:
@@ -6,6 +6,7 @@
|
||||
<%- include('partials/favicon') %>
|
||||
<title>경영성과 대시보드 - XAVIS</title>
|
||||
<link rel="stylesheet" href="/public/styles.css" />
|
||||
<link rel="stylesheet" href="/mgmt-perf/dashboard.css" />
|
||||
<style>
|
||||
.mgmt-perf-page main.container {
|
||||
max-width: 1200px;
|
||||
@@ -80,18 +81,11 @@
|
||||
font-size: 1.05rem;
|
||||
margin: 0 0 10px;
|
||||
}
|
||||
.mgmt-dash-embed-wrap {
|
||||
.mgmt-dash-inline-wrap {
|
||||
border: 1px solid var(--border, #e0e0e0);
|
||||
border-radius: 10px;
|
||||
overflow: hidden;
|
||||
background: #1a1a1a;
|
||||
min-height: 820px;
|
||||
}
|
||||
.mgmt-dash-embed-wrap iframe {
|
||||
display: block;
|
||||
width: 100%;
|
||||
min-height: 820px;
|
||||
border: 0;
|
||||
min-height: 400px;
|
||||
}
|
||||
.mgmt-upload-history {
|
||||
margin-top: 16px;
|
||||
@@ -173,7 +167,7 @@
|
||||
<tr>
|
||||
<td><%= u.created_at ? new Date(u.created_at).toLocaleString('ko-KR') : '-' %></td>
|
||||
<td><%= u.original_filename || '-' %></td>
|
||||
<td><%= u.fiscal_year %>년 Q<%= u.quarter %></td>
|
||||
<td><%= u.fiscal_year != null && u.fiscal_year !== '' ? u.fiscal_year + '년 Q' + u.quarter : '-' %></td>
|
||||
</tr>
|
||||
<% }); %>
|
||||
</tbody>
|
||||
@@ -184,13 +178,17 @@
|
||||
|
||||
<section class="mgmt-dash-panel" aria-labelledby="mgmt-dash-heading">
|
||||
<h2 id="mgmt-dash-heading">대시보드 조회</h2>
|
||||
<div class="mgmt-dash-embed-wrap">
|
||||
<iframe
|
||||
id="mgmtPerfDashFrame"
|
||||
title="경영성과 차트"
|
||||
src="/dashboard/business-performance/embed"
|
||||
></iframe>
|
||||
<div class="mgmt-dash-inline-wrap">
|
||||
<div class="mgmt-perf-embed" id="mgmtPerfDashRoot">
|
||||
<%- include('partials/mgmt_perf_dashboard_container', {
|
||||
dashboardTitle: typeof dashboardTitle !== 'undefined' ? dashboardTitle : '경영성과 대시보드',
|
||||
quarterLabel: typeof quarterLabel !== 'undefined' ? quarterLabel : 'Q1',
|
||||
}) %>
|
||||
</div>
|
||||
</div>
|
||||
<script type="application/json" id="mgmt-perf-payload-json"><%- typeof payloadJson !== 'undefined' ? payloadJson : '{}' %></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/chart.js@4.5.1/dist/chart.umd.min.js"></script>
|
||||
<script src="/mgmt-perf/dashboard-app.js"></script>
|
||||
</section>
|
||||
</div>
|
||||
</main>
|
||||
@@ -201,7 +199,6 @@
|
||||
var form = document.getElementById("mgmtPerfUploadForm");
|
||||
var btn = document.getElementById("mgmtPerfUploadBtn");
|
||||
var msg = document.getElementById("mgmtPerfUploadMsg");
|
||||
var frame = document.getElementById("mgmtPerfDashFrame");
|
||||
if (!form || !btn || !msg) return;
|
||||
|
||||
form.addEventListener("submit", function (e) {
|
||||
@@ -212,24 +209,37 @@
|
||||
btn.disabled = true;
|
||||
fetch("/api/mgmt-perf/upload", { method: "POST", body: fd, credentials: "same-origin" })
|
||||
.then(function (r) {
|
||||
return r.json().then(function (j) {
|
||||
return { ok: r.ok, body: j };
|
||||
return r.text().then(function (text) {
|
||||
var j = {};
|
||||
if (text) {
|
||||
try {
|
||||
j = JSON.parse(text);
|
||||
} catch (parseErr) {
|
||||
j = { error: "서버 응답을 해석할 수 없습니다. (" + r.status + ")" };
|
||||
}
|
||||
}
|
||||
return { ok: r.ok, body: j, status: r.status };
|
||||
});
|
||||
})
|
||||
.then(function (_ref) {
|
||||
var ok = _ref.ok;
|
||||
var body = _ref.body;
|
||||
if (ok) {
|
||||
msg.textContent = body.message || "저장되었습니다.";
|
||||
msg.textContent = body.message || "저장되었습니다. 화면을 새로고침합니다.";
|
||||
msg.className = "mgmt-upload-msg ok";
|
||||
if (frame) frame.src = "/dashboard/business-performance/embed?t=" + Date.now();
|
||||
window.setTimeout(function () {
|
||||
window.location.reload();
|
||||
}, 600);
|
||||
} else {
|
||||
msg.textContent = body.error || "업로드에 실패했습니다.";
|
||||
msg.textContent =
|
||||
(body && body.error) ||
|
||||
"업로드에 실패했습니다. (" + (_ref.status || "") + ")";
|
||||
msg.className = "mgmt-upload-msg err";
|
||||
}
|
||||
})
|
||||
.catch(function () {
|
||||
msg.textContent = "네트워크 오류입니다.";
|
||||
.catch(function (err) {
|
||||
msg.textContent =
|
||||
(err && err.message) || "요청에 실패했습니다. 서버가 최신 코드인지·프록시에서 /api 경로가 Node로 전달되는지 확인하세요.";
|
||||
msg.className = "mgmt-upload-msg err";
|
||||
})
|
||||
.finally(function () {
|
||||
|
||||
Reference in New Issue
Block a user