fix: 피드백 리스트 상태, 회사 오표시 개선1
Deploy EG-BIM QA Gateway / deploy (push) Successful in 35s

This commit is contained in:
root committed 2026-09-28 19:50:04 +09:00
1 parent 2fbfe24283
commit a332ed0d8e
4 files changed
+23 -22

No files matched your search

+20 -19
View File
@@ -7,12 +7,16 @@
const COMMENTS_KEY = 'baron.qa.comments.egbim';
const CATEGORY_CODES = { '오류문의': 'ERROR_QNA', '개선문의': 'IMPROVEMENT_QNA', '일반문의': 'GENERAL_QNA' };
const STATUS_LABELS = {
INIT: "접수",
NEW: "신규",
INIT: "신규",
RECEIVED: "접수",
ON_REVIEW: "접수",
DETAILED_REVIEW: "진행중",
IN_PROGRESS: "진행중",
RESOLVED: "완료",
PENDING: "보류"
COMPLETED: "완료",
PENDING: "보류",
ON_HOLD: "보류"
};
let authReady;
@@ -77,7 +81,7 @@
content: value(["contents", "content", "body"]) || "",
date: String(createdAt).slice(0, 10),
createdAt: createdAt,
status: normalizeStatus(value(["feedback_status", "feedbackStatus", "status_code", "status"]), item),
status: normalizeStatus(value(["feedback_status", "feedbackStatus", "status_code", "status"])),
secret: secret === true || String(secret).toLowerCase() === "true" || String(secret) === "1",
attachments: value(["attachments", "images"]) || [],
raw: item
@@ -117,21 +121,18 @@
return Boolean(post.author && [user.name, user.loginId, user.email].filter(Boolean).indexOf(post.author) > -1);
}
function normalizeStatus(value, context) {
function normalizeStatus(value) {
if (value && typeof value === "object") value = value.code || value.key || value.value || value.name || "";
const raw = String(value || "").trim();
if (!raw) return "";
const upper = raw.toUpperCase();
const label = STATUS_LABELS[upper] || ({
NEW: "접수", RECEIVED: "접수", 접수: "접수", 문의접수: "접수", 문의검토: "접수", REVIEW: "접수",
DEEP: "진행중", 정밀검토: "진행중", PATCH: "진행중", 처리중: "진행중", 진행중: "진행중",
DONE: "완료", COMPLETED: "완료", 답변완료: "완료", 완료: "완료",
HOLD: "보류", ON_HOLD: "보류", 보류: "보류"
return STATUS_LABELS[upper] || ({
NEW: "신규", INIT: "신규", 신규: "신규",
RECEIVED: "접수", 접수: "접수", 문의접수: "접수", ON_REVIEW: "접수", REVIEW: "접수", 문의검토: "접수",
DETAILED_REVIEW: "진행중", DEEP: "진행중", IN_PROGRESS: "진행중", PATCH: "진행중", 처리중: "진행중", 진행중: "진행중", 정밀검토: "진행중",
DONE: "완료", COMPLETED: "완료", RESOLVED: "완료", 답변완료: "완료", 완료: "완료",
HOLD: "보류", ON_HOLD: "보류", PENDING: "보류", 보류: "보류"
}[upper] || raw);
const issues = context && Array.isArray(context.issues) ? context.issues : [];
const issueLinkStatus = context && (context.issue_link_status || context.issueLinkStatus || context.issue_status || context.issueStatus);
const hasLinkedIssue = issues.length > 0 || ["LINKED", "ISSUE_LINKED", "CONNECTED", "이슈접수"].indexOf(String(issueLinkStatus || "").toUpperCase()) > -1;
return label === "진행중" && hasLinkedIssue ? "진행중(이슈접수)" : label;
}
function extractFeedbackStatus(payload) {
@@ -141,11 +142,11 @@
const candidate = candidates[index];
if (!candidate || typeof candidate !== 'object') continue;
const value = candidate.feedback_status || candidate.feedbackStatus || candidate.status_code || candidate.status;
if (value != null && value !== '') return normalizeStatus(value, root);
if (value != null && value !== '') return normalizeStatus(value);
}
const fields = root && (Array.isArray(root.fields) ? root.fields : (root.data && Array.isArray(root.data.fields) ? root.data.fields : []));
const statusField = fields.find(function (field) { return field && (field.key === 'feedback_status' || field.fieldKey === 'feedback_status' || field.name === 'feedback_status'); });
return statusField ? normalizeStatus(statusField.value || statusField.val || statusField.data, root) : '';
return statusField ? normalizeStatus(statusField.value || statusField.val || statusField.data) : '';
}
async function refreshRemoteStatus(post) {
@@ -446,7 +447,7 @@
tableBody.innerHTML = rows.map(function (post, index) {
const isNotice = post.category === "공지사항";
const number = isNotice ? "공지" : filtered.length - ((page - 1) * pageSize + index);
const status = normalizeStatus(post.status, post.raw);
const status = normalizeStatus(post.status);
const statusClass = status === "답변완료" ? "done" : (status === "문의검토" || status === "정밀검토" ? "review" : "");
const company = getPostCompany(post, user);
return "<tr class=\"" + (isNotice ? "notice-row" : "") + "\" data-id=\"" + escapeHtml(post.id) + "\">" +
@@ -497,7 +498,7 @@
if (!qs('#category').value || !title || !content) { errorBox.textContent = '구분, 제목, 내용을 모두 입력해주세요.'; errorBox.style.display = 'block'; return; }
const feedbackId = makeUuid();
const createdAt = new Date().toISOString();
const post = { id: feedbackId, feedbackId: feedbackId, requesterId: currentUser.requesterId, requesterTenantId: currentUser.requesterTenantId, category: qs('#category').value, company: currentUser.company || currentUser.tenantName || currentUser.familyCompany || '외부 사용자', department: currentUser.department || '-', author: currentUser.name || currentUser.loginId, title: title, date: createdAt.slice(0, 10), createdAt: createdAt, status: '접수', secret: qs('#secret').checked, content: content };
const post = { id: feedbackId, feedbackId: feedbackId, requesterId: currentUser.requesterId, requesterTenantId: currentUser.requesterTenantId, category: qs('#category').value, company: currentUser.company || currentUser.tenantName || currentUser.familyCompany || '외부 사용자', department: currentUser.department || '-', author: currentUser.name || currentUser.loginId, title: title, date: createdAt.slice(0, 10), createdAt: createdAt, status: '신규', secret: qs('#secret').checked, content: content };
const submitButton = qs('#submitButton');
submitButton.disabled = true;
submitButton.textContent = '등록 중...';
@@ -545,7 +546,7 @@
}
qs('[data-detail-category]').textContent = post.category;
qs('[data-detail-title]').textContent = post.title;
qs('[data-detail-status]').textContent = normalizeStatus(post.status, post.raw) || '공지';
qs('[data-detail-status]').textContent = normalizeStatus(post.status) || '공지';
qs('[data-detail-date]').textContent = post.date;
qs('[data-detail-author]').textContent = post.author;
const detailUser = getAuthUser();
@@ -740,7 +741,7 @@
}).join('');
});
refreshRemoteStatus(post).then(function (changed) {
if (changed) qs('[data-detail-status]').textContent = normalizeStatus(post.status, post.raw) || '공지';
if (changed) qs('[data-detail-status]').textContent = normalizeStatus(post.status) || '공지';
});
}
+1 -1
View File
@@ -4,5 +4,5 @@
<body>
<main class="egbim-page"><section class="page-hero"><div class="hero-inner"><span class="hero-kicker">EG-BIM SUPPORT</span><h1>Q&amp;A</h1><p>EG-BIM 관련 문의하기</p></div><nav class="sub-nav" aria-label="EG-BIM 지원 메뉴"><div class="sub-nav-inner"><a href="index.html" aria-current="page">문의하기(Q&amp;A)</a><a href="#" aria-disabled="true" class="disabled-tab">원격지원</a></div></nav></section>
<section class="page-shell" id="detail"><div class="section-heading"><div><h2>문의 상세</h2><p>문의 내용과 답변을 확인할 수 있습니다.</p></div></div><article class="detail-card"><div class="detail-head"><div class="detail-title-line"><h2><span class="category" data-detail-category>문의</span> <span data-detail-title>문의 제목</span></h2><span class="status review" data-detail-status>문의접수</span></div><div class="detail-meta"><span data-detail-date>2026-09-17</span><span data-detail-author>작성자</span><span data-detail-company>회사</span><span data-detail-department>부서</span><span data-detail-secret hidden>🔒 비밀글</span></div></div><div class="detail-body" data-detail-content></div><div class="attachments"><h3>첨부파일</h3><div data-detail-attachments><span class="help-text">첨부된 파일이 없습니다.</span></div></div><div class="detail-actions"><div class="owner-actions"><button class="button button-outline" id="editButton" type="button" hidden>수정</button><button class="button button-danger" id="deleteButton" type="button" hidden>삭제</button></div><a class="button button-outline" href="index.html">목록</a></div></article><form id="editForm" class="edit-form" hidden><h3>문의 수정</h3><div class="form-row"><label class="form-label" for="editCategory">구분</label><div class="form-control"><select id="editCategory" class="select"><option value="오류문의">오류문의</option><option value="개선문의">개선문의</option><option value="일반문의">일반문의</option></select></div></div><div class="form-row"><label class="form-label" for="editTitle">제목</label><div class="form-control"><input id="editTitle" class="input" maxlength="200" required></div></div><div class="form-row"><label class="form-label" for="editContent">내용</label><div class="form-control column"><textarea id="editContent" class="textarea" maxlength="10000" required></textarea></div></div><div class="form-row"><div class="form-label">설정</div><div class="form-control"><label class="check"><input id="editSecret" type="checkbox"> 비밀글</label></div></div><div class="form-footer"><button class="button button-outline" id="editCancel" type="button">취소</button><button class="button button-primary" type="submit">수정 저장</button></div><div id="editError" class="form-error" role="alert" hidden></div></form><section class="comment-box"><h3>답변 <span id="commentCount">0</span></h3><div id="comments"></div><form id="commentForm" class="comment-form"><label class="sr-only" for="commentContent">댓글 내용</label><textarea id="commentContent" class="textarea" maxlength="5000" placeholder="답변 또는 추가 문의를 입력해주세요" required></textarea><div class="comment-attachment-input"><label class="button button-primary comment-image-button" for="commentImages">이미지 첨부</label><input id="commentImages" type="file" accept="image/*" multiple><div id="commentImagePreview" class="comment-image-preview"></div></div><div class="comment-form-actions"><span id="commentError" class="form-error" role="alert" hidden></span><button class="button button-primary" id="commentSubmit" type="submit">댓글 등록</button></div></form></section><div class="form-footer"><button class="button button-outline" id="backButton" type="button">목록으로</button></div></section>
</main><script src="config.js?v=20260921-3"></script><script src="app.js?v=20260928-2"></script>
</main><script src="config.js?v=20260921-3"></script><script src="app.js?v=20260928-3"></script>
</body></html>
+1 -1
View File
@@ -23,6 +23,6 @@
</section>
</main>
<div id="toast" class="toast" role="status" aria-live="polite"></div>
<script src="config.js?v=20260921-3"></script><script src="app.js?v=20260928-2"></script>
<script src="config.js?v=20260921-3"></script><script src="app.js?v=20260928-3"></script>
</body>
</html>
+1 -1
View File
@@ -4,5 +4,5 @@
<body>
<main class="egbim-page"><section class="page-hero"><div class="hero-inner"><span class="hero-kicker">EG-BIM SUPPORT</span><h1>Q&amp;A</h1><p>EG-BIM 관련 문의하기</p></div><nav class="sub-nav" aria-label="EG-BIM 지원 메뉴"><div class="sub-nav-inner"><a href="index.html" aria-current="page">문의하기(Q&amp;A)</a><a href="#" aria-disabled="true" class="disabled-tab">원격지원</a></div></nav></section>
<section class="page-shell"><div class="section-heading"><div><h2>문의 등록</h2><p>로그인한 사용자 정보로 문의가 등록됩니다.</p></div></div><div class="form-notice" data-auth-state>로그인 상태를 확인하고 있습니다.</div><div class="form-error" id="formError" role="alert"></div><form id="qaForm" novalidate><div class="form-card" id="writeFields"><div class="form-row"><label class="form-label" for="category">구분 <span class="required">*</span></label><div class="form-control"><select class="select" id="category" required><option value="">선택해주세요</option><option>오류문의</option><option>개선문의</option><option>일반문의</option></select></div></div><div class="form-row"><label class="form-label" for="title">제목 <span class="required">*</span></label><div class="form-control"><input class="input" id="title" type="text" maxlength="100" placeholder="문의 제목을 입력해주세요" required></div></div><div class="form-row"><span class="form-label">공개 설정</span><div class="form-control"><label class="check"><input id="secret" type="checkbox"> 비밀글로 등록</label></div></div><div class="form-row"><label class="form-label" for="content">내용 <span class="required">*</span></label><div class="form-control column"><textarea class="textarea" id="content" placeholder="문의 내용을 작성해주세요" required></textarea><span class="help-text">개인정보, 비밀번호, 인증번호 등 민감한 정보는 입력하지 마세요.</span></div></div><div class="form-row"><label class="form-label" for="attachment">첨부파일</label><div class="form-control column"><input class="file-input" id="attachment" type="file" multiple><span class="help-text">파일은 문의와 함께 안전하게 업로드됩니다. 파일당 최대 30MB</span></div></div></div><div class="form-footer"><a class="button button-outline" href="index.html">취소</a><button class="button button-primary" id="submitButton" type="submit">문의 등록</button></div></form></section>
</main><div id="toast" class="toast" role="status" aria-live="polite"></div><script src="config.js?v=20260921-3"></script><script src="app.js?v=20260928-2"></script>
</main><div id="toast" class="toast" role="status" aria-live="polite"></div><script src="config.js?v=20260921-3"></script><script src="app.js?v=20260928-3"></script>
</body></html>