From 7d06e12de8ff4dab245130b85a99ea49e3bb58c0 Mon Sep 17 00:00:00 2001 From: arifal Date: Tue, 4 Feb 2025 21:49:10 +0700 Subject: [PATCH] create crud data settings --- .../Controllers/Api/DataSettingController.php | 104 +++++++++++++++++ .../Controllers/DataSettingController.php | 106 +++++++++++++++++ app/Http/Controllers/RoutingController.php | 26 ----- app/Http/Requests/DataSettingRequest.php | 31 +++++ app/Http/Resources/DataSettingResource.php | 26 +++++ app/Models/DataSetting.php | 15 +++ ...2_04_133926_create_data_settings_table.php | 30 +++++ database/seeders/DataSettingSeeder.php | 35 ++++++ package-lock.json | 2 +- resources/js/data-settings/index.js | 107 ++++++++++++++++++ .../views/data-settings/create.blade.php | 50 ++++++++ resources/views/data-settings/edit.blade.php | 51 +++++++++ resources/views/data-settings/index.blade.php | 24 ++++ .../views/layouts/partials/sidebar.blade.php | 19 +++- routes/api.php | 4 + routes/web.php | 4 + 16 files changed, 606 insertions(+), 28 deletions(-) create mode 100644 app/Http/Controllers/Api/DataSettingController.php create mode 100644 app/Http/Controllers/DataSettingController.php create mode 100644 app/Http/Requests/DataSettingRequest.php create mode 100644 app/Http/Resources/DataSettingResource.php create mode 100644 app/Models/DataSetting.php create mode 100644 database/migrations/2025_02_04_133926_create_data_settings_table.php create mode 100644 database/seeders/DataSettingSeeder.php create mode 100644 resources/js/data-settings/index.js create mode 100644 resources/views/data-settings/create.blade.php create mode 100644 resources/views/data-settings/edit.blade.php create mode 100644 resources/views/data-settings/index.blade.php diff --git a/app/Http/Controllers/Api/DataSettingController.php b/app/Http/Controllers/Api/DataSettingController.php new file mode 100644 index 0000000..ac5d1d4 --- /dev/null +++ b/app/Http/Controllers/Api/DataSettingController.php @@ -0,0 +1,104 @@ +orderBy('id', 'desc'); + if ($request->has("search") && !empty($request->get("search"))) { + $query = $query->where("key", $request->get("search")); + } + + return DataSettingResource::collection($query->paginate()); + } catch (Exception $e) { + return $this->resError($e->getMessage(), $e->getTrace()); + } + } + + /** + * Store a newly created resource in storage. + */ + public function store(DataSettingRequest $request) + { + try { + $data = DataSetting::create($request->validated()); + $result = [ + "success" => true, + "message" => "Data Setting created successfully", + "data" => new DataSettingResource($data) + ]; + return $this->resSuccess($result); + } catch (Exception $e) { + return $this->resError($e->getMessage(), $e); + } + } + + /** + * Display the specified resource. + */ + public function show(string $id) + { + try { + $setting = DataSetting::findOrFail($id); + $result = [ + "setting" => true, + "message" => "Data setting successfully", + "data" => new DataSettingResource($setting) + ]; + return $this->resSuccess($result); + } catch (Exception $e) { + return $this->resError($e->getMessage()); + } + } + + /** + * Update the specified resource in storage. + */ + public function update(DataSettingRequest $request, string $id) + { + try { + $data = DataSetting::findOrFail($id); + $data->update($request->validated()); + $result = [ + "success" => true, + "message" => "Data Setting updated successfully" + ]; + return $this->resSuccess($result); + } catch (Exception $e) { + return $this->resError($e->getMessage()); + } + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(string $id) + { + try { + $setting = DataSetting::findOrFail($id); + $setting->delete(); + $result = [ + "success" => true, + "message" => "Data Setting deleted successfully" + ]; + return $this->resSuccess($result); + } catch (Exception $e) { + return $this->resError($e->getMessage()); + } + } +} diff --git a/app/Http/Controllers/DataSettingController.php b/app/Http/Controllers/DataSettingController.php new file mode 100644 index 0000000..c4ea65d --- /dev/null +++ b/app/Http/Controllers/DataSettingController.php @@ -0,0 +1,106 @@ +validated()); + DB::commit(); + return redirect()->route("data-settings.index")->with("success","Successfully created"); + }catch(Exception $ex){ + DB::rollBack(); + return redirect()->back() + ->withInput() + ->with('error', 'Something went wrong while saving data. ' . $ex->getMessage()); + } + } + + /** + * Display the specified resource. + */ + public function show(DataSetting $dataSetting) + { + // + } + + /** + * Show the form for editing the specified resource. + */ + public function edit(string $id) + { + try{ + $data = DataSetting::findOrFail($id); + if(empty($data)){ + return redirect()->route('data-settings.index')->with('error', 'Invalid id'); + } + return view("data-settings.edit", compact("data")); + }catch(Exception $ex){ + return redirect()->route("data-settings.index")->with("error", "Invalid id"); + } + } + + /** + * Update the specified resource in storage. + */ + public function update(DataSettingRequest $request,string $id) + { + try{ + DB::beginTransaction(); + $data = DataSetting::findOrFail($id); + $data->update($request->validated()); + DB::commit(); + return redirect()->route("data-settings.index")->with("success","Successfully updated"); + }catch(Exception $ex){ + DB::rollBack(); + return redirect()->back() + ->withInput() + ->with('error', 'Something went wrong while saving data. ' . $ex->getMessage()); + } + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(string $id) + { + try{ + DB::beginTransaction(); + DataSetting::findOrFail($id)->delete(); + DB::commit(); + return response()->json(['success' => true, 'message' => 'Item deleted successfully.']); + }catch(Exception $e){ + DB::rollBack(); + Log::error($e->getMessage()); + return response()->json(['success' => false, 'message' => 'Failed to delete item.'], 500); + } + } +} diff --git a/app/Http/Controllers/RoutingController.php b/app/Http/Controllers/RoutingController.php index 6392e29..2bb3b5f 100755 --- a/app/Http/Controllers/RoutingController.php +++ b/app/Http/Controllers/RoutingController.php @@ -15,30 +15,4 @@ class RoutingController extends Controller return redirect('auth.signin'); } } - - /** - * Display a view based on first route param - * - * @return \Illuminate\Http\Response - */ - public function root(Request $request, $first) - { - return view($first); - } - - /** - * second level route - */ - public function secondLevel(Request $request, $first, $second) - { - return view($first . '.' . $second); - } - - /** - * third level route - */ - public function thirdLevel(Request $request, $first, $second, $third) - { - return view($first . '.' . $second . '.' . $third); - } } diff --git a/app/Http/Requests/DataSettingRequest.php b/app/Http/Requests/DataSettingRequest.php new file mode 100644 index 0000000..2305e39 --- /dev/null +++ b/app/Http/Requests/DataSettingRequest.php @@ -0,0 +1,31 @@ +|string> + */ + public function rules(): array + { + $id = $this->route('data_setting'); + return [ + "key" => "required|unique:data_settings,key," . $id, + "value" => "required", + "type" => "nullable", + ]; + } +} diff --git a/app/Http/Resources/DataSettingResource.php b/app/Http/Resources/DataSettingResource.php new file mode 100644 index 0000000..3cc1d14 --- /dev/null +++ b/app/Http/Resources/DataSettingResource.php @@ -0,0 +1,26 @@ + + */ + public function toArray(Request $request): array + { + return [ + 'id' => $this->id, + 'key' => $this->key, + 'value' => $this->value, + 'type' => $this->type, + 'created_at' => $this->created_at->toDateTimeString(), + 'updated_at' => $this->updated_at->toDateTimeString(), + ]; + } +} diff --git a/app/Models/DataSetting.php b/app/Models/DataSetting.php new file mode 100644 index 0000000..8ac2f87 --- /dev/null +++ b/app/Models/DataSetting.php @@ -0,0 +1,15 @@ +id(); + $table->string('key')->unique(); + $table->string('value'); + $table->string('type')->nullable()->default('integer'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('data_settings'); + } +}; diff --git a/database/seeders/DataSettingSeeder.php b/database/seeders/DataSettingSeeder.php new file mode 100644 index 0000000..2303d5b --- /dev/null +++ b/database/seeders/DataSettingSeeder.php @@ -0,0 +1,35 @@ + "TARGET_PAD", + "value" => "33.200.000.000", + "type" => "integer" + ] + ]; + + foreach ($data_settings as $setting) { + DataSetting::updateOrCreate([ + "key" => $setting["key"], + ],[ + "value" => $setting["value"], + "type" => $setting["type"], + "created_at" => now(), + "updated_at" => now(), + ]); + } + } +} diff --git a/package-lock.json b/package-lock.json index 6037de1..6861a22 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5 +1,5 @@ { - "name": "Darkone-Laravel", + "name": "sibedas-pbg-web", "lockfileVersion": 3, "requires": true, "packages": { diff --git a/resources/js/data-settings/index.js b/resources/js/data-settings/index.js new file mode 100644 index 0000000..2e9f2a4 --- /dev/null +++ b/resources/js/data-settings/index.js @@ -0,0 +1,107 @@ +import { Grid } from "gridjs/dist/gridjs.umd.js"; +import gridjs from "gridjs/dist/gridjs.umd.js"; +import "gridjs/dist/gridjs.umd.js"; +import GlobalConfig from "../global-config.js"; + +class DataSettings { + init() { + this.getFetchApiData(); + } + + getFetchApiData() { + const table = new Grid({ + columns: [ + "ID", + "Key", + "Value", + "Created", + { + name: "Actions", + width: "120px", + formatter: function (cell) { + console.log("cell data", cell); + return gridjs.html(` +
+ Update + +
+ `); + }, + }, + ], + search: { + server: { + url: (prev, keyword) => `${prev}?search=${keyword}`, + }, + }, + pagination: { + limit: 15, + server: { + url: (prev, page) => + `${prev}${prev.includes("?") ? "&" : "?"}page=${ + page + 1 + }`, + }, + }, + sort: true, + server: { + url: `${GlobalConfig.apiHost}/api/api-data-settings`, + headers: { + Authorization: `Bearer ${document + .querySelector('meta[name="api-token"]') + .getAttribute("content")}`, + "Content-Type": "application/json", + }, + then: (data) => + data.data.map((item) => [ + item.id, + item.key, + item.value, + item.created_at, + item.id, + ]), + total: (data) => data.meta.total, + }, + }); + table.render(document.getElementById("table-data-settings")); + + document.addEventListener("click", this.handleDelete); + } + handleDelete(event) { + if (event.target.classList.contains("btn-delete-data-settings")) { + event.preventDefault(); + const id = event.target.getAttribute("data-id"); + + if (confirm("Are you sure you want to delete this item?")) { + fetch(`/data-settings/${id}`, { + method: "DELETE", + headers: { + "X-CSRF-TOKEN": document + .querySelector('meta[name="csrf-token"]') + .getAttribute("content"), + "Content-Type": "application/json", + }, + }) + .then((response) => { + if (response.ok) { + alert("Item deleted successfully!"); + window.location.reload(); + } else { + return response.json().then((error) => { + throw new Error( + error.message || "Failed to delete item." + ); + }); + } + }) + .catch((error) => { + console.error("Error deleting item:", error); + alert("Something went wrong. Please try again."); + }); + } + } + } +} +document.addEventListener("DOMContentLoaded", function (e) { + new DataSettings().init(); +}); diff --git a/resources/views/data-settings/create.blade.php b/resources/views/data-settings/create.blade.php new file mode 100644 index 0000000..e6d22da --- /dev/null +++ b/resources/views/data-settings/create.blade.php @@ -0,0 +1,50 @@ +@extends('layouts.vertical', ['subtitle' => 'Create']) + +@section('content') + +@include('layouts.partials/page-title', ['title' => 'Data Settings', 'subtitle' => 'Setting Dashboard']) + +
+ @if (session('error')) +
+ {{ session('error') }} +
+ @endif + + @if ($errors->any()) +
+
    + @foreach ($errors->all() as $error) +
  • {{ $error }}
  • + @endforeach +
+
+ @endif +
+
+
+
+ @csrf +
+ + +
+
+ + +
+
+ + +
+ +
+
+
+
+
+ +@endsection + +@section('scripts') +@endsection \ No newline at end of file diff --git a/resources/views/data-settings/edit.blade.php b/resources/views/data-settings/edit.blade.php new file mode 100644 index 0000000..58a8c42 --- /dev/null +++ b/resources/views/data-settings/edit.blade.php @@ -0,0 +1,51 @@ +@extends('layouts.vertical', ['subtitle' => 'Create']) + +@section('content') + +@include('layouts.partials/page-title', ['title' => 'Data Settings', 'subtitle' => 'Setting Dashboard']) + +
+ @if (session('error')) +
+ {{ session('error') }} +
+ @endif + + @if ($errors->any()) +
+
    + @foreach ($errors->all() as $error) +
  • {{ $error }}
  • + @endforeach +
+
+ @endif +
+
+
+
+ @csrf + @method('PUT') +
+ + +
+
+ + +
+
+ + +
+ +
+
+
+
+
+ +@endsection + +@section('scripts') +@endsection \ No newline at end of file diff --git a/resources/views/data-settings/index.blade.php b/resources/views/data-settings/index.blade.php new file mode 100644 index 0000000..16bfd11 --- /dev/null +++ b/resources/views/data-settings/index.blade.php @@ -0,0 +1,24 @@ +@extends('layouts.vertical', ['subtitle' => 'Data Settings']) + +@section('css') +@vite(['node_modules/gridjs/dist/theme/mermaid.min.css']) +@endsection + +@section('content') + +@include('layouts.partials/page-title', ['title' => 'Data Settings', 'subtitle' => 'Setting Dashboard']) + +
+
+ Create +
+
+
+
+
+ +@endsection + +@section('scripts') +@vite(['resources/js/data-settings/index.js']) +@endsection \ No newline at end of file diff --git a/resources/views/layouts/partials/sidebar.blade.php b/resources/views/layouts/partials/sidebar.blade.php index 99331ed..07160cd 100644 --- a/resources/views/layouts/partials/sidebar.blade.php +++ b/resources/views/layouts/partials/sidebar.blade.php @@ -29,7 +29,7 @@
+ +