Files
sam-manage/resources/views/partials/tenant-console-sidebar.blade.php
권혁성 8da1702e47 fix: [tenant-console] 테넌트 콘솔 분리작업
- 라우트 파라미터 충돌 수정 (Layer 4 확장)
- TenantScope 글로벌 스코프가 테넌트 콘솔에서 올바른 tenant_id 사용하도록 수정
- 감사로그 상세 테넌트 콘솔 레이아웃 적용
- 테넌트 전환: 모달 → 컨텍스트 메뉴로 이동, 스타일 변경 (녹색+전환아이콘)
- 테넌트 전환 이벤트를 openTenantConsole 호출로 통일
- 사이드바 스타일 메인과 통일 + 리포트 주의사항 정리
2026-03-13 10:18:23 +09:00

114 lines
5.8 KiB
PHP

{{-- 테넌트 콘솔 전용 사이드바 (메인 사이드바 스타일 통일) --}}
@php
$tenantId = $consoleTenantId ?? 0;
$currentUrl = request()->url();
$baseUrl = "/tenant-console/{$tenantId}";
$menuGroups = [
[
'title' => '권한 관리',
'icon' => 'ri-shield-keyhole-line',
'items' => [
['name' => '권한 관리', 'url' => "{$baseUrl}/permissions", 'icon' => 'ri-key-2-line'],
['name' => '역할 관리', 'url' => "{$baseUrl}/roles", 'icon' => 'ri-user-settings-line'],
['name' => '역할-권한 매핑', 'url' => "{$baseUrl}/role-permissions", 'icon' => 'ri-links-line'],
['name' => '부서-권한 매핑', 'url' => "{$baseUrl}/department-permissions", 'icon' => 'ri-building-2-line'],
['name' => '사용자-권한 매핑', 'url' => "{$baseUrl}/user-permissions", 'icon' => 'ri-user-star-line'],
],
],
[
'title' => '시스템 관리',
'icon' => 'ri-settings-3-line',
'items' => [
['name' => 'AI 설정', 'url' => "{$baseUrl}/system/ai-config", 'icon' => 'ri-robot-line'],
['name' => '휴일 관리', 'url' => "{$baseUrl}/system/holidays", 'icon' => 'ri-calendar-event-line'],
['name' => '시스템 알림', 'url' => "{$baseUrl}/system/alerts", 'icon' => 'ri-notification-3-line'],
['name' => '공통코드', 'url' => "{$baseUrl}/common-codes", 'icon' => 'ri-code-s-slash-line'],
['name' => '카테고리', 'url' => "{$baseUrl}/categories", 'icon' => 'ri-node-tree'],
['name' => '감사 로그', 'url' => "{$baseUrl}/audit-logs", 'icon' => 'ri-file-list-3-line'],
],
],
[
'title' => '생산관리',
'icon' => 'ri-instance-line',
'items' => [
['name' => '품목관리', 'url' => "{$baseUrl}/production/items", 'icon' => 'ri-box-3-line'],
['name' => '품목필드', 'url' => "{$baseUrl}/production/item-fields", 'icon' => 'ri-list-settings-line'],
['name' => '견적수식', 'url' => "{$baseUrl}/production/quote-formulas", 'icon' => 'ri-calculator-line'],
['name' => '카테고리', 'url' => "{$baseUrl}/production/categories", 'icon' => 'ri-node-tree'],
],
],
[
'title' => '게시판관리',
'icon' => 'ri-article-line',
'items' => [
['name' => '게시판 목록', 'url' => "{$baseUrl}/boards", 'icon' => 'ri-layout-grid-line'],
],
],
];
@endphp
<aside class="w-64 bg-white border-r border-gray-200 flex flex-col shrink-0">
{{-- 테넌트 정보 헤더 --}}
<div class="flex items-center h-16 border-b border-gray-200 px-3">
<a href="{{ $baseUrl }}" class="flex items-center gap-2 text-gray-800 hover:text-blue-600 transition">
<i class="ri-building-line text-xl text-blue-600"></i>
<div class="min-w-0">
<div class="font-semibold text-sm truncate">{{ $consoleTenant->company_name ?? '테넌트' }}</div>
<div class="text-xs text-gray-500">관리 콘솔</div>
</div>
</a>
</div>
{{-- 메뉴 영역 --}}
<nav class="flex-1 overflow-y-auto p-4">
<ul class="space-y-1">
@foreach($menuGroups as $groupIndex => $group)
{{-- 1depth: 그룹 헤더 (메인 사이드바 menu-group 스타일) --}}
<li class="pt-4 pb-1 border-t border-gray-200 mt-2">
<button @click="$refs.group{{ $groupIndex }}.classList.toggle('hidden')"
class="w-full flex items-center justify-between px-3 py-2 text-sm font-semibold text-gray-700 hover:bg-gray-50 rounded"
style="padding-left: 0.75rem">
<span class="flex items-center gap-2">
<i class="{{ $group['icon'] }} w-4 h-4 text-base"></i>
{{ $group['title'] }}
</span>
<svg class="w-3 h-3 transition-transform rotate-180" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7" />
</svg>
</button>
{{-- 2depth: 메뉴 아이템 (메인 사이드바 menu-item 스타일) --}}
<ul x-ref="group{{ $groupIndex }}" class="space-y-1 mt-1">
@foreach($group['items'] as $item)
@php
$isActive = str_starts_with($currentUrl, url($item['url']));
$activeClass = $isActive
? 'bg-primary text-white hover:bg-primary'
: 'text-gray-700 hover:bg-gray-100';
@endphp
<li>
<a href="{{ $item['url'] }}"
class="flex items-center gap-2 px-3 py-2 rounded-lg text-sm {{ $activeClass }}"
style="padding-left: 1.5rem">
<i class="{{ $item['icon'] }} text-base {{ $isActive ? '' : 'text-gray-400' }}"></i>
{{ $item['name'] }}
</a>
</li>
@endforeach
</ul>
</li>
@endforeach
</ul>
</nav>
{{-- 하단: 메인으로 돌아가기 --}}
<div class="px-4 py-3 border-t border-gray-200">
<a href="/tenants" target="_opener"
class="flex items-center gap-2 text-sm text-gray-500 hover:text-gray-700 transition">
<i class="ri-arrow-go-back-line"></i>
테넌트 목록으로
</a>
</div>
</aside>