From 4d9343e980a7b450330f68422041a59baca36eb4 Mon Sep 17 00:00:00 2001 From: taekyoungc Date: Tue, 9 Jun 2026 14:43:24 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20GBLS=20=EB=A6=AC=EB=B8=8C=EB=9E=9C?= =?UTF-8?q?=EB=94=A9=20+=20=EB=A7=A4=EB=89=B4=EC=96=BC=20=EB=B3=B4?= =?UTF-8?q?=EA=B0=95=20+=20=EC=9B=8C=ED=81=AC=EC=8A=A4=ED=8E=98=EC=9D=B4?= =?UTF-8?q?=EC=8A=A4/=EC=BD=94=EB=93=9C=EA=B4=80=EB=A6=AC=20UX=20=EA=B0=9C?= =?UTF-8?q?=EC=84=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 리브랜딩 - 서비스명 "종량제 시스템" → "GBLS", 헤더 로고에 풀네임(Garbage Bag Logistics System) 병기 (gov-portal·공통 브랜드·로그인/welcome 셸·타이틀·푸터 전반) 매뉴얼 - 신규 페이지 [로그인·회원가입·계정](01_account.md): 가입 항목·관리자 승인·2차 인증 흐름 - [화면 구성·워크스페이스·단축키]에 계정 전환 시 탭 초기화 안내 추가 워크스페이스(탭) - 탭 전환 시 좌측 사이드바 강조 동기화(메뉴 없는 화면은 강조 해제, 경로 폴백 매칭) - 소메뉴 좌측 아이콘(▸/·) 전부 제거 — 활성 메뉴는 배경 강조로만 구분 - 탭을 사용자(mb_idx)별로 격리: 다른 아이디 로그인 시 이전 탭 복원 안 함 - 사이드바 FAQ 링크 제거(자주 묻는 질문은 매뉴얼에 통합) 기본 코드관리 화면 - 업무현황 카드 스타일로 재디자인(가벼운 표·상태/범위 pill·단일 구분선) - render()에 $bare 옵션 추가 → 이미 카드형인 화면은 바깥 래퍼 생략 기타 - .claude/settings.local.json(개인 권한 설정) .gitignore 추가 - e2e: 워크스페이스(동기화·계정격리) + 매뉴얼(계정·단축키·검색) 케이스 보강 Co-Authored-By: Claude Opus 4.8 --- .gitignore | 3 + app/Config/Manual.php | 1 + app/Controllers/Auth.php | 8 +- app/Controllers/Bag.php | 5 +- app/Controllers/Home.php | 2 +- app/Docs/manual/01_account.md | 61 ++++++++ app/Docs/manual/05_workspace.md | 1 + app/Views/admin/layout.php | 4 +- app/Views/auth/_shell.php | 9 +- app/Views/bag/code_kinds.php | 133 ++++++++++-------- app/Views/bag/daily_inventory.php | 2 +- app/Views/bag/help.php | 2 +- app/Views/bag/layout/embed.php | 2 +- app/Views/bag/layout/main.php | 4 +- app/Views/bag/layout/portal.php | 4 +- app/Views/bag/layout/workspace.php | 9 +- app/Views/bag/lg_dashboard.php | 2 +- app/Views/bag/lg_dashboard_charts.php | 2 +- app/Views/bag/lg_dashboard_dense.php | 2 +- app/Views/bag/lg_dashboard_modern.php | 2 +- app/Views/bag/lg_dashboard_simple.php | 2 +- app/Views/bag/waste_suibal_enterprise.php | 2 +- app/Views/components/header_brand.php | 7 +- app/Views/components/jongryangje_mark.php | 2 +- .../home/_dashboard_gov_portal_brand.php | 5 +- app/Views/home/_dashboard_gov_portal_head.php | 2 +- .../_dashboard_gov_portal_nav_script_base.php | 32 ++++- .../home/_dashboard_gov_portal_sidebar.php | 7 +- app/Views/home/dashboard.php | 4 +- app/Views/welcome_message.php | 7 +- e2e/manual.spec.js | 9 ++ e2e/workspace.spec.js | 45 +++++- 32 files changed, 273 insertions(+), 109 deletions(-) create mode 100644 app/Docs/manual/01_account.md diff --git a/.gitignore b/.gitignore index 3ec8950..13ac40c 100644 --- a/.gitignore +++ b/.gitignore @@ -176,3 +176,6 @@ blob-report/ /phpunit*.xml # 최상위 개발 문서/스크린샷 폴더만 제외 (app/Docs 등 하위 docs 경로는 추적). /docs/ + +# Claude Code 개인 권한 설정(비밀 포함) — 커밋 금지 +.claude/settings.local.json diff --git a/app/Config/Manual.php b/app/Config/Manual.php index b07f373..f17e3a6 100644 --- a/app/Config/Manual.php +++ b/app/Config/Manual.php @@ -23,6 +23,7 @@ class Manual extends BaseConfig */ public array $pages = [ 'overview' => ['title' => '시작하기·시스템 개요', 'file' => '00_overview.md'], + 'account' => ['title' => '로그인·회원가입·계정', 'file' => '01_account.md'], 'workspace' => ['title' => '화면 구성·워크스페이스·단축키', 'file' => '05_workspace.md'], 'flow' => ['title' => '핵심 업무 흐름', 'file' => '10_workflow.md'], 'order' => ['title' => '발주·입고', 'file' => '20_order_receiving.md'], diff --git a/app/Controllers/Auth.php b/app/Controllers/Auth.php index 78bb43b..6d24ba1 100644 --- a/app/Controllers/Auth.php +++ b/app/Controllers/Auth.php @@ -23,7 +23,7 @@ class Auth extends BaseController } return view('auth/login', [ - 'pageTitle' => '로그인 - 종량제 시스템', + 'pageTitle' => '로그인 - GBLS', 'cardMax' => 'max-w-md', ]); } @@ -160,7 +160,7 @@ class Auth extends BaseController return view('auth/login_two_factor', [ 'memberId' => $member->mb_id, - 'pageTitle' => '2차 인증 - 종량제 시스템', + 'pageTitle' => '2차 인증 - GBLS', 'cardMax' => 'max-w-md', ]); } @@ -244,7 +244,7 @@ class Auth extends BaseController 'memberId' => $member->mb_id, 'qrDataUri' => $qrDataUri, 'secret' => $secret, - 'pageTitle' => '2차 인증 등록 - 종량제 시스템', + 'pageTitle' => '2차 인증 등록 - GBLS', 'cardMax' => 'max-w-lg', ]); } @@ -348,7 +348,7 @@ class Auth extends BaseController return view('auth/register', [ 'localGovernments' => $localGovernments, - 'pageTitle' => '회원가입 - 종량제 시스템', + 'pageTitle' => '회원가입 - GBLS', 'cardMax' => 'max-w-md', ]); } diff --git a/app/Controllers/Bag.php b/app/Controllers/Bag.php index d048fbc..bd55e10 100644 --- a/app/Controllers/Bag.php +++ b/app/Controllers/Bag.php @@ -212,7 +212,7 @@ class Bag extends BaseController return $row ? trim((string) ($row->mg_name ?? '')) : ''; } - private function render(string $title, string $viewFile, array $data = []): string + private function render(string $title, string $viewFile, array $data = [], bool $bare = false): string { // /workspace 탭(iframe) 안에서는 임베드 레이아웃(헤더·사이드바 없이 본문만). $layout = $this->isEmbeddedRequest() ? 'bag/layout/embed' : 'bag/layout/portal'; @@ -220,6 +220,7 @@ class Bag extends BaseController return view($layout, [ 'title' => $title, 'content' => view($viewFile, $data), + 'bare' => $bare, // true면 바깥 카드 래퍼 없이 본문을 그대로(이미 카드형 화면용) ]); } @@ -591,7 +592,7 @@ class Bag extends BaseController 'selectedKind' => $selectedKind, 'detailList' => $detailList, 'rowCanEdit' => $rowCanEdit, - ]); + ], true); // 본문이 이미 카드 2개라 바깥 래퍼 생략 } /** diff --git a/app/Controllers/Home.php b/app/Controllers/Home.php index 1956170..3ef8cac 100644 --- a/app/Controllers/Home.php +++ b/app/Controllers/Home.php @@ -42,7 +42,7 @@ class Home extends BaseController } /** - * 메인 대시보드용 — 종량제 시스템에 실제 존재하는 데이터만 집계. + * 메인 대시보드용 — GBLS에 실제 존재하는 데이터만 집계. * * @return array */ diff --git a/app/Docs/manual/01_account.md b/app/Docs/manual/01_account.md new file mode 100644 index 0000000..bcd4fa3 --- /dev/null +++ b/app/Docs/manual/01_account.md @@ -0,0 +1,61 @@ +# 로그인 · 회원가입 · 계정 + +시스템을 쓰려면 **계정(아이디)** 이 필요합니다. 이 페이지는 회원가입부터 로그인, 2차 인증, 로그아웃까지의 과정을 설명합니다. + +## 1. 회원가입 + +로그인 화면 아래쪽 **[회원가입]** 을 눌러 신청합니다. 입력 항목은 다음과 같습니다. + +| 항목 | 필수 | 설명 | +|---|:---:|---| +| **아이디** | 필수 | 로그인에 쓰는 ID. **4자 이상**, 이미 쓰는 아이디는 사용할 수 없습니다. | +| **비밀번호** | 필수 | **4자 이상**. 안전을 위해 영문·숫자·기호를 섞는 것을 권장합니다. | +| **비밀번호 확인** | 필수 | 위 비밀번호와 똑같이 한 번 더 입력(오타 방지). | +| **이름** | 필수 | 담당자 이름. | +| **이메일** | 선택 | 안내용. 입력 시 형식 검사를 합니다. | +| **연락처** | 선택 | 전화번호. | +| **지자체** | 선택 | 소속 지자체. 해당되면 선택합니다. | +| **사용자 역할** | 필수 | 신청할 권한(아래 표 참고). 실제 권한은 **관리자 승인 시 확정**됩니다. | + +> 이메일·연락처 같은 개인정보는 **암호화되어 저장**됩니다. + +### 신청할 수 있는 역할 + +| 역할 | 주로 하는 일 | +|---|---| +| **일반 사용자** | 기본 조회 | +| **지정판매소** | 봉투 판매·반품, 자기 판매 현황 조회 | +| **지자체 관리자** | 소속 지자체의 발주·입고·재고·불출·판매·리포트 전반 | + +### 가입 후 — 관리자 승인 대기 + +회원가입을 제출하면 **바로 로그인되지 않고 "승인 대기" 상태**가 됩니다. + +- **관리자가 승인하면** 그때부터 로그인할 수 있습니다. +- 승인 전에 로그인하면 *"관리자 승인 후 로그인 가능합니다."* 안내가 나옵니다. +- 승인이 **반려**되면 *"승인이 반려되었습니다. 관리자에게 문의해 주세요."* 가 나옵니다 — 담당 관리자에게 문의하세요. + +## 2. 로그인 + +로그인 화면에서 **아이디**와 **비밀번호**를 입력합니다. + +- 성공하면 **워크스페이스**(탭 작업공간)로 들어갑니다. +- 아이디·비밀번호가 틀리면 안내 메시지가 나옵니다. (승인 대기/반려 상태도 위와 같이 안내됩니다.) + +### 2차 인증(OTP) + +보안 설정에 따라 비밀번호 확인 뒤 **2차 인증** 단계가 나올 수 있습니다. + +- **이미 OTP를 등록한 경우** — 스마트폰 인증 앱(예: Google Authenticator)에 표시되는 **6자리 숫자**를 입력합니다. +- **처음 사용하는 경우** — 화면의 **QR코드 또는 설정 키**를 인증 앱에 등록한 뒤, 앱에 나온 6자리 숫자로 설정을 완료합니다. 이후 로그인부터 OTP를 입력하게 됩니다. + +> OTP 숫자는 일정 시간마다 바뀌므로, **현재 표시된 숫자**를 입력해야 합니다. 휴대폰 시간이 자동(네트워크 시간)으로 맞춰져 있어야 정확합니다. + +## 3. 로그아웃 + +화면 오른쪽 위 **[로그아웃]** 을 누르면 안전하게 종료됩니다. 공용 PC라면 사용 후 꼭 로그아웃하세요. + +## 4. 비밀번호·계정 문제 + +- **비밀번호를 바꾸거나 분실**한 경우, 계정·권한 변경은 **담당 관리자**가 처리합니다. 관리자에게 문의하세요. +- 권한(역할)을 바꾸고 싶을 때도 관리자에게 요청하면 됩니다. diff --git a/app/Docs/manual/05_workspace.md b/app/Docs/manual/05_workspace.md index 4c1f8d7..2e94d32 100644 --- a/app/Docs/manual/05_workspace.md +++ b/app/Docs/manual/05_workspace.md @@ -35,6 +35,7 @@ - **브라우저를 새로고침**하거나 **관리자 페이지에 갔다가 돌아와도** 열어 두었던 탭이 **다시 복원**됩니다. - 단, **브라우저 탭(창)을 완전히 닫으면** 작업공간은 초기화됩니다. (이 유지는 "이번 접속 동안"만 적용됩니다.) +- **다른 아이디로 로그인하면** 이전 사용자의 탭은 복원되지 않고 **기본 화면으로 초기화**됩니다. (계정별로 분리됩니다.) - 복원되는 것은 **열려 있던 화면 목록**입니다. 관리자 페이지를 거치는 등 작업공간을 완전히 벗어났던 경우, 각 화면은 새로 불러와지므로 **입력 중이던 폼 내용까지 그대로 살아나지는 않습니다.** ## 3. 키보드 단축키 diff --git a/app/Views/admin/layout.php b/app/Views/admin/layout.php index 784189f..584475d 100644 --- a/app/Views/admin/layout.php +++ b/app/Views/admin/layout.php @@ -61,7 +61,7 @@ $navPartial = [ -<?= esc($title ?? '관리자') ?> - 종량제 시스템 +<?= esc($title ?? '관리자') ?> - GBLS @@ -142,7 +142,7 @@ tailwind.config = {
- 종량제 시스템 관리자 + GBLS 관리자
diff --git a/app/Views/auth/_shell.php b/app/Views/auth/_shell.php index d8861bb..9c328bf 100644 --- a/app/Views/auth/_shell.php +++ b/app/Views/auth/_shell.php @@ -14,7 +14,7 @@ $subtitle = $subtitle ?? '종량제 쓰레기봉투 물류시스템'; -<?= esc($pageTitle ?? '종량제 시스템') ?> +<?= esc($pageTitle ?? 'GBLS') ?> @@ -39,11 +39,14 @@ if (window.top !== window.self) { try { window.top.location.href =
- + - 종량제 시스템 + + GBLS + Garbage Bag Logistics System +
diff --git a/app/Views/bag/code_kinds.php b/app/Views/bag/code_kinds.php index 0d1cd4b..66457fe 100644 --- a/app/Views/bag/code_kinds.php +++ b/app/Views/bag/code_kinds.php @@ -12,32 +12,40 @@ $showKindActions = $canManageKinds; $selectedKindId = (int) ($selectedKind->ck_idx ?? 0); $colCount = 6 + ($showKindActions ? 1 : 0); $detailColCount = 7 + ($canManageDetails ? 1 : 0); + +/** 상태 배지 (업무현황 스타일의 가벼운 pill) */ +$stateBadge = static function (int $state): string { + return $state === 1 + ? '사용' + : '미사용'; +}; ?>
-
-
-

기본코드 종류

-
- - 기본코드 등록 - - 코드 종류 등록·수정은 super admin·본부 관리자만 가능합니다. - -
+ +
+
+

기본코드 종류

+ + 기본코드 등록 + + 코드 종류 등록·수정은 super admin·본부 관리자만 가능합니다. +
-
- - - - - - - - - - - - +
+
번호코드코드명세부코드상태등록일작업
+ + + + + + + + + + + + + @@ -45,16 +53,16 @@ $detailColCount = 7 + ($canManageDetails ? 1 : 0); $isSelected = (int) $row->ck_idx === $selectedKindId; $detailUrl = base_url('bag/code-kinds?ck_idx=' . (int) $row->ck_idx); ?> - - - - - - - + + + + + + - - +
번호코드코드명세부코드상태등록일작업
ck_code) ?>ck_name) ?>ck_idx] ?? 0) ?>개ck_state ?? 0) === 1 ? '사용' : '미사용' ?>ck_regdate ?? '') ?>ck_code) ?>ck_name) ?>ck_idx] ?? 0) ?>개ck_state ?? 0)) ?>ck_regdate ?? '') ?> + 수정
@@ -65,42 +73,43 @@ $detailColCount = 7 + ($canManageDetails ? 1 : 0);
등록된 코드 종류가 없습니다.
등록된 코드 종류가 없습니다.
-
-
-

- 세부코드 + +
+
+

+ 세부코드 - — ck_name) ?> (ck_code) ?>) + ck_name) ?> (ck_code) ?>) -

+

- 세부코드 등록 + 세부코드 등록
-
왼쪽에서 코드 종류를 선택해 주세요.
+
왼쪽에서 코드 종류를 선택해 주세요.
-
- +
+
- - - - - - - - + + + + + + + + - + @@ -111,16 +120,18 @@ $detailColCount = 7 + ($canManageDetails ? 1 : 0); $isPlatform = (($row->cd_source ?? 'platform') === 'platform' && (int) ($row->cd_lg_idx ?? 0) === 0); $scopeLabel = $isPlatform ? '공통' : '지자체'; ?> - - - - - - - - + + + + + + + + - - +
번호코드코드명범위정렬상태등록일
번호코드코드명범위정렬상태등록일 작업작업
cd_code) ?>cd_name) ?>cd_sort ?? 0) ?>cd_state ?? 0) === 1 ? '사용' : '미사용' ?>cd_regdate ?? '') ?>
cd_code) ?>cd_name) ?> + + cd_sort ?? 0) ?>cd_state ?? 0)) ?>cd_regdate ?? '') ?> + cd_idx])): ?> 수정 @@ -135,7 +146,7 @@ $detailColCount = 7 + ($canManageDetails ? 1 : 0);
등록된 세부코드가 없습니다.
등록된 세부코드가 없습니다.
diff --git a/app/Views/bag/daily_inventory.php b/app/Views/bag/daily_inventory.php index 09e5f0d..45d664d 100644 --- a/app/Views/bag/daily_inventory.php +++ b/app/Views/bag/daily_inventory.php @@ -14,7 +14,7 @@ $userNav = session_user_nav_display(); -종량제 시스템 +GBLS diff --git a/app/Views/bag/help.php b/app/Views/bag/help.php index 4bd1d24..a8cdaff 100644 --- a/app/Views/bag/help.php +++ b/app/Views/bag/help.php @@ -10,7 +10,7 @@

시스템 개요

-

종량제 시스템은 지자체 종량제 쓰레기봉투의 발주, 입고, 재고, 판매, 불출 등 전체 물류 프로세스를 관리합니다.

+

GBLS(Garbage Bag Logistics System)는 지자체 종량제 쓰레기봉투의 발주, 입고, 재고, 판매, 불출 등 전체 물류 프로세스를 관리합니다.

diff --git a/app/Views/bag/layout/embed.php b/app/Views/bag/layout/embed.php index cbe264d..6c4e8ee 100644 --- a/app/Views/bag/layout/embed.php +++ b/app/Views/bag/layout/embed.php @@ -17,7 +17,7 @@ $helpUrl = function_exists('manual_help_url_for_path') ? manual_help_url_for_pat -<?= esc($title ?? '종량제 시스템') ?> +<?= esc($title ?? 'GBLS') ?> diff --git a/app/Views/bag/layout/main.php b/app/Views/bag/layout/main.php index 92bcebf..8be65b0 100644 --- a/app/Views/bag/layout/main.php +++ b/app/Views/bag/layout/main.php @@ -19,7 +19,7 @@ $userNav = session_user_nav_display(); -<?= esc($title ?? '종량제 시스템') ?> +<?= esc($title ?? 'GBLS') ?> @@ -143,7 +143,7 @@ tailwind.config = {
- 종량제 시스템 + GBLS
diff --git a/app/Views/bag/layout/workspace.php b/app/Views/bag/layout/workspace.php index 1f7b102..773b325 100644 --- a/app/Views/bag/layout/workspace.php +++ b/app/Views/bag/layout/workspace.php @@ -33,7 +33,7 @@ if ($effectiveLgIdx) { -워크스페이스 · 종량제 시스템 +워크스페이스 · GBLS diff --git a/app/Views/bag/lg_dashboard_charts.php b/app/Views/bag/lg_dashboard_charts.php index 444ffdb..2f1cc58 100644 --- a/app/Views/bag/lg_dashboard_charts.php +++ b/app/Views/bag/lg_dashboard_charts.php @@ -18,7 +18,7 @@ $dashBlend = base_url('dashboard/blend'); - 종량제 시스템 — 통계·그래프 현황 + GBLS — 통계·그래프 현황 diff --git a/app/Views/bag/lg_dashboard_dense.php b/app/Views/bag/lg_dashboard_dense.php index eaeb41f..cc6cdae 100644 --- a/app/Views/bag/lg_dashboard_dense.php +++ b/app/Views/bag/lg_dashboard_dense.php @@ -73,7 +73,7 @@ $notices = [ - 종량제 시스템 — 종합 현황 (정보집약) + GBLS — 종합 현황 (정보집약) diff --git a/app/Views/bag/lg_dashboard_modern.php b/app/Views/bag/lg_dashboard_modern.php index 5620d04..51f70f1 100644 --- a/app/Views/bag/lg_dashboard_modern.php +++ b/app/Views/bag/lg_dashboard_modern.php @@ -18,7 +18,7 @@ $dashBlend = base_url('dashboard/blend'); - 종량제 시스템 — 업무 현황 (모던) + GBLS — 업무 현황 (모던) diff --git a/app/Views/bag/lg_dashboard_simple.php b/app/Views/bag/lg_dashboard_simple.php index bee092e..5036bad 100644 --- a/app/Views/bag/lg_dashboard_simple.php +++ b/app/Views/bag/lg_dashboard_simple.php @@ -178,7 +178,7 @@ $lowStock = [
-

종량제 시스템 · 포털

+

GBLS · 포털

기본 · 변형(strip) 시안

diff --git a/app/Views/bag/waste_suibal_enterprise.php b/app/Views/bag/waste_suibal_enterprise.php index c596dd1..14dc93e 100644 --- a/app/Views/bag/waste_suibal_enterprise.php +++ b/app/Views/bag/waste_suibal_enterprise.php @@ -3,7 +3,7 @@ - 종량제 시스템 — 봉투 수불 현황 + GBLS — 봉투 수불 현황 diff --git a/app/Views/components/header_brand.php b/app/Views/components/header_brand.php index 21657a3..6d94a58 100644 --- a/app/Views/components/header_brand.php +++ b/app/Views/components/header_brand.php @@ -6,9 +6,12 @@ $href = $href ?? base_url(); /** @var string $linkClass Anchor + inner flex typography */ $linkClass = $linkClass ?? 'app-brand flex items-center gap-2 shrink-0 text-base font-semibold text-gray-800 tracking-tight hover:text-blue-600'; ?> - + - 종량제 시스템 + + GBLS + Garbage Bag Logistics System + diff --git a/app/Views/components/jongryangje_mark.php b/app/Views/components/jongryangje_mark.php index b866d9b..4d0ef35 100644 --- a/app/Views/components/jongryangje_mark.php +++ b/app/Views/components/jongryangje_mark.php @@ -2,7 +2,7 @@ declare(strict_types=1); /** - * 종량제 시스템 — 미니멀 에코 마크 (링 + 잎) + * GBLS — 미니멀 에코 마크 (링 + 잎) * * @var string $svgClass Tailwind classes for the SVG root */ diff --git a/app/Views/home/_dashboard_gov_portal_brand.php b/app/Views/home/_dashboard_gov_portal_brand.php index 5240363..1d2ddf0 100644 --- a/app/Views/home/_dashboard_gov_portal_brand.php +++ b/app/Views/home/_dashboard_gov_portal_brand.php @@ -11,5 +11,8 @@ $brandHref = $brandHref ?? base_url('dashboard/gov-portal'); - 종량제 시스템 + + GBLS + Garbage Bag Logistics System + diff --git a/app/Views/home/_dashboard_gov_portal_head.php b/app/Views/home/_dashboard_gov_portal_head.php index 2c3b171..351cb94 100644 --- a/app/Views/home/_dashboard_gov_portal_head.php +++ b/app/Views/home/_dashboard_gov_portal_head.php @@ -1,3 +1,3 @@ - 종량제 시스템 + GBLS diff --git a/app/Views/home/_dashboard_gov_portal_nav_script_base.php b/app/Views/home/_dashboard_gov_portal_nav_script_base.php index 0d8ecdd..8e8409d 100644 --- a/app/Views/home/_dashboard_gov_portal_nav_script_base.php +++ b/app/Views/home/_dashboard_gov_portal_nav_script_base.php @@ -30,10 +30,9 @@ var chHref = (child.href || '').toLowerCase().replace(/^\//, ''); var on = activeHref ? (chHref === activeHref) : (hasOverride ? false : ci === 0); if (child.href) { - li.innerHTML = '' + - '' + (on ? '▸' : '·') + '' + child.name + ''; + li.innerHTML = '' + child.name + ''; } else { - li.innerHTML = '+' + child.name + ''; + li.innerHTML = '' + child.name + ''; } listEl.appendChild(li); }); @@ -67,21 +66,42 @@ try { var a = new URL(u, location.origin); return (a.pathname + a.search).toLowerCase(); } catch (e) { return (u || '').toLowerCase(); } } + function pathOnly(u) { + try { return new URL(u, location.origin).pathname.toLowerCase().replace(/\/$/, ''); } + catch (e) { return (u || '').toLowerCase(); } + } + // 현재 사이드바의 모든 소메뉴에서 강조(active)를 해제 — 메뉴에 없는 화면(대시보드 등)에서 사용 + function clearSidebarActive() { + listEl.querySelectorAll('a').forEach(function (a) { + a.classList.remove('active'); + }); + } window.govPortalNav = { - // URL 로 소속 대메뉴/소메뉴를 찾아 사이드바 강조를 갱신. 일치 없으면 false. + // URL 로 소속 대메뉴/소메뉴를 찾아 사이드바 강조를 갱신. 일치 없으면(대시보드 등) 강조 해제. syncByUrl: function (url) { - var target = pathOf(url); + var target = pathOf(url), targetPath = pathOnly(url), fb = null; for (var p = 0; p < navData.length; p++) { var par = navData[p]; var kids = (par.children && par.children.length) ? par.children : (par.href ? [par] : []); for (var i = 0; i < kids.length; i++) { - if (kids[i].url && pathOf(kids[i].url) === target) { + if (!kids[i].url) continue; + if (pathOf(kids[i].url) === target) { // 정확 일치(경로+쿼리) setActiveTrigger(p); renderSidebar(p, (kids[i].href || '').toLowerCase().replace(/^\//, '')); return true; } + if (!fb && pathOnly(kids[i].url) === targetPath) { // 경로만 일치(쿼리 무시) 폴백 + fb = { p: p, href: (kids[i].href || '').toLowerCase().replace(/^\//, '') }; + } } } + if (fb) { + setActiveTrigger(fb.p); + renderSidebar(fb.p, fb.href); + return true; + } + // 어느 메뉴와도 일치하지 않으면(예: 업무 현황 대시보드) 화살표 강조 해제 + clearSidebarActive(); return false; } }; diff --git a/app/Views/home/_dashboard_gov_portal_sidebar.php b/app/Views/home/_dashboard_gov_portal_sidebar.php index 1f0de98..b555a22 100644 --- a/app/Views/home/_dashboard_gov_portal_sidebar.php +++ b/app/Views/home/_dashboard_gov_portal_sidebar.php @@ -22,12 +22,11 @@ $activeChildHref = strtolower(ltrim((string) ($govActiveChildHref ?? ''), '/'));
  • - - · +
  • @@ -35,7 +34,7 @@ $activeChildHref = strtolower(ltrim((string) ($govActiveChildHref ?? ''), '/'));
  • - +
  • @@ -51,9 +50,7 @@ $activeChildHref = strtolower(ltrim((string) ($govActiveChildHref ?? ''), '/')); 지자체 선택
    diff --git a/app/Views/home/dashboard.php b/app/Views/home/dashboard.php index 62e7d9a..959264d 100644 --- a/app/Views/home/dashboard.php +++ b/app/Views/home/dashboard.php @@ -3,7 +3,7 @@ -홈 - 종량제 시스템 +홈 - GBLS @@ -45,6 +45,6 @@ tailwind.config = { 로그아웃 -
    종량제 시스템
    +
    GBLS
    diff --git a/app/Views/welcome_message.php b/app/Views/welcome_message.php index c64aff8..80f56a9 100644 --- a/app/Views/welcome_message.php +++ b/app/Views/welcome_message.php @@ -26,11 +26,14 @@ tailwind.config = {
    - + - 종량제 시스템 + + GBLS + Garbage Bag Logistics System +