- 좌측 "프로젝트 멤버" 아이콘 클릭 시 이 프로젝트 안에서 그 사람이 담당하는
업무 팝업(전체 멤버 팝업과 같은 UI/정렬/더블클릭 편집). 제목은
"[프로젝트 이름]의 [사용자]님의 업무" + 아이콘. GET /api/users/tasks 에
project_id 옵션 추가(멀티호밍 포함 단일 프로젝트 조회 재사용)
- 멤버 업무 팝업에서 더블클릭으로 업무 편집 후 닫으면, 그 자리에 같은
목록을 다시 열어 유지(MutationObserver로 taskModal 닫힘 감지 후 재오픈)
- 멤버 업무 팝업 제목에 아바타 아이콘 추가, "닫기" 버튼 accent 색 적용
- 좌측 "프로젝트"/"프로젝트 멤버" 헤더 더 굵게, 프로젝트 멤버 아이콘 2배 확대
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- 세션 색상: 점 대신 세션 헤더 윗부분 배경을 통째로 칠함(글자/카운트 흰색으로)
- 보드 업무 카드의 댓글 말풍선도 더블클릭하면 채팅 팝업 열리게(.pj-cmt-badge 공용)
- 댓글 채팅 팝업에 파일/이미지 첨부 추가: 클립 버튼 업로드 + 클립보드 이미지
붙여넣기, 이미지는 썸네일, 파일은 확장자 아이콘+파일명으로 표시, 다운로드
가능, 업로드한 사람만 삭제(즉시 반영). task_attachments.comment_id(마이그
레이션 005)로 태깅해 업무 "첨부파일" 패널에도 그대로 함께 나온다.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- PUT /api/projects/order 가 /api/projects/{project_id} 뒤에 등록돼 있어
"order" 가 project_id(int) 파싱 실패로 422 나던 버그 수정(라우트 등록 순서
변경 — 경로 매칭은 등록 순서라 path param 뒤에 두면 리터럴 경로가 항상
가려진다). 홈 카드/좌측 프로젝트 트리 드래그 재정렬 둘 다 이 버그였음.
- 세션 편집 팝업 제목에 세션 이름 표시
- 좌측 프로젝트 트리에 드래그 가능 손잡이(⣿) 표시(관리자, hover 시 노출)
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- 좌측 프로젝트 리스트 드래그 재정렬(관리자, 홈 카드와 동일 API)
- 세션 추가/편집 팝업: 이름 + 아사나 10색 색상표(project_stages.color, 마이그레이션 004)
- 보드 세션 hover 아이콘 확대, 세션 제목 강조(업무 카드보다 크고 굵게)
- 완료 세션 반투명 + 보드 끝으로(정렬 기준만 변경 — 해제 시 원래 순서 자동 복귀)
- 전체 멤버 업무 팝업에 표 헤더(가운데정렬/굵게) + 정렬 아이콘 + 더블클릭 편집
- 댓글 채팅 팝업을 initCommentsChat() 공용화 — project.html에 모달이 없어 "내 업무"
패널 댓글 더블클릭이 전혀 동작 안 했던 버그 수정(동적 배지 재바인딩 누락도 같이 수정)
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- 홈 프로젝트 카드 드래그 재정렬(관리자, projects.sort_order 공유)
- 프로젝트 제목 색상 pill 스타일로 강조
- 보드 세션 우클릭에 "업무 추가" 메뉴 추가
- 좌측 "멤버"→"프로젝트 멤버" + "전체 멤버" 그리드(클릭 시 담당 업무 팝업)
- 뷰 탭/스코프 토글에 슬라이드 하이라이트 애니메이션
- "내 업무" 패널이 8초 실시간 폴링에서 빠져 있던 문제 수정(홈/프로젝트 화면 모두 /api/my-tasks 로 patch)
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
지금까지 같은 세션에 다시 놓으면 아무 일도 안 일어났다(다른 세션으로
옮길 때만 동작). 놓은 위치(마우스 Y좌표)를 카드들 사이 인덱스로 계산해
그 순서를 새 엔드포인트로 저장하고(tasks.sort_order, 세션 소속만 재배정 —
세션 재정렬의 reorder_stages 와 동일 패턴), 로컬 tasks 배열도 그 순서에
맞게 재배치(applyStageOrder)해 새로고침 없이 즉시 반영. 실제 3개 업무로
드래그→서버 저장→하드리로드까지 헤드리스 크롬으로 검증.
/api/assignable-users 응답에 avatar 필드 추가하고, 아이콘/이름/체크박스
세로 카드(memberPickHtml)를 공용 함수로 뽑아 새 프로젝트 모달(홈·사이드바
둘 다)과 멤버 배정 모달 3곳이 전부 같은 모양을 쓰도록 통일. 홈 페이지는
avatars 맵이 따로 없어서 이 API 응답의 avatar 필드에만 의존하도록 함.
프로젝트 상세 화면 좌측 트리는 renderTree()가 매번 JS로 다시 그리므로
(라이브 새로고침 포함) 실제 동작은 projectsMeta/treeProjLi/wireTreeHandlers
쪽에 구현 — 홈 화면과 같은 프로젝트 수정 모달(이름/설명/기간/색상/완료
토글)을 재사용. 서버 쪽 projects_meta·nav_projects 에 description/status
필드 추가(기존엔 없어서 수정 폼을 못 채웠음). Jinja 쪽 nav_projects 루프도
동일하게 맞춰뒀지만 JS가 즉시 덮어쓰므로 첫 페인트용일 뿐 — 기존 삭제
버튼도 같은 이중 구조였음(관례를 그대로 따름).
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
vacation 모듈은 공휴일을 vacation_db 테이블로 관리하지만 휴가일수 계산용
으로 강하게 결합돼 있어(조사 결과 공용 provider 없음), project 달력은
"보여주기만" 하면 되므로 store.py 에 정적 KR_HOLIDAYS 표(날짜→이름)를
추가하는 방식으로 처리 — 새 DB 연결/마이그레이션 없음.
- 신정·설날·삼일절·어린이날·부처님오신날·현충일·광복절·추석·개천절·
한글날·성탄절 + 실제 "관공서의 공휴일에 관한 규정" 대체공휴일 규칙
그대로 반영(설날/추석/어린이날/삼일절/광복절/개천절/한글날/부처님오신
날/성탄절 대상, 신정·현충일은 대체 없음). 근로자의 날·제헌절은 관공서
공휴일이 아니라서 제외(vacation 모듈 2026년 기존 시드와 동일 기준).
선거일 같은 임시공휴일은 범위 밖.
- 웹 검색으로 확보한 2027~2030년 데이터를 파이썬 요일 계산으로 전수
검증(90건 전부 일치) — 날짜 오타 위험 제거.
- 달력 날짜 칸: 공휴일이면 일요일과 같은 빨간색 + 이름 라벨 표시,
호버 시 툴팁(title)도 함께 제공.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- 프로젝트 관리(index/project/inbox) 진입 시 메인 좌측 사이드바를 전역 설정과
무관하게 항상 접어서 렌더(force_sidebar_collapsed) — 서버에서 바로
data-collapsed=true 로 그려 깜빡임도 없다.
- 프로젝트 상세 화면(보드/리스트/달력/타임라인) 오른쪽에 홈 화면과 동일한
"내 업무" 패널 추가(프로젝트별 그룹, 클릭 시 팝업 편집).
- 보드에 세션이 늘어나면 .pj-board 안에서만 가로 스크롤돼야 하는데
.pj-main 에 min-width:0 이 없어 grid 트랙 자체가 넓어져 페이지 전체가
가로 스크롤되던 문제 수정.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
지난 커밋(07f4d0f)의 백엔드 위에 화면을 얹는다.
- 세션(기존 "단계") 문구 통일 + 프로젝트 스코프("이 프로젝트")일 때 보드
컬럼에 관리 UI 추가: 이름변경/완료토글/삭제(만든 사람만)/"+ 세션 추가"/
드래그 재정렬(카드 드래그와 같은 네이티브 HTML5 DnD, 기존
PUT stages/order 재사용).
- 프로젝트 화면 툴바에 "이 프로젝트"/"전체 프로젝트" 스코프 토글 추가.
기본은 아사나처럼 지금 프로젝트만(달력/타임라인/보드/리스트 4개 뷰
전부), "전체"는 예전처럼 접근 가능한 프로젝트를 다 합쳐서 보여준다.
서버가 tasks 각 행에 context_project_id(어느 프로젝트를 보다가 담겼는지)
를 실어주고 클라이언트가 그걸로 순수 필터링(재조회 없음).
- 하위 업무 인라인 UI — 업무 모달 안에 체크박스·제목·담당자·마감일이 한
줄인 하위업무 목록(변경 즉시 저장), "+ 하위 업무 추가". 카드에는
"완료/전체" 진행 배지만 표시. update_task 에 completed 필드 추가(세션이
없는 하위업무의 직접 완료 토글용).
- 멀티호밍 UI — 업무 모달에 "연결된 프로젝트" 칩 + "+ 프로젝트에 추가"(
프로젝트/세션 선택). 보드에서 다른 프로젝트가 원 소속인 카드는 그
프로젝트 배지를 달고 나타나며, 드래그로 세션을 옮기면
POST /api/tasks/{id}/links 로 그 프로젝트 안에서의 배치만 바뀐다(원본
불변). 링크 생성 권한을 다듬음 — 최초 연결은 원/대상 프로젝트 양쪽 권한이
필요하지만, 이미 연결된 카드를 그 프로젝트 보드 안에서 옮기는 것은 대상
프로젝트 권한만 있으면 되게 해 정상적인 드래그가 403 나지 않게 했다.
- 업무 설명란을 textarea → contenteditable 로 교체. 클립보드 이미지
붙여넣기/파일 업로드 버튼으로 삽입(기존 task_attachments 재사용, 새
GET /api/attachments/{id}/inline 추가 — 기존 /download 는
Content-Disposition: attachment 라 <img> 렌더링에 못 씀). 새 업무 작성
중(저장 전)에는 이미지 삽입 비활성화.
- .pj-modal-card 에 max-height/overflow-y 추가(내용이 늘어 화면보다
길어지는 것 방지).
홈(index.html)·프로젝트(project.html) 두 업무 모달 모두 요소 id 를 공유하는
기존 구조를 그대로 따라, 새 로직은 공용 함수(initDescEditor/initSubtaskBlock/
initLinksBlock)로 한 번만 작성해 양쪽에서 재사용한다.
docs/PROJECT_MODULE.md 갱신 — 1-1절에 3단계 구조·권한 변경 전반을 정리.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
프로젝트→세션→업무 3단계(아사나식) 전환의 1단계(백엔드). "세션"은 새 개념이
아니라 기존 "단계"(project_stages, 칸반 컬럼)를 그대로 재사용한다.
- project_stages 에 created_by 추가 — 세션 삭제도 "만든 사람만"(_can_delete
재사용) 규칙 적용. api_delete_stage 를 _require_manage 단독 체크에서
생성자 체크로 변경.
- 프로젝트 생성을 관리자 전용 → 로그인 사용자 전체로 개방
(api_create_project: _require_admin → _require_user). 홈 화면의 "새
프로젝트"/수정 모달·버튼도 is_admin 게이트를 걷어냄(생성자가 자동으로
owner 가 되어 _can_manage 통과 — 기존 로직 재사용). 멤버 배정 API는 계속
관리자 전용이라, 비관리자가 새 프로젝트 모달을 열면 멤버 선택란은 안내
문구만 보여주고 시도하지 않는다(불필요한 403 방지).
- 하위 업무 — 새 테이블 없이 tasks.parent_task_id 재사용(부모 삭제 시
CASCADE). list_tasks 는 기본적으로 최상위만 반환(보드/캘린더/리스트에
하위업무가 카드로 안 뜨게) + comment_count 와 같은 방식으로 subtask_total/
subtask_done 집계 추가. create_task 에 parent_task_id 지원(하위업무는
부모와 같은 프로젝트, 세션 없음).
- 멀티호밍(task_project_links, 아사나 기능) — 업무 하나가 여러 프로젝트/세션에
동시에 속할 수 있다. list_tasks(project_id=X, 비재귀)가 자동으로 그
프로젝트에 연결된 업무까지 포함하도록 확장(다른 호출 경로는 안 건드림 —
홈/내업무 전체보기에서 중복 노출 방지). 신규 API: GET /api/tasks/{id}(하위
업무·연결 포함 상세), POST/DELETE /api/tasks/{id}/links.
- 설명란 이미지 삽입 준비: store.sanitize_description_html — 허용 태그만
남기고 스크립트/이벤트속성/위험 URL 스킴 제거(표준 html.parser, 외부
라이브러리 없음). api_create_task/api_update_task 저장 직전 통과.
⚠️ 배포 전 필수: scripts/sql/project_db_003_sections_subtasks_links.sql 를
project_db 에 적용해야 한다(project_stages.created_by, tasks.parent_task_id,
task_project_links 없이는 이 커밋의 쿼리가 전부 실패한다). 그 안의 기존
설명 텍스트→HTML 이스케이프 UPDATE 문은 1회만 실행할 것.
프론트엔드(세션 드래그 재정렬, 사이드바 프로젝트별 보기, 하위업무/멀티호밍
UI, 설명란 이미지 붙여넣기 편집기)는 다음 커밋에서 이어간다.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- 카드 이름 옆 호버 노출 업무 추가 버튼(기존 업무편집 팝업을 생성 모드로 재사용)
- 카드 이름 아래 배정 멤버 아이콘+이름 표시, 새 프로젝트 모달에서 멤버 다중 선택
- 업무별 댓글 말풍선+개수 표시, 더블클릭 시 카톡형 댓글 전용 팝업
- 확인 안 한 새 댓글은 말풍선이 커지며 반짝임(localStorage 로 확인 여부 추적)
- GET /project/api/live-version 폴링으로 다른 사용자의 변경사항을 자동 새로고침
- 날짜 표기를 yy/mm/dd(요일)에서 mm/dd(요일)로 변경
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- 좌측 트리(프로젝트 상세 페이지): 이미 로드된 업무 데이터로 즉시 팝업 —
더 이상 페이지를 새로고침하며 달력 탭으로 넘어가지 않음
- 홈 화면 카드/내 업무 리스트: 홈에도 업무편집 모달을 추가해 페이지 이동 없이
팝업으로 편집(담당자·단계는 해당 프로젝트를 API 로 조회해 채움, 첨부·댓글 포함)
- 교차 프로젝트 업무 편집 시 담당자 select 가 현재 프로젝트 멤버만 보이던 문제 수정
(해당 업무의 프로젝트 멤버를 다시 조회)
- 완료 프로젝트 숨기기 토글을 인라인 style.display 로 직접 제어하도록 변경
([hidden] 속성 + 클래스 규칙 조합이 기대대로 안 먹히는 경우 대비, 원인 불문 확실히 동작)
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- .pj-project-grid[hidden] 규칙 추가 — display:grid 규칙과 특이도가 같아
[hidden] 속성이 무시되던 버그
- 홈 카드 업무 미리보기에 단계(stage_name) 칩 표시
- 홈 화면 날짜 표기를 yy/mm/dd(요일) 형식으로 통일(프로젝트 마감·업무 마감·내 업무 기간)
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- 프로젝트 카드를 "진행중"/"완료" 두 섹션으로 분리(완료는 접기/펼치기)
- 완료된 업무도 미리보기 목록에서 숨기지 않고 취소선으로 계속 표시
- 사이드바 빠른 프로젝트 생성(+)에도 마감일 입력 추가 (홈 새 프로젝트 모달은 기존에 지원)
- 카드 편집/삭제 버튼이 완료 섹션 카드도 인식하도록 수정
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- 사이드 프로젝트 트리를 tasks 로부터 JS 로 재렌더(renderTree)
- refreshActiveView 에서 트리도 갱신 → 새로고침 없이 좌측에 바로 표시
- 새 업무 추가 시 해당 프로젝트 자동 펼침
- projectsMeta 에 created_by 추가(트리 삭제 권한용)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- 라우터: 이메일→구글 picture URL 아바타 맵을 pj-data 로 전달
- 보드 카드/리스트 담당자, 댓글 작성자에 원형 프로필 이미지 표시
- 이미지 없으면 기존 기본 아이콘 폴백. referrerpolicy=no-referrer
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- 서버: api_delete_task/api_delete_project 가 created_by 일치자만 허용
(슈퍼관리자 예외, created_by 없는 과거 데이터는 관리자 허용). 403 반환.
- 클라이언트: 삭제 버튼 클릭 시 만든 사람이 아니면 경고창 후 중단
(created_by 를 트리 삭제버튼·홈 카드·업무 객체로 전달)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
배경(전체 일정)을 업무 최소~최대가 아니라 프로젝트 자체 start_date~
due_date 로 칠한다. 업무가 그 밖에 있으면 범위를 넓혀 가리지 않게 유지.
projects_meta 에 start_date/due_date 추가.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- 카드에 수정(연필) 버튼: 이름·설명·기간·색상·완료 토글 + 삭제 (관리자)
- 프로젝트 상태에 'completed' 추가, update_project status 허용
- 완료 프로젝트: 흐리게 비활성 + 홈 목록 맨 끝으로 정렬
- '완료 N개 숨기기' 토글 버튼(localStorage 기억)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- project_page 가 접근 가능한 모든 프로젝트의 업무를 집계(all_tasks)
- 달력: 전 프로젝트 bar(라벨에 [프로젝트명] 유지)
- 타임라인: 프로젝트별 행(그룹) + 행마다 전체기간 배경 + 업무 막대
- 보드: 단계 '이름' 기준 컬럼으로 전 프로젝트 묶음, 카드에 프로젝트 배지
드롭 시 해당 업무 프로젝트의 동일 이름 단계로 이동
- 리스트: '프로젝트' 컬럼 추가
- 모달 단계 선택은 해당 업무 프로젝트의 단계로 채움(타 프로젝트 편집 대비)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- 홈 '내 업무': 프로젝트별 그룹 트리, 업무 아래 날짜 기간 작은 글씨
- 알림 벨: 미읽음 있으면 종 흔들림 애니메이션 + 숫자 배지(기존)
- 타임라인: 프로젝트 전체 기간을 연한 색 배경으로 칠하고(그룹 행) 그 안에
업무 막대 표시 → 업무명에 프로젝트명 불필요
- 리스트: 컬럼 헤더 클릭 정렬(오름/내림 아이콘), 컬럼 너비 드래그 조절+
localStorage 저장, 헤더 글씨 크고 굵게
- 상단 뷰 탭 선택 시 검은 배경 흰 글씨
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- tasks 에 start_time/due_time TIME 컬럼 추가(마이그레이션 003). NULL=종일
- 업무 모달에 '시간 지정' 체크박스 → 체크 시 시작/마감 시간 입력란 표시.
미체크면 종일로 저장(시간 null)
- store.validate_time(HH:MM), db create/update + TIME 직렬화('HH:MM')
- 타임라인: 시간 있으면 date+time 으로 정확히 배치, 없으면 종일
DB: scripts/sql/project_db_003_task_times.sql 서버서 적용 필요.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
요구에 따라 서브프로젝트 개념을 UI 에서 제거. 좌측 트리를 프로젝트(최상위)
→ 그 안의 업무 2단계로 재구성:
- 프로젝트 노드(folder) 펼치면 소속 업무가 체크 아이콘으로 표시
- 업무 클릭 → /project/p/{id}?task={tid} 로 이동 후 해당 업무 모달 자동 오픈
- 완료 업무는 취소선. 트리에서 프로젝트 삭제(관리자)
- 과거 parent_id 서브프로젝트는 트리/홈에서 숨김(최상위만 노출)
- 홈 카드의 '서브 N' 칩 제거
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- 댓글 수정: PUT /api/comments/{id}(본인·관리자), 모달서 인라인 편집(textarea)
- 달력 드래그 드롭이 안 되던 문제 수정: 드롭 대상을 day 셀 대신 주(week)
단위로 받고 마우스 X 로 날짜 칸을 계산. bar 오버레이/pointer-events 간섭
없이 안정적으로 드롭됨. dragover 에서 dropEffect=move 명시.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
아사나식 기능 4종 추가:
- 댓글: 업무 모달에서 등록/삭제, 관련자 인앱 알림(task_comments)
- 첨부: 업로드(20MB)/다운로드/삭제, 파일은 DATA_DIR/project/<task_id>/,
DB엔 메타만(task_attachments)
- 단계 편집: 보드 칸반에서 이름변경/완료토글/순서이동/삭제/추가
- 알림센터(인앱): 배정·완료·댓글 시 수신자별 알림, 벨 미읽음 배지,
/project/inbox 페이지, 읽음/모두읽음(project_notifications)
라이브러리 self-host: vis-timeline + Material Symbols 를 static/vendor/ 로
내려받아 CDN 의존 제거.
DB: scripts/sql/project_db_002_attachments_notifications.sql (서버서 적용 필요).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- project 를 MODULE_KEYS 에 추가 → 관리자 페이지에 '프로젝트 관리' 토글
자동 생성. 직원별 접근 권한 부여(admin 자동, 일반은 기본 OFF).
- 모듈 진입을 has_module('project') 로 게이트(기존 전원허용 철회).
- 멤버 배정 모달: GET /project/api/assignable-users 로 project 권한 보유
등록 사용자를 드롭다운 자동 목록화(타이핑 제거). 이미 배정된 사람 제외.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
FullCalendar 제거. 휴가 모듈과 동일한 서버 렌더 월간 달력(구글식 bar
레인 배치)로 변경. 업무 start~due 기간을 bar 로 표시, 클릭 시 모달.
?y=&m= 로 월 이동, 프로젝트 색상 반영, 완료 업무는 회색+취소선.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- project_db 신규(projects/members/stages/tasks/comments/activity, project_app CRUD)
- 프로젝트/서브프로젝트(self-FK), 업무·진행단계(칸반), 멤버 배정
- 메인 뷰 달력(FullCalendar)/타임라인(vis-timeline) 토글 + 보드/리스트
- 진입은 로그인 회사 직원 전원, 생성/배정은 관리자 전용
- 업무 배정·완료 시 관리자 메일 알림(app/mail.py, SMTP_* env, 미설정 시 skip)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>