diff --git a/app/Http/Controllers/AuthController.php b/app/Http/Controllers/AuthController.php new file mode 100644 index 0000000..1e6530a --- /dev/null +++ b/app/Http/Controllers/AuthController.php @@ -0,0 +1,31 @@ +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'); + } +} diff --git a/app/Http/Controllers/DashboardController.php b/app/Http/Controllers/DashboardController.php new file mode 100644 index 0000000..d55c3ad --- /dev/null +++ b/app/Http/Controllers/DashboardController.php @@ -0,0 +1,80 @@ +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); + } + } +} diff --git a/app/Http/Controllers/MasterKlasifikasiController.php b/app/Http/Controllers/MasterKlasifikasiController.php index 8715273..18be23b 100644 --- a/app/Http/Controllers/MasterKlasifikasiController.php +++ b/app/Http/Controllers/MasterKlasifikasiController.php @@ -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); } diff --git a/app/Models/FileDirectory.php b/app/Models/FileDirectory.php new file mode 100644 index 0000000..fae2585 --- /dev/null +++ b/app/Models/FileDirectory.php @@ -0,0 +1,14 @@ +hasMany(FileDirectory::class, 'id_sub_unit_kerja', 'id')->where('statusenabled', true); + } +} diff --git a/app/Models/UnitKerja.php b/app/Models/UnitKerja.php new file mode 100644 index 0000000..3019e71 --- /dev/null +++ b/app/Models/UnitKerja.php @@ -0,0 +1,20 @@ +hasMany(SubUnitKerja::class, 'objectunitkerjapegawaifk', 'id')->where('statusenabled', true)->select('id', 'objectunitkerjapegawaifk', 'name'); + } + +} diff --git a/app/Models/User.php b/app/Models/User.php index 749c7b7..973a47c 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -17,10 +17,12 @@ class User extends Authenticatable * * @var list */ - 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 */ 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', ]; } } diff --git a/config/filesystems.php b/config/filesystems.php index 3d671bd..55fe1c6 100644 --- a/config/filesystems.php +++ b/config/filesystems.php @@ -60,6 +60,13 @@ return [ 'report' => false, ], + 'file_directory' => [ + 'driver' => 'local', + 'root' => public_path('file') . '/', + 'url' => env('APP_URL') . '/', + 'visibility' => 'public', + ], + ], /* diff --git a/public/file/CATERING RSAB HK.png b/public/file/CATERING RSAB HK.png new file mode 100644 index 0000000..49e73ab Binary files /dev/null and b/public/file/CATERING RSAB HK.png differ diff --git a/public/file/Rumah Jooocode.png b/public/file/Rumah Jooocode.png new file mode 100644 index 0000000..b49db23 Binary files /dev/null and b/public/file/Rumah Jooocode.png differ diff --git a/public/file/WhatsApp Image 2025-09-02 at 11.19.09_2f299a7b.jpg b/public/file/WhatsApp Image 2025-09-02 at 11.19.09_2f299a7b.jpg new file mode 100644 index 0000000..99aec94 Binary files /dev/null and b/public/file/WhatsApp Image 2025-09-02 at 11.19.09_2f299a7b.jpg differ diff --git a/public/file/WhatsApp Image 2025-09-02 at 13.53.14_88d2e96e.jpg b/public/file/WhatsApp Image 2025-09-02 at 13.53.14_88d2e96e.jpg new file mode 100644 index 0000000..9c6c511 Binary files /dev/null and b/public/file/WhatsApp Image 2025-09-02 at 13.53.14_88d2e96e.jpg differ diff --git a/public/file/WhatsApp Image 2025-09-03 at 08.52.46_5778b407.jpg b/public/file/WhatsApp Image 2025-09-03 at 08.52.46_5778b407.jpg new file mode 100644 index 0000000..e6f004d Binary files /dev/null and b/public/file/WhatsApp Image 2025-09-03 at 08.52.46_5778b407.jpg differ diff --git a/public/file/default.png b/public/file/default.png new file mode 100644 index 0000000..a4f6704 Binary files /dev/null and b/public/file/default.png differ diff --git a/public/js/dashboard/_init.js b/public/js/dashboard/_init.js new file mode 100644 index 0000000..e45243d --- /dev/null +++ b/public/js/dashboard/_init.js @@ -0,0 +1,2 @@ +const modalCreate = document.getElementById('modalFileCreate') +const formCreate = $("#formFile") diff --git a/public/js/dashboard/action.js b/public/js/dashboard/action.js new file mode 100644 index 0000000..3b98a06 --- /dev/null +++ b/public/js/dashboard/action.js @@ -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 + }); + } + }); +}); diff --git a/public/js/dashboard/functions.js b/public/js/dashboard/functions.js new file mode 100644 index 0000000..a588b41 --- /dev/null +++ b/public/js/dashboard/functions.js @@ -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 += `
+
+ + +
+
+ + +
+
+ +
+
+ + + ` + col.append(html) + colCount++; + +} + + +function removeCol(count){ + $(`#col-${count}`).remove() +} + diff --git a/public/js/dashboard/index.js b/public/js/dashboard/index.js new file mode 100644 index 0000000..1af8b7b --- /dev/null +++ b/public/js/dashboard/index.js @@ -0,0 +1,106 @@ +function renderTree(units, katDok) { + if (!Array.isArray(units)) return ''; + + return ` + + `; +} + +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 = '

Terdapat kesalahan pada server

'; + } + }) + .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 : ${nama_unit_kerja} / Sub Unit Kerja : ${nama_sub_unit_kerja} / Kategori : ${nama_kategori}`) + new bootstrap.Modal(modalCreate).show(); + + +} diff --git a/resources/views/auth/index.blade.php b/resources/views/auth/index.blade.php new file mode 100644 index 0000000..98b4edf --- /dev/null +++ b/resources/views/auth/index.blade.php @@ -0,0 +1,58 @@ + + + + + + + Login || RSAB Harapan Kita + + + + + + +
+
+
+
+
+
+
+ + rsabhk + +

File Directory - Rumah Sakit Harapan Kita

+
+ @csrf + @if (session()->has('alertError')) + + @endif +
+ + +
+
+ + +
+ +
+
+
+
+
+
+
+ + + + + + + diff --git a/resources/views/dashboard/index.blade.php b/resources/views/dashboard/index.blade.php new file mode 100644 index 0000000..33e1040 --- /dev/null +++ b/resources/views/dashboard/index.blade.php @@ -0,0 +1,118 @@ +@extends('layout.main') + +@section('body_main') +
+
+
+
+

Data

+
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+
+
+
+
+
+@include('dashboard.modal.create') + + + + + +@endsection diff --git a/resources/views/dashboard/modal/create.blade.php b/resources/views/dashboard/modal/create.blade.php new file mode 100644 index 0000000..10c72f8 --- /dev/null +++ b/resources/views/dashboard/modal/create.blade.php @@ -0,0 +1,50 @@ + diff --git a/resources/views/index.blade.php b/resources/views/index.blade.php deleted file mode 100644 index f832d41..0000000 --- a/resources/views/index.blade.php +++ /dev/null @@ -1,479 +0,0 @@ -@extends('layout.main') -@section('body_main') -
-
-
-
-
-
-

Sales Overview

-

- Ample admin Vs Pixel admin -

-
-
-
    -
  • - - Ample -
  • -
  • - - Pixel Admin -
  • -
-
-
-
-
-
-
-
-
-
-
-
-

Weekly Stats

-

Average sales

-
-
- -
-
-
- - - -
-
Top Sales
- Johnathan Doe -
-
- +68% -
-
-
- - - -
-
Best Seller
- MaterialPro Admin -
-
- +68% -
-
-
- - - -
-
Most Commented
- Ample Admin -
-
- +68% -
-
-
- - - -
-
Top Budgets
- Sunil Joshi -
-
- +15% -
-
-
-
-
-
-
-
-
-
-

Products Performance

-

- Ample Admin Vs Pixel Admin -

-
-
- -
-
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- Assigned - Name - Priority - - Budget -
-
- flexy -
-
Sunil Joshi
- Web Designer -
-
-
Elite Admin - Low - - $3.9K -
-
- flexy -
-
- Andrew McDownland -
- Project Manager -
-
-
Real Homes WP Theme - Medium - - $24.5K -
-
- flexy -
-
- Christopher Jamil -
- SEO Manager -
-
-
MedicalPro WP Theme - Hight - - $12.8K -
-
- flexy -
-
Nirav Joshi
- Frontend Engineer -
-
-
Hosting Press HTML - Low - - $2.4K -
-
- flexy -
-
Micheal Doe
- Content Writer -
-
-
Helping Hands WP Theme - Low - - $9.3K -
-
-
-
-
-
- -
-
-

Recent Comments

-
-
- -
-
- user -
-
-
James Anderson
-

- Lorem Ipsum is simply dummy text of the printing and - type etting industry -

- -
-
- -
-
- user -
-
-
Michael Jorden
-

- Lorem Ipsum is simply dummy text of the printing and - type setting industry. -

- -
-
- -
-
- user -
-
-
Johnathan Doeting
-

- Lorem Ipsum is simply dummy text of the printing and - type setting industry. -

- -
-
- -
-
- user -
-
-
James Anderson
-

- Lorem Ipsum is simply dummy text of the printing and - type setting industry. -

- -
-
-
-
-
-
-
-
-
-

Weather Report

- -
-
-
- - 73° -
-
-

Saturday

- Ahmedabad, India -
-
- - - - - - - - - - - - - - - - - - - - - - - -
WindESE 17 mph
Humidity83%
Pressure28.56 in
Cloud Cover78%
Ceiling25760 ft
-
-
    -
  • - 09:30 -

    70°

    -
  • -
  • - 11:30 -

    72°

    -
  • -
  • - 13:30 -

    75°

    -
  • -
  • - 15:30 -

    76°

    -
  • -
-
-
-
-
-@endsection diff --git a/resources/views/layout/main.blade.php b/resources/views/layout/main.blade.php index e124720..f937d82 100644 --- a/resources/views/layout/main.blade.php +++ b/resources/views/layout/main.blade.php @@ -12,10 +12,14 @@ + + + + diff --git a/resources/views/layout/partials/topnav.blade.php b/resources/views/layout/partials/topnav.blade.php index 0dcad15..fc06934 100644 --- a/resources/views/layout/partials/topnav.blade.php +++ b/resources/views/layout/partials/topnav.blade.php @@ -35,17 +35,12 @@ diff --git a/routes/web.php b/routes/web.php index 0985cd2..cd4667c 100644 --- a/routes/web.php +++ b/routes/web.php @@ -1,14 +1,23 @@ 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']);