Rapihin setup/member/lot-parking + fitur intercom, exclude WIP controller & file sampah dari git
Kumpulan perubahan yang udah numpuk di working tree: refactor Setup (Gate/Vehicle/Member), rapihin memberin & stiker, service parking baru (ParkingUtilsServices, NetworkService), model/migration lot-parking & DHCP reservation, dan fitur baru Intercom (controller/model/migration/ view). ReportTransaksiController versi lokal ini WIP (~90%, masih didebug) - versi yang bener ada di server, jadi dikeluarin dari git (ditambahin ke .gitignore) biar gak numpuk nindihin punya server pas git pull di sana. Sekalian keluarin dump mentah tabel softseting (1.8MB, nyasar ke-commit), file .bak, dan arsip ad-hoc (api.tgz, c.zip) yang emang bukan source code. Co-Authored-By: Claude Sonnet 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01EAJc2mrpj2cSTe4oowLPzQ
This commit is contained in:
@@ -1,148 +1,39 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<html lang="id">
|
||||
<head>
|
||||
<title>Laravel Setup</title>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>P-Solution Parking</title>
|
||||
<style>
|
||||
/* body { font-family: sans-serif; padding: 30px }
|
||||
.ok { color: green }
|
||||
.fail { color: red }
|
||||
button { padding: 10px 20px } */
|
||||
body { font-family: sans-serif; padding: 30px }
|
||||
|
||||
.ok { color: green }
|
||||
.fail { color: red }
|
||||
|
||||
button {
|
||||
padding: 10px 20px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
#loader {
|
||||
display: none;
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
.spinner {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
border: 4px solid #ddd;
|
||||
border-top: 4px solid #3498db;
|
||||
border-radius: 50%;
|
||||
animation: spin 1s linear infinite;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
@keyframes spin {
|
||||
0% { transform: rotate(0deg); }
|
||||
100% { transform: rotate(360deg); }
|
||||
}
|
||||
:root { --navy:#102a43; --blue:#1f6feb; --mint:#2dd4bf; --muted:#64748b; }
|
||||
* { box-sizing:border-box; }
|
||||
body { min-height:100vh; margin:0; color:var(--navy); font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif; background:radial-gradient(circle at 15% 15%,#d7f6f0 0,transparent 32%),linear-gradient(135deg,#f7fbff,#eaf1f8); }
|
||||
main { width:min(960px,calc(100% - 40px)); min-height:100vh; display:grid; grid-template-columns:1.1fr .9fr; gap:48px; align-items:center; margin:auto; }
|
||||
.brand { display:flex; gap:12px; align-items:center; font-size:14px; font-weight:800; letter-spacing:.05em; text-transform:uppercase; }.mark { display:grid; width:38px; height:38px; place-items:center; color:#fff; border-radius:12px; background:linear-gradient(135deg,#2877e8,#153f83); box-shadow:0 10px 25px #1f6feb38; }
|
||||
h1 { margin:26px 0 16px; font-size:clamp(38px,6vw,62px); letter-spacing:-.055em; line-height:1.02; }.copy { max-width:520px; color:var(--muted); font-size:17px; line-height:1.7; }
|
||||
.login { display:inline-flex; gap:10px; align-items:center; margin-top:28px; padding:14px 19px; border-radius:12px; color:#fff; text-decoration:none; font-weight:750; background:var(--navy); box-shadow:0 12px 25px #102a4328; }.login:hover { background:#163b60; }
|
||||
.visual { position:relative; min-height:390px; overflow:hidden; border:1px solid #fff; border-radius:28px; background:linear-gradient(150deg,#173b65,#0e2743); box-shadow:0 25px 70px #102a4330; }.lane { position:absolute; width:190%; height:90px; left:-42%; transform:rotate(-33deg); background:repeating-linear-gradient(90deg,transparent 0 42px,#eaf4fb 42px 68px,transparent 68px 120px); opacity:.85; }.lane.one { top:105px; }.lane.two { top:250px; }.signal { position:absolute; top:52px; right:48px; width:86px; height:164px; padding:14px; border-radius:18px; background:#0b1d30; box-shadow:0 14px 28px #0005; }.signal span { display:block; width:40px; height:40px; margin:0 auto 10px; border-radius:50%; background:#25384c; }.signal span:last-child { background:#31d6a4; box-shadow:0 0 20px #31d6a4aa; }.card { position:absolute; left:32px; bottom:34px; right:32px; padding:20px; border:1px solid #ffffff24; border-radius:16px; color:#fff; background:#ffffff12; backdrop-filter:blur(8px); }.card small { color:#b5cde4; }.card strong { display:block; margin-top:7px; font-size:20px; }
|
||||
@@media(max-width:760px) { main { grid-template-columns:1fr; gap:30px; padding:48px 0; }.visual { min-height:280px; }.lane.one { top:65px; }.lane.two { top:180px; } }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
@if ($status['users_view'] )
|
||||
<h2>🚀 Laravel Setup Checker</h2>
|
||||
<h2>🚀 Laravel Setup Checker</h2>
|
||||
<script>window.location = "/login";</script>
|
||||
@else
|
||||
|
||||
@if(session('success'))
|
||||
<p class="ok">{{ session('success') }}</p>
|
||||
@endif
|
||||
|
||||
@if(session('error'))
|
||||
<p class="fail">{{ session('error') }}</p>
|
||||
@endif
|
||||
|
||||
<ul>
|
||||
<li>pgcrypto:
|
||||
<b class="{{ $status['pgcrypto'] ? 'ok' : 'fail' }}">
|
||||
{{ $status['pgcrypto'] ? 'OK' : 'NOT FOUND' }}
|
||||
</b>
|
||||
</li>
|
||||
|
||||
<li>pegawai.id:
|
||||
<b class="{{ $status['pegawai_columns']['id'] ? 'ok' : 'fail' }}">
|
||||
{{ $status['pegawai_columns']['id'] ? 'OK' : 'MISSING' }}
|
||||
</b>
|
||||
</li>
|
||||
|
||||
<li>pegawai.email:
|
||||
<b class="{{ $status['pegawai_columns']['email'] ? 'ok' : 'fail' }}">
|
||||
{{ $status['pegawai_columns']['email'] ? 'OK' : 'MISSING' }}
|
||||
</b>
|
||||
</li>
|
||||
|
||||
<li>pegawai.email_verified_at:
|
||||
<b class="{{ $status['pegawai_columns']['email_verified_at'] ? 'ok' : 'fail' }}">
|
||||
{{ $status['pegawai_columns']['email_verified_at'] ? 'OK' : 'MISSING' }}
|
||||
</b>
|
||||
</li>
|
||||
|
||||
<li>pegawai.remember_token:
|
||||
<b class="{{ $status['pegawai_columns']['remember_token'] ? 'ok' : 'fail' }}">
|
||||
{{ $status['pegawai_columns']['remember_token'] ? 'OK' : 'MISSING' }}
|
||||
</b>
|
||||
</li>
|
||||
|
||||
<li>users view:
|
||||
<b class="{{ $status['users_view'] ? 'ok' : 'fail' }}">
|
||||
{{ $status['users_view'] ? 'OK' : 'NOT FOUND' }}
|
||||
</b>
|
||||
</li>
|
||||
|
||||
<li>transaksi_parkir.veri_time:
|
||||
<b class="{{ $status['veri_time'] ? 'ok' : 'fail' }}">
|
||||
{{ $status['veri_time'] ? 'OK' : 'MISSING' }}
|
||||
</b>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<form method="POST" action="{{ route('setup.run') }}">
|
||||
@csrf
|
||||
<button type="submit">⚙️ Jalankan Setup</button>
|
||||
|
||||
<div id="loader">
|
||||
<div class="spinner"></div>
|
||||
<b>Memproses setup database…</b>
|
||||
</div>
|
||||
</form>
|
||||
@endif
|
||||
|
||||
|
||||
<script>
|
||||
document.getElementById('runSetup').addEventListener('click', function () {
|
||||
const btn = this;
|
||||
const loader = document.getElementById('loader');
|
||||
|
||||
btn.disabled = true;
|
||||
btn.innerText = 'Processing...';
|
||||
loader.style.display = 'block';
|
||||
|
||||
fetch("{{ route('setup.run') }}", {
|
||||
method: "POST",
|
||||
headers: {
|
||||
"X-CSRF-TOKEN": document.querySelector('meta[name="csrf-token"]').content,
|
||||
"Accept": "application/json"
|
||||
}
|
||||
})
|
||||
.then(res => res.json())
|
||||
.then(res => {
|
||||
if (res.success) {
|
||||
loader.innerHTML = "<b class='ok'>✅ Setup selesai, mengalihkan halaman...</b>";
|
||||
|
||||
setTimeout(() => {
|
||||
window.location.href = res.redirect;
|
||||
}, 1500);
|
||||
}
|
||||
})
|
||||
.catch(err => {
|
||||
loader.innerHTML = "<b class='fail'>❌ Setup gagal</b>";
|
||||
btn.disabled = false;
|
||||
btn.innerText = '⚙️ Jalankan Setup';
|
||||
console.error(err);
|
||||
});
|
||||
});
|
||||
</script>
|
||||
<main>
|
||||
<section>
|
||||
<div class="brand"><span class="mark">P</span>P-Solution Parking</div>
|
||||
<h1>Operasional parkir, siap dalam satu tempat.</h1>
|
||||
<p class="copy">Kelola aktivitas parkir, transaksi, member, dan pengaturan lokasi melalui sistem operasional P-Solution Parking.</p>
|
||||
@if($isReady)
|
||||
<a class="login" href="{{ route('login') }}">Masuk ke Aplikasi <span>→</span></a>
|
||||
@else
|
||||
<p class="copy" style="font-size:14px;margin-top:24px">Aplikasi perlu disiapkan untuk database di lokasi ini sebelum dapat digunakan.</p>
|
||||
<a class="login" href="{{ route('setup.index') }}">Siapkan Aplikasi <span>→</span></a>
|
||||
@endif
|
||||
</section>
|
||||
<aside class="visual" aria-hidden="true">
|
||||
<div class="lane one"></div><div class="lane two"></div>
|
||||
<div class="signal"><span></span><span></span><span></span></div>
|
||||
<div class="card"><small>SISTEM OPERASIONAL</small><strong>Parkir lebih terukur, layanan lebih lancar.</strong></div>
|
||||
</aside>
|
||||
</main>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
Reference in New Issue
Block a user