From 3ca0b1de87c65365932879e54ff135b61577359c Mon Sep 17 00:00:00 2001 From: king Date: Tue, 15 Sep 2026 19:55:54 +0900 Subject: [PATCH] =?UTF-8?q?fix(project):=20=ED=94=84=EB=A1=9C=EC=A0=9D?= =?UTF-8?q?=ED=8A=B8=20=EC=83=9D=EC=84=B1=20=EC=8B=9C=20=EC=84=B8=EC=85=98?= =?UTF-8?q?=20=EC=9E=90=EB=8F=99=20=EC=B6=94=EA=B0=80=20=EC=A0=9C=EA=B1=B0?= =?UTF-8?q?=20(=EC=95=84=EC=82=AC=EB=82=98=EC=B2=98=EB=9F=BC=20=EC=A7=81?= =?UTF-8?q?=EC=A0=91=20=EC=B6=94=EA=B0=80)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit create_project 의 seed_stages 기본값을 True→False 로. 새 프로젝트는 이제 세션이 0개로 시작하고, 보드에서 "+ 세션 추가"로 직접 만든다. 세션이 하나도 없는 새 프로젝트의 보드 화면에는 안내 문구를 띄운다. Co-Authored-By: Claude Sonnet 5 --- app/modules/project/db.py | 2 +- app/modules/project/store.py | 4 +++- app/modules/project/templates/project/inbox.html | 2 +- app/modules/project/templates/project/index.html | 2 +- app/modules/project/templates/project/project.html | 2 +- app/static/project.js | 9 +++++++++ docs/PROJECT_MODULE.md | 5 ++++- 7 files changed, 20 insertions(+), 6 deletions(-) diff --git a/app/modules/project/db.py b/app/modules/project/db.py index 06e7df2..36d138d 100644 --- a/app/modules/project/db.py +++ b/app/modules/project/db.py @@ -87,7 +87,7 @@ class ProjectStore: start_date: str | None = None, due_date: str | None = None, created_by: str = "", - seed_stages: bool = True, + seed_stages: bool = False, ) -> dict[str, Any]: nm = store.validate_project_name(name) col = store.validate_color(color) diff --git a/app/modules/project/store.py b/app/modules/project/store.py index 4274872..aa0e323 100644 --- a/app/modules/project/store.py +++ b/app/modules/project/store.py @@ -9,7 +9,9 @@ from __future__ import annotations from html.parser import HTMLParser from typing import Any -# 프로젝트 생성 시 자동으로 깔리는 기본 진행 단계(칸반 컬럼). +# 참고용 기본 세션(칸반 컬럼) 이름 목록 — 프로젝트 생성 시 자동으로 만들지는 +# 않는다(세션은 아사나처럼 사용자가 직접 추가한다). 보드 컬럼 정렬 시 이 +# 이름들을 우선순위로만 쓴다(router.py `_order`). # (name, is_done_stage) — 마지막 '완료' 단계로 옮기면 업무 완료 처리. DEFAULT_STAGES: tuple[tuple[str, bool], ...] = ( ("할 일", False), diff --git a/app/modules/project/templates/project/inbox.html b/app/modules/project/templates/project/inbox.html index 9a787ca..e703b3b 100644 --- a/app/modules/project/templates/project/inbox.html +++ b/app/modules/project/templates/project/inbox.html @@ -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 7bde3b5..d9da281 100644 --- a/app/modules/project/templates/project/index.html +++ b/app/modules/project/templates/project/index.html @@ -349,5 +349,5 @@ - + {% endblock %} diff --git a/app/modules/project/templates/project/project.html b/app/modules/project/templates/project/project.html index 91f7df2..9ea5ac1 100644 --- a/app/modules/project/templates/project/project.html +++ b/app/modules/project/templates/project/project.html @@ -331,5 +331,5 @@ - + {% endblock %} diff --git a/app/static/project.js b/app/static/project.js index 6e13b17..a609fa1 100644 --- a/app/static/project.js +++ b/app/static/project.js @@ -1101,6 +1101,15 @@ function renderBoardByStage(board, vis) { const list = (stagesByProject[projectId] || []).slice() .sort(function (a, b) { return a.sort_order - b.sort_order; }); + // 세션은 프로젝트를 만들 때 자동으로 생기지 않는다(아사나처럼 직접 추가) — + // 아직 하나도 없으면 안내만 보여준다. + if (!list.length && !vis.length) { + const empty = document.createElement("div"); + empty.className = "pj-empty"; + empty.style.flex = "1 1 auto"; + empty.textContent = "세션이 없습니다. 아래 \"+ 세션 추가\"로 만들어 보세요."; + board.appendChild(empty); + } list.forEach(function (s) { const col = document.createElement("div"); col.className = "pj-col"; diff --git a/docs/PROJECT_MODULE.md b/docs/PROJECT_MODULE.md index ff796ea..d9503a8 100644 --- a/docs/PROJECT_MODULE.md +++ b/docs/PROJECT_MODULE.md @@ -67,7 +67,10 @@ - `projects` — `parent_id`(self-FK, NULL=최상위 / NOT NULL=서브프로젝트, `ON DELETE CASCADE`), name, description, color, owner_email, start/due_date, status(active|archived). - `project_members` — 프로젝트↔사용자 배정. role(manager|member), `UNIQUE(project_id, user_email)`. -- `project_stages`(="세션") — 진행단계(칸반 컬럼). 프로젝트 생성 시 기본 4단계 seed(할 일/진행 중/검토/완료). `is_done_stage`=TRUE 단계로 옮기면 업무 완료 처리. `created_by`(003) — 삭제를 "만든 사람만"으로 제한하기 위함. +- `project_stages`(="세션") — 진행단계(칸반 컬럼). **프로젝트 생성 시 자동으로 + 만들지 않는다**(아사나처럼 직접 "+ 세션 추가"로 만든다 — `create_project` + 의 `seed_stages` 기본값은 `False`). `is_done_stage`=TRUE 단계로 옮기면 업무 + 완료 처리. `created_by`(003) — 삭제를 "만든 사람만"으로 제한하기 위함. - `tasks` — 업무. stage_id, title, description(HTML — 이미지 삽입 지원), assignee_email/name, priority(low|normal|high), start/due_date, completed_at, `parent_task_id`(003, self-FK `ON DELETE CASCADE`, NULL=최상위 업무). - `task_project_links`(003) — 멀티호밍. `(task_id, project_id)` UNIQUE, `stage_id` nullable(그 프로젝트 안에서의 세션). - `task_comments` — 댓글.