diff --git a/A05_EduDetail/guide/B01/00_설명서.md b/A05_EduDetail/guide/B01/00_설명서.md index 487d18091..dfbfe9586 100644 --- a/A05_EduDetail/guide/B01/00_설명서.md +++ b/A05_EduDetail/guide/B01/00_설명서.md @@ -1,38 +1,51 @@ # 대시보드 -프로젝트를 만들고 고르고 관리하는 첫 화면. 계정 정보와 회사 정보도 여기서 고침. +로그인하면 처음 열리는 화면. 왼쪽 메뉴에서 세부 페이지를 골라 프로젝트 · 보관 자료 · 사람 · 회사 · 계정을 다룸. ## 여는 길 -- 로그인하면 처음 열리는 화면. +- 로그인하면 바로 열림 — 처음은 [홈]. - 다른 화면에서는 ☰ 를 눌러 서랍을 열고 [대시보드] 선택. +- 머리 줄 왼쪽 [AISLO] 를 누르면 언제든 [홈] 으로 돌아옴. ![화면 한눈에](B01_00_overview.webp) ## 화면 구역 -보이는 구역은 로그인한 사람의 역할(일반 사용자 · 회사 관리자 · 시스템 관리자)에 따라 다름. 그림은 회사 관리자 화면(예시 회사라 프로젝트 · 보관 자료가 비어 있음). - | 번호 | 구역 | 하는 일 | | --- | --- | --- | -| 1 | 시스템 설정 | 구조물 조합 같은 기본값 화면으로 가는 카드 · 제목을 누르면 접힘 | -| 2 | 프로젝트 | 내 프로젝트 표 · [+] 로 새 프로젝트 · 단계 막대로 작업 화면 이동 | -| 3 | 임시 보관함 | 프로젝트를 만들기 전에 파일을 30일 동안 올려 두는 곳 | -| 4 | 팀원 관리 | 같은 회사 사람 추가 · 역할 변경 · 제거 (회사 관리자만) | -| 5 | 기본정보 | 내 이름 · 직급 · 연락처 · 서명 | -| 6 | 보안 | 비밀번호 변경 | -| 7 | 챗봇 | 법령 · 지침 질문 창 · 화면 오른쪽 아래 둥근 단추 | -| 8 | ☰ | 구역으로 바로 가는 목록 · 다른 화면 이동 | +| 1 | 회사 이름 | 내 회사 · 시스템 관리자는 눌러서 볼 회사를 바꿈(「회사 선택」 창) | +| 2 | [?] | 이 사용자 가이드 · 지금 보는 페이지의 절이 먼저 열림 | +| 3 | 알림(종) | 처리할 일 수(가입 요청 · 새 예정노선 · 만료 임박 보관함) · 누르면 [홈] | +| 4 | 사용자 메뉴 | 이름을 누르면 [내 정보] · 어두운 화면 · English · 터치 모드 · 설정 · 로그아웃 → [내 정보](B01/12_내_정보) | +| 5 | 왼쪽 메뉴 | 작업 · 회사 관리 · 시스템 관리 · 도움 묶음 · 지금 페이지 강조 · 오른쪽 수 배지(빨강 = 처리할 일) | +| 6 | 페이지 자리 | 메뉴에서 고른 세부 페이지가 그려지는 자리 | +| 7 | 챗봇 단추 | 오른쪽 아래 둥근 단추 · 법령 · 지침 질문 창 → [지식 챗봇](B01/11_지식_챗봇) | -회사 관리자는 가입 요청 · 회사 정보 구역이 더 보이고, 받은 예정노선이 있으면 그 구역이 프로젝트 아래에 붙음. +## 역할별 메뉴 + +보이는 메뉴는 로그인한 사람의 역할에 따라 다름. 그림은 회사 관리자 화면. + +| 메뉴 | 일반 사용자 | 회사 관리자 | 산림청 | 시스템 관리자 | +| --- | --- | --- | --- | --- | +| 홈 · 프로젝트 · 임시 보관함 | 보임 | 보임 | 보임 | 보임 | +| 받은 예정노선 | 보임 | 보임 | 안 보임 | 보임 | +| 사람 | 안 보임 | 보임 | 안 보임 | 보임 | +| 회사 정보 | 읽기만 | 고침 | 읽기만 | 고침 | +| 회사 설계 기본값 | 보임 | 보임(고침) | 보임 | 안 보임 — [설계 기본값] 을 씀 | +| 시스템 관리(개요 · 회사 · 사용자 · 설계 기본값 · 시스템 로그) | 안 보임 | 안 보임 | 안 보임 | 보임 | +| 사용자 가이드 · 지식 챗봇 | 보임 | 보임 | 보임 | 보임 | + +- 일반 사용자 — 자기 프로젝트 작업 · 보관함 · 회사 정보 보기. +- 회사 관리자 — 일반 사용자 메뉴 + [사람](팀원 · 가입 요청 · 초대) · 회사 정보 고치기. +- 산림청 — 예정노선을 만드는 계정 · [받은 예정노선] 대신 홈에 [예정노선] 칸. +- 시스템 관리자 — 모든 메뉴 + [시스템 관리] 묶음 · 머리 줄에서 볼 회사를 바꿈. + +> 참고: 권한 없는 페이지 주소로 들어오면 [홈] 이 열림. ## 작업 순서 -1. 처음이면 [기본정보] 와 [보안] 확인. -2. [프로젝트] 의 [+] 로 새 프로젝트 만들기 → [새 프로젝트 만들기](B01/01_새_프로젝트_만들기). -3. 측량 파일이 아직 없으면 [임시 보관함] 에 먼저 올려 두기 → [임시 보관함](B01/04_임시_보관함). -4. 만든 프로젝트는 표의 단계 막대에서 이어서 작업 → [프로젝트 목록](B01/02_프로젝트_목록). - -시스템 관리자 화면은 [시스템 관리자 구역](B01/09_시스템_관리자) 참고. - -> 참고: 구역 제목을 누르면 그 구역이 접히고 다시 누르면 펼쳐짐. +1. 처음이면 [내 정보] 에서 이름 · 직급 · 서명 채움. → [내 정보](B01/12_내_정보) +2. 측량 파일이 아직 없으면 [임시 보관함] 에 먼저 올려 둠. → [임시 보관함](B01/04_임시_보관함) +3. [+ 새 프로젝트] 로 프로젝트를 만듦. → [프로젝트 목록](B01/02_프로젝트_목록) +4. 프로젝트 카드를 눌러 상세를 보고 [작업 열기] 로 이어서 작업. → [프로젝트 상세](B01/06_프로젝트_상세) diff --git a/A05_EduDetail/guide/B01/01_새_프로젝트_만들기.md b/A05_EduDetail/guide/B01/01_새_프로젝트_만들기.md deleted file mode 100644 index c24dde131..000000000 --- a/A05_EduDetail/guide/B01/01_새_프로젝트_만들기.md +++ /dev/null @@ -1,34 +0,0 @@ -# 새 프로젝트 만들기 - -만들 프로젝트의 종류를 고르는 창. 종류마다 입력 화면이 따로 열림. - -## 여는 길 - -- [프로젝트] 구역 오른쪽 위 [+] 누름. - -![새 프로젝트 고르기 창](B01_01_new_project_picker.webp) - -## 단계 - -| 단계 | 할 일 | -| --- | --- | -| 1 | [프로젝트] 구역의 [+] 누름 | -| 2 | 창의 카드 넷 가운데 만들 종류 선택 | -| 3 | 열린 입력 화면에서 이어서 작업 | - -그림 번호는 아래 표의 번호와 같음. 흐린 카드는 지금 계정으로 못 고르는 카드. - -| 번호 | 카드 | 열리는 화면 | -| --- | --- | --- | -| 1 | 예정노선 | 예정노선 등록 · 산림청 계정만 가능 | -| 2 | 임도설계 | 프로젝트 등록 → [B02](B02/00_설명서) | -| 3 | 사방설계 | 「준비 중」 표시 · 아직 못 고름 | -| 4 | 안정성평가 | 안정성평가 생성 → [E01](E01/00_설명서) | - -## 보이는 것 - -- 못 고르는 카드는 흐리게 보임. -- 창 오른쪽 위 [닫기] 로 만들지 않고 돌아감. -- 임도설계를 고르면 창이 닫히고 프로젝트 등록 화면으로 넘어감 → [프로젝트 등록](B02/00_설명서). - -> 참고: 예정노선 카드는 산림청 계정(시스템 관리자 · go.kr 메일)만 켜짐. 그 밖의 계정은 흐리게 보임. diff --git a/A05_EduDetail/guide/B01/01_홈.md b/A05_EduDetail/guide/B01/01_홈.md new file mode 100644 index 000000000..a78b7ee88 --- /dev/null +++ b/A05_EduDetail/guide/B01/01_홈.md @@ -0,0 +1,49 @@ +# 홈 + +지금 하는 일을 한눈에 보는 첫 페이지. 진행 중인 프로젝트 수에 따라 모양이 바뀜. + +## 여는 길 + +- 왼쪽 메뉴 [홈] · 머리 줄 [AISLO] · 알림(종) 누름. + +## 처음 시작 + +진행 중인 프로젝트가 없는 계정의 홈. + +![처음 시작 홈](B01_01_home_first.webp) + +| 번호 | 구역 | 하는 일 | +| --- | --- | --- | +| 1 | [자동] · [작게] · [크게] | 홈 모양 고름(아래 표) · 고른 것은 기억됨 | +| 2 | [+ 새 프로젝트] | 새 프로젝트 창을 엶 → [프로젝트 목록](B01/02_프로젝트_목록) | +| 3 | 세 걸음 | ① [내 정보 ›] ② [보관함 ›] ③ [+ 새 프로젝트] — 처음 쓰는 차례 | +| 4 | 오른쪽 칸 | [처리할 일] · [임시 보관함] · 회사 칸(팀원 수 · 진행 중 수 · [사람 ›]) | + +## 프로젝트가 많을 때 + +진행 중인 프로젝트가 9 개를 넘으면 요약 · 그래프 모양. 그림은 시스템 관리자 화면. + +![요약 · 그래프 홈](B01_01_home_many.webp) + +| 번호 | 구역 | 하는 일 | +| --- | --- | --- | +| 1 | [자동] · [작게] · [크게] | 홈 모양 고름 | +| 2 | 숫자 칸 | 진행 중 프로젝트 · 처리 대기 수(시스템 관리자는 회사 · 사용자 · 서버 칸 더) | +| 3 | 오른쪽 칸 | [처리할 일] — 새 예정노선 [보기] · 가입 요청 [처리] · 만료 임박 파일 [열기] · [임시 보관함] | + +- 아래 그래프 — 회사별(시스템 관리자) 또는 담당별 진행 중 · 종류(임도설계 · 예정노선 · 안정성평가) · 단계 분포(시작 전 · 설계 중 · 확정 대기). +- [모든 프로젝트 ›] — [프로젝트] 페이지로 감. + +## 모양 고르기 + +| 진행 중 수 | [자동] 모양 | +| --- | --- | +| 0 | 처음 시작(세 걸음) 또는 「진행 중인 프로젝트 없음」 | +| 1 | 큰 카드 하나 — 단계 점 · 「다음: …」 · [이어서 하기 ›] · [자세히] | +| 2~3 | 중간 카드 | +| 4~8 | 한 줄 목록 — [열기 ›] = 그 단계 화면 · 줄 누름 = 상세 | +| 9 넘음 | 요약 · 그래프 | + +- [작게] = 한 줄 목록(9 넘으면 요약 · 그래프) · [크게] = 큰 · 중간 카드. + +> 참고: 산림청 계정은 오른쪽에 [예정노선] 칸이 더 있음. diff --git a/A05_EduDetail/guide/B01/02_프로젝트_목록.md b/A05_EduDetail/guide/B01/02_프로젝트_목록.md index 7d8624dd8..d3a8acc51 100644 --- a/A05_EduDetail/guide/B01/02_프로젝트_목록.md +++ b/A05_EduDetail/guide/B01/02_프로젝트_목록.md @@ -1,44 +1,53 @@ # 프로젝트 목록 -내 프로젝트를 한 표로 보고, 진행 단계로 바로 이동하고, 이름 · 정보를 고치거나 지움. +내 프로젝트 · 회사 프로젝트를 카드 · 표 · 칸반으로 보고 찾고, 새 프로젝트를 만듦. ## 여는 길 -- 대시보드의 [프로젝트] 구역. +- 왼쪽 메뉴 [프로젝트] · 홈의 [모든 프로젝트 ›]. -![프로젝트 표](B01_11_project_table.webp) +![프로젝트 카드 보기](B01_02_projects.webp) -## 단계 +## 화면 구역 -그림 번호 — ① [프로젝트명] 칸 머리 · ② [워크플로우] 칸 머리(단계 막대) · ③ [수정] 단추. +| 번호 | 구역 | 하는 일 | +| --- | --- | --- | +| 1 | [카드] · [표] · [칸반] | 보기 고름 · [칸반] 은 프로젝트가 10 개 이상일 때만 보임 | +| 2 | [+ 새 프로젝트] | 새 프로젝트 창을 엶(아래) | +| 3 | 찾기 칸 | 이름 · 지역으로 찾음 | +| 4 | 종류 칩 | [전체] · [임도설계] · [예정노선] · [안정성평가] — 옆 숫자 = 개수 · 사방설계는 준비 중 | +| 5 | [담당] · [내 것] · [회사 전체] | 담당자로 거름 · 내 프로젝트만 또는 회사 전체 | +| 6 | 프로젝트 카드 | 노선 그림 · 이름 · 종류 · 지금 단계(예: 원가계산 7/7) · 단계 점 · 담당 · 고친 날 — 누르면 상세 | -| 단계 | 할 일 | -| --- | --- | -| 1 | 표에서 프로젝트를 찾음 · 칸은 프로젝트명 · 종류 · 지역 · 워크플로우 · 수정일 · 관리 | -| 2 | 워크플로우 칸의 단계 막대에서 이어갈 단계(파일입력 · 전처리 · 노선설계 …)를 누름 | -| 3 | 그 프로젝트의 해당 화면이 열림 | -| 4 | 정보를 바꾸려면 [수정], 지우려면 [삭제] | +- 카드를 누르면 [프로젝트 상세] 가 열림. → [프로젝트 상세](B01/06_프로젝트_상세) +- 「N 일 그대로」 표시 = 오래 손대지 않은 프로젝트. -## 보이는 것 +## 표 보기 -- 단계 막대 색: 완료 · 진행 중 · 다시 확인 필요 · 시작 전이 서로 다른 색. -- 종류 칸: 임도설계 · 예정노선 · 안정성평가 중 하나. 종류마다 단계 이름이 다름. +![프로젝트 표 보기](B01_02_projects_table.webp) -### 프로젝트 수정 +| 번호 | 구역 | 하는 일 | +| --- | --- | --- | +| 1 | 칸 머리 | 이름 · 종류 · 지역 · 진행 · 상태 · 담당 · 수정일 | +| 2 | ⋯ | [수정] · [삭제] — 권한이 있는 사람에게만 보임 | -![프로젝트 수정 창](B01_09_sys_project_edit.webp) +- [칸반] = 시작 전 · 설계 중 · 검토 · 확정 대기 · 완료 칸으로 나눠 봄 · 완료 칸은 접혀 있음(펼치기). -- 그림 ① 프로젝트명 칸 · 아래로 지역 · 임도 종류 · 사업 연도 · 예상 연장 · 노선 시작 · 종료 누가거리 · 비고 · 시행청 · 연도·기번(표지) · 사업량(표지) · 설계일자 · 책임자 셋 · 회사 로고 · 참여자(수정을 허락할 사람 체크)를 고침. -- 그림 ② 아래 [취소] · [확인] 단추 줄. -- [확인] 을 누르면 저장. +## 새 프로젝트 만들기 -### 프로젝트 삭제 +![새 프로젝트 창](B01_02_new_project.webp) -![프로젝트 삭제 확인 창](B01_10_sys_project_del.webp) +| 번호 | 카드 | 하는 일 | +| --- | --- | --- | +| 1 | [예정노선] | 예정노선 지정 화면으로 감 · 산림청(시스템 관리자 · go.kr 메일)만 — 다른 계정은 흐리게 보임 | +| 2 | [임도설계] | 프로젝트 등록 화면으로 감 → [프로젝트 등록](B02/00_설명서) | +| 3 | [사방설계] | 준비 중 | +| 4 | [안정성평가] | 안정성평가 만들기 화면으로 감 → [안정성평가 만들기](E01/00_설명서) | -- [삭제] 를 누르면 「프로젝트 삭제」 확인 창이 뜸(그림 ① 안내 글). 올린 라이다 원본과 모든 계산 결과가 서버에서 영구 삭제되고 되돌릴 수 없음. -- 그림 ② 에서 마음이 바뀌면 [취소]. +## 프로젝트 수정 · 삭제 -> 주의: 삭제한 프로젝트는 복구 불가. 확인 창의 글을 읽고 [확인] 누르기. +- ⋯ → [수정] — 「프로젝트 수정」 창: 프로젝트명 · 지역 · 임도 종류 · 사업 연도 · 예상 연장 · 노선 시작 · 종료 누가거리 · 비고 · 시행청 · 연도 · 기번(표지) · 사업량(표지) · 설계일자 · 과업책임자 · 분야별책임자 · 설계자 · 회사 로고 · 참여자(수정을 허락할 사람 체크) → [확인]. +- ⋯ → [삭제] — 「프로젝트 삭제」 확인 창 → [확인]. +- 프로젝트 상세의 ⋯ 에도 같은 [수정] · [삭제] 가 있음. -> 참고: [수정] · [삭제] 단추는 권한이 있는 사람에게만 보임. +> 주의: 삭제하면 올린 라이다 원본과 모든 계산 결과가 서버에서 지워짐 — 되돌릴 수 없음. diff --git a/A05_EduDetail/guide/B01/03_받은_예정노선.md b/A05_EduDetail/guide/B01/03_받은_예정노선.md index 9b005e2a8..9fe2f1f25 100644 --- a/A05_EduDetail/guide/B01/03_받은_예정노선.md +++ b/A05_EduDetail/guide/B01/03_받은_예정노선.md @@ -1,24 +1,30 @@ # 받은 예정노선 -산림청이 우리 회사에 지정해 준 예정노선 연도를 확인하고 임도 프로젝트에 연결. +산림청이 우리 회사에 지정한 예정노선을 모아 보고 임도 프로젝트에 연결. ## 여는 길 -- 대시보드의 [받은 예정노선] 구역. 받은 것이 있을 때만 보임. +- 왼쪽 메뉴 [받은 예정노선] — 일반 사용자 · 회사 관리자 · 시스템 관리자(산림청 계정은 없음). +- 메뉴 옆 빨강 숫자 = 아직 연결 안 했거나 업데이트가 있는 노선 수. -> 참고: 받은 예정노선이 없는 계정에는 이 구역이 아예 안 보임 — 그림 없음. +![받은 예정노선 — 받은 것이 없을 때](B01_03_assigned.webp) + +| 번호 | 구역 | 하는 일 | +| --- | --- | --- | +| 1 | 페이지 머리 | 산림청이 지정한 예정노선이 모이는 곳 | +| 2 | 빈 안내 | 받은 것이 없으면 「아직 받은 예정노선이 없음」 · [사용법 보기] | ## 단계 | 단계 | 할 일 | | --- | --- | -| 1 | 표에서 예정노선 이름 · 연도 · 확정 시각 · 연결 상태 확인 | -| 2 | [보기] 로 노선 확인 | -| 3 | [연결] 을 눌러 창에서 「새 임도 프로젝트로」 또는 「기존 프로젝트에 연결」 선택 | -| 4 | 연결된 프로젝트의 파일입력 화면에서 계획노선 칸이 채워짐 → [B03 예정노선에서 가져오기](B03/04_예정노선_가져오기) | +| 1 | 표에서 예정노선 · 연도 · 확정 · 연결 상태 확인 | +| 2 | 줄 ⋯ → [보기] — 예정노선 화면에서 노선 확인 | +| 3 | 줄 ⋯ → [연결] — 「예정노선 연결」 창에서 [새 임도 프로젝트로] 또는 기존 프로젝트를 골라 [기존 프로젝트에 연결] | +| 4 | 연결된 프로젝트의 파일입력 화면이 열리고 계획노선 칸이 채워짐 → [B03 예정노선에서 가져오기](B03/04_예정노선_가져오기) | ## 보이는 것 -- 연결 상태 칸: 연결됨 · 미연결 · 업데이트 있음 중 하나. +- 연결 상태 칸: 연결됨 · 미연결 · 업데이트 있음. -> 참고: 「업데이트 있음」 이면 산림청이 노선을 고친 것. [다시 가져오기] 로 새 노선을 받음. +> 참고: 「업데이트 있음」 = 산림청이 노선을 고친 것 · 파일입력 화면에서 다시 가져옴. diff --git a/A05_EduDetail/guide/B01/04_임시_보관함.md b/A05_EduDetail/guide/B01/04_임시_보관함.md index ade88aa14..d553edb9a 100644 --- a/A05_EduDetail/guide/B01/04_임시_보관함.md +++ b/A05_EduDetail/guide/B01/04_임시_보관함.md @@ -4,28 +4,33 @@ ## 여는 길 -- 대시보드의 [임시 보관함] 구역. +- 왼쪽 메뉴 [임시 보관함] · 홈의 [보관함 ›]. +- 메뉴 옆 숫자 = 보관 묶음 수. -![임시 자료 등록 창](B01_02_temp_create_modal.webp) +![임시 보관함 — 비어 있을 때](B01_04_temp.webp) -그림 번호 — ① [보관 이름] 칸 · ② [취소] · [확인] 단추 줄. 보관 자료가 없으면 구역에 「데이터가 없습니다」 만 보임. +| 번호 | 구역 | 하는 일 | +| --- | --- | --- | +| 1 | [자료 올리기] | 「임시 자료 등록」 창을 엶 | +| 2 | 빈 안내 | 묶음이 없으면 「임시 보관함이 비어 있음」 · [자료 올리기] · [사용법 보기] | -## 단계 +## 올리기 -| 단계 | 할 일 | -| --- | --- | -| 1 | [임시 보관함] 구역 오른쪽 위 [+] 누름 | -| 2 | [보관 이름] 칸에 알아보기 쉬운 이름 입력 (예: 2026년 3공구 측량자료) | -| 3 | [파일 선택] 을 눌러 계획노선 · 라이다 · 좌표계 · 래스터 파일을 한꺼번에 고름 | -| 4 | 고른 파일 목록 확인 후 [확인] | -| 5 | 올리기가 끝나면 구역 목록에 보관 묶음이 생김 | +![임시 자료 등록 창](B01_04_temp_modal.webp) + +| 번호 | 칸 | 하는 일 | +| --- | --- | --- | +| 1 | [보관 이름] | 알아보기 쉬운 이름(예: 2026년 3공구 측량자료) | +| 2 | [파일 선택] | 계획노선 · 라이다 · 좌표계 · 래스터 파일을 한꺼번에 고름 · 아래 목록에 종류 · 파일명 · 크기 | +| 3 | [취소] · [확인] | [확인] = 올리기 시작 | ## 보이는 것 -- 묶음마다 이름 · 파일 개수 · 보관 만료일과 상태(업로드 중 · 사용 가능 · 프로젝트 연결됨). -- 파일마다 종류 · 파일명 · 크기 · 상태(저장 완료 · 대기 · 업로드 중 · 이어올리기 대기 · 실패). -- 묶음에 [파일 추가] 로 빠진 파일을 더 올리거나 파일 · 묶음을 지울 수 있음. -- 올린 묶음은 파일 입력 화면의 [임시 보관함] 단추로 프로젝트에 가져옴 → [B03 임시 보관함에서 가져오기](B03/03_임시_보관함에서_가져오기). +- 묶음 줄: 보관 이름(파일 수 · 크기) · 상태(사용 가능 · 업로드 중) · 남은 기간 · 올린 날 · ⋯. +- 이름 앞 꺾쇠를 누르면 파일 목록이 펼쳐짐 — 파일마다 저장 완료 · 대기 · 업로드 중 · 이어올리기 대기 · 실패. +- 묶음 ⋯ → [파일 추가] · [삭제] · 파일 ⋯ → [삭제]. +- 남은 기간이 7일 안이면 빨강 · 알림(종) 수에 더해짐. +- 올린 묶음은 파일입력 화면의 [임시 보관함] 단추로 프로젝트에 가져옴 → [B03 임시 보관함에서 가져오기](B03/03_임시_보관함에서_가져오기). > 주의: 보관 기간(30일)이 지나면 묶음이 사라짐. diff --git a/A05_EduDetail/guide/B01/05_회사와_팀원.md b/A05_EduDetail/guide/B01/05_회사와_팀원.md index 070291f77..dcf33825f 100644 --- a/A05_EduDetail/guide/B01/05_회사와_팀원.md +++ b/A05_EduDetail/guide/B01/05_회사와_팀원.md @@ -1,61 +1,43 @@ -# 회사와 팀원 +# 사람 -같은 회사 사람을 추가하고 역할을 정하고, 회사 정보를 고침. 회사 관리자 전용 구역 모음. +같은 회사 팀원 · 가입 요청 · 초대를 한곳에서 관리. 회사 관리자 · 시스템 관리자 전용. ## 여는 길 -- 대시보드의 [팀원 관리] · [가입 요청] · [회사 정보] 구역. 회사 관리자 계정에서만 모두 보임. +- 왼쪽 메뉴 [사람](회사 관리 묶음) · 홈 회사 칸의 [사람 ›]. +- 메뉴 옆 빨강 숫자 = 기다리는 가입 요청 수. -![팀원 추가 창](B01_03_member_add_modal.webp) +![사람 페이지](B01_05_people.webp) -## 단계 +| 번호 | 구역 | 하는 일 | +| --- | --- | --- | +| 1 | [+ 팀원 추가] | 「팀원 추가」 창을 엶 | +| 2 | 탭 | [팀원] · [가입 요청](기다리는 수) · [초대] | +| 3 | 팀원 표 | 이름 · 이메일 · 직급 · 부서 · 역할 · 상태 | +| 4 | ⋯ | [수정] · [역할 변경] · [제거] | -### 팀원 추가 +## 팀원 추가 -그림 번호 — ① [이름 · 이메일 검색] 칸 · ② [취소] · [확인] 단추 줄. +![팀원 추가 창](B01_05_member_add.webp) + +| 번호 | 칸 | 하는 일 | +| --- | --- | --- | +| 1 | [이름 · 이메일 검색] | 두 글자 이상 넣고 [검색] — 목록에서 사람을 고름 · 없으면 [초대 메일 발송] | +| 2 | [취소] · [확인] | [확인] = 고른 사람을 팀원으로 넣음 | + +## 역할 바꾸기 · 고치기 · 빼기 | 단계 | 할 일 | | --- | --- | -| 1 | [팀원 관리] 구역 오른쪽 위 [+] 누름 | -| 2 | [이름 · 이메일 검색] 칸에 입력하고 [검색] | -| 3 | 목록에서 사람을 고르거나, 없으면 [초대 메일 발송] | -| 4 | [확인] | +| 1 | 팀원 줄 ⋯ → [역할 변경] — USER(일반 사용자) 또는 ADMIN(회사 관리자) 고름 → [확인] | +| 2 | ⋯ → [수정] — 이름 · 직급 · 부서 · 전화 · 상태(활성 · 비활성) · 서명 고침 → [확인] | +| 3 | ⋯ → [제거] — 「회사에서 빼기(계정은 남음)」 또는 「계정 삭제(로그인 불가)」 고름 → [확인] | -### 역할 바꾸기 +## 가입 요청 · 초대 -그림 번호 — ① [역할] 고르기 칸 · ② [취소] · [확인] 단추 줄. +- [가입 요청] 탭 — 요청자 · 이메일 · 요청일 · 상태 · 줄마다 [승인] · [거절]. +- [초대] 탭 — [초대할 이메일] 칸에 넣고 [초대 메일 보내기]. -![역할 변경 창](B01_04_role_change.webp) +> 주의: 회사의 유일한 관리자는 뺄 수 없음. 시스템 관리자로는 역할을 바꿀 수 없음. -| 단계 | 할 일 | -| --- | --- | -| 1 | 팀원 줄의 [역할 변경] 누름 | -| 2 | 역할을 USER 또는 ADMIN 에서 선택 | -| 3 | [확인] | - -### 가입 요청 처리 - -- [가입 요청] 구역에 요청이 있으면 줄마다 [승인] · [거절]. - -### 회사 정보 고치기 - -그림 번호 — ① [사업자등록번호] 칸 · ② [취소] · [확인] 단추 줄. - -![회사 정보 수정 창](B01_05_company_edit.webp) - -| 단계 | 할 일 | -| --- | --- | -| 1 | [회사 정보] 구역의 [회사 정보 수정] 누름 | -| 2 | 사업자등록번호 · 회사명 · 대표자명 입력 | -| 3 | [주소 검색] 으로 주소를 고르거나 [직접 입력] 으로 기본주소 · 상세주소 입력 | -| 4 | 로고 파일(png · jpg · webp · svg · 2MB 이하) 선택 — 도면 표제란에 쓰임 | -| 5 | [확인] | - -## 보이는 것 - -- 팀원 표: 이메일 · 이름 · 직급 · 부서 · 역할 · 관리([수정] · [역할 변경] · [제거]). -- 회사 정보 구역: 회사명 · 활성 사용자 수 · 프로젝트 수 · 주소 · 회사 로고. - -> 주의: 회사의 유일한 관리자는 삭제할 수 없음. 시스템 관리자로는 역할을 바꿀 수 없음. - -> 참고: 일반 사용자 화면에는 [팀원 관리] 와 [가입 요청] 이 없고 [회사 정보] 는 읽기만 가능. +> 참고: 일반 사용자 · 산림청 계정에는 [사람] 메뉴가 없음. diff --git a/A05_EduDetail/guide/B01/06_내_정보와_보안.md b/A05_EduDetail/guide/B01/06_내_정보와_보안.md deleted file mode 100644 index 8f5ab57ce..000000000 --- a/A05_EduDetail/guide/B01/06_내_정보와_보안.md +++ /dev/null @@ -1,40 +0,0 @@ -# 내 정보와 보안 - -내 이름 · 직급 · 연락처 · 서명과 비밀번호를 고침. 모든 사용자 공통. - -## 여는 길 - -- 대시보드 아래쪽 [기본정보] · [보안] 구역. - -![기본정보 구역](B01_12_profile.webp) - -## 단계 - -### 기본정보 - -그림 번호 — ① [이름] 칸 · ② [기본정보 저장] 단추. - -| 단계 | 할 일 | -| --- | --- | -| 1 | 이름 · 직급 · 부서 · 연락처 칸을 고침 (이메일은 읽기만) | -| 2 | 서명 줄의 [선택…] 으로 서명 그림 파일을 올림 — 도면 표제란에 쓰임 | -| 3 | [기본정보 저장] | - -### 비밀번호 바꾸기 - -![보안 구역](B01_13_security.webp) - -그림 번호 — ① [현재 비밀번호] 칸 · ② [새 비밀번호] 칸(옆 칸이 [새 비밀번호 확인]) · ③ [비밀번호 변경] 단추. - -| 단계 | 할 일 | -| --- | --- | -| 1 | [현재 비밀번호] 입력 | -| 2 | [새 비밀번호] 와 [새 비밀번호 확인] 에 같은 값 입력 (8자 이상) | -| 3 | [비밀번호 변경] | - -## 보이는 것 - -- 저장하면 「저장되었습니다.」 알림. -- 새 비밀번호가 서로 다르면 「새 비밀번호가 일치하지 않습니다.」 · 8자 미만이면 「비밀번호는 8자 이상이어야 합니다.」 알림. - -> 참고: 프로젝트 등록 화면의 책임자 목록에는 여기 적은 이름과 직급이 나옴 → [B02 도면 표제란](B02/03_도면_표제란). diff --git a/A05_EduDetail/guide/B01/06_프로젝트_상세.md b/A05_EduDetail/guide/B01/06_프로젝트_상세.md new file mode 100644 index 000000000..5776bc195 --- /dev/null +++ b/A05_EduDetail/guide/B01/06_프로젝트_상세.md @@ -0,0 +1,25 @@ +# 프로젝트 상세 + +프로젝트 하나의 단계 · 노선 · 기본 정보 · 연결 · 산출물 · 최근 변경을 한 페이지에서 봄. + +## 여는 길 + +- [프로젝트] 페이지에서 카드 · 표 줄 누름 · 홈의 [자세히]. + +![프로젝트 상세](B01_06_project_detail.webp) + +## 화면 구역 + +| 번호 | 구역 | 하는 일 | +| --- | --- | --- | +| 1 | [프로젝트 ›] | 프로젝트 목록으로 돌아감 | +| 2 | [작업 열기 — 지금 단계 ›] | 지금 단계 작업 화면을 엶 · 옆 ⋯ = [수정] · [삭제] | +| 3 | 단계 진행 | 단계 칸(완료 ✓ · 지금 · 다시 확인 필요) — 누르면 그 단계 화면 | +| 4 | 노선 미리보기 | 계획노선 그림(시점 · 종점) · 아래 연장 · 측점 수 | +| 5 | 기본 정보 | 사업 연도 · 지역 · 임도 종류 · 설계속도 · 시행청 · 사업 번호 · 담당 · 만든 날 | +| 6 | 최근 변경 | 누가 언제 무엇을 고쳤는지 · 단계 마침 기록 | + +- [연결된 것] — 원본 · 이어 만든 것(예: 안정성평가) · 받은 예정노선 · [보기] 로 그 프로젝트를 엶. +- [산출물 내려받기] — 도면 PDF · 수량 xlsx · 내역 xlsx · [받기 화면] 으로 그 단계 화면을 엶. + +> 참고: 노선이 아직 없는 프로젝트는 노선 미리보기 대신 핵심 숫자가 보임. diff --git a/A05_EduDetail/guide/B01/07_시스템_설정.md b/A05_EduDetail/guide/B01/07_시스템_설정.md deleted file mode 100644 index cfb7792fd..000000000 --- a/A05_EduDetail/guide/B01/07_시스템_설정.md +++ /dev/null @@ -1,25 +0,0 @@ -# 시스템 설정 카드 - -설계 기본값(구조물 조합 · 옵션 · 도면 양식)을 고치는 화면으로 가는 바로가기. - -## 여는 길 - -- 대시보드 맨 위 [시스템 설정] 구역. - -![시스템 설정 카드](B01_07_setting_card.webp) - -## 단계 - -| 단계 | 할 일 | -| --- | --- | -| 1 | 카드를 하나 누름 | -| 2 | 열린 마스터 템플릿 화면에서 값을 고침 | - -## 보이는 것 - -- 그림은 회사 관리자 화면의 카드 줄. 시스템 관리자는 카드가 다섯 장 → [시스템 관리자 구역](B01/09_시스템_관리자). - -- 카드 아래 작은 글이 내 권한을 알려 줌 (예: 마스터 읽기 · 회사 수정 · 개인 수정). -- 일반 사용자 · 회사 관리자는 「구조물 조합」 카드 하나 · 시스템 관리자는 다섯 장. - -> 참고: 구역 제목을 누르면 카드 줄이 접힘. diff --git a/A05_EduDetail/guide/B01/07_회사_정보.md b/A05_EduDetail/guide/B01/07_회사_정보.md new file mode 100644 index 000000000..f245a0ca7 --- /dev/null +++ b/A05_EduDetail/guide/B01/07_회사_정보.md @@ -0,0 +1,30 @@ +# 회사 정보 + +회사 이름 · 사업자 정보 · 도면에 들어가는 회사 로고를 봄. 회사 관리자 · 시스템 관리자만 고침. + +## 여는 길 + +- 왼쪽 메뉴 [회사 정보](회사 관리 묶음). + +![회사 정보](B01_07_company.webp) + +| 번호 | 구역 | 하는 일 | +| --- | --- | --- | +| 1 | [회사 정보 수정] | 「회사 정보 수정」 창을 엶 | +| 2 | 정보 줄 | 회사 이름 · 사업자등록번호 · 대표자명 · 주소 · 사업자 상태 · 활성 사용자 · 프로젝트 수 | +| 3 | [회사 로고] [선택…] | 도면 표제란에 들어감 · 프로젝트가 따로 고르지 않으면 이 로고를 씀 | + +## 고치기 + +![회사 정보 수정 창](B01_07_company_edit.webp) + +| 번호 | 칸 | 하는 일 | +| --- | --- | --- | +| 1 | [사업자등록번호] | 아래로 회사명 · 대표자명 | +| 2 | 회사 로고 | png · jpg · webp · svg · 2MB 이하 | +| 3 | [주소 검색] · [직접 입력] | 주소를 찾아 고르거나 기본주소 · 상세주소를 직접 넣음 | +| 4 | [취소] · [확인] | [확인] = 고침 | + +> 참고: 일반 사용자 · 산림청 계정은 읽기만 — [회사 정보 수정] · [선택…] 단추가 없음. + +> 참고: 소속 회사가 없으면 「소속 회사가 없음」 · [회사 생성] · [회사 검색](가입 신청). diff --git a/A05_EduDetail/guide/B01/08_챗봇.md b/A05_EduDetail/guide/B01/08_챗봇.md deleted file mode 100644 index a4260f5c0..000000000 --- a/A05_EduDetail/guide/B01/08_챗봇.md +++ /dev/null @@ -1,27 +0,0 @@ -# 챗봇 - -법령과 지침을 물어보고 근거 문서와 함께 답을 받는 창. - -## 여는 길 - -- 화면 오른쪽 아래 둥근 [챗봇] 단추. - -![챗봇 창](B01_06_chat.webp) - -그림 번호 — ① 대화가 쌓이는 칸 · ② 질문 입력 칸과 [보내기] · ③ 닫기 ✕. - -## 단계 - -| 단계 | 할 일 | -| --- | --- | -| 1 | 둥근 단추를 눌러 창을 엶 | -| 2 | 아래 입력 칸에 질문 입력 · 줄을 바꾸려면 Shift+Enter | -| 3 | [보내기] 또는 Enter | -| 4 | 답과 근거 문서가 위쪽에 쌓임 | -| 5 | 닫으려면 오른쪽 위 ✕ | - -## 보이는 것 - -- 처음에는 「안녕하세요! 법령이나 지침에 대해 질문해 주세요. 근거 문서도 함께 보여드릴게요.」 인사. - -> 참고: 답은 참고용. 설계 값은 해당 법령 원문으로 확인. diff --git a/A05_EduDetail/guide/B01/08_회사_설계_기본값.md b/A05_EduDetail/guide/B01/08_회사_설계_기본값.md new file mode 100644 index 000000000..7258dc7a0 --- /dev/null +++ b/A05_EduDetail/guide/B01/08_회사_설계_기본값.md @@ -0,0 +1,19 @@ +# 회사 설계 기본값 + +새 프로젝트가 처음 받는 구조물 조합의 회사 층을 보는 곳. 회사 층은 회사 관리자가 고침. + +## 여는 길 + +- 왼쪽 메뉴 [회사 설계 기본값](회사 관리 묶음) — 일반 사용자 · 회사 관리자 · 산림청. + +![회사 설계 기본값 — 일반 사용자 화면](B01_08_company_defaults.webp) + +| 번호 | 구역 | 하는 일 | +| --- | --- | --- | +| 1 | 왼쪽 메뉴 | 일반 사용자 메뉴 — [사람] 없음 · [회사 정보] 는 읽기만 | +| 2 | [구조물 조합] | [열기] = 마스터 편집 화면의 구조물 조합 표(마스터 읽기 · 회사 읽기 · 개인 수정) | + +- 회사 관리자는 단추가 [열기 · 수정] — 회사 층을 고침. +- 내 것(개인 층)만 고치려면 [내 정보] 의 [구조물 조합 (내 것)]. → [내 정보](B01/12_내_정보) + +> 참고: 시스템 관리자는 이 메뉴 대신 [시스템 관리] 의 [설계 기본값] 을 씀. → [시스템 관리](B01/09_시스템_관리) diff --git a/A05_EduDetail/guide/B01/09_시스템_관리.md b/A05_EduDetail/guide/B01/09_시스템_관리.md new file mode 100644 index 000000000..e795758d3 --- /dev/null +++ b/A05_EduDetail/guide/B01/09_시스템_관리.md @@ -0,0 +1,69 @@ +# 시스템 관리 + +서버 상태 · 모든 회사 · 모든 사용자 · 마스터 기본값 · 기록을 다루는 묶음. 시스템 관리자 전용. + +## 여는 길 + +- 왼쪽 메뉴 [시스템 관리] 묶음 — [개요] · [회사] · [사용자] · [설계 기본값] · [시스템 로그]. +- 다른 역할에는 이 묶음이 안 보임. + +## 개요 + +![개요](B01_09_sys_overview.webp) + +| 번호 | 구역 | 하는 일 | +| --- | --- | --- | +| 1 | 숫자 칸 | 회사 · 사용자 · 활성 프로젝트 · 활성 사용자 수 | +| 2 | 막대 | CPU · 메모리 · 디스크 사용률 — 70% 넘으면 주황 · 90% 넘으면 빨강 | +| 3 | 그래프 | 최근 7일 CPU · 메모리 · 디스크 흐름 | + +## 회사 + +![회사](B01_09_sys_companies.webp) + +| 번호 | 구역 | 하는 일 | +| --- | --- | --- | +| 1 | [+ 회사] | 「회사 생성」 창 — 사업자등록번호 · 회사명 · 대표자명 · 로고 · 주소 · [회사 검색](같은 회사 확인) | +| 2 | 찾기 칸 | 회사 이름 · 사업자번호로 찾음 | +| 3 | 회사 표 | 회사 · 사업자등록번호 · 대표자 · 상태 · 사용자 · 프로젝트 수 | +| 4 | ⋯ | [상세 보기] · [정보 수정] · [로고 지정…] | + +- 회사 이름 누름 = 상세 — [정보] · [사람] · [프로젝트] 탭 · [정보 수정] · [‹ 회사 목록] 으로 돌아감. + +## 사용자 + +![사용자](B01_09_sys_users.webp) + +| 번호 | 구역 | 하는 일 | +| --- | --- | --- | +| 1 | [+ 사용자] | 「팀원 추가」 창 — 이름 · 이메일로 찾아 넣음 | +| 2 | 거르기 줄 | 이름 · 이메일 · 부서 찾기 · [모든 회사] · [모든 역할] · 오른쪽 보이는 수 | +| 3 | 사용자 표 | 이름(이메일) · 회사 · 직급 · 부서 · 전화 · 역할 · 상태 | +| 4 | ⋯ | [정보 수정] · [역할 변경] · [삭제…] | + +## 설계 기본값 + +새 프로젝트가 처음 받는 마스터 값을 고치는 곳. + +![설계 기본값](B01_09_sys_defaults.webp) + +| 번호 | 묶음 | 하는 일 | +| --- | --- | --- | +| 1 | 마스터 데이터 | [열기] = 마스터 데이터 화면(원문 원천 · 읽기) | +| 2 | 구조물 · 도면 | [구조물 조합] · [구조물 옵션] · [도면 양식] — [열기] = 마스터 편집 화면 | +| 3 | 계산 | [계산 자리] — 묶음마다 조작 중 계산을 브라우저 · 서버 중 어디서 할지 고름 → [저장] | + +## 시스템 로그 + +![시스템 로그](B01_09_sys_logs.webp) + +| 번호 | 구역 | 하는 일 | +| --- | --- | --- | +| 1 | 거르기 줄 | 사용자 · 대상 · 접속 주소 찾기 · [모든 동작] · 시작일 ~ 종료일 · 오른쪽 보이는 줄 수 | +| 2 | 기록 표 | 사용자 · 동작(프로젝트 생성 · 수정 · 영구 삭제 등) · 대상 · 접속 주소 · 일시 — 최신순 | + +- 아래 [이전 기록 더 보기] 로 더 옛 기록을 불러옴. + +> 참고: 기록은 1년 보관. + +> 참고: 머리 줄 회사 이름을 눌러 볼 회사를 바꾸면 [홈] · [프로젝트] · [사람] · [회사 정보] 가 그 회사 기준으로 바뀜. diff --git a/A05_EduDetail/guide/B01/09_시스템_관리자.md b/A05_EduDetail/guide/B01/09_시스템_관리자.md deleted file mode 100644 index 97cfdb9a9..000000000 --- a/A05_EduDetail/guide/B01/09_시스템_관리자.md +++ /dev/null @@ -1,29 +0,0 @@ -# 시스템 관리자 구역 - -시스템 관리자 계정에만 보이는 구역. 회사 · 사용자 · 서버 상태를 관리. - -## 여는 길 - -- 시스템 관리자로 로그인한 뒤 대시보드. - -![시스템 관리자 대시보드](B01_08_sys_overview.webp) - -그림 번호 — ① 리소스 현황 · ② 시스템 설정 · ③ 프로젝트 · ④ 임시 보관함 · ⑤ 사용자 관리 · ⑥ 회사 관리 · ⑦ 시스템 로그. 이름 · 메일 · 회사는 견본으로 가린 그림. - -## 단계 - -| 단계 | 할 일 | -| --- | --- | -| 1 | 구역 제목 옆 회사 이름 알약(예: 예시건설 ▾) 누름 | -| 2 | 회사 선택 창에서 회사를 고름 | -| 3 | [프로젝트] · [사용자 관리] · [가입 요청] · [회사 관리] 가 그 회사 것으로 바뀜 | -| 4 | [사용자 관리] 의 [+] 로 사용자 추가 · [역할 변경] · [사용자 삭제] | -| 5 | [회사 관리] 의 [+] 로 회사 생성 · [로고 지정…] 으로 로고 | - -## 보이는 것 - -- [리소스 현황]: CPU · 메모리 · 디스크 · 활성 사용자 · 활성 프로젝트와 최근 7일 그래프. -- [시스템 설정]: 카드 다섯 장 — 마스터 데이터 · 구조물 조합 · 구조물 옵션 · 도면 양식 · 계산 자리. -- [시스템 로그] 맨 아래: 동작 · 대상 · 접속 주소 · 일시. - -> 주의: [삭제] 는 올린 원본과 계산 결과까지 서버에서 지워 복구 불가. diff --git a/A05_EduDetail/guide/B01/10_사용자_가이드.md b/A05_EduDetail/guide/B01/10_사용자_가이드.md new file mode 100644 index 000000000..f8ef3e450 --- /dev/null +++ b/A05_EduDetail/guide/B01/10_사용자_가이드.md @@ -0,0 +1,20 @@ +# 사용자 가이드 + +모든 화면의 사용법을 그림과 함께 보는 창. + +## 여는 길 + +- 왼쪽 메뉴 [사용자 가이드](도움 묶음) — 가이드 창이 바로 열림. +- 머리 줄 [?] — 지금 보는 페이지의 절이 먼저 열림. +- 빈 페이지 안내의 [사용법 보기]. +- 작업 화면(파일입력 · 노선설계 등)에서는 왼쪽 아래 [?]. + +## 보이는 것 + +| 구역 | 하는 일 | +| --- | --- | +| 왼쪽 차례 | 임도 설계 → 안정성평가 → 예정노선 묶음 · 페이지 · 절 · 누르면 그 절로 감 | +| 오른쪽 글 | 절마다 글 · 그림 · 그림 번호 표 · 다른 절로 가는 링크 | +| [닫기] | 창을 닫음 | + +> 참고: 시스템 관리자는 글 · 그림을 더블클릭해 바로 고침. diff --git a/A05_EduDetail/guide/B01/11_지식_챗봇.md b/A05_EduDetail/guide/B01/11_지식_챗봇.md new file mode 100644 index 000000000..396f8adfa --- /dev/null +++ b/A05_EduDetail/guide/B01/11_지식_챗봇.md @@ -0,0 +1,20 @@ +# 지식 챗봇 + +임도 · 사방 법령과 기술 자료를 묻고 근거 문서와 함께 답을 받는 창. + +## 여는 길 + +- 왼쪽 메뉴 [지식 챗봇](도움 묶음) — 챗봇 창이 바로 열림. +- 대시보드 어디서나 오른쪽 아래 둥근 단추. + +![지식 챗봇](B01_11_chat.webp) + +| 번호 | 구역 | 하는 일 | +| --- | --- | --- | +| 1 | 안내 카드 | [챗봇 열기] — 닫은 창을 다시 엶 | +| 2 | 챗봇 창 | 아래 칸에 질문 입력 → [보내기] · 답 아래 근거 문서 · [×] 로 닫음 | +| 3 | 둥근 단추 | 챗봇 창을 열고 닫음 | + +- Enter = 보내기 · Shift+Enter = 줄 바꿈. + +> 참고: 답은 근거 확인용 — 설계 값은 원문 · 지침에서 다시 확인. diff --git a/A05_EduDetail/guide/B01/12_내_정보.md b/A05_EduDetail/guide/B01/12_내_정보.md new file mode 100644 index 000000000..0074c1b8c --- /dev/null +++ b/A05_EduDetail/guide/B01/12_내_정보.md @@ -0,0 +1,31 @@ +# 내 정보 + +내 이름 · 서명 · 비밀번호 · 화면 테마 · 내 설계 기본값을 고치는 곳. + +## 여는 길 + +- 머리 줄 오른쪽 내 이름 → [내 정보]. +- 홈 처음 시작의 [내 정보 ›]. + +![사용자 메뉴](B01_12_user_menu.webp) + +| 번호 | 구역 | 하는 일 | +| --- | --- | --- | +| 1 | 이름 · 역할 · 이메일 | 지금 로그인한 계정 | +| 2 | [내 정보] | 이 페이지를 엶 | +| 3 | [터치 모드] | [자동] · [켬] · [끔] — 터치 화면 조작 방식 | + +- 그 밖 — [어두운 화면] · [English] · [설정(마우스 · 단축키)] · [홈페이지] · [로그아웃]. + +![내 정보](B01_12_me.webp) + +| 번호 | 묶음 | 하는 일 | +| --- | --- | --- | +| 1 | 기본정보 | 이름 · 직급 · 부서 · 전화 · 서명 [선택…] → [기본정보 저장] · 이메일은 로그인 계정이라 못 바꿈 | +| 2 | 보안 | 비밀번호 [변경] — 현재 비밀번호 · 새 비밀번호(8 자 이상) · 확인 → [비밀번호 변경] | +| 3 | 화면 | 테마 [밝음] · [어두움] | +| 4 | 내 설계 기본값 | [구조물 조합 (내 것)] [열기] — 내 개인 층 구조물 조합 | + +> 참고: 이름 · 서명은 도면 표제란 · 보고서 서명란에 들어감. + +> 참고: 서명 칸은 회사에 속한 계정에만 보임. diff --git a/A05_EduDetail/guide/B01/B01_00_overview.webp b/A05_EduDetail/guide/B01/B01_00_overview.webp index 1217ad294..f5b0f32bd 100644 Binary files a/A05_EduDetail/guide/B01/B01_00_overview.webp and b/A05_EduDetail/guide/B01/B01_00_overview.webp differ diff --git a/A05_EduDetail/guide/B01/B01_01_home_first.webp b/A05_EduDetail/guide/B01/B01_01_home_first.webp new file mode 100644 index 000000000..50de12881 Binary files /dev/null and b/A05_EduDetail/guide/B01/B01_01_home_first.webp differ diff --git a/A05_EduDetail/guide/B01/B01_01_home_many.webp b/A05_EduDetail/guide/B01/B01_01_home_many.webp new file mode 100644 index 000000000..617af72b7 Binary files /dev/null and b/A05_EduDetail/guide/B01/B01_01_home_many.webp differ diff --git a/A05_EduDetail/guide/B01/B01_01_new_project_picker.webp b/A05_EduDetail/guide/B01/B01_01_new_project_picker.webp deleted file mode 100644 index 82ba83252..000000000 Binary files a/A05_EduDetail/guide/B01/B01_01_new_project_picker.webp and /dev/null differ diff --git a/A05_EduDetail/guide/B01/B01_02_new_project.webp b/A05_EduDetail/guide/B01/B01_02_new_project.webp new file mode 100644 index 000000000..21ed72287 Binary files /dev/null and b/A05_EduDetail/guide/B01/B01_02_new_project.webp differ diff --git a/A05_EduDetail/guide/B01/B01_02_projects.webp b/A05_EduDetail/guide/B01/B01_02_projects.webp new file mode 100644 index 000000000..397b939a3 Binary files /dev/null and b/A05_EduDetail/guide/B01/B01_02_projects.webp differ diff --git a/A05_EduDetail/guide/B01/B01_02_projects_table.webp b/A05_EduDetail/guide/B01/B01_02_projects_table.webp new file mode 100644 index 000000000..bbe364756 Binary files /dev/null and b/A05_EduDetail/guide/B01/B01_02_projects_table.webp differ diff --git a/A05_EduDetail/guide/B01/B01_02_temp_create_modal.webp b/A05_EduDetail/guide/B01/B01_02_temp_create_modal.webp deleted file mode 100644 index 0acbd0bab..000000000 Binary files a/A05_EduDetail/guide/B01/B01_02_temp_create_modal.webp and /dev/null differ diff --git a/A05_EduDetail/guide/B01/B01_03_assigned.webp b/A05_EduDetail/guide/B01/B01_03_assigned.webp new file mode 100644 index 000000000..9ff2e4e11 Binary files /dev/null and b/A05_EduDetail/guide/B01/B01_03_assigned.webp differ diff --git a/A05_EduDetail/guide/B01/B01_03_member_add_modal.webp b/A05_EduDetail/guide/B01/B01_03_member_add_modal.webp deleted file mode 100644 index 903fc26d8..000000000 Binary files a/A05_EduDetail/guide/B01/B01_03_member_add_modal.webp and /dev/null differ diff --git a/A05_EduDetail/guide/B01/B01_04_role_change.webp b/A05_EduDetail/guide/B01/B01_04_role_change.webp deleted file mode 100644 index 355b36187..000000000 Binary files a/A05_EduDetail/guide/B01/B01_04_role_change.webp and /dev/null differ diff --git a/A05_EduDetail/guide/B01/B01_04_temp.webp b/A05_EduDetail/guide/B01/B01_04_temp.webp new file mode 100644 index 000000000..a54451884 Binary files /dev/null and b/A05_EduDetail/guide/B01/B01_04_temp.webp differ diff --git a/A05_EduDetail/guide/B01/B01_04_temp_modal.webp b/A05_EduDetail/guide/B01/B01_04_temp_modal.webp new file mode 100644 index 000000000..48aa3d06d Binary files /dev/null and b/A05_EduDetail/guide/B01/B01_04_temp_modal.webp differ diff --git a/A05_EduDetail/guide/B01/B01_05_company_edit.webp b/A05_EduDetail/guide/B01/B01_05_company_edit.webp deleted file mode 100644 index 79cbded57..000000000 Binary files a/A05_EduDetail/guide/B01/B01_05_company_edit.webp and /dev/null differ diff --git a/A05_EduDetail/guide/B01/B01_05_member_add.webp b/A05_EduDetail/guide/B01/B01_05_member_add.webp new file mode 100644 index 000000000..cac0e10a9 Binary files /dev/null and b/A05_EduDetail/guide/B01/B01_05_member_add.webp differ diff --git a/A05_EduDetail/guide/B01/B01_05_people.webp b/A05_EduDetail/guide/B01/B01_05_people.webp new file mode 100644 index 000000000..2c64f145b Binary files /dev/null and b/A05_EduDetail/guide/B01/B01_05_people.webp differ diff --git a/A05_EduDetail/guide/B01/B01_06_chat.webp b/A05_EduDetail/guide/B01/B01_06_chat.webp deleted file mode 100644 index abf2e5f03..000000000 Binary files a/A05_EduDetail/guide/B01/B01_06_chat.webp and /dev/null differ diff --git a/A05_EduDetail/guide/B01/B01_06_project_detail.webp b/A05_EduDetail/guide/B01/B01_06_project_detail.webp new file mode 100644 index 000000000..b171bae1d Binary files /dev/null and b/A05_EduDetail/guide/B01/B01_06_project_detail.webp differ diff --git a/A05_EduDetail/guide/B01/B01_07_company.webp b/A05_EduDetail/guide/B01/B01_07_company.webp new file mode 100644 index 000000000..0c977eec9 Binary files /dev/null and b/A05_EduDetail/guide/B01/B01_07_company.webp differ diff --git a/A05_EduDetail/guide/B01/B01_07_company_edit.webp b/A05_EduDetail/guide/B01/B01_07_company_edit.webp new file mode 100644 index 000000000..853f1dc45 Binary files /dev/null and b/A05_EduDetail/guide/B01/B01_07_company_edit.webp differ diff --git a/A05_EduDetail/guide/B01/B01_07_setting_card.webp b/A05_EduDetail/guide/B01/B01_07_setting_card.webp deleted file mode 100644 index e89b5ae56..000000000 Binary files a/A05_EduDetail/guide/B01/B01_07_setting_card.webp and /dev/null differ diff --git a/A05_EduDetail/guide/B01/B01_08_company_defaults.webp b/A05_EduDetail/guide/B01/B01_08_company_defaults.webp new file mode 100644 index 000000000..ed5825e83 Binary files /dev/null and b/A05_EduDetail/guide/B01/B01_08_company_defaults.webp differ diff --git a/A05_EduDetail/guide/B01/B01_08_sys_overview.webp b/A05_EduDetail/guide/B01/B01_08_sys_overview.webp deleted file mode 100644 index 6a9d5665e..000000000 Binary files a/A05_EduDetail/guide/B01/B01_08_sys_overview.webp and /dev/null differ diff --git a/A05_EduDetail/guide/B01/B01_09_sys_companies.webp b/A05_EduDetail/guide/B01/B01_09_sys_companies.webp new file mode 100644 index 000000000..f37c0ad87 Binary files /dev/null and b/A05_EduDetail/guide/B01/B01_09_sys_companies.webp differ diff --git a/A05_EduDetail/guide/B01/B01_09_sys_defaults.webp b/A05_EduDetail/guide/B01/B01_09_sys_defaults.webp new file mode 100644 index 000000000..b7efc253e Binary files /dev/null and b/A05_EduDetail/guide/B01/B01_09_sys_defaults.webp differ diff --git a/A05_EduDetail/guide/B01/B01_09_sys_logs.webp b/A05_EduDetail/guide/B01/B01_09_sys_logs.webp new file mode 100644 index 000000000..34b668978 Binary files /dev/null and b/A05_EduDetail/guide/B01/B01_09_sys_logs.webp differ diff --git a/A05_EduDetail/guide/B01/B01_09_sys_overview.webp b/A05_EduDetail/guide/B01/B01_09_sys_overview.webp new file mode 100644 index 000000000..c040ea56a Binary files /dev/null and b/A05_EduDetail/guide/B01/B01_09_sys_overview.webp differ diff --git a/A05_EduDetail/guide/B01/B01_09_sys_project_edit.webp b/A05_EduDetail/guide/B01/B01_09_sys_project_edit.webp deleted file mode 100644 index 5aca1089a..000000000 Binary files a/A05_EduDetail/guide/B01/B01_09_sys_project_edit.webp and /dev/null differ diff --git a/A05_EduDetail/guide/B01/B01_09_sys_users.webp b/A05_EduDetail/guide/B01/B01_09_sys_users.webp new file mode 100644 index 000000000..4172c9eae Binary files /dev/null and b/A05_EduDetail/guide/B01/B01_09_sys_users.webp differ diff --git a/A05_EduDetail/guide/B01/B01_10_sys_project_del.webp b/A05_EduDetail/guide/B01/B01_10_sys_project_del.webp deleted file mode 100644 index 425b9121b..000000000 Binary files a/A05_EduDetail/guide/B01/B01_10_sys_project_del.webp and /dev/null differ diff --git a/A05_EduDetail/guide/B01/B01_11_chat.webp b/A05_EduDetail/guide/B01/B01_11_chat.webp new file mode 100644 index 000000000..7a48ae054 Binary files /dev/null and b/A05_EduDetail/guide/B01/B01_11_chat.webp differ diff --git a/A05_EduDetail/guide/B01/B01_11_project_table.webp b/A05_EduDetail/guide/B01/B01_11_project_table.webp deleted file mode 100644 index efa415923..000000000 Binary files a/A05_EduDetail/guide/B01/B01_11_project_table.webp and /dev/null differ diff --git a/A05_EduDetail/guide/B01/B01_12_me.webp b/A05_EduDetail/guide/B01/B01_12_me.webp new file mode 100644 index 000000000..01bad8dbb Binary files /dev/null and b/A05_EduDetail/guide/B01/B01_12_me.webp differ diff --git a/A05_EduDetail/guide/B01/B01_12_profile.webp b/A05_EduDetail/guide/B01/B01_12_profile.webp deleted file mode 100644 index 0a854fff3..000000000 Binary files a/A05_EduDetail/guide/B01/B01_12_profile.webp and /dev/null differ diff --git a/A05_EduDetail/guide/B01/B01_12_user_menu.webp b/A05_EduDetail/guide/B01/B01_12_user_menu.webp new file mode 100644 index 000000000..a9c45e01f Binary files /dev/null and b/A05_EduDetail/guide/B01/B01_12_user_menu.webp differ diff --git a/A05_EduDetail/guide/B01/B01_13_security.webp b/A05_EduDetail/guide/B01/B01_13_security.webp deleted file mode 100644 index c080751ec..000000000 Binary files a/A05_EduDetail/guide/B01/B01_13_security.webp and /dev/null differ diff --git a/A05_EduDetail/guide/B01/_scenes.json b/A05_EduDetail/guide/B01/_scenes.json index 09ae40852..a84781cff 100644 --- a/A05_EduDetail/guide/B01/_scenes.json +++ b/A05_EduDetail/guide/B01/_scenes.json @@ -1,77 +1,246 @@ [ { "name": "B01_00_overview", - "route": "#/b01-account", - "project": "none", + "route": "#/b01-account?view=home", "account": "company_admin", + "project": "none", "viewport": [ 1600, - 1800 + 720 ], "before": [ { "eval": "document.head.insertAdjacentHTML('beforeend','')" }, { - "wait": ".b01-dashboard__grid" + "wait": ".b01-shell__page" }, { - "eval": "(()=>{const E=String.fromCharCode(0xC774,0xBA54,0xC77C),N='이름',P='연락처',PJ='프로젝트명';\nconst names=['홍길동','김영희','박철수','이민수','최지은'];\nwindow.__orig=window.__orig||new Set();\nconst fn=()=>{\n document.querySelectorAll('table').forEach(t=>{\n const ths=[...t.querySelectorAll('thead th')].map(x=>x.textContent.trim());\n if(ths[0]===PJ){[...t.querySelectorAll('tbody tr')].forEach(r=>{const c=r.querySelector('td');if(c&&!c.textContent.trim().startsWith('가이드_'))r.style.display='none';});return;}\n const ie=ths.indexOf(E);if(ie<0)return;const inm=ths.indexOf(N),ip=ths.indexOf(P);\n [...t.querySelectorAll('tbody tr')].forEach((r,i)=>{const td=r.querySelectorAll('td');\n const set=(c,v,nm)=>{if(c&&c.textContent!==v){if(nm&&!names.includes(c.textContent))window.__orig.add(c.textContent.trim());c.textContent=v;}};\n set(td[ie],'user'+(i+1)+'@example.com');\n if(inm>=0)set(td[inm],names[i%5],1);\n if(ip>=0&&td[ip]&&td[ip].textContent.trim()!=='-')set(td[ip],'010-0000-0000');});\n });\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){let s=n.nodeValue;if(!s||!s.trim())continue;\n let v=s.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈/g,'홍길동').replace(/박동철/g,'김영희').replace(/엄상준/g,'박철수').replace(/검증_[^\\s)]+/g,'가이드_견본').replace(/캐미팩토리|브레인검증회사_\\d+/g,'예시건설').replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000');\n if(!/^\\s*user\\d*@example\\.com\\s*$/.test(v))v=v.replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\n if(s.trim()==='test')v='(없음)';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});\n document.querySelectorAll('section img, .ui-modal img').forEach(m=>{if(/sign/i.test(m.alt+m.src)||m.closest('label,div')&&/서명/.test((m.closest('div')||{}).textContent||''))m.style.visibility='hidden';});\n document.querySelectorAll('input').forEach(i=>{if(/@/.test(i.value)&&i.value!=='user@example.com')i.value='user@example.com';if(/검증_/.test(i.value))i.value='가이드_견본';if(/\\d{3}-\\d{2}-\\d{5}/.test(i.value))i.value='000-00-00000';if(/캐미팩토리|브레인검증회사_\\d+/.test(i.value))i.value='예시건설';if(/^0\\d{1,2}-?\\d{3,4}-?\\d{4}$/.test(i.value)&&i.value!=='010-0000-0000')i.value='010-0000-0000';\n if(window.__orig.has(i.value.trim())&&i.value!=='홍길동')i.value='홍길동';});\n};\nfn();setInterval(fn,100);})()" + "wait_ms": 1200 + }, + { + "eval": "(()=>{const W=s=>s\n.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈|브레인관리자/g,'홍길동').replace(/엄상준|브레인사용자/g,'김영희').replace(/박동철/g,'박철수')\n.replace(/캐미팩토리/g,'예시건설').replace(/브레인검증회사_\\d+/g,'예시설계').replace(/검증_[^\\s)]+/g,'가이드_견본')\n.replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000').replace(/\\b0\\d{1,2}-?\\d{3,4}-?\\d{4}\\b/g,'010-0000-0000')\n.replace(/대전광역시[^\\n]*/g,'○○시 ○○구 ○○로 1').replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\nconst fn=()=>{\n document.querySelectorAll('.b01-proj-card,.b01-proj-row').forEach(c=>{const t=c.querySelector('.b01-proj-card__name,td');if(t&&!/^가이드_/.test(t.textContent.trim()))c.style.display='none';});\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){const s=n.nodeValue;if(!s||!s.trim())continue;let v=W(s);if(/^\\s*[엄브박]\\s*$/.test(v))v='홍';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('input').forEach(i=>{const v=W(i.value);if(v!==i.value)i.value=v;});\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});};\nfn();setInterval(fn,100);})()" } ], "clip": null, "callouts": [ { "n": 1, - "sel": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(1)" + "sel": ".b01-shell__org" }, { "n": 2, - "sel": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(2)" + "sel": ".b01-shell__help-btn" }, { "n": 3, - "sel": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(3)" + "sel": ".b01-shell__head .b01-shell__icon-btn" }, { "n": 4, - "sel": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(4)" + "sel": ".b01-shell__user" }, { "n": 5, - "sel": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(7)" + "sel": ".b01-shell__nav" }, { "n": 6, - "sel": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(8)" + "sel": ".b01-shell__page" }, { "n": 7, "sel": ".b01-knowledge-chat__toggle" - }, - { - "n": 8, - "sel": ".app-burger" } ] }, { - "name": "B01_01_new_project_picker", - "route": "#/b01-account", - "project": "none", + "name": "B01_01_home_first", + "route": "#/b01-account?view=home", "account": "company_admin", + "project": "none", "before": [ { "eval": "document.head.insertAdjacentHTML('beforeend','')" }, { - "wait": ".b01-dashboard__grid" + "wait": ".b01-shell__page" }, { - "eval": "(()=>{const E=String.fromCharCode(0xC774,0xBA54,0xC77C),N='이름',P='연락처',PJ='프로젝트명';\nconst names=['홍길동','김영희','박철수','이민수','최지은'];\nwindow.__orig=window.__orig||new Set();\nconst fn=()=>{\n document.querySelectorAll('table').forEach(t=>{\n const ths=[...t.querySelectorAll('thead th')].map(x=>x.textContent.trim());\n if(ths[0]===PJ){[...t.querySelectorAll('tbody tr')].forEach(r=>{const c=r.querySelector('td');if(c&&!c.textContent.trim().startsWith('가이드_'))r.style.display='none';});return;}\n const ie=ths.indexOf(E);if(ie<0)return;const inm=ths.indexOf(N),ip=ths.indexOf(P);\n [...t.querySelectorAll('tbody tr')].forEach((r,i)=>{const td=r.querySelectorAll('td');\n const set=(c,v,nm)=>{if(c&&c.textContent!==v){if(nm&&!names.includes(c.textContent))window.__orig.add(c.textContent.trim());c.textContent=v;}};\n set(td[ie],'user'+(i+1)+'@example.com');\n if(inm>=0)set(td[inm],names[i%5],1);\n if(ip>=0&&td[ip]&&td[ip].textContent.trim()!=='-')set(td[ip],'010-0000-0000');});\n });\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){let s=n.nodeValue;if(!s||!s.trim())continue;\n let v=s.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈/g,'홍길동').replace(/박동철/g,'김영희').replace(/엄상준/g,'박철수').replace(/검증_[^\\s)]+/g,'가이드_견본').replace(/캐미팩토리|브레인검증회사_\\d+/g,'예시건설').replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000');\n if(!/^\\s*user\\d*@example\\.com\\s*$/.test(v))v=v.replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\n if(s.trim()==='test')v='(없음)';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});\n document.querySelectorAll('section img, .ui-modal img').forEach(m=>{if(/sign/i.test(m.alt+m.src)||m.closest('label,div')&&/서명/.test((m.closest('div')||{}).textContent||''))m.style.visibility='hidden';});\n document.querySelectorAll('input').forEach(i=>{if(/@/.test(i.value)&&i.value!=='user@example.com')i.value='user@example.com';if(/검증_/.test(i.value))i.value='가이드_견본';if(/\\d{3}-\\d{2}-\\d{5}/.test(i.value))i.value='000-00-00000';if(/캐미팩토리|브레인검증회사_\\d+/.test(i.value))i.value='예시건설';if(/^0\\d{1,2}-?\\d{3,4}-?\\d{4}$/.test(i.value)&&i.value!=='010-0000-0000')i.value='010-0000-0000';\n if(window.__orig.has(i.value.trim())&&i.value!=='홍길동')i.value='홍길동';});\n};\nfn();setInterval(fn,100);})()" + "wait_ms": 1200 }, { - "click": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(2) .ui-btn--filled" + "eval": "(()=>{const W=s=>s\n.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈|브레인관리자/g,'홍길동').replace(/엄상준|브레인사용자/g,'김영희').replace(/박동철/g,'박철수')\n.replace(/캐미팩토리/g,'예시건설').replace(/브레인검증회사_\\d+/g,'예시설계').replace(/검증_[^\\s)]+/g,'가이드_견본')\n.replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000').replace(/\\b0\\d{1,2}-?\\d{3,4}-?\\d{4}\\b/g,'010-0000-0000')\n.replace(/대전광역시[^\\n]*/g,'○○시 ○○구 ○○로 1').replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\nconst fn=()=>{\n document.querySelectorAll('.b01-proj-card,.b01-proj-row').forEach(c=>{const t=c.querySelector('.b01-proj-card__name,td');if(t&&!/^가이드_/.test(t.textContent.trim()))c.style.display='none';});\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){const s=n.nodeValue;if(!s||!s.trim())continue;let v=W(s);if(/^\\s*[엄브박]\\s*$/.test(v))v='홍';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('input').forEach(i=>{const v=W(i.value);if(v!==i.value)i.value=v;});\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});};\nfn();setInterval(fn,100);})()" + } + ], + "clip": ".b01-shell__page", + "callouts": [ + { + "n": 1, + "sel": ".b01-home__seg" + }, + { + "n": 2, + "sel": ".b01-home__head .ui-btn--filled" + }, + { + "n": 3, + "sel": [ + ".b01-home__step >> nth=0", + ".b01-home__step >> nth=-1" + ] + }, + { + "n": 4, + "sel": "aside.b01-home__side" + } + ] + }, + { + "name": "B01_01_home_many", + "route": "#/b01-account?view=home", + "account": "sys", + "project": "none", + "before": [ + { + "eval": "document.head.insertAdjacentHTML('beforeend','')" + }, + { + "wait": ".b01-shell__page" + }, + { + "wait_ms": 1200 + }, + { + "eval": "(()=>{const W=s=>s\n.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈|브레인관리자/g,'홍길동').replace(/엄상준|브레인사용자/g,'김영희').replace(/박동철/g,'박철수')\n.replace(/캐미팩토리/g,'예시건설').replace(/브레인검증회사_\\d+/g,'예시설계').replace(/검증_[^\\s)]+/g,'가이드_견본')\n.replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000').replace(/\\b0\\d{1,2}-?\\d{3,4}-?\\d{4}\\b/g,'010-0000-0000')\n.replace(/대전광역시[^\\n]*/g,'○○시 ○○구 ○○로 1').replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\nconst fn=()=>{\n document.querySelectorAll('.b01-proj-card,.b01-proj-row').forEach(c=>{const t=c.querySelector('.b01-proj-card__name,td');if(t&&!/^가이드_/.test(t.textContent.trim()))c.style.display='none';});\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){const s=n.nodeValue;if(!s||!s.trim())continue;let v=W(s);if(/^\\s*[엄브박]\\s*$/.test(v))v='홍';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('input').forEach(i=>{const v=W(i.value);if(v!==i.value)i.value=v;});\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});};\nfn();setInterval(fn,100);})()" + } + ], + "clip": ".b01-shell__page", + "callouts": [ + { + "n": 1, + "sel": ".b01-home__seg" + }, + { + "n": 2, + "sel": ".b01-home__kpis" + }, + { + "n": 3, + "sel": "aside.b01-home__side" + } + ] + }, + { + "name": "B01_02_projects", + "route": "#/b01-account?view=projects", + "account": "sys", + "project": "none", + "before": [ + { + "eval": "document.head.insertAdjacentHTML('beforeend','')" + }, + { + "wait": ".b01-shell__page" + }, + { + "wait_ms": 1200 + }, + { + "eval": "(()=>{const W=s=>s\n.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈|브레인관리자/g,'홍길동').replace(/엄상준|브레인사용자/g,'김영희').replace(/박동철/g,'박철수')\n.replace(/캐미팩토리/g,'예시건설').replace(/브레인검증회사_\\d+/g,'예시설계').replace(/검증_[^\\s)]+/g,'가이드_견본')\n.replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000').replace(/\\b0\\d{1,2}-?\\d{3,4}-?\\d{4}\\b/g,'010-0000-0000')\n.replace(/대전광역시[^\\n]*/g,'○○시 ○○구 ○○로 1').replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\nconst fn=()=>{\n document.querySelectorAll('.b01-proj-card,.b01-proj-row').forEach(c=>{const t=c.querySelector('.b01-proj-card__name,td');if(t&&!/^가이드_/.test(t.textContent.trim()))c.style.display='none';});\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){const s=n.nodeValue;if(!s||!s.trim())continue;let v=W(s);if(/^\\s*[엄브박]\\s*$/.test(v))v='홍';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('input').forEach(i=>{const v=W(i.value);if(v!==i.value)i.value=v;});\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});};\nfn();setInterval(fn,100);})()" + } + ], + "clip": ".b01-shell__page", + "callouts": [ + { + "n": 1, + "sel": ".b01-proj-seg" + }, + { + "n": 2, + "sel": ".b01-proj-head .ui-btn--filled" + }, + { + "n": 3, + "sel": ".b01-proj-search" + }, + { + "n": 4, + "sel": [ + ".b01-proj-chip >> nth=0", + ".b01-proj-chip >> nth=-1" + ] + }, + { + "n": 5, + "sel": [ + ".b01-proj-select", + ".b01-proj-tools .b01-proj-seg" + ] + }, + { + "n": 6, + "sel": ".b01-proj-card >> visible=true" + } + ] + }, + { + "name": "B01_02_projects_table", + "route": "#/b01-account?view=projects", + "account": "sys", + "project": "none", + "before": [ + { + "eval": "document.head.insertAdjacentHTML('beforeend','')" + }, + { + "wait": ".b01-shell__page" + }, + { + "wait_ms": 1200 + }, + { + "eval": "(()=>{const W=s=>s\n.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈|브레인관리자/g,'홍길동').replace(/엄상준|브레인사용자/g,'김영희').replace(/박동철/g,'박철수')\n.replace(/캐미팩토리/g,'예시건설').replace(/브레인검증회사_\\d+/g,'예시설계').replace(/검증_[^\\s)]+/g,'가이드_견본')\n.replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000').replace(/\\b0\\d{1,2}-?\\d{3,4}-?\\d{4}\\b/g,'010-0000-0000')\n.replace(/대전광역시[^\\n]*/g,'○○시 ○○구 ○○로 1').replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\nconst fn=()=>{\n document.querySelectorAll('.b01-proj-card,.b01-proj-row').forEach(c=>{const t=c.querySelector('.b01-proj-card__name,td');if(t&&!/^가이드_/.test(t.textContent.trim()))c.style.display='none';});\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){const s=n.nodeValue;if(!s||!s.trim())continue;let v=W(s);if(/^\\s*[엄브박]\\s*$/.test(v))v='홍';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('input').forEach(i=>{const v=W(i.value);if(v!==i.value)i.value=v;});\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});};\nfn();setInterval(fn,100);})()" + }, + { + "click": ".b01-proj-seg button:nth-child(2)" + }, + { + "wait": ".b01-proj-table" + } + ], + "clip": ".b01-shell__page", + "callouts": [ + { + "n": 1, + "sel": ".b01-proj-table tr >> nth=0" + }, + { + "n": 2, + "sel": ".b01-proj-more >> visible=true" + } + ] + }, + { + "name": "B01_02_new_project", + "route": "#/b01-account?view=projects", + "account": "company_admin", + "project": "none", + "before": [ + { + "eval": "document.head.insertAdjacentHTML('beforeend','')" + }, + { + "wait": ".b01-shell__page" + }, + { + "wait_ms": 1200 + }, + { + "eval": "(()=>{const W=s=>s\n.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈|브레인관리자/g,'홍길동').replace(/엄상준|브레인사용자/g,'김영희').replace(/박동철/g,'박철수')\n.replace(/캐미팩토리/g,'예시건설').replace(/브레인검증회사_\\d+/g,'예시설계').replace(/검증_[^\\s)]+/g,'가이드_견본')\n.replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000').replace(/\\b0\\d{1,2}-?\\d{3,4}-?\\d{4}\\b/g,'010-0000-0000')\n.replace(/대전광역시[^\\n]*/g,'○○시 ○○구 ○○로 1').replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\nconst fn=()=>{\n document.querySelectorAll('.b01-proj-card,.b01-proj-row').forEach(c=>{const t=c.querySelector('.b01-proj-card__name,td');if(t&&!/^가이드_/.test(t.textContent.trim()))c.style.display='none';});\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){const s=n.nodeValue;if(!s||!s.trim())continue;let v=W(s);if(/^\\s*[엄브박]\\s*$/.test(v))v='홍';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('input').forEach(i=>{const v=W(i.value);if(v!==i.value)i.value=v;});\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});};\nfn();setInterval(fn,100);})()" + }, + { + "click": ".b01-proj-head .ui-btn--filled" }, { "wait": ".b01-new-project__grid" @@ -101,426 +270,665 @@ ] }, { - "name": "B01_02_temp_create_modal", - "route": "#/b01-account", - "project": "none", + "name": "B01_03_assigned", + "route": "#/b01-account?view=assigned", "account": "company_admin", + "project": "none", "before": [ { "eval": "document.head.insertAdjacentHTML('beforeend','')" }, { - "wait": ".b01-dashboard__grid" + "wait": ".b01-shell__page" }, { - "eval": "(()=>{const E=String.fromCharCode(0xC774,0xBA54,0xC77C),N='이름',P='연락처',PJ='프로젝트명';\nconst names=['홍길동','김영희','박철수','이민수','최지은'];\nwindow.__orig=window.__orig||new Set();\nconst fn=()=>{\n document.querySelectorAll('table').forEach(t=>{\n const ths=[...t.querySelectorAll('thead th')].map(x=>x.textContent.trim());\n if(ths[0]===PJ){[...t.querySelectorAll('tbody tr')].forEach(r=>{const c=r.querySelector('td');if(c&&!c.textContent.trim().startsWith('가이드_'))r.style.display='none';});return;}\n const ie=ths.indexOf(E);if(ie<0)return;const inm=ths.indexOf(N),ip=ths.indexOf(P);\n [...t.querySelectorAll('tbody tr')].forEach((r,i)=>{const td=r.querySelectorAll('td');\n const set=(c,v,nm)=>{if(c&&c.textContent!==v){if(nm&&!names.includes(c.textContent))window.__orig.add(c.textContent.trim());c.textContent=v;}};\n set(td[ie],'user'+(i+1)+'@example.com');\n if(inm>=0)set(td[inm],names[i%5],1);\n if(ip>=0&&td[ip]&&td[ip].textContent.trim()!=='-')set(td[ip],'010-0000-0000');});\n });\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){let s=n.nodeValue;if(!s||!s.trim())continue;\n let v=s.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈/g,'홍길동').replace(/박동철/g,'김영희').replace(/엄상준/g,'박철수').replace(/검증_[^\\s)]+/g,'가이드_견본').replace(/캐미팩토리|브레인검증회사_\\d+/g,'예시건설').replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000');\n if(!/^\\s*user\\d*@example\\.com\\s*$/.test(v))v=v.replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\n if(s.trim()==='test')v='(없음)';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});\n document.querySelectorAll('section img, .ui-modal img').forEach(m=>{if(/sign/i.test(m.alt+m.src)||m.closest('label,div')&&/서명/.test((m.closest('div')||{}).textContent||''))m.style.visibility='hidden';});\n document.querySelectorAll('input').forEach(i=>{if(/@/.test(i.value)&&i.value!=='user@example.com')i.value='user@example.com';if(/검증_/.test(i.value))i.value='가이드_견본';if(/\\d{3}-\\d{2}-\\d{5}/.test(i.value))i.value='000-00-00000';if(/캐미팩토리|브레인검증회사_\\d+/.test(i.value))i.value='예시건설';if(/^0\\d{1,2}-?\\d{3,4}-?\\d{4}$/.test(i.value)&&i.value!=='010-0000-0000')i.value='010-0000-0000';\n if(window.__orig.has(i.value.trim())&&i.value!=='홍길동')i.value='홍길동';});\n};\nfn();setInterval(fn,100);})()" + "wait_ms": 1200 }, { - "click": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(3) .ui-btn--filled" + "eval": "(()=>{const W=s=>s\n.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈|브레인관리자/g,'홍길동').replace(/엄상준|브레인사용자/g,'김영희').replace(/박동철/g,'박철수')\n.replace(/캐미팩토리/g,'예시건설').replace(/브레인검증회사_\\d+/g,'예시설계').replace(/검증_[^\\s)]+/g,'가이드_견본')\n.replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000').replace(/\\b0\\d{1,2}-?\\d{3,4}-?\\d{4}\\b/g,'010-0000-0000')\n.replace(/대전광역시[^\\n]*/g,'○○시 ○○구 ○○로 1').replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\nconst fn=()=>{\n document.querySelectorAll('.b01-proj-card,.b01-proj-row').forEach(c=>{const t=c.querySelector('.b01-proj-card__name,td');if(t&&!/^가이드_/.test(t.textContent.trim()))c.style.display='none';});\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){const s=n.nodeValue;if(!s||!s.trim())continue;let v=W(s);if(/^\\s*[엄브박]\\s*$/.test(v))v='홍';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('input').forEach(i=>{const v=W(i.value);if(v!==i.value)i.value=v;});\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});};\nfn();setInterval(fn,100);})()" + } + ], + "clip": ".b01-shell__page", + "callouts": [ + { + "n": 1, + "sel": ".b01-pg__title-wrap" }, { - "wait_ms": 800 + "n": 2, + "sel": ".ui-empty" + } + ] + }, + { + "name": "B01_04_temp", + "route": "#/b01-account?view=temp", + "account": "company_admin", + "project": "none", + "before": [ + { + "eval": "document.head.insertAdjacentHTML('beforeend','')" + }, + { + "wait": ".b01-shell__page" + }, + { + "wait_ms": 1200 + }, + { + "eval": "(()=>{const W=s=>s\n.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈|브레인관리자/g,'홍길동').replace(/엄상준|브레인사용자/g,'김영희').replace(/박동철/g,'박철수')\n.replace(/캐미팩토리/g,'예시건설').replace(/브레인검증회사_\\d+/g,'예시설계').replace(/검증_[^\\s)]+/g,'가이드_견본')\n.replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000').replace(/\\b0\\d{1,2}-?\\d{3,4}-?\\d{4}\\b/g,'010-0000-0000')\n.replace(/대전광역시[^\\n]*/g,'○○시 ○○구 ○○로 1').replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\nconst fn=()=>{\n document.querySelectorAll('.b01-proj-card,.b01-proj-row').forEach(c=>{const t=c.querySelector('.b01-proj-card__name,td');if(t&&!/^가이드_/.test(t.textContent.trim()))c.style.display='none';});\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){const s=n.nodeValue;if(!s||!s.trim())continue;let v=W(s);if(/^\\s*[엄브박]\\s*$/.test(v))v='홍';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('input').forEach(i=>{const v=W(i.value);if(v!==i.value)i.value=v;});\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});};\nfn();setInterval(fn,100);})()" + } + ], + "clip": ".b01-shell__page", + "callouts": [ + { + "n": 1, + "sel": ".b01-pg__action button" + }, + { + "n": 2, + "sel": ".ui-empty" + } + ] + }, + { + "name": "B01_04_temp_modal", + "route": "#/b01-account?view=temp", + "account": "company_admin", + "project": "none", + "before": [ + { + "eval": "document.head.insertAdjacentHTML('beforeend','')" + }, + { + "wait": ".b01-shell__page" + }, + { + "wait_ms": 1200 + }, + { + "eval": "(()=>{const W=s=>s\n.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈|브레인관리자/g,'홍길동').replace(/엄상준|브레인사용자/g,'김영희').replace(/박동철/g,'박철수')\n.replace(/캐미팩토리/g,'예시건설').replace(/브레인검증회사_\\d+/g,'예시설계').replace(/검증_[^\\s)]+/g,'가이드_견본')\n.replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000').replace(/\\b0\\d{1,2}-?\\d{3,4}-?\\d{4}\\b/g,'010-0000-0000')\n.replace(/대전광역시[^\\n]*/g,'○○시 ○○구 ○○로 1').replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\nconst fn=()=>{\n document.querySelectorAll('.b01-proj-card,.b01-proj-row').forEach(c=>{const t=c.querySelector('.b01-proj-card__name,td');if(t&&!/^가이드_/.test(t.textContent.trim()))c.style.display='none';});\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){const s=n.nodeValue;if(!s||!s.trim())continue;let v=W(s);if(/^\\s*[엄브박]\\s*$/.test(v))v='홍';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('input').forEach(i=>{const v=W(i.value);if(v!==i.value)i.value=v;});\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});};\nfn();setInterval(fn,100);})()" + }, + { + "click": ".b01-pg__action button" + }, + { + "wait": ".b01-dashboard__modal-panel" + }, + { + "wait_ms": 500 } ], "clip": ".b01-dashboard__modal-panel", "callouts": [ { "n": 1, - "sel": ".b01-dashboard__modal-panel input, .b01-dashboard__modal-panel select" + "sel": ".b01-dashboard__modal-panel input" }, { "n": 2, - "sel": ".b01-dashboard__modal-panel .b01-dashboard__actions" - } - ] - }, - { - "name": "B01_03_member_add_modal", - "route": "#/b01-account", - "project": "none", - "account": "company_admin", - "before": [ - { - "eval": "document.head.insertAdjacentHTML('beforeend','')" - }, - { - "wait": ".b01-dashboard__grid" - }, - { - "eval": "(()=>{const E=String.fromCharCode(0xC774,0xBA54,0xC77C),N='이름',P='연락처',PJ='프로젝트명';\nconst names=['홍길동','김영희','박철수','이민수','최지은'];\nwindow.__orig=window.__orig||new Set();\nconst fn=()=>{\n document.querySelectorAll('table').forEach(t=>{\n const ths=[...t.querySelectorAll('thead th')].map(x=>x.textContent.trim());\n if(ths[0]===PJ){[...t.querySelectorAll('tbody tr')].forEach(r=>{const c=r.querySelector('td');if(c&&!c.textContent.trim().startsWith('가이드_'))r.style.display='none';});return;}\n const ie=ths.indexOf(E);if(ie<0)return;const inm=ths.indexOf(N),ip=ths.indexOf(P);\n [...t.querySelectorAll('tbody tr')].forEach((r,i)=>{const td=r.querySelectorAll('td');\n const set=(c,v,nm)=>{if(c&&c.textContent!==v){if(nm&&!names.includes(c.textContent))window.__orig.add(c.textContent.trim());c.textContent=v;}};\n set(td[ie],'user'+(i+1)+'@example.com');\n if(inm>=0)set(td[inm],names[i%5],1);\n if(ip>=0&&td[ip]&&td[ip].textContent.trim()!=='-')set(td[ip],'010-0000-0000');});\n });\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){let s=n.nodeValue;if(!s||!s.trim())continue;\n let v=s.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈/g,'홍길동').replace(/박동철/g,'김영희').replace(/엄상준/g,'박철수').replace(/검증_[^\\s)]+/g,'가이드_견본').replace(/캐미팩토리|브레인검증회사_\\d+/g,'예시건설').replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000');\n if(!/^\\s*user\\d*@example\\.com\\s*$/.test(v))v=v.replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\n if(s.trim()==='test')v='(없음)';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});\n document.querySelectorAll('section img, .ui-modal img').forEach(m=>{if(/sign/i.test(m.alt+m.src)||m.closest('label,div')&&/서명/.test((m.closest('div')||{}).textContent||''))m.style.visibility='hidden';});\n document.querySelectorAll('input').forEach(i=>{if(/@/.test(i.value)&&i.value!=='user@example.com')i.value='user@example.com';if(/검증_/.test(i.value))i.value='가이드_견본';if(/\\d{3}-\\d{2}-\\d{5}/.test(i.value))i.value='000-00-00000';if(/캐미팩토리|브레인검증회사_\\d+/.test(i.value))i.value='예시건설';if(/^0\\d{1,2}-?\\d{3,4}-?\\d{4}$/.test(i.value)&&i.value!=='010-0000-0000')i.value='010-0000-0000';\n if(window.__orig.has(i.value.trim())&&i.value!=='홍길동')i.value='홍길동';});\n};\nfn();setInterval(fn,100);})()" - }, - { - "click": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(4) .ui-btn--filled" - }, - { - "wait_ms": 800 - } - ], - "clip": ".b01-dashboard__modal-panel", - "callouts": [ - { - "n": 1, - "sel": ".b01-dashboard__modal-panel input, .b01-dashboard__modal-panel select" - }, - { - "n": 2, - "sel": ".b01-dashboard__modal-panel .b01-dashboard__actions" - } - ] - }, - { - "name": "B01_04_role_change", - "route": "#/b01-account", - "project": "none", - "account": "company_admin", - "before": [ - { - "eval": "document.head.insertAdjacentHTML('beforeend','')" - }, - { - "wait": ".b01-dashboard__grid" - }, - { - "eval": "(()=>{const E=String.fromCharCode(0xC774,0xBA54,0xC77C),N='이름',P='연락처',PJ='프로젝트명';\nconst names=['홍길동','김영희','박철수','이민수','최지은'];\nwindow.__orig=window.__orig||new Set();\nconst fn=()=>{\n document.querySelectorAll('table').forEach(t=>{\n const ths=[...t.querySelectorAll('thead th')].map(x=>x.textContent.trim());\n if(ths[0]===PJ){[...t.querySelectorAll('tbody tr')].forEach(r=>{const c=r.querySelector('td');if(c&&!c.textContent.trim().startsWith('가이드_'))r.style.display='none';});return;}\n const ie=ths.indexOf(E);if(ie<0)return;const inm=ths.indexOf(N),ip=ths.indexOf(P);\n [...t.querySelectorAll('tbody tr')].forEach((r,i)=>{const td=r.querySelectorAll('td');\n const set=(c,v,nm)=>{if(c&&c.textContent!==v){if(nm&&!names.includes(c.textContent))window.__orig.add(c.textContent.trim());c.textContent=v;}};\n set(td[ie],'user'+(i+1)+'@example.com');\n if(inm>=0)set(td[inm],names[i%5],1);\n if(ip>=0&&td[ip]&&td[ip].textContent.trim()!=='-')set(td[ip],'010-0000-0000');});\n });\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){let s=n.nodeValue;if(!s||!s.trim())continue;\n let v=s.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈/g,'홍길동').replace(/박동철/g,'김영희').replace(/엄상준/g,'박철수').replace(/검증_[^\\s)]+/g,'가이드_견본').replace(/캐미팩토리|브레인검증회사_\\d+/g,'예시건설').replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000');\n if(!/^\\s*user\\d*@example\\.com\\s*$/.test(v))v=v.replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\n if(s.trim()==='test')v='(없음)';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});\n document.querySelectorAll('section img, .ui-modal img').forEach(m=>{if(/sign/i.test(m.alt+m.src)||m.closest('label,div')&&/서명/.test((m.closest('div')||{}).textContent||''))m.style.visibility='hidden';});\n document.querySelectorAll('input').forEach(i=>{if(/@/.test(i.value)&&i.value!=='user@example.com')i.value='user@example.com';if(/검증_/.test(i.value))i.value='가이드_견본';if(/\\d{3}-\\d{2}-\\d{5}/.test(i.value))i.value='000-00-00000';if(/캐미팩토리|브레인검증회사_\\d+/.test(i.value))i.value='예시건설';if(/^0\\d{1,2}-?\\d{3,4}-?\\d{4}$/.test(i.value)&&i.value!=='010-0000-0000')i.value='010-0000-0000';\n if(window.__orig.has(i.value.trim())&&i.value!=='홍길동')i.value='홍길동';});\n};\nfn();setInterval(fn,100);})()" - }, - { - "click": "button:has-text('역할 변경')" - }, - { - "wait_ms": 800 - } - ], - "clip": ".b01-dashboard__modal-panel", - "callouts": [ - { - "n": 1, - "sel": ".b01-dashboard__modal-panel input, .b01-dashboard__modal-panel select" - }, - { - "n": 2, - "sel": ".b01-dashboard__modal-panel .b01-dashboard__actions" - } - ] - }, - { - "name": "B01_05_company_edit", - "route": "#/b01-account", - "project": "none", - "account": "company_admin", - "before": [ - { - "eval": "document.head.insertAdjacentHTML('beforeend','')" - }, - { - "wait": ".b01-dashboard__grid" - }, - { - "eval": "(()=>{const E=String.fromCharCode(0xC774,0xBA54,0xC77C),N='이름',P='연락처',PJ='프로젝트명';\nconst names=['홍길동','김영희','박철수','이민수','최지은'];\nwindow.__orig=window.__orig||new Set();\nconst fn=()=>{\n document.querySelectorAll('table').forEach(t=>{\n const ths=[...t.querySelectorAll('thead th')].map(x=>x.textContent.trim());\n if(ths[0]===PJ){[...t.querySelectorAll('tbody tr')].forEach(r=>{const c=r.querySelector('td');if(c&&!c.textContent.trim().startsWith('가이드_'))r.style.display='none';});return;}\n const ie=ths.indexOf(E);if(ie<0)return;const inm=ths.indexOf(N),ip=ths.indexOf(P);\n [...t.querySelectorAll('tbody tr')].forEach((r,i)=>{const td=r.querySelectorAll('td');\n const set=(c,v,nm)=>{if(c&&c.textContent!==v){if(nm&&!names.includes(c.textContent))window.__orig.add(c.textContent.trim());c.textContent=v;}};\n set(td[ie],'user'+(i+1)+'@example.com');\n if(inm>=0)set(td[inm],names[i%5],1);\n if(ip>=0&&td[ip]&&td[ip].textContent.trim()!=='-')set(td[ip],'010-0000-0000');});\n });\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){let s=n.nodeValue;if(!s||!s.trim())continue;\n let v=s.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈/g,'홍길동').replace(/박동철/g,'김영희').replace(/엄상준/g,'박철수').replace(/검증_[^\\s)]+/g,'가이드_견본').replace(/캐미팩토리|브레인검증회사_\\d+/g,'예시건설').replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000');\n if(!/^\\s*user\\d*@example\\.com\\s*$/.test(v))v=v.replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\n if(s.trim()==='test')v='(없음)';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});\n document.querySelectorAll('section img, .ui-modal img').forEach(m=>{if(/sign/i.test(m.alt+m.src)||m.closest('label,div')&&/서명/.test((m.closest('div')||{}).textContent||''))m.style.visibility='hidden';});\n document.querySelectorAll('input').forEach(i=>{if(/@/.test(i.value)&&i.value!=='user@example.com')i.value='user@example.com';if(/검증_/.test(i.value))i.value='가이드_견본';if(/\\d{3}-\\d{2}-\\d{5}/.test(i.value))i.value='000-00-00000';if(/캐미팩토리|브레인검증회사_\\d+/.test(i.value))i.value='예시건설';if(/^0\\d{1,2}-?\\d{3,4}-?\\d{4}$/.test(i.value)&&i.value!=='010-0000-0000')i.value='010-0000-0000';\n if(window.__orig.has(i.value.trim())&&i.value!=='홍길동')i.value='홍길동';});\n};\nfn();setInterval(fn,100);})()" - }, - { - "click": "button:has-text('회사 정보 수정')" - }, - { - "wait_ms": 800 - } - ], - "clip": ".b01-dashboard__modal-panel", - "callouts": [ - { - "n": 1, - "sel": ".b01-dashboard__modal-panel input, .b01-dashboard__modal-panel select" - }, - { - "n": 2, - "sel": ".b01-dashboard__modal-panel .b01-dashboard__actions" - } - ] - }, - { - "name": "B01_06_chat", - "route": "#/b01-account", - "project": "none", - "viewport": [ - 1600, - 900 - ], - "account": "company_admin", - "before": [ - { - "eval": "document.head.insertAdjacentHTML('beforeend','')" - }, - { - "wait": ".b01-dashboard__grid" - }, - { - "eval": "(()=>{const E=String.fromCharCode(0xC774,0xBA54,0xC77C),N='이름',P='연락처',PJ='프로젝트명';\nconst names=['홍길동','김영희','박철수','이민수','최지은'];\nwindow.__orig=window.__orig||new Set();\nconst fn=()=>{\n document.querySelectorAll('table').forEach(t=>{\n const ths=[...t.querySelectorAll('thead th')].map(x=>x.textContent.trim());\n if(ths[0]===PJ){[...t.querySelectorAll('tbody tr')].forEach(r=>{const c=r.querySelector('td');if(c&&!c.textContent.trim().startsWith('가이드_'))r.style.display='none';});return;}\n const ie=ths.indexOf(E);if(ie<0)return;const inm=ths.indexOf(N),ip=ths.indexOf(P);\n [...t.querySelectorAll('tbody tr')].forEach((r,i)=>{const td=r.querySelectorAll('td');\n const set=(c,v,nm)=>{if(c&&c.textContent!==v){if(nm&&!names.includes(c.textContent))window.__orig.add(c.textContent.trim());c.textContent=v;}};\n set(td[ie],'user'+(i+1)+'@example.com');\n if(inm>=0)set(td[inm],names[i%5],1);\n if(ip>=0&&td[ip]&&td[ip].textContent.trim()!=='-')set(td[ip],'010-0000-0000');});\n });\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){let s=n.nodeValue;if(!s||!s.trim())continue;\n let v=s.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈/g,'홍길동').replace(/박동철/g,'김영희').replace(/엄상준/g,'박철수').replace(/검증_[^\\s)]+/g,'가이드_견본').replace(/캐미팩토리|브레인검증회사_\\d+/g,'예시건설').replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000');\n if(!/^\\s*user\\d*@example\\.com\\s*$/.test(v))v=v.replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\n if(s.trim()==='test')v='(없음)';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});\n document.querySelectorAll('section img, .ui-modal img').forEach(m=>{if(/sign/i.test(m.alt+m.src)||m.closest('label,div')&&/서명/.test((m.closest('div')||{}).textContent||''))m.style.visibility='hidden';});\n document.querySelectorAll('input').forEach(i=>{if(/@/.test(i.value)&&i.value!=='user@example.com')i.value='user@example.com';if(/검증_/.test(i.value))i.value='가이드_견본';if(/\\d{3}-\\d{2}-\\d{5}/.test(i.value))i.value='000-00-00000';if(/캐미팩토리|브레인검증회사_\\d+/.test(i.value))i.value='예시건설';if(/^0\\d{1,2}-?\\d{3,4}-?\\d{4}$/.test(i.value)&&i.value!=='010-0000-0000')i.value='010-0000-0000';\n if(window.__orig.has(i.value.trim())&&i.value!=='홍길동')i.value='홍길동';});\n};\nfn();setInterval(fn,100);})()" - }, - { - "click": ".b01-knowledge-chat__toggle" - }, - { - "wait_ms": 1000 - } - ], - "clip": ".b01-knowledge-chat__panel", - "callouts": [ - { - "n": 1, - "sel": ".b01-knowledge-chat__panel .b01-knowledge-chat__messages" - }, - { - "n": 2, - "sel": ".b01-knowledge-chat__panel .b01-knowledge-chat__form" + "sel": ".b01-dashboard__modal-panel .ui-btn >> nth=0" }, { "n": 3, - "sel": ".b01-knowledge-chat__panel .b01-knowledge-chat__close" + "sel": ".b01-dashboard__modal-panel .b01-dashboard__actions" } ] }, { - "name": "B01_07_setting_card", - "route": "#/b01-account", - "project": "none", + "name": "B01_05_people", + "route": "#/b01-account?view=people", "account": "company_admin", + "project": "none", "before": [ { "eval": "document.head.insertAdjacentHTML('beforeend','')" }, { - "wait": ".b01-dashboard__grid" + "wait": ".b01-shell__page" }, { - "eval": "(()=>{const E=String.fromCharCode(0xC774,0xBA54,0xC77C),N='이름',P='연락처',PJ='프로젝트명';\nconst names=['홍길동','김영희','박철수','이민수','최지은'];\nwindow.__orig=window.__orig||new Set();\nconst fn=()=>{\n document.querySelectorAll('table').forEach(t=>{\n const ths=[...t.querySelectorAll('thead th')].map(x=>x.textContent.trim());\n if(ths[0]===PJ){[...t.querySelectorAll('tbody tr')].forEach(r=>{const c=r.querySelector('td');if(c&&!c.textContent.trim().startsWith('가이드_'))r.style.display='none';});return;}\n const ie=ths.indexOf(E);if(ie<0)return;const inm=ths.indexOf(N),ip=ths.indexOf(P);\n [...t.querySelectorAll('tbody tr')].forEach((r,i)=>{const td=r.querySelectorAll('td');\n const set=(c,v,nm)=>{if(c&&c.textContent!==v){if(nm&&!names.includes(c.textContent))window.__orig.add(c.textContent.trim());c.textContent=v;}};\n set(td[ie],'user'+(i+1)+'@example.com');\n if(inm>=0)set(td[inm],names[i%5],1);\n if(ip>=0&&td[ip]&&td[ip].textContent.trim()!=='-')set(td[ip],'010-0000-0000');});\n });\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){let s=n.nodeValue;if(!s||!s.trim())continue;\n let v=s.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈/g,'홍길동').replace(/박동철/g,'김영희').replace(/엄상준/g,'박철수').replace(/검증_[^\\s)]+/g,'가이드_견본').replace(/캐미팩토리|브레인검증회사_\\d+/g,'예시건설').replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000');\n if(!/^\\s*user\\d*@example\\.com\\s*$/.test(v))v=v.replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\n if(s.trim()==='test')v='(없음)';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});\n document.querySelectorAll('section img, .ui-modal img').forEach(m=>{if(/sign/i.test(m.alt+m.src)||m.closest('label,div')&&/서명/.test((m.closest('div')||{}).textContent||''))m.style.visibility='hidden';});\n document.querySelectorAll('input').forEach(i=>{if(/@/.test(i.value)&&i.value!=='user@example.com')i.value='user@example.com';if(/검증_/.test(i.value))i.value='가이드_견본';if(/\\d{3}-\\d{2}-\\d{5}/.test(i.value))i.value='000-00-00000';if(/캐미팩토리|브레인검증회사_\\d+/.test(i.value))i.value='예시건설';if(/^0\\d{1,2}-?\\d{3,4}-?\\d{4}$/.test(i.value)&&i.value!=='010-0000-0000')i.value='010-0000-0000';\n if(window.__orig.has(i.value.trim())&&i.value!=='홍길동')i.value='홍길동';});\n};\nfn();setInterval(fn,100);})()" + "wait_ms": 1200 + }, + { + "eval": "(()=>{const W=s=>s\n.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈|브레인관리자/g,'홍길동').replace(/엄상준|브레인사용자/g,'김영희').replace(/박동철/g,'박철수')\n.replace(/캐미팩토리/g,'예시건설').replace(/브레인검증회사_\\d+/g,'예시설계').replace(/검증_[^\\s)]+/g,'가이드_견본')\n.replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000').replace(/\\b0\\d{1,2}-?\\d{3,4}-?\\d{4}\\b/g,'010-0000-0000')\n.replace(/대전광역시[^\\n]*/g,'○○시 ○○구 ○○로 1').replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\nconst fn=()=>{\n document.querySelectorAll('.b01-proj-card,.b01-proj-row').forEach(c=>{const t=c.querySelector('.b01-proj-card__name,td');if(t&&!/^가이드_/.test(t.textContent.trim()))c.style.display='none';});\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){const s=n.nodeValue;if(!s||!s.trim())continue;let v=W(s);if(/^\\s*[엄브박]\\s*$/.test(v))v='홍';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('input').forEach(i=>{const v=W(i.value);if(v!==i.value)i.value=v;});\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});};\nfn();setInterval(fn,100);})()" } ], - "clip": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(1)", - "callouts": [] + "clip": ".b01-shell__page", + "callouts": [ + { + "n": 1, + "sel": ".b01-pg__action button" + }, + { + "n": 2, + "sel": ".b01-pg-tabs" + }, + { + "n": 3, + "sel": ".ui-table-wrap thead" + }, + { + "n": 4, + "sel": ".ui-row-menu__btn >> nth=0" + } + ] }, { - "name": "B01_08_sys_overview", - "route": "#/b01-account", + "name": "B01_05_member_add", + "route": "#/b01-account?view=people", + "account": "company_admin", + "project": "none", + "before": [ + { + "eval": "document.head.insertAdjacentHTML('beforeend','')" + }, + { + "wait": ".b01-shell__page" + }, + { + "wait_ms": 1200 + }, + { + "eval": "(()=>{const W=s=>s\n.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈|브레인관리자/g,'홍길동').replace(/엄상준|브레인사용자/g,'김영희').replace(/박동철/g,'박철수')\n.replace(/캐미팩토리/g,'예시건설').replace(/브레인검증회사_\\d+/g,'예시설계').replace(/검증_[^\\s)]+/g,'가이드_견본')\n.replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000').replace(/\\b0\\d{1,2}-?\\d{3,4}-?\\d{4}\\b/g,'010-0000-0000')\n.replace(/대전광역시[^\\n]*/g,'○○시 ○○구 ○○로 1').replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\nconst fn=()=>{\n document.querySelectorAll('.b01-proj-card,.b01-proj-row').forEach(c=>{const t=c.querySelector('.b01-proj-card__name,td');if(t&&!/^가이드_/.test(t.textContent.trim()))c.style.display='none';});\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){const s=n.nodeValue;if(!s||!s.trim())continue;let v=W(s);if(/^\\s*[엄브박]\\s*$/.test(v))v='홍';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('input').forEach(i=>{const v=W(i.value);if(v!==i.value)i.value=v;});\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});};\nfn();setInterval(fn,100);})()" + }, + { + "click": ".b01-pg__action button" + }, + { + "wait": ".b01-dashboard__modal-panel" + }, + { + "wait_ms": 500 + } + ], + "clip": ".b01-dashboard__modal-panel", + "callouts": [ + { + "n": 1, + "sel": ".b01-dashboard__modal-panel input" + }, + { + "n": 2, + "sel": ".b01-dashboard__modal-panel .b01-dashboard__actions" + } + ] + }, + { + "name": "B01_06_project_detail", + "route": "#/b01-account?view=project&id=c2390e1c-ee66-42ef-8cd7-253ec00bf904", + "account": "sys", "project": "none", "viewport": [ 1600, - 3080 + 1100 ], "before": [ { "eval": "document.head.insertAdjacentHTML('beforeend','')" }, { - "wait": ".b01-dashboard__grid" + "wait": ".b01-shell__page" }, { - "eval": "(()=>{const E=String.fromCharCode(0xC774,0xBA54,0xC77C),N='이름',P='연락처',PJ='프로젝트명';\nconst names=['홍길동','김영희','박철수','이민수','최지은'];\nwindow.__orig=window.__orig||new Set();\nconst fn=()=>{\n document.querySelectorAll('table').forEach(t=>{\n const ths=[...t.querySelectorAll('thead th')].map(x=>x.textContent.trim());\n if(ths[0]===PJ){[...t.querySelectorAll('tbody tr')].forEach(r=>{const c=r.querySelector('td');if(c&&!c.textContent.trim().startsWith('가이드_'))r.style.display='none';});return;}\n const ie=ths.indexOf(E);if(ie<0)return;const inm=ths.indexOf(N),ip=ths.indexOf(P);\n [...t.querySelectorAll('tbody tr')].forEach((r,i)=>{const td=r.querySelectorAll('td');\n const set=(c,v,nm)=>{if(c&&c.textContent!==v){if(nm&&!names.includes(c.textContent))window.__orig.add(c.textContent.trim());c.textContent=v;}};\n set(td[ie],'user'+(i+1)+'@example.com');\n if(inm>=0)set(td[inm],names[i%5],1);\n if(ip>=0&&td[ip]&&td[ip].textContent.trim()!=='-')set(td[ip],'010-0000-0000');});\n });\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){let s=n.nodeValue;if(!s||!s.trim())continue;\n let v=s.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈/g,'홍길동').replace(/박동철/g,'김영희').replace(/엄상준/g,'박철수').replace(/검증_[^\\s)]+/g,'가이드_견본').replace(/캐미팩토리|브레인검증회사_\\d+/g,'예시건설').replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000');\n if(!/^\\s*user\\d*@example\\.com\\s*$/.test(v))v=v.replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\n if(s.trim()==='test')v='(없음)';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});\n document.querySelectorAll('section img, .ui-modal img').forEach(m=>{if(/sign/i.test(m.alt+m.src)||m.closest('label,div')&&/서명/.test((m.closest('div')||{}).textContent||''))m.style.visibility='hidden';});\n document.querySelectorAll('input').forEach(i=>{if(/@/.test(i.value)&&i.value!=='user@example.com')i.value='user@example.com';if(/검증_/.test(i.value))i.value='가이드_견본';if(/\\d{3}-\\d{2}-\\d{5}/.test(i.value))i.value='000-00-00000';if(/캐미팩토리|브레인검증회사_\\d+/.test(i.value))i.value='예시건설';if(/^0\\d{1,2}-?\\d{3,4}-?\\d{4}$/.test(i.value)&&i.value!=='010-0000-0000')i.value='010-0000-0000';\n if(window.__orig.has(i.value.trim())&&i.value!=='홍길동')i.value='홍길동';});\n};\nfn();setInterval(fn,100);})()" + "wait_ms": 1200 + }, + { + "eval": "(()=>{const W=s=>s\n.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈|브레인관리자/g,'홍길동').replace(/엄상준|브레인사용자/g,'김영희').replace(/박동철/g,'박철수')\n.replace(/캐미팩토리/g,'예시건설').replace(/브레인검증회사_\\d+/g,'예시설계').replace(/검증_[^\\s)]+/g,'가이드_견본')\n.replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000').replace(/\\b0\\d{1,2}-?\\d{3,4}-?\\d{4}\\b/g,'010-0000-0000')\n.replace(/대전광역시[^\\n]*/g,'○○시 ○○구 ○○로 1').replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\nconst fn=()=>{\n document.querySelectorAll('.b01-proj-card,.b01-proj-row').forEach(c=>{const t=c.querySelector('.b01-proj-card__name,td');if(t&&!/^가이드_/.test(t.textContent.trim()))c.style.display='none';});\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){const s=n.nodeValue;if(!s||!s.trim())continue;let v=W(s);if(/^\\s*[엄브박]\\s*$/.test(v))v='홍';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('input').forEach(i=>{const v=W(i.value);if(v!==i.value)i.value=v;});\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});};\nfn();setInterval(fn,100);})()" + }, + { + "eval": "document.head.insertAdjacentHTML('beforeend','')" + } + ], + "settle_ms": 1500, + "clip": ".b01-shell__page", + "callouts": [ + { + "n": 1, + "sel": ".b01-pd-crumb" + }, + { + "n": 2, + "sel": "[data-open-work]" + }, + { + "n": 3, + "sel": ".b01-pd-steps" + }, + { + "n": 4, + "sel": ".b01-pd-map, .b01-pd-kpis" + }, + { + "n": 5, + "sel": ".b01-pd-kv" + }, + { + "n": 6, + "sel": ".b01-pd-timeline" + } + ] + }, + { + "name": "B01_07_company", + "route": "#/b01-account?view=company", + "account": "company_admin", + "project": "none", + "before": [ + { + "eval": "document.head.insertAdjacentHTML('beforeend','')" + }, + { + "wait": ".b01-shell__page" + }, + { + "wait_ms": 1200 + }, + { + "eval": "(()=>{const W=s=>s\n.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈|브레인관리자/g,'홍길동').replace(/엄상준|브레인사용자/g,'김영희').replace(/박동철/g,'박철수')\n.replace(/캐미팩토리/g,'예시건설').replace(/브레인검증회사_\\d+/g,'예시설계').replace(/검증_[^\\s)]+/g,'가이드_견본')\n.replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000').replace(/\\b0\\d{1,2}-?\\d{3,4}-?\\d{4}\\b/g,'010-0000-0000')\n.replace(/대전광역시[^\\n]*/g,'○○시 ○○구 ○○로 1').replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\nconst fn=()=>{\n document.querySelectorAll('.b01-proj-card,.b01-proj-row').forEach(c=>{const t=c.querySelector('.b01-proj-card__name,td');if(t&&!/^가이드_/.test(t.textContent.trim()))c.style.display='none';});\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){const s=n.nodeValue;if(!s||!s.trim())continue;let v=W(s);if(/^\\s*[엄브박]\\s*$/.test(v))v='홍';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('input').forEach(i=>{const v=W(i.value);if(v!==i.value)i.value=v;});\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});};\nfn();setInterval(fn,100);})()" + } + ], + "clip": ".b01-shell__page", + "callouts": [ + { + "n": 1, + "sel": ".b01-pg__action button" + }, + { + "n": 2, + "sel": ".ui-setting-card" + }, + { + "n": 3, + "sel": ".ui-setting-row:last-child .ui-setting-row__side" + } + ] + }, + { + "name": "B01_07_company_edit", + "route": "#/b01-account?view=company", + "account": "company_admin", + "project": "none", + "before": [ + { + "eval": "document.head.insertAdjacentHTML('beforeend','')" + }, + { + "wait": ".b01-shell__page" + }, + { + "wait_ms": 1200 + }, + { + "eval": "(()=>{const W=s=>s\n.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈|브레인관리자/g,'홍길동').replace(/엄상준|브레인사용자/g,'김영희').replace(/박동철/g,'박철수')\n.replace(/캐미팩토리/g,'예시건설').replace(/브레인검증회사_\\d+/g,'예시설계').replace(/검증_[^\\s)]+/g,'가이드_견본')\n.replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000').replace(/\\b0\\d{1,2}-?\\d{3,4}-?\\d{4}\\b/g,'010-0000-0000')\n.replace(/대전광역시[^\\n]*/g,'○○시 ○○구 ○○로 1').replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\nconst fn=()=>{\n document.querySelectorAll('.b01-proj-card,.b01-proj-row').forEach(c=>{const t=c.querySelector('.b01-proj-card__name,td');if(t&&!/^가이드_/.test(t.textContent.trim()))c.style.display='none';});\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){const s=n.nodeValue;if(!s||!s.trim())continue;let v=W(s);if(/^\\s*[엄브박]\\s*$/.test(v))v='홍';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('input').forEach(i=>{const v=W(i.value);if(v!==i.value)i.value=v;});\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});};\nfn();setInterval(fn,100);})()" + }, + { + "click": ".b01-pg__action button" + }, + { + "wait": ".b01-dashboard__modal-panel" + }, + { + "wait_ms": 500 + } + ], + "clip": ".b01-dashboard__modal-panel", + "callouts": [ + { + "n": 1, + "sel": ".b01-dashboard__modal-panel input >> nth=0" + }, + { + "n": 2, + "sel": ".b01-dashboard__modal-panel input[type=file]" + }, + { + "n": 3, + "sel": ".b01-dashboard__modal-panel button:has-text('주소 검색')" + }, + { + "n": 4, + "sel": ".b01-dashboard__modal-panel .b01-dashboard__actions" + } + ] + }, + { + "name": "B01_08_company_defaults", + "route": "#/b01-account?view=company-defaults", + "account": "user", + "project": "none", + "viewport": [ + 1600, + 600 + ], + "before": [ + { + "eval": "document.head.insertAdjacentHTML('beforeend','')" + }, + { + "wait": ".b01-shell__page" + }, + { + "wait_ms": 1200 + }, + { + "eval": "(()=>{const W=s=>s\n.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈|브레인관리자/g,'홍길동').replace(/엄상준|브레인사용자/g,'김영희').replace(/박동철/g,'박철수')\n.replace(/캐미팩토리/g,'예시건설').replace(/브레인검증회사_\\d+/g,'예시설계').replace(/검증_[^\\s)]+/g,'가이드_견본')\n.replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000').replace(/\\b0\\d{1,2}-?\\d{3,4}-?\\d{4}\\b/g,'010-0000-0000')\n.replace(/대전광역시[^\\n]*/g,'○○시 ○○구 ○○로 1').replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\nconst fn=()=>{\n document.querySelectorAll('.b01-proj-card,.b01-proj-row').forEach(c=>{const t=c.querySelector('.b01-proj-card__name,td');if(t&&!/^가이드_/.test(t.textContent.trim()))c.style.display='none';});\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){const s=n.nodeValue;if(!s||!s.trim())continue;let v=W(s);if(/^\\s*[엄브박]\\s*$/.test(v))v='홍';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('input').forEach(i=>{const v=W(i.value);if(v!==i.value)i.value=v;});\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});};\nfn();setInterval(fn,100);})()" } ], "clip": null, "callouts": [ { "n": 1, - "sel": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(1)" + "sel": ".b01-shell__nav" }, { "n": 2, - "sel": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(2)" + "sel": ".ui-setting-row" + } + ] + }, + { + "name": "B01_09_sys_overview", + "route": "#/b01-account?view=sys-overview", + "account": "sys", + "project": "none", + "before": [ + { + "eval": "document.head.insertAdjacentHTML('beforeend','')" + }, + { + "wait": ".b01-shell__page" + }, + { + "wait_ms": 1200 + }, + { + "eval": "(()=>{const W=s=>s\n.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈|브레인관리자/g,'홍길동').replace(/엄상준|브레인사용자/g,'김영희').replace(/박동철/g,'박철수')\n.replace(/캐미팩토리/g,'예시건설').replace(/브레인검증회사_\\d+/g,'예시설계').replace(/검증_[^\\s)]+/g,'가이드_견본')\n.replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000').replace(/\\b0\\d{1,2}-?\\d{3,4}-?\\d{4}\\b/g,'010-0000-0000')\n.replace(/대전광역시[^\\n]*/g,'○○시 ○○구 ○○로 1').replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\nconst fn=()=>{\n document.querySelectorAll('.b01-proj-card,.b01-proj-row').forEach(c=>{const t=c.querySelector('.b01-proj-card__name,td');if(t&&!/^가이드_/.test(t.textContent.trim()))c.style.display='none';});\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){const s=n.nodeValue;if(!s||!s.trim())continue;let v=W(s);if(/^\\s*[엄브박]\\s*$/.test(v))v='홍';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('input').forEach(i=>{const v=W(i.value);if(v!==i.value)i.value=v;});\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});};\nfn();setInterval(fn,100);})()" + } + ], + "clip": ".b01-shell__page", + "callouts": [ + { + "n": 1, + "sel": ".b01-sys-stat >> nth=0" + }, + { + "n": 2, + "sel": ".b01-sys-gauge >> nth=0" }, { "n": 3, - "sel": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(3)" + "sel": ".b01-sys-chart" + } + ] + }, + { + "name": "B01_09_sys_companies", + "route": "#/b01-account?view=sys-companies", + "account": "sys", + "project": "none", + "before": [ + { + "eval": "document.head.insertAdjacentHTML('beforeend','')" + }, + { + "wait": ".b01-shell__page" + }, + { + "wait_ms": 1200 + }, + { + "eval": "(()=>{const W=s=>s\n.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈|브레인관리자/g,'홍길동').replace(/엄상준|브레인사용자/g,'김영희').replace(/박동철/g,'박철수')\n.replace(/캐미팩토리/g,'예시건설').replace(/브레인검증회사_\\d+/g,'예시설계').replace(/검증_[^\\s)]+/g,'가이드_견본')\n.replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000').replace(/\\b0\\d{1,2}-?\\d{3,4}-?\\d{4}\\b/g,'010-0000-0000')\n.replace(/대전광역시[^\\n]*/g,'○○시 ○○구 ○○로 1').replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\nconst fn=()=>{\n document.querySelectorAll('.b01-proj-card,.b01-proj-row').forEach(c=>{const t=c.querySelector('.b01-proj-card__name,td');if(t&&!/^가이드_/.test(t.textContent.trim()))c.style.display='none';});\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){const s=n.nodeValue;if(!s||!s.trim())continue;let v=W(s);if(/^\\s*[엄브박]\\s*$/.test(v))v='홍';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('input').forEach(i=>{const v=W(i.value);if(v!==i.value)i.value=v;});\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});};\nfn();setInterval(fn,100);})()" + } + ], + "clip": ".b01-shell__page", + "callouts": [ + { + "n": 1, + "sel": ".b01-pg__action button" + }, + { + "n": 2, + "sel": ".b01-pg__body input" + }, + { + "n": 3, + "sel": ".ui-table-wrap thead" }, { "n": 4, - "sel": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(4)" - }, - { - "n": 5, - "sel": ".b01-dashboard__section:has-text('사용자 관리')" - }, - { - "n": 6, - "sel": ".b01-dashboard__section:has-text('회사 관리')" - }, - { - "n": 7, - "sel": ".b01-dashboard__section:has-text('시스템 로그')" + "sel": ".ui-row-menu__btn >> nth=0" } ] }, { - "name": "B01_09_sys_project_edit", - "route": "#/b01-account", + "name": "B01_09_sys_users", + "route": "#/b01-account?view=sys-users", + "account": "sys", + "project": "none", + "before": [ + { + "eval": "document.head.insertAdjacentHTML('beforeend','')" + }, + { + "wait": ".b01-shell__page" + }, + { + "wait_ms": 1200 + }, + { + "eval": "(()=>{const W=s=>s\n.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈|브레인관리자/g,'홍길동').replace(/엄상준|브레인사용자/g,'김영희').replace(/박동철/g,'박철수')\n.replace(/캐미팩토리/g,'예시건설').replace(/브레인검증회사_\\d+/g,'예시설계').replace(/검증_[^\\s)]+/g,'가이드_견본')\n.replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000').replace(/\\b0\\d{1,2}-?\\d{3,4}-?\\d{4}\\b/g,'010-0000-0000')\n.replace(/대전광역시[^\\n]*/g,'○○시 ○○구 ○○로 1').replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\nconst fn=()=>{\n document.querySelectorAll('.b01-proj-card,.b01-proj-row').forEach(c=>{const t=c.querySelector('.b01-proj-card__name,td');if(t&&!/^가이드_/.test(t.textContent.trim()))c.style.display='none';});\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){const s=n.nodeValue;if(!s||!s.trim())continue;let v=W(s);if(/^\\s*[엄브박]\\s*$/.test(v))v='홍';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('input').forEach(i=>{const v=W(i.value);if(v!==i.value)i.value=v;});\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});};\nfn();setInterval(fn,100);})()" + } + ], + "clip": ".b01-shell__page", + "callouts": [ + { + "n": 1, + "sel": ".b01-pg__action button" + }, + { + "n": 2, + "sel": ".b01-sys-tool" + }, + { + "n": 3, + "sel": ".ui-table-wrap thead" + }, + { + "n": 4, + "sel": ".ui-row-menu__btn >> nth=0" + } + ] + }, + { + "name": "B01_09_sys_defaults", + "route": "#/b01-account?view=sys-defaults", + "account": "sys", + "project": "none", + "before": [ + { + "eval": "document.head.insertAdjacentHTML('beforeend','')" + }, + { + "wait": ".b01-shell__page" + }, + { + "wait_ms": 1200 + }, + { + "eval": "(()=>{const W=s=>s\n.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈|브레인관리자/g,'홍길동').replace(/엄상준|브레인사용자/g,'김영희').replace(/박동철/g,'박철수')\n.replace(/캐미팩토리/g,'예시건설').replace(/브레인검증회사_\\d+/g,'예시설계').replace(/검증_[^\\s)]+/g,'가이드_견본')\n.replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000').replace(/\\b0\\d{1,2}-?\\d{3,4}-?\\d{4}\\b/g,'010-0000-0000')\n.replace(/대전광역시[^\\n]*/g,'○○시 ○○구 ○○로 1').replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\nconst fn=()=>{\n document.querySelectorAll('.b01-proj-card,.b01-proj-row').forEach(c=>{const t=c.querySelector('.b01-proj-card__name,td');if(t&&!/^가이드_/.test(t.textContent.trim()))c.style.display='none';});\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){const s=n.nodeValue;if(!s||!s.trim())continue;let v=W(s);if(/^\\s*[엄브박]\\s*$/.test(v))v='홍';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('input').forEach(i=>{const v=W(i.value);if(v!==i.value)i.value=v;});\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});};\nfn();setInterval(fn,100);})()" + } + ], + "clip": ".b01-shell__page", + "callouts": [ + { + "n": 1, + "sel": ".b01-sys-group >> nth=0" + }, + { + "n": 2, + "sel": ".b01-sys-group >> nth=1" + }, + { + "n": 3, + "sel": ".b01-sys-group >> nth=2" + } + ] + }, + { + "name": "B01_09_sys_logs", + "route": "#/b01-account?view=sys-logs", + "account": "sys", "project": "none", "viewport": [ 1600, - 1400 + 800 ], "before": [ { "eval": "document.head.insertAdjacentHTML('beforeend','')" }, { - "wait": ".b01-dashboard__grid" + "wait": ".b01-shell__page" }, { - "eval": "(()=>{const E=String.fromCharCode(0xC774,0xBA54,0xC77C),N='이름',P='연락처',PJ='프로젝트명';\nconst names=['홍길동','김영희','박철수','이민수','최지은'];\nwindow.__orig=window.__orig||new Set();\nconst fn=()=>{\n document.querySelectorAll('table').forEach(t=>{\n const ths=[...t.querySelectorAll('thead th')].map(x=>x.textContent.trim());\n if(ths[0]===PJ){[...t.querySelectorAll('tbody tr')].forEach(r=>{const c=r.querySelector('td');if(c&&!c.textContent.trim().startsWith('가이드_'))r.style.display='none';});return;}\n const ie=ths.indexOf(E);if(ie<0)return;const inm=ths.indexOf(N),ip=ths.indexOf(P);\n [...t.querySelectorAll('tbody tr')].forEach((r,i)=>{const td=r.querySelectorAll('td');\n const set=(c,v,nm)=>{if(c&&c.textContent!==v){if(nm&&!names.includes(c.textContent))window.__orig.add(c.textContent.trim());c.textContent=v;}};\n set(td[ie],'user'+(i+1)+'@example.com');\n if(inm>=0)set(td[inm],names[i%5],1);\n if(ip>=0&&td[ip]&&td[ip].textContent.trim()!=='-')set(td[ip],'010-0000-0000');});\n });\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){let s=n.nodeValue;if(!s||!s.trim())continue;\n let v=s.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈/g,'홍길동').replace(/박동철/g,'김영희').replace(/엄상준/g,'박철수').replace(/검증_[^\\s)]+/g,'가이드_견본').replace(/캐미팩토리|브레인검증회사_\\d+/g,'예시건설').replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000');\n if(!/^\\s*user\\d*@example\\.com\\s*$/.test(v))v=v.replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\n if(s.trim()==='test')v='(없음)';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});\n document.querySelectorAll('section img, .ui-modal img').forEach(m=>{if(/sign/i.test(m.alt+m.src)||m.closest('label,div')&&/서명/.test((m.closest('div')||{}).textContent||''))m.style.visibility='hidden';});\n document.querySelectorAll('input').forEach(i=>{if(/@/.test(i.value)&&i.value!=='user@example.com')i.value='user@example.com';if(/검증_/.test(i.value))i.value='가이드_견본';if(/\\d{3}-\\d{2}-\\d{5}/.test(i.value))i.value='000-00-00000';if(/캐미팩토리|브레인검증회사_\\d+/.test(i.value))i.value='예시건설';if(/^0\\d{1,2}-?\\d{3,4}-?\\d{4}$/.test(i.value)&&i.value!=='010-0000-0000')i.value='010-0000-0000';\n if(window.__orig.has(i.value.trim())&&i.value!=='홍길동')i.value='홍길동';});\n};\nfn();setInterval(fn,100);})()" + "wait_ms": 1200 }, { - "click": "tr:has-text('가이드_용화'):has-text('임도설계') .ui-btn--ghost" - }, - { - "wait_ms": 800 + "eval": "(()=>{const W=s=>s\n.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈|브레인관리자/g,'홍길동').replace(/엄상준|브레인사용자/g,'김영희').replace(/박동철/g,'박철수')\n.replace(/캐미팩토리/g,'예시건설').replace(/브레인검증회사_\\d+/g,'예시설계').replace(/검증_[^\\s)]+/g,'가이드_견본')\n.replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000').replace(/\\b0\\d{1,2}-?\\d{3,4}-?\\d{4}\\b/g,'010-0000-0000')\n.replace(/대전광역시[^\\n]*/g,'○○시 ○○구 ○○로 1').replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\nconst fn=()=>{\n document.querySelectorAll('.b01-proj-card,.b01-proj-row').forEach(c=>{const t=c.querySelector('.b01-proj-card__name,td');if(t&&!/^가이드_/.test(t.textContent.trim()))c.style.display='none';});\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){const s=n.nodeValue;if(!s||!s.trim())continue;let v=W(s);if(/^\\s*[엄브박]\\s*$/.test(v))v='홍';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('input').forEach(i=>{const v=W(i.value);if(v!==i.value)i.value=v;});\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});};\nfn();setInterval(fn,100);})()" } ], - "clip": ".b01-dashboard__modal-panel", + "clip": null, "callouts": [ { "n": 1, - "sel": ".b01-dashboard__modal-panel input, .b01-dashboard__modal-panel select" + "sel": ".b01-sys-tool" }, { "n": 2, - "sel": ".b01-dashboard__modal-panel .b01-dashboard__actions" + "sel": ".ui-table-wrap thead" } ] }, { - "name": "B01_10_sys_project_del", - "route": "#/b01-account", + "name": "B01_11_chat", + "route": "#/b01-account?view=chat", + "account": "company_admin", "project": "none", "before": [ { "eval": "document.head.insertAdjacentHTML('beforeend','')" }, { - "wait": ".b01-dashboard__grid" + "wait": ".b01-shell__page" }, { - "eval": "(()=>{const E=String.fromCharCode(0xC774,0xBA54,0xC77C),N='이름',P='연락처',PJ='프로젝트명';\nconst names=['홍길동','김영희','박철수','이민수','최지은'];\nwindow.__orig=window.__orig||new Set();\nconst fn=()=>{\n document.querySelectorAll('table').forEach(t=>{\n const ths=[...t.querySelectorAll('thead th')].map(x=>x.textContent.trim());\n if(ths[0]===PJ){[...t.querySelectorAll('tbody tr')].forEach(r=>{const c=r.querySelector('td');if(c&&!c.textContent.trim().startsWith('가이드_'))r.style.display='none';});return;}\n const ie=ths.indexOf(E);if(ie<0)return;const inm=ths.indexOf(N),ip=ths.indexOf(P);\n [...t.querySelectorAll('tbody tr')].forEach((r,i)=>{const td=r.querySelectorAll('td');\n const set=(c,v,nm)=>{if(c&&c.textContent!==v){if(nm&&!names.includes(c.textContent))window.__orig.add(c.textContent.trim());c.textContent=v;}};\n set(td[ie],'user'+(i+1)+'@example.com');\n if(inm>=0)set(td[inm],names[i%5],1);\n if(ip>=0&&td[ip]&&td[ip].textContent.trim()!=='-')set(td[ip],'010-0000-0000');});\n });\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){let s=n.nodeValue;if(!s||!s.trim())continue;\n let v=s.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈/g,'홍길동').replace(/박동철/g,'김영희').replace(/엄상준/g,'박철수').replace(/검증_[^\\s)]+/g,'가이드_견본').replace(/캐미팩토리|브레인검증회사_\\d+/g,'예시건설').replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000');\n if(!/^\\s*user\\d*@example\\.com\\s*$/.test(v))v=v.replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\n if(s.trim()==='test')v='(없음)';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});\n document.querySelectorAll('section img, .ui-modal img').forEach(m=>{if(/sign/i.test(m.alt+m.src)||m.closest('label,div')&&/서명/.test((m.closest('div')||{}).textContent||''))m.style.visibility='hidden';});\n document.querySelectorAll('input').forEach(i=>{if(/@/.test(i.value)&&i.value!=='user@example.com')i.value='user@example.com';if(/검증_/.test(i.value))i.value='가이드_견본';if(/\\d{3}-\\d{2}-\\d{5}/.test(i.value))i.value='000-00-00000';if(/캐미팩토리|브레인검증회사_\\d+/.test(i.value))i.value='예시건설';if(/^0\\d{1,2}-?\\d{3,4}-?\\d{4}$/.test(i.value)&&i.value!=='010-0000-0000')i.value='010-0000-0000';\n if(window.__orig.has(i.value.trim())&&i.value!=='홍길동')i.value='홍길동';});\n};\nfn();setInterval(fn,100);})()" + "wait_ms": 1200 }, { - "click": "tr:has-text('가이드_용화'):has-text('임도설계') .ui-btn--danger", - "confirm": true - }, - { - "wait_ms": 800 + "eval": "(()=>{const W=s=>s\n.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈|브레인관리자/g,'홍길동').replace(/엄상준|브레인사용자/g,'김영희').replace(/박동철/g,'박철수')\n.replace(/캐미팩토리/g,'예시건설').replace(/브레인검증회사_\\d+/g,'예시설계').replace(/검증_[^\\s)]+/g,'가이드_견본')\n.replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000').replace(/\\b0\\d{1,2}-?\\d{3,4}-?\\d{4}\\b/g,'010-0000-0000')\n.replace(/대전광역시[^\\n]*/g,'○○시 ○○구 ○○로 1').replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\nconst fn=()=>{\n document.querySelectorAll('.b01-proj-card,.b01-proj-row').forEach(c=>{const t=c.querySelector('.b01-proj-card__name,td');if(t&&!/^가이드_/.test(t.textContent.trim()))c.style.display='none';});\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){const s=n.nodeValue;if(!s||!s.trim())continue;let v=W(s);if(/^\\s*[엄브박]\\s*$/.test(v))v='홍';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('input').forEach(i=>{const v=W(i.value);if(v!==i.value)i.value=v;});\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});};\nfn();setInterval(fn,100);})()" } ], - "after": [ - { - "click": "button:has-text('취소')" - } - ], - "clip": ".b01-dashboard__modal-panel", + "clip": null, "callouts": [ { "n": 1, - "sel": ".b01-dashboard__modal-panel .b01-dashboard__modal-text" + "sel": ".b01-shell__help" }, { "n": 2, - "sel": ".b01-dashboard__modal-panel .b01-dashboard__actions" - } - ] - }, - { - "name": "B01_11_project_table", - "route": "#/b01-account", - "project": "none", - "before": [ - { - "eval": "document.head.insertAdjacentHTML('beforeend','')" - }, - { - "wait": ".b01-dashboard__grid" - }, - { - "eval": "(()=>{const E=String.fromCharCode(0xC774,0xBA54,0xC77C),N='이름',P='연락처',PJ='프로젝트명';\nconst names=['홍길동','김영희','박철수','이민수','최지은'];\nwindow.__orig=window.__orig||new Set();\nconst fn=()=>{\n document.querySelectorAll('table').forEach(t=>{\n const ths=[...t.querySelectorAll('thead th')].map(x=>x.textContent.trim());\n if(ths[0]===PJ){[...t.querySelectorAll('tbody tr')].forEach(r=>{const c=r.querySelector('td');if(c&&!c.textContent.trim().startsWith('가이드_'))r.style.display='none';});return;}\n const ie=ths.indexOf(E);if(ie<0)return;const inm=ths.indexOf(N),ip=ths.indexOf(P);\n [...t.querySelectorAll('tbody tr')].forEach((r,i)=>{const td=r.querySelectorAll('td');\n const set=(c,v,nm)=>{if(c&&c.textContent!==v){if(nm&&!names.includes(c.textContent))window.__orig.add(c.textContent.trim());c.textContent=v;}};\n set(td[ie],'user'+(i+1)+'@example.com');\n if(inm>=0)set(td[inm],names[i%5],1);\n if(ip>=0&&td[ip]&&td[ip].textContent.trim()!=='-')set(td[ip],'010-0000-0000');});\n });\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){let s=n.nodeValue;if(!s||!s.trim())continue;\n let v=s.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈/g,'홍길동').replace(/박동철/g,'김영희').replace(/엄상준/g,'박철수').replace(/검증_[^\\s)]+/g,'가이드_견본').replace(/캐미팩토리|브레인검증회사_\\d+/g,'예시건설').replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000');\n if(!/^\\s*user\\d*@example\\.com\\s*$/.test(v))v=v.replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\n if(s.trim()==='test')v='(없음)';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});\n document.querySelectorAll('section img, .ui-modal img').forEach(m=>{if(/sign/i.test(m.alt+m.src)||m.closest('label,div')&&/서명/.test((m.closest('div')||{}).textContent||''))m.style.visibility='hidden';});\n document.querySelectorAll('input').forEach(i=>{if(/@/.test(i.value)&&i.value!=='user@example.com')i.value='user@example.com';if(/검증_/.test(i.value))i.value='가이드_견본';if(/\\d{3}-\\d{2}-\\d{5}/.test(i.value))i.value='000-00-00000';if(/캐미팩토리|브레인검증회사_\\d+/.test(i.value))i.value='예시건설';if(/^0\\d{1,2}-?\\d{3,4}-?\\d{4}$/.test(i.value)&&i.value!=='010-0000-0000')i.value='010-0000-0000';\n if(window.__orig.has(i.value.trim())&&i.value!=='홍길동')i.value='홍길동';});\n};\nfn();setInterval(fn,100);})()" - }, - { - "wait": "table" - } - ], - "clip": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(3)", - "callouts": [ - { - "n": 1, - "sel": ".b01-dashboard__section:nth-child(3) th:nth-child(1)" - }, - { - "n": 2, - "sel": ".b01-dashboard__section:nth-child(3) th:nth-child(4)" + "sel": ".b01-knowledge-chat__panel" }, { "n": 3, - "sel": ".b01-dashboard__section:nth-child(3) .b01-dashboard__actions .ui-btn--ghost" + "sel": ".b01-knowledge-chat__toggle" } ] }, { - "name": "B01_12_profile", - "route": "#/b01-account", - "project": "none", + "name": "B01_12_me", + "route": "#/b01-account?view=me", "account": "company_admin", + "project": "none", + "viewport": [ + 1600, + 1100 + ], "before": [ { "eval": "document.head.insertAdjacentHTML('beforeend','')" }, { - "wait": ".b01-dashboard__grid" + "wait": ".b01-shell__page" }, { - "eval": "(()=>{const E=String.fromCharCode(0xC774,0xBA54,0xC77C),N='이름',P='연락처',PJ='프로젝트명';\nconst names=['홍길동','김영희','박철수','이민수','최지은'];\nwindow.__orig=window.__orig||new Set();\nconst fn=()=>{\n document.querySelectorAll('table').forEach(t=>{\n const ths=[...t.querySelectorAll('thead th')].map(x=>x.textContent.trim());\n if(ths[0]===PJ){[...t.querySelectorAll('tbody tr')].forEach(r=>{const c=r.querySelector('td');if(c&&!c.textContent.trim().startsWith('가이드_'))r.style.display='none';});return;}\n const ie=ths.indexOf(E);if(ie<0)return;const inm=ths.indexOf(N),ip=ths.indexOf(P);\n [...t.querySelectorAll('tbody tr')].forEach((r,i)=>{const td=r.querySelectorAll('td');\n const set=(c,v,nm)=>{if(c&&c.textContent!==v){if(nm&&!names.includes(c.textContent))window.__orig.add(c.textContent.trim());c.textContent=v;}};\n set(td[ie],'user'+(i+1)+'@example.com');\n if(inm>=0)set(td[inm],names[i%5],1);\n if(ip>=0&&td[ip]&&td[ip].textContent.trim()!=='-')set(td[ip],'010-0000-0000');});\n });\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){let s=n.nodeValue;if(!s||!s.trim())continue;\n let v=s.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈/g,'홍길동').replace(/박동철/g,'김영희').replace(/엄상준/g,'박철수').replace(/검증_[^\\s)]+/g,'가이드_견본').replace(/캐미팩토리|브레인검증회사_\\d+/g,'예시건설').replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000');\n if(!/^\\s*user\\d*@example\\.com\\s*$/.test(v))v=v.replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\n if(s.trim()==='test')v='(없음)';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});\n document.querySelectorAll('section img, .ui-modal img').forEach(m=>{if(/sign/i.test(m.alt+m.src)||m.closest('label,div')&&/서명/.test((m.closest('div')||{}).textContent||''))m.style.visibility='hidden';});\n document.querySelectorAll('input').forEach(i=>{if(/@/.test(i.value)&&i.value!=='user@example.com')i.value='user@example.com';if(/검증_/.test(i.value))i.value='가이드_견본';if(/\\d{3}-\\d{2}-\\d{5}/.test(i.value))i.value='000-00-00000';if(/캐미팩토리|브레인검증회사_\\d+/.test(i.value))i.value='예시건설';if(/^0\\d{1,2}-?\\d{3,4}-?\\d{4}$/.test(i.value)&&i.value!=='010-0000-0000')i.value='010-0000-0000';\n if(window.__orig.has(i.value.trim())&&i.value!=='홍길동')i.value='홍길동';});\n};\nfn();setInterval(fn,100);})()" + "wait_ms": 1200 }, { - "wait_ms": 500 + "eval": "(()=>{const W=s=>s\n.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈|브레인관리자/g,'홍길동').replace(/엄상준|브레인사용자/g,'김영희').replace(/박동철/g,'박철수')\n.replace(/캐미팩토리/g,'예시건설').replace(/브레인검증회사_\\d+/g,'예시설계').replace(/검증_[^\\s)]+/g,'가이드_견본')\n.replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000').replace(/\\b0\\d{1,2}-?\\d{3,4}-?\\d{4}\\b/g,'010-0000-0000')\n.replace(/대전광역시[^\\n]*/g,'○○시 ○○구 ○○로 1').replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\nconst fn=()=>{\n document.querySelectorAll('.b01-proj-card,.b01-proj-row').forEach(c=>{const t=c.querySelector('.b01-proj-card__name,td');if(t&&!/^가이드_/.test(t.textContent.trim()))c.style.display='none';});\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){const s=n.nodeValue;if(!s||!s.trim())continue;let v=W(s);if(/^\\s*[엄브박]\\s*$/.test(v))v='홍';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('input').forEach(i=>{const v=W(i.value);if(v!==i.value)i.value=v;});\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});};\nfn();setInterval(fn,100);})()" } ], - "clip": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(7)", + "clip": ".b01-shell__page", "callouts": [ { "n": 1, - "sel": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(7) input >> nth=0" + "sel": ".b01-sys-group >> nth=0" }, { "n": 2, - "sel": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(7) button:has-text('기본정보 저장')" - } - ] - }, - { - "name": "B01_13_security", - "route": "#/b01-account", - "project": "none", - "account": "company_admin", - "before": [ - { - "eval": "document.head.insertAdjacentHTML('beforeend','')" - }, - { - "wait": ".b01-dashboard__grid" - }, - { - "eval": "(()=>{const E=String.fromCharCode(0xC774,0xBA54,0xC77C),N='이름',P='연락처',PJ='프로젝트명';\nconst names=['홍길동','김영희','박철수','이민수','최지은'];\nwindow.__orig=window.__orig||new Set();\nconst fn=()=>{\n document.querySelectorAll('table').forEach(t=>{\n const ths=[...t.querySelectorAll('thead th')].map(x=>x.textContent.trim());\n if(ths[0]===PJ){[...t.querySelectorAll('tbody tr')].forEach(r=>{const c=r.querySelector('td');if(c&&!c.textContent.trim().startsWith('가이드_'))r.style.display='none';});return;}\n const ie=ths.indexOf(E);if(ie<0)return;const inm=ths.indexOf(N),ip=ths.indexOf(P);\n [...t.querySelectorAll('tbody tr')].forEach((r,i)=>{const td=r.querySelectorAll('td');\n const set=(c,v,nm)=>{if(c&&c.textContent!==v){if(nm&&!names.includes(c.textContent))window.__orig.add(c.textContent.trim());c.textContent=v;}};\n set(td[ie],'user'+(i+1)+'@example.com');\n if(inm>=0)set(td[inm],names[i%5],1);\n if(ip>=0&&td[ip]&&td[ip].textContent.trim()!=='-')set(td[ip],'010-0000-0000');});\n });\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){let s=n.nodeValue;if(!s||!s.trim())continue;\n let v=s.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈/g,'홍길동').replace(/박동철/g,'김영희').replace(/엄상준/g,'박철수').replace(/검증_[^\\s)]+/g,'가이드_견본').replace(/캐미팩토리|브레인검증회사_\\d+/g,'예시건설').replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000');\n if(!/^\\s*user\\d*@example\\.com\\s*$/.test(v))v=v.replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\n if(s.trim()==='test')v='(없음)';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});\n document.querySelectorAll('section img, .ui-modal img').forEach(m=>{if(/sign/i.test(m.alt+m.src)||m.closest('label,div')&&/서명/.test((m.closest('div')||{}).textContent||''))m.style.visibility='hidden';});\n document.querySelectorAll('input').forEach(i=>{if(/@/.test(i.value)&&i.value!=='user@example.com')i.value='user@example.com';if(/검증_/.test(i.value))i.value='가이드_견본';if(/\\d{3}-\\d{2}-\\d{5}/.test(i.value))i.value='000-00-00000';if(/캐미팩토리|브레인검증회사_\\d+/.test(i.value))i.value='예시건설';if(/^0\\d{1,2}-?\\d{3,4}-?\\d{4}$/.test(i.value)&&i.value!=='010-0000-0000')i.value='010-0000-0000';\n if(window.__orig.has(i.value.trim())&&i.value!=='홍길동')i.value='홍길동';});\n};\nfn();setInterval(fn,100);})()" - }, - { - "wait_ms": 500 - } - ], - "clip": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(8)", - "callouts": [ - { - "n": 1, - "sel": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(8) input >> nth=0" - }, - { - "n": 2, - "sel": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(8) input >> nth=1" + "sel": ".b01-sys-group >> nth=1" }, { "n": 3, - "sel": ".b01-dashboard__grid > .b01-dashboard__section:nth-child(8) button:has-text('비밀번호 변경')" + "sel": ".b01-sys-group >> nth=2" + }, + { + "n": 4, + "sel": ".b01-sys-group >> nth=3" + } + ] + }, + { + "name": "B01_12_user_menu", + "route": "#/b01-account?view=home", + "account": "company_admin", + "project": "none", + "before": [ + { + "eval": "document.head.insertAdjacentHTML('beforeend','')" + }, + { + "wait": ".b01-shell__page" + }, + { + "wait_ms": 1200 + }, + { + "eval": "(()=>{const W=s=>s\n.replace(/홍길동\\(견본\\)/g,'이민수').replace(/엄상돈|브레인관리자/g,'홍길동').replace(/엄상준|브레인사용자/g,'김영희').replace(/박동철/g,'박철수')\n.replace(/캐미팩토리/g,'예시건설').replace(/브레인검증회사_\\d+/g,'예시설계').replace(/검증_[^\\s)]+/g,'가이드_견본')\n.replace(/\\d{3}-\\d{2}-\\d{5}/g,'000-00-00000').replace(/\\b0\\d{1,2}-?\\d{3,4}-?\\d{4}\\b/g,'010-0000-0000')\n.replace(/대전광역시[^\\n]*/g,'○○시 ○○구 ○○로 1').replace(/[\\w.+-]+@[\\w.-]+\\.\\w+/g,'user@example.com');\nconst fn=()=>{\n document.querySelectorAll('.b01-proj-card,.b01-proj-row').forEach(c=>{const t=c.querySelector('.b01-proj-card__name,td');if(t&&!/^가이드_/.test(t.textContent.trim()))c.style.display='none';});\n const w=document.createTreeWalker(document.body,NodeFilter.SHOW_TEXT);let n;\n while((n=w.nextNode())){const s=n.nodeValue;if(!s||!s.trim())continue;let v=W(s);if(/^\\s*[엄브박]\\s*$/.test(v))v='홍';if(v!==s)n.nodeValue=v;}\n document.querySelectorAll('input').forEach(i=>{const v=W(i.value);if(v!==i.value)i.value=v;});\n document.querySelectorAll('img').forEach(m=>{m.style.visibility='hidden';});};\nfn();setInterval(fn,100);})()" + }, + { + "click": ".b01-shell__user-btn" + }, + { + "wait": ".b01-shell__menu" + }, + { + "wait_ms": 300 + } + ], + "clip": ".b01-shell__menu", + "callouts": [ + { + "n": 1, + "sel": ".b01-shell__menu-who" + }, + { + "n": 2, + "sel": ".b01-shell__menu .b01-shell__menu-item >> nth=0" + }, + { + "n": 3, + "sel": ".b01-shell__menu-touch" } ] }