Skip to content
created by Aha00aAha00a at 2026-06-01
last modified by Aha00aAha00a at 2026-06-02
revision: 8

Blame of InterpreterGantt Editor

older newer
DateTime Nickname Rev # Content Comment
2026-06-01T15:28:20 Aha00aAha00a 1 0 = [InterpreterGantt] Editor initial
2026-06-01T15:28:20 Aha00aAha00a 1 1 initial
2026-06-01T15:28:20 Aha00aAha00a 1 2 Gantt 블록 전용 인라인 에디터. initial
2026-06-01T21:11:55 Aha00aAha00a 5 3 `#!Gantt`를 별도로 감지해 Gantt 전용 인라인 에디터로 연다. update
2026-06-01T15:28:20 Aha00aAha00a 1 4 Gantt 형식은 depth(들여쓰기), 날짜/ref 단일 슬롯, 소요일 등 Table과 다른 구조를 가지므로 전용 에디터가 필요하다. initial
2026-06-01T15:28:20 Aha00aAha00a 1 5 initial
2026-06-01T15:28:20 Aha00aAha00a 1 6 == 데이터 모델 initial
2026-06-01T15:28:20 Aha00aAha00a 1 7 initial
2026-06-02T01:13:10 Aha00aAha00a 6 8 각 행은 5개 필드로 표현된다. 파싱 규칙은 [InterpreterGantt] 참조. update
2026-06-01T15:28:20 Aha00aAha00a 1 9 initial
2026-06-01T15:28:20 Aha00aAha00a 1 10 [[[#!Table tsv 1 1 initial
2026-06-01T15:28:20 Aha00aAha00a 1 11 필드 타입 설명 initial
2026-06-01T15:28:20 Aha00aAha00a 1 12 depth 정수 들여쓰기 깊이. 탭 개수와 동일. initial
2026-06-01T15:28:20 Aha00aAha00a 1 13 name 문자열 작업명. `#라벨` 접미어 포함 가능 (예: `설계#design`). initial
2026-06-01T15:28:20 Aha00aAha00a 1 14 startOrRef 문자열 (선택) `YYYY-MM-DD` 시작일 또는 선행 작업 레이블 (예: `design`, `#design`). 둘 중 하나만. initial
2026-06-01T15:28:20 Aha00aAha00a 1 15 est 정수 (선택) 소요 영업일수. 생략 시 defaultEst 적용. initial
2026-06-02T01:13:10 Aha00aAha00a 6 16 progress 정수 (선택) 진척률 0~100. 직렬화 시 `숫자%` 형식으로 출력. update
2026-06-01T15:28:20 Aha00aAha00a 1 17 ]]] initial
2026-06-01T15:28:20 Aha00aAha00a 1 18 initial
2026-06-01T15:28:20 Aha00aAha00a 1 19 == UI 구조 initial
2026-06-01T15:28:20 Aha00aAha00a 1 20 initial
2026-06-01T15:28:20 Aha00aAha00a 1 21 === 그리드 컬럼 initial
2026-06-01T15:28:20 Aha00aAha00a 1 22 initial
2026-06-01T15:38:06 Aha00aAha00a 2 23 현재 UI는 depth를 별도 숫자 컬럼으로 노출하지 않는다. update
2026-06-01T15:38:06 Aha00aAha00a 2 24 각 행의 depth는 row `data-depth` 값으로 보관하고, Task 입력칸의 왼쪽 padding으로 들여쓰기를 표시한다. update
2026-06-02T14:04:10 Aha00aAha00a 8 25 depth는 Indent/Outdent 버튼 또는 [[Kbd(Tab)]] / [[Kbd(Shift Tab)]] 단축키로 변경한다. update
2026-06-01T15:38:06 Aha00aAha00a 2 26 update
2026-06-01T15:28:20 Aha00aAha00a 1 27 [[[#!Table tsv 1 1 initial
2026-06-01T21:11:55 Aha00aAha00a 5 28 컬럼 고정폭 input type 비고 update
2026-06-02T04:10:03 Aha00aAha00a 7 29 # 32px (셀, 클릭 가능) 행 번호 (1부터 시작). 클릭/드래그 동작은 일반 셀과 동일. update
2026-06-01T21:11:55 Aha00aAha00a 5 30 Task 나머지 text `이름` 또는 `이름#라벨` 형식. depth에 따라 들여쓰기 표시. update
2026-06-01T21:11:55 Aha00aAha00a 5 31 Start / Ref 160px text 날짜(`2026-06-01`) 또는 레이블(`design`, `#design`). `#13` 입력 후 포커스아웃 시 13번 행의 이름으로 자동치환. 비워 두면 생략. update
2026-06-01T21:11:55 Aha00aAha00a 5 32 Est 60px number 양의 정수. 스핀 버튼 숨김. 비워 두면 생략. update
2026-06-02T01:13:10 Aha00aAha00a 6 33 % 60px number 진척률 0~100. 스핀 버튼 숨김. 비워 두면 생략. update
2026-06-01T15:28:20 Aha00aAha00a 1 34 ]]] initial
2026-06-01T15:28:20 Aha00aAha00a 1 35 initial
2026-06-01T21:11:55 Aha00aAha00a 5 36 테이블은 `table-layout: fixed`로 컬럼 너비가 고정되며, 홀수/짝수 행 배경색을 다르게 표시한다. update
2026-06-01T21:11:55 Aha00aAha00a 5 37 update
2026-06-02T14:04:10 Aha00aAha00a 8 38 == 툴바 / 키보드 인터랙션 update
2026-06-02T14:04:10 Aha00aAha00a 8 39 update
2026-06-02T14:04:10 Aha00aAha00a 8 40 툴바 버튼과 단축키는 같은 명령을 실행한다. update
2026-06-02T14:04:10 Aha00aAha00a 8 41 행 단위 명령의 대상 행은 커서 행이 선택 묶음 안에 있으면 선택된 행 전체이고, 아니면 현재 커서 행 하나다. update
2026-06-02T14:04:10 Aha00aAha00a 8 42 행 추가와 셀 값 변경(오늘 날짜, ref 치환)은 현재 커서/셀만 대상으로 한다. update
2026-06-02T14:04:10 Aha00aAha00a 8 43 update
2026-06-02T14:04:10 Aha00aAha00a 8 44 [[[#!Table tsv 1 1 update
2026-06-02T14:04:10 Aha00aAha00a 8 45 명령 툴바 버튼 키보드 위치/대상 동작 update
2026-06-02T14:04:10 Aha00aAha00a 8 46 행 추가 + (fa-plus) [[Kbd(Enter)]] 임의 셀 현재 행 아래에 새 행 삽입 (현재 depth 유지) update
2026-06-02T14:04:10 Aha00aAha00a 8 47 행 삭제 - (fa-minus) [[Kbd(Shift Delete)]] 대상 행 대상 행 삭제 (1행 이하일 때 무시) update
2026-06-02T14:04:10 Aha00aAha00a 8 48 위로 이동 ↑ (fa-arrow-up) [[Kbd(Alt ArrowUp)]] 대상 행 대상 행을 한 칸 위로 이동 update
2026-06-02T14:04:10 Aha00aAha00a 8 49 아래로 이동 ↓ (fa-arrow-down) [[Kbd(Alt ArrowDown)]] 대상 행 대상 행을 한 칸 아래로 이동 update
2026-06-02T14:04:10 Aha00aAha00a 8 50 들여쓰기 ▶ (fa-indent) [[Kbd(Tab)]] 대상 행 대상 행 depth +1 (위 행의 depth+1 초과 불가, 자식 행 포함) update
2026-06-02T14:04:10 Aha00aAha00a 8 51 내어쓰기 ◀ (fa-outdent) [[Kbd(Shift Tab)]] 대상 행 대상 행 depth -1 (0 이하 불가, 자식 행 포함) update
2026-06-02T14:04:10 Aha00aAha00a 8 52 오늘 날짜 입력 📅 (fa-calendar-day) — 현재 행 Start/Ref 셀 오늘 날짜(YYYY-MM-DD) 입력 update
2026-06-02T14:04:10 Aha00aAha00a 8 53 Undo ↶ (fa-undo) [[Kbd(Ctrl Z)]] 임의 셀 / GanttEditor 포커스 마지막 Gantt 편집 작업 되돌리기 update
2026-06-02T14:04:10 Aha00aAha00a 8 54 Redo ↷ (fa-redo) [[Kbd(Ctrl Y)]] / [[Kbd(Ctrl Shift Z)]] 임의 셀 / GanttEditor 포커스 되돌린 Gantt 편집 작업 다시 적용 update
2026-06-02T14:04:10 Aha00aAha00a 8 55 원문 전환 </> (fa-code) — GanttEditor GanttEditor를 닫고 원문 에디터로 전환 update
2026-06-02T14:04:10 Aha00aAha00a 8 56 상하 커서 이동 — [[Kbd(ArrowUp)]] / [[Kbd(ArrowDown)]] 임의 셀 상하 행 이동 + 이동한 행 단일 선택 update
2026-06-02T14:04:10 Aha00aAha00a 8 57 범위 선택 — [[Kbd(Shift ArrowUp)]] / [[Kbd(Shift ArrowDown)]] 임의 셀 마지막 선택 기준점부터 커서 행까지 범위 선택 update
2026-06-02T14:04:10 Aha00aAha00a 8 58 좌우 셀 이동 — [[Kbd(ArrowLeft)]] 셀 시작 / number 타입 좌측 셀로 이동 update
2026-06-02T14:04:10 Aha00aAha00a 8 59 좌우 셀 이동 — [[Kbd(ArrowRight)]] 셀 끝 / number 타입 우측 셀로 이동 update
2026-06-02T14:04:10 Aha00aAha00a 8 60 ]]] update
2026-06-02T14:04:10 Aha00aAha00a 8 61 update
2026-06-01T21:11:55 Aha00aAha00a 5 62 == 행 선택 및 드래그 update
2026-06-01T21:11:55 Aha00aAha00a 5 63 update
2026-06-02T04:10:03 Aha00aAha00a 7 64 행 번호(#) 열과 일반 셀 모두 같은 행 선택/드래그 모델을 사용한다. update
2026-06-02T04:10:03 Aha00aAha00a 7 65 마우스 클릭은 해당 셀에 포커스를 주고, 동시에 행 선택 상태를 갱신한다. update
2026-06-01T21:11:55 Aha00aAha00a 5 66 update
2026-06-01T21:11:55 Aha00aAha00a 5 67 === 행 선택 update
2026-06-01T21:11:55 Aha00aAha00a 5 68 update
2026-06-01T21:11:55 Aha00aAha00a 5 69 [[[#!Table tsv 1 1 update
2026-06-01T21:11:55 Aha00aAha00a 5 70 동작 결과 update
2026-06-02T04:10:03 Aha00aAha00a 7 71 선택되지 않은 행의 셀/행 번호 클릭 해당 행 단일 선택 update
2026-06-02T04:10:03 Aha00aAha00a 7 72 선택된 행의 셀/행 번호 클릭 기존 선택 유지, 클릭한 셀로 포커스 이동 update
2026-06-02T14:04:10 Aha00aAha00a 8 73 [[Kbd(Ctrl)]] + 클릭 개별 행 토글 선택 update
2026-06-02T14:04:10 Aha00aAha00a 8 74 [[Kbd(Shift)]] + 클릭 마지막 클릭 행~현재 행 범위 선택 update
2026-06-02T14:04:10 Aha00aAha00a 8 75 [[Kbd(ArrowUp)]] / [[Kbd(ArrowDown)]] 커서 이동 후 해당 행 단일 선택 update
2026-06-02T14:04:10 Aha00aAha00a 8 76 [[Kbd(Shift ArrowUp)]] / [[Kbd(Shift ArrowDown)]] 마지막 선택 기준점부터 커서 행까지 범위 선택 update
2026-06-01T21:11:55 Aha00aAha00a 5 77 ]]] update
2026-06-01T21:11:55 Aha00aAha00a 5 78 update
2026-06-01T21:11:55 Aha00aAha00a 5 79 선택된 행은 배경색(`--color-flash-info-bg`)으로 강조 표시된다. update
2026-06-01T21:11:55 Aha00aAha00a 5 80 update
2026-06-01T21:11:55 Aha00aAha00a 5 81 === 드래그 동작 update
2026-06-01T21:11:55 Aha00aAha00a 5 82 update
2026-06-01T21:11:55 Aha00aAha00a 5 83 [[[#!Table tsv 1 1 update
2026-06-01T21:11:55 Aha00aAha00a 5 84 조건 드래그 결과 update
2026-06-02T04:10:03 Aha00aAha00a 7 85 선택되지 않은 행의 셀/행 번호에서 드래그 시작 행~현재 행 범위 선택 update
2026-06-02T04:10:03 Aha00aAha00a 7 86 선택된 행의 셀/행 번호에서 드래그 선택된 행들을 드롭 위치 아래로 이동 (border 인디케이터 표시) update
2026-06-02T04:10:03 Aha00aAha00a 7 87 선택 묶음 내부로 드래그 순서 변경 없음 update
2026-06-01T21:11:55 Aha00aAha00a 5 88 ]]] update
2026-06-01T21:11:55 Aha00aAha00a 5 89 update
2026-06-02T04:10:03 Aha00aAha00a 7 90 드래그 이동 후에는 드래그를 시작한 행의 상대 위치로 커서와 포커스를 복원한다. update
2026-06-02T14:04:10 Aha00aAha00a 8 91 따라서 이동 직후에도 [[Kbd(ArrowUp)]] / [[Kbd(ArrowDown)]], [[Kbd(Alt ArrowUp)]] / [[Kbd(Alt ArrowDown)]], [[Kbd(Ctrl Z)]] / [[Kbd(Ctrl Y)]] 키 조작을 이어서 사용할 수 있다. update
2026-06-02T04:10:03 Aha00aAha00a 7 92 update
2026-06-02T04:10:03 Aha00aAha00a 7 93 == Undo / Redo update
2026-06-02T04:10:03 Aha00aAha00a 7 94 update
2026-06-02T04:10:03 Aha00aAha00a 7 95 GanttEditor는 원문 CodeMirror history와 별도로 Gantt 전용 Undo/Redo 스택을 가진다. update
2026-06-02T04:10:03 Aha00aAha00a 7 96 다음 작업은 Undo/Redo 대상이다. update
2026-06-02T04:10:03 Aha00aAha00a 7 97 update
2026-06-02T04:10:03 Aha00aAha00a 7 98 * 셀 값 변경 update
2026-06-02T04:10:03 Aha00aAha00a 7 99 * `#13` 같은 row ref 자동 치환 update
2026-06-02T04:10:03 Aha00aAha00a 7 100 * 오늘 날짜 입력 update
2026-06-02T04:10:03 Aha00aAha00a 7 101 * 행 추가/삭제 update
2026-06-02T14:04:10 Aha00aAha00a 8 102 * 행 순서 이동(버튼, [[Kbd(Alt ArrowUp)]] / [[Kbd(Alt ArrowDown)]], 드래그) update
2026-06-02T04:10:03 Aha00aAha00a 7 103 * Indent/Outdent update
2026-06-02T04:10:03 Aha00aAha00a 7 104 update
2026-06-02T04:10:03 Aha00aAha00a 7 105 셀 입력은 연속 입력을 너무 잘게 쪼개지 않도록 짧은 디바운스 단위와 blur 시점에 묶어서 기록한다. update
2026-06-02T04:10:03 Aha00aAha00a 7 106 행 선택만 바뀌는 동작은 문서 내용 변경이 아니므로 Undo history에 넣지 않는다. update
2026-06-02T04:10:03 Aha00aAha00a 7 107 update
2026-06-01T15:28:20 Aha00aAha00a 1 108 == 직렬화 규칙 initial
2026-06-01T15:28:20 Aha00aAha00a 1 109 initial
2026-06-01T15:28:20 Aha00aAha00a 1 110 그리드 행 → Gantt TSV 라인: initial
2026-06-01T15:28:20 Aha00aAha00a 1 111 initial
2026-06-01T15:28:20 Aha00aAha00a 1 112 1. `depth` 개수만큼 탭(`\t`)을 앞에 붙인다. initial
2026-06-01T15:28:20 Aha00aAha00a 1 113 2. `작업명#라벨` 값을 쓴다. initial
2026-06-01T15:28:20 Aha00aAha00a 1 114 3. `시작일/ref`가 비어 있지 않으면 `\t값`을 추가한다. initial
2026-06-01T15:28:20 Aha00aAha00a 1 115 4. `소요일`이 비어 있지 않으면 `\t값`을 추가한다. initial
2026-06-02T01:13:10 Aha00aAha00a 6 116 5. `진척률`이 비어 있지 않으면 `\t값%`를 추가한다. update
2026-06-01T15:28:20 Aha00aAha00a 1 117 initial
2026-06-01T15:28:20 Aha00aAha00a 1 118 `시작일/ref`가 없고 `소요일`만 있는 경우에도 `\t소요일`만 붙인다. initial
2026-06-01T15:28:20 Aha00aAha00a 1 119 빈 중간 탭은 파싱 시 무시되므로 직렬화 시 중간에 빈 슬롯을 끼워 넣을 필요 없다. initial
2026-06-01T15:28:20 Aha00aAha00a 1 120 initial
2026-06-02T14:04:10 Aha00aAha00a 8 121 == 인덴트 제약 update
2026-06-01T15:28:20 Aha00aAha00a 1 122 initial
2026-06-01T21:11:55 Aha00aAha00a 5 123 * 인덴트 시 위 행의 `depth + 1`을 초과할 수 없다. (위 행이 없으면 depth 0 고정) update
2026-06-02T14:04:10 Aha00aAha00a 8 124 * 인덴트/아웃덴트 시 대상 행보다 depth가 큰 연속된 자식 행들도 함께 이동한다. update
2026-06-01T15:28:20 Aha00aAha00a 1 125 initial
2026-06-01T21:11:55 Aha00aAha00a 5 126 == 시각적 강조 update
2026-06-01T21:11:55 Aha00aAha00a 5 127 update
2026-06-01T21:11:55 Aha00aAha00a 5 128 [[[#!Table tsv 1 1 update
2026-06-01T21:11:55 Aha00aAha00a 5 129 상태 강조 방법 update
2026-06-01T21:11:55 Aha00aAha00a 5 130 현재 커서 행 행 전체 배경 `--color-link-hover-bg` update
2026-06-01T21:11:55 Aha00aAha00a 5 131 현재 활성 셀 outline `2px solid --color-focus-ring` update
2026-06-01T21:11:55 Aha00aAha00a 5 132 선택된 행(복수) 행 전체 배경 `--color-flash-info-bg`, 행 번호 셀 `--color-focus-ring` 배경 update
2026-06-01T21:11:55 Aha00aAha00a 5 133 드래그 드롭 위치 대상 행 하단에 `2px solid --color-focus-ring` 선 update
2026-06-02T04:10:03 Aha00aAha00a 7 134 셀 hover/일반 셀 cursor `cell` update
2026-06-02T04:10:03 Aha00aAha00a 7 135 행 번호/선택된 행 cursor `grab` update
2026-06-02T04:10:03 Aha00aAha00a 7 136 선택된 행 이동 드래그 중 cursor `grabbing` update
2026-06-01T21:11:55 Aha00aAha00a 5 137 ]]] update
2026-06-01T21:11:55 Aha00aAha00a 5 138 update
2026-06-01T21:11:55 Aha00aAha00a 5 139 == 기타 동작 update
2026-06-01T21:11:55 Aha00aAha00a 5 140 update
2026-06-01T21:11:55 Aha00aAha00a 5 141 * Gantt 에디터 진입 시 Wiki Formatting Help(`details.editHelp`)를 자동으로 숨기고, 에디터 종료 시 복원한다. update
2026-06-01T21:11:55 Aha00aAha00a 5 142 * 에디터 진입 시 첫 행 첫 열(Task)에 자동 포커스한다. update
2026-06-01T21:11:55 Aha00aAha00a 5 143 * input 변경 시 120ms 디바운스로 `applyGanttBlockEditor()`를 호출해 원문 textarea/CodeMirror에 즉시 반영한다. update
2026-06-02T14:04:10 Aha00aAha00a 8 144 * Gantt 에디터가 열려 있고 일반 input/textarea에 포커스가 없을 때도 document 레벨에서 [[Kbd(Ctrl Z)]] / [[Kbd(Ctrl Y)]] / [[Kbd(Ctrl Shift Z)]] 단축키를 보조 처리한다. update
2026-06-01T21:11:55 Aha00aAha00a 5 145 update
2026-06-01T21:11:55 Aha00aAha00a 5 146 == 감지 로직 update
2026-06-01T21:11:55 Aha00aAha00a 5 147 update
2026-06-01T15:28:20 Aha00aAha00a 1 148 * `detectTableBlock()`: `#!table`만 감지 → TableEditor 열기 initial
2026-06-01T15:28:20 Aha00aAha00a 1 149 * `detectGanttBlock()`: `#!gantt`만 감지 → GanttEditor 열기 initial
2026-06-01T15:38:06 Aha00aAha00a 2 150 * `detectGanttBlock()`은 `[[[#!gantt ...]]]`, `[[[` + `#!gantt`, plain `#!gantt` 문서를 모두 처리 update
2026-06-01T15:38:06 Aha00aAha00a 2 151 * plain `#!gantt` 문서는 다음 섹션 헤더(`=`, `==` 등)를 데이터 끝으로 본다 update
2026-06-01T21:11:55 Aha00aAha00a 5 152 * 초기 로드 시 `#!gantt` 감지되면 GanttEditor 자동 열기 (TableEditor보다 우선) update
2026-06-01T15:28:20 Aha00aAha00a 1 153 * `.toggleTableEditor` 버튼 클릭 시 블록 종류에 따라 분기 initial
2026-06-01T15:28:20 Aha00aAha00a 1 154 initial
2026-06-01T15:38:06 Aha00aAha00a 2 155 == 미리보기 동기화 update
2026-06-01T15:38:06 Aha00aAha00a 2 156 update
2026-06-01T15:38:06 Aha00aAha00a 2 157 GanttEditor에서 input이 변경되면 120ms 디바운스로 `applyGanttBlockEditor()`를 실행한다. update
2026-06-01T15:38:06 Aha00aAha00a 2 158 이 함수는 그리드 상태를 Gantt TSV로 직렬화해 원문 textarea/CodeMirror에 반영하고, 기존 preview debounce가 미리보기를 다시 렌더링한다. update
2026-06-01T15:38:06 Aha00aAha00a 2 159 Gantt 미리보기 렌더링 후에는 `window.AhaWiki.Gantt.initAll()`을 호출해 SVG 차트를 초기화한다. update
2026-06-01T15:38:06 Aha00aAha00a 2 160 update
2026-06-01T15:28:20 Aha00aAha00a 1 161 == 구현 파일 initial
2026-06-01T15:28:20 Aha00aAha00a 1 162 initial
2026-06-02T04:10:03 Aha00aAha00a 7 163 * `public/js/Wiki/edit.page.js` — GanttEditor 로직 전체 (`detectGanttBlock`, 직렬화, 키보드, 드래그, 행 선택, Undo/Redo, 자동 동기화) update
2026-06-02T04:10:03 Aha00aAha00a 7 164 * `app/views/Wiki/edit.scala.html` — `#ganttInlineEditor` / `#ganttEditorBar` UI 마크업, Undo/Redo 버튼 update
2026-06-02T04:10:03 Aha00aAha00a 7 165 * `app/assets/edit.less` — `.ganttEditorGrid`, `.ganttRowNum`, `.ganttRowCurrent`, `.ganttRowSelected`, `.ganttRowDragOver`, 드래그 커서 스타일 update
2026-06-02T04:10:03 Aha00aAha00a 7 166 * `app/assets/edit.css` — 컴파일된 CSS update