프로젝트

일반

사용자정보

기능 #281

김 정식이(가) 28일 전에 변경

# 개요 

 Redmine 이슈를 칸반 보드로 시각화하고 드래그앤드롭으로 상태를 변경할 수 있는 플러그인 개발. 

 - **플러그인 리포지토리**: 로컬 `/Users/joungsik/Workspace/joungsik/redmine_kanban` (완료 후 GitHub public 공개 예정) 공개) 
 - **통합 방식**: 로컬 심볼릭 링크로 현 redmine 프로젝트 `plugins/redmine_kanban`에 연결 (Task 3에서 연결) 
 - **설계서**: 플러그인 [`docs/plans/2026-04-18-redmine-kanban-design.md`](https://github.com/joungsik/redmine_kanban/blob/main/docs/plans/2026-04-18-redmine-kanban-design.md) (플러그인 리포 `docs/plans/2026-04-18-redmine-kanban-design.md` 내, 아직 로컬에만 존재) 
 - **계획서**: 플러그인 리포 `docs/plans/2026-04-18-implementation-plan.md` [`docs/plans/2026-04-18-implementation-plan.md`](https://github.com/joungsik/redmine_kanban/blob/main/docs/plans/2026-04-18-implementation-plan.md) (승인 완료) 

 ## MVP 범위 (v1.0) 

 - 프로젝트당 보드 1개 
 - `IssueStatus` 직접 매핑 (별도 칸반 상태 테이블 없음) 
 - `IssueQuery` 기반 이슈 소스 (글로벌 쿼리 사용 시 보드 프로젝트로 스코프 강제) 
 - 드래그로 즉시 상태 변경 (워크플로/권한 기존 체계 활용) 
 - 카드 세로 순서 수동 저장 
 - 종료 상태 통합 '완료' 컬럼 + 최근 N일 노출 (프로젝트별 설정) 
 - My Page 블록 '내 이슈 칸반': 담당 열린 이슈를 모든 활성 상태 컬럼에 표시 + 드래그로 상태 변경 

 ## 주요 결정 사항 요약 

 | 영역 | 결정 | 
 |---|---| 
 | 컬럼 구성 | `IssueStatus` 직접 매핑 | 
 | 이슈 소스 | `IssueQuery` 재사용 (보드 프로젝트로 스코프) | 
 | 카드 이동 | 즉시 저장, 실패 시 원위치 복구 | 
 | 카드 표시 | 번호+제목, 담당자, 우선순위, 트래커, 시작일, 마감일 | 
 | 접근 | 프로젝트 메뉴 탭 + My Page 블록 | 
 | 권한 | `view_kanban`, `manage_kanban` + 기존 `edit_issues` | 
 | 보드 갯수 | 프로젝트당 1개 | 
 | 카드 정렬 | 수동 드래그 위치 저장 | 
 | 종료 상태 | 통합 '완료' 컬럼 + 최근 N일 | 
 | 실시간 동기화 | 없음 (`lock_version` 충돌만 감지) | 

 ## 구현 Task 진행 현황 목록 

 - [x] [ ] **Task 1**: 플러그인 스켈레톤 (init.rb, 라우트, 권한, 메뉴, placeholder) 
 - [x] [ ] **Task 2**: 데이터 모델 + 마이그레이션 (`KanbanBoard`, `KanbanCardPosition`) + 단위 테스트 
 - [x] [ ] **Task 3**: 심볼릭 링크 설정 + 로컬 통합 확인 
 - [x] [ ] **Task 4**: 보드 조회 화면 (`show`) + 카드 렌더링 + 기능 테스트 
 - [x] [ ] **Task 5**: 보드 설정 화면 (`edit/update/destroy`) + i18n 
 - [x] [ ] **Task 6**: 카드 이동 API (`KanbanCardsController#move`) + 워크플로/낙관적 잠금 
 - [x] [ ] **Task 7**: 프론트엔드 (Stimulus + SortableJS via importmap CDN) 
 - [x] [ ] **Task 8**: 스타일 (CSS + Open Color 변수로 라이트/다크 테마 대응) 
 - [x] [ ] **Task 9**: 시스템 테스트 (Capybara + Selenium, 드래그는 Stimulus 컨트롤러 직접 호출 방식) Selenium 드래그 자동화) 
 - [x] [ ] **Task 10**: 릴리즈 준비 (README, CHANGELOG) CHANGELOG, v1.0.0 태그) 
 - [x] **Task 12**: 설정 페이지 버튼 컨벤션 정리 (submit_tag + sprite_icon cancel + delete_link) 
 - [x] **Task 13**: My Page '내 이슈 칸반' 블록 (모든 활성 상태 컬럼 + 드래그 상태 변경) 
 - [ ] **Task 11**: GitHub public 리포 생성 및 푸시 

 ## 구현 후 수정된 버그 

 - [x] 칸반 설정 페이지의 라벨 중복 렌더링 
 - [x] 칸반 설정 페이지의 '취소/삭제'가 버튼이 아니라 UI가 어색하던 문제 
 - [x] My Page '내 이슈 칸반' 블록 레이블이 영문으로 표시되던 문제 
 - [x] My Page 미니 칸반에서 이슈가 있는 상태 컬럼만 렌더링되어 드래그가 불가능하던 문제 
 - [x] 이동 API가 보드 존재를 강제해 My Page 드래그가 404로 실패하던 문제 
 - [x] 글로벌 쿼리(`project_id=nil`)를 소스로 사용할 때 프로젝트 칸반 보드에 타 프로젝트 이슈가 섞여 표시되던 문제 

 ## 테스트 체크리스트 

 - [x] [ ] 단위 테스트: 모델 + 프레젠터 2개 케이스 전부 PASS 
 - [x] [ ] 기능 테스트: 컨트롤러 2개 전부 PASS 
 - [x] [ ] 시스템 테스트: 드래그 시나리오 PASS (프로젝트 보드 + My Page 블록) 
 - [x] [ ] RuboCop: 경고 0 
 - [x] [ ] Stylelint: 경고 0 
 - [x] [ ] 수동: 라이트/다크 테마 각각 보드 렌더 확인 
 - [x] [ ] 수동: `view_kanban`만 있는 사용자 → 보드 조회 가능, 설정 접근 403 
 - [x] [ ] 수동: 권한 없는 사용자 카드 이동 → 403 복구 
 - [x] [ ] 수동: 워크플로 불허 상태 이동 → 422 복구 
 - [x] [ ] 수동: 비공개 프로젝트에서 비멤버 접근 → 차단 

 ## 해소된 열린 질문 (구현 중 검증 필요) 

 - [x] [ ] Stimulus 컨트롤러 importmap 로드 방식: Redmine 코어 `application.js`에서 `window.Stimulus`를 노출하므로 그대로 사용 가능 방식 실동작 검증 (Task 7). 문제 시 Vanilla JS로 대체. 
 - [x] [ ] HTML5 DnD Selenium 시뮬레이션: SortableJS 드래그가 합성 이벤트로 불안정하여, 테스트에서는 Stimulus 컨트롤러의 `onEnd`를 `execute_async_script`로 시뮬레이션 안정성 (Task 9). 불안정 시 `execute_script` API 직접 호출하는 방식 채택 호출로 대체. 
 - [x] [ ] `serialize` + JSON 코덱 Rails 8.0 호환성: 7.2/8.0 호환성 (Task 2 단위 테스트 통과로 확인 테스트에서 조기 확인). 

 ## 관련 링크 

 - 로컬 플러그인 리포: `/Users/joungsik/Workspace/joungsik/redmine_kanban` 
 - 현 redmine 프로젝트: `/Users/joungsik/Workspace/joungsik/redmine` 
 - 플러그인 리포 최근 커밋: `ed005f1` (`fix: 프로젝트별 칸반 보드가 타 프로젝트 이슈를 포함하는 문제 수정`) `22bc691` (`docs: v1.0 MVP 구현 계획서 승인`)

뒤로