diff --git a/app/modules/project/templates/project/inbox.html b/app/modules/project/templates/project/inbox.html
index dcfdca5..2c125f0 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 4c534d7..e0b7333 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 %}
@@ -159,8 +159,8 @@
- {{ p.open }}
- {{ p.done }}
+ {{ p.open }}
+ {{ p.done }}
@@ -421,5 +421,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 e8a14c3..c505259 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 %}
-
+
@@ -210,8 +210,8 @@
- {{ p.open }}
- {{ p.done }}
+ {{ p.open }}
+ {{ p.done }}
@@ -544,5 +544,5 @@
-
+
{% endblock %}
diff --git a/app/static/project.css b/app/static/project.css
index ca11e95..1b6e0c3 100644
--- a/app/static/project.css
+++ b/app/static/project.css
@@ -418,8 +418,16 @@
font-size: 10.5px; font-weight: 800;
}
/* 파스텔톤 — 배경은 연하게, 글자는 진하게(눈에 덜 튀면서도 대비는 유지) */
-.pj-mtc-num.pj-mtc-open { background: #dcf1fc; color: #0284c7; } /* 진행 = 연한 하늘색 */
-.pj-mtc-num.pj-mtc-done { background: #fbe3df; color: #c22b10; } /* 완료 = 연한 빨강 */
+.pj-mtc-num.pj-mtc-open { background: #dcf1fc; color: #0284c7; cursor: default; } /* 진행 = 연한 하늘색 */
+.pj-mtc-num.pj-mtc-done { background: #fbe3df; color: #c22b10; cursor: default; } /* 완료 = 연한 빨강 */
+/* 마우스를 따라다니는 작은 툴팁([data-tip] 공용) */
+.pj-hovertip {
+ position: fixed; z-index: 4000; pointer-events: none;
+ background: #1e1f21; color: #fff; font-size: 11px; font-weight: 700;
+ padding: 4px 8px; border-radius: 6px; white-space: nowrap;
+ box-shadow: 0 3px 10px rgba(0,0,0,.25);
+}
+.pj-hovertip[hidden] { display: none; }
.pj-mytree-tasks { list-style: none; margin: 2px 0 0; padding: 0 0 0 8px; border-left: 2px solid #eef0f2; margin-left: 10px; }
.pj-mytree-group.is-collapsed .pj-mytree-tasks { display: none; }
.pj-mytree-task a { display: flex; align-items: flex-start; gap: 7px; padding: 6px 6px; border-radius: 7px; text-decoration: none; color: inherit; }
diff --git a/app/static/project.js b/app/static/project.js
index 8a23eb5..63ce034 100644
--- a/app/static/project.js
+++ b/app/static/project.js
@@ -4427,6 +4427,31 @@
.forEach(attachScrollIndicator);
}
+ // ── 마우스를 따라다니는 작은 툴팁 — [data-tip] 달린 요소 아무데나 공용.
+ // 지금은 "내 업무" 개수 배지(진행/완료)에 쓴다. 배지는 서버가 한 번
+ // 렌더한 뒤 텍스트만 바뀌고 재생성되지 않으므로(updateMyTreeCounts),
+ // 페이지 로드 시 한 번만 wiring 하면 된다(동적으로 새로 생기는 요소 없음).
+ function initHoverTips() {
+ let tipEl = null;
+ function show(text, x, y) {
+ if (!tipEl) {
+ tipEl = document.createElement("div");
+ tipEl.className = "pj-hovertip";
+ document.body.appendChild(tipEl);
+ }
+ tipEl.textContent = text;
+ tipEl.style.left = (x + 14) + "px";
+ tipEl.style.top = (y + 18) + "px";
+ tipEl.hidden = false;
+ }
+ function hide() { if (tipEl) tipEl.hidden = true; }
+ document.querySelectorAll("[data-tip]").forEach(function (el) {
+ el.addEventListener("mouseenter", function (e) { show(el.dataset.tip, e.clientX, e.clientY); });
+ el.addEventListener("mousemove", function (e) { show(el.dataset.tip, e.clientX, e.clientY); });
+ el.addEventListener("mouseleave", hide);
+ });
+ }
+
document.addEventListener("DOMContentLoaded", function () {
initHome();
initProject();
@@ -4435,5 +4460,6 @@
initLiveRefresh();
wireMyTreeToggles();
initScrollIndicators();
+ initHoverTips();
});
})();