From 538cdb87ae45620bb0e8d07b2a317be90b0980da Mon Sep 17 00:00:00 2001 From: arifal hidayat Date: Tue, 28 Jan 2025 05:22:50 +0700 Subject: [PATCH] add crud general settings --- .../Settings/SettingsController.php | 101 ++++++++++++- .../Requests/UpdateGlobalSettingRequest.php | 33 +++++ bootstrap/app.php | 2 +- .../js/settings/general/general-settings.js | 134 ++++++++++++++---- .../views/layouts/partials/sidebar.blade.php | 18 ++- resources/views/master/users/index.blade.php | 2 +- .../views/request-assignment/index.blade.php | 24 +++- .../views/settings/general/create.blade.php | 50 +++++-- .../views/settings/general/edit.blade.php | 56 ++++++++ .../views/settings/general/index.blade.php | 12 +- routes/api.php | 4 +- routes/web.php | 12 +- 12 files changed, 387 insertions(+), 61 deletions(-) create mode 100644 app/Http/Requests/UpdateGlobalSettingRequest.php create mode 100644 resources/views/settings/general/edit.blade.php diff --git a/app/Http/Controllers/Settings/SettingsController.php b/app/Http/Controllers/Settings/SettingsController.php index 1ba3af3..473db86 100644 --- a/app/Http/Controllers/Settings/SettingsController.php +++ b/app/Http/Controllers/Settings/SettingsController.php @@ -3,15 +3,110 @@ namespace App\Http\Controllers\Settings; use App\Http\Controllers\Controller; +use App\Http\Requests\GlobalSettingRequest; +use App\Http\Requests\UpdateGlobalSettingRequest; +use App\Models\GlobalSetting; +use Exception; use Illuminate\Http\Request; +use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\Log; class SettingsController extends Controller { - public function index(){ + /** + * Display a listing of the resource. + */ + public function index() + { return view('settings.general.index'); } - - public function create(){ + + /** + * Show the form for creating a new resource. + */ + public function create() + { return view('settings.general.create'); } + + /** + * Store a newly created resource in storage. + */ + public function store(GlobalSettingRequest $request) + { + try{ + DB::beginTransaction(); + GlobalSetting::create($request->validated()); + DB::commit(); + return redirect()->route('general.index')->with('success', 'Data saved successfully.'); + }catch(Exception $e){ + DB::rollBack(); + return redirect()->back() + ->withInput() + ->with('error', 'Something went wrong while saving data. ' . $e->getMessage()); + } + } + + /** + * Display the specified resource. + */ + public function show(string $id) + { + $data = GlobalSetting::find($id); + if(!$data){ + return redirect()->route('general.index')->with('error', 'Invalid id'); + } + return view('settings.general.show', compact('data')); + } + + /** + * Show the form for editing the specified resource. + */ + public function edit(string $id) + { + $data = GlobalSetting::find($id); + if(!$data){ + return redirect()->route('general.index')->with('error', 'Invalid id'); + } + return view('settings.general.edit', compact('data')); + } + + /** + * Update the specified resource in storage. + */ + public function update(UpdateGlobalSettingRequest $request, string $id) + { + try{ + DB::beginTransaction(); + $data = GlobalSetting::findOrFail($id); + + $data->update($request->validated()); + DB::commit(); + return redirect()->route('general.index')->with('success', 'Data updated successfully.'); + }catch(Exception $e){ + DB::rollBack(); + return redirect()->back() + ->withInput() + ->with('error', 'Something went wrong while updating data. '. $e->getMessage()); + } + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(string $id) + { + try{ + DB::beginTransaction(); + $data = GlobalSetting::findOrFail($id); + + $data->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/Requests/UpdateGlobalSettingRequest.php b/app/Http/Requests/UpdateGlobalSettingRequest.php new file mode 100644 index 0000000..8d053bb --- /dev/null +++ b/app/Http/Requests/UpdateGlobalSettingRequest.php @@ -0,0 +1,33 @@ +|string> + */ + public function rules(): array + { + $id = $this->route('general'); + + return [ + 'key' => 'required|unique:global_settings,key,' . $id, + 'value' => 'required', + 'type' => 'nullable', + 'description' => 'nullable' + ]; + } +} diff --git a/bootstrap/app.php b/bootstrap/app.php index bd95a51..3bb9d6c 100755 --- a/bootstrap/app.php +++ b/bootstrap/app.php @@ -22,7 +22,7 @@ return Application::configure(basePath: dirname(__DIR__)) } }); $exceptions->render(function (HttpException $exception, Request $request){ - if($exception->getStatusCode() == 404 && $request->isNot('api/*')) { + if($exception->getStatusCode() == 404 && !$request->is('api/*')) { return response()->view('pages.404',[],404); } }); diff --git a/resources/js/settings/general/general-settings.js b/resources/js/settings/general/general-settings.js index 45573f1..d205482 100644 --- a/resources/js/settings/general/general-settings.js +++ b/resources/js/settings/general/general-settings.js @@ -1,36 +1,108 @@ import { Grid } from "gridjs/dist/gridjs.umd.js"; -import gridjs from 'gridjs/dist/gridjs.umd.js' -import '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 SyncronizeTask { - init(){ - this.initTableGeneralSettings(); - } - initTableGeneralSettings(){ - new Grid({ - columns: [ - "ID", "Key", "Value", "Description", "Created", - ], - pagination: { - limit: 10, - server: { - url: (prev, page, limit) => `${prev}?page=${page}` - } - }, - sort: true, - search: { - server: { - url: (prev, page, keyword) => `${prev}?page=${page}&search=${keyword}` - } - }, - server: { - url: `${GlobalConfig.apiHost}/api/global-settings`, - then: data => data.data.map((item) => [item.id, item.key, item.value, item.description, item.created_at]) - } - }).render(document.getElementById("general-setting-table")); - } + init() { + this.initTableGeneralSettings(); + } + initTableGeneralSettings() { + const table = new Grid({ + columns: [ + "ID", + "Key", + "Value", + "Description", + "Created", + { + name: "Actions", + width: "120px", + formatter: function (cell) { + console.log("cell data", cell); + return gridjs.html(` +
+ Update + +
+ `); + }, + }, + ], + pagination: { + limit: 15, + server: { + url: (prev, page, limit) => `${prev}?page=${page}`, + }, + }, + sort: true, + search: { + server: { + url: (prev, page, keyword) => + `${prev}?page=${page}&search=${keyword}`, + }, + }, + server: { + url: `${GlobalConfig.apiHost}/api/global-settings`, + headers: { + Authorization: `Bearer ${document + .querySelector('meta[name="csrf-token"]') + .getAttribute("content")}`, + "Content-Type": "application/json", + }, + then: (data) => + data.data.map((item) => [ + item.id, + item.key, + item.value, + item.description, + item.created_at, + item.id, + ]), + }, + }); + table.render(document.getElementById("general-setting-table")); + + document.addEventListener("click", this.handleDelete); + } + handleDelete(event) { + if (event.target.classList.contains("btn-delete-global-settings")) { + event.preventDefault(); + const id = event.target.getAttribute("data-id"); + + if (confirm("Are you sure you want to delete this item?")) { + fetch(`/settings/general/${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 SyncronizeTask().init(); -}); \ No newline at end of file +document.addEventListener("click", function (e) { + handleDelete(e); // Call the function on click event +}); +document.addEventListener("DOMContentLoaded", function (e) { + new SyncronizeTask().init(); +}); diff --git a/resources/views/layouts/partials/sidebar.blade.php b/resources/views/layouts/partials/sidebar.blade.php index e610a11..23d45f3 100644 --- a/resources/views/layouts/partials/sidebar.blade.php +++ b/resources/views/layouts/partials/sidebar.blade.php @@ -69,7 +69,7 @@
+ diff --git a/resources/views/master/users/index.blade.php b/resources/views/master/users/index.blade.php index 0524d27..c5a58e0 100644 --- a/resources/views/master/users/index.blade.php +++ b/resources/views/master/users/index.blade.php @@ -1,4 +1,4 @@ -@extends('layouts.vertical', ['subtitle' => 'Master'])\ +@extends('layouts.vertical', ['subtitle' => 'Master']) @section('css') @vite(['node_modules/gridjs/dist/theme/mermaid.min.css']) diff --git a/resources/views/request-assignment/index.blade.php b/resources/views/request-assignment/index.blade.php index 4a6a027..8b3e623 100644 --- a/resources/views/request-assignment/index.blade.php +++ b/resources/views/request-assignment/index.blade.php @@ -1,3 +1,23 @@ -
- +@extends('layouts.vertical', ['subtitle' => 'Request Assignments']) + +@section('css') +@vite(['node_modules/gridjs/dist/theme/mermaid.min.css']) +@endsection + +@section('content') + +@include('layouts.partials/page-title', ['title' => 'Request Assignment', 'subtitle' => 'Task']) + +
+
+

Request Assignment Page

+
+
+
+
+ +@endsection + +@section('scripts') +@endsection \ No newline at end of file diff --git a/resources/views/settings/general/create.blade.php b/resources/views/settings/general/create.blade.php index 99f413c..1584682 100644 --- a/resources/views/settings/general/create.blade.php +++ b/resources/views/settings/general/create.blade.php @@ -5,22 +5,46 @@ @include('layouts.partials/page-title', ['title' => 'Se', 'subtitle' => 'Syncronize'])
+ @if (session('error')) +
+ {{ session('error') }} +
+ @endif + + @if ($errors->any()) +
+
    + @foreach ($errors->all() as $error) +
  • {{ $error }}
  • + @endforeach +
+
+ @endif
-
-
-
-
- - -
-
- - -
- -
+
+
+
+ @csrf +
+ +
+
+ + +
+
+ + +
+
+ + +
+ +
+
diff --git a/resources/views/settings/general/edit.blade.php b/resources/views/settings/general/edit.blade.php new file mode 100644 index 0000000..8f16fb2 --- /dev/null +++ b/resources/views/settings/general/edit.blade.php @@ -0,0 +1,56 @@ +@extends('layouts.vertical', ['subtitle' => 'Create User']) + +@section('content') + +@include('layouts.partials/page-title', ['title' => 'Se', 'subtitle' => 'Syncronize']) + +
+ @if (session('error')) +
+ {{ session('error') }} +
+ @endif + + @if ($errors->any()) +
+
    + @foreach ($errors->all() as $error) +
  • {{ $error }}
  • + @endforeach +
+
+ @endif +
+
+
+
+ @csrf + @method('PUT') +
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+
+
+
+
+ +@endsection + +@section('scripts') +@vite(['resources/js/tables/common-table.js']) +@endsection \ No newline at end of file diff --git a/resources/views/settings/general/index.blade.php b/resources/views/settings/general/index.blade.php index f227e52..0917f4c 100644 --- a/resources/views/settings/general/index.blade.php +++ b/resources/views/settings/general/index.blade.php @@ -9,12 +9,12 @@ @include('layouts.partials/page-title', ['title' => 'Settings', 'subtitle' => 'Syncronize'])
-
- -
-
-
-
+
+ Create +
+
+
+
@endsection diff --git a/routes/api.php b/routes/api.php index 1dacfcd..0ecdcf3 100644 --- a/routes/api.php +++ b/routes/api.php @@ -16,7 +16,7 @@ Route::get('/user', function (Request $request) { })->middleware('auth:sanctum'); Route::group(['middleware' => 'auth:scantum'], function (){ - + Route::apiResource('global-settings', GlobalSettingsController::class); }); Route::controller(DashboardController::class)->group(function(){ Route::get('/business-documents','businnessDocument'); @@ -36,7 +36,7 @@ Route::get('/sync-task-submit/{uuid}', [SyncronizeController::class, 'syncTaskDe Route::apiResource('import-datasource',ImportDatasourceController::class); // global setting -Route::apiResource('global-settings', GlobalSettingsController::class); + // request assignment Route::apiResource('request-assignments',RequestAssignmentController::class); \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index a5972df..5a18bc9 100755 --- a/routes/web.php +++ b/routes/web.php @@ -3,6 +3,7 @@ use App\Http\Controllers\Dashboards\BigDataController; use App\Http\Controllers\Home\HomeController; use App\Http\Controllers\Master\UsersController; +use App\Http\Controllers\RequestAssignment\PbgTaskController; use App\Http\Controllers\Settings\SettingsController; use App\Http\Controllers\Settings\SyncronizeController; use Illuminate\Support\Facades\Route; @@ -29,8 +30,9 @@ Route::group(['middleware' => 'auth'], function(){ // settings Route::group(['prefix' => '/settings'], function(){ + Route::resource('/general', SettingsController::class); Route::get('/syncronize', [SyncronizeController::class, 'index'])->name('settings.syncronize'); - Route::get('/general', [SettingsController::class, 'index'])->name('settings.general'); + // Route::get('/general', [SettingsController::class, 'index'])->name('settings.general'); Route::post('/syncronize', [SyncronizeController::class, 'syncronizeTask'])->name('settings.sync'); }); @@ -51,4 +53,12 @@ Route::group(['middleware' => 'auth'], function(){ Route::delete('/users/delete/{id}', [UsersController::class, 'delete'])->name('master.users.delete'); Route::delete('/users/show/{id}', [UsersController::class, 'show'])->name('master.users.show'); }); + + // request assignments + + Route::group(['prefix' => '/request-assignments'], function(){ + Route::controller(PbgTaskController::class)->group(function(){ + Route::get('/index', 'index')->name('request-assignments.index'); + }); + }); }); \ No newline at end of file