From 8220466f03237b320744c741fb79d62f2ac823ee Mon Sep 17 00:00:00 2001 From: majid Date: Mon, 7 Jul 2025 17:27:49 +0700 Subject: [PATCH] feat(daftar-pustaka) : tambah daftar pustaka dan categori pustaka, lihat detail, tambah, edit --- .../CategoryDaftarPustakaController.php | 152 +++++++++ .../Controllers/DaftarPustakaController.php | 129 ++++++++ .../Requests/CategoryDaftarPustakaRequest.php | 33 ++ app/Http/Requests/DaftarPustakaRequest.php | 38 +++ app/Models/CategoryDaftarPustaka.php | 27 ++ app/Models/DaftarPustaka.php | 29 ++ app/Services/DaftarPustakaService.php | 94 ++++++ ...6_create_category_daftar_pustaka_table.php | 35 ++ ..._07_025337_create_daftar_pustaka_table.php | 38 +++ module.json | 28 ++ .../category-daftar-pustaka/create.blade.php | 64 ++++ .../category-daftar-pustaka/index.blade.php | 147 +++++++++ .../views/daftar-pustaka/create.blade.php | 113 +++++++ .../views/daftar-pustaka/index.blade.php | 307 ++++++++++++++++++ resources/views/daftar-pustaka/show.blade.php | 71 ++++ routes/web.php | 13 + 16 files changed, 1318 insertions(+) create mode 100644 app/Http/Controllers/CategoryDaftarPustakaController.php create mode 100644 app/Http/Controllers/DaftarPustakaController.php create mode 100644 app/Http/Requests/CategoryDaftarPustakaRequest.php create mode 100644 app/Http/Requests/DaftarPustakaRequest.php create mode 100644 app/Models/CategoryDaftarPustaka.php create mode 100644 app/Models/DaftarPustaka.php create mode 100644 app/Services/DaftarPustakaService.php create mode 100644 database/migrations/2025_07_07_025336_create_category_daftar_pustaka_table.php create mode 100644 database/migrations/2025_07_07_025337_create_daftar_pustaka_table.php create mode 100644 resources/views/category-daftar-pustaka/create.blade.php create mode 100644 resources/views/category-daftar-pustaka/index.blade.php create mode 100644 resources/views/daftar-pustaka/create.blade.php create mode 100644 resources/views/daftar-pustaka/index.blade.php create mode 100644 resources/views/daftar-pustaka/show.blade.php diff --git a/app/Http/Controllers/CategoryDaftarPustakaController.php b/app/Http/Controllers/CategoryDaftarPustakaController.php new file mode 100644 index 0000000..f1478e6 --- /dev/null +++ b/app/Http/Controllers/CategoryDaftarPustakaController.php @@ -0,0 +1,152 @@ +validated(); + if ($validated) { + try { + CategoryDaftarPustaka::create($validated); + return redirect()->route('category-daftar-pustaka.index')->with('success', 'Data Berhasil Disimpan'); + } catch (\Throwable $th) { + return redirect()->route('category-daftar-pustaka.index')->with('error', $th->getMessage()); + } + } + + } + + /** + * Show the specified resource. + */ + public function show($id) + { + $category = CategoryDaftarPustaka::where('id', $id)->first(); + return view('lpj::category-daftar-pustaka.show', compact('category')); + } + + /** + * Show the form for editing the specified resource. + */ + public function edit($id) + { + return view('lpj::category-daftar-pustaka.create', ['category' => CategoryDaftarPustaka::where('id', $id)->first()]); + } + + /** + * Update the specified resource in storage. + */ + public function update(CategoryDaftarPustakaRequest $request, $id) + { + $validated = $request->validated(); + if ($validated) { + try { + CategoryDaftarPustaka::where('id', $id)->update($validated); + return redirect()->route('category-daftar-pustaka.index')->with('success', 'Data Berhasil Disimpan'); + } catch (\Throwable $th) { + return redirect()->route('category-daftar-pustaka.index')->with('error', $th->getMessage()); + } + } + } + + /** + * Remove the specified resource from storage. + */ + public function destroy($id) + { + try { + CategoryDaftarPustaka::where('id', $id)->delete(); + return response()->json(['success' => true, 'message' => 'Data Berhasil Dihapus']); + } catch (\Throwable $th) { + return response()->json(['success' => false, 'message' => $th->getMessage()]); + } + } + + public function dataForDatatables(Request $request) + { + if (is_null($this->user) || !$this->user->can('jenis_aset.view')) { + //abort(403, 'Sorry! You are not allowed to view users.'); + } + + // Retrieve data from the database + $query = CategoryDaftarPustaka::query(); + + // Apply search filter if provided + if ($request->has('search') && !empty($request->get('search'))) { + $search = $request->get('search'); + $query->where(function ($q) use ($search) { + $q->where('code', 'LIKE', "%$search%"); + $q->orWhere('name', 'LIKE', "%$search%"); + }); + } + + // Apply sorting if provided + if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) { + $order = $request->get('sortOrder'); + $column = $request->get('sortField'); + $query->orderBy($column, $order); + } + + // Get the total count of records + $totalRecords = $query->count(); + + // Apply pagination if provided + if ($request->has('page') && $request->has('size')) { + $page = $request->get('page'); + $size = $request->get('size'); + $offset = ($page - 1) * $size; // Calculate the offset + + $query->skip($offset)->take($size); + } + + // Get the filtered count of records + $filteredRecords = $query->count(); + + // Get the data for the current page + $data = $query->get(); + + // Calculate the page count + $pageCount = ceil($totalRecords / $request->get('size')); + + // Calculate the current page number + $currentPage = 0 + 1; + + // Return the response data as a JSON object + return response()->json([ + 'draw' => $request->get('draw'), + 'recordsTotal' => $totalRecords, + 'recordsFiltered' => $filteredRecords, + 'pageCount' => $pageCount, + 'page' => $currentPage, + 'totalCount' => $totalRecords, + 'data' => $data, + ]); + } +} diff --git a/app/Http/Controllers/DaftarPustakaController.php b/app/Http/Controllers/DaftarPustakaController.php new file mode 100644 index 0000000..2241607 --- /dev/null +++ b/app/Http/Controllers/DaftarPustakaController.php @@ -0,0 +1,129 @@ +daftarPustaka = app(DaftarPustakaService::class); + } + + /** + * Display a listing of the resource. + */ + public function index(Request $request) +{ + $categories = CategoryDaftarPustaka::all(); + $daftar_pustaka = $this->daftarPustaka->getAllDaftarPustaka($request); + + return view('lpj::daftar-pustaka.index', [ + 'categories' => $categories, + 'daftar_pustaka' => $daftar_pustaka, + 'page' => $daftar_pustaka->currentPage(), + 'pageCount' => $daftar_pustaka->lastPage(), + 'limit' => $daftar_pustaka->perPage(), + 'total' => $daftar_pustaka->total(), + ]); +} + + + /** + * Show the form for creating a new resource. + */ + public function create() + { + $categories = CategoryDaftarPustaka::all(); + // dd($categories); + return view('lpj::daftar-pustaka.create', compact('categories')); + } + + /** + * Store a newly created resource in storage. + */ + public function store(DaftarPustakaRequest $request) + { + + $validate = $request->validated(); + // dd($validate); + $file = $request->file('attachment'); + if ($validate) { + try { + // Save to database + $this->daftarPustaka->storeDaftarPustaka($validate, $file); + return redirect() + ->route('daftar-pustaka.index') + ->with('success', 'Daftar Pustaka created successfully'); + } catch (Exception $e) { + return redirect() + ->route('daftar-pustaka.create') + ->with('error', 'Failed to create daftar pustaka'); + } + } + + } + + /** + * Show the specified resource. + */ + public function show($id) + { + $daftarPustaka = $this->daftarPustaka->getDaftarPustakaById($id); + $categories = CategoryDaftarPustaka::all(); + + return view('lpj::daftar-pustaka.show', compact('daftarPustaka', 'categories')); + } + + /** + * Show the form for editing the specified resource. + */ + public function edit($id) + { + $daftarPustaka = $this->daftarPustaka->getDaftarPustakaById($id); + $categories = CategoryDaftarPustaka::all(); + return view('lpj::daftar-pustaka.create', compact('daftarPustaka', 'categories')); + } + + /** + * Update the specified resource in storage. + */ + public function update(DaftarPustakaRequest $request, $id) + { + $validate = $request->validated(); + if ($validate) { + try { + // Save to database + $file = $request->file('attachment'); + $this->daftarPustaka->updateDaftarPustaka($validate, $file, $id); + return redirect() + ->route('daftar-pustaka.index') + ->with('success', 'Daftar Pustaka updated successfully'); + } catch (Exception $e) { + return redirect() + ->route('daftar-pustaka.create') + ->with('error', 'Failed to update daftar pustaka'); + } + } + } + + /** + * Remove the specified resource from storage. + */ + public function destroy($id) + { + try { + $this->daftarPustaka->deleteDaftarPustaka($id); + return response()->json(['success' => true, 'message' => 'Daftar Pustaka deleted successfully']); + } catch (Exception $e) { + return response()->json(['success' => false, 'message' => 'Failed to delete daftar pustaka']); + } + } +} diff --git a/app/Http/Requests/CategoryDaftarPustakaRequest.php b/app/Http/Requests/CategoryDaftarPustakaRequest.php new file mode 100644 index 0000000..0907835 --- /dev/null +++ b/app/Http/Requests/CategoryDaftarPustakaRequest.php @@ -0,0 +1,33 @@ + 'required|max:255', + ]; + + if ($this->method() == 'PUT') { + $rules['code'] = 'required|max:50|unique:category_daftar_pustaka,code,' . $this->id; + } else { + $rules['code'] = 'required|max:50|unique:category_daftar_pustaka,code'; + } + return $rules; + } + + /** + * Determine if the user is authorized to make this request. + */ + public function authorize(): bool + { + return true; + } +} diff --git a/app/Http/Requests/DaftarPustakaRequest.php b/app/Http/Requests/DaftarPustakaRequest.php new file mode 100644 index 0000000..285da48 --- /dev/null +++ b/app/Http/Requests/DaftarPustakaRequest.php @@ -0,0 +1,38 @@ + 'required|max:255', + 'category_id' => 'required', + 'deskripsi' => 'nullable', + ]; + + if ($this->method() == 'PUT') { + $rules['attachment'] = 'nullable|mimes:pdf,jpg,jpeg,png,gif'; + } else { + $rules['attachment'] = 'required|mimes:pdf,jpg,jpeg,png,gif'; + } + + return $rules; + + } + + /** + * Determine if the user is authorized to make this request. + */ + public function authorize(): bool + { + return true; + } +} diff --git a/app/Models/CategoryDaftarPustaka.php b/app/Models/CategoryDaftarPustaka.php new file mode 100644 index 0000000..7101f18 --- /dev/null +++ b/app/Models/CategoryDaftarPustaka.php @@ -0,0 +1,27 @@ +hasMany(DaftarPustaka::class); + } + +} diff --git a/app/Models/DaftarPustaka.php b/app/Models/DaftarPustaka.php new file mode 100644 index 0000000..688b08c --- /dev/null +++ b/app/Models/DaftarPustaka.php @@ -0,0 +1,29 @@ +belongsTo(CategoryDaftarPustaka::class); + } +} diff --git a/app/Services/DaftarPustakaService.php b/app/Services/DaftarPustakaService.php new file mode 100644 index 0000000..0d18e35 --- /dev/null +++ b/app/Services/DaftarPustakaService.php @@ -0,0 +1,94 @@ +handleUpload($file); + } + return DaftarPustaka::create($data); + } + + public function updateDaftarPustaka($data, $file, $id) + { + // Ambil data inputan yang diperlukan saja + + $daftarPustaka = DaftarPustaka::findOrFail($id); + + // Jika ada file baru yang diupload + if ($file) { + // (Opsional) Hapus file lama + if ($daftarPustaka->attachment && file_exists(public_path($daftarPustaka->attachment))) { + unlink(public_path($daftarPustaka->attachment)); + } + + // Upload file baru + $data['attachment'] = $this->handleUpload($file); + } + + // Update data + $daftarPustaka->update($data); + + return $daftarPustaka; + } + + + public function deleteDaftarPustaka($id) + { + return DaftarPustaka::where('id', $id)->delete(); + } + + public function getDaftarPustakaById($id) + { + return DaftarPustaka::where('id', $id)->first(); + } + + // get all with pagination + public function getAllDaftarPustaka($request) +{ + $query = DaftarPustaka::query(); + + // Filter pencarian + if (!empty($request->get('search'))) { + $search = $request->get('search'); + $query->where(function ($q) use ($search) { + $q->orWhere('judul', 'LIKE', "%$search%"); + }); + } + + // Filter kategori + if (!empty($request->get('category'))) { + $category = explode(',', $request->input('category')); + $query->whereIn('category_id', $category); + } + + // Default pagination + $page = (int) $request->get('page', 1); + $size = (int) $request->get('size', 10); + + return $query->paginate($size, ['*'], 'page', $page); +} + + + private function handleUpload($file) + { + $today = now(); + $folderPath = 'daftar_pustaka/' . $today->format('Y/m/d'); + + if (!file_exists(public_path($folderPath))) { + mkdir(public_path($folderPath), 0755, true); + } + + $fileName = $file->getClientOriginalName(); + $file->move(public_path($folderPath), $fileName); + + return $folderPath . '/' . $fileName; + } + + +} diff --git a/database/migrations/2025_07_07_025336_create_category_daftar_pustaka_table.php b/database/migrations/2025_07_07_025336_create_category_daftar_pustaka_table.php new file mode 100644 index 0000000..ce6f6d8 --- /dev/null +++ b/database/migrations/2025_07_07_025336_create_category_daftar_pustaka_table.php @@ -0,0 +1,35 @@ +id(); + $table->string('code')->unique()->index(); + $table->string('name'); + $table->timestamps(); + $table->timestamp('authorized_at')->nullable(); + $table->char('authorized_status', 1)->nullable(); + $table->softDeletes(); + $table->unsignedBigInteger('created_by')->nullable(); + $table->unsignedBigInteger('updated_by')->nullable(); + $table->unsignedBigInteger('deleted_by')->nullable(); + $table->unsignedBigInteger('authorized_by')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('category_daftar_pustaka'); + } +}; diff --git a/database/migrations/2025_07_07_025337_create_daftar_pustaka_table.php b/database/migrations/2025_07_07_025337_create_daftar_pustaka_table.php new file mode 100644 index 0000000..5b61e12 --- /dev/null +++ b/database/migrations/2025_07_07_025337_create_daftar_pustaka_table.php @@ -0,0 +1,38 @@ +id(); + $table->string('judul'); + $table->string('attachment')->nullable(); + $table->text('deskripsi'); + $table->unsignedBigInteger('category_id'); + $table->foreign('category_id')->references('id')->on('category_daftar_pustaka'); + $table->timestamps(); + $table->timestamp('authorized_at')->nullable(); + $table->char('authorized_status', 1)->nullable(); + $table->softDeletes(); + $table->unsignedBigInteger('created_by')->nullable(); + $table->unsignedBigInteger('updated_by')->nullable(); + $table->unsignedBigInteger('deleted_by')->nullable(); + $table->unsignedBigInteger('authorized_by')->nullable(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('daftar_pustaka'); + } +}; diff --git a/module.json b/module.json index fc81e7f..0b63135 100644 --- a/module.json +++ b/module.json @@ -607,6 +607,23 @@ "EO Appraisal", "senior-officer" ] + }, + { + "title": "Daftar Pustaka", + "path": "daftar-pustaka", + "icon": "ki-filled ki-filter-tablet text-lg text-primary", + "classes": "", + "attributes": [], + "permission": "", + "roles": [ + "administrator", + "pemohon-ao", + "pemohon-eo", + "admin", + "DD Appraisal", + "EO Appraisal", + "senior-officer" + ] } ], "master": [ @@ -1149,6 +1166,17 @@ "administrator", "admin" ] + }, + { + "title": "Kategori Daftar Pustaka", + "path": "category-daftar-pustaka", + "classes": "", + "attributes": [], + "permission": "", + "roles": [ + "administrator", + "admin" + ] } ] } diff --git a/resources/views/category-daftar-pustaka/create.blade.php b/resources/views/category-daftar-pustaka/create.blade.php new file mode 100644 index 0000000..3d94986 --- /dev/null +++ b/resources/views/category-daftar-pustaka/create.blade.php @@ -0,0 +1,64 @@ +@extends('layouts.main') + +@section('breadcrumbs') + {{-- {{ Breadcrumbs::render(request()->route()->getName()) }} --}} +@endsection + +@section('content') +
+ +
+ @csrf + @if (isset($category->id)) + @method('PUT') + + @endif +
+
+

+ Tambah +

+
+ Back +
+
+
+
+ +
+ id) ? 'readonly' : '' }}> + @error('code') + {{ $message }} + @enderror +
+
+
+ +
+ + @error('name') + {{ $message }} + @enderror +
+
+ +
+ +
+
+
+
+
+@endsection diff --git a/resources/views/category-daftar-pustaka/index.blade.php b/resources/views/category-daftar-pustaka/index.blade.php new file mode 100644 index 0000000..1577c77 --- /dev/null +++ b/resources/views/category-daftar-pustaka/index.blade.php @@ -0,0 +1,147 @@ +@extends('layouts.main') + +@section('breadcrumbs') + {{-- {{ Breadcrumbs::render('basicdata.jenis-aset') }} --}} +@endsection + +@section('content') +
+
+
+

+ Daftar Kategori Daftar Pustaka +

+ +
+
+
+ + + + + + + + + +
+ + + Code + + + Name + + Action
+
+ +
+
+
+@endsection + +@push('scripts') + + +@endpush + diff --git a/resources/views/daftar-pustaka/create.blade.php b/resources/views/daftar-pustaka/create.blade.php new file mode 100644 index 0000000..f35d03d --- /dev/null +++ b/resources/views/daftar-pustaka/create.blade.php @@ -0,0 +1,113 @@ +@extends('layouts.main') + +@section('breadcrumbs') + {{-- {{ Breadcrumbs::render(request()->route()->getName()) }} --}} +@endsection + +@section('content') +
+
+ @csrf + @if (isset($daftarPustaka->id)) + + @method('PUT') + @endif + +
+
+

+ {{ isset($daftarPustaka->id) ? 'Edit' : 'Tambah' }} Daftar Pustaka +

+
+ Back +
+
+
+
+ +
+ + @error('judul') + {{ $message }} + @enderror +
+
+
+ +
+ + @error('attachment') + {{ $message }} + @enderror +
+
+ @if (isset($daftarPustaka->attachment)) +
+ +
+ {{-- ambil nama file pathnya hilangkan --}} + {{ basename($daftarPustaka->attachment) }}   + + +
+
+ @endif + +
+ + + +
+ + @error('category_id') + {{ $message }} + @enderror +
+
+ +
+ +
+ + @error('deskripsi') + {{ $message }} + @enderror +
+
+ + +
+ +
+
+
+
+
+@endsection diff --git a/resources/views/daftar-pustaka/index.blade.php b/resources/views/daftar-pustaka/index.blade.php new file mode 100644 index 0000000..847a640 --- /dev/null +++ b/resources/views/daftar-pustaka/index.blade.php @@ -0,0 +1,307 @@ +@extends('layouts.main') + +@section('breadcrumbs') + {{-- {{ Breadcrumbs::render('basicdata.ijin_usaha') }} --}} +@endsection + +@section('content') + +
+
+
+ + + + + ⌘ K + +
+ + + + + Filter + + + + Reset Filter + +
+ +
+

+ page {{ $page }} of {{ $pageCount }} — {{ $limit }} items per page, total + {{ $total }} items. +

+
+ +
+ + + + + + + @if (auth()->user()->hasRole(['administrator', 'admin'])) + + + Tambah + + @endif +
+
+ +
+ + + +
+ @if (isset($daftar_pustaka)) + @foreach ($daftar_pustaka as $item) +
+ +
+
+
+
+ +
+ + +

+ {{ $item->judul }}

+

+ {{-- batasi panjang deskripsi 50 --}} + {{ substr($item->deskripsi, 0, 50) }} +

+
+
+

+ # {{ $item->category->name }}

+ + @auth + @if (auth()->user()->hasRole(['administrator', 'admin'])) + + @endif + @endauth + +
+
+
+ @endforeach + @endif +
+ + + + + + +
+@endsection + +@push('scripts') + + +@endpush diff --git a/resources/views/daftar-pustaka/show.blade.php b/resources/views/daftar-pustaka/show.blade.php new file mode 100644 index 0000000..0472df0 --- /dev/null +++ b/resources/views/daftar-pustaka/show.blade.php @@ -0,0 +1,71 @@ +@extends('layouts.main') + +@section('breadcrumbs') + {{-- {{ Breadcrumbs::render(request()->route()->getName()) }} --}} +@endsection + +@section('content') +
+ +
+ @csrf +
+
+

+ {{ $daftarPustaka->judul ?? '' }} +

+
+ Back +
+
+
+
+
+
+ +
+
+
+
+ +
+
+
+ {{ $daftarPustaka->deskripsi ?? '' }} +
+
+
+
+
+@endsection + +@push('scripts') + + + +@endpush diff --git a/routes/web.php b/routes/web.php index 76e0df1..f082459 100644 --- a/routes/web.php +++ b/routes/web.php @@ -50,6 +50,9 @@ use Modules\Lpj\Http\Controllers\LaporanMonitoringSoController; use Modules\Lpj\Http\Controllers\LaporanDebitureController; use Modules\Lpj\Http\Controllers\LaporanUserController; use Modules\Lpj\Http\Controllers\LaporanSLAPenilaiController; +use Modules\Lpj\Http\Controllers\DaftarPustakaController; +use Modules\Lpj\Http\Controllers\CategoryDaftarPustakaController; + @@ -766,6 +769,16 @@ Route::middleware(['auth'])->group(function () { Route::get('datatables', [LaporanSLAPenilaiController::class, 'dataForDatatableSLaPenilai'])->name('datatables'); }); + // daftar pustaka + Route::resource('daftar-pustaka', DaftarPustakaController::class); + + // category daftar pustaka + Route::prefix('category-daftar-pustaka')->name('category-daftar-pustaka.')->group(function () { + Route::get('datatables', [CategoryDaftarPustakaController::class, 'dataForDatatables'])->name('datatables'); + }); + + Route::resource('category-daftar-pustaka', CategoryDaftarPustakaController::class); + }); require __DIR__ . '/registrasi.php';