feat(project): 홈 카드 세션 없으면 업무추가 버튼 비활성화

세션이 하나도 없으면 업무를 넣을 세션이 없으므로 아이콘 버튼(disabled)과
우클릭 메뉴 둘 다 막는다. "세션 추가"로 첫 세션을 만들면 새로고침 없이
바로 활성화(dataset.hasStages 갱신 + disabled 해제).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-17 14:18:37 +09:00
parent 29ce3554b1
commit e2734e176c
6 changed files with 38 additions and 17 deletions
+2
View File
@@ -419,6 +419,8 @@ async def index(request: Request) -> HTMLResponse:
or store.norm_str(user["email"], lower=True) in member_emails
or store.norm_str(p.get("owner_email"), lower=True) == store.norm_str(user["email"], lower=True)
)
# 세션이 하나도 없으면 업무를 넣을 곳이 없다 — "업무 추가" 버튼 비활성화용.
p["has_stages"] = bool(st.list_stages(project_id=p["id"]))
my_tasks = st.list_tasks(assignee_email=user["email"], limit=500)
for t in my_tasks:
@@ -1,7 +1,7 @@
{% extends "erp_base.html" %}
{% block head_extra %}
<link rel="stylesheet" href="/static/project.css?v=20260917t" />
<link rel="stylesheet" href="/static/project.css?v=20260917u" />
<link rel="stylesheet" href="/static/vendor/material-symbols/material-symbols.css" />
{% endblock %}
@@ -45,5 +45,5 @@
{% endif %}
</div>
<script src="/static/project.js?v=20260917u" defer></script>
<script src="/static/project.js?v=20260917v" defer></script>
{% endblock %}
@@ -1,7 +1,7 @@
{% extends "erp_base.html" %}
{% block head_extra %}
<link rel="stylesheet" href="/static/project.css?v=20260917t" />
<link rel="stylesheet" href="/static/project.css?v=20260917u" />
<link rel="stylesheet" href="/static/vendor/material-symbols/material-symbols.css" />
{% endblock %}
@@ -20,7 +20,8 @@
data-due="{{ p.due_date or '' }}"
data-color="{{ p.color }}"
data-status="{{ p.status or 'active' }}"
data-creator="{{ p.created_by or '' }}">
data-creator="{{ p.created_by or '' }}"
data-has-stages="{{ 'true' if p.has_stages else 'false' }}">
<a class="pj-project-cardlink" href="/project/p/{{ p.id }}">
<div class="pj-project-header">
<span class="pj-project-name">{{ p.name }}
@@ -56,7 +57,9 @@
<button type="button" class="pj-icon-btn pj-card-addstage" data-project-id="{{ p.id }}" data-project-name="{{ p.name }}" title="세션 추가">
<span class="material-symbols-outlined">view_column</span>
</button>
<button type="button" class="pj-icon-btn pj-card-addtask" data-project-id="{{ p.id }}" title="업무 추가">
<button type="button" class="pj-icon-btn pj-card-addtask" data-project-id="{{ p.id }}"
{% if not p.has_stages %}disabled{% endif %}
title="{{ '세션을 먼저 추가하세요' if not p.has_stages else '업무 추가' }}">
<span class="material-symbols-outlined">add_task</span>
</button>
{% endif %}
@@ -421,5 +424,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 }};
</script>
<script src="/static/project.js?v=20260917u" defer></script>
<script src="/static/project.js?v=20260917v" defer></script>
{% endblock %}
@@ -1,7 +1,7 @@
{% extends "erp_base.html" %}
{% block head_extra %}
<link rel="stylesheet" href="/static/project.css?v=20260917t" />
<link rel="stylesheet" href="/static/project.css?v=20260917u" />
<!-- 구글 머티리얼 심볼(담당자 아이콘 등) — self-host -->
<link rel="stylesheet" href="/static/vendor/material-symbols/material-symbols.css" />
<!-- 타임라인 vis-timeline — self-host -->
@@ -538,5 +538,5 @@
</script>
<script src="/static/vendor/vis-timeline/vis-timeline-graph2d.min.js"></script>
<script src="/static/project.js?v=20260917u" defer></script>
<script src="/static/project.js?v=20260917v" defer></script>
{% endblock %}