From b53611bc0bca2f39dd09bba1831ae764fd912955 Mon Sep 17 00:00:00 2001 From: arieeefajar Date: Wed, 29 Jan 2025 21:41:23 +0700 Subject: [PATCH] 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'); + }); }); });