HBEA110_Shell·탭바·알림
(Hereby) 직원 앱 > Shell·탭바·알림
| 앱 | 직원 앱 (Employee App / ESS, 포트 4002) |
| 대상 사용자 | 조건1 [직원(self scope)] |
| 프로토타입 | TBU |
| 관련 정책 | 상단 고정 바(FIG 정책 fixed-header) · [[POL_권한(RBAC)]] |
| Status | review |
| Owner | 카나 (PM) |
개요
직원 앱 공통 Shell — 상단 fixed header(날짜·알림 종·프로필 아바타) + 하단 4탭 탭바 + 알림 패널. 하단 탭바: "근무" / "메신저" / "결재" / "더보기". 메신저 탭에 미읽음 배지. 알림 패널: 헤더 "알림 (3)" + "모두 읽음" + 알림 항목 리스트. 원천 Notification / NotificationDelivery. 모바일 특성: 상단 fixed header(관찰상 날짜·알림·프로필 3요소, 라이브상 종 배지 포함 4요소로 관찰됨) + 하단 탭바 4탭 + 풀페이지 모달 패턴. 시각 정비(#648): 직원 앱 공용 모달은 모바일 호스트에서 화면 가장자리까지 꽉 차는 표시 변형(full-layer)으로 열리고, 닫기(X)는 제목 줄 안 화면 우측 8px에 서서 2depth 헤더의 뒤로(<) 버튼과 좌우 대칭을 이룬다. 모든 스크롤 화면 끝에 하단 여백을 둬 마지막 카드가 화면·하단 내비 바닥에 붙어 잘려 보이던 문제를 없앴다.
문서 히스토리
| 날짜 | 작성자 | 팀 | 변경 내용 |
|---|---|---|---|
| 2026-07-06 | 카나 | PM | 최초 작성 |
| 2026-07-10 | 카나 | PM | 라이브 기능 검토 반영 |
| 2026-07-13 | 카나 | PM | 버튼 행동 명세 보강 |
| 2026-07-21 | 카나 | PM | GC700 깊이 재작성 + fixed-header 정책 반영 |
| 2026-07-21 | 카나 | PM | 셀 스타일 확정판 적용 (콸 승인) |
| 2026-08-18 | 개발 | DEV | 알림 항목 클릭 딥링크 구현 반영(후순위 → 구현, design/employee-notice) |
| 2026-08-18 | 카나 | 라이브 재검증 정정 | 알림 항목 타임스탬프 라이브 표기 = 날짜만 점표기 "2026. 07. 26."(시각 없음). 기존 "2026.07.04 17:03:29"(시각 포함)는 미현행. 헤더 "알림 (n)"·"모두 읽음"은 미읽음 0건 상태라 미노출(0건 시 조건부 노출로 해석) |
| 2026-08-21 | 카나 | PM | PR #574 딥링크 라이브 실증(dev, 콸 지시 검토): CASE01 — "휴가 신청 접수" 클릭 → 결재 > 휴가신청 탭 정상 착지 / CASE02 — "접근 권한 요청" 클릭 → 다이얼로그 제목 "확인"·본문 "관리자에서 확인해 주세요."(앱이름 볼드)·[확인] 1버튼 원문 그대로 확인. 근거 = 커밋+라이브 이중으로 격상 |
| 2026-09-10 | 개발 | DEV | 시각 정비(#648, design/app-ui-improvements 머지): 공용 모달 full-layer 표시 변형(모바일 호스트 edge-to-edge) 추가, 닫기 X 제목 줄 우측 8px 정렬(2depth 뒤로 버튼 대칭), 모든 스크롤 화면 하단 끝 여백 신설. 근거 = 커밋(b2a82e2·17ccfcf·6101ee4) |
| 2026-09-23 | 카나 | PM | 안드로이드 백버튼이 알림 2depth 화면·불편·오류 신고 팝업을 한 층만 닫도록 수정 반영(4b363ff, PR #849, QA 2026-09-22) — 기존에는 홈 탭에서 앱 종료 확인이 떴음. 커밋 근거, 라이브 실사 이월(TBU) |
| 2026-10-02 | 카나 | PM | 하단 고정 배너(새 버전·버전 확인 실패) 행 추가 — 탭바 보이면 탭바 위 16px, 아니면 바닥 16px로 위치 변경·로그인 버튼 가림 해소(cc823348·3454d65f, #1011) — 커밋 근거, 라이브 실사 이월(TBU) - 카나/PM |
| 2026-10-07 | 카나 | PM | PR #1035 반영(796e116c): 하단 탭바 분리형 캡슐 전환(AI 켠 병원) + 「AI 어시스턴트」 원형 버튼(ㄴ22 신설, 검색 우선 시작 화면·캡슐 입력줄) — AI 화면 상세는 HBEA600(가칭) 신규 채번 제안. 커밋 근거, 라이브 실사 이월(TBU) |
| 2026-10-08 | 카나 | PM | 10/7 머지분 반영 — PR #1083(fd5bf280·920aee91·28b87a1c·d37cb047): 헤더 스크롤 유리·결재·메신저 날짜 줄 0.6배 접힘(ㄴ14) · 하단 내비 리퀴드 글라스·선택 유리 스프링(ㄴ23) · 하단 탭 재탭 = 맨 위 스크롤(ㄴ24) · AI 어시스턴트 화면 오른쪽 슬라이드 인(ㄴ22 보강) · iOS 바닥 여백 22px·상태 표시줄 색 동기화(26) · iOS 왼쪽 가장자리 스와이프 = 뒤로(41) · PR #1090/#1093(ef18fa36·bd9bde77) 조직 「화면 캡처 제한」 민감 화면 보호·스크린샷 토스트(50, 웹 안내막 제거) · PR #1072(MED-940) 안드로이드 시스템 바 인셋 복구·키보드 여백(51). 커밋 근거, 라이브 실사 이월(TBU) |
| 2026-10-08 | 카나 | PM | 낮 스윕 라이브 실사(웹 /employee-app) — 분리형 캡슐 내비(20 CASE01: .ds-bottom-nav--split·4탭+AI 버튼)·선택 유리 .ds-bottom-nav__glow 실재(ㄴ23)·AI 어시스턴트 화면 원문 전체 채록(ㄴ22: 제목·바로가기 5종·입력줄 placeholder·하단 고지) 실증. 실기기 전용 항목(ㄴ14 접힘 체감·26 iOS 여백·41 엣지 스와이프·50 캡처 가림·토스트)은 TBU 유지 |
| 2026-10-09 | 카나 | PM | PR #1120 반영: 그라데이션 유리 헤더·유리 버튼 44 토큰 통일·벨 드롭다운 캡슐 밖(ㄴ14-1 신설). AI 이전 대화 오른쪽 서랍·Enter 보내기 등 AI 화면 몫은 HBEA600 채번 제안 유지(미작성) — 커밋 근거, 모바일 실사 이월 |
| 2026-10-14 | 카나 | PM | ㄴ13 정정 — 헤더 아바타 = 프로필 시트(나에게 채팅·인증/보안 설정·프로필 사진 변경·내 정보·더보기·닫기, 10/14 라이브 실측): 「더보기」 행 신설(#1210 338c8f4)·「인증/보안 설정」 행(#1227 — 화면 자체는 HBEA520(가칭) 채번 제안). ㄴ32 「모두 읽음」 본문 위 줄 → 헤더 오른쪽 글자 버튼(안 읽은 알림 있을 때만, 6f8d869) — 커밋 근거 - 카나/PM |
Data I/O
Server → Client
| 변수 | DB 엔티티.컬럼 | 값 없을 때 | 비고 |
|---|---|---|---|
| $ | 클라이언트 당일 날짜 파생 | 당일값 필수 | "2026년 7월 6일 월" |
| $ | Employee self (이니셜) | 이니셜 fallback | "최" |
| $ | Notification.isRead=false 카운트 | 0(배지 hide) | "알림 (3)" |
| $ | Notification (제목/본문/타임스탬프) | Empty 문구(TBU) | 타임스탬프 "2026. 07. 26." (날짜만·점표기, 시각 없음 — 2026-08-18 정정) |
| $ | ConversationMember.unreadCount | 0 | "메신저 0" |
Client → Server
| 액션 | 전달 값 | tRPC procedure | 권한 토큰 |
|---|---|---|---|
| 모두 읽음 | (없음) | sdk.notification.markAllRead() (추정) | notification:update.self (추정) |
| 탭 전환 | tabKey (근무/메신저/결재/더보기) | (클라이언트 라우팅) | - |
| 알림 항목 클릭 | NotificationEvent.type (→ 목적지) + 알림 id | sdk.notification.markRead(id) + 클라이언트 라우팅 | notification:read.self (추정) |
markAllRead → Notification.isRead=true. 알림 항목 클릭 → 읽음 처리 + 화면 이동(2026-08-18 구현, 이전 FIG 정책 "후순위"). 목적지는 NotificationEvent.type 하나로 결정되며 표는 @hereby/core/constants의 resolveNotificationTarget 단일 정본(알림 목록·공용 알림 벨·서버 푸시 payload가 공유). markAllRead procedure 확정값 = TBU.
외부 통합 (알림 채널·발송)
| 외부 시스템 | 데이터 | 동기/비동기 | 비고 |
|---|---|---|---|
| 푸시(device_tokens) | platform별 푸시 발송 대상 | 비동기 | NotificationDelivery 추적 |
화면 플로우 (Shell 구조)
Shell·탭바·알림 사양표
| 번호 | 항목/기능명 | 타입 | 사양 및 기능 설명 | 연관/영향 범위 | 비고 |
|---|---|---|---|---|---|
| 00 | 화면 진입 조건 | - | 조건1 [직원 인증]. 모든 탭 공통 프레임. 미인증 시 Shell 미노출(로그인 리다이렉트) | ||
| 01 | 초기 상태 | Output | 상단 fixed header 고정 + 하단 탭바 노출 + 근무 탭 활성. 알림 패널 닫힘 | ||
| 10 | 상단 fixed header | - | 날짜 / 알림 / 프로필 요소 | FIG 정책 fixed-header | 정책 3요소 vs 라이브 4요소(종 배지 포함) 차이 → OQ |
| ㄴ11 | 날짜 헤더 | Text | "2026년 7월 6일 월"(당일 날짜·요일). 당일값 필수. 정책: "당일 날짜 표시" | FIG 정책 fixed-header | |
| ㄴ12 | 알림 종 | Button | • 알림 패널을 여닫는 헤더 버튼. self 알림만 노출 • 클릭 → 알림 패널 토글(열기/닫기) - CASE01 [미읽음>0]: 배지 카운트 표시 - CASE02 [미읽음 0]: 배지 hide | Notification | FIG 정책 fixed-header |
| ㄴ12-3 | ㄴ 정책 소재 | - | 정책: "알림 + 처리대기 통합" / "설정" 포함 / 항목 클릭 시 화면 이동(정책상 후순위였으나 2026-08-18 구현) | FIG 정책 fixed-header | 정책 "처리대기 통합"·"설정" 라이브 미관찰 → OQ |
| ㄴ13 | 프로필 아바타 → 프로필 시트 | Button | • 헤더 아바타(이니셜 "최", 값없음 시 이니셜 fallback) 클릭 → 내 프로필 시트(바텀시트) 오픈 — 이름·역할 요약 + 행 메뉴 (2026-10-14 라이브 실측): - 「나에게 채팅」 → 나와의 대화 - 「인증/보안 설정」 → 인증/보안 설정 화면([HBEA520] — 채번 제안, #1227) - 「프로필 사진 변경」 - 「내 정보」 → [[HBEA510_내 정보·근무 설정]] - 「더보기」 → 더보기 탭 1depth (#1210 — 시트에 없는 설정·앱 정보 동선 단축) - 「닫기」 | Employee self · [[HBEA500_더보기]] | 정정: 구 「클릭 = 더보기 이동」 폐기 · 「더보기」 행 신설(338c8f4) · 실측 2026-10-14 |
| ㄴ14 | 헤더 스크롤 유리 · 줄 접힘 | Rule | • (10/8, #1083, fd5bf280·920aee91) 헤더를 화면 흐름에서 띄움(position: absolute) — 본문이 헤더 뒤로 지나감. 스크롤되면(.is-scrolled) 헤더가 하단 캡슐과 같은 유리(흰 반투명 + 뒤 흐림)가 됨(모양 정본을 디자인 시스템으로 이관, 앱은 바탕색 --ds-app-header-surface만 넘김)- CASE01 [결재 · 메신저 (탭 줄 있음)]: collapseOnScroll — 날짜 줄이 스크롤 양의 0.6배로 위로 접혀 다 접히면 탭 줄만 상단 고정. 손을 떼도 스냅 없음, 본문은 손가락과 1배 속도(종전 2배로 튕기던 문제 해소). 메신저는 목록 스크롤로도 판정하고 목록이 유리 탭 줄 뒤로 지나감- CASE02 [근무 · 더보기 (탭 줄 없음)]: 유리만, 접힘 없음 - CASE03 [2depth]: 접힘 끔(뒤로 버튼이 사라지면 안 됨) | AppHeader · [[HBEA400_결재 허브]] 06 · [[HBEA300_메신저]] ㄴ42 | 신설 (#1083) · TBU: 실기기 긴 목록 스크롤 끊김 여부 |
| ㄴ14-1 | 그라데이션 유리 헤더 · 유리 버튼 44 | Rule | • (10/8, #1120, 57275641·33b34e0e) 앱 헤더 유리를 그라데이션 유리층(::before, 흐림 --ds-app-header-blur 4px)으로 개편 — 메신저 대화방·AI 화면은 대화 목록이 헤더 뒤까지 올라감• 뒤로 버튼 = 유리 원, 오른쪽 액션 = 아이콘 유리 캡슐(.ds-app-header__glass). 유리 버튼 36 → 44( --ds-app-header-btn 단일 토큰이 유리 원·캡슐 높이·대화방 검색칸 높이·아바타를 함께 결정), 캡슐 안 아이콘 md→lg(36·글리프 24), 아바타 이니셜 b4→b3• 알림벨 드롭다운 모드는 캡슐 밖(backdrop-filter가 fixed 기준점을 바꿔 어긋나는 것 방지, b24278c4) — 직원 앱의 화면 이동형 벨은 캡슐 안 유지 | DS app-header · [[HBEA300_메신저]] ㄴ44 | 신설 (#1120) · 모바일 전용 — 데스크톱 웹 실사 한계로 커밋 근거(TBU: 모바일 실측) |
| 20 | 하단 탭바 | Tab | • 근무/메신저/결재/더보기 4탭을 전환하는 하단 네비게이션. 활성 탭 하이라이트 • 클릭 → 해당 탭 화면 전환 • 분리형 캡슐 내비 전환(10/7, #1035, 796e116c) — AI를 켠 병원은 탭 4개를 반투명 흐림 캡슐로 띄운 분리형으로 표시(선택 탭 neutral-700 + neutral-75 바탕, 아이콘 20 · 라벨 12, 화면 설정과 무관하게 「기본」 크기 고정, 아래 그라데이션) - CASE01 [AI 켠 병원]: 분리형 캡슐 탭 + 오른쪽 AI 버튼(ㄴ22) - CASE02 [AI 끈 병원]: 예전 한 줄 탭바 그대로 | 4탭 · 분리형 전환 (#1035) · 라이브 실사 확인(2026-10-08 낮, 웹 /employee-app·AI 켠 okbest): body app-nav-split·.ds-bottom-nav--split 분리형 캡슐 + 4탭(근무/메신저/결재/더보기) + 오른쪽 AI 원형 버튼(aria "AI 어시스턴트 열기") 실증 — CASE01 확인 · 실기기 체감(흐림·크기 고정)은 TBU | |
| ㄴ22 | AI 어시스턴트 버튼 (하단 내비) | Button | • (신설 10/7, #1035, 796e116c) 하단 내비 오른쪽에 아이콘만 있는 「AI 어시스턴트」 원형 버튼(BI 패밀리 그라디언트) • 클릭 → AI 어시스턴트 화면: 첫 화면 = BI + "어떤 도움이 필요하세요?" + 업무 바로가기(lightor 버튼, AI를 거치지 않고 기존 화면을 염). 입력 중에는 AI 없이 메뉴를 맞춰 입력줄 위 팝오버로 표시(준비 중 메뉴는 "준비 중"), 예시 질문은 첫 질문 전 입력칸 포커스 때만. 입력줄 = 선 없는 캡슐(포커스 5줄까지, 빠지면 한 줄 말줄임), 제목·이전 대화는 앱 헤더가 담당, 이전 대화 목록에서 뒤로 가면 대화 화면으로 복귀 • (10/8, #1083, 920aee91) AI 어시스턴트 화면이 오른쪽에서 밀려 들어옴( x-depth-page 전환 — 종전 빠져 있었음). 직원 앱 AI 화면에는 기능 안내(「기능 바로가기」·답변 속 「화면에서 위치 보기」) 미연결([[HBEA500_더보기]] ㄴ37-4)• 더보기 목록의 AI 줄은 제거([[HBEA500_더보기]]) | AI 어시스턴트 화면 | 신설 (#1035) · AI 화면 상세 = 신규 채번 제안(HBEA600 가칭) · AI 안내문 프롬프트 employee-app-v3(#1035 49fd31c7) · 라이브 실사 확인(2026-10-08 낮, 웹): AI 버튼 → 화면 전환, 헤더 「뒤로」·「이전 대화」, 제목 "어떤 도움이 필요하세요?", 바로가기 5종 "남은 휴가 · 휴가 신청 · 내 신청 진행 · 근무 기록 · 외근 신청" + 「불편·기능 신고」, 입력줄 placeholder "예: 남은 휴가, 근무 기록, 외근 신청 방법", 하단 고지 원문 "답변은 참고용이에요. 신청·제출은 각 화면에서 직접 해요. 앱이 이상하면 불편·기능 신고로, 동료에게 연락은 메신저로 해요." |
| ㄴ23 | 리퀴드 글라스 · 선택 유리 | Rule | • (10/8, #1083, fd5bf280) 분리형 하단 캡슐 = 흰 66% + 뒤 흐림 20px + 유리 테두리(Apple HIG Materials regular). 선택된 탭 뒤에 「선택 유리」 한 장(.ds-bottom-nav__glow)이 뜸 — 종전 회색 바탕 즉시 교체·움직임 없음• 누름 → 그 탭 0.96으로 눌리고 선택 유리 1.08로 부풂 · 누른 채 끌면 유리가 따라감 · 떼면 **450ms 스프링(넘침 약 6%)**으로 누른 탭까지 이동 • 위치는 offsetLeft 기준(하단 내비 화면 배율 zoom 1.2에서도 맞음). 흐림은 캡슐 한 겹만(저사양 안드로이드 스크롤 끊김 방지) - CASE01 [모션 줄이기 · 투명도 줄이기 접근성 설정]: 설정을 따름 | BottomNav · .ds-bottom-nav--split | 신설 (#1083) · 웹 DOM 실사(2026-10-08 낮): .ds-bottom-nav--split + 선택 유리 .ds-bottom-nav__glow 요소 실재 확인 · TBU: 실기기 체감(흐림·스프링·끌기) |
| ㄴ24 | 하단 탭 재탭 = 맨 위로 | Behavior | • (10/8, #1083, 920aee91) 이미 선택된 하단 탭을 한 번 더 누르면 그 화면이 맨 위로 스크롤 | 20 하단 탭바 | 신설 (#1083) |
| ㄴ21 | 메신저 미읽음 배지 | Badge | • 메신저 탭 미읽음 카운트 배지("메신저 0"), 0 시 hide • 공지 진입은 메신저 > "대화" 상단 "공지 n" 섹션 경유 | ConversationMember.unreadCount · [[HBEA300_메신저]] | |
| 25 | 하단 고정 배너 (새 버전·버전 확인 실패) | Banner | • 앱 하단에 뜨는 업데이트 안내 배너 2종 — 본문 위·버튼 아래 상하 배치 - 새 버전: "새 버전이 준비되었어요" + "버전 {n} · 앱을 재시작하여 적용하세요" · 〔나중에〕/〔재시작〕(적용 실패 시 "업데이트를 적용하지 못했어요. 다시 시도해 주세요." + 〔다시 시도〕) - 버전 확인 실패: "지원 버전을 확인하지 못했어요. 네트워크 연결을 확인하고 다시 시도해 주세요." · 〔나중에〕/〔다시 확인〕 • 위치: CASE01 [하단 탭바 보임] 탭바 위 16px · CASE02 [탭바 숨김(로그인·상세 2depth 등)] 화면 바닥 16px(+ safe-area) — 좌우 여백과 같음 | 20 하단 탭바 · body.app-has-bottom-nav | 위치 변경 (코드 반영: cc823348·3454d65f, #1011) · 구버전은 고정값(bottom-24)이 로그인 버튼을 덮음 · 문구는 기존 그대로 · TBU: 라이브 실사 이월 |
| 26 | iOS 바닥 여백 · 상태 표시줄 색 | Rule | • (10/8, #1083, 920aee91) iOS 앱(html.plt-ios): 하단 캡슐과 채팅 입력줄(메신저 대화방 · AI 어시스턴트)이 홈 인디케이터 바로 위 22px(인디케이터 영역 안으로 12px, iOS 26 탭바 위치)에 붙음 — 종전 「8px + 34px」에 화면 배율까지 곱해져 50px 가까이 비었음. 바닥 여백 변수 --ds-bottom-nav-bottom-gap- CASE01 [안드로이드]: 기존 값 유지(3버튼 내비 바가 불투명해 겹치면 가려짐), 배율로 부풀던 것만 보정 • 상태 표시줄 색: 화면 맨 위 불투명 면 색(셸 회색 · 흰 면)을 읽어 body 배경 · theme-color · 안드로이드 StatusBar에 넣음(utils/status-bar-surface.ts) — 종전 고정 브랜드 주황 theme-color 제거 | 20 하단 탭바 · [[HBEA300_메신저]] 입력줄 | 신설 (#1083) · TBU: 실기기에서 상태 표시줄과 앱 배경 이어짐(스크린샷 불가 영역) |
| 30 | 알림 패널 | Panel | 헤더 "알림 (3)" + "모두 읽음" + 알림 항목 리스트 | Notification | TBU: 패널 오버레이/풀페이지 형태 |
| ㄴ31 | 알림 헤더 | Text | "알림 (n)" — n = 미읽음 카운트 | 원문 카피 | |
| ㄴ32 | 모두 읽음 | Button | • 알림 전체를 일괄 읽음 처리하는 기능 • 클릭 → 즉시 실행(컨펌 없음), 성공: 전체 읽음 처리·미읽음 카운트 0 • (10/13, 6f8d869) 위치 변경: 본문 위 줄 → 헤더 오른쪽 글자 버튼, 안 읽은 알림이 있을 때만 노출 | Notification.isRead=true | TBU: 실패 토스트 UI · 위치 변경 라이브 실사(미읽음 0건이라 미노출) |
| ㄴ33 | 알림 항목 | ListItem | • 개별 알림 항목({제목}/{본문}/{타임스탬프 "2026. 07. 26." (날짜만·점표기, 시각 없음 — 2026-08-18 정정)})을 표시하고 해당 화면으로 딥링크하는 요소 • 클릭 → 읽음 처리(즉시·낙관적) + 알림 유형별 화면 이동. 이동이 먼저, 읽음 처리는 뒤(서버 왕복 대기 없음) - CASE01 [목적지 있는 유형]: 해당 화면으로 이동하며 알림 화면은 닫힘 - CASE02 [목적지 없는 유형]: 컨펌 다이얼로그 "{앱이름}에서 확인해 주세요."(제목 「확인」·확인 버튼 1개, 앱이름 볼드) + 읽음 처리, 화면 유지(ㄴ33-2·ㄴ33-3 참조) | Notification · [[HBEA400_결재]] · [[HBEA300_메신저]] | 2026-08-18 구현 |
| ㄴ33-2 | ㄴ 알림 유형별 목적지 | - | • leave_request → 결재 > "휴가신청" / overtime·offsite_work → 결재 > "근무" / incentive → 결재 > "인센티브" / document·certificate → 결재 > "서류관리" / 대화 알림 → 메신저(해당 대화방) • (10/8, #1075·#1076) 메신저 답글 · @멘션 알림(NotificationType.MESSAGE, referenceType conversation) → 메신저 해당 대화방 — "{이름}님이 회원님의 메시지에 답글을 남겼습니다" · "{이름}님이 회원님을 언급했습니다" · "{이름}님이 전체를 언급했습니다"([[HBEA300_메신저]] ㄴ39 · ㄴ40) | resolveNotificationTarget(@hereby/core/constants) | 표를 늘릴 때 이 행도 함께 갱신 |
| ㄴ33-3 | ㄴ 이동 없는 유형 → 안내 앱 | - | • 직원 앱에 화면이 없는 알림은 이동 대신 안내 다이얼로그를 띄우고, 문구의 앱 이름은 워크스페이스 전환기 표기를 따른다 • "급여관리": memo(급여 시트 셀 메모) · allowance · deduction · education · system+grade_promotion(호봉 승급) • "관리자": permission_request · general(주당 근무시간 초과) • "내부 결재": system+work_type_change(근무형태 변경) | resolveNotificationAppLabel(@hereby/core/constants) | 새 알림 타입은 이동/안내 중 하나를 반드시 가진다(core 단위 테스트가 강제) |
| ㄴ33-E | ㄴ 알림 Empty | Text | 알림 0건 Empty 문구 표시 | Notification | TBU: Empty 원문 미확보 |
| ㄴ34 | ㄴ 알림 유형 (관찰) | - | "휴가 신청 접수"("{유형} 1일 신청이 접수되었습니다") / "접근 권한 요청"("안세희님이 권한을 요청했습니다 (admin): test") | 휴가 = LeaveRequest / 권한요청 = Admin 권한 흐름 | 원문 2종 카피 |
| ㄴ35 | 안드로이드 백버튼 — 알림 화면 | Rule | • 알림 2depth 화면이 app-back-button을 화면 맨 위층(캡처 단계)에서 먼저 받아 한 층만 물러나고 전파를 끊는다- CASE01 [알림 화면 열림 + 백]: 알림 화면 닫기(앱은 유지) - 구버전: 리스너가 없어 홈 탭에서 백을 누르면 앱 종료 확인이 떴음(QA 2026-09-22) | app-back-button · 30 알림 패널 | 신설 (코드 반영: 4b363ff, #849) · TBU: 라이브 실사 이월 |
| 40 | 안드로이드 백버튼 — 불편·오류 신고 팝업 | Rule | • 불편·오류 신고 팝업도 백버튼을 맨 위층에서 먼저 받아 한 층만 물러난다 - CASE01 [신고 상세]: 「내역」으로 뒤로 - CASE02 [내역 · 작성]: 팝업 닫기 - CASE03 [전송 중]: 백 무시 - 구버전: 홈 탭에서 앱 종료 확인이 떴음(QA 2026-09-22) | app-back-button · CS 리포트 위젯([[HBAD100_App Shell·사이드바]] ㄴ10-1) | 신설 (코드 반영: 4b363ff, #849) · TBU: 라이브 실사 이월 |
| 41 | iOS 왼쪽 가장자리 스와이프 = 뒤로 | Gesture | • (10/8, #1083, 920aee91·28b87a1c) iPhone 앱에서 화면 왼쪽 끝 20px에서 오른쪽으로 밀면 화면 맨 위에 실제로 보이는 뒤로(<) 버튼을 누른 것과 같음(utils/edge-swipe-back.ts). 화면이 손가락을 따라오고, 화면 폭 35% 이상이거나 빠르게 튕기면 뒤로 감(2depth 퇴장 슬라이드가 밀어 둔 위치에서 이어짐). 햅틱 없음 • 대상: 뒤로 버튼( data-edge-swipe-back 표식)만 — 모양만 <인 「이전 달 · 이전 해」 버튼은 대상 아님- CASE01 [X로 닫는 풀레이어 팝업(휴가 신청 등 9종)]: 동작 안 함 - CASE02 [헤더가 <인 급여명세서 본인 확인 팝업]: 동작 - CASE03 [안드로이드 · Safari 웹]: 켜지 않음(시스템 뒤로 제스처 · 브라우저 스와이프와 겹침) • 세로 스크롤 막는 리스너는 2depth가 열려 있을 때만 붙음(탭 첫 화면 긴 목록 스크롤 영향 없음, 28b87a1c) | edge-swipe-back · x-depth-page | 신설 (#1083) · TBU: 실기기(급여명세서 · 근무 기록 스와이프, 휴가 신청 미동작) |
| 50 | 화면 캡처 제한 (민감 화면) | Rule | • (10/8, #1090 ef18fa36 · #1093 bd9bde77) 관리자 「설정」 직원 앱 구역 「화면 캡처 제한」(organization settings.screenCaptureProtection, 키 없음 = 켬, 명시적 false만 꺼짐)이 켜져 있으면 네이티브 직원 앱(iOS · Android)의 급여명세서 · 내 정보 · 메신저에서 스크린샷 · 화면 녹화 · 미러링 시 내용을 가림- 민감 화면 판정: 2depth 종류 payslips · my-info, 또는 메신저 섹션. 민감 화면을 벗어난 뒤 1초 동안 보호 유지(전환 프레임 노출 방지) - Android: 민감 · 유예 구간만 FLAG_SECURE, API 35+ 녹화 감지 시 오버레이 "화면 녹화가 감지되어 내용을 가렸어요." / iOS: 캡처 시 웹뷰 검게(secure canvas), 녹화 · 미러링 시 블러 오버레이(같은 문구) - 민감 화면에서 스크린샷이 찍히면 토스트 "화면이 캡처되었어요."(info) • 설정 읽기: 로그인 후 1회 + 앱이 앞으로 돌아올 때마다(폴링 없음). 실패 시 이전 값 유지, 한 번도 못 읽었으면 켬으로 봄(fail-closed) - CASE01 [설정 꺼짐]: 보호 · 오버레이 · 토스트 모두 없음 - CASE02 [웹 브라우저(4002)]: 가드 미기동, 종전과 동일 - CASE03 [구 네이티브(플러그인 없음) + 최신 OTA]: 차단은 약해질 수 있으나 화면 막힘 없음 • #1093: #1090의 웹 전체 검은 안내막(screen-capture-protection-shield) 제거 — 메신저 · 급여 화면이 검게 가려져 사용 불가하던 현장 문제 해소. 차단은 네이티브만 담당 | organization.getScreenCaptureProtection · ScreenCaptureGuard 플러그인 · [[HBEA300_메신저]] ㄴ43 · [[HBEA510_내 정보·근무 설정]] · [[HBEA530_급여명세서 모달]] | 신설 (#1090 · #1093) · 관리자 설정 화면은 HBAD 쪽 사양 · TBU: 실기기 가림 · 토스트 확인(실사 대기) |
| 51 | 안드로이드 시스템 바 인셋 · 키보드 여백 | Rule | • (10/8, #1072, MED-940) 안드로이드 앱이 상태 바 · 내비 바를 피해 그려짐 — @capacitor/keyboard 8.0.2 → 8.0.6(구버전이 SystemBars 인셋 처리를 덮어써 WebView가 화면 전체를 차지, 입력줄 · 목록 아래쪽이 내비 바 아래로 들어갔음)• 키보드 열림: 입력줄이 키보드 바로 위 — --kb-height = WebView가 조금이라도 줄었으면 0, 전혀 안 줄었으면 키보드 높이(utils/keyboard-offset.ts, 종전 48px 빈 띠 해소) | AI 어시스턴트 · [[HBEA300_메신저]] 입력줄 | 신설 (#1072) · TBU: 실기기(3버튼 내비 삼성 등) 입력줄 위치 |
알림 채널·선호 보조표
| 구성 | 원천 | 설명 | 비고 |
|---|---|---|---|
| 이벤트 | NotificationEvent | 도메인 이벤트 → 알림 생성(type/action/title/message) | |
| 채널 선호 | NotificationPreference | per-event / per-channel enabled 토글(in_app 등) | 라이브 상세 TBU |
| mute | NotificationMuteSetting | event/target 단위 음소거 + expiresAt | TBU |
| 발송 이력 | NotificationDelivery | channel/status/isSeen/isRead/isDismissed 추적 | |
| 푸시 토큰 | device_tokens | platform별 푸시 발송 대상 |
권한·상태 분기 요약
| 시나리오 | 트리거 | 결과 | 비고 |
|---|---|---|---|
| CASE01 [미읽음 존재] | 알림 종 배지 표시 → 클릭 | 알림 패널 열림, "알림 (n)" | n>0 |
| CASE02 [모두 읽음 실행] | "모두 읽음" 클릭 | 미읽음 카운트 0, 배지 hide | 컨펌 없음 |
| CASE03 [프로필 클릭] | 상단 프로필 아바타 클릭 | 더보기 화면 이동 | FIG 정책 |
| CASE04 [항목 클릭 · 목적지 있음] | 알림 항목 클릭 | 읽음 처리 + 해당 화면 이동(결재 탭까지 지정) | 2026-08-18 구현 · 라이브 확인 |
| CASE05 [항목 클릭 · 목적지 없음] | memo·permission_request·system 등 클릭 | 컨펌 다이얼로그 "{앱이름}에서 확인해 주세요." + 읽음 처리, 화면 유지 | 직원 앱에 대응 화면 없음 |
| CASE06 [안드로이드 백버튼] | 알림 2depth 화면·불편·오류 신고 팝업에서 백 | 한 층만 닫힘(앱 종료 확인 안 뜸) | 전송 중에는 무시 · 4b363ff, #849 |
| CASE07 [iOS 가장자리 스와이프] | 2depth에서 왼쪽 끝 밀기 | 보이는 뒤로(<) 버튼과 같이 뒤로 | X 팝업 · 안드로이드 · 웹 제외 · #1083 |
| CASE08 [화면 캡처 제한 켬] | 급여명세서 · 내 정보 · 메신저에서 스크린샷 | 캡처 내용 가림 + 토스트 "화면이 캡처되었어요." | 네이티브만 · #1090/#1093 |
Open Question
- FIG 정책 fixed-header "알림 + 처리대기 통합" 표현 vs 라이브 관찰(알림 패널 "알림 (3)"·"모두 읽음"만 관찰, 처리대기 통합 UI 미관찰) — 통합 여부·처리대기 항목 소스 라이브 재확인 필요
- FIG 정책상 알림 종 내 "설정" 진입점 — 라이브 미관찰, 노출 여부 TBU
- 알림 항목 클릭 딥링크 = 2026-08-18 구현(ㄴ33·ㄴ33-2·ㄴ33-3). 잔여: 지금 안내 다이얼로그로 처리 중인 유형 중 직원 앱 화면을 새로 줄 것이 있는지 — 특히 allowance·deduction(수당·공제 승인)은 급여명세서가 후보지만 확정분만 노출돼 방금 승인된 건이 안 보임
- 알림 Empty 상태 원문 문구 = TBU (미확보)
- fixed header 요소 수: 정책 3요소 vs 라이브 4요소(종 배지 포함) 정합 = 확인 필요
- 알림 카테고리/채널/mute 라이브 상세(per-event/per-channel/mute UI) = TBU
- 메신저 배지 vs 알림 배지 집계 규칙 = TBU