Commit Graph

70 Commits

Author SHA1 Message Date
king 29ce3554b1 feat(project): 홈 카드에 세션 추가, 새 업무 팝업 480x700 고정
- 홈 프로젝트 카드 hover 액션에 "세션 추가" 아이콘 추가(기존 세션 추가
  모달을 그대로 재사용, 카드별 projectId 를 들고 다녀 대상 지정)
- "새 업무" 작성 팝업(하위업무/첨부/연결/댓글 칸이 다 숨어 홑겹인 상태)만
  480x700 고정 크기로("업무 편집"은 기존 800x1100 그대로), 홈/프로젝트
  화면 공용 setTaskModalCompact() 로 토글

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 14:15:36 +09:00
king da635f22ce feat(project): 홈 카드 헤더 색상 채우기, 좌측 사이드바 헤더 대비 강화
- 프로젝트 카드: 이름 옆 작은 점 대신 카드 헤더 윗부분 전체를 프로젝트
  색으로 채우고 글자 흰색(보드 세션 헤더와 같은 원칙). 액션 아이콘(업무추가/
  수정)도 흰색으로, "완료" 칩은 반투명 흰 배경으로 대비 확보.
- 프로젝트 수정 후 DOM patch 로직도 새 구조(이름이 헤더 안, 설명은 본문
  맨 앞)에 맞게 수정.
- 좌측 "프로젝트"/"프로젝트 멤버"/"전체 멤버" 헤더 — 굵기만으론 12px
  회색이라 여전히 흐려 보여서, 글자 색을 진한 잉크색으로 올려 대비 확보.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 13:59:30 +09:00
king bb6a2c12a3 feat(project): 프로젝트 멤버 아이콘으로 업무 팝업, 편집후 목록유지, 사이드바 스타일
- 좌측 "프로젝트 멤버" 아이콘 클릭 시 이 프로젝트 안에서 그 사람이 담당하는
  업무 팝업(전체 멤버 팝업과 같은 UI/정렬/더블클릭 편집). 제목은
  "[프로젝트 이름]의 [사용자]님의 업무" + 아이콘. GET /api/users/tasks 에
  project_id 옵션 추가(멀티호밍 포함 단일 프로젝트 조회 재사용)
- 멤버 업무 팝업에서 더블클릭으로 업무 편집 후 닫으면, 그 자리에 같은
  목록을 다시 열어 유지(MutationObserver로 taskModal 닫힘 감지 후 재오픈)
- 멤버 업무 팝업 제목에 아바타 아이콘 추가, "닫기" 버튼 accent 색 적용
- 좌측 "프로젝트"/"프로젝트 멤버" 헤더 더 굵게, 프로젝트 멤버 아이콘 2배 확대

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 13:48:05 +09:00
king 3c6c865b7e fix(project): 세션 헤더 색상 배경 40% 투명하게
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 12:40:18 +09:00
king 1d7fe71b75 feat(project): 세션 헤더 색상 채우기, 보드 댓글팝업, 채팅 첨부파일/이미지
- 세션 색상: 점 대신 세션 헤더 윗부분 배경을 통째로 칠함(글자/카운트 흰색으로)
- 보드 업무 카드의 댓글 말풍선도 더블클릭하면 채팅 팝업 열리게(.pj-cmt-badge 공용)
- 댓글 채팅 팝업에 파일/이미지 첨부 추가: 클립 버튼 업로드 + 클립보드 이미지
  붙여넣기, 이미지는 썸네일, 파일은 확장자 아이콘+파일명으로 표시, 다운로드
  가능, 업로드한 사람만 삭제(즉시 반영). task_attachments.comment_id(마이그
  레이션 005)로 태깅해 업무 "첨부파일" 패널에도 그대로 함께 나온다.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 12:27:44 +09:00
king 6922679f51 fix(project): 프로젝트 순서변경 라우트 충돌 수정 + 세션편집 제목/드래그 손잡이 표시
- 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>
2026-09-17 12:02:29 +09:00
king 003d29d349 feat(project): 세션 색상/편집, 프로젝트 트리 드래그, 멤버업무 정렬, 댓글팝업 버그수정
- 좌측 프로젝트 리스트 드래그 재정렬(관리자, 홈 카드와 동일 API)
- 세션 추가/편집 팝업: 이름 + 아사나 10색 색상표(project_stages.color, 마이그레이션 004)
- 보드 세션 hover 아이콘 확대, 세션 제목 강조(업무 카드보다 크고 굵게)
- 완료 세션 반투명 + 보드 끝으로(정렬 기준만 변경 — 해제 시 원래 순서 자동 복귀)
- 전체 멤버 업무 팝업에 표 헤더(가운데정렬/굵게) + 정렬 아이콘 + 더블클릭 편집
- 댓글 채팅 팝업을 initCommentsChat() 공용화 — project.html에 모달이 없어 "내 업무"
  패널 댓글 더블클릭이 전혀 동작 안 했던 버그 수정(동적 배지 재바인딩 누락도 같이 수정)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 11:55:49 +09:00
king 2f611767ca feat(project): 카드 드래그 순서변경/전체멤버/탭 슬라이드/내업무 실시간반영
- 홈 프로젝트 카드 드래그 재정렬(관리자, projects.sort_order 공유)
- 프로젝트 제목 색상 pill 스타일로 강조
- 보드 세션 우클릭에 "업무 추가" 메뉴 추가
- 좌측 "멤버"→"프로젝트 멤버" + "전체 멤버" 그리드(클릭 시 담당 업무 팝업)
- 뷰 탭/스코프 토글에 슬라이드 하이라이트 애니메이션
- "내 업무" 패널이 8초 실시간 폴링에서 빠져 있던 문제 수정(홈/프로젝트 화면 모두 /api/my-tasks 로 patch)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 10:58:18 +09:00
king 62ab883d24 feat(project): 타임라인 드래그 이동/기간조절 + 아사나 느낌 상호작용
- 막대 몸통 드래그로 일정 통째 이동, 양 끝 드래그로 시작/마감일만 조절
  (vis-timeline editable.updateTime + onMove, PUT /api/tasks/{id} 로 저장,
  실패 시 vis 표시만 원래 자리로 롤백 — 전체 재렌더 없이).
- 단일 클릭은 선택만(끝 손잡이가 나타나게) 하도록 바꾸고, 편집 열기는
  더블클릭 또는 우클릭 메뉴의 "열기"로 옮김 — 기존엔 클릭 한 번에 모달이
  떠서 손잡이가 나타나자마자 가려져 드래그를 할 수 없던 문제.
- 마우스 오버 시 그 업무의 날짜 구간을 전체 높이 배경 밴드로 강조(아사나
  타임라인에서 막대에 올리면 헤더 날짜가 진해지는 것과 같은 목적).
- 막대를 둥근 알약형으로, 호버 시 살짝 뜨는 그림자 추가. "오늘" 버튼으로
  현재 날짜로 바로 이동.
- 실제 드래그(핸들 좌표 기준)로 헤드리스 크롬에서 검증 — 기간 연장/이동
  둘 다 서버에 정확히 저장되는 것까지 확인.
2026-09-16 17:34:09 +09:00
king 8634b2602b feat(project): 프로젝트 페이지에 아사나식 대시보드 탭 추가
보드/리스트/달력/타임라인 옆에 "대시보드" 탭 신설. 서버 재조회 없이 이미
로드된 tasks(visibleTasks(), 스코프 토글도 그대로 따름)로 클라이언트에서
즉시 집계:
- 통계 카드 4개(완료/미완료/마감초과/전체), 숫자가 0에서 카운트업
- 미완료 작업 합계(섹션별) — 세로 막대, 보드 컬럼과 같은 순서
- 작업 합계(완료 상태별) — SVG 도넛(완료=초록/미완료=포인트컬러), 등장 시
  획이 0에서 목표 길이까지 그려짐
- 예정된 작업 합계(담당자별) — 일정 있는 미완료 업무만, 상위 10명+기타

막대/도넛 둘 다 호버 시 값 우선 툴팁, 카드는 순차 페이드인(아사나 느낌).
차트 라이브러리 추가 없이 순수 SVG/CSS로 구현. 탭 5개로 늘면서 좁은
화면에서 텍스트가 줄바꿈되던 버그도 같이 고침(pj-view-tabs flex-shrink).
2026-09-16 17:08:40 +09:00
king cfa41f0f6f feat(project): 보드 카드를 같은 세션 안에서 드래그로 순서 변경
지금까지 같은 세션에 다시 놓으면 아무 일도 안 일어났다(다른 세션으로
옮길 때만 동작). 놓은 위치(마우스 Y좌표)를 카드들 사이 인덱스로 계산해
그 순서를 새 엔드포인트로 저장하고(tasks.sort_order, 세션 소속만 재배정 —
세션 재정렬의 reorder_stages 와 동일 패턴), 로컬 tasks 배열도 그 순서에
맞게 재배치(applyStageOrder)해 새로고침 없이 즉시 반영. 실제 3개 업무로
드래그→서버 저장→하드리로드까지 헤드리스 크롬으로 검증.
2026-09-16 15:31:26 +09:00
king 4dbb3e7856 feat(project): 프로젝트 페이지의 내 업무 패널에도 우클릭 메뉴 추가
지난번엔 홈 화면 내 업무 패널만 처리했는데, 프로젝트 상세 페이지 우측
내 업무 패널(.pj-project-mytasks)에도 동일하게 열기/업무 추가/수정/
완료토글/삭제 메뉴를 추가. "업무 추가"는 openTaskModal(null) 이 항상
현재 열려 있는 프로젝트에만 새 업무를 만들 수 있는 제약이 있어, 업무가
다른 프로젝트 소속이면 그 프로젝트 페이지로 이동시켜 거기서 추가하도록
처리(실제 프로젝트 A/B 두 개로 헤드리스 크롬에서 검증).
2026-09-16 15:17:46 +09:00
king 2773d8858d feat(project): 홈 카드/내 업무 패널 업무 항목에도 우클릭 메뉴(완료 포함) 추가
지금까지 홈 카드 안 업무 행·"내 업무" 패널 행은 자체 우클릭 메뉴가 없어서
이벤트가 부모 프로젝트 카드로 버블링돼 엉뚱하게 프로젝트 메뉴가 뜨던 문제를
같이 고침(stopPropagation 누락). 열기(프로젝트 페이지로 이동)/업무 추가/
수정(팝업 편집)/완료토글/삭제 5항목을 공용 함수(homeTaskContextItems)로
묶어 두 곳(카드 안 업무 행, 내 업무 패널)에서 그대로 재사용.
2026-09-16 15:10:13 +09:00
king eb1bae9fc6 style(project): 새 프로젝트 모달 멤버 선택도 멤버 배정 창과 동일하게 통일
/api/assignable-users 응답에 avatar 필드 추가하고, 아이콘/이름/체크박스
세로 카드(memberPickHtml)를 공용 함수로 뽑아 새 프로젝트 모달(홈·사이드바
둘 다)과 멤버 배정 모달 3곳이 전부 같은 모양을 쓰도록 통일. 홈 페이지는
avatars 맵이 따로 없어서 이 API 응답의 avatar 필드에만 의존하도록 함.
2026-09-16 13:23:40 +09:00
king 81c8a77f89 style(project): 멤버 배정 후보 카드를 아이콘/이름/체크박스 세로 배치로
아이콘 - 이름 - 체크박스 순 세로 스택으로 바꾸고 아이콘 크기를 2배(20px→
40px, 아바타 18px→36px)로 키움. 새 프로젝트 모달의 멤버 선택(가로 한 줄)
은 그대로 두고 pj-member-pick-stacked 를 따로 둬서 멤버 배정 모달에만 적용.
2026-09-16 13:10:24 +09:00
king 22c4997342 feat(project): 멤버 배정을 체크박스 다중선택 + 아이콘 표시로 변경
<select> 하나씩 골라 순서대로 배정하던 걸 새 프로젝트 모달과 같은
체크박스 목록으로 바꿔 후보 전원을 한 화면에서 보고 여러 명을 한 번에
선택해 배정. 각 후보는 항상 아바타(구글 프로필, 없으면 기본 아이콘)와
이름을 같이 보여준다. 저장 시 선택된 인원마다 순차 POST 후 결과를
members 배열에 patch(기존 optimistic 흐름 그대로, reload 없음).
2026-09-16 13:03:50 +09:00
king 3a50e81191 fix(project): 프로젝트 목록 + 버튼도 새 프로젝트 팝업으로 열리게 수정
좌측 사이드바 "+ " 버튼이 prompt() 두 번(이름/마감일)으로 대충 만들던 걸
홈 화면과 같은 새 프로젝트 모달(설명·날짜·색상·멤버 선택)로 통일.
project.html 에 홈과 동일한 #pj-modal-project 마크업 추가, project.js 는
같은 저장 로직을 쓰되 결과는 mergeProject() 로 사이드바 트리에 patch.
2026-09-16 12:53:26 +09:00
king 27d91b9f6b feat(project): 전체 뷰에 우클릭 컨텍스트 메뉴 + optimistic update 전면 적용
- 공용 우클릭 메뉴(showContextMenu)와 토스트(showToast)를 도입해 보드 카드,
  리스트 행, 달력 막대, 타임라인 아이템, 세션 컬럼 헤더, 홈 프로젝트 카드,
  사이드바 프로젝트 트리, 멤버 행, 알림 행까지 9곳에 열기/완료토글/삭제 등
  빠른 조작 메뉴를 추가.
- 프로젝트 생성/수정/삭제, 멤버 추가/삭제, 홈 업무모달 저장/삭제/완료토글,
  알림 모두읽음 등 남아있던 location.reload() 를 모두 로컬 DOM/상태 patch
  기반 optimistic update 로 전환.
- 8초 주기 실시간 동기화 폴러도 전체 새로고침 대신 업무/세션/멤버만 조용히
  재조회해 병합하도록 변경(softSyncProjectRef).
- 로컬에 Postgres+세션 우회 로그인으로 실제 서버 붙여 헤드리스 크롬으로
  검증하는 과정에서 실사용 버그 2건 발견해 같이 수정: 폴러가 재조회한
  업무에 context_project_id 가 없어 스코프 필터에 걸려 화면에서 사라지던
  문제, 서버가 최초 렌더한 업무 행은 data-task-id 가 <li> 가 아니라 안쪽
  <a> 에만 있어 수정/삭제가 조용히 씹히던 문제.
2026-09-16 12:31:01 +09:00
king 1710c8f811 feat(project): 좌측 프로젝트 목록에 수정(✎) 버튼 추가
프로젝트 상세 화면 좌측 트리는 renderTree()가 매번 JS로 다시 그리므로
(라이브 새로고침 포함) 실제 동작은 projectsMeta/treeProjLi/wireTreeHandlers
쪽에 구현 — 홈 화면과 같은 프로젝트 수정 모달(이름/설명/기간/색상/완료
토글)을 재사용. 서버 쪽 projects_meta·nav_projects 에 description/status
필드 추가(기존엔 없어서 수정 폼을 못 채웠음). Jinja 쪽 nav_projects 루프도
동일하게 맞춰뒀지만 JS가 즉시 덮어쓰므로 첫 페인트용일 뿐 — 기존 삭제
버튼도 같은 이중 구조였음(관례를 그대로 따름).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 01:39:27 +09:00
king 33b6bd2201 fix(project): 설명란 이미지 삭제 시 첨부파일 목록에서도 같이 삭제
설명에 붙여넣기/업로드로 넣은 이미지는 실제로는 task_attachments 레코드라,
에디터에서 이미지만 지우면(× 버튼 또는 Delete/Backspace) 서버 첨부는
그대로 남아 첨부파일 목록에 계속 보였다. src 의 attachment id 를 뽑아
DELETE 호출까지 같이 하고, 첨부파일 목록도 새로고침한다.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 01:12:08 +09:00
king 278151a3fc fix(project): 업무 모달 Esc 닫기+미저장 확인, 제목에 프로젝트명, 이미지 삽입 버그 수정
- Esc/배경 클릭/취소 버튼으로 업무 모달을 닫을 때 폼이 열었을 때와 달라져
  있으면 erpConfirm 으로 "저장하시겠습니까?" 확인 후 저장 또는 그냥 닫기.
  erpConfirm 자체도 Esc 로 닫히며 stopPropagation 을 안 해 재진입할 수
  있어 플래그로 막음.
- 모달 제목을 "업무 편집"/"새 업무" 단독 표기에서 "[프로젝트명]의 업무
  편집"/"[프로젝트명]의 새 업무"로 통일(편집 모드도 프로젝트명 표시).
- 이미지 삽입 버그 2건 수정:
  1) 커서 위치 오삽입 — 업로드 버튼 클릭 후 파일선택창이 닫히고 포커스가
     에디터로 돌아오면 브라우저가 선택범위를 엉뚱한 위치로 되살리는 경우가
     있었는데, 기존 코드는 "선택범위가 에디터 밖에 있을 때만" 저장해둔
     위치로 복원해서 이 경우를 못 잡았다 — 업로드 시작 직전 위치를 무조건
     복원하도록 수정.
  2) 저장 후 이미지가 사라짐 — 업로드가 끝나기 전에 저장 버튼을 누르면
     설명에 이미지가 아직 안 들어간 채로 저장됐다. 업로드 중엔 저장을
     막고 안내 문구를 보여줌.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 00:38:43 +09:00
king 79be87e7e9 feat(project): 업무 설명란을 간단한 워드프로세서 에디터로 — 서식 도구 추가
굵게/기울임/밑줄/글머리목록/번호목록/인용구/링크/서식지우기 버튼을
설명란 위에 추가. execCommand 기반(같은 파일의 이미지 삽입에서 이미
insertHTML 로 쓰던 것과 같은 패턴)이고, 생성되는 태그(b/i/u/ul/ol/li/
blockquote/a)는 전부 기존 sanitize_description_html 허용 목록 안이라
서버 쪽 변경 없음. 버튼 mousedown 에서 preventDefault 해 클릭 시 에디터
선택범위가 풀리는 것 방지, 커서 위치에 따라 버튼 활성 상태 표시.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 00:23:12 +09:00
king 41b6165144 fix(project): 자체 스크롤 패널에 항상 보이는 스크롤 막대를 JS로 직접 그림
DevTools 박스모델 확인 결과 내 업무 패널은 정상 스크롤 컨테이너였지만
스크롤바 두께가 0 — 이 환경(엣지 오버레이 스크롤바)에선 ::-webkit-scrollbar
커스텀도 scrollbar-width 표준 속성도 모두 무시돼 CSS 로는 막대를 항상
보이게 할 방법이 없었다. 네이티브 막대는 숨기고 attachScrollIndicator()
가 내 업무/좌측 프로젝트 목록/홈 프로젝트 목록/보드 패널 안에 스크롤
위치를 따라 움직이는 막대를 그린다(sticky anchor + 절대배치 track/thumb,
드래그·트랙 클릭 지원, MutationObserver/ResizeObserver 로 갱신). 막대
자리로 각 패널 padding-right 14px 확보, 보드의 scrollbar-gutter 제거.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-15 23:47:05 +09:00
king ecd4bd829e feat(project): 내 업무 패널 스크롤 + 프로젝트 폴더 펼치기/접기 토글
- .pj-home-side 에 max-height+overflow-y:auto 추가 — 목록이 길어지면
  패널 안에서만 스크롤(프로젝트 상세 화면은 기존 height:100% 우선 적용).
- "내 업무"의 프로젝트별 폴더 아이콘을 별도 토글 버튼으로 분리(이름은
  계속 프로젝트로 이동하는 링크) — 클릭 시 하위 업무 목록 펼침/접힘,
  아이콘도 folder_open/folder 로 전환. localStorage로 접힘 상태 기억.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 23:08:52 +09:00
king b1c1a04f4f feat(project): 새 업무 모달 제목에 프로젝트 이름 표시
"새 업무" → "[프로젝트명]의 새 업무" — 홈 화면 카드 옆 추가 버튼, 프로젝트
상세 화면 "+ 업무 추가" 버튼 둘 다 적용.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 22:59:28 +09:00
king 04c33e34e4 feat(project): 좌/가운데/우 3칸 독립 스크롤 + 화면 양끝 배치, 설명 이미지 편의개선
- 프로젝트 상세 화면을 휴가/쿠팡 모듈처럼 "한 화면 채움" 레이아웃으로 변경.
  좌측 프로젝트 목록/가운데 세션·리스트·달력·타임라인/우측 내 업무가 각자
  안에서만 스크롤되고 서로 얽히지 않는다. 이 화면에서만 페이지 폭 제한을
  풀어 좌측은 화면 맨 왼쪽, 우측 내 업무는 화면 맨 오른쪽에 붙는다.
- 설명란 이미지: 파일 업로드 버튼으로 넣을 때도 커서 위치에 삽입되도록
  선택범위를 기억했다가 복원(그동안은 항상 맨 끝에 붙었음). 이미지를
  선택한 상태에서 Delete/Backspace 키로도 삭제 가능.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 22:44:10 +09:00
king 022a161dda fix(project): 설명란 이미지 삽입 시 원본이 너비 초과하면 90%로 축소
이미지가 설명란 너비와 같거나 넓게 삽입되면 크기조절 핸들(이미지 우하단
바깥쪽 -6px 오프셋)이 설명란 테두리 밖으로 삐져나갔다. 붙여넣기/업로드로
삽입하기 전 원본 크기를 확인해, 설명란보다 넓은 경우 width 속성을 설명란
너비의 90%로 지정해서 넣는다.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 22:34:45 +09:00
king 428e5845b4 fix(project): 보드 세션 매이슨리 배치 — 열별 독립 높이, 행 강제 확장 제거
CSS Grid 4열은 같은 행의 세션 하나만 카드가 많아도 그 행 전체 높이가
맞춰져 다른 칸이 텅 빈 채로 늘어나는 문제가 있었다(그 여파로 .pj-main이
불필요하게 커져 페이지 전체가 스크롤되고 "내 업무" 패널까지 스크롤되는
것처럼 보였음). layoutMasonry()로 세션을 절대배치해 열은 왼쪽부터 고정
순서로 배정하고, 각 열은 자기 카드 높이만큼만 다음 세션을 바로 그 밑에
쌓는다. 창 크기 변경 시 재계산.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 22:32:54 +09:00
king 0875e15224 feat(project): 보드 4x2 그리드 + 세션추가 버튼 고정, 내 업무 패널 300px 고정
- .pj-board 를 flex 가로스크롤에서 4열(좁아지면 3/2/1열) 그리드로 변경,
  세션이 많아지면 보드 영역 안에서만 세로 스크롤. "+ 세션 추가" 버튼을
  보드 밖 pj-board-toolbar 로 옮겨 스크롤과 무관하게 항상 보이게 함.
- 홈/프로젝트 상세 화면의 "내 업무" 패널 가로폭을 300px로 고정(그리드
  트랙 + width 모두 지정).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 22:21:52 +09:00
king fc2ae9d1a3 feat(project): 프로젝트 화면 좌측메뉴 강제접힘 + 우측 내업무 패널 + 보드 가로스크롤 격리
- 프로젝트 관리(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>
2026-09-15 22:13:49 +09:00
king b3d6a35651 feat(project): 완료 토글, 설명 이미지 크기조절/삭제, 연결폼 가독성, 모달 고정크기 800x1100
- 업무 편집 모달에 "완료로 표시" 버튼 추가(완료 시 리스트뷰는 기존 취소선
  스타일 그대로 적용됨). 완료 상태에 따라 버튼 색/문구 토글.
- 설명란 이미지 클릭 시 선택되어 우하단 드래그로 크기 조절, × 버튼으로 삭제
  가능. 크기는 style이 아닌 width 속성으로 저장해 서버 sanitize 후에도 유지.
- 연결된 프로젝트 select 를 세로 배치+작은 폰트로 바꿔 글자 잘림 해결.
- 업무 편집 모달을 800x1100 고정 크기로 바꾸고 좌(메타/설명)·우(하위업무·
  첨부·연결·댓글) 칼럼이 각자 내부 스크롤하도록 재정비.

fix(shell): 사이드바 접힘 상태를 localStorage에서 첫 페인트 전에 반영해
페이지 이동 시 "펼쳐졌다 다시 접히는" 깜빡임 제거.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 21:02:37 +09:00
king 8449b404b2 feat(project): 업무 모달 2단 레이아웃 + 프로젝트연결 즉시선택 + 하위업무 즉시배정
연결된 프로젝트: "+추가" 버튼 없이 프로젝트/세션 셀렉트를 바로 노출, 모달
열릴 때 목록 미리 로드. 하위업무 추가행에 담당자/마감일 입력 추가해 생성과
동시에 배정 가능. 모달을 넓히고(780px) 메타/설명(좌)·하위업무/첨부/연결/
댓글(우) 2단 그리드로 재배치, 우측 칼럼만 자체 스크롤 시켜 전체 스크롤 최소화.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 20:47:17 +09:00
king 9c07aefb29 style(project): 아사나 느낌 색상/카드 디자인 + 사이드바·리스트·타임라인 개편
색상/폰트/카드/사이드바/리스트/타임라인이 아사나와 다르다는 피드백 반영.

- 보라 포인트 컬러(--pj-accent) 도입 — 기본 검정 버튼/활성 탭을 이걸로
  교체(erp.css 등 다른 모듈은 안 건드림, .pj- 클래스 범위 안에서만).
- 카드(.pj-card, .pj-project-card)·보드 컬럼 라운드/그림자 키워 아사나
  카드 느낌으로.
- 왼쪽 사이드바 — 프로젝트마다 업무를 중첩해서 보여주던 트리를 걷어내고
  아사나처럼 "프로젝트 이름 목록만"으로 단순화. 폴더 아이콘 대신 프로젝트
  색 + 첫 글자 아바타.
- 리스트 뷰("이 프로젝트" 스코프) — 세션이 컬럼이 아니라 아사나처럼 그룹
  구분선이 되도록 개편(세션별로 묶어서 보여주고 접기/펼치기, 개수 표시).
  "전체 프로젝트" 스코프는 세션이 프로젝트마다 달라 그룹화 의미가 없으므로
  기존 프로젝트/세션 컬럼 있는 평범한 정렬 테이블 유지.
- 타임라인 — "이 프로젝트" 스코프에서는 프로젝트가 아니라 세션별로 행(스윔
  레인)을 나눔(아사나 타임라인=섹션 단위). "전체 프로젝트"는 기존처럼
  프로젝트별.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 20:05:34 +09:00
king 3ca0b1de87 fix(project): 프로젝트 생성 시 세션 자동 추가 제거 (아사나처럼 직접 추가)
create_project 의 seed_stages 기본값을 True→False 로. 새 프로젝트는 이제
세션이 0개로 시작하고, 보드에서 "+ 세션 추가"로 직접 만든다. 세션이 하나도
없는 새 프로젝트의 보드 화면에는 안내 문구를 띄운다.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 19:55:54 +09:00
king 86558dc8c1 fix(project): 프로젝트 상세 진입 시 기본 화면을 보드(세션)로
지금까지 프로젝트를 선택해도 기본 탭이 "달력"이라 가운데 화면에 세션이
바로 안 보였다(아사나는 프로젝트 진입 시 보드/리스트가 기본). 탭 순서를
보드·리스트·달력·타임라인으로 바꾸고 보드를 기본 활성 탭으로.

달력 이전/다음달 이동은 페이지를 통째로 새로고침하므로(?y=&m=), 마지막
탭을 localStorage(pj_view)에 기억해뒀다가 복원한다 — 안 그러면 달력을
보다가 월 이동만 해도 매번 보드로 튕겨나간다.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 19:50:20 +09:00
king 3e4883854d feat(project): 3단계 구조 프론트엔드 — 세션 관리·스코프·하위업무·멀티호밍·이미지
지난 커밋(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>
2026-09-15 18:42:54 +09:00
king 07f4d0fd5b feat(project): 3단계 구조 백엔드 기반 — 세션 삭제자·하위업무·멀티호밍
프로젝트→세션→업무 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>
2026-09-15 18:15:25 +09:00
king fee2765905 fix(project): 아이콘버튼 호버 중앙정렬·댓글팝업 본인댓글 삭제 지원
- .pj-icon-btn 기본 스타일에 flex 중앙정렬 추가(닫기 버튼 등 호버 음영이
  아이콘 기준 중앙에 오지 않던 문제, 버튼 UA 기본 패딩이 원인)
- 댓글 팝업(카톡형)에서 본인이 작성한 댓글에만 삭제 버튼 노출
  (서버는 이미 본인/관리자만 삭제 허용하도록 검증 중)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 13:28:02 +09:00
king b3c98995c9 feat(project): 댓글 팝업 고정크기 500x850·업무제목 앞 상태아이콘→댓글아이콘 정리
- 댓글 팝업 제목을 업무 제목으로 표시, 우상단 닫기(X) 버튼 추가
- 팝업 크기 500x850 고정, 내용 많으면 목록만 스크롤(팝업 크기 유지)
- 카드/내 업무 목록의 완료여부 원형 아이콘 제거, 그 자리를 댓글 아이콘 전용 슬롯으로 교체
- 댓글 유무와 무관하게 슬롯 폭을 고정해 업무 제목이 항상 같은 위치에서 시작(세로 정렬)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 13:22:50 +09:00
king f54344c3ef feat(project): 홈 화면 업무추가·멤버표시·댓글팝업·실시간 새로고침 추가
- 카드 이름 옆 호버 노출 업무 추가 버튼(기존 업무편집 팝업을 생성 모드로 재사용)
- 카드 이름 아래 배정 멤버 아이콘+이름 표시, 새 프로젝트 모달에서 멤버 다중 선택
- 업무별 댓글 말풍선+개수 표시, 더블클릭 시 카톡형 댓글 전용 팝업
- 확인 안 한 새 댓글은 말풍선이 커지며 반짝임(localStorage 로 확인 여부 추적)
- GET /project/api/live-version 폴링으로 다른 사용자의 변경사항을 자동 새로고침
- 날짜 표기를 yy/mm/dd(요일)에서 mm/dd(요일)로 변경

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 13:03:02 +09:00
king 1aad9844dd feat(project): 업무 클릭 시 페이지 이동 없이 그 자리에서 팝업 편집
- 좌측 트리(프로젝트 상세 페이지): 이미 로드된 업무 데이터로 즉시 팝업 —
  더 이상 페이지를 새로고침하며 달력 탭으로 넘어가지 않음
- 홈 화면 카드/내 업무 리스트: 홈에도 업무편집 모달을 추가해 페이지 이동 없이
  팝업으로 편집(담당자·단계는 해당 프로젝트를 API 로 조회해 채움, 첨부·댓글 포함)
- 교차 프로젝트 업무 편집 시 담당자 select 가 현재 프로젝트 멤버만 보이던 문제 수정
  (해당 업무의 프로젝트 멤버를 다시 조회)
- 완료 프로젝트 숨기기 토글을 인라인 style.display 로 직접 제어하도록 변경
  ([hidden] 속성 + 클래스 규칙 조합이 기대대로 안 먹히는 경우 대비, 원인 불문 확실히 동작)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 09:16:39 +09:00
king a09ceee7a5 feat(project): 홈 화면 진행중/완료 프로젝트 구분, 완료 업무 취소선 유지
- 프로젝트 카드를 "진행중"/"완료" 두 섹션으로 분리(완료는 접기/펼치기)
- 완료된 업무도 미리보기 목록에서 숨기지 않고 취소선으로 계속 표시
- 사이드바 빠른 프로젝트 생성(+)에도 마감일 입력 추가 (홈 새 프로젝트 모달은 기존에 지원)
- 카드 편집/삭제 버튼이 완료 섹션 카드도 인식하도록 수정

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-15 08:55:50 +09:00
king b74d2be6d3 feat(project): 좌측 트리를 클라이언트 렌더 → 업무 추가/수정/삭제 즉시 반영
- 사이드 프로젝트 트리를 tasks 로부터 JS 로 재렌더(renderTree)
- refreshActiveView 에서 트리도 갱신 → 새로고침 없이 좌측에 바로 표시
- 새 업무 추가 시 해당 프로젝트 자동 펼침
- projectsMeta 에 created_by 추가(트리 삭제 권한용)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 17:58:37 +09:00
king 0822baf5b7 style(project): 모든 댓글 표시를 💬 이모지로 통일
달력/보드/리스트 말풍선과 업무 모달 댓글 헤더 아이콘을 material 폰트
대신 💬 이모지로 변경(타임라인과 일관).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 17:31:31 +09:00
king 6e0180944e feat(project): 담당자·댓글 작성자 아이콘을 구글 프로필 이미지(원형)로 표시
- 라우터: 이메일→구글 picture URL 아바타 맵을 pj-data 로 전달
- 보드 카드/리스트 담당자, 댓글 작성자에 원형 프로필 이미지 표시
- 이미지 없으면 기존 기본 아이콘 폴백. referrerpolicy=no-referrer

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 17:26:55 +09:00
king 7c5a62ecc1 fix(project): 타임라인 댓글 아이콘(이모지) + 확대구간 저장 안되던 문제
- vis 가 HTML 정화 → 아이콘 폰트 대신 💬 이모지로 댓글 수 표시
- 저장된 구간을 생성 옵션 start/end 로 주입해 autofit 덮어쓰기 방지,
  rangechanged 는 byUser 일 때만 저장

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 17:20:46 +09:00
king e4fb945474 feat(project): 댓글 있는 업무에 말풍선 아이콘 표시(달력·타임라인·보드·리스트)
- list_tasks/get_task 에 comment_count 서브쿼리 추가
- 달력 막대/타임라인 항목/보드 카드/리스트 업무열에 댓글 수 말풍선
- 댓글 로드 시 메모리 카운트 동기화

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 17:17:48 +09:00
king e817dd75d5 feat(project): 리스트 행 배경에 프로젝트 색 연하게 + 타임라인 확대구간 기억
- 리스트: 각 행 배경을 프로젝트 색 8%로 칠함
- 타임라인: 보던 확대/이동 구간을 localStorage(pj_tl_window)에 저장,
  재렌더·탭전환 시 복원(초기화 방지)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 17:13:00 +09:00
king f8f4cded66 feat(project): 업무·프로젝트 삭제를 '만든 사람'만 허용 + 경고
- 서버: api_delete_task/api_delete_project 가 created_by 일치자만 허용
  (슈퍼관리자 예외, created_by 없는 과거 데이터는 관리자 허용). 403 반환.
- 클라이언트: 삭제 버튼 클릭 시 만든 사람이 아니면 경고창 후 중단
  (created_by 를 트리 삭제버튼·홈 카드·업무 객체로 전달)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 17:10:24 +09:00
king 523b9b3150 fix(project): 타임라인 배경을 프로젝트 시작/마감일 기준으로 표시
배경(전체 일정)을 업무 최소~최대가 아니라 프로젝트 자체 start_date~
due_date 로 칠한다. 업무가 그 밖에 있으면 범위를 넓혀 가리지 않게 유지.
projects_meta 에 start_date/due_date 추가.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-25 16:59:57 +09:00