From b53611bc0bca2f39dd09bba1831ae764fd912955 Mon Sep 17 00:00:00 2001 From: arieeefajar Date: Wed, 29 Jan 2025 21:41:23 +0700 Subject: [PATCH 1/3] feat(master-rule): create master rule page --- .../Controllers/MasterData/RuleController.php | 16 + app/Models/Indicator.php | 2 +- app/Models/Rule.php | 26 ++ ...25_01_28_120615_create_indicator_table.php | 2 +- .../2025_01_29_054112_create_rules_table.php | 36 ++ database/seeders/DatabaseSeeder.php | 3 +- database/seeders/RuleSeeder.php | 75 +++++ .../customJs/master-data/aturan/index.js | 312 ++++++++++++++++++ .../views/master-data/aturan/index.blade.php | 257 +++++++++++++++ resources/views/partials/sidebar.blade.php | 6 + routes/web.php | 8 + 11 files changed, 740 insertions(+), 3 deletions(-) create mode 100644 app/Http/Controllers/MasterData/RuleController.php create mode 100644 app/Models/Rule.php create mode 100644 database/migrations/2025_01_29_054112_create_rules_table.php create mode 100644 database/seeders/RuleSeeder.php create mode 100644 public/assets/js/pages/customJs/master-data/aturan/index.js create mode 100644 resources/views/master-data/aturan/index.blade.php diff --git a/app/Http/Controllers/MasterData/RuleController.php b/app/Http/Controllers/MasterData/RuleController.php new file mode 100644 index 0000000..d6e4687 --- /dev/null +++ b/app/Http/Controllers/MasterData/RuleController.php @@ -0,0 +1,16 @@ +get(); + return view('master-data.aturan.index', compact('rules')); + } +} diff --git a/app/Models/Indicator.php b/app/Models/Indicator.php index 28861fd..ed2f4f3 100644 --- a/app/Models/Indicator.php +++ b/app/Models/Indicator.php @@ -9,7 +9,7 @@ class Indicator extends Model { use HasFactory; - protected $table = 'indicator'; + protected $table = 'indicators'; protected $fillable = [ 'name', diff --git a/app/Models/Rule.php b/app/Models/Rule.php new file mode 100644 index 0000000..aeebc0e --- /dev/null +++ b/app/Models/Rule.php @@ -0,0 +1,26 @@ +belongsTo(Indicator::class); + } +} diff --git a/database/migrations/2025_01_28_120615_create_indicator_table.php b/database/migrations/2025_01_28_120615_create_indicator_table.php index cd67e2e..408252a 100644 --- a/database/migrations/2025_01_28_120615_create_indicator_table.php +++ b/database/migrations/2025_01_28_120615_create_indicator_table.php @@ -11,7 +11,7 @@ */ public function up(): void { - Schema::create('indicator', function (Blueprint $table) { + Schema::create('indicators', function (Blueprint $table) { $table->id(); $table->string('name'); $table->string('description'); diff --git a/database/migrations/2025_01_29_054112_create_rules_table.php b/database/migrations/2025_01_29_054112_create_rules_table.php new file mode 100644 index 0000000..85fa65c --- /dev/null +++ b/database/migrations/2025_01_29_054112_create_rules_table.php @@ -0,0 +1,36 @@ +id(); + $table->unsignedBigInteger('indicator_id'); + $table->float('range_min'); + $table->float('range_max'); + $table->float('mb'); + $table->float('md'); + $table->timestamps(); + }); + + Schema::table('rules', function (Blueprint $table) { + $table->foreign('indicator_id')->references('id')->on('indicators')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('rules'); + } +}; diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 4ec4266..f8e07b9 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -22,7 +22,8 @@ public function run(): void $this->call([ UsersSeeder::class, LandSeeder::class, - IndicatorSeeder::class + IndicatorSeeder::class, + RuleSeeder::class ]); } } diff --git a/database/seeders/RuleSeeder.php b/database/seeders/RuleSeeder.php new file mode 100644 index 0000000..acf87ba --- /dev/null +++ b/database/seeders/RuleSeeder.php @@ -0,0 +1,75 @@ + 1, + 'range_min' => 5.5, + 'range_max' => 6.0, + 'mb' => 0.8, + 'md' => 0.2 + ]), + Rule::create([ + 'indicator_id' => 1, + 'range_min' => 6.0, + 'range_max' => 7.0, + 'mb' => 1.0, + 'md' => 0.0 + ]), + Rule::create([ + 'indicator_id' => 2, + 'range_min' => 0, + 'range_max' => 500, + 'mb' => 0.9, + 'md' => 0.1 + ]), + Rule::create([ + 'indicator_id' => 2, + 'range_min' => 500, + 'range_max' => 1000, + 'mb' => 0.8, + 'md' => 0.2 + ]), + Rule::create([ + 'indicator_id' => 3, + 'range_min' => 70, + 'range_max' => 85, + 'mb' => 0.7, + 'md' => 0.3 + ]), + Rule::create([ + 'indicator_id' => 3, + 'range_min' => 85, + 'range_max' => 100, + 'mb' => 1.0, + 'md' => 0.0 + ]), + Rule::create([ + 'indicator_id' => 4, + 'range_min' => 1000, + 'range_max' => 1500, + 'mb' => 0.9, + 'md' => 0.1 + ]), + Rule::create([ + 'indicator_id' => 4, + 'range_min' => 1500, + 'range_max' => 2000, + 'mb' => 1.0, + 'md' => 0.0 + ]), + ]; + } +} diff --git a/public/assets/js/pages/customJs/master-data/aturan/index.js b/public/assets/js/pages/customJs/master-data/aturan/index.js new file mode 100644 index 0000000..5503010 --- /dev/null +++ b/public/assets/js/pages/customJs/master-data/aturan/index.js @@ -0,0 +1,312 @@ +function updateData(rule) { + console.log(rule); + var form = document.getElementById("edit-form"); + var indicatorName = form.querySelector('input[id="indicatorname-field"]'); + var rangMin = form.querySelector('input[id="rangemin-field"]'); + var rangMax = form.querySelector('input[id="rangemax-field"]'); + var mb = form.querySelector('input[id="mb-field"]'); + var md = form.querySelector('input[id="md-field"]'); + + indicatorName.value = rule.indicator.name; + rangMin.value = rule.range_min; + rangMax.value = rule.range_max; + mb.value = rule.mb; + md.value = rule.md; + form.action = "/data-aturan/" + rule.id; +} + +var perPage = 10, + options = { + valueNames: [ + "id", + "indicator_name", + "range_min", + "range_max", + "mb", + "status", + ], + page: perPage, + pagination: !0, + plugins: [ListPagination({ left: 2, right: 2 })], + }, + customerList = new List("customerList", options).on( + "updated", + function (e) { + 0 == e.matchingItems.length + ? (document.getElementsByClassName( + "noresult" + )[0].style.display = "block") + : (document.getElementsByClassName( + "noresult" + )[0].style.display = "none"); + var t = 1 == e.i, + a = e.i > e.matchingItems.length - e.page; + document.querySelector(".pagination-prev.disabled") && + document + .querySelector(".pagination-prev.disabled") + .classList.remove("disabled"), + document.querySelector(".pagination-next.disabled") && + document + .querySelector(".pagination-next.disabled") + .classList.remove("disabled"), + t && + document + .querySelector(".pagination-prev") + .classList.add("disabled"), + a && + document + .querySelector(".pagination-next") + .classList.add("disabled"), + e.matchingItems.length <= perPage + ? (document.querySelector( + ".pagination-wrap" + ).style.display = "none") + : (document.querySelector( + ".pagination-wrap" + ).style.display = "flex"), + e.matchingItems.length == perPage && + document + .querySelector(".pagination.listjs-pagination") + .firstElementChild.children[0].click(), + 0 < e.matchingItems.length + ? (document.getElementsByClassName( + "noresult" + )[0].style.display = "none") + : (document.getElementsByClassName( + "noresult" + )[0].style.display = "block"); + } + ); +isCount = new DOMParser().parseFromString( + customerList.items.slice(-1)[0]._values.id, + "text/html" +); +var isValue = isCount.body.firstElementChild.innerHTML, + idField = document.getElementById("id-field"), + customerNameField = document.getElementById("customername-field"), + emailField = document.getElementById("email-field"), + dateField = document.getElementById("date-field"), + phoneField = document.getElementById("phone-field"), + statusField = document.getElementById("status-field"), + addBtn = document.getElementById("add-btn"), + editBtn = document.getElementById("edit-btn"), + removeBtns = document.getElementsByClassName("remove-item-btn"), + editBtns = document.getElementsByClassName("edit-item-btn"); +function filterContact(e) { + var t = e; + customerList.filter(function (e) { + matchData = new DOMParser().parseFromString( + e.values().status, + "text/html" + ); + e = matchData.body.firstElementChild.innerHTML; + return "All" == e || "All" == t || e == t; + }), + customerList.update(); +} +function updateList() { + var a = document.querySelector("input[name=status]:checked").value; + (data = userList.filter(function (e) { + var t = !1; + return ( + "All" == a + ? (t = !0) + : ((t = e.values().sts == a), console.log(t, "statusFilter")), + t + ); + })), + userList.update(); +} +refreshCallbacks(), + filterContact("All"), + document + .getElementById("showModal") + .addEventListener("show.bs.modal", function (e) { + e.relatedTarget.classList.contains("edit-item-btn") + ? ((document.getElementById("exampleModalLabel").innerHTML = + "Edit Aturan"), + (document + .getElementById("showModal") + .querySelector(".modal-footer").style.display = "block"), + // (document.getElementById("add-btn").style.display = "none"), + (document.getElementById("edit-btn").style.display = "block")) + : e.relatedTarget.classList.contains("add-btn") + ? ((document.getElementById("exampleModalLabel").innerHTML = + "Add Customer"), + (document + .getElementById("showModal") + .querySelector(".modal-footer").style.display = "block"), + (document.getElementById("edit-btn").style.display = "none"), + (document.getElementById("add-btn").style.display = "block")) + : ((document.getElementById("exampleModalLabel").innerHTML = + "List Customer"), + (document + .getElementById("showModal") + .querySelector(".modal-footer").style.display = "none")); + }), + ischeckboxcheck(), + document + .getElementById("showModal") + .addEventListener("hidden.bs.modal", function () {}), + document + .querySelector("#customerList") + .addEventListener("click", function () { + refreshCallbacks(), ischeckboxcheck(); + }); +var table = document.getElementById("customerTable"), + tr = table.getElementsByTagName("tr"), + trlist = table.querySelectorAll(".list tr"), + count = Number(isValue.replace(/[^0-9]/g, "")) + 1; +// addBtn.addEventListener("click", function (e) { +// "" !== customerNameField.value && +// "" !== emailField.value && +// "" !== dateField.value && +// "" !== phoneField.value && +// (customerList.add({ +// id: +// '#VZ' + +// count + +// "", +// customer_name: customerNameField.value, +// email: emailField.value, +// date: dateField.value, +// phone: phoneField.value, +// status: isStatus(statusField.value), +// }), +// document.getElementById("close-modal").click(), +// clearFields(), +// refreshCallbacks(), +// filterContact("All"), +// count++); +// }), +editBtn.addEventListener("click", function (e) { + (document.getElementById("exampleModalLabel").innerHTML = "Edit Customer"), + customerList.get({ id: idField.value }).forEach(function (e) { + (isid = new DOMParser().parseFromString(e._values.id, "text/html")), + isid.body.firstElementChild.innerHTML == itemId && + e.values({ + id: + '' + + idField.value + + "", + customer_name: customerNameField.value, + email: emailField.value, + date: dateField.value, + phone: phoneField.value, + status: isStatus(statusField.value), + }); + }), + document.getElementById("close-modal").click(), + clearFields(); +}); +// var statusVal = new Choices(statusField); +function isStatus(e) { + switch (e) { + case "Active": + return ( + '' + + e + + "" + ); + case "Block": + return ( + '' + + e + + "" + ); + } +} +function ischeckboxcheck() { + document.getElementsByName("checkAll").forEach(function (e) { + e.addEventListener("click", function (e) { + e.target.checked + ? e.target.closest("tr").classList.add("table-active") + : e.target.closest("tr").classList.remove("table-active"); + }); + }); +} +function refreshCallbacks() { + removeBtns.forEach(function (e) { + e.addEventListener("click", function (e) { + e.target.closest("tr").children[1].innerText, + (itemId = e.target.closest("tr").children[1].innerText), + customerList.get({ id: itemId }).forEach(function (e) { + deleteid = new DOMParser().parseFromString( + e._values.id, + "text/html" + ); + var t = deleteid.body.firstElementChild; + deleteid.body.firstElementChild.innerHTML == itemId && + document + .getElementById("delete-record") + .addEventListener("click", function () { + customerList.remove("id", t.outerHTML), + document + .getElementById("deleteRecordModal") + .click(); + }); + }); + }); + }), + editBtns.forEach(function (e) { + e.addEventListener("click", function (e) { + e.target.closest("tr").children[1].innerText, + (itemId = e.target.closest("tr").children[1].innerText), + customerList.get({ id: itemId }).forEach(function (e) { + isid = new DOMParser().parseFromString( + e._values.id, + "text/html" + ); + var t = isid.body.firstElementChild.innerHTML; + t == itemId && + ((idField.value = t), + (customerNameField.value = e._values.customer_name), + (emailField.value = e._values.email), + (dateField.value = e._values.date), + (phoneField.value = e._values.phone), + statusVal && statusVal.destroy(), + (statusVal = new Choices(statusField)), + (val = new DOMParser().parseFromString( + e._values.status, + "text/html" + )), + (t = val.body.firstElementChild.innerHTML), + statusVal.setChoiceByValue(t), + flatpickr("#date-field", { + dateFormat: "d M, Y", + defaultDate: e._values.date, + })); + }); + }); + }); +} +// function clearFields() { +// (customerNameField.value = ""), +// (emailField.value = ""), +// (dateField.value = ""), +// (phoneField.value = ""); +// } +document + .querySelector(".pagination-next") + .addEventListener("click", function () { + !document.querySelector(".pagination.listjs-pagination") || + (document + .querySelector(".pagination.listjs-pagination") + .querySelector(".active") && + document + .querySelector(".pagination.listjs-pagination") + .querySelector(".active") + .nextElementSibling.children[0].click()); + }), + document + .querySelector(".pagination-prev") + .addEventListener("click", function () { + !document.querySelector(".pagination.listjs-pagination") || + (document + .querySelector(".pagination.listjs-pagination") + .querySelector(".active") && + document + .querySelector(".pagination.listjs-pagination") + .querySelector(".active") + .previousSibling.children[0].click()); + }); diff --git a/resources/views/master-data/aturan/index.blade.php b/resources/views/master-data/aturan/index.blade.php new file mode 100644 index 0000000..8397d37 --- /dev/null +++ b/resources/views/master-data/aturan/index.blade.php @@ -0,0 +1,257 @@ +@extends('layouts.app') +@push('title', 'Data Aturan') +@section('content') +
+
+ +
+
+
+

Data Aturan

+ +
+ +
+
+
+
+ + +
+
+
+
+

Data Aturan

+
+ + +
+
+
+ {{--
+
+ +
+
--}} +
+
+ +
+
+
+ +
+ + + + + + + + + + + + + + @foreach ($rules as $rule) + + + + + + + + + + + @endforeach + +
+ No + + Indikator + Range MinRange Max + Meansure Belief + + Meansure Disbelief + Action
{{ $loop->iteration }}{{ $rule->indicator->name }}{{ $rule->range_min }}{{ $rule->range_max }}{{ $rule->mb }} + {{ $rule->md }} + +
+
+ +
+ {{--
+ +
--}} +
+
+ +
+ + +
+
+ +
+ +
+ +
+ + + {{-- edit modal --}} + + + + + +
+ +
+ + + @push('other-js') + + + + + + + + + + @endpush +@endsection diff --git a/resources/views/partials/sidebar.blade.php b/resources/views/partials/sidebar.blade.php index 34a4087..e08733d 100644 --- a/resources/views/partials/sidebar.blade.php +++ b/resources/views/partials/sidebar.blade.php @@ -69,6 +69,12 @@ class="nav-link {{ request()->routeIs('master_data.indikator.*') ? 'active' : '' data-key="t-calendar"> Indikator + diff --git a/routes/web.php b/routes/web.php index 17a8a49..e313953 100644 --- a/routes/web.php +++ b/routes/web.php @@ -7,6 +7,7 @@ use App\Http\Controllers\DashboardController; use App\Http\Controllers\MasterData\IndicatorController; use App\Http\Controllers\MasterData\LandController; +use App\Http\Controllers\MasterData\RuleController; use App\Http\Controllers\MasterData\UserController; use Illuminate\Routing\RouteGroup; use Illuminate\Support\Facades\Route; @@ -82,5 +83,12 @@ Route::put('/{id}', 'update')->name('update'); // Route::delete('/{id}', 'destroy')->name('destroy'); }); + + Route::prefix('data-aturan')->controller(RuleController::class)->name('aturan.')->group(function () { + Route::get('/', 'index')->name('index'); + // Route::post('/', 'store')->name('store'); + Route::put('/{id}', 'update')->name('update'); + // Route::delete('/{id}', 'destroy')->name('destroy'); + }); }); }); From 40746fdeec02e729712c389a1d76cddb81d0d0e9 Mon Sep 17 00:00:00 2001 From: arieeefajar Date: Thu, 30 Jan 2025 21:03:38 +0700 Subject: [PATCH 2/3] feat(master-rule): create func update rule --- .../Controllers/MasterData/RuleController.php | 47 +++ composer.json | 1 + composer.lock | 158 ++++++++- config/app.php | 1 + config/debugbar.php | 329 ++++++++++++++++++ storage/debugbar/.gitignore | 2 + 6 files changed, 535 insertions(+), 3 deletions(-) create mode 100644 config/debugbar.php create mode 100644 storage/debugbar/.gitignore diff --git a/app/Http/Controllers/MasterData/RuleController.php b/app/Http/Controllers/MasterData/RuleController.php index d6e4687..aadd327 100644 --- a/app/Http/Controllers/MasterData/RuleController.php +++ b/app/Http/Controllers/MasterData/RuleController.php @@ -4,13 +4,60 @@ use App\Http\Controllers\Controller; use App\Models\Rule; +use Barryvdh\Debugbar\Facades\Debugbar; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Validator; class RuleController extends Controller { public function index() { $rules = Rule::with('indicator')->get(); + Debugbar::info($rules); return view('master-data.aturan.index', compact('rules')); } + + public function update(Request $request, $id) + { + $customMessage = [ + 'range_min.required' => 'Nilai minimum wajib diisi', + 'range_min.numeric' => 'Nilai minimum harus berupa angka', + + 'range_max.required' => 'Nilai maksimum wajib diisi', + 'range_max.numeric' => 'Nilai maksimum harus berupa angka', + + 'mb.required' => 'Nilai MB wajib diisi', + 'mb.numeric' => 'Nilai MB harus berupa angka', + + 'md.required' => 'Nilai MD wajib diisi', + 'md.numeric' => 'Nilai MD harus berupa angka', + ]; + + $validator = Validator::make($request->all(), [ + 'range_min' => 'required|numeric', + 'range_max' => 'required|numeric', + 'mb' => 'required|numeric', + 'md' => 'required|numeric', + ], $customMessage); + + if ($validator->fails()) { + toast($validator->messages()->all()[0], 'error')->position('top')->autoclose(3000); + return redirect()->back()->withInput(); + } + + $rule = Rule::find($id); + $rule->range_min = $request->range_min; + $rule->range_max = $request->range_max; + $rule->mb = $request->mb; + $rule->md = $request->md; + + try { + $rule->save(); + toast('Berhasil mengubah aturan', 'success')->position('top-right')->autoclose(3000); + return redirect()->back(); + } catch (\Throwable $th) { + toast('Terjadi kesalahan', 'error')->position('top')->autoclose(3000); + return redirect()->back(); + } + } } diff --git a/composer.json b/composer.json index c6233ce..84990e0 100644 --- a/composer.json +++ b/composer.json @@ -13,6 +13,7 @@ "realrashid/sweet-alert": "^7.2" }, "require-dev": { + "barryvdh/laravel-debugbar": "^3.14", "fakerphp/faker": "^1.9.1", "laravel/breeze": "^1.29", "laravel/pint": "^1.0", diff --git a/composer.lock b/composer.lock index 87dde3c..2e42bba 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "ea96edc96e7f0cc854db1906b2ad32d3", + "content-hash": "18178228d0a2447f52545790902849cc", "packages": [ { "name": "brick/math", @@ -5697,6 +5697,90 @@ } ], "packages-dev": [ + { + "name": "barryvdh/laravel-debugbar", + "version": "v3.14.10", + "source": { + "type": "git", + "url": "https://github.com/barryvdh/laravel-debugbar.git", + "reference": "56b9bd235e3fe62e250124804009ce5bab97cc63" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/56b9bd235e3fe62e250124804009ce5bab97cc63", + "reference": "56b9bd235e3fe62e250124804009ce5bab97cc63", + "shasum": "" + }, + "require": { + "illuminate/routing": "^9|^10|^11", + "illuminate/session": "^9|^10|^11", + "illuminate/support": "^9|^10|^11", + "maximebf/debugbar": "~1.23.0", + "php": "^8.0", + "symfony/finder": "^6|^7" + }, + "require-dev": { + "mockery/mockery": "^1.3.3", + "orchestra/testbench-dusk": "^5|^6|^7|^8|^9", + "phpunit/phpunit": "^9.6|^10.5", + "squizlabs/php_codesniffer": "^3.5" + }, + "type": "library", + "extra": { + "laravel": { + "aliases": { + "Debugbar": "Barryvdh\\Debugbar\\Facades\\Debugbar" + }, + "providers": [ + "Barryvdh\\Debugbar\\ServiceProvider" + ] + }, + "branch-alias": { + "dev-master": "3.14-dev" + } + }, + "autoload": { + "files": [ + "src/helpers.php" + ], + "psr-4": { + "Barryvdh\\Debugbar\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Barry vd. Heuvel", + "email": "barryvdh@gmail.com" + } + ], + "description": "PHP Debugbar integration for Laravel", + "keywords": [ + "debug", + "debugbar", + "laravel", + "profiler", + "webprofiler" + ], + "support": { + "issues": "https://github.com/barryvdh/laravel-debugbar/issues", + "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.14.10" + }, + "funding": [ + { + "url": "https://fruitcake.nl", + "type": "custom" + }, + { + "url": "https://github.com/barryvdh", + "type": "github" + } + ], + "time": "2024-12-23T10:10:42+00:00" + }, { "name": "fakerphp/faker", "version": "v1.23.1", @@ -6073,6 +6157,74 @@ }, "time": "2024-10-29T20:18:14+00:00" }, + { + "name": "maximebf/debugbar", + "version": "v1.23.5", + "source": { + "type": "git", + "url": "https://github.com/php-debugbar/php-debugbar.git", + "reference": "eeabd61a1f19ba5dcd5ac4585a477130ee03ce25" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-debugbar/php-debugbar/zipball/eeabd61a1f19ba5dcd5ac4585a477130ee03ce25", + "reference": "eeabd61a1f19ba5dcd5ac4585a477130ee03ce25", + "shasum": "" + }, + "require": { + "php": "^7.2|^8", + "psr/log": "^1|^2|^3", + "symfony/var-dumper": "^4|^5|^6|^7" + }, + "require-dev": { + "dbrekelmans/bdi": "^1", + "phpunit/phpunit": "^8|^9", + "symfony/panther": "^1|^2.1", + "twig/twig": "^1.38|^2.7|^3.0" + }, + "suggest": { + "kriswallsmith/assetic": "The best way to manage assets", + "monolog/monolog": "Log using Monolog", + "predis/predis": "Redis storage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.23-dev" + } + }, + "autoload": { + "psr-4": { + "DebugBar\\": "src/DebugBar/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Maxime Bouroumeau-Fuseau", + "email": "maxime.bouroumeau@gmail.com", + "homepage": "http://maximebf.com" + }, + { + "name": "Barry vd. Heuvel", + "email": "barryvdh@gmail.com" + } + ], + "description": "Debug bar in the browser for php application", + "homepage": "https://github.com/maximebf/php-debugbar", + "keywords": [ + "debug", + "debugbar" + ], + "support": { + "issues": "https://github.com/php-debugbar/php-debugbar/issues", + "source": "https://github.com/php-debugbar/php-debugbar/tree/v1.23.5" + }, + "time": "2024-12-15T19:20:42+00:00" + }, { "name": "mockery/mockery", "version": "1.6.12", @@ -8273,12 +8425,12 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": {}, "prefer-stable": true, "prefer-lowest": false, "platform": { "php": "^8.1" }, - "platform-dev": [], + "platform-dev": {}, "plugin-api-version": "2.6.0" } diff --git a/config/app.php b/config/app.php index 962e916..51cd73b 100644 --- a/config/app.php +++ b/config/app.php @@ -186,6 +186,7 @@ * Package Service Providers... */ RealRashid\SweetAlert\SweetAlertServiceProvider::class, + Barryvdh\Debugbar\ServiceProvider::class, /* * Application Service Providers... diff --git a/config/debugbar.php b/config/debugbar.php new file mode 100644 index 0000000..b428115 --- /dev/null +++ b/config/debugbar.php @@ -0,0 +1,329 @@ + env('DEBUGBAR_ENABLED', true), + 'hide_empty_tabs' => false, // Hide tabs until they have content + 'except' => [ + 'telescope*', + 'horizon*', + ], + + /* + |-------------------------------------------------------------------------- + | Storage settings + |-------------------------------------------------------------------------- + | + | Debugbar stores data for session/ajax requests. + | You can disable this, so the debugbar stores data in headers/session, + | but this can cause problems with large data collectors. + | By default, file storage (in the storage folder) is used. Redis and PDO + | can also be used. For PDO, run the package migrations first. + | + | Warning: Enabling storage.open will allow everyone to access previous + | request, do not enable open storage in publicly available environments! + | Specify a callback if you want to limit based on IP or authentication. + | Leaving it to null will allow localhost only. + */ + 'storage' => [ + 'enabled' => true, + 'open' => env('DEBUGBAR_OPEN_STORAGE'), // bool/callback. + 'driver' => 'file', // redis, file, pdo, socket, custom + 'path' => storage_path('debugbar'), // For file driver + 'connection' => null, // Leave null for default connection (Redis/PDO) + 'provider' => '', // Instance of StorageInterface for custom driver + 'hostname' => '127.0.0.1', // Hostname to use with the "socket" driver + 'port' => 2304, // Port to use with the "socket" driver + ], + + /* + |-------------------------------------------------------------------------- + | Editor + |-------------------------------------------------------------------------- + | + | Choose your preferred editor to use when clicking file name. + | + | Supported: "phpstorm", "vscode", "vscode-insiders", "vscode-remote", + | "vscode-insiders-remote", "vscodium", "textmate", "emacs", + | "sublime", "atom", "nova", "macvim", "idea", "netbeans", + | "xdebug", "espresso" + | + */ + + 'editor' => env('DEBUGBAR_EDITOR') ?: env('IGNITION_EDITOR', 'phpstorm'), + + /* + |-------------------------------------------------------------------------- + | Remote Path Mapping + |-------------------------------------------------------------------------- + | + | If you are using a remote dev server, like Laravel Homestead, Docker, or + | even a remote VPS, it will be necessary to specify your path mapping. + | + | Leaving one, or both of these, empty or null will not trigger the remote + | URL changes and Debugbar will treat your editor links as local files. + | + | "remote_sites_path" is an absolute base path for your sites or projects + | in Homestead, Vagrant, Docker, or another remote development server. + | + | Example value: "/home/vagrant/Code" + | + | "local_sites_path" is an absolute base path for your sites or projects + | on your local computer where your IDE or code editor is running on. + | + | Example values: "/Users//Code", "C:\Users\\Documents\Code" + | + */ + + 'remote_sites_path' => env('DEBUGBAR_REMOTE_SITES_PATH'), + 'local_sites_path' => env('DEBUGBAR_LOCAL_SITES_PATH', env('IGNITION_LOCAL_SITES_PATH')), + + /* + |-------------------------------------------------------------------------- + | Vendors + |-------------------------------------------------------------------------- + | + | Vendor files are included by default, but can be set to false. + | This can also be set to 'js' or 'css', to only include javascript or css vendor files. + | Vendor files are for css: font-awesome (including fonts) and highlight.js (css files) + | and for js: jquery and highlight.js + | So if you want syntax highlighting, set it to true. + | jQuery is set to not conflict with existing jQuery scripts. + | + */ + + 'include_vendors' => true, + + /* + |-------------------------------------------------------------------------- + | Capture Ajax Requests + |-------------------------------------------------------------------------- + | + | The Debugbar can capture Ajax requests and display them. If you don't want this (ie. because of errors), + | you can use this option to disable sending the data through the headers. + | + | Optionally, you can also send ServerTiming headers on ajax requests for the Chrome DevTools. + | + | Note for your request to be identified as ajax requests they must either send the header + | X-Requested-With with the value XMLHttpRequest (most JS libraries send this), or have application/json as a Accept header. + | + | By default `ajax_handler_auto_show` is set to true allowing ajax requests to be shown automatically in the Debugbar. + | Changing `ajax_handler_auto_show` to false will prevent the Debugbar from reloading. + */ + + 'capture_ajax' => true, + 'add_ajax_timing' => false, + 'ajax_handler_auto_show' => true, + 'ajax_handler_enable_tab' => true, + + /* + |-------------------------------------------------------------------------- + | Custom Error Handler for Deprecated warnings + |-------------------------------------------------------------------------- + | + | When enabled, the Debugbar shows deprecated warnings for Symfony components + | in the Messages tab. + | + */ + 'error_handler' => false, + + /* + |-------------------------------------------------------------------------- + | Clockwork integration + |-------------------------------------------------------------------------- + | + | The Debugbar can emulate the Clockwork headers, so you can use the Chrome + | Extension, without the server-side code. It uses Debugbar collectors instead. + | + */ + 'clockwork' => false, + + /* + |-------------------------------------------------------------------------- + | DataCollectors + |-------------------------------------------------------------------------- + | + | Enable/disable DataCollectors + | + */ + + 'collectors' => [ + 'phpinfo' => true, // Php version + 'messages' => true, // Messages + 'time' => true, // Time Datalogger + 'memory' => true, // Memory usage + 'exceptions' => true, // Exception displayer + 'log' => true, // Logs from Monolog (merged in messages if enabled) + 'db' => true, // Show database (PDO) queries and bindings + 'views' => true, // Views with their data + 'route' => true, // Current route information + 'auth' => false, // Display Laravel authentication status + 'gate' => true, // Display Laravel Gate checks + 'session' => true, // Display session data + 'symfony_request' => true, // Only one can be enabled.. + 'mail' => true, // Catch mail messages + 'laravel' => false, // Laravel version and environment + 'events' => false, // All events fired + 'default_request' => false, // Regular or special Symfony request logger + 'logs' => false, // Add the latest log messages + 'files' => false, // Show the included files + 'config' => false, // Display config settings + 'cache' => false, // Display cache events + 'models' => true, // Display models + 'livewire' => true, // Display Livewire (when available) + 'jobs' => false, // Display dispatched jobs + 'pennant' => false, // Display Pennant feature flags + ], + + /* + |-------------------------------------------------------------------------- + | Extra options + |-------------------------------------------------------------------------- + | + | Configure some DataCollectors + | + */ + + 'options' => [ + 'time' => [ + 'memory_usage' => false, // Calculated by subtracting memory start and end, it may be inaccurate + ], + 'messages' => [ + 'trace' => true, // Trace the origin of the debug message + ], + 'memory' => [ + 'reset_peak' => false, // run memory_reset_peak_usage before collecting + 'with_baseline' => false, // Set boot memory usage as memory peak baseline + 'precision' => 0, // Memory rounding precision + ], + 'auth' => [ + 'show_name' => true, // Also show the users name/email in the debugbar + 'show_guards' => true, // Show the guards that are used + ], + 'db' => [ + 'with_params' => true, // Render SQL with the parameters substituted + 'exclude_paths' => [ // Paths to exclude entirely from the collector + // 'vendor/laravel/framework/src/Illuminate/Session', // Exclude sessions queries + ], + 'backtrace' => true, // Use a backtrace to find the origin of the query in your files. + 'backtrace_exclude_paths' => [], // Paths to exclude from backtrace. (in addition to defaults) + 'timeline' => false, // Add the queries to the timeline + 'duration_background' => true, // Show shaded background on each query relative to how long it took to execute. + 'explain' => [ // Show EXPLAIN output on queries + 'enabled' => false, + ], + 'hints' => false, // Show hints for common mistakes + 'show_copy' => true, // Show copy button next to the query, + 'slow_threshold' => false, // Only track queries that last longer than this time in ms + 'memory_usage' => false, // Show queries memory usage + 'soft_limit' => 100, // After the soft limit, no parameters/backtrace are captured + 'hard_limit' => 500, // After the hard limit, queries are ignored + ], + 'mail' => [ + 'timeline' => false, // Add mails to the timeline + 'show_body' => true, + ], + 'views' => [ + 'timeline' => false, // Add the views to the timeline (Experimental) + 'data' => false, // True for all data, 'keys' for only names, false for no parameters. + 'group' => 50, // Group duplicate views. Pass value to auto-group, or true/false to force + 'exclude_paths' => [ // Add the paths which you don't want to appear in the views + 'vendor/filament' // Exclude Filament components by default + ], + ], + 'route' => [ + 'label' => true, // Show complete route on bar + ], + 'session' => [ + 'hiddens' => [], // Hides sensitive values using array paths + ], + 'symfony_request' => [ + 'hiddens' => [], // Hides sensitive values using array paths, example: request_request.password + ], + 'events' => [ + 'data' => false, // Collect events data, listeners + ], + 'logs' => [ + 'file' => null, + ], + 'cache' => [ + 'values' => true, // Collect cache values + ], + ], + + /* + |-------------------------------------------------------------------------- + | Inject Debugbar in Response + |-------------------------------------------------------------------------- + | + | Usually, the debugbar is added just before , by listening to the + | Response after the App is done. If you disable this, you have to add them + | in your template yourself. See http://phpdebugbar.com/docs/rendering.html + | + */ + + 'inject' => true, + + /* + |-------------------------------------------------------------------------- + | Debugbar route prefix + |-------------------------------------------------------------------------- + | + | Sometimes you want to set route prefix to be used by Debugbar to load + | its resources from. Usually the need comes from misconfigured web server or + | from trying to overcome bugs like this: http://trac.nginx.org/nginx/ticket/97 + | + */ + 'route_prefix' => '_debugbar', + + /* + |-------------------------------------------------------------------------- + | Debugbar route middleware + |-------------------------------------------------------------------------- + | + | Additional middleware to run on the Debugbar routes + */ + 'route_middleware' => [], + + /* + |-------------------------------------------------------------------------- + | Debugbar route domain + |-------------------------------------------------------------------------- + | + | By default Debugbar route served from the same domain that request served. + | To override default domain, specify it as a non-empty value. + */ + 'route_domain' => null, + + /* + |-------------------------------------------------------------------------- + | Debugbar theme + |-------------------------------------------------------------------------- + | + | Switches between light and dark theme. If set to auto it will respect system preferences + | Possible values: auto, light, dark + */ + 'theme' => env('DEBUGBAR_THEME', 'auto'), + + /* + |-------------------------------------------------------------------------- + | Backtrace stack limit + |-------------------------------------------------------------------------- + | + | By default, the Debugbar limits the number of frames returned by the 'debug_backtrace()' function. + | If you need larger stacktraces, you can increase this number. Setting it to 0 will result in no limit. + */ + 'debug_backtrace_limit' => 50, +]; diff --git a/storage/debugbar/.gitignore b/storage/debugbar/.gitignore new file mode 100644 index 0000000..d6b7ef3 --- /dev/null +++ b/storage/debugbar/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore From 6d608946f21a40dbc2887c347cc363b9bd7232e4 Mon Sep 17 00:00:00 2001 From: arieeefajar Date: Fri, 31 Jan 2025 14:34:31 +0700 Subject: [PATCH 3/3] feat(master-rule): make func input number --- .../customJs/master-data/aturan/index.js | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/public/assets/js/pages/customJs/master-data/aturan/index.js b/public/assets/js/pages/customJs/master-data/aturan/index.js index 5503010..47f7e2d 100644 --- a/public/assets/js/pages/customJs/master-data/aturan/index.js +++ b/public/assets/js/pages/customJs/master-data/aturan/index.js @@ -1,3 +1,24 @@ +document.addEventListener("DOMContentLoaded", function () { + const inputs = document.querySelectorAll( + "#rangemin-field, #rangemax-field", + "#mb-field", + "#md-field" + ); + + inputs.forEach((input) => { + input.addEventListener("input", function () { + this.value = this.value.replace(/[^0-9.]/g, ""); + this.value = this.value.replace(/^(\.)/, ""); + if ((this.value.match(/\./g) || []).length > 1) { + this.value = this.value.substring( + 0, + this.value.lastIndexOf(".") + ); + } + }); + }); +}); + function updateData(rule) { console.log(rule); var form = document.getElementById("edit-form");