progress mapping jabatan, folder sesuai user yang login

This commit is contained in:
JokoPrasetio 2025-09-04 15:35:42 +07:00
parent a1acd0679a
commit bb6464e1a7
25 changed files with 632 additions and 504 deletions

View File

@ -0,0 +1,31 @@
<?php
namespace App\Http\Controllers;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
class AuthController extends Controller
{
public function index(){
return view('auth.index');
}
public function login(Request $request){
$user = User::where('namauser', '=', request('namauser'))->first();
if ($user && $user->passcode === sha1($request->input('passcode'))) {
auth()->login($user); // login manual ke Laravel Auth
$request->session()->regenerate();
return redirect()->intended('/');
}
return back()->with(['alertError' => 'Gagal Login!']);
}
public function logout(){
Auth::logout();
request()->session()->invalidate();
request()->session()->regenerateToken();
return redirect('/login');
}
}

View File

@ -0,0 +1,80 @@
<?php
namespace App\Http\Controllers;
use App\Models\FileDirectory;
use App\Models\MasterKategori;
use App\Models\MasterKlasifikasi;
use App\Models\SubUnitKerja;
use App\Models\UnitKerja;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Str;
class DashboardController extends Controller
{
public function index(){
dd(auth()->user());
$unitKerja = UnitKerja::where('statusenabled', true)->select('id', 'name')->get();
$subUnitKerja = SubUnitKerja::where('statusenabled', true)->select('id', 'name')->get();
$katDok = MasterKategori::where('statusenabled', true)->select('master_kategori_directory_id', 'nama_kategori_directory')->get();
$klasifikasiDok = MasterKlasifikasi::where('statusenabled', true)->select('master_klasifikasi_directory_id', 'nama_klasifikasi_directory')->get();
$payload = [
'title' => 'Dashboard',
'unitKerja' => $unitKerja,
'subUnitKerja' => $subUnitKerja,
'katDok' => $katDok,
'klasifikasiDok' => $klasifikasiDok,
];
return view('dashboard.index', $payload);
}
public function dataUnitKerja(){
$unitKerja = UnitKerja::where('statusenabled', true)->select('id', 'name')->get();
$katDok = MasterKategori::where('statusenabled', true)->select('master_kategori_directory_id', 'nama_kategori_directory')->get();
$data = [
'unitKerja' => $unitKerja,
'katDok' => $katDok
];
return response()->json([
'status' => true,
'data' => $data,
], 200);
}
public function store(){
DB::connection('dbDirectory')->beginTransaction();
try {
$datas = request()->input('data');
foreach($datas as $index => $value){
$file = request()->file("data.$index.file");
$payload = [
'master_klasifikasi_directory_id' => $value['klasifikasi'],
'id_unit_kerja' => request('id_unit_kerja') ?? null,
'id_sub_unit_kerja' => request('id_sub_unit_kerja') ?? null,
'master_kategori_directory_id' => request('master_kategori_directory_id') ?? null,
'pegawai_id_entry' => auth()->user()->id ?? 1,
'pegawai_nama_entry' => auth()->user()->namalengkap ?? 'tes',
];
if($file){
$imageName = $file->getClientOriginalName();
Storage::disk('file_directory')->put($imageName, file_get_contents($file));
$payload['file'] =$imageName;
}
FileDirectory::create($payload);
}
DB::connection('dbDirectory')->commit();
return response()->json([
'status' => true,
'message' => 'Data berhasil disimpan',
], 200);
} catch (\Throwable $th) {
DB::connection('dbDirectory')->rollBack();
return response()->json([
'status' => false,
'message' => $th->getMessage()
], 500);
}
}
}

View File

@ -39,7 +39,7 @@ class MasterKlasifikasiController extends Controller
$datas = $request->input('data');
foreach ($datas as $key => $value) {
$payload = [
'nama_klasifikasi_directory' => $value['nama_klasifikasi']
'master_klasifikasi_directory_id' => $value['klasifikasi']
];
MasterKlasifikasi::create($payload);
}

View File

@ -0,0 +1,14 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class FileDirectory extends Model
{
protected $connection = 'dbDirectory';
protected $table = 'public.file_directory';
public $timestamps = false;
protected $primaryKey = 'file_directory_id';
protected $guarded = ['file_directory_id'];
}

View File

@ -0,0 +1,19 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class SubUnitKerja extends Model
{
protected $connection = 'dbDirectory';
protected $table = 'public.subunitkerja_m';
public $timestamps = false;
protected $primaryKey = 'id';
protected $guarded = ['id'];
protected $with = ['fileDirectory'];
public function fileDirectory(){
return $this->hasMany(FileDirectory::class, 'id_sub_unit_kerja', 'id')->where('statusenabled', true);
}
}

20
app/Models/UnitKerja.php Normal file
View File

@ -0,0 +1,20 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class UnitKerja extends Model
{
protected $connection = 'dbDirectory';
protected $table = 'public.unitkerjapegawai_m';
public $timestamps = false;
protected $primaryKey = 'id';
protected $guarded = ['id'];
protected $with = ['subUnitKerja'];
public function subUnitKerja(){
return $this->hasMany(SubUnitKerja::class, 'objectunitkerjapegawaifk', 'id')->where('statusenabled', true)->select('id', 'objectunitkerjapegawaifk', 'name');
}
}

View File

@ -17,10 +17,12 @@ class User extends Authenticatable
*
* @var list<string>
*/
protected $fillable = [
'name',
'email',
'password',
protected $connection = 'dbDirectory';
protected $table = 'public.loginuser_s';
public $timestamps = false;
protected $primaryKey = "id";
protected $guarded = [
'id',
];
/**
@ -29,8 +31,7 @@ class User extends Authenticatable
* @var list<string>
*/
protected $hidden = [
'password',
'remember_token',
'katasandi'
];
/**
@ -41,8 +42,7 @@ class User extends Authenticatable
protected function casts(): array
{
return [
'email_verified_at' => 'datetime',
'password' => 'hashed',
'katasandi' => 'hashed',
];
}
}

View File

@ -60,6 +60,13 @@ return [
'report' => false,
],
'file_directory' => [
'driver' => 'local',
'root' => public_path('file') . '/',
'url' => env('APP_URL') . '/',
'visibility' => 'public',
],
],
/*

Binary file not shown.

After

Width:  |  Height:  |  Size: 481 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 112 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 168 KiB

BIN
public/file/default.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 466 KiB

View File

@ -0,0 +1,2 @@
const modalCreate = document.getElementById('modalFileCreate')
const formCreate = $("#formFile")

View File

@ -0,0 +1,49 @@
formCreate.on('submit', function(e){
e.preventDefault();
const form = this;
const formData = new FormData(form);
fetch(`/upload`, {
method: 'POST',
headers: {
'X-CSRF-TOKEN': document.querySelector('input[name="_token"]').value,
},
body: formData
}).then(async(res) => {
const responseData = await res.json();
if (responseData.status) {
const handler = function () {
Toastify({
text: responseData.message || 'Berhasil melakukan aksi!',
duration: 3000,
gravity: "top", // bisa "bottom"
position: "right", // bisa "left"
style: {
background: "linear-gradient(to right, #00b09b, #96c93d)", // hijau gradasi
color: "#fff",
}
}).showToast();
$("#col_add_file").html('');
colCount = 0; // reset counter
formCreate[0].reset();
index()
modalCreate.removeEventListener('hidden.bs.modal', handler);
};
modalCreate.addEventListener('hidden.bs.modal', handler);
bootstrap.Modal.getInstance(modalCreate).hide();
} else {
throw new Error(responseData.message || 'Terjadi kesalahan saat menyimpan data.');
}
}).catch(err => {
if (err.message) {
Swal.fire({
icon: 'error',
title: 'Gagal',
text: err.message
});
}
});
});

View File

@ -0,0 +1,45 @@
$(document).ready(function() {
$('.unit_kerja').select2();
$('.sub_unit_kerja').select2();
$('.klasifikasi_dok').select2();
$('.kategori_dok').select2();
});
let colCount = 1;
function addForm(){
let col = $("#col_add_file")
let html = '';
html += ` <div class="col mt-2 d-flex align-items-start gap-2" id="col-${colCount}">
<div class="col-md-6">
<label>File</label>
<input type="file" class="form-control" name="data[${colCount}][file]" placeholder="exp : Juknis" required>
</div>
<div class="col-md-5">
<label>Klasifikasi File</label>
<select class="form-select" name="data[${colCount}][klasifikasi]">
<option value="" disable >Select Choose</option>
${klasifikasiDok.map(kla => `
<option value="${kla?.master_klasifikasi_directory_id}">${kla?.nama_klasifikasi_directory}</option>
`).join('')}
</select>
</div>
<div class="col-md-1">
<button type="button" class="btn btn-danger mt-4 me-2" onclick="removeCol(${colCount})"><i class="fa-solid fa-trash"></i></button>
</div>
</div>
`
col.append(html)
colCount++;
}
function removeCol(count){
$(`#col-${count}`).remove()
}

View File

@ -0,0 +1,106 @@
function renderTree(units, katDok) {
if (!Array.isArray(units)) return '';
return `
<ul class="file-tree-ul">
${units.map(el => `
<li class="file-tree-li folder">
<span class="fw-bolder">📂 ${el.name}</span>
${Array.isArray(el.sub_unit_kerja) && el.sub_unit_kerja.length > 0 ? `
<ul class="file-tree-ul mt-1 ms-2">
${el.sub_unit_kerja.map(sub => `
<li class="file-tree-li folder">
<span class="fw-semibold">📂 ${sub.name}</span>
${Array.isArray(katDok) && katDok.length > 0 ? `
<ul class="file-tree-ul">
${katDok.map(kat => `
<li class="folder file-tree-li">
<span>📂 ${kat.nama_kategori_directory}</span>
<ul class="file-tree-ul">
${Array.isArray(sub.file_directory) && sub.file_directory.length > 0 ? `
${sub.file_directory.map(file => `
${kat.master_kategori_directory_id === file.master_kategori_directory_id ? `
<li class="file-tree-li ms-2">
📄 <a href="/file/${file.file}" target="_blank" rel="noopener noreferrer">${file.file}</a>
</li>
` : ''}
`).join('')}
` : ''}
<li class="file-tree-li ms-2">
<button class="add-file-btn btn btn-sm btn-primary ms-2 btn-transaparent"
onclick="addFile(this)"
data-id_unit_kerja="${el.id}"
data-nama_unit_kerja="${el.name || 'tidak_ada'}"
data-id_sub_unit_kerja="${sub?.id}"
data-nama_sub_unit_kerja="${sub?.name || 'tidak_ada'}"
data-id_kategori="${kat?.master_kategori_directory_id}"
data-nama_kategori="${kat?.nama_kategori_directory}">
Add File
</button>
</li>
</ul>
</li>
`).join('')}
</ul>
` : ''}
</li>
`).join('')}
</ul>
` : ''}
</li>
`).join('')}
</ul>
`;
}
function index() {
fetch('/data-unit-kerja')
.then(response => response.json())
.then(data => {
let file_tree = document.getElementById("file_tree");
file_tree.innerHTML = '';
if (Array.isArray(data?.data?.unitKerja)) {
file_tree.innerHTML = renderTree(data.data.unitKerja, data.data.katDok);
// Toggle buka/tutup folder
file_tree.querySelectorAll(".folder > span").forEach(span => {
span.addEventListener("click", () => {
let li = span.parentElement;
li.classList.toggle("collapsed");
// Ganti ikon 📂 <-> 📁
if (li.classList.contains("collapsed")) {
span.textContent = span.textContent.replace("📂", "📁");
} else {
span.textContent = span.textContent.replace("📁", "📂");
}
});
});
} else {
file_tree.innerHTML = '<p style="color:red">Terdapat kesalahan pada server</p>';
}
})
.catch(error => console.error('Error : ', error));
}
index();
function addFile(el){
let id_unit_kerja =$(el).data('id_unit_kerja')
let nama_unit_kerja =$(el).data('nama_unit_kerja')
let id_sub_unit_kerja =$(el).data('id_sub_unit_kerja')
let nama_sub_unit_kerja =$(el).data('nama_sub_unit_kerja')
let id_kategori =$(el).data('id_kategori')
let nama_kategori =$(el).data('nama_kategori')
$("#id_unit_kerja").val(id_unit_kerja)
$("#id_sub_unit_kerja").val(id_sub_unit_kerja)
$("#master_kategori_directory_id").val(id_kategori)
$("#confirm_location_file").html(`Unit Kerja : <b>${nama_unit_kerja}</b> / Sub Unit Kerja : <b>${nama_sub_unit_kerja}</b> / Kategori : <b>${nama_kategori}</b>`)
new bootstrap.Modal(modalCreate).show();
}

View File

@ -0,0 +1,58 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Login || RSAB Harapan Kita</title>
<link rel="icon" href="favicon.ico" type="image/x-icon">
<link rel="stylesheet" href="{{ ver('/assets/css/styles.min.css') }}" />
</head>
<body>
<!-- Body Wrapper -->
<div class="page-wrapper" id="main-wrapper" data-layout="vertical" data-navbarbg="skin6" data-sidebartype="full"
data-sidebar-position="fixed" data-header-position="fixed">
<div
class="position-relative overflow-hidden text-bg-light min-vh-100 d-flex align-items-center justify-content-center">
<div class="d-flex align-items-center justify-content-center w-100">
<div class="row justify-content-center w-100">
<div class="col-md-8 col-lg-6 col-xxl-3">
<div class="card mb-0">
<div class="card-body">
<a href="/login" class="text-nowrap logo-img text-center d-block py-3 w-100">
<img src="/logo/logo_rsabhk.png" alt="rsabhk" width="200">
</a>
<p class="text-center">File Directory - Rumah Sakit Harapan Kita</p>
<form method="post" action="/login">
@csrf
@if (session()->has('alertError'))
<div class="alert alert-danger fw-bold" role="alert">
Username atau password salah!
</div>
@endif
<div class="mb-3">
<label for="exampleInputEmail1" class="form-label">Username</label>
<input type="text" name="namauser" class="form-control" id="exampleInputEmail1" aria-describedby="emailHelp" required>
</div>
<div class="mb-4">
<label for="exampleInputPassword1" class="form-label">Password</label>
<input type="password" name="passcode" class="form-control" id="exampleInputPassword1" required>
</div>
<button type="submit" class="btn btn-primary w-100 py-8 fs-4 mb-4 rounded-2">Login</a>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script src="{{ ver('/assets/libs/jquery/dist/jquery.min.js') }}"></script>
<script src="{{ ver('/assets/libs/bootstrap/dist/js/bootstrap.bundle.min.js') }}"></script>
<!-- solar icons -->
<script src="https://cdn.jsdelivr.net/npm/iconify-icon@1.0.8/dist/iconify-icon.min.js"></script>
</body>
</html>

View File

@ -0,0 +1,118 @@
@extends('layout.main')
<style>
.file-tree-ul {
list-style: none;
padding-left: 20px;
position: relative;
}
/* Garis vertikal */
.file-tree-ul::before {
content: '';
position: absolute;
top: 0;
left: 10px;
bottom: 0;
border-left: 1px solid #ccc;
}
.file-tree-li {
margin: 4px 0;
padding-left: 20px;
position: relative;
}
/* Garis horizontal */
.file-tree-li::before {
content: '';
position: absolute;
top: 12px;
left: 0;
width: 20px;
border-top: 1px solid #ccc;
}
/* Hilangkan garis di root */
.file-tree-ul > .file-tree-li::before {
border-top: none;
}
.folder > span {
cursor: pointer;
user-select: none;
}
.collapsed > .file-tree-ul {
display: none;
}
.add-file-btn {
margin-left: 8px;
font-size: 12px;
color: blue;
cursor: pointer;
}
</style>
@section('body_main')
<div class="row">
<div class="col-md-12">
<div class="card w-100">
<div class="card-header d-flex justify-content-between align-items-center">
<h4 class="mb-0">Data</h4>
</div>
<div class="card-body p-3">
<div class="row mb-3 mt-3">
<div class="col-md-3">
<label for="exampleFormControlInput1" class="form-label">Unit Kerja</label>
<select class="unit_kerja form-control" id="unit_kerja">
<option value="" disable >Select Choose</option>
@foreach ($unitKerja as $unit)
<option value="{{ $unit->id }}">{{ $unit->name }}</option>
@endforeach
</select>
</div>
<div class="col-md-3">
<label for="exampleFormControlInput1" class="form-label">Sub Unit Kerja</label>
<select class="sub_unit_kerja form-control" id="sub_unit_kerja">
<option value="" disable >Select Choose</option>
@foreach ($subUnitKerja as $sub)
<option value="{{ $sub->id }}">{{ $sub->name }}</option>
@endforeach
</select>
</div>
<div class="col-md-2">
<label for="exampleFormControlInput1" class="form-label">Kategori Dok.</label>
<select class="kategori_dok form-control" id="kategori_dok">
<option value="" disable >Select Choose</option>
@foreach ($katDok as $kat)
<option value="{{ $kat->id }}">{{ $kat->nama_kategori_directory }}</option>
@endforeach
</select>
</div>
<div class="col-md-2">
<label for="exampleFormControlInput1" class="form-label">Klasifikasi Dok.</label>
<select class="klasifikasi_dok form-control" id="klasifikasi_dok">
<option value="" disable >Select Choose</option>
@foreach ($klasifikasiDok as $kla)
<option value="{{ $kla->id }}">{{ $kla->nama_klasifikasi_directory }}</option>
@endforeach
</select>
</div>
<div class="col-md-2">
<button type="button" class="btn btn-primary mt-3">Cari</button>
</div>
</div>
<div id="file_tree"></div>
</div>
</div>
</div>
</div>
@include('dashboard.modal.create')
<script>
const klasifikasiDok = @json($klasifikasiDok);
</script>
<script src="{{ ver('/js/dashboard/_init.js') }}"></script>
<script src="{{ ver('/js/dashboard/index.js') }}"></script>
<script src="{{ ver('/js/dashboard/functions.js') }}"></script>
<script src="{{ ver('/js/dashboard/action.js') }}"></script>
@endsection

View File

@ -0,0 +1,50 @@
<div class="modal fade" id="modalFileCreate" tabindex="-1" aria-hidden="true">
<div class="modal-dialog modal-lg modal-dialog-centered">
<div class="modal-content">
<!-- Modal Header -->
<div class="modal-header">
<h1 class="modal-title fs-5">Aksi <strong id="confirm_location_file"></strong></h1>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<!-- Modal Form -->
<form id="formFile" action="/upload" enctype="multipart/form-data" method="POST" >
@csrf
<div class="modal-body">
<div class="container" id="container_create">
<div class="row">
<div class="col-md-6">
<label>File</label>
<input type="file" class="form-control" name="data[0][file]" placeholder="exp : Juknis" required>
<input type="hidden" class="form-control" name="id_sub_unit_kerja" id="id_sub_unit_kerja" placeholder="exp : Juknis">
<input type="hidden" class="form-control" name="id_unit_kerja" id="id_unit_kerja" placeholder="exp : Juknis">
<input type="hidden" class="form-control" name="master_kategori_directory_id" id="master_kategori_directory_id" placeholder="exp : Juknis">
</div>
<div class="col-md-6">
<label>Klasifikasi File</label>
<select class="form-select" name="data[0][klasifikasi]" required>
<option value="" disable >Select Choose</option>
@foreach ($klasifikasiDok as $klasifikasi)
<option value="{{ $klasifikasi->master_klasifikasi_directory_id }}">{{ $klasifikasi->nama_klasifikasi_directory }}</option>
@endforeach
</select>
</div>
<div id="col_add_file"></div>
</div>
<button type="button" class="btn btn-outline-primary btn-sm mt-2" onclick="addForm()">
+ Tambah Form
</button>
</div>
</div>
<!-- Modal Footer -->
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Tutup</button>
<button type="submit" class="btn btn-primary">Simpan</button>
</div>
</form>
</div>
</div>
</div>

View File

@ -1,479 +0,0 @@
@extends('layout.main')
@section('body_main')
<div class="row">
<div class="col-lg-8">
<div class="card w-100">
<div class="card-body">
<div class="d-md-flex align-items-center">
<div>
<h4 class="card-title">Sales Overview</h4>
<p class="card-subtitle">
Ample admin Vs Pixel admin
</p>
</div>
<div class="ms-auto">
<ul class="list-unstyled mb-0">
<li class="list-inline-item text-primary">
<span class="round-8 text-bg-primary rounded-circle me-1 d-inline-block"></span>
Ample
</li>
<li class="list-inline-item text-info">
<span class="round-8 text-bg-info rounded-circle me-1 d-inline-block"></span>
Pixel Admin
</li>
</ul>
</div>
</div>
<div id="sales-overview" class="mt-4 mx-n6"></div>
</div>
</div>
</div>
<div class="col-lg-4">
<div class="card overflow-hidden">
<div class="card-body pb-0">
<div class="d-flex align-items-start">
<div>
<h4 class="card-title">Weekly Stats</h4>
<p class="card-subtitle">Average sales</p>
</div>
<div class="ms-auto">
<div class="dropdown">
<a href="javascript:void(0)" class="text-muted" id="year1-dropdown" data-bs-toggle="dropdown"
aria-expanded="false">
<i class="ti ti-dots fs-7"></i>
</a>
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="year1-dropdown">
<li>
<a class="dropdown-item" href="javascript:void(0)">Action</a>
</li>
<li>
<a class="dropdown-item" href="javascript:void(0)">Another action</a>
</li>
<li>
<a class="dropdown-item" href="javascript:void(0)">Something else here</a>
</li>
</ul>
</div>
</div>
</div>
<div class="mt-4 pb-3 d-flex align-items-center">
<span class="btn btn-primary rounded-circle round-48 hstack justify-content-center">
<i class="ti ti-shopping-cart fs-6"></i>
</span>
<div class="ms-3">
<h5 class="mb-0 fw-bolder fs-4">Top Sales</h5>
<span class="text-muted fs-3">Johnathan Doe</span>
</div>
<div class="ms-auto">
<span class="badge bg-secondary-subtle text-muted">+68%</span>
</div>
</div>
<div class="py-3 d-flex align-items-center">
<span class="btn btn-warning rounded-circle round-48 hstack justify-content-center">
<i class="ti ti-star fs-6"></i>
</span>
<div class="ms-3">
<h5 class="mb-0 fw-bolder fs-4">Best Seller</h5>
<span class="text-muted fs-3">MaterialPro Admin</span>
</div>
<div class="ms-auto">
<span class="badge bg-secondary-subtle text-muted">+68%</span>
</div>
</div>
<div class="py-3 d-flex align-items-center">
<span class="btn btn-success rounded-circle round-48 hstack justify-content-center">
<i class="ti ti-message-dots fs-6"></i>
</span>
<div class="ms-3">
<h5 class="mb-0 fw-bolder fs-4">Most Commented</h5>
<span class="text-muted fs-3">Ample Admin</span>
</div>
<div class="ms-auto">
<span class="badge bg-secondary-subtle text-muted">+68%</span>
</div>
</div>
<div class="pt-3 mb-7 d-flex align-items-center">
<span class="btn btn-secondary rounded-circle round-48 hstack justify-content-center">
<i class="ti ti-diamond fs-6"></i>
</span>
<div class="ms-3">
<h5 class="mb-0 fw-bolder fs-4">Top Budgets</h5>
<span class="text-muted fs-3">Sunil Joshi</span>
</div>
<div class="ms-auto">
<span class="badge bg-secondary-subtle text-muted">+15%</span>
</div>
</div>
</div>
</div>
</div>
<div class="col-12">
<div class="card">
<div class="card-body">
<div class="d-md-flex align-items-center">
<div>
<h4 class="card-title">Products Performance</h4>
<p class="card-subtitle">
Ample Admin Vs Pixel Admin
</p>
</div>
<div class="ms-auto mt-3 mt-md-0">
<select class="form-select theme-select border-0" aria-label="Default select example">
<option value="1">March 2025</option>
<option value="2">March 2025</option>
<option value="3">March 2025</option>
</select>
</div>
</div>
<div class="table-responsive mt-4">
<table class="table mb-0 text-nowrap varient-table align-middle fs-3">
<thead>
<tr>
<th scope="col" class="px-0 text-muted">
Assigned
</th>
<th scope="col" class="px-0 text-muted">Name</th>
<th scope="col" class="px-0 text-muted">
Priority
</th>
<th scope="col" class="px-0 text-muted text-end">
Budget
</th>
</tr>
</thead>
<tbody>
<tr>
<td class="px-0">
<div class="d-flex align-items-center">
<img src="./assets/images/profile/user-3.jpg" class="rounded-circle" width="40"
alt="flexy" />
<div class="ms-3">
<h6 class="mb-0 fw-bolder">Sunil Joshi</h6>
<span class="text-muted">Web Designer</span>
</div>
</div>
</td>
<td class="px-0">Elite Admin</td>
<td class="px-0">
<span class="badge bg-info">Low</span>
</td>
<td class="px-0 text-dark fw-medium text-end">
$3.9K
</td>
</tr>
<tr>
<td class="px-0">
<div class="d-flex align-items-center">
<img src="./assets/images/profile/user-5.jpg" class="rounded-circle" width="40"
alt="flexy" />
<div class="ms-3">
<h6 class="mb-0 fw-bolder">
Andrew McDownland
</h6>
<span class="text-muted">Project Manager</span>
</div>
</div>
</td>
<td class="px-0">Real Homes WP Theme</td>
<td class="px-0">
<span class="badge text-bg-primary">Medium</span>
</td>
<td class="px-0 text-dark fw-medium text-end">
$24.5K
</td>
</tr>
<tr>
<td class="px-0">
<div class="d-flex align-items-center">
<img src="./assets/images/profile/user-6.jpg" class="rounded-circle" width="40"
alt="flexy" />
<div class="ms-3">
<h6 class="mb-0 fw-bolder">
Christopher Jamil
</h6>
<span class="text-muted">SEO Manager</span>
</div>
</div>
</td>
<td class="px-0">MedicalPro WP Theme</td>
<td class="px-0">
<span class="badge bg-warning">Hight</span>
</td>
<td class="px-0 text-dark fw-medium text-end">
$12.8K
</td>
</tr>
<tr>
<td class="px-0">
<div class="d-flex align-items-center">
<img src="./assets/images/profile/user-7.jpg" class="rounded-circle" width="40"
alt="flexy" />
<div class="ms-3">
<h6 class="mb-0 fw-bolder">Nirav Joshi</h6>
<span class="text-muted">Frontend Engineer</span>
</div>
</div>
</td>
<td class="px-0">Hosting Press HTML</td>
<td class="px-0">
<span class="badge bg-danger">Low</span>
</td>
<td class="px-0 text-dark fw-medium text-end">
$2.4K
</td>
</tr>
<tr>
<td class="px-0">
<div class="d-flex align-items-center">
<img src="./assets/images/profile/user-8.jpg" class="rounded-circle" width="40"
alt="flexy" />
<div class="ms-3">
<h6 class="mb-0 fw-bolder">Micheal Doe</h6>
<span class="text-muted">Content Writer</span>
</div>
</div>
</td>
<td class="px-0">Helping Hands WP Theme</td>
<td class="px-0">
<span class="badge bg-success">Low</span>
</td>
<td class="px-0 text-dark fw-medium text-end">
$9.3K
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<div class="col-lg-6">
<!-- Card -->
<div class="card">
<div class="card-body">
<h4 class="card-title mb-0">Recent Comments</h4>
</div>
<div class="comment-widgets scrollable mb-2 common-widget" style="height: 465px" data-simplebar="">
<!-- Comment Row -->
<div class="d-flex flex-row comment-row border-bottom p-3 gap-3">
<div>
<span><img src="./assets/images/profile/user-3.jpg" class="rounded-circle" alt="user"
width="50" /></span>
</div>
<div class="comment-text w-100">
<h6 class="fw-medium">James Anderson</h6>
<p class="mb-1 fs-2 text-muted">
Lorem Ipsum is simply dummy text of the printing and
type etting industry
</p>
<div class="comment-footer mt-2">
<div class="d-flex align-items-center">
<span class="
badge
bg-info-subtle
text-info
">Pending</span>
<span class="action-icons">
<a href="javascript:void(0)" class="ps-3"><i class="ti ti-edit fs-5"></i></a>
<a href="javascript:void(0)" class="ps-3"><i class="ti ti-check fs-5"></i></a>
<a href="javascript:void(0)" class="ps-3"><i class="ti ti-heart fs-5"></i></a>
</span>
</div>
<span class="
text-muted
ms-auto
fw-normal
fs-2
d-block
mt-2
text-end
">April 14, 2025</span>
</div>
</div>
</div>
<!-- Comment Row -->
<div class="d-flex flex-row comment-row border-bottom active p-3 gap-3">
<div>
<span><img src="./assets/images/profile/user-5.jpg" class="rounded-circle" alt="user"
width="50" /></span>
</div>
<div class="comment-text active w-100">
<h6 class="fw-medium">Michael Jorden</h6>
<p class="mb-1 fs-2 text-muted">
Lorem Ipsum is simply dummy text of the printing and
type setting industry.
</p>
<div class="comment-footer mt-2">
<div class="d-flex align-items-center">
<span class="
badge
bg-success-subtle
text-success
">Approved</span>
<span class="action-icons active">
<a href="javascript:void(0)" class="ps-3"><i class="ti ti-edit fs-5"></i></a>
<a href="javascript:void(0)" class="ps-3"><i class="ti ti-circle-x fs-5"></i></a>
<a href="javascript:void(0)" class="ps-3"><i class="ti ti-heart text-danger fs-5"></i></a>
</span>
</div>
<span class="
text-muted
ms-auto
fw-normal
fs-2
text-end
mt-2
d-block
">April 14, 2025</span>
</div>
</div>
</div>
<!-- Comment Row -->
<div class="d-flex flex-row comment-row border-bottom p-3 gap-3">
<div>
<span><img src="./assets/images/profile/user-6.jpg" class="rounded-circle" alt="user"
width="50" /></span>
</div>
<div class="comment-text w-100">
<h6 class="fw-medium">Johnathan Doeting</h6>
<p class="mb-1 fs-2 text-muted">
Lorem Ipsum is simply dummy text of the printing and
type setting industry.
</p>
<div class="comment-footer mt-2">
<div class="d-flex align-items-center">
<span class="
badge
bg-danger-subtle
text-danger
">Rejected</span>
<span class="action-icons">
<a href="javascript:void(0)" class="ps-3"><i class="ti ti-edit fs-5"></i></a>
<a href="javascript:void(0)" class="ps-3"><i class="ti ti-check fs-5"></i></a>
<a href="javascript:void(0)" class="ps-3"><i class="ti ti-heart fs-5"></i></a>
</span>
</div>
<span class="
text-muted
ms-auto
fw-normal
fs-2
d-block
mt-2
text-end
">April 14, 2025</span>
</div>
</div>
</div>
<!-- Comment Row -->
<div class="d-flex flex-row comment-row p-3 gap-3">
<div>
<span><img src="./assets/images/profile/user-4.jpg" class="rounded-circle" alt="user"
width="50" /></span>
</div>
<div class="comment-text w-100">
<h6 class="fw-medium">James Anderson</h6>
<p class="mb-1 fs-2 text-muted">
Lorem Ipsum is simply dummy text of the printing and
type setting industry.
</p>
<div class="comment-footer mt-2">
<div class="d-flex align-items-center">
<span class="
badge
bg-info-subtle
text-info
">Pending</span>
<span class="action-icons">
<a href="javascript:void(0)" class="ps-3"><i class="ti ti-edit fs-5"></i></a>
<a href="javascript:void(0)" class="ps-3"><i class="ti ti-check fs-5"></i></a>
<a href="javascript:void(0)" class="ps-3"><i class="ti ti-heart fs-5"></i></a>
</span>
</div>
<span class="
text-muted
ms-auto
fw-normal
fs-2
d-block
text-end
mt-2
">April 14, 2025</span>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="col-lg-6">
<div class="card">
<div class="card-body">
<div class="d-flex align-items-center">
<h4 class="card-title mb-0">Weather Report</h4>
<select class="form-select w-auto ms-auto">
<option selected="">Today</option>
<option value="1">Weekly</option>
</select>
</div>
<div class="d-flex align-items-center flex-row mt-4">
<div class="p-2 display-5 text-primary">
<i class="ti ti-cloud-snow"></i>
<span>73<sup>°</sup></span>
</div>
<div class="p-2">
<h3 class="mb-0">Saturday</h3>
<small>Ahmedabad, India</small>
</div>
</div>
<table class="table table-borderless">
<tbody>
<tr>
<td>Wind</td>
<td class="fw-medium">ESE 17 mph</td>
</tr>
<tr>
<td>Humidity</td>
<td class="fw-medium">83%</td>
</tr>
<tr>
<td>Pressure</td>
<td class="fw-medium">28.56 in</td>
</tr>
<tr>
<td>Cloud Cover</td>
<td class="fw-medium">78%</td>
</tr>
<tr>
<td>Ceiling</td>
<td class="fw-medium">25760 ft</td>
</tr>
</tbody>
</table>
<hr />
<ul class="list-unstyled row text-center city-weather-days mb-0">
<li class="col">
<i class="ti ti-sun-high fs-4"></i><span>09:30</span>
<h3 class="mb-0 fs-6 lh-base">70<sup>°</sup></h3>
</li>
<li class="col">
<i class="ti ti-cloud fs-4"></i><span>11:30</span>
<h3 class="mb-0 fs-6 lh-base">72<sup>°</sup></h3>
</li>
<li class="col">
<i class="ti ti-cloud-rain fs-4"></i><span>13:30</span>
<h3 class="mb-0 fs-6 lh-base">75<sup>°</sup></h3>
</li>
<li class="col">
<i class="ti ti-cloud-snow fs-4"></i><span>15:30</span>
<h3 class="mb-0 fs-6 lh-base">76<sup>°</sup></h3>
</li>
</ul>
</div>
</div>
</div>
</div>
@endsection

View File

@ -12,10 +12,14 @@
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-table@1.24.1/dist/bootstrap-table.min.css">
<link rel="stylesheet" type="text/css" href="https://cdn.jsdelivr.net/npm/toastify-js/src/toastify.min.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/7.0.1/css/all.min.css" integrity="sha512-2SwdPD6INVrV/lHTZbO2nodKhrnDdJK9/kg2XD1r9uGqPo1cUbujc+IYdlYdEErWNu69gVcYgdxlmVmzTWnetw==" crossorigin="anonymous" referrerpolicy="no-referrer" />
<link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css" rel="stylesheet" />
<script src="{{ ver('/assets/libs/jquery/dist/jquery.min.js') }}"></script>
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
<script src="https://cdn.jsdelivr.net/npm/bootstrap-table@1.24.1/dist/bootstrap-table.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/7.0.1/js/all.min.js" integrity="sha512-6BTOlkauINO65nLhXhthZMtepgJSghyimIalb+crKRPhvhmsCdnIuGcVbR5/aQY2A+260iC1OPy1oCdB6pSSwQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/toastify-js"></script>
</head>
<body>

View File

@ -35,17 +35,12 @@
<div class="message-body">
<a href="javascript:void(0)" class="d-flex align-items-center gap-2 dropdown-item">
<i class="ti ti-user fs-6"></i>
<p class="mb-0 fs-3">My Profile</p>
<p class="mb-0 fs-3">{{ auth()->user()->namauser }}</p>
</a>
<a href="javascript:void(0)" class="d-flex align-items-center gap-2 dropdown-item">
<i class="ti ti-mail fs-6"></i>
<p class="mb-0 fs-3">My Account</p>
</a>
<a href="javascript:void(0)" class="d-flex align-items-center gap-2 dropdown-item">
<i class="ti ti-list-check fs-6"></i>
<p class="mb-0 fs-3">My Task</p>
</a>
<a href="./authentication-login.html" class="btn btn-outline-primary mx-3 mt-2 d-block">Logout</a>
<form action="/logout" method="POST">
@csrf
<button type="submit" class="btn btn-outline-primary mx-3 mt-2 d-block">Logout</button>
</form>
</div>
</div>
</li>

View File

@ -1,14 +1,23 @@
<?php
use App\Http\Controllers\AuthController;
use App\Http\Controllers\DashboardController;
use App\Http\Controllers\MasterKategoriController;
use App\Http\Controllers\MasterKlasifikasiController;
use Illuminate\Support\Facades\Route;
Route::get('/', function () {
return view('index');
Route::middleware(['auth'])->group(function(){
Route::get('/', [DashboardController::class, 'index']);
Route::post('/upload', [DashboardController::class, 'store']);
Route::get('/data-unit-kerja', [DashboardController::class, 'dataUnitKerja']);
Route::resource('/master-kategori', MasterKategoriController::class);
Route::get('datatable/master-kategori', [MasterKategoriController::class, 'datatable']);
Route::resource('/master-klasifikasi', MasterKlasifikasiController::class);
Route::get('datatable/master-klasifikasi', [MasterKlasifikasiController::class, 'datatable']);
});
Route::resource('/master-kategori', MasterKategoriController::class);
Route::get('datatable/master-kategori', [MasterKategoriController::class, 'datatable']);
Route::resource('/master-klasifikasi', MasterKlasifikasiController::class);
Route::get('datatable/master-klasifikasi', [MasterKlasifikasiController::class, 'datatable']);
Route::get('/login', [AuthController::class, 'index'])->name('login');
Route::post('/login', [AuthController::class, 'login']);
Route::post('/logout', [AuthController::class, 'logout']);