Initial commit for combined ProjectKP

This commit is contained in:
raditarahman5-cloud
2026-06-28 15:14:51 +07:00
commit ac6c3473d4
203 changed files with 41848 additions and 0 deletions
@@ -0,0 +1,82 @@
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Dashboard Admin Disnaker Prov. Kalimantan Barat</title>
<script src="https://cdn.tailwindcss.com"></script>
<script src="https://unpkg.com/lucide@latest"></script>
<link href="https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;500;600;700;800;900&display=swap" rel="stylesheet">
<style>
* { box-sizing: border-box; }
body {
font-family: 'Outfit', sans-serif;
background: #F2F5FB;
color: #334155;
margin: 0;
padding: 0;
}
main {
min-height: 100vh;
}
::-webkit-scrollbar { width: 5px; }
::-webkit-scrollbar-track { background: #f1f5f9; }
::-webkit-scrollbar-thumb { background: #cbd5e1; border-radius: 10px; }
</style>
</head>
<body>
@include('admin.layouts.navbar')
<main class="pt-10 px-4">
{{-- Yield inilah panggung untuk konten kamu --}}
@yield('content')
</main>
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<script>
lucide.createIcons();
document.addEventListener('DOMContentLoaded', function() {
document.querySelectorAll('[onclick^="return confirm"]').forEach(function(btn) {
const match = btn.getAttribute('onclick').match(/confirm\('([^']+)'\)/);
if (match) {
const message = match[1];
btn.removeAttribute('onclick');
btn.addEventListener('click', function(e) {
e.preventDefault();
const form = btn.closest('form');
Swal.fire({
title: 'Konfirmasi',
text: message,
icon: 'question',
showCancelButton: true,
confirmButtonColor: '#3b82f6',
cancelButtonColor: '#64748b',
confirmButtonText: 'Ya, Lanjutkan',
cancelButtonText: 'Batal',
reverseButtons: true,
customClass: {
confirmButton: 'rounded-xl',
cancelButton: 'rounded-xl mr-2'
}
}).then((result) => {
if (result.isConfirmed) {
if (form) {
form.submit();
} else if(btn.getAttribute('href')) {
window.location.href = btn.getAttribute('href');
}
}
});
});
}
});
});
</script>
</body>
</html>
@@ -0,0 +1,146 @@
@php
$role = session('user')['role'] ?? '';
$dashboardRoute = $role === 'superadmin' ? route('admin.superadmin.dashboard') : route('admin.dashboard');
$usersRoute = $role === 'superadmin' ? route('admin.superadmin.user.index') : route('admin.users');
$penugasanRoute = $role === 'superadmin' ? route('admin.superadmin.kegiatan.create') : route('admin.kegiatan.index');
$isDashboard = request()->routeIs('*.dashboard');
$isUsers = request()->routeIs('*.user*') || request()->routeIs('*.users*');
$isPenugasan = request()->routeIs('*.kegiatan.*');
$activeStyle = "bg-[#0D215C] text-white";
$inactiveStyle = "text-slate-500 bg-transparent hover:bg-slate-100 hover:text-[#0D215C]";
$roleVal = session('user')['role'] ?? 'Administrator';
if ($roleVal === 'admin') {
$roleVal = 'Administrator';
} elseif ($roleVal === 'superadmin') {
$roleVal = 'Super Admin';
} else {
$roleVal = 'Petugas';
}
@endphp
<nav class="bg-white border-b border-slate-200 shadow-[0_1px_12px_rgba(13,33,92,0.06)] sticky top-0 z-50">
<div class="max-w-[1440px] mx-auto px-4 md:px-6 lg:px-8">
<div class="flex justify-between items-center h-[66px]">
{{-- Logo & Brand --}}
<div class="flex items-center gap-2 md:gap-3">
<img src="{{ asset('Kalimantan-Barat-Logo-Vector.png') }}"
alt="Logo Kalbar"
class="w-9 md:w-[46px] h-auto object-contain">
<div class="border-l-2 border-slate-200 pl-2 md:pl-3">
<p class="text-[11px] md:text-[13.5px] font-bold text-[#0D215C] tracking-tight leading-tight m-0">
Dinas Tenaga Kerja dan Transmigrasi
</p>
<p class="text-[8px] md:text-[10px] font-medium text-slate-400 tracking-[1.8px] uppercase mt-0.5 m-0">
Provinsi Kalimantan Barat
</p>
</div>
</div>
<!-- Hamburger Button (Mobile) -->
<div class="flex md:hidden">
<button type="button" id="admin-menu-btn" class="text-slate-500 hover:text-[#0D215C] focus:outline-none p-2 rounded-md hover:bg-slate-100 transition-colors">
<i data-lucide="menu" class="w-6 h-6"></i>
</button>
</div>
{{-- Nav + User (Desktop) --}}
<div class="hidden md:flex items-center gap-2">
<div class="flex items-center gap-1 mr-2">
<a href="{{ $dashboardRoute }}" class="text-[11.5px] font-semibold tracking-[0.4px] px-[18px] py-2 rounded-lg flex items-center gap-[7px] transition-all duration-200 {{ $isDashboard ? $activeStyle : $inactiveStyle }}">
<i data-lucide="layout-dashboard" class="w-3.5 h-3.5"></i> Dashboard
</a>
<a href="{{ $usersRoute }}" class="text-[11.5px] font-semibold tracking-[0.4px] px-[18px] py-2 rounded-lg flex items-center gap-[7px] transition-all duration-200 {{ $isUsers ? $activeStyle : $inactiveStyle }}">
<i data-lucide="users" class="w-3.5 h-3.5"></i> Kelola Pengguna
</a>
<a href="{{ $penugasanRoute }}" class="text-[11.5px] font-semibold tracking-[0.4px] px-[18px] py-2 rounded-lg flex items-center gap-[7px] transition-all duration-200 {{ $isPenugasan ? $activeStyle : $inactiveStyle }}">
<i data-lucide="clipboard-list" class="w-3.5 h-3.5"></i> Penugasan
</a>
</div>
<div class="w-px h-7 bg-slate-200 mx-1"></div>
<div class="flex items-center gap-2.5">
<div class="text-right">
<p class="text-[13px] font-semibold text-slate-900 leading-none m-0">
{{ session('user')['name'] ?? 'User' }}
</p>
<p class="text-[10px] font-medium text-slate-400 uppercase tracking-[1.2px] mt-1 m-0">
{{ $roleVal }}
</p>
</div>
<div class="w-9 h-9 rounded-lg bg-gradient-to-br from-[#0D215C] to-blue-800 text-white flex items-center justify-center font-bold text-xs tracking-[0.5px]">
{{ strtoupper(substr(session('user')['name'] ?? 'US',0,2)) }}
</div>
<form method="POST" action="{{ route('logout') }}" class="m-0">
@csrf
<button type="submit" class="w-9 h-9 rounded-lg bg-slate-50 text-slate-400 border border-slate-200 cursor-pointer flex items-center justify-center transition-all duration-200 hover:bg-rose-50 hover:text-rose-500 hover:border-rose-200" title="Keluar dari Sistem">
<i data-lucide="log-out" class="w-3.5 h-3.5"></i>
</button>
</form>
</div>
</div>
</div>
</div>
<!-- Mobile Menu Panel -->
<div id="admin-mobile-menu" class="hidden md:hidden bg-white border-t border-slate-100 shadow-xl absolute w-full left-0 pb-4">
<div class="px-4 py-3 flex flex-col gap-2">
<a href="{{ $dashboardRoute }}" class="text-[13px] font-semibold tracking-[0.4px] px-4 py-3 rounded-lg flex items-center gap-3 transition-all duration-200 {{ $isDashboard ? $activeStyle : $inactiveStyle }}">
<i data-lucide="layout-dashboard" class="w-4 h-4"></i> Dashboard
</a>
<a href="{{ $usersRoute }}" class="text-[13px] font-semibold tracking-[0.4px] px-4 py-3 rounded-lg flex items-center gap-3 transition-all duration-200 {{ $isUsers ? $activeStyle : $inactiveStyle }}">
<i data-lucide="users" class="w-4 h-4"></i> Kelola Pengguna
</a>
<a href="{{ $penugasanRoute }}" class="text-[13px] font-semibold tracking-[0.4px] px-4 py-3 rounded-lg flex items-center gap-3 transition-all duration-200 {{ $isPenugasan ? $activeStyle : $inactiveStyle }}">
<i data-lucide="clipboard-list" class="w-4 h-4"></i> Penugasan
</a>
<div class="h-px w-full bg-slate-100 my-1"></div>
<div class="flex items-center justify-between px-2 py-2">
<div class="flex items-center gap-3">
<div class="w-9 h-9 rounded-lg bg-gradient-to-br from-[#0D215C] to-blue-800 text-white flex items-center justify-center font-bold text-xs tracking-[0.5px]">
{{ strtoupper(substr(session('user')['name'] ?? 'US',0,2)) }}
</div>
<div>
<p class="text-[13px] font-semibold text-slate-900 leading-none m-0">
{{ session('user')['name'] ?? 'User' }}
</p>
<p class="text-[10px] font-medium text-slate-400 uppercase tracking-[1.2px] mt-1 m-0">
{{ $roleVal }}
</p>
</div>
</div>
<form method="POST" action="{{ route('logout') }}" class="m-0">
@csrf
<button type="submit" class="w-9 h-9 rounded-lg bg-slate-50 text-slate-400 border border-slate-200 cursor-pointer flex items-center justify-center transition-all duration-200 hover:bg-rose-50 hover:text-rose-500 hover:border-rose-200" title="Keluar dari Sistem">
<i data-lucide="log-out" class="w-4 h-4"></i>
</button>
</form>
</div>
</div>
</div>
</nav>
<script>
document.addEventListener('DOMContentLoaded', function() {
const btn = document.getElementById('admin-menu-btn');
const menu = document.getElementById('admin-mobile-menu');
if(btn && menu) {
btn.addEventListener('click', function(e) {
e.stopPropagation();
menu.classList.toggle('hidden');
lucide.createIcons();
});
document.addEventListener('click', function(e) {
if(!menu.contains(e.target) && !btn.contains(e.target)) {
menu.classList.add('hidden');
}
});
}
});
</script>