HBHR100_시트 워크스페이스 (공통 Shell)
⚠ 8월 UX 재편 대규모 반영 — 전면 재작성 별도 예정
(Hereby) HR 급여 관리 > 시트 워크스페이스 (공통 Shell)
| 프로토타입 | TBU |
| Status | review |
| Owner | 카나 (PM) |
개요
월 단위 스프레드시트 워크스페이스의 **공통 레이아웃(Shell)**을 정의한다. 글로벌 헤더 · 워크스페이스 헤더(월 네비게이션 · 이번 달 · 이전 월 가져오기 · 단축키 · 폴더 관리 · 새 시트 만들기) · 좌측 사이드바 · 시트 헤더 · 스프레드시트 툴바 · 서식 도구 모음 · 데이터 그리드 · 하단 합계행이 모든 시트 유형에 공통으로 얹힌다. 진입 시 인증 검사를 수행하며, 미인증 시 /hr-system/signin으로 리다이렉트한다. 시트는 「설정 중 → 사용 중 → 작업 완료」의 수명주기를 가지며, 각 단계에 따라 상태 배지(시트 헤더 h3 위치)·구조 편집 잠금·반영 버튼 노출이 달라진다. 본 문서는 Shell 골격과 진입 동선을 정의하고, 각 구역 상세는 하위 문서에 위임한다.
문서 히스토리
| 날짜 | 작성자 | 팀 | 변경 내용 |
|---|---|---|---|
| 2026-07-06 | 카나 | PM | 최초 작성 |
| 2026-07-10 | 카나 | PM | 라이브 기능 검토 반영 |
| 2026-07-13 | 카나 | PM | 버튼 행동 명세 보강 |
| 2026-07-21 | 카나 | PM | GC700 깊이 재작성 |
| 2026-07-21 | 카나 | PM | 가독성 패스 + 액션 표기 (GUIDE §7·§8) |
| 2026-07-21 | 카나 | PM | 셀 스타일 확정판 적용 (콸 승인) |
| 2026-07-24 | 카나 | PM | 코드 변경 반영(7635459) |
| 2026-07-28 | 카나 | PM | 코드 변경 반영(aed8800) |
| 2026-07-29 | 카나 | PM | 역방향 동기화 — 개발팀 직접 수정 반영(3637e20, 백틱 이스케이프) |
| 2026-08-11 | 카나 | PM | 시트 수명주기·수식 범위 바·조건부 서식·IFERROR·드로어 재편 반영(#528·#533·#540 머지) |
| 2026-08-12 | 카나 | PM | 수식 순환 방지·채우기 핸들 통일 반영(471f3db·8d38bed) |
| 2026-08-13 | 카나 | PM | 불리언 리터럴·표시 형식, 엑셀식 =/<> 연산자 반영(90bc68f·b862772) |
| 2026-08-17 | 카나 | PM | 라이브 실사 검증 반영(dev v0.1.0+) |
| 2026-08-21 | 카나 | PM | columnLayout 중복 컬럼 키 서버 검증 반영(91782a7) — 조용한 헤더 붕괴 재발 방지 |
| 2026-09-17 | 카나 | PM | 「급여대장」 빈 폴더 상시 노출·삭제 되살아남 문제 해소 반영(#754, d123698, CS-OKBEST-260917-0002) |
| 2026-09-18 | 카나 | PM | 읽기 전용 셀 사유 안내 토스트+바로가기(f9ccac1, #790)·상시 시트 안내 배너 닫기(2433f1f, #788) 반영 — 커밋 근거, 라이브 실사 이월(TBU). ⚠️ 상시(에버그린) 시트 상위 기능(#713) 사양서 미반영 갭 확인 → 후속 이월 |
| 2026-09-23 | 카나 | PM | 시트 AI 변경 세트(제안→미리보기→적용→되돌리기, 2204a6b #821)·변경 세트 카드 버튼 활성 수정(c51d76d #824)·열 레이아웃 변경 제안(cdc6685 #822)·급여 정산 도구 5종·단계 그라운딩(b590afa #827)·업로드 임포트 매핑 단계+검증 리포트+임포트 변경 세트(eea3dac #832)·임포트 되돌리기 휴지통·수식 열 인식 수정(1193e00 #836)·admin 임베드 시트 어시스턴트 FAB 노출·도크 비키기(9d73c12 #853, CS-OKBEST-260922-0002) 반영 — 커밋 근거, 라이브 실사 이월(TBU) |
| 2026-09-23 | 카나 | PM | 열 설정 「종류」 라디오 비어 보임·수식바 캐럿 어긋남 수정(6457e48 #867, CS-OKBEST-260923-0002·0003)·식별 열 항목별 도움말(1e0dffe)·행 컨텍스트 메뉴 다중 선택 대상 규칙(4d75d89 #868, MED-705)·AI 레이아웃 변경 세트의 수식 열 종류 유지(73f8bfc #872, CS-OKBEST-260923-0005)·식별 근로계약 값 시트 년월 기준 전환(b2a0dc0 #873, MED-703) 반영 — 커밋 근거, 라이브 실사 이월(TBU) |
| 2026-09-25 | 카나 | PM | 낮 스윕 라이브 실사 — 행 메뉴 다중 선택(ㄴ70-R: "3개 행 선택됨…" 안내·「선택한 N개 행 보호/삭제」 라벨)·열 설정 「종류」 라디오 3종 정상 렌더(값 직접 입력/ƒ 수식 계산식/식별 직원 정보 + 고급 종류 — CS-0002 수정 검증)·헤더 우클릭 메뉴 항목 채록(열 설정/반영 소스 보기/새 열 추가/열 삭제/정렬/수식 편집/일괄 변경/이름 바꾸기/조건부 서식/헤더 색/이 열까지 고정/열 숨기기)·「전체화면」 버튼(ㄴ23-A) 실측. 읽기 전용 토스트(ㄴ5D)는 합성 이벤트로 미발화 — TBU 유지 |
| 2026-09-21 | 카나 | PM | 시트 어시스턴트 마운트(조직별 모듈 opt-in·읽기 전용 도구 8종·선택 영역은 키만 전달 — 1cfa01e #810, 4829289 #812, 18f766b #815)·전체화면 토글(Ctrl+Shift+F, iframe→부모 메시지 — b41697d #808, 046033b #813)·새 시트 템플릿 지연 로딩(1a27d31 #803, UI 불변) 반영 — 커밋 근거, 라이브 실사 이월(TBU) |
| 2026-10-01 | 카나 | PM | 구글 시트식 시트 UX(메뉴 「편집」→「수정」·저장 상태 표시·서식 도구 모음 확장·메뉴 검색·셀 값 변경 이력·단축키 개편·레일 폭 조절 — ccea0b9e #831)·적용 필터 띠/숨긴 행 띠(8aecd9c5 #881)·팀 범위 배지·히스토리 권한 게이트·진입 권한 모달 제거(89fe2a6f #916, cba75f41 #936, cc7bb723 #930)·첫 한글 음절 입력(23000c37 #940, 4dbca86d #952)·권한 없는 시트 참조 셀 「권한 없음」(3a6093fd #954)·변경 세트 적용/되돌리기 칸 이력 기록(a39bce86 #955)·PERIODSTART/PERIODEND/DATEDIF·문자열 리터럴·조직 시간대 TODAY()(d5aa87d9 #956)·히스토리 값 변경 불러오기 실패 안내(fe029463 #968) 반영 — 커밋 근거, 라이브 실사 이월(TBU) |
| 2026-10-01 | 카나 | PM | 수식 ROUND 반올림 방식 엑셀 일치(half away from zero — 33ab86f9, #901)·업로드 매핑 미매칭 「직접 연결」 피커·전 탭 검증(f2a6921f, #887) 반영 — 커밋 근거, 라이브 실사 이월(TBU) |
| 2026-10-02 | 카나 | PM | 설정 중 시트 「직원 추가」 버튼 노출(ㄴ64C·64)(7170d1a6, #978) · 직원 선택 즉시 표시·기간 열 자유 입력(ㄴ70-C1·C2)(2c578aa5, #1010) · 행/셀 메뉴 「예약 변경…」「계약 시행일 변경…」(ㄴ70-RS)(14c13f52, #974 · a0298fde, #962) · 시트 어시스턴트 예약 변경 제안·승인(ㄴ70-AI-F)(85812e19, #983)·붙여넣기 첨부 칩·끊긴 턴 복구(ㄴ70-AI-G)(70d9a7df, #1005) · 수식바 「북마크한 열」·시트 전환 넘김 포인터(ㄴ60-B·ㄴ71)(8284d800, #982 · 99a24b42, #979) — 커밋 근거, 라이브 실사 이월(TBU) |
| 2026-10-03 | 카나 | PM | 히스토리 「변경 세트」 확인 대기 [적용]/[취소]·출처 「예약 변경」·예약 목록 「승인」 확대(ㄴ64E·ㄴ64H·ㄴㄴ70-RS1)(30fe6180, #1021) · 변경 세트 적용·되돌리기 즉시 다시 그림·토스트 1회(ㄴ64H)(f3647829, #1025) · 연도 없는 날짜·날짜 열 대시 → 빈 칸(ㄴ70-C3)(a61b5dd7, #1028) · 함수 QUOTIENT·WEEKDAY·ISHOLIDAY(ㄴ75E)(845fa997, #1029 · 622b6663, #1031) — 커밋 근거, 라이브 실사 이월(TBU) |
| 2026-10-07 | 카나 | PM | 시트 검색 이력 드롭다운(ㄴ52, e3bdf36b #1063, MED-919·918) · 팝오버 편집기 클릭 유지(ㄴ70-C1, 5cd3483 #1039, MED-886) · AI 레이아웃 제안 선택지 동반·형식 diff(ㄴ70-AI-C, 23dd8e3 #1038, MED-885) · 필터 축소 시 스크롤 보정(ㄴ70-F1 신설, c4fd9a2d #1066, MED-936) · 행 페이징 결정적·중복 제거(ㄴ70-P 신설, 94f83b0e #1044, MED-899) 반영 — 커밋 근거, 라이브 실사 이월(TBU). ⚠️ 시트 접근 권한 공유 선택기(entityPicker, #1063)는 공유 모달 사양 미채록 — 후속 이월 |
| 2026-10-08 | 카나 | PM | (10/7 머지분) 시트 위치 안내(ㄴ70-AI-H 신설 — 기능 바로가기 4종·열 위치 보기·관리자 임베드에서도 시트 어시스턴트가 안내·저장된 열 ID 재확인·고정 열 폭 반영, #1043) · 시트 초기화 시 안내 콜백 자동 실행 오류 수정(ㄴ70-AI-H 비고, 9b5c1908 #1082) · 셀 예약 창 「이 칸」/「다른 진행 중 예약」 분리·「모든 예약 보기」 시트·직원 범위 이동·같은 칸·같은 달 중복 차단(ㄴ70-RS, bee96793·3d441c2e #1084, MED-827) 반영 — 커밋·코드 근거, 라이브 실사 이월(TBU). 공유 대상 선택기 검색창 입력이 목록을 거르지 않던 결함 수정(c84bc2d0 #1109, MED-918 — 급여대장 「접근 권한」·드라이브 「권한 관리」)은 entityPicker 행 미채록이라 행 반영 없이 이월 유지 |
| 2026-10-10 | 카나 | PM | (10/9 머지분) PR #1128(MED-976) 반영: 시트 공개 범위 사고 방지 — 이전 월 가져오기 문구·대상 기준 교체(ㄴ22)·이월 공개 형태 라벨·「모두 비공개로 가져오기」(ㄴ22a 신설)·접근 권한 모달 「지정한 팀·개인만 (권장)」 우선+전체 공개 경고(ㄴ22b 신설)·컨텍스트 메뉴 「전체 공개로 전환」 라벨 — 라이브 실증 완료(10/10, 가져오기·접근 권한 모달 원문 채록) |
Data I/O
Server → Client
| 변수 | DB 엔티티.컬럼 | 값 없을 때 | 비고 |
|---|---|---|---|
| $ | 조회 월 (YYYY-MM) | 당월 기본 | 상단 Month·Year 스피너와 연동 |
| $ | PayrollSheet.folder (추정) | "(미분류)" fallback | 좌측 폴더 트리 ([[HBHR108_폴더·휴지통 사이드바]] 참조) |
| $ | PayrollSheet[] (추정) | Empty 상태 (70-E) | 폴더별 카운트 표시 |
| $ | PayrollRecord[] (추정) | 빈 그리드 | "293/293건" 형태 카운트 |
| $ | PayrollSheet.updatedAt (추정) | hide | 헤더 "· 4시간 전" 형태 |
Client → Server
| 액션 | 전달 값 | tRPC / SDK | 권한 토큰 |
|---|---|---|---|
| 인증 세션 검증 | — | sdk.auth.session() (추정) | HR_ADMIN / SUPER_ADMIN |
| 기간 변경(시트 리스트 재로드) | period | sdk.payrollSheet.list() (추정) | payroll:read (추정) |
| 시트 검색 | query (사번/성명/사유/항목) | 클라이언트 필터 (추정) | — |
| 새 시트 생성 | name, folder, isPublic, template | sdk.payrollSheet.create() (추정) | payroll:write (추정) |
| 셀 편집 | rowId, columnId, value | sdk.payrollSheet.updateCell() (추정) | payroll:write (추정) |
| 폴더 관리 모달 열기 | — | 클라이언트 (추정) | payroll:write (추정) |
| 시트 작업 완료 토글 | sheetId, isLocked | sdk.payrollSheet.toggleComplete() (추정) | payroll:write (추정) |
| 시트 설정 완료(수명주기 확정) | sheetId | sdk.sheetView.finishSetup() (추정) | canManageSetup (추정) |
| 시트 재설정 | sheetId | sdk.sheetView.reopenSetup() (추정) | canManageSetup (추정) |
| 변경 세트 제안·조회 | sheetId, 변경 조건(필터·매핑) | sheetChangeSet.create / get / list | payroll:write (추정) |
| 변경 세트 적용·취소·되돌리기 | changeSetId, confirmed | sheetChangeSet.approve / execute / reject / revert (apply는 tRPC 예약어라 execute) | payroll:write (추정) |
화면 플로우
공통 Shell 사양표
| 번호 | 항목/기능명 | 타입 | 사양 및 기능 설명 | 연관/영향 범위 | 비고 |
|---|---|---|---|---|---|
| 00 | 화면 진입 조건 | - | • 조건1 [HR_ADMIN] / 조건2 [SUPER_ADMIN] 인증 시에만 워크스페이스를 노출하는 인증 게이트 • 진입 시: 인증 세션 확인 - CASE01 [미인증]: /hr-system/signin 리다이렉트 - CASE02 [인증 세션]: 워크스페이스 진입 허용 | 인증 세션 | 인증 게이트 |
| 01 | 초기 상태 | - | • 진입 직후 최근 작업 시트로 자동 이동시키는 기능 • 진입 시: /hr-system/sheets/{sheetId}로 자동 리다이렉트 - CASE01 [최근 시트 없음]: 동선 미확정 | 기간 네비게이터(20) | TBU: 최근 시트 없을 때 진입 동선 |
| 02 | 다이얼로그 (DS 교체) | - | • 워크스페이스의 네이티브 alert/confirm/prompt를 전부 DS 다이얼로그로 교체. confirm→askConfirm(Promise<boolean>), alert→showAlert, 오류는 showError(제목 "오류" + danger 톤)로 감싸고, 컴포넌트 밖 모듈은 dialog-bridge로 같은 모달에 닿는다. 단순 안내·검증 메시지(셀/행 선택 요청, 시간 형식 오류 등)는 모달 대신 토스트로 내려 흐름을 끊지 않는다- CASE01 [원본 기록 변경 확인]: 배치 전체가 in-flight Promise를 공유해 한 번만 물음 | 워크스페이스 전역 다이얼로그 | 신규 (코드 반영: be83131) · 네이티브 팝업 폐지 |
| 10 | 글로벌 헤더 | - | • 좌측 로고 "hereby HR 급여 관리", 우측 계정 / 알림 / 로그아웃을 담는 전 화면 고정 헤더 | — | 전 화면 고정 |
| ㄴ11 | 계정 | Button | • 로그인 계정을 표시하는 헤더 버튼 • 클릭 → TBU | — | TBU: 표시 값·클릭 동작 |
| ㄴ12 | 알림 | Button | • "알림"을 표시하는 헤더 버튼 • 클릭 → TBU | — | TBU: 상세 동작·에러 처리 |
| ㄴ13 | 로그아웃 | Button | • 현재 세션을 종료하는 헤더 버튼 • 클릭 시: 세션 종료 후 /hr-system/signin (추정) | 00 진입 조건 | |
| 20 | 워크스페이스 헤더 | - | • 월 네비게이션 + "이번 달" + "이전 월 가져오기" + "단축키" + "폴더 관리"(7/21 신규) + "새 시트 만들기" 액션을 담는 상단 헤더 바 | period 변경 시 시트 리스트 재로드 | 월 단위 |
| ㄴ21 | 월 네비게이션 | - | • "이전 달" / "2026년 7월"(현재 월 표기) / "다음 달" 이동 + "이번 달" 빠른 이동으로 조회 월을 바꾸는 기능 • 이동 시: period 변경 → 시트 리스트 재로드 - CASE01 [period 없음]: 당월 기본 | period 변경 시 시트 리스트 재로드 | |
| ㄴ22 | 이전 월 가져오기 | Button | • 이전 월의 시트를 현재 월로 복제하는 "이전 월에서 가져오기" 모달을 여는 기능 • 클릭 시: 모달 오픈 → 이전 월의 내가 볼 수 있고 현재 월에 없는 시트 복제(기본 시트는 자동 생성으로 제외) - (10/9 머지, #1128, MED-976) 모달 원문 교체: "이전 월의 시트 중 내가 볼 수 있고 현재 월에 없는 시트를 복제합니다. 기본 시트는 자동으로 생성되므로 제외됩니다." (10/10 라이브 실증) — 남의 비공개 시트는 대상에 안 나옴 | [[HBHR108_폴더·휴지통 사이드바]] 이전 월에서 가져오기 모달 | 신규 · 문구 교체(#1128) · TBU: 에러·실패 동작 |
| ㄴ22a | 이월 공개 형태 안내·「모두 비공개로 가져오기」 (MED-976) | Modal | • (10/9 머지, #1128) 가져오기 모달 대상 목록의 시트마다 공개 형태 라벨(「전체 공개」(적색)·「부분 공개 {n}」(청색)·「비공개」(회색) — 「모두 비공개로」 체크 시 전부 「비공개」) • 안내 notice(전체 공개 포함 시 경고 톤): "지난달 공개 형태가 그대로 이어져요 — 전체 공개 {n}개. 부분 공개 시트는 공유 대상(팀·개인)과 만든 사람이 그대로예요. 전체 공개 시트는 급여 관리자 전원과 모든 팀장(자기 팀·하위 팀 직원의 행)이 봐요." (10/10 라이브 실증 원문) • 체크박스 「모두 비공개로 가져오기」 + "공유 대상 없이 나만 볼 수 있게 만들어요. 이번 달 내용을 확인한 뒤 공개할 때 써요." (라이브 원문) — 켜면 사본 전부 비공개(공유 대상 제거), 확인 후 「접근 권한」에서 공개 • 가져온 뒤 「공개 형태 안내」 창에서 어떤 형태로 들어왔는지 재안내(가이드 근거) | carry-forward.ts · carryForwardPrivate | 신설 (#1128) · 라이브 실증 2026-10-10(전체 공개 1개 케이스) |
| ㄴ22b | 시트 공개 범위 — 접근 권한 모달 개편 (MED-976) | Modal | • (10/9 머지, #1128) 「접근 권한」 모달 공개 범위 select 개편: 옵션 순서·라벨 교체 — 「지정한 팀·개인만 (권장) — 만든 사람 + 아래 목록」(private, 첫 옵션) / 「조직 전체 — 급여 관리자 전원 + 모든 팀장(자기 팀 행)」(shared) - CASE01 [비공개]: info notice "부분 공개를 권장해요 — 함께 볼 팀·개인만 아래에 추가하세요. 전체 공개는 꼭 필요할 때만 써 주세요." (10/10 라이브 실증) - CASE02 [전체 공개]: 경고 notice "전체 공개 중이에요 — 급여 관리자 전원과 모든 팀장(자기 팀·하위 팀 직원의 행)이 이 시트의 급여·개인정보를 볼 수 있어요. 필요한 사람만 보게 하려면 「지정한 팀·개인만」으로 바꾸고 아래에서 공유 대상을 골라 주세요(권장)." (패치 원문) - 전체 공개로 전환하는 액션은 경고를 거침(setSheetAccessVisibility — 「그래도 전체 공개」 확인, 가이드 근거) • 사이드바 컨텍스트 메뉴 라벨 「공개로 전환」 → 「전체 공개로 전환」(패치 근거) | sheet-access.html · access.ts | 신설 (#1128) · 모달 라이브 실증 2026-10-10(비공개 시트) · 전환 경고 플로우는 저장 금지상 실사 미실행 |
| ㄴ23 | 단축키 | Button | • 4카테고리(탐색/선택/편집/메뉴·찾기) 단축키 도움말 모달을 여는 기능. 단축키 ⌘/(윈도우 Ctrl+/)로도 열고 닫음(예전 ? 키 폐지), 과거 보기 메뉴의 "단축키"가 헤더 버튼으로 이동 • 클릭 시: 단축키 도움말 모달 노출. 전체 카탈로그는 [[HBHR103_편집 메뉴·단축키]] 소유 — 아래 [단축키 카탈로그 포인터] 참조 | [[HBHR103_편집 메뉴·단축키]] 참조 | 보기 메뉴에서 이동 · 토글 키 ?→⌘/ (#831) |
| ㄴ23-A | 전체화면 | Button | • 시트 화면에서 LNB·페이지 헤더를 걷어내고 본문만 채우는 「전체화면」. 관리자 패널 페이지 헤더 액션 자리에서 진입 • 단축키 Ctrl/⌘+Shift+F 토글 — 시트는 iframe이므로 메시지로 부모(admin)에 전달• 복귀: ESC · 상단 중앙 「전체화면 종료」 · 다른 탭 이동 - CASE01 [시트 안에 열린 모달 있음]: ESC가 모달을 먼저 닫고 전체화면 유지 • 단축키 도움말(ㄴ23)에 새 조합 표기 | [[HBAD100_App Shell·사이드바]] | 신설 (코드 반영: b41697d #808 · 046033b #813) · 라이브 실사(2026-09-25): 시트 화면 페이지 헤더 「전체화면」 버튼 실측(토글 동작 미실행) |
| ㄴ24 | 폴더 관리 | Button | • 각 폴더를 "{n}개 시트"로 나열하고 하단 "+ 새 폴더"를 제공하는 "폴더 관리" 모달을 여는 기능. 상세 사양은 [[HBHR108_폴더·휴지통 사이드바]]에 위임 • 클릭 시: 폴더 관리 모달 오픈 - 모달 원문 폴더 목록: "eCount 연동 2개 시트" / "급여대장 3개 시트" / "문서·서명 1개 시트" / "병동 6개 시트" / "시트 에러 발생 케이스 1개 시트" / "연장근무 1개 시트" / "인센티브 2개 시트" / "출퇴근 3개 시트" / "치료실 인센티브 1개 시트" / "휴직·퇴사 2개 시트" + "+ 새 폴더" | [[HBHR108_폴더·휴지통 사이드바]] 폴더 관리 모달 | 7/21 신규 · "그룹"→"폴더" 용어 확정 · TBU: 에러·실패 동작 |
| ㄴ25 | 새 시트 만들기 | Button | • 새 시트 생성 모달을 여는 기능. 새 시트 기본 생성 = 1000행 × 26열(A~Z, col_1~col_26) • 클릭 시: "새 시트 만들기" 모달 오픈 | [[HBHR101_새 시트 만들기 모달]] 참조 | 기본 1000행×26열 |
| ㄴ25-U | 업로드 임포트 (매핑 단계 · 검증 리포트 · 임포트 변경 세트) | - | • 「새 시트 만들기 › 업로드」에 매핑 단계를 추가해, 파일을 올리면 바로 시트가 생기지 않고 매핑 → 검증 리포트 → 승인 → 시트 생성 순으로 진행하는 기능 • 업로드 시: 서버가 파일을 storage에 보관하고 탭 요약 + 매핑 초안을 돌려준다(매핑 초안 우선순위 = 템플릿 매핑 > 휴리스틱). AI 매핑 제안이 초안을 한 번 다듬는다 • 검증 리포트 항목: 직원 연결 · 미매칭 · 중복 · 형식 불일치 · 수식 변환 · 합계. 리포트를 승인해야 시트가 생성된다 • 미매칭 행 직접 연결: 검증 리포트의 미매칭 행마다 「직접 연결」(동명이인이면 「후보에서 고르기」) 피커가 붙고, 고른 결과는 탭 매핑의 rowOverrides(원본 행 번호 → 직원 id — 파일마다 달라 템플릿 매핑에는 저장 안 함)에 저장돼 승인 시 자동 매칭보다 우선 적용. 동명이인 후보(candidates)는 리포트의 미매칭 행에 실려 오고 피커는 그 목록에서만 선택• 승인 게이트: 승인은 모든 탭을 검증한 뒤에만 진행(종전: 활성 탭 리포트만 보고 전 탭 생성 — 보지 않은 탭이 검사 없이 만들어지던 문제 해소) • 생성된 시트는 **임포트 변경 세트(kind=import)**로 남아 카드에서 적용 · 되돌리기 · 원본 보기가 가능(70-AI-A·70-AI-B 참조) - CASE01 [임포트 되돌리기]: 생성된 시트를 휴지통으로 보내고(삭제자 기록이 남아 휴지통에 정상 노출), 워크북은 지워진 시트를 다시 읽지 않고 시트 목록 화면으로 나가 시트 목록·휴지통을 재조회한다(되돌리기 직후 "Sheet not found" 발생 문제 해소) - CASE02 [캐시값 없는 수식 셀]: 계산값이 저장돼 있지 않은 수식 셀(openpyxl로 만든 파일)도 수식으로 읽어 수식 열로 인식한다 | [[HBHR101_새 시트 만들기 모달]] 업로드 · [[HBHR102_파일 메뉴]] 📤 업로드 · [[HBHR108_폴더·휴지통 사이드바]] 휴지통 · 70-AI-A 변경 세트 | 신설 (코드 반영: eea3dac #832) · QA(2026-09-22) 수정 반영: 휴지통·목록 재조회·수식 열 인식(1193e00, #836) · 미매칭 직접 연결·rowOverrides·전 탭 검증(f2a6921f, #887) · TBU: 라이브 실사 이월 |
| ㄴ25-P | 템플릿 지연 로딩 | Perf | • 새 시트 모달의 초기 조회를 제거하고 모달이 열릴 때 최신 템플릿 목록을 조회 - 닫힌 모달의 변경 이벤트는 다음 열기에 반영 - 기존 폼·직접 진입 동작은 불변(사용자가 보는 화면 변화 없음 — 첫 로딩만 가벼워짐) | [[HBHR101_새 시트 만들기 모달]] | 성능 (코드 반영: 1a27d31, #803) · UI 변화 없음 |
| 40 | 좌측 사이드바 | - | • "폴더" / "휴지통(🗑)" 탭, "▸▾" 접기, 폴더별 시트 그룹 + 건수를 담는 사이드바. 폴더 10종은 아래 [폴더 트리] 참조 - Empty: [[HBHR108_폴더·휴지통 사이드바]] 참조 | [[HBHR108_폴더·휴지통 사이드바]] 참조 | 상세 위임 |
| ㄴ41 | 폴더 트리 | List | • 폴더 10종((미분류) / eCount 연동 / 급여대장 / 문서·서명 / 병동 / 시트 에러 발생 케이스 / 연장근무 / 인센티브 / 출퇴근 / 치료실 인센티브 / 휴직·퇴사)을 나열하는 트리. 각 시트 항목 = "{이름} '26.7" + 건수 • 클릭 시: 해당 시트 로드 - CASE01 [폴더 없음]: "(미분류)" fallback - CASE02 [「급여대장」 폴더]: 이름 있는 폴더는 급여대장 시트 혼자 세우지 못함 — 0개짜리 빈 「급여대장」 폴더가 상시 노출되던 문제 + 폴더 삭제가 되살아나던 문제 해소(CS-OKBEST-260917-0002). (미분류) 버킷·사용자가 만든 빈 폴더는 그대로 유지 | [[HBHR108_폴더·휴지통 사이드바]] 참조 | "그룹"→"폴더" 용어 확정 (7/21) · 빈 급여대장 폴더·삭제 재생성 수정(코드 반영: d123698, #754) |
| 50 | 시트 헤더 | - | • 시트명·기간 + 건수 "293/293건" + 수정시각 "· 4시간 전" + 검색 + 뷰 토글(전치/행렬) + 메모 이력 + 셀 상세 패널 표시 + 시트 닫기 + 실행취소/재실행 상시 버튼을 담는 시트 헤더 • 변경 세트가 있는 시트는 헤더에 「최근 변경 N」 칩을 함께 표시(70-AI-A 참조) | [[HBHR109_행 정보 패널·검색]] 참조 (검색 상세) · 70-AI-A 변경 세트 | 「최근 변경 N」 칩 추가 (코드 반영: 2204a6b, #821) |
| ㄴ50-S | 저장 상태 표시 | Text | • 시트명 옆에 저장 상태를 표시. 평소 「N분 전 편집됨」, 저장 중 「저장 중…」, 저장 끝 ✓+「방금 편집됨」(툴팁 "모든 변경사항 저장됨\n마지막 저장: …") • 저장 실패 시: 빨간 「저장 실패」 + [다시 불러오기] — 자동 재시도 없음 - 툴팁 "저장하지 못한 변경이 있어요. … 다시 불러오면 서버에 저장된 값으로 돌아가요." | 50 시트 헤더 · 58 실행취소 | 신규 (ccea0b9e #831) · TBU: 라이브 실사 |
| ㄴ50-T | 권한 범위 배지·권한 게이트 | Badge | • 팀장 등 팀 범위 조회자에게 「팀 범위」 배지 노출. 툴팁 "팀장으로 지정된 팀의 직원 행만 보여요.\n합계·건수도 보이는 행 기준이에요." • 급여 시트 조회는 조직 전체 급여 조회 권한 필요, 팀 범위는 팀장 지정 팀 + 소속 역할이 팀 범위를 주는 팀 • 시트 열 때 관리자 전용 조회를 하지 않아 「접근 권한이 필요해요」 모달이 뜨지 않음 | 50 시트 헤더 · ㄴ64E 히스토리 · 권한 분기 CASE06 | 신규 (89fe2a6f #916, cba75f41 #936, cc7bb723 #930) · TBU: 팀장 계정 실사 |
| ㄴ51 | 시트명·기간 인라인 편집 | - | • 시트명·기간을 인라인으로 수정하는 기능 • 더블클릭 시: 인라인 편집 진입(시트명 이름 변경 / 기간 "'26.7" 기간 변경) | [[HBHR102_파일 메뉴]] 이름 바꾸기와 관계 TBU | 더블클릭 인라인 |
| ㄴ52 | 시트 검색 | Search | • 사번/성명/사유/항목으로 행을 거르는 검색. placeholder "사번 / 성명 / 사유 / 항목 검색"("( / )" 표기·"/" 단축키는 #831로 폐지 — ⌘F 찾기 막대 사용) • 입력 시: 일치 행 필터 • 검색 이력 드롭다운(10/7, #1063): 검색창(dsSearchInput)에 사용자별 최근·자주 쓰는 검색어 드롭다운 — 저장 규칙·민감 패턴 제외·자주/최근 분리·제안 혼합은 core search-history 로직, 서버 user_search_history(사용자 × 컨텍스트 × 검색어, 횟수·마지막 사용, 마이그레이션 1954) + searchHistory.list/record/remove/clear(본인 것만) - Empty: 검색 결과 없음 상태 | [[HBHR109_행 정보 패널·검색]] 참조 · searchHistory | TBU: 검색 결과 없음 문구 · 이력 드롭다운 UI 원문 TBU(실사 대기) |
| ㄴ53 | 전치 뷰 토글 | Button | • 행/열을 바꾼 전치 레이아웃으로 전환하는 토글(hover 시 노출). title 원문 "전치 보기 — 행과 열이 바뀐 레이아웃" • 클릭 시: 전치 레이아웃으로 전환 | 그리드 렌더(표시 전용) | hover 노출 · 신규 |
| ㄴ54 | 행렬 뷰 토글 | Button | • 다차원 피벗 행렬 레이아웃으로 전환하는 토글(hover 시 노출). title 원문 "행렬 보기 — 다차원 피벗 레이아웃" • 클릭 시: 행렬 레이아웃으로 전환 | 그리드 렌더(표시 전용) | hover 노출 · 신규 |
| ㄴ55 | 메모 이력 | Button | • 셀 메모 이력을 조회하는 "메모 이력" 버튼. 셀 메모는 모달에서 우측 상세 레일의 "메모" 탭으로 이동(아래 56 참조) • 클릭 → TBU | sheet_cells 메모 · 56 셀 상세 레일 | 신규 · TBU: 세부 동작·Empty·에러 동작 |
| ㄴ56 | 셀 상세 패널 표시 | Button | • 선택 셀/행의 우측 상세 레일 노출을 토글하는 "셀 상세 패널 표시" 버튼. 레일은 "셀 상세" / "메모" 2탭으로 구성되며, 같은 앵커 셀을 설명하는 두 화면을 토글로 나눠 쓴다. 레일은 그리드를 덮는 오버레이로 열려 가운데 영역 폭을 가져가지 않는다 • 클릭 시: 상세 레일 노출 토글 - CASE01 ["메모" 탭]: 앵커 셀의 메모 스레드 전체 표시(작성·수정·답글·해결·삭제 인라인 처리), 상단 "시트 전체 메모 보기" 진입. 메모 탭에서만 레일 폭 384px로 확대 - CASE02 [셀 이동]: 입력 중이면 핀으로 고정(내용 유지), 잃을 입력 없으면 선택 셀을 따라감 | [[HBHR109_행 정보 패널·검색]] 셀 상세 패널 · sheet_cells 메모 | "메모" 탭 신규 (코드 반영: d91858b) · 모달 → 레일 탭 이동 |
| ㄴ57 | 시트 닫기 | Button | • 현재 시트를 닫고 시작 화면으로 이동하는 "시트 닫기 — 시작 화면으로 돌아갑니다" 버튼 • 클릭 시: 현재 시트 닫고 시작 화면으로 이동 | 워크스페이스 시작 화면 | |
| ㄴ58 | 실행취소/재실행 | Button | • 편집 스택을 실행취소(⌘Z) / 재실행(⌘⇧Z)하는 상시 버튼(편집 메뉴에서 이동) • 클릭 시: 편집 스택 실행취소 / 재실행 - CASE01 [히스토리 없음]: disabled | [[HBHR103_편집 메뉴·단축키]] 편집 스택 | 편집 메뉴에서 이동 |
| ㄴ59 | 댓글 | Button | • "💬" 댓글 버튼 • 클릭 → TBU | — | TBU: 상세 동작 |
| ㄴ5A | 시트 작업 완료 토글 | Button | • 시트 단위로 "작업 완료" 상태를 토글해 시트를 편집 가능/view-only(잠금)로 전환하는 기능. 파일 메뉴 항목 원문 = "'{시트명}' 작업 완료로 변경"(사용 중 → 작업 완료 전환). 되돌리기 경로는 "파일 → 사용 중으로 변경"(작업 완료 시트 되돌리기 툴팁 문구). 작업 완료(workDoneAt)와 시트 보호(lockedAt/시트 및 범위 보호)는 분리된 별개 상태로, 완료 = workDoneAt + lockedAt(완료는 잠금 포함), 보호 = lockedAt만이다. 보호를 해제하면 완료 표시도 함께 풀린다(응답 workDoneCleared로 안내) • 클릭 시: 시트 작업 완료 토글. title 원문 "완료하면 시트가 잠겨 수정과 반영이 막힙니다." / (완료 상태에서) "사용 중으로 바꾸면 잠금이 풀려 수정할 수 있어요." - CASE01 [작업 완료로 전환]: 파일 메뉴 "'{시트명}' 작업 완료로 변경" → 시트 view-only(잠금) 전환, 이후 셀 편집 차단 - CASE02 [다시 토글]: "파일 → 사용 중으로 변경" → 편집 가능 상태로 복귀 | sdk.sheetView.setWorkDone() · 파일 메뉴([[HBHR102_파일 메뉴]]) · 41 폴더 트리(상태 배지) · 64 수명주기 배지 | 신규 (코드 반영: 7635459) · 완료/보호 분리(dbca988) · 배경: 7/21 베스트 요구(시트 작성중/완료 상태 표시) · 8/17 라이브 실사: 파일 메뉴 "작업 완료로 변경"·되돌리기 "사용 중으로 변경" 확정("작업 중" 잔존 표기 제거) |
| ㄴ5B | 시트 상태 표시 (완료·보호·편집 중) | Badge | • 시트 상태를 사이드바 배지 3종으로 구분 표시하는 기능. 완료 = green 점("완료로 잠김"), 보호만 걸린 시트 = 자물쇠 아이콘("보호 중"), 값이 바뀌었으나 아직 급여에 반영되지 않은 시트 = primary 점("편집 중"). 비공개는 눈 아이콘(ic-eye-off)으로 별도 표시 • 표시 전용. "편집 중" 판정은 목록 엔드포인트가 기간 단위로 집계 - CASE01 [급여대장]: 자기 열이 아니라 반영을 기다리는 소스 시트가 남아 있을 때 "편집 중" 점 표시 | sheet_views.workDoneAt/lockedAt · 41 폴더 트리 | 신규 (코드 반영: 8fbb4c2) · 상태 3종 구분 |
| ㄴ5C | 시트 편집 가드 (진입 시점) | - | • 잠긴/보호/작업 완료 시트의 편집을 저장 시점이 아니라 편집 진입 시점에 차단하는 가드. 더블클릭·Enter·바로 타이핑 등 모든 진입로가 단일 관문(_beginEdit)에서 막히며, Delete 값 지우기·헤더 색·열 메뉴 편집 계열도 같은 가드를 탄다. 원인(행 보호 / 작업 완료 / 시트 보호)에 따라 푸는 방법을 구분해 안내 - CASE01 [시트 보호]: "보호 중인 시트입니다.\n수정을 하려면 데이터 > 시트 및 범위 보호에서 보호를 해제해 주세요." - CASE02 [행 보호]: "보호 중인 행 입니다.\n수정을 하려면 데이터 > 시트 및 범위 보호에서 보호를 해제해 주세요." | sheet-guard.ts · 5A 작업 완료 · [[HBHR106_데이터 메뉴]] 시트 및 범위 보호 | 신규 (코드 반영: 8fbb4c2) · 편집 진입 시점 가드 |
| ㄴ5D | 읽기 전용 셀 사유 안내 (토스트 + 바로가기) | Toast | • 읽기 전용 셀에서 편집을 시도(더블클릭 · Enter · 바로 타이핑)하면 조용히 막지 않고 왜 수정할 수 없는지 + 어디서 고치는지를 토스트로 안내하는 기능. 셀 종류별 메시지(원문)와, 조치 화면이 있으면 토스트 우측에 바로가기 버튼(예: "직원 마스터 시트 열기")이 붙는다(클릭 시 해당 시트 열림 + 토스트 닫힘, data-testid=sheet-toast-action)- CASE01 [연동 시트에서 가져오는 열]: "「{열}」 열은 {소스}에서 가져오는 값이라 이 시트에서는 수정할 수 없어요. {안내}" — 소스 라벨 = 직원 정보 / 소속 팀 / 근무 배정 / 근로계약 / 퇴사 기록 / 자격증 / 수당 / 공제 / 초과근무 / 인센티브 / 치료(일별). 직원 마스터 시트가 소스면 "직원 마스터 시트의 「{열}」 열에서 수정하면 여기에도 반영돼요." + 바로가기, 아니면 "직원 관리에서 수정하면 여기에도 반영돼요." - CASE02 [자동 계산 열]: "「{열}」 열은 자동으로 정해지는 값이라 이 시트에서는 수정할 수 없어요. {열 도움말 문장}" - CASE03 [직원 정보 파생 열]: "「{열}」 열은 직원 정보에서 가져오는 값이라 이 시트에서는 수정할 수 없어요. 직원 관리에서 수정하면 여기에도 반영돼요." - CASE04 [소계 행]: "소계 행은 위 행들을 합한 값이라 직접 수정할 수 없어요. 합산되는 행의 값을 고쳐 주세요." - CASE05 [치료(일별) 집계 행]: "치료(일별) 행은 여러 인센티브 기록을 합한 값이라 셀을 직접 수정할 수 없어요. 행을 더블클릭해 세션 편집 창에서 고쳐 주세요." - CASE06 [계산 모듈 열]: "이 열의 값은 계산 모듈이 채우기 때문에 직접 수정할 수 없어요. 원본 값을 수정하면 자동으로 다시 계산돼요." - CASE07 [반영 집계 열]: "이 열의 값은 반영된 레코드를 집계한 결과라 직접 수정할 수 없어요. 원본 시트에서 수정하고 다시 커밋하면 반영돼요." - CASE08 [미저장 행에 직원 연결 시도]: "이 행은 아직 시트에 저장되지 않아 직원을 연결할 수 없어요. 행을 먼저 추가한 뒤 사번이나 성명을 입력해 주세요." - 예외: 수식 열의 단일키 차단(ㄴ5C 계열, = 제외)은 편집 가능 열의 사고 방지라 안내 없이 조용히 무시 유지 | uneditable-reason.ts · ㄴ5C 편집 가드 · [[HBHR200_급여대장 시트]] 연동 열 | 신설 (코드 반영: f9ccac1, #790) · 배경: 2026-09-18 요청 "버그인지 원래 안 되는 건지 알 수 없음" · TBU: 라이브 실사 이월 |
| ㄴ5E | 상시 시트 안내 배너 닫기 | Button | • 상시(에버그린) 시트 상단 안내 배너에 닫기(✕) 버튼(title/aria-label "이 안내 닫기")이 생겨 사용자가 배너를 숨길 수 있는 기능 • 클릭 시: 이 시트 버전(slug + 시행월 단위)의 안내만 사용자별로 숨김(localStorage 저장, 핀과 같은 방식). 같은 시트라도 새 버전(시행월 변경)이면 배너가 한 번은 다시 보임 - CASE01 [localStorage 사용 불가/가득 참]: 이 세션에서만 숨김 - 배너를 닫아도 「이 달부터 새 버전」 기능은 사이드바 우클릭 메뉴로 계속 사용 가능(기능 손실 없음) | evergreen-notice · [[HBHR108_폴더·휴지통 사이드바]] | 신설 (코드 반영: 2433f1f, #788) · ⚠️ 상위 기능 「상시(에버그린) 시트」(#713, 958876c4 — 버전 이력·사이드바 핀) 자체가 사양서 미반영 갭 → 후속 이월 · TBU: 라이브 실사 이월 |
| 60 | 스프레드시트 툴바 | - | • "파일 ▾" / "수정 ▾"(예전 「편집」) / "보기 ▾" / "삽입 ▾" / "데이터 ▾" 메뉴(좌) + "반영" CTA / "설정 완료" CTA(우)를 담는 툴바. 레이아웃은 좌(메뉴)/우(CTA) 50:50 두 덩어리로 분할되어 넘칠 때 각 영역 내에서만 줄바꿈되고, 한쪽이 두 줄이 돼도 반대쪽은 제자리를 유지한다. (시트 수명주기 상태 배지(64)는 툴바가 아니라 시트 헤더(50) h3에 렌더된다 — 8/17 라이브 실사.) 각 메뉴 상세는 개별 문서에 위임 • 각 메뉴 클릭 시: 해당 드롭다운 오픈 → [[HBHR102_파일 메뉴]] / [[HBHR103_편집 메뉴·단축키]] / [[HBHR104_보기 메뉴]] / [[HBHR105_삽입 메뉴]] / [[HBHR106_데이터 메뉴]] | [[HBHR102_파일 메뉴]] / [[HBHR103_편집 메뉴·단축키]] / [[HBHR104_보기 메뉴]] / [[HBHR105_삽입 메뉴]] / [[HBHR106_데이터 메뉴]] 참조 · 수명주기 배지 64~64F · 50 시트 헤더 | 메뉴명 「편집」→「수정」, 메뉴 버튼 title "수정 (Alt+E)" (ccea0b9e #831) · 좌/우 50:50 분할 (코드 반영: aed8800) · 설정 완료 CTA 추가 (PR #540) · 배지는 시트 헤더 위치(8/17 실사) · 각 메뉴 상세 위임 |
| ㄴ60-F | 수식바 캐럿·강조 정렬 | - | • 수식바 입력창 위에 구문 강조용 미러 레이어를 겹쳐 그리는 구조에서, 수식 열의 캐럿과 글자가 한 글자씩 어긋나던 결함을 수정 • 원인: 미러의 왼쪽 여백을 Tailwind pl-0으로 줬으나 미러 규칙이 레이어 밖(unlayered)이라 밀려 입력창(0px)과 미러(8px)가 어긋났고, 함수명 굵게(font-weight 600)가 글자폭을 넓혀 뒤로 갈수록 더 벌어졌다• 수정: 수식 열 여백은 전용 수식어 클래스( --fx)로 주고, 강조 규칙은 글자 굵기 없이 색만 남겨 입력창과 글자폭을 맞춘다. 드래그·Shift 선택 등 선택 변경(select)에도 캐럿 위치를 다시 계산 | 60 스프레드시트 툴바(수식바) · 72 수식 적용 범위 하단 바 · 75 수식 함수 | 수정 (코드 반영: 6457e48, #867 — CS-OKBEST-260923-0002) · TBU: 라이브 실사 이월 |
| ㄴ60-B | 수식바 fx 「북마크한 열」·시트 전환 넘김 | - | • 수식바 fx 팝오버 맨 위에 「북마크한 열」 칩 — 클릭 한 번으로 [시트!열] 참조 삽입(상세 [[HBHR107_컬럼 헤더 컨트롤]] ㄴ12-B)• 수식바에서 수식을 고치다 다른 시트를 열면 초안이 헤더 수식 편집 팝오버로 넘어가 다른 시트 열 참조 후 원본으로 돌아와 저장(상세 [[HBHR107_컬럼 헤더 컨트롤]] ㄴ12-H) | 60 수식바 · [[HBHR107_컬럼 헤더 컨트롤]] ㄴ12-B · ㄴ12-H · 30 | 신규 (8284d800 #982, MED-845 · 99a24b42 #979, MED-844) · TBU: 라이브 실사 |
| ㄴ61 | 반영 (급여대장 반영) | Button | • 시트에 입력한 값을 급여(수당·공제 레코드)로 기록하는 CTA. title 원문 "시트에 입력한 값을 급여(수당·공제 레코드)로 기록합니다. 반영해야 급여대장과 급여 계산에 반영돼요." 반영 개념이 있는 시트면 버튼을 항상 노출하고, 못 누르는 시트는 disabled + 툴팁으로 사유를 밝힌다(사유 판정·툴팁 문구는 단일 게터 commit-gate.ts에서 결정) • 클릭 시: 시트 값 → 수당·공제 레코드 기록 - CASE01 [작업 완료]: disabled — "작업 완료된 시트는 반영할 수 없어요. 시트 상태를 '사용 중'으로 바꾼 뒤 반영해 주세요." - CASE02 [시트 보호]: disabled — "보호 중인 시트는 반영할 수 없어요. 데이터 > 시트 및 범위 보호에서 보호를 해제해 주세요." - CASE03 [대상 미지정]: disabled — "반영할 대상이 지정되지 않았어요. 열 헤더를 우클릭해 열 설정 → 대상 급여대장 항목을 지정하면 반영할 수 있어요." - CASE04 [변경 없음]: disabled — "마지막 반영 이후 변경된 내용이 없어 반영할 항목이 없어요." | commit-gate.ts · 62 열 헤더 메뉴 · 64C 설정 중 노출 제어 · [[HBHR201_전체 확정 (commit)]] | 신규 (코드 반영: aed8800) · "커밋→반영" 용어 통일 · 항상 노출 + disabled 사유 4종 · 8/17 라이브 실사: CASE01 워딩 "사용 중" 확정(PR #540 통일) · 설정 중엔 숨김(64C) |
| ㄴ62 | 반영 상태 배지·칩 | Badge | • 시트-급여대장 반영 상태를 배지·칩으로 표시. 배지 문구는 기존 「변경됨/최신」에서 **「반영 필요/반영됨」**으로 변경. 미반영 칩은 "급여대장 미반영", 반영 후엔 "마지막 급여 반영 {일시}"로 목적어를 붙여 표기. 배지는 .ds-label 규격으로 렌더 - CASE01 [반영됨]: "시트 값이 급여대장에 반영된 값과 같습니다." - CASE02 [반영 필요]: "시트 값이 급여대장에 반영된 값과 다릅니다. 다시 반영하면 급여대장이 시트와 같아집니다." · 반영 후 실행 취소 시에도 「반영 필요」로 되돌림 | sheet_views.lastCommittedAt · 58 실행취소/재실행 | 신규 (코드 반영: aed8800·160de5a) · 「변경됨/최신」→「반영 필요/반영됨」 |
| 63 | 서식 도구 모음 | - | • 글자크기 9|18pt / "B" "I" "S" "U" / 색(글자·배경 분리) / 정렬 / "123"(fill) / 테두리 / "자간 (Letter spacing)" / "서식 지우기 (선택한 셀의 모든 서식 제거)" / "⊘"를 담는 서식 도구 모음. "123" 숫자형식 메뉴에 표시 형식 항목으로 「불리언」(63A) 포함 | 보기 메뉴 "🎨 서식 도구 모음 표시" ([[HBHR104_보기 메뉴]] 참조) · 63A 불리언 표시 형식 | 자간·서식 지우기 신규 · "123" 메뉴에 불리언 추가 (90bc68f) · 자간 버튼 숨김·도구 추가는 ㄴ63B (#831) |
| ㄴ63A | 불리언 표시 형식 | - | • 열 표시 형식에 신설한 「불리언」 형식. 수식 엔진의 1/0 결과(비교·AND/OR/NOT·TRUE/FALSE 리터럴)를 True/False 텍스트로 표시한다(False는 회색, True는 파란 강조). 사람이 넣은 true/false 문자열도 매핑(0/"0"/"false" → False, 그 외 비어 있지 않으면 True). 편집은 텍스트 입력 그대로. 선택 위치는 두 곳: 열 설정 드로어(71 열 설정) + 서식 툴바 "123" 숫자형식 메뉴. "123" 숫자형식 메뉴 항목 원문 = 자동 / 텍스트 / 숫자 / 날짜 / 시간 / 기간 (HH:MM - HH:MM) / 불리언 (True/False) / 안내 "숫자 형식은 선택한 셀이 속한 열 전체에 적용됩니다. 글자·색·테두리 등 나머지 서식은 선택한 셀에만 적용됩니다." • 표시 형식 「불리언」 선택 시: 1/0 값을 True/False 텍스트로 렌더 | 63 서식 도구 모음("123") · 71 열 헤더 메뉴(열 설정) · 75A 불리언 리터럴 | 신규 (코드 반영: 90bc68f) · 열 설정 드로어 + "123" 메뉴 진입 · 1/0 → True/False 표시 · 8/17 라이브 실사: "123" 메뉴 항목·안내 원문 확정 |
| ㄴ63B | 서식 도구 모음 확장 | - | • 도구 추가: 서식 복사(붓) · 확대/축소(50~200%, 사용자별 기억) · 통화 형식(₩) · 퍼센트 형식 · 소수점 자릿수 늘리기/줄이기 · 셀 병합(▾ 병합 방식) · 링크 삽입 · 수정 기록 표시(시계) · 함수(Σ). 「자간」 버튼은 숨김 • 한 줄 유지: 넘치는 도구는 「⋮ 더보기」 패널로 이동 - 병합 ▾: 전체 병합 / 세로로 병합 / 가로로 병합 / 병합 취소. 잠금·읽기 전용·보호 행은 차단 | [[HBHR103_편집 메뉴·단축키]] · [[HBHR109_행 정보 패널·검색]] 변경 이력 | 신규 (ccea0b9e #831) · TBU: 병합 확인창 문구·Σ 목록 라이브 확인 |
| ㄴ63C | 메뉴 검색 | Search | • 서식 도구 모음 맨 앞 돋보기(title "메뉴 검색 (Alt+/)"). 기능 이름을 쳐서 메뉴 항목을 바로 실행 • 입력 시: 일치 메뉴 목록, 없으면 "일치하는 메뉴가 없어요" - 맨 아래 「시트 내 검색」: 입력어로 찾기 막대(⌘F) 열기 | 60 툴바 메뉴 전체 · [[HBHR103_편집 메뉴·단축키]] | 신규 (ccea0b9e #831) |
| 64 | 시트 수명주기 상태 배지 | Badge | • 시트의 수명주기 단계를 상태 배지 3종으로 표시하는 기능. 배지 텍스트 "설정 중" / "사용 중" / "작업 완료"이며, 각 배지 좌측에 SVG 아이콘(기어 / 진행 중 원형 / 체크)이 붙는다(이모지 문자 ⚙/◔/✓ 아님). 배지 위치는 툴바가 아니라 시트 헤더 h3(시트명 왼쪽 앞). data-testid=sheet-lifecycle-badge, ds-label--md·square·line 규격(설정 중=light-gray·semibold / 사용 중=primary / 완료=green). "설정 중" 단계에서는 배지와 함께 설정 중 안내 띠(오렌지 배너)를 노출• 표시 전용(단계에 따라 하위 컨트롤 노출·잠금 분기) - CASE01 [설정 중]: "설정 중" 배지(좌측 SVG 기어) + 안내 띠 · 반영 버튼 숨김(64C, 직원 추가는 노출 — #978) - CASE02 [사용 중]: "사용 중" 배지(좌측 SVG 진행 중 원형) · 구조 잠금(64D) - CASE03 [작업 완료]: "작업 완료" 배지(좌측 SVG 체크) - 배지 호버 툴팁 3종: 설정 중 = "설정 중\n구조(컬럼·열 수식·반영 연결)를 자유롭게 바꿀 수 있어요.\n✓ 설정 완료를 누르면 실무자가 사용할 수 있습니다." / 사용 중 = "사용 중\n값 입력·행 추가 등 일상 작업만 가능해요.\n구조를 바꾸려면 파일 → 시트 재설정." / 작업 완료 = "작업 완료\n시트가 잠겨 수정과 반영이 막힙니다.\n파일 → 사용 중으로 변경으로 되돌릴 수 있어요." - 설정 중 안내 띠 원문: "시트를 설정 중 입니다. 구조를 자유롭게 바꿀 수 있어요. 완료하면 실무자가 사용할 수 있습니다.입력된 데이터 {N}행이 있어요 — 열 수식을 바꾸면 전체가 재계산됩니다." | 5A 시트 작업 완료 · 64A 설정 완료 CTA · 64C·64D · 50 시트 헤더 | 신규 (PR #540, 21cd1b8 — UP-008 R1·R2·R4·R8) · 워딩 "작업 중"→"사용 중" 통일 · 8/17 라이브 실사: SVG 아이콘·시트 헤더 위치·툴팁·안내 띠 확정 |
| ㄴ64A | 설정 완료 CTA | Button | • 툴바 우측 끝에서 시트를 "설정 중"에서 "사용 중"으로 확정하는 [설정 완료] CTA. 설정 중 시트 툴바 우측에는 "설정 중엔 급여반영이 불가합니다." 안내 + [설정 완료] CTA만 노출된다. 클릭 시 확정 다이얼로그를 띄운다 • 클릭 시: 확정 다이얼로그 오픈(구조 요약 4행 + 잠금 안내). 확정 처리 중에는 화면에 화이트 딤 + 스피너 - 확정 다이얼로그 원문: 제목 "설정을 완료하고 시트를 사용합니다." / 구조 요약 4행 = 컬럼 {n}개 · 수식 열 {m}개 / 급여 반영 연결 없음(또는 연결명) / 자동 행 생성 자동 — 규칙 설정됨 / 행 기준 자유 / 안내문 "사용 중에는 컬럼 구조·열 수식·반영 연결이 잠깁니다. 다시 바꾸려면 파일 → 시트 재설정." / 버튼 [취소] [설정 완료] - CASE01 [확정]: 시트 "사용 중" 전환, 구조 잠금(64D) 적용 - CASE02 [권한 없음]: 노출 안 됨(canManageSetup, 비공개 시트는 생성자만) | 64 상태 배지 · 64D 구조 잠금 · sdk.sheetView.finishSetup() (추정) | 신규 (PR #540, 21cd1b8) · 설정 중 → 사용 중 확정 · 8/17 라이브 실사: 확정 다이얼로그 원문 확정 |
| ㄴ64B | 시트 재설정 | - | • 확정된 시트를 다시 "설정 중"으로 되돌리는 「시트 재설정」. 파일 메뉴에서 진입 — 파일 메뉴 항목 "시트 재설정 하기" + 설명 "시트의 초기 설정을 변경합니다. 이력이 남습니다." 열 헤더 메뉴 하단에도 "구조 변경은 파일 → 시트 재설정에서" 안내가 붙는다 • 클릭 시: 시트 "설정 중"으로 복귀 → 구조 편집 잠금 해제, 설정 중 안내 띠 재노출 - CASE01 [권한 없음]: 진입 불가(canManageSetup, 비공개 시트는 생성자만) | 64 상태 배지 · 64C·64D · [[HBHR102_파일 메뉴]] · sdk.sheetView.reopenSetup() (추정) | 신규 (PR #540, 21cd1b8) · 8/17 라이브 실사: 진입 위치 = 파일 메뉴 "시트 재설정 하기"(사이드바 컨텍스트 아님) |
| ㄴ64C | 설정 중 노출 제어 | - | • "설정 중" 단계에서 반영 버튼(61)을 숨기는 노출 게이트. 설정이 완료되기 전에는 급여 반영 동선을 감춰 구조 확정을 유도한다 • 설정 중 진입 시: 반영 버튼 숨김. 시트 상단 「직원 추가」(행 추가) 버튼은 설정 중에도 노출·동작(행 추가는 구조 변경이 아님 — 열 설정을 바꿔 가며 직원을 넣어 보는 흐름 지원) | 61 반영 버튼 · 64 상태 배지 · [[HBHR202_직원 추가]] | 신규 (PR #540, 21cd1b8 — UP-008 R2) · 직원 추가 버튼 설정 중 노출로 변경(7170d1a6 #978, MED-843 — 종전: 설정 완료 후 재설정해야 직원 추가 가능) · 라이브 실사 확인(10/2): 설정 중 툴바에 「직원 추가」 + 안내 "설정 중엔 급여반영이 불가합니다." + 「설정 완료」 |
| ㄴ64D | 사용 중 구조 잠금 | - | • "사용 중" 시트에서 구조 편집(열 추가·수식·열 설정)을 게이트로 차단하는 잠금. 값 편집은 허용하되 시트 구조 변경 계열 동선만 막는다 • 사용 중 진입 시: 구조 편집 동선 게이트 차단 - CASE01 [재설정]: 시트 재설정(64B)으로 "설정 중" 복귀 시 잠금 해제 | 71 열 헤더 메뉴(열 설정) · 64B 시트 재설정 · [[HBHR105_삽입 메뉴]] · [[HBHR107_컬럼 헤더 컨트롤]] | 신규 (코드 반영: 64c3b12) · 구조 편집 게이트 |
| ㄴ64E | 히스토리 드로어 | Drawer | • 시트의 완료·재설정 이력을 최신순으로 보여주는 「히스토리」 드로어. 드로어 헤더 = "히스토리" + 시트명. 우측 레일 상호 배제 합류(셀 상세·메모 레일과 같은 우측 레일 슬롯을 공유) • 클릭 시: 우측 레일에 히스토리 드로어 노출(완료/재설정 이력 최신순) - 항목 포맷 = [상태 배지] + [날짜 시각] + [작성자]. 예: 설정 완료 · "2026. 08. 11. 13:31" · "안세희"- CASE01 [다른 레일 열림]: 우측 레일 상호 배제 — 기존 레일 대체 - CASE02 [변경 세트 절]: 드로어에 변경 세트 절이 추가되어 해당 시트의 변경 세트를 출처 라벨 「AI 제안」/「예약 변경」/「직접」으로 구분해 나열하고, 항목에서 바로 되돌리기할 수 있다(70-AI-A) · 확인 대기 행은 [적용]/취소 | 56 셀 상세 레일 · 64 상태 배지 · 70-AI-A 변경 세트 | 신규 (PR #540, 21cd1b8 — UP-008 R8) · 우측 레일 합류 · 8/17 라이브 실사: 헤더·항목 포맷 확정 · 변경 세트 절 추가(2204a6b, #821) · 출처 「예약 변경」 라벨(30fe6180, #1021) |
| ㄴ64F | 수명주기 승계·소스 제외 | - | • 기간 복사(이전 월에서 가져오기) 시 소스 시트의 수명주기를 대상 시트가 승계하는 규칙. 또한 "설정 중" 소스 시트는 급여대장 "소스 전체 반영"에서 제외하고 제외 사유를 표시한다 • 기간 복사 시: 소스 수명주기 승계 - CASE01 [소스가 설정 중]: "소스 전체 반영" 대상에서 제외 + 제외 사유 표시 | 22 이전 월 가져오기 · 64 상태 배지 · [[HBHR201_전체 확정 (commit)]] | 신규 (코드 반영: 388f810 승계 · 7633ebc 소스 제외 사유) |
| ㄴ64G | 히스토리 「값 변경」 절 | Drawer | • 히스토리 드로어에 「값 변경」 절 추가: 한 동작(붙여넣기 한 번 등)이 한 줄, 줄마다 [되돌리기]. 되돌릴 때 그 사이 다른 사람이 고친 칸은 건너뛰고 건수 안내. 보관 1년 • 변경 세트 적용·되돌리기로 바뀐 칸도 기록 - CASE01 [급여 관리 권한 없음]: "값 변경 기록은 급여 관리 권한이 있어야 볼 수 있어요." / CASE02 [불러오기 실패]: "연결이 느려 변경 기록을 불러오지 못했어요. 잠시 후 다시 시도해 주세요." + [다시 시도] | ㄴ64E · 70-AI-A 변경 세트 · [[HBHR109_행 정보 패널·검색]] 변경 이력 탭 | 신규 (ccea0b9e #831, a39bce86 #955, fe029463 #968) · 잠금/작업 완료 시트는 되돌리기 없음 · 히스토리 버튼은 전체 조회 권한 없으면 흐림(title "급여 전체 조회 권한이 있어야 볼 수 있어요") |
| ㄴ64H | 히스토리 「변경 세트」 확인 대기 [적용]/[취소] | Button | • 「변경 세트」 절의 확인 대기(상태 「적용 대기」) 행 우측에 [적용]·[취소] 버튼 — 조직 설정 「확인 뒤 적용」으로 만들어진 셀 예약 변경(출처 「예약 변경」)과 카드가 닫힌 AI 제안을 여기서 처리 • [적용] 클릭 → 컨펌 "이 변경 세트를 적용할까요?\n{요약}"(위험 항목 있으면 "이 변경 세트를 적용할까요? 위험 항목(급여 반영 열·퇴직자·100행 초과)이 있어요.\n{요약}") → 적용, 칸·합계 즉시 다시 그림 + 토스트 "변경 세트를 적용했어요."(+「되돌리기») 1회 • [취소] 클릭 → 컨펌 "이 변경 세트를 취소할까요? 시트는 바뀌지 않아요." → 반려, 토스트 "변경 세트를 취소했어요." (예약은 다음 잡 tick에 취소됨으로 동기화) | ㄴ64E 히스토리 드로어 · 70-AI-A 변경 세트 · ㄴ70-RS 예약 변경 · [[HBAD270_설정 (조직 설정·내 정보)]] 시트 예약 변경 적용 | 신규 (30fe6180, #1021 — MED-825 QA) · 적용·되돌리기 뒤 새로고침 없이 칸·합계 즉시 반영, 토스트 2번 뜨던 것 1회로(f3647829, #1025 — MED-876, AI 카드 [적용]도 같은 뒷처리) · 잠금·작업 완료 시트는 버튼 미노출 · 실패 "적용하지 못했어요: {사유}" / "취소하지 못했어요: {사유}" · TBU: 라이브 실사 |
| 70 | 데이터 그리드 | Grid | • 컬럼 헤더 + 행으로 구성된 데이터 그리드. 시스템 컬럼(#/사번/성명/팀/직급 등) + 유형별 항목 컬럼, 휴직/퇴사 행 회색 처리(추정). 그리드 셀 내 상태 배지(대기·승인·지급·취소)는 .ds-label 규격(xs·square·line)으로 렌더되며 색은 DS 의미 매핑(승인=green / 대기=yellow / 지급=blue / 취소=light-gray)을 따른다 | 컬럼 헤더 [[HBHR107_컬럼 헤더 컨트롤]] 참조 / 시트 유형 HBHR200~270 | 상태 배지 DS 라벨화 (코드 반영: 160de5a) · 컬럼 헤더 구조 위임 |
| ㄴ70-C | 셀 입력 (칸 안 편집·한글) | - | • 칸 안에서 바로 편집(별도 입력창 없음). 칸을 고르고 글자·숫자 키를 치면 편집 시작, 첫 한글 음절도 자모가 갈라지지 않음 • 수식 열에 바로 타이핑 시: 8초 토스트 「수식 열이에요. Enter 나 더블클릭으로 열면 수식을 고칠 수 있어요.」 - 금액 열 빈칸 복사 = 0이 아닌 빈칸 · 빈칸 붙여넣기 = 대상 비움 | ㄴ5C 편집 가드 · ㄴ5D 읽기 전용 안내 · [[HBHR103_편집 메뉴·단축키]] | 신규 (ccea0b9e #831, 23000c37 #940, 4dbca86d #952) · TBU: macOS 한글 실측 |
| ㄴ70-C1 | 직원·항목 선택 즉시 표시 | - | • 팝업형 편집기(직원 자동완성 사번/성명 · 항목 자동완성 · 구분 드롭다운 · 치료 카테고리 · 인센 유형 프리셋 · 빈 행 직원 선택)에서 고르고 확정하면 고른 값이 칸에 바로 표시, 저장·재조회 뒤 나머지 식별 열 채움 • 팝오버 편집기 클릭 유지(10/7, #1039, MED-886): 팝오버형 편집기(다중 선택 체크리스트·치료 횟수·직원 선택)의 체크박스·선택지 글자를 눌러도 닫히지 않고 눌림 — data-cell-editor-popover 표시로 렌더 미루기·IME 받이·표 포인터 처리가 물러나고, 글자·여백 클릭의 mousedown 기본 동작을 막아 포커스가 body로 가지 않음(종전: 클릭이 「열린 편집기 없음」으로 보여 재렌더·focusout 확정으로 닫히던 버그, CS-OKBEST-261002-0006) - CASE01 [저장 실패]: 칸을 원래 내용으로 되돌림 | ㄴ70-C · [[HBHR231_근태 내역 시트 (근무시간 유형 집계)]] | 수정 (2c578aa5 #1010, MED-866) · 종전: 저장이 끝나도 입력칸이 남아 수 초 뒤에야 값 표시 · TBU: 라이브 실사 |
| ㄴ70-C2 | 기간·시각 열 자유 입력 | - | • 기간 열(「HH:MM - HH:MM」) 편집기가 시계 피커 2개 → 글자 입력 한 칸(placeholder "09:00 - 18:00"). 「9-18」 「0900~1800」 「오후 1-5시」 등을 확정 시 「HH:MM - HH:MM」로 정리, 붙여넣기도 같은 규칙 • 시각 열은 네이티브 피커 유지, 확정·붙여넣기는 같은 해석(「9:30」「930」「오후 3시」「3pm」) - CASE01 [해석 불가 — 기간]: 토스트 "기간을 읽지 못했어요. 「9-18」「09:00 - 18:00」「9시30분~18시」처럼 입력해 주세요." + 값 유지 - CASE02 [해석 불가 — 시각]: 토스트 "시각을 읽지 못했어요. 「9:30」「930」「오후 3시」처럼 입력해 주세요." - CASE03 [붙여넣기 해석 불가]: 원문 그대로 저장 · CASE04 [끝 < 시작]: 야간으로 그대로 저장 | ㄴ70-C · [[HBHR103_편집 메뉴·단축키]] 붙여넣기 · [[HBHR230_출퇴근 내역 시트]] / [[HBHR231_근태 내역 시트 (근무시간 유형 집계)]] | 수정 (2c578aa5 #1010, MED-867) · 한쪽만 오전/오후면 다른 쪽도 따름(「오후 1-5시」=13:00 - 17:00) · TBU: 라이브 실사 |
| ㄴ70-C3 | 연도 없는 날짜 입력·붙여넣기 | - | • 날짜 열에 연도를 뺀 날짜(「07월 20일」·「7/20」·「7.20」)를 입력·붙여넣으면 이 시트 기간의 연도로 읽어 yyyy-mm-dd로 저장(종전: 글자 그대로 저장)• 날짜 열에 대시( -·ㅡ)를 넣으면 빈 칸으로 저장- CASE01 [이미 글자로 저장된 연도 없는 날짜]: 데이터는 그대로 두고 수식(DATEDIF·날짜 빼기)에서만 같은 규칙으로 날짜로 읽음 · CASE02 [상시 시트]: 조직 기준 오늘의 연도 | ㄴ70-C · ㄴ70-C2 · ㄴ75C DATEDIF · [[HBHR103_편집 메뉴·단축키]] 붙여넣기 | 수정 (a61b5dd7, #1028 — MED-877/878, CS-OKBEST-261002-0002·0003) · 시트 어시스턴트가 DATEDIF 제안 전 참조 열 실제 값 확인(프롬프트) · TBU: 라이브 실사 |
| ㄴ70-L | 레일·목록 폭 조절 · 열기 실패 | - | • 우측 레일(220~640px)과 좌측 시트 목록(최소 200px) 경계를 드래그해 폭 조절. 전체 화면 아이콘 ic-expand/ic-collapse로 교체 • 시트 자동 열기 실패 시: 목록 유지 + 「시트를 열지 못했어요. 목록에서 다시 골라 주세요.」 | ㄴ23-A 전체화면 · [[HBHR108_폴더·휴지통 사이드바]] | 신규 (ccea0b9e #831) |
| ㄴ70-X | 권한 없는 시트 참조 셀 | Cell | • 보는 사람이 읽을 수 없는 시트를 참조하는 수식 셀은 값 대신 회색 「권한 없음」으로 표시(합계 제외) • 셀 호버 시: "권한이 없는 시트를 참조하는 수식이에요. 이 열의 값은 확인할 수 없어요." + 참조 시트(개인용이면 소유자) - 머리글 ⚠ 배지: "권한이 없는 시트를 참조해 확인할 수 없는 셀이 N개 있어요." | 78 크로스시트 참조 · ㄴ50-T 권한 | 신규 (3a6093fd #954) · TBU: 권한 분리 계정 실사 |
| ㄴ70-F | 적용 필터 띠 · 숨긴 행 | - | • 열 필터가 걸리면 수식바와 표 사이에 띠 노출: "필터 N개 · 14/279건 표시" + 열별 칩(클릭 = 조건 편집, × = 그 열 해제) + [필터 초기화] • 숨긴 행이 있으면 같은 띠에 「숨긴 행 N개」(툴팁 "내가 숨긴 행이에요(다른 사용자·급여 반영에는 영향 없음)") + 모두 표시 | [[HBHR106_데이터 메뉴]] 필터 초기화 · [[HBHR104_보기 메뉴]] 숨긴 행 모두 표시 | 신규 (8aecd9c5 #881) |
| ㄴ70-F1 | 필터 축소 시 스크롤 보정 | - | • 시트를 아래로 스크롤한 채 열 필터·검색으로 행이 줄면 가상 스크롤 창을 마지막 페이지 안으로 당기고(스페이서 합 = 행 수 × 행 높이), 렌더 직후 scrollTop을 새 끝에 맞춤(clampScrollToContent, 자리 복원 중 제외) — 종전: 스크롤이 옛 자리에 남아 화면 하단이 비던 버그 | ㄴ70-F · 가상 스크롤 그리드 | 신규 (c4fd9a2d, #1066, MED-936) |
| ㄴ70-P | 행 페이징 결정적 정렬·중복 제거 | - | • 행 500건 초과 시트의 페이지 조회에 유일한 3차 정렬 키 id를 더해 순서를 결정적으로 만들고, 클라이언트 페이지 병합은 rowId로 중복을 걷어내며 다음 offset은 받은 건수로 셈 — 종전: 자동 채움 행은 sortOrder·createdAt이 전부 같아 동점 정렬 + OFFSET 페이징에서 같은 행이 두 페이지에 실리고 다른 행은 빠짐(운영 「출퇴근 내역 전체」 4,641행 중 고유 3,519 실측) | 데이터 그리드(70) 페이징 | 신규 (94f83b0e, #1044, MED-899) |
| ㄴ70-R | 행 컨텍스트 메뉴 (다중 선택 대상) | Menu | • 행 번호(#) 열·데이터 셀 우클릭으로 여는 행 컨텍스트 메뉴. 여러 행을 선택한 뒤 우클릭해도 행 삭제·보호가 한 행만 처리되던 결함을 수정하고, 대상 판정을 엑셀 규칙으로 통일 • 우클릭 시: 대상 행 결정 → 메뉴 노출 - CASE01 [선택 영역 안에서 우클릭]: 선택 유지 + 선택된 행 전부가 삭제·보호 대상. 메뉴 상단 안내 원문 "{N}개 행 선택됨 — 삭제·보호는 선택한 행 전체에, 행 추가는 우클릭한 행에 적용돼요" - CASE02 [선택 영역 밖에서 우클릭]: 그 셀로 선택이 옮겨가고 대상은 1행 - CASE03 [대상 2행 이상]: 라벨이 「선택한 {N}개 행 삭제」 · 「선택한 {N}개 행 보호」(우클릭한 행이 보호 상태면 「선택한 {N}개 행 보호 해제」 — 방향은 우클릭한 행이 정함). 한 행에만 뜻이 있는 항목(직원 정보 수정 · 근태 기록 확인하기 · 행 정보 보기 · 셀 설정 · 메모 보기·추가 · 급여 확정·확정 취소 · 행 취소 · 행 삭제(레코드))은 숨기지 않고 :disabled + 사유 title 원문 "여러 행을 선택한 상태에서는 쓸 수 없어요"- 행 추가(위·아래)는 1행 단위라 우클릭한 행 기준 유지, 합계·치료(일별) 같은 합성 행은 대상에서 제외 • 여러 행 삭제·보호 실행 시: 확인 1회 + 다시 읽기 1회로 처리하고 실패·건너뜀 건수를 한 번에 안내(자동 행은 서버가 거부, 저장 안 된 행은 보호에서 건너뜀) | 70 데이터 그리드 · [[HBHR103_편집 메뉴·단축키]] 행 메뉴 · [[HBHR109_행 정보 패널·검색]] 행 정보 · 56 셀 상세 레일 | 수정 (코드 반영: 4d75d89, #868 — MED-705) · 라이브 실사 확인(2026-09-25): 3행 선택 후 우클릭 → 메뉴 상단 안내 원문 "3개 행 선택됨 — 삭제·보호는 선택한 행 전체에, 행 추가는 우클릭한 행에 적용돼요" + 「선택한 3개 행 보호」·「선택한 3개 행 삭제」 라벨 실측(CASE01·03). 단일 행 메뉴 항목 실측: 직원 정보 수정 / 근태 기록 확인하기 / 행 정보 보기 / 급여 확정 / 위에 행 추가 / 아래에 행 추가 / 행 취소 / 행 삭제 (레코드) / 이 행 보호 / 이 행 삭제 |
| ㄴ70-RS | 예약 변경… / 계약 시행일 변경… (행·셀 메뉴) | MenuItem | • 데이터 칸 우클릭 「예약 변경…」 — title "고른 달의 시트부터 이 칸 값을 바꾸도록 예약해요. 그 전달 시트는 그대로예요." 클릭 → 셀 예약 변경 모달(시행월·값·메모 + 이 시트의 예약 목록) • 행 우클릭 「계약 시행일 변경…」 — title "정해진 날부터 기본급·계약 조건이 바뀌도록 예약해요. 그 전달 시트 값은 그대로예요." 클릭 → 계약 시행일 변경 모달(시행일·바꿀 값·메모 + 이 직원의 예약 목록) - CASE01 [노출 조건]: 예약 변경 = 키(slug)가 있는 시트의 데이터 칸(행 번호 칸 제외) · 계약 시행일 변경 = 직원이 매핑된 행 + 계약(계약급여내역)·직원 기준 시트(직원 마스터·급여대장), 날짜 기준 시트 미노출 - CASE02 [여러 행 선택]: 비활성 + title "여러 행을 선택한 상태에서는 쓸 수 없어요" • (10/8, #1084, MED-827) 예약 창 목록 개편: 셀 예약 변경 모달의 목록을 진행 중(예약됨·확인 대기·실패)만 받아 두 묶음으로 나눔 — "이 칸에 걸린 예약 {N}건"(직원 행은 같은 직원·같은 열, 직원 없는 상시 시트 행은 같은 행·열) / "이 시트의 다른 진행 중 예약 {N}건"(종전 단일 "이 시트의 예약 변경") - 빈 묶음: "이 칸에 걸린 예약이 없어요." / "다른 칸의 진행 중 예약이 없어요." - "모든 예약 보기"(밑줄 글자 버튼, 「이 칸」 묶음 머리) → 관리자 「예약된 변경」 화면을 이 시트로 좁혀 엶. 계약 시행일 변경 모달의 같은 버튼은 이 직원으로 좁혀 엶. 끝난 예약 이력은 그 화면에서 봄 - CASE03 [시트를 단독으로 연 경우(관리자 임베드 아님)]: "모든 예약 보기" 비노출 - 같은 칸·같은 달 예약은 서버가 만들 때 막음: "같은 칸·같은 달({YYYY-MM})의 예약이 이미 있어요. 「예약된 변경」에서 기존 예약을 확인하고, 바꾸려면 기존 예약을 취소한 뒤 다시 만들어 주세요." | ㄴ70-R · 신규 모달(사양서 미작성 — 채번 대기) · [[HBHR210_계약급여내역 시트]] · scheduled_actions | 신규 (14c13f52 #974, MED-825 · a0298fde #962, MED-821) · 모달 목록의 「검사」(dry-run, fca2c067 #976)·「승인」(AI 제안, 85812e19 #983) 버튼은 모달 문서 몫 · 라이브 실사 확인(10/2): 셀 우클릭 메뉴에 「예약 변경…」 존재(DOM) · TBU: 메뉴 내 위치·「계약 시행일 변경…」·모달 내부 · 목록 두 묶음·「모든 예약 보기」(bee96793 · 서버 중복 차단 3d441c2e, #1084) — 코드 근거, TBU: 라이브 실사 |
| ㄴㄴ70-RS1 | 확인 뒤 적용 대기 — 예약 목록 「승인」 | Button | • 조직 설정 「확인 뒤 적용」이면 시행월에 바로 쓰지 않고 확인 대기(변경 세트)로 남음 — 예약 목록(셀 예약 변경 모달)의 「승인」 또는 히스토리 적용으로 적용 • 「승인」 클릭 → 컨펌 "이 예약을 승인할까요? 확인 대기 중인 변경은 지금 내 권한으로 시트에 적용되고, AI 제안은 시행월에 적용돼요." → 확인 대기 변경 = 승인자 권한으로 즉시 적용·예약 「적용됨」 / AI 제안 = 예약됨 | ㄴ70-RS · ㄴ64H · ㄴ70-AI-F · admin 「예약된 변경」(사양서 없음) | 수정 (30fe6180, #1021 — MED-825 QA) · 종전: 변경 세트가 붙은 대기는 「승인」 불가("이 예약은 변경 세트 카드에서 적용해 주세요.") · TBU: 모달 내부·라이브 실사 |
| ㄴ70-AI | 시트 어시스턴트 | Widget | • 시트 화면에 마운트되는 AI 위젯(「시트 어시스턴트」). 워크북이 **활성 시트의 구조·상태·선택 영역(값 없이 키만)**을 컨텍스트로 전달 - CASE01 [조직 모듈 OFF]: 위젯 비노출( settings.ai.modules.sheet.enabled)- CASE02 [한도 초과]: 서버 거절 문구 노출 • 읽기 전용 도구 8종만 사용, 호출자 권한으로 payroll:read + 시트별 공유·grant 재검사• 시트를 직접 바꾸는 도구는 두지 않는다 — 편집은 어시스턴트가 변경 세트로 제안하고 사용자가 카드에서 승인해야 서버가 적용한다(70-AI-A) • 시트 임베드 중에는 관리자 패널 자기 AI 위젯이 숨되, 시트 어시스턴트 FAB은 남는다(70-AI-E) | [[HBAD110_AI 어시스턴트]] · [[HBAD100_App Shell·사이드바]] · 70-AI-A 변경 세트 | 신설 (코드 반영: 1cfa01e #810 · 4829289 #812 · 18f766b #815) · 제안형 편집 도구 추가(2204a6b #821) · TBU: 라이브 실사 이월 |
| ㄴ70-AI-A | 변경 세트 (제안 → 미리보기 → 적용 → 되돌리기) | - | • 시트 대량 편집을 곧바로 반영하지 않고 변경 세트로 묶어 「제안 → 미리보기 → 승인 → 적용 → 되돌리기」 순서로 처리하는 기능. 시트 셀 변경에 서버측 이력이 처음 생긴다(그전에는 클라이언트 실행취소뿐) • 변경 세트 종류: 셀 값(cells) / 행 추가(rows) / 열 레이아웃(layout, 70-AI-C) / 업로드 임포트(import, ㄴ25-U) • 각 세트는 상태 · 요약 · 영향(행·셀·열 합계 전→후 + 차이 목록 최대 50건) · 위험(급여 반영 대상 열 · 잠금 · 퇴직자 포함 · 100행 초과) · 적용 직전 원본 스냅샷 · 출처(AI/직접)를 갖는다. 사람이 직접 한 대량 편집도 같은 이력에 출처만 달리해 기록된다 • 제안 시 게이트: 편집 권한·보호·열 종류를 검사 — 보호 시트는 제안 단계에서 차단, 다른 화면으로 값이 돌아가는 연동 열은 거절 • 적용 시: 같은 게이트를 다시 검사 → 원본 스냅샷 저장 → 셀 저장(일반 편집과 동일 경로). 위험 배지가 붙은 세트는 확인 체크 없이는 적용 불가(2차 확인) • 어시스턴트 제안 도구: 조건(팀·재직 여부·열 조건·선택 행)과 매핑표로 셀 값 일괄 수정 제안 · 행 추가 제안. 모델은 조건만 내고 대상 행은 서버가 확정한다 - CASE01 [되돌리기]: 스냅샷으로 복원. 단, 적용 이후 사람이 다시 바꾼 셀은 충돌로 남겨 덮어쓰지 않는다 - CASE02 [적용·되돌리기 직후]: 워크북 재로딩 + 실행취소 스택 초기화 + 「되돌리기」 토스트 | 70-AI 시트 어시스턴트 · 70-AI-B 변경 세트 카드 · 64E 히스토리 드로어 · 50 시트 헤더(최근 변경 칩) · 58 실행취소/재실행 · 61 반영 버튼 | 신설 (코드 반영: 2204a6b, #821) · 서버측 셀 변경 이력 최초 도입 · TBU: 라이브 실사 이월 |
| ㄴ70-AI-B | 변경 세트 카드 | Widget | • 어시스턴트 답변에 붙는 변경 세트 카드. 구성 = 상태 · 요약 · 영향 · 위험 배지 · 합계 표(전→후) · 차이 목록 · 확인 체크 · [적용] [취소] [되돌리기] 버튼 · 문제 신고(신고 시 해당 변경 세트 식별자 첨부) • 만들어진 변경 세트는 답변 메시지에 연결되어 대화를 다시 열어도 카드가 그대로 보인다 - CASE01 [위험 배지 있음]: 확인 체크 전에는 [적용] 불가 - CASE02 [대화 기록에서 되살린 카드]: 서버에서 받은 카드도 [적용]·[취소]·[되돌리기] 버튼이 정상 활성된다 — 처음부터 비활성으로 붙던 문제 수정(2026-09-22 QA) | 70-AI-A 변경 세트 · [[HBAD110_AI 어시스턴트]] | 신설 (코드 반영: 2204a6b #821) · 서버 복원 카드 버튼 비활성 수정(c51d76d, #824) · TBU: 라이브 실사 이월 |
| ㄴ70-AI-C | 열 레이아웃 변경 제안 | - | • 어시스턴트가 열 추가 · 수정 · 삭제 · 이동 · 수식 열을 레이아웃 변경 세트로 제안하고, 사용자가 카드에서 적용·되돌리기 하는 기능 • 제안과 적용이 같은 계획기를 거쳐 같은 검사를 받고, 제안 때 정한 열 키를 그대로 적용에 사용해 제안과 결과가 어긋나지 않는다 • 시트가 기존 템플릿과 맞으면 추천 템플릿 경로를 함께 안내한다 • 선택지 동반·형식 diff 표시(10/7, #1038, MED-885): 도구 스키마에 selectOptions — 선택(select)·다중 선택(multiselect) 열 제안에 선택지가 담기고, 계획기는 선택 열에 선택지가 없으면 제안을 거절(다중 선택은 format에도 거울 기록). diff 설명에 표시 형식과 선택지 표기(종전: literal → literal로만 보이고 적용 뒤 고를 것 없는 열이 되던 버그). 프롬프트 sheet-explain-v10 - CASE01 [도구 호출이 여러 턴 이어지는 대화]: 어시스턴트 응답 제한 시간을 따로 두어 도중에 끊기지 않는다 - CASE02 [수식만 바꾸는 변경]: 수식이 있는 열은 열 종류를 「ƒ 수식」으로 유지한다(열 추가·수정 공통). 레이아웃 변경 세트가 수식만 고치는 수정에서 열 종류를 수식 → 값으로 뒤집던 결함 수정이며, 이미 뒤집힌 열은 적용된 변경 세트 스냅샷으로 자동 복구하되 사람이 손으로 고친 열은 그대로 둔다 | 70-AI-A 변경 세트 · 71 열 헤더 메뉴 · ㄴ71-A 열 설정 「종류」 · 64D 사용 중 구조 잠금 · [[HBHR107_컬럼 헤더 컨트롤]] | 신설 (코드 반영: cdc6685, #822) · 수식 열 종류 뒤집힘 수정(73f8bfc, #872 — CS-OKBEST-260923-0005) · TBU: 라이브 실사 이월 |
| ㄴ70-AI-D | 급여 정산 도구 · 단계 그라운딩 | - | • 시트 어시스턴트에 급여 정산 도구 5종을 추가: ① 급여 정산 진행 상태 조회 ② 아직 반영되지 않은 시트 목록 ③ 급여대장 셀 값의 출처 설명 ④ 계산 과정 설명 ⑤ 이상 징후 탐지 • 어시스턴트 프롬프트에 7단계 정산 모델과 각 단계의 버튼 위치를 그라운딩해, 답변이 실제 화면 동선을 가리키도록 한다 • 급여대장 값의 출처는 수당·공제 기록의 원본/대상 정보를 직접 읽어 설명한다 - CASE01 [실행 요청]: 반영·확정·발송·내보내기를 실행하는 도구는 두지 않는다 — 어시스턴트는 설명·탐지까지만 하고 실행은 사용자가 화면에서 수행 | 70-AI 시트 어시스턴트 · 61 반영 버튼 · [[HBHR200_급여대장 시트]] · [[HBHR201_전체 확정 (commit)]] | 신설 (코드 반영: b590afa, #827) · 읽기·설명 전용 · TBU: 라이브 실사 이월 |
| ㄴ70-AI-E | 관리자 패널 임베드 FAB 노출 | Button | • 관리자 패널 「급여 관리 › 시트」(시트 화면을 iframe으로 끼워 넣는 화면)에서 시트 어시스턴트(반짝이) FAB이 보이지 않던 문제를 해소. 임베드 화면에서는 시트 쪽 AI FAB을 화면을 맡는 어시스턴트 예외로 두어 숨김 대상에서 제외한다(관리자 패널 자기 AI 위젯은 계속 숨김 — 진입점이 하나도 없던 상태 해소) - CASE01 [도크로 열기]: iframe 안에서 어시스턴트를 도크로 열면 도크 폭을 부모(관리자 패널)에 알려 관리자 패널 채팅 FAB이 좌측 레일 폭과 합산해 비킨다 | 70-AI 시트 어시스턴트 · [[HBAD100_App Shell·사이드바]] · [[HBAD110_AI 어시스턴트]] | 수정 (코드 반영: 9d73c12, #853) · CS-OKBEST-260922-0002 QA 재검증 · 배경: 2026-09-04 도크 작업 + #850이 서로 상대가 그린다고 가정 · TBU: 라이브 실사 이월 |
| ㄴ70-AI-F | 예약 변경 제안 (AI → 사람 승인) | - | • 「OO 다음 달부터 기본급 300만원」처럼 특정 날부터 바뀌는 값을 말하면 어시스턴트가 열 종류로 경로를 갈라 예약 변경을 제안(항상 확인 대기 · AI 제안). 사람이 예약 목록의 「승인」(title "제안을 예약으로 바꿔요(시행월이 왔으면 바로 적용)")을 눌러야 예약됨 - CASE01 [계약 식별 열(기본급·시급 등)]: 계약 시행일 변경 제안 · CASE02 [손 입력 열]: 칸 예약 제안 - CASE03 [수식·집계 열]: 예약 대신 수식 제안(PERIODEND) · CASE04 [상시 시트]: 새 버전 안내 · CASE05 [원천 기록 열·지난달]: 거절 | ㄴ70-AI · ㄴ70-RS 예약 메뉴 · [[HBAD110_AI 어시스턴트]] · admin 「예약된 변경」 | 신규 (85812e19 #983, MED-828) · 제안 직후 dry-run 영향·확인 사유를 답변에 포함 · 시트 모듈 턴만(직원 앱 AI 제외) · TBU: 라이브 실사 |
| ㄴ70-AI-G | 붙여넣기 첨부 칩 (표·긴 글) | Chip | • 입력줄에 표(시트·엑셀 복사)나 긴 글(1,500자·8줄 이상)을 붙여 넣으면 입력줄에 풀지 않고 입력줄 위 첨부 칩으로 받음. 칩 = 「붙여넣기」 + "표 {N}행 × {M}열 · {시트 이름}"(긴 글은 "텍스트 {N}자", 상한 초과 시 " (잘림)") + 미리보기 3행 + 제거(title "첨부 제거") • 우리 시트에서 복사한 표는 열 이름·시트 이름까지 붙음. 첨부만으로도 전송 가능(placeholder "첨부에 대해 물어보세요 (비워도 전송돼요)") - CASE01 [짧은 한 줄]: 종전대로 입력줄 · CASE02 [응답 done 미수신]: 4초마다 저장된 답변을 찾아 복원(실패 말풍선 대신) | ㄴ70-AI · [[HBAD110_AI 어시스턴트]](공용 위젯) | 신규 (70d9a7df #1005, MED-859 · MED-861) · 상한 300행 × 60열 · 셀 500자 · 텍스트 30,000자 · TBU: 라이브 실사 |
| ㄴ70-AI-H | 시트 위치 안내 (기능 바로가기 · 열 위치) | - | • (10/8, #1043) 시트 어시스턴트의 「기능 바로가기」·답변 속 「화면에서 위치 보기」([[HBAD110_AI 어시스턴트]] 35·ㄴ36·ㄴ76)로 시트 안 위치를 짚어 주는 기능. 관리자 패널 안에 임베드된 시트에서도 시트 자신의 어시스턴트가 안내 • 등록 기능 4종 → 강조 대상(제목 / 설명 원문) - "인사 시트 화면 구성": 시트 영역 / "이 영역에서 시트 정보를 확인하세요." - "인사 시트 필터·정렬·찾기": 툴바 필터 버튼 "필터 만들기" / "이 버튼에서 열 필터 단추 표시를 켜거나 끌 수 있어요." — 좁은 툴바라 더보기 판으로 들어가 있으면 더보기 메뉴를 먼저 엶 - "인사 시트 셀 편집·서식": 표 / "이 표에서 수정할 셀을 선택하세요." - "인사 시트 작업 상태 변경"(상태 배지는 가리키지 않음): CASE01 [설정 중] "설정 완료" / "이 버튼에서 설정 완료 내용을 확인할 수 있어요." · CASE02 [사용 중] 파일 메뉴를 열고 작업 완료·재설정 항목 "파일 · 시트 상태 변경" / "작업 완료 또는 시트 재설정 항목을 선택하세요." · CASE03 [작업 완료] "사용 중으로 변경" / "이 버튼으로 사용 중 상태로 되돌릴 수 있어요." • 열 위치: 저장된 열 ID를 서버가 재확인 → 고정 열 폭을 빼고 가로 스크롤 → 열 머리글 강조(제목 = 열 이름, "이 열의 내용을 확인하세요.") • 메뉴만 열고 필터 적용·상태 변경·셀 값 변경은 실행하지 않음 — 사용자가 직접 누름 - 거절: [시트·기간 바뀜] "시트나 기간이 바뀌었어요. 현재 시트에서 다시 선택해 주세요." · [셀 편집·수식바 입력·저장 중·새 행 작성 중] "셀 편집과 저장을 마친 뒤 다시 선택해 주세요." · [열 숨김·삭제] "열이 숨겨졌거나 삭제되었어요. 목록을 다시 열어 주세요." · [그리드 준비 전] "시트가 아직 준비되지 않았어요. 잠시 후 다시 선택해 주세요." · [상태 변경 안내인데 설정 관리 권한 없음] "시트 설정을 관리할 권한이 없어요. 목록을 다시 열어 주세요." · [시트 미열림] "먼저 안내받을 시트를 열어 주세요." - 안내 도중 시트 상태·설정 관리 권한이 바뀌면 표시 중단 | ㄴ70-AI · 50 툴바 · 64 수명주기 · [[HBAD110_AI 어시스턴트]] ㄴ77·ㄴ78 · workbook/ai-context.ts navigateGuidance | 신설(#1043) · 동작 노트(9b5c1908, #1082): 시트 최초 로드 때 초기화 구문이 등록한 이동 함수를 인자 없이 한 번 자동 호출해 콘솔 오류가 나던 결함 수정 — 사용자가 위치 안내를 고를 때만 실행 · 범위: 저장된 열 정의 최대 200개(자동 생성 기본 열·동적 치료 항목 열 제외) · TBU: 라이브 실사 |
| ㄴ71 | 열 헤더 메뉴 | Menu | • 열 헤더 우클릭·컨트롤로 여는 메뉴. "열 설정"을 메뉴 최상단으로 이동하고 설명 줄 "열 종류와 형식, 급여 반영 대상을 설정합니다"를 붙였다(반영 대상 지정 = 반영 버튼 활성 전제). 열 우클릭 시 해당 열이 선택되도록 변경해 메뉴 대상과 화면 선택을 일치시킴. 메뉴에 조건부 서식 진입을 추가(74 규칙 모달) • "열 설정" 클릭 시: 열 종류 에디터 열림(열 종류·형식·대상 급여대장 항목 지정) • "조건부 서식" 클릭 시: 규칙 모달 오픈(74) - CASE-E [중복 컬럼 키 저장 시도]: 서버가 columnLayout 저장(생성/수정/템플릿 저장 5개 경로 공통)을 거부 — 오류 문구 "컬럼 키가 중복되었어요: {키 목록} — 같은 키의 열은 시트에 하나만 있을 수 있어요." (중복 키 유입 시 Alpine x-for 키 충돌로 헤더가 조용히 사라지는 렌더 붕괴 재발 방지) | 61 반영 버튼(대상 지정) · 74 조건부 서식 규칙 모달 · [[HBHR107_컬럼 헤더 컨트롤]] 상세 | 신규 (코드 반영: aed8800) · "열 설정" 최상단 이동 + 설명 줄 · 우클릭 열 선택 · 조건부 서식 진입 추가(7be8937) · 헤더/행 컨텍스트 메뉴는 실측 렌더 크기 기준으로 뷰포트 안에 열림(넘침 방지, d2f9157) · 중복 키 서버 검증(91782a7 — 문구는 코드 확정값, 재현에 저장 실행이 필요해 라이브 실사 생략) · 메뉴 항목 「열 북마크 / 북마크 해제」 추가(8284d800 #982 — [[HBHR107_컬럼 헤더 컨트롤]] 30) |
| 72 | 수식 적용 범위 하단 바 | - | • 셀 수식 편집 중 화면 하단에 상시 노출되는 적용 범위 바(formula-scope-bar). 기존 범위 선택 팝업을 제거하고, 엑셀 관습에 맞춰 Enter = 이 셀만 · Shift+Enter = 열 전체 두 경로를 키로 제공(기존 안내 배지 제거). 같은 두 경로를 바의 [이 셀만] · [열 전체] 버튼으로도 제공 • 셀 수식 편집 진입 시: 하단 바 노출 → Enter/Shift+Enter 또는 바 버튼으로 적용 범위 선택 - 사용 중 시트 바 원문: 좌측 안내 "Enter → 이 셀만 적용 (사용 중에는 열 전체 적용 불가)" / 버튼 이 셀만 적용 · [Shift+Enter 전체 열에 적용 🔒](사용 중 시트에서 잠금/비활성) - CASE01 [사용 중 시트]: Shift+Enter(열 전체)도 [이 셀만]으로 처리하고, 적용 전 수정 사유 입력을 요구 → 입력 값을 셀 메모로 저장(마커·호버·이력 재사용) - CASE02 [메모 저장 실패]: 수식 적용은 유지 + 실패 토스트 안내 | 56 셀 상세 레일(메모) · 64D 사용 중 구조 잠금 · sheet_cells 메모 | 신규 (코드 반영: 5f00544 — 2026-08-10 확정 · UP-008 F4) · 범위 선택 팝업 제거 · Enter/Shift+Enter 관습 · 8/17 라이브 실사: 바 안내·버튼 원문 확정 |
| 73 | 하단 합계행 | Cell | • 컬럼별 "∑" 합계 + "{n}명" 카운트를 표시하는 전 시트 공통 합계행 - CASE01 [값 0]: 0 표기 | 집계(∑) [[HBHR107_컬럼 헤더 컨트롤]] 참조 | 전 시트 공통 |
| 74 | 조건부 서식 규칙 모달 | Modal | • 열 헤더 우클릭 "🎨 조건부 서식"(71)으로 여는 규칙 모달. 셀 값 조건 + 색 프리셋 + 대상 셀 미리보기로 규칙을 구성하며, 값 조건 외에 수식 평가 조건도 지원한다. 모달 원문: 제목 "조건부 서식 — {열명}" / 설명 "조건에 맞는 셀이 스스로 색을 바꿔요. 규칙은 시트에 저장되고, 칩에서 켜고 끌 수 있어요." / 조건 옵션 = 다음보다 큼 / 다음보다 작음 / 같음 / 같지 않음 / 비어 있음 / 수식이 참일 때 / 값 입력 "값 또는 [열키]" + 힌트 "고정값(100000) 또는 다른 컬럼 참조([지급총액])를 넣을 수 있어요." / 색 프리셋 4종(무색·노랑·초록·파랑 등) + "굵게" 체크 / 미리보기 "값 — 현재 {n}개 셀 해당" / 버튼 [취소] [규칙 저장] • 규칙 설정 시: 조건(값/수식) + 색 선택 → 대상 셀 미리보기로 확인 - CASE01 [값 조건]: 다음보다 큼/작음/같음/같지 않음/비어 있음 등 셀 값 비교 - CASE02 [수식 조건]: "수식이 참일 때" — 수식 평가 결과로 서식 적용 | 71 열 헤더 메뉴 · [[HBHR107_컬럼 헤더 컨트롤]] | 신규 (코드 반영: 7be8937 — UP-007) · 값/수식 조건 + 색 프리셋 + 미리보기 · 8/17 라이브 실사: 모달 원문·조건 옵션·색 프리셋 확정 |
| 75 | 수식 함수 신설·IFERROR 감싸기 | - | • 수식 함수 3종 신설: IFERROR / SUMIF / COUNTIF(fx 가이드·자동완성 등록). 헤더 수식 편집기·수식바에 「IFERROR로 감싸기」 버튼을 제공해 현재 수식을 IFERROR로 한 번에 감싼다. 수식바 우측 끝 버튼 원문 "🛡 IFERROR", 툴팁 "현재 수식을 IFERROR(수식, 0)로 감싸요 — 참조 미해결·0 나눗셈 같은 오류를 담당자가 정한 값으로 통제해요" • "IFERROR로 감싸기" 클릭 시: 현재 수식을 IFERROR(…)로 래핑 - CASE01 [이미 IFERROR로 감싸짐]: 버튼 비활성(disabled) | 71 열 헤더 메뉴(헤더 수식 편집기) · 60 수식바 · fx 가이드·자동완성 | 신규 (코드 반영: 2a18a41 — UP-006) · 함수 3종 등록 · IFERROR 감싸기 버튼 · 8/17 라이브 실사: 버튼·툴팁 원문 확정 |
| ㄴ75A | 불리언 리터럴 (TRUE/FALSE) | - | • 수식에서 불리언 리터럴 TRUE / FALSE를 지원(맨 표기·함수형 TRUE()/FALSE() 둘 다). 내부 표현은 1/0으로, 기존 비교·논리(AND/OR/NOT) 연산자 결과와 동일한 표현이다. 수식 도구(fx) 카탈로그에 TRUE/FALSE 항목 등재. fx 팝오버 함수 카탈로그 원문: TODAY() DAY MONTH YEAR EOMONTH IF(c,t,e) ROUND ROUNDUP ROUNDDOWN FLOOR CEILING ABS MIN MAX SUM AVERAGE COUNT AND OR NOT TRUE FALSE IFERROR SUMIF COUNTIF SUMIFS COUNTIFS / 안내 "함수를 누르면 설명이 아래에 펼쳐져요. 읽어 보고 「함수 입력」으로 넣으세요." / 하단 "상수 (단가)" + [관리] • 수식 입력 시: TRUE→1 / FALSE→0으로 평가. 열 표시 형식 「불리언」(63A)과 결합 시 True/False 텍스트로 표시 | 63A 불리언 표시 형식 · 75 수식 함수 · fx 카탈로그 | 신규 (코드 반영: 90bc68f) · 맨 표기·함수형 · fx 카탈로그 등재 · 8/17 라이브 실사: fx 팝오버 함수 카탈로그·상수(단가) 관리 원문 확정 |
| ㄴ75B | 엑셀식 비교 연산자 (=/<>) | - | • 수식 본식에서 엑셀 관습의 단일 등호 =([A]=[B])와 부등호 <>를 허용. 토크나이저가 내부 ==/!=로 정규화하며, 기존 ==/!= 표기도 그대로 동작한다. SUMIF/COUNTIF 조건 문자열 파서가 이미 두 표기를 받고 있어 같은 시트 안 문법이 통일됨- CASE01 [ =/<> 입력]: 내부 ==/!=로 정규화해 평가 | 75 수식 함수(SUMIF/COUNTIF) · 79 수식 순환 감지 · 수식 엔진 | 신규 (코드 반영: b862772 — QA-55) · =/<> 허용·내부 ==/!= 정규화 · SUMIF/COUNTIF와 문법 통일 |
| ㄴ75C | 기간 함수·문자열 비교·TODAY 시간대 | - | • 함수 신설: PERIODSTART()("이 시트 달의 첫날 — 지난달을 다시 열어도 그 달 기준") · PERIODEND()("이 시트 달의 말일 — 근속·기한 판정의 기준일") · DATEDIF(s, e, 단위)("두 날짜 사이 꽉 찬 연("Y")·월("M")·일("D") 수") • 문자열 리터럴 "…" 비교 가능(예: [상태]="재직"), TODAY()는 조직 시간대 기준- 상시 시트: 오늘이 속한 달 기준 | ㄴ75A fx 카탈로그 · 75 수식 함수 | 신규 (d5aa87d9 #956) · 예시 원문 =DATEDIF([입사일], PERIODEND(), "Y") |
| ㄴ75D | ROUND 반올림 방식 (엑셀 일치) | - | • 수식 함수 ROUND의 반올림을 은행가 반올림(half-to-even, 2.5→2)에서 엑셀과 같은 half away from zero(2.5→3, −2.5→−3, ROUND(125, -1)→130)로 변경. ROUNDUP·ROUNDDOWN은 종전부터 엑셀과 동일• 배경: 병원 급여는 엑셀 대조가 검증 기준 — OFF 수당 =ROUND(일급 × OFF일 × 1.5, -1)처럼 정확히 5로 끝나는 값에서 엑셀은 올리고 종전 구현은 짝수 쪽으로 내려 10원이 달랐고(MED-103 남은 이슈 ⑤), 병원에는 "계산이 틀렸다"로 보임• 배포 전 영향 리포트: 같은 기간 시트를 두 방식으로 각각 해석해 ROUND 수식 셀의 값 차이를 셀 단위로 세는 읽기 전용 스크립트 동봉 | 75 수식 함수 · ㄴ75A fx 카탈로그 | 수정 (코드 반영: 33ab86f9, #901) · half away from zero 통일 |
| ㄴ75E | 함수 신설 QUOTIENT · WEEKDAY · ISHOLIDAY | - | • fx 카탈로그 신설: QUOTIENT(분자, 분모)("나눗셈의 몫 — QUOTIENT(분자, 분모)" — 정수 부분만, 0 방향 버림, 분모 0이면 0) · WEEKDAY(날짜, [유형])("날짜의 요일 번호 — 일=1 … 토=7 (유형 2는 월=1 … 일=7)", 유형 3 = 월=0…일=6) · ISHOLIDAY(날짜)("조직 휴일이면 1 — 공휴일·대체공휴일·병원 지정 휴일 (주말은 WEEKDAY 로)") • 예시 원문 =QUOTIENT([실적합], [기준값]) * [지급단위] · =IF(WEEKDAY([근무일])=7, [연장시간], 0) · =IF(OR(WEEKDAY([근무일])=1, ISHOLIDAY([근무일])), [연장시간], 0) | ㄴ75A fx 카탈로그 · 75 수식 함수 · 엑셀 가져오기(QUOTIENT 허용) · 70-AI 시트 어시스턴트 | 신규 (845fa997 #1029 MED-880 · 622b6663 #1031 MED-881) · ISHOLIDAY 달력 = 근태·연차와 같은 조직 휴일(국가 공휴일·대체공휴일 − 조직 제외 + 병원 지정 휴일), 토·일 제외 · TBU: 라이브 실사(자동완성·도움말) |
| 76 | 드로어 재편 (요약) | - | • 우측 드로어 중심으로 편집 UI를 재편(PR #528). 요약: ① 열 설정 모달 → 우측 드로어(진입점 6곳) ② 급여 반영 설정 분리 드로어 ③ 행 인스펙터 우측 레일 이관 ④ 상시 수식 바 + fx 팝오버·인수 가이드 ⑤ 선택 영역 합계 배지 "선택 N개 · 합계 · 평균" ⑥ 카테고리 점프바 숨김 처리(a946995) ⑦ 툴팁 소스 목록 가림 수정(d944d1e). 각 구역 상세는 하위 문서에 위임 • 상세 동선은 [[HBHR107_컬럼 헤더 컨트롤]] / [[HBHR109_행 정보 패널·검색]]에 위임 | 56 셀 상세 레일 · 60 수식바 · [[HBHR106_데이터 메뉴]] · [[HBHR107_컬럼 헤더 컨트롤]] · [[HBHR109_행 정보 패널·검색]] | 요약 반영 (PR #528, 8/8 머지) · 상세 위임 · 전면 재작성 별도 예정 · 열 설정 드로어 미저장 변경 확인창에서 [취소] 후 같은 확인이 재차 뜨던 문제 수정(188553a) |
| 77 | 급여대장 생성 진입점 | Button | • 대상 급여대장 시트가 없을 때, 반영 동선에서 급여대장을 새로 생성하는 진입점을 제공하는 기능 • 클릭 시: 급여대장 시트 생성 → 반영 대상으로 연결 | 61 반영 버튼 · [[HBHR200_급여대장]] (추정) | 신규 (코드 반영: 87437af) · 급여대장 부재 시 생성 유도 |
| 78 | 크로스시트 참조 순환 방지 | - | • 시트 간 수식 참조(크로스시트 참조) 시 순환 참조를 방지하는 옵션 | 72 수식 적용 범위 바 · 수식 엔진 | 신규 (코드 반영: 995a0c6) · 순환 참조 방지 옵션 |
| 79 | 수식 순환 감지·저장 차단 | - | • 수식을 저장하기 직전, 크로스시트·동일 시트(자기 자신 포함) 참조를 따라가 편집 중인 열/셀로 되돌아오는 순환 경로가 생기는지 검사해 순환이면 저장을 차단하고 경고를 표시하는 가드. 셀 편집(셀 = 입력·수식바)과 헤더 수식 편집기 양쪽에 적용되며, 순환 검사에 걸리면 입력 초안을 그대로 남긴다. 이미 저장돼 있던 옛 순환은 검사하지 않는다(편집 열/셀을 지나는 경로만 판정)• 저장 시: 순환 검사 → 순환 시 저장 중단 + 경고 팝업 - CASE01 [순환 감지]: 저장 차단 · 경고 팝업 danger 톤 "서로 참조하는 수식이 있어 저장할 수 없어요." + "닫기" 버튼, 입력 초안 유지 | 72 수식 적용 범위 바 · 71 열 헤더 메뉴(헤더 수식 편집기) · 60 수식바 · 78 크로스시트 순환 방지 · 수식 엔진 | 신규 (코드 반영: 471f3db·954fac5 — PR #545 QA-56) · 셀 편집·헤더 수식 편집기 양쪽 적용 · 저장 시점 차단 · 경고 문구(CASE01)는 저장 실행 필요로 8/17 실사 미검증(TBU) |
| 7A | 채우기 핸들 | - | • 셀을 이어서 채우는 채우기 핸들. 마우스 드래그(엑셀식 핸들 드래그)와 단축키 ⌘D(아래로 채우기)/⌘R(오른쪽으로 채우기)이 같은 채우기 로직을 공유해, 값 채우기 규칙(연속 값 감지 등)과 되돌리기 이력이 두 경로에서 동일하게 동작한다 • 드래그 또는 ⌘D/⌘R 시: 채우기 로직 적용(값 규칙·되돌리기 이력 공통) | 58 실행취소/재실행 · [[HBHR103_편집 메뉴·단축키]] 채우기 단축키 · 71 열 헤더 메뉴 | 신규 (코드 반영: 8d38bed — PR #548) · 드래그·단축키 채우기 로직 통일 |
| 70-E | Empty 상태 | - | • 해당 기간 시트 없을 시 빈 상태를 노출해 새 시트 만들기를 유도하는 상태 | [[HBHR101_새 시트 만들기 모달]] 참조 | TBU: Empty 노출 문구 원문 |
단축키 카탈로그 포인터
"단축키" 버튼(ㄴ23)이 여는 도움말 모달은 4카테고리로 구성되며, 전체 카탈로그는 [[HBHR103_편집 메뉴·단축키]]가 소유한다. 워크스페이스는 진입점만 제공 — 아래는 카테고리 요약 포인터이며 상세 항목은 103 참조.
| 카테고리 | 대표 키 (요약) | 상세 |
|---|---|---|
| 탐색 (Navigation) | ↑↓←→ 셀 이동 / Alt+↑↓ 사이드바 시트 전환 / Alt+R 행 정보 / Alt+N 새 시트 | [[HBHR103_편집 메뉴·단축키]] |
| 선택 (Selection) | Shift+클릭 범위 선택 / ⌘+방향키 데이터 끝 이동 · ⌘⇧+방향키 범위 선택 / 우클릭(# 열) 행 메뉴 / ⌘⇧\ 우클릭 메뉴 열기 | [[HBHR103_편집 메뉴·단축키]] |
| 편집 (Editing) | Enter/Tab/Esc / ⌘C·X·V / ⌘⇧V 값만 · ⌘⌥V 서식만 / ⌘D·R 채우기 / ⌘Z·⇧Z | [[HBHR103_편집 메뉴·단축키]] |
| 메뉴·찾기 | Alt+F/E/I/D/V 메뉴 열기 / Alt+/ 메뉴 검색 / ⌘F·H 찾기·바꾸기 / ⌘/ 도움말 토글 | [[HBHR103_편집 메뉴·단축키]] |
※ 수식어 없는 글자 단축키(j·k / "/" / i / ?)는 폐지(#831) — 글자·숫자 키는 선택 셀 편집 시작. 표기는 기기별(맥 ⌘·⌥·⇧ / 윈도우 Ctrl·Alt·Shift)
참조 요약 (하위 문서 트리)
| 구역 | 상세 사양서 |
|---|---|
| 새 시트 만들기 모달 | [[HBHR101_새 시트 만들기 모달]] |
| 파일 메뉴 | [[HBHR102_파일 메뉴]] |
| 편집 메뉴·단축키 (전체 카탈로그) | [[HBHR103_편집 메뉴·단축키]] |
| 보기 메뉴 | [[HBHR104_보기 메뉴]] |
| 삽입 메뉴 | [[HBHR105_삽입 메뉴]] |
| 데이터 메뉴 | [[HBHR106_데이터 메뉴]] |
| 컬럼 헤더 컨트롤 | [[HBHR107_컬럼 헤더 컨트롤]] |
| 좌측 사이드바(폴더/휴지통) · 폴더 관리 모달 | [[HBHR108_폴더·휴지통 사이드바]] |
| 시트 헤더 검색 · 행 정보 · 셀 상세 패널 | [[HBHR109_행 정보 패널·검색]] |
| 시트 유형 화면 | HBHR200 ~ HBHR270 |
권한·상태 분기 요약
| 시나리오 | 트리거 | 결과 | 비고 |
|---|---|---|---|
| CASE01 [미인증 진입] | /hr-system 직접 | /hr-system/signin 리다이렉트 | |
| CASE02 [HR_ADMIN 진입] | 인증 세션 | 최근 시트 /sheets/ | 조건1 [HR_ADMIN] |
| CASE03 [SUPER_ADMIN 진입] | 인증 세션 | 최근 시트 /sheets/ | 조건2 [SUPER_ADMIN] |
| CASE04 [폴더 없음] | folder 값 부재 | "(미분류)" fallback | |
| CASE05 [시트 없음] | sheet_list 0건 | Empty 상태(70-E) | 문구 TBU |
| CASE06 [팀 범위 조회자(팀장)] | payroll:read.team | 팀 행만 표시 + 「팀 범위」 배지(ㄴ50-T) · 히스토리 흐림 · 값 변경 이력 안내만 | #916·#936·#930·#831 |
Open Question
- 최근 작업 시트가 없을 때의 진입 동선 (TBU)
- 계정 버튼(11) 표시 값 (TBU)
- 알림(12) / 댓글(59) / 메모 이력(55) 버튼의 상세 동작 (TBU)
- Empty 상태(70-E) 노출 문구 (TBU)
- 시트 검색(52) 결과 없음 Empty 문구 (TBU)
- 폴더 관리 모달 "+ 새 폴더" 상세 동작·에러 처리 — [[HBHR108_폴더·휴지통 사이드바]] 소유 (TBU)
- 이전 월 가져오기(22) 에러·실패 동작 (TBU)
- 폴더 관리 버튼(24) 에러·실패 동작 (TBU)
- tRPC procedure · 권한 토큰 실제 키 — 현재 전부 추정 네이밍