diff --git a/app/modules/project/templates/project/inbox.html b/app/modules/project/templates/project/inbox.html
index 74bddda..6219431 100644
--- a/app/modules/project/templates/project/inbox.html
+++ b/app/modules/project/templates/project/inbox.html
@@ -1,7 +1,7 @@
{% extends "erp_base.html" %}
{% block head_extra %}
-
+
{% endblock %}
@@ -45,5 +45,5 @@
{% endif %}
-
+
{% endblock %}
diff --git a/app/modules/project/templates/project/index.html b/app/modules/project/templates/project/index.html
index bfad721..f7eb47d 100644
--- a/app/modules/project/templates/project/index.html
+++ b/app/modules/project/templates/project/index.html
@@ -1,7 +1,7 @@
{% extends "erp_base.html" %}
{% block head_extra %}
-
+
{% endblock %}
@@ -428,5 +428,5 @@
window.PJ_COLORS = {{ ["#4573d2","#37a3a3","#62a420","#e8a33d","#e8384f","#aa62e3","#f06a6a","#5a6772"] | tojson }};
window.PJ_STAGE_COLORS = {{ ["#4573d2","#37a3a3","#62a420","#e8a33d","#e8384f","#aa62e3","#f06a6a","#5a6772","#e8398a","#a15c43"] | tojson }};
-
+
{% endblock %}
diff --git a/app/modules/project/templates/project/project.html b/app/modules/project/templates/project/project.html
index aa8d770..c6ecf04 100644
--- a/app/modules/project/templates/project/project.html
+++ b/app/modules/project/templates/project/project.html
@@ -1,7 +1,7 @@
{% extends "erp_base.html" %}
{% block head_extra %}
-
+
@@ -36,9 +36,7 @@
{% endif %}
- {% if nav_projects %}
-
- {% for p in nav_projects %}
+ {% macro nav_li(p) %}
-
- {% endfor %}
+ {% endmacro %}
+ {% set nav_active = nav_projects | rejectattr("status", "equalto", "completed") | list %}
+ {% set nav_done = nav_projects | selectattr("status", "equalto", "completed") | list %}
+ {% if nav_active %}
+
+ {% for p in nav_active %}{{ nav_li(p) }}{% endfor %}
{% else %}
프로젝트 없음
{% endif %}
+ {% if nav_done %}
+ 완료 프로젝트
+
+ {% for p in nav_done %}{{ nav_li(p) }}{% endfor %}
+
+ {% endif %}
@@ -544,5 +553,5 @@
-
+
{% endblock %}
diff --git a/app/static/project.css b/app/static/project.css
index 9b50b70..4f769b9 100644
--- a/app/static/project.css
+++ b/app/static/project.css
@@ -216,6 +216,9 @@
.pj-side-block { margin-bottom: 22px; }
.pj-side-head { display: flex; align-items: center; justify-content: space-between; font-size: 14px; font-weight: 800; color: #6b7280; text-transform: uppercase; letter-spacing: .04em; margin-bottom: 8px; }
+.pj-side-head-done { margin-top: 14px; }
+#pj-tree-root-done .pj-tree-avatar,
+#pj-tree-root-done .pj-tree-name { opacity: .6; }
/* 굵게 지정해도 연한 회색 + 12px 라서 눈에 잘 안 띄었음 — 텍스트만 진한
잉크색으로 대비를 올린다("+" 버튼은 원래 색 유지). */
.pj-side-head span { color: var(--pj-ink); }
diff --git a/app/static/project.js b/app/static/project.js
index 2512a6c..540cbe0 100644
--- a/app/static/project.js
+++ b/app/static/project.js
@@ -3338,8 +3338,35 @@
function renderTree() {
const rootUl = el("pj-tree-root");
if (!rootUl) return;
- rootUl.innerHTML = projectsMeta.map(treeProjLi).join("");
+ const active = projectsMeta.filter(function (p) { return p.status !== "completed"; });
+ const done = projectsMeta.filter(function (p) { return p.status === "completed"; });
+ rootUl.innerHTML = active.map(treeProjLi).join("");
wireTreeHandlers(rootUl);
+
+ // "완료 프로젝트" 섹션 — 처음 페이지를 열었을 때 완료 프로젝트가
+ // 하나도 없었으면 서버가 아예 안 그려서 DOM에 없다. 완료로 바뀌는
+ // 순간 필요해지면 그때 만든다(반대로 마지막 하나가 해제/삭제되면 통째로 치운다).
+ let doneUl = el("pj-tree-root-done");
+ if (done.length) {
+ if (!doneUl) {
+ const block = rootUl.closest(".pj-side-block");
+ const head = document.createElement("div");
+ head.className = "pj-side-head pj-side-head-done";
+ head.innerHTML = "완료 프로젝트";
+ doneUl = document.createElement("ul");
+ doneUl.className = "pj-tree";
+ doneUl.id = "pj-tree-root-done";
+ block.appendChild(head);
+ block.appendChild(doneUl);
+ wireTreeDrag(doneUl);
+ }
+ doneUl.innerHTML = done.map(treeProjLi).join("");
+ wireTreeHandlers(doneUl);
+ } else if (doneUl) {
+ const head = doneUl.previousElementSibling;
+ if (head && head.classList.contains("pj-side-head-done")) head.remove();
+ doneUl.remove();
+ }
}
// 좌측 프로젝트 목록 드래그 순서 변경 — 홈 화면 카드 정렬과 같은 API/원칙
// (관리자 전용, 최상위 프로젝트만). rootUl 자체는 renderTree() 가 innerHTML
@@ -3398,6 +3425,7 @@
}
renderTree();
wireTreeDrag(el("pj-tree-root"));
+ wireTreeDrag(el("pj-tree-root-done"));
// 새 최상위 프로젝트 (관리자)
const newProjSide = el("pj-new-project-side");