feat: GBLS 리브랜딩 + 매뉴얼 보강 + 워크스페이스/코드관리 UX 개선
리브랜딩 - 서비스명 "종량제 시스템" → "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 <noreply@anthropic.com>
This commit is contained in:
@@ -11,5 +11,8 @@ $brandHref = $brandHref ?? base_url('dashboard/gov-portal');
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true" focusable="false">
|
||||
<path fill="currentColor" d="M9 3a1 1 0 00-1 1v1H5.75a.75.75 0 000 1.5h12.5a.75.75 0 000-1.5H16V4a1 1 0 00-1-1H9zm9 4H6v11a2 2 0 002 2h8a2 2 0 002-2V7zM10 9a.75.75 0 01.75.75v6a.75.75 0 01-1.5 0v-6A.75.75 0 0110 9zm4 0a.75.75 0 01.75.75v6a.75.75 0 01-1.5 0v-6A.75.75 0 0114 9z"/>
|
||||
</svg>
|
||||
<span>종량제 시스템</span>
|
||||
<span style="display:inline-flex;flex-direction:column;line-height:1.02;">
|
||||
<strong style="font-size:1.02rem;font-weight:800;letter-spacing:.5px;">GBLS</strong>
|
||||
<span style="font-size:.56rem;font-weight:500;opacity:.72;letter-spacing:.1px;white-space:nowrap;">Garbage Bag Logistics System</span>
|
||||
</span>
|
||||
</a>
|
||||
|
||||
@@ -1,3 +1,3 @@
|
||||
<meta charset="utf-8"/>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
|
||||
<title>종량제 시스템</title>
|
||||
<title>GBLS</title>
|
||||
|
||||
@@ -30,10 +30,9 @@
|
||||
var chHref = (child.href || '').toLowerCase().replace(/^\//, '');
|
||||
var on = activeHref ? (chHref === activeHref) : (hasOverride ? false : ci === 0);
|
||||
if (child.href) {
|
||||
li.innerHTML = '<a href="' + child.url + '" class="' + (on ? 'active' : '') + '">' +
|
||||
'<span class="menu-ico">' + (on ? '▸' : '·') + '</span>' + child.name + '</a>';
|
||||
li.innerHTML = '<a href="' + child.url + '" class="' + (on ? 'active' : '') + '">' + child.name + '</a>';
|
||||
} else {
|
||||
li.innerHTML = '<span class="menu-sub" style="opacity:.65;"><span class="menu-ico">+</span>' + child.name + '</span>';
|
||||
li.innerHTML = '<span class="menu-sub" style="opacity:.65;">' + child.name + '</span>';
|
||||
}
|
||||
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;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -22,12 +22,11 @@ $activeChildHref = strtolower(ltrim((string) ($govActiveChildHref ?? ''), '/'));
|
||||
<li>
|
||||
<?php if ($child['href'] !== ''): ?>
|
||||
<a href="<?= esc($child['url']) ?>" class="<?= $isChildActive ? 'active' : '' ?>">
|
||||
<span class="menu-ico"><?= $isChildActive ? '▸' : '·' ?></span>
|
||||
<?= esc($child['name']) ?>
|
||||
</a>
|
||||
<?php else: ?>
|
||||
<span class="menu-sub" style="opacity:.65;cursor:default;">
|
||||
<span class="menu-ico">·</span><?= esc($child['name']) ?>
|
||||
<?= esc($child['name']) ?>
|
||||
</span>
|
||||
<?php endif; ?>
|
||||
</li>
|
||||
@@ -35,7 +34,7 @@ $activeChildHref = strtolower(ltrim((string) ($govActiveChildHref ?? ''), '/'));
|
||||
<?php elseif ($activeParent['href'] !== ''): ?>
|
||||
<li>
|
||||
<a href="<?= esc($activeParent['url']) ?>" class="active">
|
||||
<span class="menu-ico">▸</span><?= esc($activeParent['name']) ?>
|
||||
<?= esc($activeParent['name']) ?>
|
||||
</a>
|
||||
</li>
|
||||
<?php endif; ?>
|
||||
@@ -51,9 +50,7 @@ $activeChildHref = strtolower(ltrim((string) ($govActiveChildHref ?? ''), '/'));
|
||||
<a href="<?= base_url('admin/select-local-government') ?>" style="color:#fff;text-decoration:underline;">지자체 선택</a>
|
||||
</div>
|
||||
<div class="sb-links">
|
||||
<a href="<?= base_url('bag/help') ?>">나의 할일</a>
|
||||
<a href="<?= base_url('bag/manual') ?>">사용자 매뉴얼</a>
|
||||
<a href="<?= base_url('bag/help') ?>">FAQ</a>
|
||||
</div>
|
||||
</div>
|
||||
</aside>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<meta content="width=device-width, initial-scale=1.0" name="viewport"/>
|
||||
<title>홈 - 종량제 시스템</title>
|
||||
<title>홈 - GBLS</title>
|
||||
<script src="https://cdn.tailwindcss.com?plugins=forms,container-queries"></script>
|
||||
<style data-purpose="global-font-scale">html{font-size:18px}.app-brand,.app-brand *{font-size:16px}</style>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@300;400;500;700&display=swap" rel="stylesheet"/>
|
||||
@@ -45,6 +45,6 @@ tailwind.config = {
|
||||
<a href="<?= base_url('logout') ?>" class="inline-block bg-btn-exit text-white px-4 py-2 rounded-sm text-sm shadow hover:bg-red-700 transition">로그아웃</a>
|
||||
</section>
|
||||
</main>
|
||||
<footer class="bg-gray-200 border-t border-gray-300 px-4 py-1 text-xs text-gray-600 shrink-0">종량제 시스템</footer>
|
||||
<footer class="bg-gray-200 border-t border-gray-300 px-4 py-1 text-xs text-gray-600 shrink-0">GBLS</footer>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
Reference in New Issue
Block a user