ui: consolidate DDS navigation
This commit is contained in:
@@ -67,11 +67,6 @@ body { margin: 0; background: var(--dds-bg); color: var(--dds-ink); font-family:
|
|||||||
.journey-card-compact h2 { margin: 0 0 .25rem; }
|
.journey-card-compact h2 { margin: 0 0 .25rem; }
|
||||||
.journey-card-compact strong { font-size: .8rem; }
|
.journey-card-compact strong { font-size: .8rem; }
|
||||||
.compact-context { padding: .75rem; }
|
.compact-context { padding: .75rem; }
|
||||||
.architecture-strip:has(.dds-product-nav) { background: transparent; border: 0; display: block; margin: 0 0 1.25rem; padding: 0; }
|
|
||||||
.dds-product-nav { background: #fff; border: 1px solid var(--dds-line); border-radius: 10px; display: flex; gap: .25rem; overflow-x: auto; padding: .3rem; }
|
|
||||||
.dds-product-nav a { border-radius: 7px; color: var(--dds-muted); font-size: .86rem; font-weight: 700; padding: .5rem .75rem; text-decoration: none; white-space: nowrap; }
|
|
||||||
.dds-product-nav a:hover { background: #f1f4fb; color: var(--dds-ink); }
|
|
||||||
.dds-product-nav a.active { background: #e8edff; color: var(--dds-accent-dark); }
|
|
||||||
.page-title .context-summary { font-size: .95rem; max-width: 700px; }
|
.page-title .context-summary { font-size: .95rem; max-width: 700px; }
|
||||||
.explanation-details > summary { color: #43516a; font-size: .86rem; }
|
.explanation-details > summary { color: #43516a; font-size: .86rem; }
|
||||||
.explanation-details > summary::marker { color: var(--dds-accent); }
|
.explanation-details > summary::marker { color: var(--dds-accent); }
|
||||||
@@ -130,5 +125,4 @@ body { margin: 0; background: var(--dds-bg); color: var(--dds-ink); font-family:
|
|||||||
.hero { padding-top: 30px; }
|
.hero { padding-top: 30px; }
|
||||||
.protection-status-topline, .protection-status-footer { align-items: flex-start; flex-direction: column; }
|
.protection-status-topline, .protection-status-footer { align-items: flex-start; flex-direction: column; }
|
||||||
.registration-result { flex-direction: column; }
|
.registration-result { flex-direction: column; }
|
||||||
.dds-product-nav { border-radius: 8px; }
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,61 +12,43 @@
|
|||||||
<script defer src="/js/app.js"></script>
|
<script defer src="/js/app.js"></script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<nav th:fragment="nav" class="navbar rw-nav navbar-expand-lg">
|
<nav th:fragment="nav" class="navbar rw-nav navbar-expand-lg" data-product-nav>
|
||||||
<div class="container">
|
<div class="container rw-nav-top">
|
||||||
<a class="navbar-brand" href="/" th:text="${backofficeTrack == 'DDS' ? 'DDS 권한 운영' : 'VPD Backoffice'}">DDS 권한 운영</a>
|
<a class="navbar-brand" href="/">DDS 권한 운영</a>
|
||||||
<span class="badge rounded-pill text-bg-primary ms-2" th:if="${backofficeTrack == 'DDS'}">Deep Data Security</span>
|
<span class="badge rounded-pill text-bg-primary">Deep Data Security</span>
|
||||||
<div class="rw-menu">
|
<div class="rw-menu" aria-label="주요 메뉴">
|
||||||
<div class="rw-menu-group">
|
<button class="rw-menu-trigger" type="button" data-submenu-trigger="access" aria-controls="submenu-access" aria-expanded="false">권한 관리</button>
|
||||||
<button class="rw-menu-trigger" type="button" aria-expanded="false" th:text="${backofficeTrack == 'DDS' ? '권한 관리' : '1. 권한 설계'}">1. 권한 설계</button>
|
<button class="rw-menu-trigger" type="button" data-submenu-trigger="protection" aria-controls="submenu-protection" aria-expanded="false">보호 정책 관리</button>
|
||||||
<div class="rw-menu-panel">
|
<button class="rw-menu-trigger" type="button" data-submenu-trigger="knowledge" aria-controls="submenu-knowledge" aria-expanded="false">지식자료 관리</button>
|
||||||
<a class="nav-link" href="/users" th:text="${backofficeTrack == 'DDS' ? '사용자 관리' : '사용자'}">사용자</a>
|
<button class="rw-menu-trigger" type="button" data-submenu-trigger="verification" aria-controls="submenu-verification" aria-expanded="false">접근 검증</button>
|
||||||
<a class="nav-link" href="/groups" th:text="${backofficeTrack == 'DDS' ? '그룹 관리' : '그룹'}">그룹</a>
|
|
||||||
<a class="nav-link" href="/roles" th:text="${backofficeTrack == 'DDS' ? '역할 관리' : '역할'}">역할</a>
|
|
||||||
<a class="nav-link" href="/permissions" th:text="${backofficeTrack == 'DDS' ? '접근 규칙' : '데이터 권한 규칙'}">데이터 권한 규칙</a>
|
|
||||||
<a class="nav-link" href="/effective-matrix" th:text="${backofficeTrack == 'DDS' ? '권한 현황' : '사용자별 최종 권한'}">사용자별 최종 권한</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="rw-menu-group">
|
|
||||||
<button class="rw-menu-trigger" type="button" aria-expanded="false"
|
|
||||||
th:text="${backofficeTrack == 'DDS' ? '보호 정책 관리' : '2. 보호·검증'}">2. 보호·검증</button>
|
|
||||||
<div class="rw-menu-panel">
|
|
||||||
<a class="nav-link" th:href="${backofficeTrack == 'DDS' ? '/dds-protection' : '/vpd-policies'}"
|
|
||||||
th:text="${backofficeTrack == 'DDS' ? '정책 상태' : 'DB 보호 연결'}">DB 보호 연결</a>
|
|
||||||
<a class="nav-link" href="/dds-provision" th:if="${backofficeTrack == 'DDS'}">정책 적용</a>
|
|
||||||
<a class="nav-link" href="/tokens" th:if="${backofficeTrack != 'DDS'}">검증 세션 발급</a>
|
|
||||||
<a class="nav-link" href="/probe" th:if="${backofficeTrack != 'DDS'}">권한 결과 확인</a>
|
|
||||||
<a class="nav-link" href="/dds" th:if="${backofficeTrack == 'DDS'}">보호 대상 관리</a>
|
|
||||||
<a class="nav-link" href="/dds" th:if="${backofficeTrack != 'DDS'}">DDS 직접 조회</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="rw-menu-group">
|
|
||||||
<button class="rw-menu-trigger" type="button" aria-expanded="false" th:text="${backofficeTrack == 'DDS' ? '지식자료 관리' : '연동 도구'}">연동 도구</button>
|
|
||||||
<div class="rw-menu-panel">
|
|
||||||
<a class="nav-link" href="/objects" th:if="${backofficeTrack != 'DDS'}">ORDS 조회 대상</a>
|
|
||||||
<a class="nav-link" href="/ords-handlers" th:if="${backofficeTrack != 'DDS'}">ORDS 핸들러</a>
|
|
||||||
<a class="nav-link" href="/vector-knowledge" th:text="${backofficeTrack == 'DDS' ? '자료 등록 및 검색' : '지식 검색 관리'}">지식 검색 관리</a>
|
|
||||||
<a class="nav-link" href="/mcp-chatbot" th:if="${backofficeTrack != 'DDS'}">Chatbot</a>
|
|
||||||
<a class="nav-link" href="/mcp-reasoning" th:if="${backofficeTrack != 'DDS'}">Reasoning</a>
|
|
||||||
<a class="nav-link" href="/mcp-sse" th:if="${backofficeTrack != 'DDS'}">SSE 서비스</a>
|
|
||||||
<a class="nav-link" href="/mcp-client-demo" th:if="${backofficeTrack != 'DDS'}">MCP Client</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="rw-menu-group">
|
|
||||||
<button class="rw-menu-trigger" type="button" aria-expanded="false" th:text="${backofficeTrack == 'DDS' ? '접근 검증' : '운영·고급'}">운영·고급</button>
|
|
||||||
<div class="rw-menu-panel">
|
|
||||||
<a class="nav-link" href="/dds-protection#direct-check-heading" th:if="${backofficeTrack == 'DDS'}">직접 접근 검증</a>
|
|
||||||
<a class="nav-link" href="/operation-status" th:if="${backofficeTrack != 'DDS'}">운영 상태</a>
|
|
||||||
<a class="nav-link" href="/vpd-filter-policies" th:if="${backofficeTrack != 'DDS'}">별도 Filter 관리</a>
|
|
||||||
<a class="nav-link" href="/settings" th:if="${backofficeTrack != 'DDS'}">설정</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
<form method="post" action="/logout" class="ms-auto">
|
<form method="post" action="/logout" class="ms-auto">
|
||||||
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}">
|
<input type="hidden" th:name="${_csrf.parameterName}" th:value="${_csrf.token}">
|
||||||
<button class="btn btn-sm btn-outline-secondary" type="submit">로그아웃</button>
|
<button class="btn btn-sm btn-outline-secondary" type="submit">로그아웃</button>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="rw-submenu-bar" data-submenu-bar hidden>
|
||||||
|
<div class="container">
|
||||||
|
<div id="submenu-access" class="rw-submenu" data-submenu-panel="access" role="navigation" aria-label="권한 관리 메뉴" hidden>
|
||||||
|
<a class="nav-link" href="/users">사용자 관리</a>
|
||||||
|
<a class="nav-link" href="/groups">그룹 관리</a>
|
||||||
|
<a class="nav-link" href="/roles">역할 관리</a>
|
||||||
|
<a class="nav-link" href="/permissions">접근 규칙</a>
|
||||||
|
<a class="nav-link" href="/effective-matrix">권한 현황</a>
|
||||||
|
</div>
|
||||||
|
<div id="submenu-protection" class="rw-submenu" data-submenu-panel="protection" role="navigation" aria-label="보호 정책 관리 메뉴" hidden>
|
||||||
|
<a class="nav-link" href="/dds-protection">정책 상태</a>
|
||||||
|
<a class="nav-link" href="/dds-provision">정책 적용</a>
|
||||||
|
<a class="nav-link" href="/dds">보호 대상 관리</a>
|
||||||
|
</div>
|
||||||
|
<div id="submenu-knowledge" class="rw-submenu" data-submenu-panel="knowledge" role="navigation" aria-label="지식자료 관리 메뉴" hidden>
|
||||||
|
<a class="nav-link" href="/vector-knowledge">자료 등록 및 검색</a>
|
||||||
|
</div>
|
||||||
|
<div id="submenu-verification" class="rw-submenu" data-submenu-panel="verification" role="navigation" aria-label="접근 검증 메뉴" hidden>
|
||||||
|
<a class="nav-link" href="/dds-protection#direct-check-heading">직접 접근 검증</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
<div th:fragment="trackNotice" th:if="${backofficeTrack == 'DDS'}" class="container pt-3">
|
<div th:fragment="trackNotice" th:if="${backofficeTrack == 'DDS'}" class="container pt-3">
|
||||||
@@ -75,14 +57,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<section th:fragment="architectureStrip(activeLayer)" class="architecture-strip" aria-label="권한 설정부터 결과 확인까지의 흐름">
|
<section th:fragment="architectureStrip(activeLayer)" th:unless="${backofficeTrack == 'DDS'}" class="architecture-strip" aria-label="권한 설정부터 결과 확인까지의 흐름">
|
||||||
<nav th:if="${backofficeTrack == 'DDS'}" class="dds-product-nav" aria-label="DDS 권한 운영 작업">
|
|
||||||
<a href="/permissions" th:classappend="${activeLayer == 'permission'} ? ' active'">권한 관리</a>
|
|
||||||
<a href="/dds-protection" th:classappend="${activeLayer == 'protection'} ? ' active'">보호 정책 관리</a>
|
|
||||||
<a href="/dds-provision" th:classappend="${activeLayer == 'publish'} ? ' active'">정책 적용</a>
|
|
||||||
<a href="/vector-knowledge" th:classappend="${activeLayer == 'search'} ? ' active'">지식자료 관리</a>
|
|
||||||
</nav>
|
|
||||||
<th:block th:unless="${backofficeTrack == 'DDS'}">
|
|
||||||
<div class="architecture-step" th:classappend="${activeLayer == 'permission'} ? ' active'">
|
<div class="architecture-step" th:classappend="${activeLayer == 'permission'} ? ' active'">
|
||||||
<span class="architecture-kicker">1 · WHO / WHAT</span>
|
<span class="architecture-kicker">1 · WHO / WHAT</span>
|
||||||
<strong>권한 설계</strong>
|
<strong>권한 설계</strong>
|
||||||
@@ -106,7 +81,6 @@
|
|||||||
<strong>결과 확인</strong>
|
<strong>결과 확인</strong>
|
||||||
<p th:if="${backofficeTrack != 'DDS'}">보호 정책을 통과한 데이터만 실제 결과로 확인합니다.</p>
|
<p th:if="${backofficeTrack != 'DDS'}">보호 정책을 통과한 데이터만 실제 결과로 확인합니다.</p>
|
||||||
</div>
|
</div>
|
||||||
</th:block>
|
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
<details th:if="${backofficeTrack == 'DDS'}" class="explanation-details architecture-explanation">
|
<details th:if="${backofficeTrack == 'DDS'}" class="explanation-details architecture-explanation">
|
||||||
|
|||||||
Reference in New Issue
Block a user