Commit Graph

298 Commits

Author SHA1 Message Date
king 85c7333e72 feat(cafe24): 품목 추가·삭제 + 옵션 재생성
- 추가(「+ 행 추가」/불러오기의 새 이름): 저장 시 옵션값을 끝에 덧붙여
  PUT options(allow_append — 앞 위치는 그대로라 기존 이름이 밀리지 않음).
  카페24가 품목을 자동 생성하면 wait_for_variants 로 새 코드를 받아
  자체코드·추가금액·진열/판매를 이어서 PUT. 거부 시 오류 그대로 표시.
- 삭제(행 ✕): DELETE /variants/{code}. 지연 중 GET 에 남는 삭제 품목은
  스냅샷 {"_deleted": true} 로 걸러냄. 품목 없는 옵션값은 하단 안내로 분리.
- 옵션값 줄이기(개수 감소)는 서버가 거부 — 위치 짝맞춤으로 이름이 밀림.
- 옵션 재생성: 전체 삭제 → 현재 행으로 생성 → 코드/금액/썸네일 재반영
  (품목코드 새로 부여, 강한 확인창).
- 유닛 91 통과, 통합 하네스(덧붙이기·삭제·지연 필터) 통과, 헤드리스 렌더 확인.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-18 23:47:42 +09:00
king f31204e9b9 fix(cafe24): 통합 목록 행 순서를 품목(진열) 순서로, 깨진 썸네일은 "없음"
- options 응답의 옵션값 순서는 등록 순서라 쇼핑몰 순서와 달랐다. 품목 목록
  순서(카페24가 진열순서대로 돌려줌)를 기준으로 행을 만들고, 품목이 안 잡힌
  옵션값은 뒤에 붙인다. 옵션 PUT 짝맞춤용 index 는 그대로 유지하고, 드래그
  변경 판정은 처음 그린 위치(data-pos) 기준으로.
- 카페24가 경로만 주고 파일이 없는 썸네일은 onerror 로 "없음" 표시.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-18 23:32:34 +09:00
king 8125a59366 feat(cafe24): 옵션값+품목 통합 목록, 드래그 순서, 옵션값 불러오기
- 옵션 1개 상품은 한 행에 썸네일·옵션값 이름·품목코드(복사)·자체코드·
  추가금액·진열·판매를 두고 「저장」 한 번으로 옵션 PUT → 품목 PUT.
- 옵션 없는 상품: 행 추가/삭제 후 저장 → 옵션 생성 → 카페24가 부여한
  품목코드를 재시도 조회(products.wait_for_variants)로 받아 자체코드·
  추가금액·썸네일까지 이어서 반영.
- 순서 드래그는 품목 display_order 로 저장(옵션값 재배열 PUT 은 위치 짝맞춤
  때문에 품목코드↔이름이 뒤바뀔 수 있어 사용하지 않음).
- 「옵션값 불러오기」: 탭/공백 구분 텍스트(이름·판매가·추가금액·자체코드)
  붙여넣기 → 행 자동 채움. 기존 옵션은 이름으로 짝지어 코드/금액만.
- 옵션 2개 이상(조합) 상품은 기존 2열 화면 유지.
- 모달 JS 를 app/static/cafe24-options.js 로 분리. 유닛테스트 90 통과,
  통합 하네스 통과, 헤드리스 크롬 렌더 확인.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-18 23:25:52 +09:00
king be0d44ded6 fix(cafe24): 옵션 모달 — 옵션 열 축소·품목 표 확대, 창 바닥까지 사용, 품목코드 복사
- 옵션 정의 열 400 → 340px, 모달 폭 1180 → 1280px. 품목 표 열 폭을 줄여
  옵션값 이름이 한 줄(넘치면 말줄임 + title)에 들어가게.
- 모달 높이를 90vh 고정으로 바꾸고 두 열이 바닥까지 늘어나 각자 스크롤
  (품목은 표만 스크롤, 저장 버튼 고정). 첫 구현 때 남은 옛 규칙
  `.cf24-variants-wrap { max-height: 320px }` 가 표 높이를 막고 있었다
  (헤드리스 크롬 실측으로 발견) — 제거.
- 품목코드 클릭 = 클립보드 복사("복사됨" 표시, 비보안 컨텍스트는 execCommand).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-18 18:50:28 +09:00
king e838e8ee15 feat(cafe24): 옵션/품목 편집을 별도 모달 창으로
380px 정보 패널은 옵션값·품목 표를 담기에 좁다. 패널에는 「팝업에서 관리」
버튼만 두고, 최대 1180px 모달(왼쪽 옵션 정의 / 오른쪽 품목 표: 이미지·옵션·
품목코드·자체코드·추가금액·진열·판매)에서 편집한다.
- 모달은 페이지에 하나(패널 조각 교체와 무관), 열 때마다 카페24에서 새로 읽음.
- 닫기: X · 배경 클릭 · Esc. 저장 안 한 변경(.is-dirty)이 있으면 확인창.
- 다른 상품을 고르면 열려 있던 창은 닫힘.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-18 18:31:59 +09:00
king 18015418d9 fix(cafe24): 옵션값 썸네일 탐색 확대 + 품목을 2줄 카드로
- 옵션값 썸네일이 option_image_file 만 봐서 "없음"으로 나왔다. 카페24
  관리자에서 "옵션 연결 이미지"로만 등록한 상품은 그 필드가 비어 있고 품목
  image 에만 나타난다(실물). option_image_file → option_link_image → 해당
  옵션값을 가진 품목의 image 순으로 찾는다.
- 품목 표가 380px 패널에 좁아 옵션값 이름이 아이콘 아래로 꺾여 잘렸다.
  품목마다 2줄 카드(아이콘+이름 / 자체코드·추가금액·진열·판매)로 교체.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-18 18:13:09 +09:00
king 40766d805d feat(cafe24): 읽기 지연 보정("마지막 쓰기가 권위") + 상품 정보 패널
증상: 상세페이지를 적용해도 편집기에 수정 전 소스가 보이고 한참 뒤에야
반영됨. 원인은 우리 캐시가 아니라(전부 no-store) 카페24 관리자 API 가 PUT
뒤 한동안 GET 에서 예전 값을 돌려주는 읽기 지연. 예전 코드는 2.4초만
기다린 뒤 GET 값을 그대로 믿어 예전 소스 표시·지문 충돌 오판·예전 값
백업이 생겼다.

- 상세설명: 쓰기 성공 시 MANUAL/SCHEDULED revision 을 기준으로, 카페24 값이
  유예시간 안의 revision 중 하나와 같으면 지연(pending)으로 보고 마지막
  쓰기를 표시·지문 기준으로 쓴다. 모르는 값이면 외부 변경(external).
  store.resolve_description / db.revision_digests(md5) / 배너 2종.
- 적용(apply)은 유효 현재값으로 BACKUP·지문 대조·변경없음 판정. 재조회
  확인 결과는 감사로그에만 남긴다.
- 스칼라(상품명·가격·이미지·진열/판매): PUT 응답을 cafe24_products.
  last_write_snapshot(JSONB, 마이그레이션 004)에 남기고 GET 의 updated_date
  가 그보다 이전이면 스냅샷으로 덮어씀. 옵션/품목도 섹션별 스냅샷.
- 3분할 화면: 목록 | 편집기 | 상품 정보 패널(_side.html, /pane 이 두 조각을
  한 응답으로). routes_product_info.py JSON API — 상품명/판매가/공급가/
  소비자가, 대표이미지 업로드(POST /admin/products/images → PUT detail_image
  + image_upload_type=A), 옵션 생성/이름·썸네일·표시방식 수정/삭제, 품목
  자체코드·추가금액·진열·판매 일괄 수정. 화면은 PUT 응답으로 그린다.
- client.delete/timeout, products.upload_images·options·variants 래퍼.
- 유닛테스트 21건 추가(88 통과), 문서(CAFE24_MODULE 3-3/3-4, DATABASES,
  .env.example CAFE24_READ_LAG_GRACE_MIN) 갱신.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-18 18:07:42 +09:00
king 8ea0db9245 feat(project): 좌측 프로젝트 트리도 완료 프로젝트 별도 섹션으로 분류
홈 카드와 같은 원칙 — "프로젝트" 목록 아래 "완료 프로젝트" 섹션을 따로
둔다. 서버 렌더(project.html, rejectattr/selectattr로 분리)와 클라이언트
재렌더(project.js renderTree) 둘 다 반영. 완료 섹션이 처음엔 없어도
(완료 프로젝트가 하나도 없던 상태로 열었을 때) 완료로 바뀌는 순간 JS가
동적으로 섹션을 만들고, 마지막 하나가 해제/삭제되면 다시 치운다. 드래그
재정렬은 각 섹션 안에서만(홈 카드와 동일).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 15:50:59 +09:00
king 690fc8bb12 feat(project): 완료 프로젝트를 "완료 프로젝트" 별도 섹션으로 다시 분류
같은 그리드 안에서 끝으로만 보내던 것을 되돌려, 진행중/완료를 다시
분리된 섹션(그리드)으로 나눔. 완료 체크 시 카드가 "완료 프로젝트"
섹션으로 옮겨지고(반투명은 기존 .is-done 유지), 해제하면 "진행중인
프로젝트"로 복귀 — 각 섹션 안에서는 sort_order 기준 정렬 유지.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 15:44:20 +09:00
king 825d63ab42 fix(project): 호버 툴팁을 커서 위쪽 가운데로
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 15:38:50 +09:00
king 8cc466dd17 feat(project): 내 업무 개수 배지 - 마우스 따라다니는 툴팁으로 진행/완료 표시
네이티브 title 대신 커서를 따라 움직이는 작은 말풍선(공용 [data-tip]
유틸, initHoverTips). 헤드리스 크롬에서 synthetic mouse event로 동작
검증(진행/완료 텍스트 + 좌표 갱신 확인).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 15:36:45 +09:00
king a82d54574f fix(project): 내 업무 개수 배지 파스텔톤으로
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 15:33:01 +09:00
king 48e7e0a87d fix(project): 내 업무 개수 배지 - 진행/완료만, 이름 오른쪽, 하늘색/빨강
전체 배지 제거하고 진행(하늘색)·완료(빨강) 두 개만 프로젝트 이름
오른쪽(.pj-mytree-head 안, 접어도 계속 보이는 자리)에 표시.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 15:30:39 +09:00
king 1582e9e84c fix(project): 내 업무 패널 개수 배지를 프로젝트 이름 아래 줄로 이동
- 이름과 같은 줄에서 폭을 다투다 이름이 2줄로 꺾이던 문제 수정 — 이름
  span 을 flex:1 로 만들어 실제 컨테이너 폭에 맞춰 한 줄 말줄임표 처리.
  (헤드리스 크롬으로 긴 이름 강제 렌더해 width/scrollWidth/offsetHeight
  실측 확인 — 한 줄 유지됨)
- 개수 배지를 .pj-mytree-tasks(접히는 업무 목록)의 형제로 옮겨 폴더를
  접어도 계속 보이게 함

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 14:53:17 +09:00
king 4a2e20520e feat(project): 홈 카드도 완료 체크 시 반투명 + 대시보드 끝으로(세션과 동일 원칙)
기존엔 완료 프로젝트가 "완료된 프로젝트" 별도 섹션(숨기기 토글 포함)으로
빠졌는데, 요청에 따라 세션 완료 처리와 같은 방식으로 바꿈 — 같은 그리드
안에서 완료 여부 → sort_order → id 순으로 안정 정렬해 완료면 맨 끝으로,
해제하면 sort_order 기준 원래 자리로 자동 복귀(resortProjectGrid, 서버
쪽도 index() 에서 같은 기준으로 미리 정렬해 내려줌: _group 아님, 별도
정렬 한 줄 sorted(tree, key=...)). 완료 섹션/숨기기 토글 관련 죽은
코드(JS·CSS·템플릿) 정리.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 14:48:19 +09:00
king 8d765ec60d fix(project): 프로젝트 삭제 확인창도 브라우저 기본 confirm 대신 erpConfirm으로
홈 카드 삭제/수정모달 삭제/좌측 트리(및 그 수정모달) 삭제 3곳 모두 교체.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 14:32:22 +09:00
king cc73f79b7c feat(project): 내 업무 패널에 프로젝트별 전체/진행/완료 개수 배지
프로젝트 이름 오른쪽에 "전체5 진행2 완료3" 형식으로 표시, 숫자는 색깔
있는 동그라미 안에(전체=회색, 진행=파랑, 완료=초록). 서버 렌더용 카운트는
_group_my_tasks() 헬퍼로 통합(홈/프로젝트 화면 중복 제거), 실시간 갱신은
DOM의 실제 <li> 개수를 다시 세는 updateMyTreeCounts()를 기존 sync 함수
(syncMyTaskPanel/syncProjectMyTaskPanel) 안에서 호출해 처리.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 14:30:34 +09:00
king 397ca8684a fix(project): 세션 삭제 확인창을 브라우저 기본 confirm 대신 erpConfirm으로
기본 confirm()은 제목에 도메인이 그대로 찍히고 스타일도 못 바꾼다.
앱 공용 팝업(window.erpConfirm)으로 교체.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 14:21:43 +09:00
king e2734e176c feat(project): 홈 카드 세션 없으면 업무추가 버튼 비활성화
세션이 하나도 없으면 업무를 넣을 세션이 없으므로 아이콘 버튼(disabled)과
우클릭 메뉴 둘 다 막는다. "세션 추가"로 첫 세션을 만들면 새로고침 없이
바로 활성화(dataset.hasStages 갱신 + disabled 해제).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 14:18:37 +09:00
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 af11927823 fix(project): 좌측 사이드바 헤더(프로젝트/프로젝트 멤버/전체 멤버) 글자 크게
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 14:01:55 +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 7ce8d1d9cf fix(project): 프로젝트 멤버 삭제(x) 버튼 hover 시에만 노출
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 13:50:34 +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 b21e42e949 fix(project): 댓글 첨부 버튼 정렬 - .pj-modal-card label 규칙과 상세도 충돌 수정
.pj-modal-card label { display:block; margin-bottom:12px; font-size:12.5px }
(다른 모달 폼 라벨용 공용 규칙, 클래스+엘리먼트라 상세도 0,1,1)이
.pj-chat-attach-btn(단일 클래스, 상세도 0,1,0)의 display:flex 를 조용히
덮어써서 display:block 이 됐고, flex 아닐 때 align-items/justify-content
는 무효라 아이콘이 정가운데로 안 갔음. margin-bottom:12px 까지 새어들어와
버튼이 실제로 위로 살짝 밀려 보였음. 헤드리스 크롬으로 실제 project.css를
.pj-modal-card 컨텍스트에서 그대로 렌더해 getBoundingClientRect 로 재현
확인 후, .pj-modal-card .pj-chat-attach-btn 로 상세도를 올리고 새는 값
(margin-bottom/font-size)도 명시적으로 되돌려 고침 — 아이콘 상하좌우 7px
로 정확히 정가운데.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 13:30:02 +09:00
king 23e09ea2fa fix(project): 댓글 첨부 버튼 정렬 - 입력창과 높이 맞추고 아이콘 정가운데
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-17 12:42:21 +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 59b7f904bf style(project): 설명란 이미지 아이콘 세로 위치 추가 조정 (top:2px -> 4px)
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 01:40:10 +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 be9c97e04d style(project): 설명란 이미지 아이콘 크기 키우고 위치 미세조정
16px -> 19px, top:2px 로 살짝 내려서 옆 텍스트 버튼들과 시각적 중심이
맞게 조정.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 01:31:11 +09:00
king 93a1802c4c fix(project): 설명란 이미지 버튼을 이모지 대신 material-symbols 아이콘으로
🖼️ 이모지가 브라우저마다 색이 진하고 크기가 커서 옆 B/I/U 버튼들과 줄이
안 맞고 튀어 보였다. 이미 쓰고 있는 material-symbols-outlined 폰트의
"image" 아이콘으로 교체하고 16px로 맞춰 다른 서식 버튼과 높이/정렬이
같아지게 함.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-16 01:24:16 +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 a7a294ce93 feat(project): 프로젝트 달력에 2026~2030 대한민국 공휴일·대체공휴일 표시
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>
2026-09-16 00:14:40 +09:00
king 0ba6182574 fix(project): 내 업무 패널 오른쪽 끝이 화면 밖으로 밀려 스크롤 막대가 안 보이던 진짜 원인 수정
.erp-page 는 width:100% + padding 24px 이고 border-box 리셋은 .erp-shell 에만
걸려 있어 content-box 로 계산된다. 프로젝트 화면에서 max-width:1550px 캡을
풀자(0a427be/04c33e3) 페이지가 뷰포트보다 48px 넓어졌고, 그 결과 우측 패널의
오른쪽 끝 — 네이티브 스크롤바든 JS 로 그린 막대든 그 자리 — 가 화면 밖으로
나가 보이지 않았다("처음엔 잘 나왔다"가 맞았음: 캡을 풀기 전엔 안 넘쳤다).
헤드리스 크롬으로 재현·좌표 덤프(패널 right=1917 > viewport 1911)해서
확인했고, .erp-page:has(> .pj-wrap) 에 box-sizing:border-box 를 주면 패널이
화면 안에 들어오며 막대가 그려지는 것까지 스크린샷으로 검증함.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-09-16 00:01:06 +09:00