fix(master-rule): fix update function and create validation input cf Value

This commit is contained in:
arieeefajar 2025-03-26 19:17:37 +07:00
parent 9270eda907
commit a6d7bd6bed
3 changed files with 209 additions and 136 deletions

View File

@ -14,7 +14,6 @@ public function index()
{
$rules = Indicator::with('rules')->get();
$indicators = Indicator::select('id', 'name')->get();
// dd($rules);
return view('master-data.aturan.index', compact('rules', 'indicators'));
}
@ -24,21 +23,20 @@ public function store(Request $request)
'indicator.required' => 'Harap pilih indikator',
'indicator.exists' => 'Indikator tidak ditemukan',
'ideal_min.required' => 'Nilai minimum wajib diisi',
'ideal_min.numeric' => 'Nilai minimum harus berupa angka',
'parameter_type.required' => 'Jenis parameter wajib diisi',
'parameter_type.string' => 'Jenis parameter harus berupa teks',
'parameter_type.max' => 'Jenis parameter maksimal 25 karakter',
'ideal_max.required' => 'Nilai maksimum wajib diisi',
'ideal_max.numeric' => 'Nilai maksimum harus berupa angka',
'mb.required' => 'Nilai MB wajib diisi',
'mb.numeric' => 'Nilai MB harus berupa angka',
'description.required' => 'Deskripsi wajib diisi',
'description.string' => 'Deskripsi harus berupa teks',
'description.max' => 'Deskripsi maksimal 40 karakter',
];
$validator = Validator::make($request->all(), [
'indicator' => 'required|exists:indicators,id',
'ideal_min' => 'required|numeric',
'ideal_max' => 'required|numeric',
'mb' => 'required|numeric',
'parameter_type' => 'required|string|max:25',
'description' => 'required|string|max:40',
'cf' => 'required|numeric|min:-8|max:1',
], $customMessage);
if ($validator->fails()) {
@ -47,11 +45,10 @@ public function store(Request $request)
}
$rule = new Rule();
$rule->indicator_id = $request->indicator;
$rule->ideal_min = $request->ideal_min;
$rule->ideal_max = $request->ideal_max;
$rule->mb = $request->mb;
$rule->parameter_type = $request->parameter_type;
$rule->description = $request->description;
$rule->cf = $request->cf;
try {
$rule->save();
@ -65,25 +62,25 @@ public function store(Request $request)
public function update(Request $request, $id)
{
// dd($request->all());
$customMessage = [
'indicator.required' => 'Harap pilih indikator',
'indicator.exists' => 'Indikator tidak ditemukan',
'parameter_type.required' => 'Jenis parameter wajib diisi',
'parameter_type.string' => 'Jenis parameter harus berupa teks',
'parameter_type.max' => 'Jenis parameter maksimal 25 karakter',
'ideal_min.required' => 'Nilai minimum wajib diisi',
'ideal_min.numeric' => 'Nilai minimum harus berupa angka',
'description.required' => 'Deskripsi wajib diisi',
'description.string' => 'Deskripsi harus berupa teks',
'description.max' => 'Deskripsi maksimal 40 karakter',
'ideal_max.required' => 'Nilai maksimum wajib diisi',
'ideal_max.numeric' => 'Nilai maksimum harus berupa angka',
'mb.required' => 'Nilai MB wajib diisi',
'mb.numeric' => 'Nilai MB harus berupa angka',
'cf.required' => 'Nilai CF wajib diisi',
'cf.numeric' => 'Nilai CF harus berupa angka',
'cf.max' => 'Nilai CF maksimal 1',
];
$validator = Validator::make($request->all(), [
'indicator' => 'required|exists:indicators,id',
'ideal_min' => 'required|numeric',
'ideal_max' => 'required|numeric',
'mb' => 'required|numeric',
'parameter_type' => 'required|string|max:25',
'description' => 'required|string|max:40',
'cf' => 'required|numeric|max:1',
], $customMessage);
if ($validator->fails()) {
@ -92,9 +89,9 @@ public function update(Request $request, $id)
}
$rule = Rule::find($id);
$rule->ideal_min = $request->ideal_min;
$rule->ideal_max = $request->ideal_max;
$rule->mb = $request->mb;
$rule->parameter_type = $request->parameter_type;
$rule->description = $request->description;
$rule->cf = $request->cf;
try {
$rule->save();

View File

@ -1,57 +1,15 @@
document.addEventListener("DOMContentLoaded", function () {
const inputs = document.querySelectorAll(
"#idealmin-field, #idealmax-field",
"#mb-field"
);
const inputEdit = document.querySelectorAll(
"#idealmin-edit-field, #idealmax-edit-field",
"#mb-edit-field"
);
var indicatorField = document.getElementById("indicator-field");
var indicatorVal = new Choices(indicatorField);
var indicatorEditField = document.getElementById("indicator-edit-field");
var indicatorEditVal = new Choices(indicatorEditField);
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(".")
);
}
});
});
inputEdit.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(".")
);
}
});
});
});
document.addEventListener("DOMContentLoaded", function () {});
function updateData(rule) {
var form = document.getElementById("edit-form");
// var indicatorName = form.querySelector('input[id="indicatorname-field"]');
var idealMin = form.querySelector('input[id="idealmin-edit-field"]');
var idealMax = form.querySelector('input[id="idealmax-edit-field"]');
var mb = form.querySelector('input[id="mb-edit-field"]');
// indicatorName.value = rule.indicator.name;
idealMin.value = rule.ideal_max;
idealMax.value = rule.ideal_min;
mb.value = rule.mb;
var indicatorType = form.querySelector("#indicator-type-edit-field");
var description = form.querySelector("#description-edit-field");
var cf = form.querySelector("#cf-edit-field");
form.action = "/data-aturan/" + rule.id;
indicatorType.value = rule.parameter_type;
description.value = rule.description;
cf.value = rule.cf;
}
function deleteData(id) {
@ -59,16 +17,53 @@ function deleteData(id) {
form.action = "/data-aturan/" + id;
}
function validateCfInput(input) {
input.value = input.value.replace(",", ".");
input.value = input.value.replace(/[^0-9.\-]/g, "");
if (input.value.includes("-") && !input.value.startsWith("-")) {
input.value = input.value.replace("-", "");
}
input.value = input.value.replace(/-+/g, "-");
if (input.value === "-") {
return;
}
if (input.value.startsWith(".")) {
input.value = "0" + input.value;
}
if (input.value.startsWith("-.")) {
input.value = "-0.";
}
// **PERBAIKAN**: Hilangkan nol berlebih di depan angka, kecuali nol sebelum titik
input.value = input.value.replace(/^(-?)0+(\d)/, "$1$2");
// **BATASI INPUT**: Hanya satu titik desimal, dan maksimal 1 angka setelah titik
let match = input.value.match(/^-?\d*(\.\d{0,1})?/);
if (match) {
input.value = match[0];
}
let numValue = parseFloat(input.value);
// **Batasi nilai antara -1.0 dan 1.0**
if (!isNaN(numValue)) {
if (numValue > 1) {
input.value = "1.0";
} else if (numValue < -1) {
input.value = "-1.0";
}
}
}
var perPage = 10,
options = {
valueNames: [
"id",
"indicator_name",
"range_min",
"range_max",
"mb",
"status",
],
valueNames: ["id", "parameter_type", "description", "status"],
page: perPage,
pagination: !0,
plugins: [ListPagination({ left: 2, right: 2 })],

View File

@ -22,7 +22,101 @@
</div>
<!-- end page title -->
<div class="row g-4 mb-3">
<div class="col-sm-auto">
<div>
<button type="button" class="btn btn-success add-btn" data-bs-toggle="modal" id="create-btn"
data-bs-target="#addModal">
<i class="ri-add-line align-bottom me-1"></i> Tambah
</button>
</div>
</div>
</div>
@foreach ($rules as $rule)
<div class="row">
<div class="col lg-12">
<div class="card">
<div class="card-header">
<h4 class="card-title mb-0">Indikator {{ $rule->name }}</h4>
</div>
<div class="card-body">
<div id="customerList">
<div class="row g-4 mb-3">
<div class="col-sm-auto">
<div class="d-flex justify-content-sm-end">
<div class="search-box ms-2">
<input type="text" class="form-control search"
placeholder="Search..." />
<i class="ri-search-line search-icon"></i>
</div>
</div>
</div>
</div>
<div class="table-responsive table-card mt-3 mb-1">
<table class="table align-middle table-nowrap" id="indicatorTable">
<thead class="table-light">
<tr class="text-center">
<th class="sort" data-sort="no">No</th>
<th class="sort" data-sort="indicator_type">Jenis Parameter</th>
<th class="sort" data-sort="description">Deskirpsi</th>
<th class="sort" data-status="status">
CF(e)
</th>
<th class="sort" data-sort="action">Action</th>
</tr>
</thead>
<tbody class="list form-check-all">
@foreach ($rule->rules as $item)
<tr class="text-center">
<td class="no">{{ $loop->iteration }}</td>
<td class="id" style="display: none">
<a href="javascript:void(0);"
class="fw-medium link-primary">#VZ2101</a>
</td>
<td class="parameter_type">{{ $item->parameter_type }}</td>
<td class="description">{{ $item->description }}</td>
<td class="status">{{ $item->cf }}</td>
<td>
<div class="d-flex gap-2 justify-content-center">
<div class="edit">
<button class="btn btn-sm btn-warning edit-item-btn"
data-bs-toggle="modal" data-bs-target="#showModal"
onclick="updateData({{ $item }})">Edit</button>
</div>
<div class="remove">
<button class="btn btn-sm btn-danger remove-item-btn"
data-bs-toggle="modal"
data-bs-target="#deleteRecordModal">Hapus</button>
</div>
</div>
</td>
</tr>
@endforeach
</tbody>
</table>
<div class="noresult" style="display: none">
<div class="text-center">
<lord-icon src="https://cdn.lordicon.com/msoeawqm.json" trigger="loop"
colors="primary:#25a0e2,secondary:#00bd9d"
style="width: 75px; height: 75px">
</lord-icon>
<h5 class="mt-2">Maaf! Data Tidak Ditemukan</h5>
<p class="text-muted mb-0">Silahkan gunakan kata kunci lain</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
@endforeach
{{-- <div class="row">
<div class="col-lg-12">
<div class="card">
<div class="card-header">
@ -34,14 +128,6 @@
<div id="customerList">
<div class="row g-4 mb-3">
<div class="col-sm-auto">
<div>
<button type="button" class="btn btn-success add-btn" data-bs-toggle="modal"
id="create-btn" data-bs-target="#addModal">
<i class="ri-add-line align-bottom me-1"></i> Tambah
</button>
</div>
</div>
<div class="col-sm">
<div class="d-flex justify-content-sm-end">
<div class="search-box ms-2">
<input type="text" class="form-control search" placeholder="Search..." />
@ -62,6 +148,7 @@
Indikator
</th>
<th class="sort" data-sort="parameter_type">Jenis Indikator</th>
<th class="sort" data-sort="description">Deskripsi</th>
<th class="sort" data-sort="status">
CF(e)
</th>
@ -84,6 +171,13 @@ class="fw-medium link-primary">#VZ2101</a>
@endforeach
</ul>
</td>
<td class="description">
<ul class="list-unstyled mb-0">
@foreach ($rule->rules as $item)
<li class="mb-2">{{ $item->description }}</li>
@endforeach
</ul>
</td>
<td class="status">
<ul class="list-unstyled mb-0">
@foreach ($rule->rules as $item)
@ -96,7 +190,7 @@ class="fw-medium link-primary">#VZ2101</a>
<div class="edit">
<button class="btn btn-sm btn-warning edit-item-btn"
data-bs-toggle="modal" data-bs-target="#showModal"
onclick="updateData({{ $rule }})">
onclick="updateData({{ $item }})">
Edit
</button>
</div>
@ -144,7 +238,7 @@ class="fw-medium link-primary">#VZ2101</a>
<!-- end col -->
</div>
<!-- end col -->
</div>
</div> --}}
<!-- end row -->
{{-- add modal --}}
@ -180,29 +274,29 @@ class="fw-medium link-primary">#VZ2101</a>
</div>
<div class="mb-3">
<label for="idealmin-field" class="form-label">Ideal Min</label>
<input type="text" id="idealmin-field" class="form-control" name="ideal_min"
placeholder="Masukan Nilai Ideal Min" required />
<label for="indicator-type-field" class="form-label">Jenis Indikator</label>
<input type="text" id="indicator-type-field" class="form-control"
name="parameter_type" placeholder="Masukan jenis indikator" required />
<div class="invalid-feedback">
Masukan Nilai Ideal Min
Masukan Jenis Indikator
</div>
</div>
<div class="mb-3">
<label for="idealmax-field" class="form-label">Ideal Max</label>
<input type="text" id="idealmax-field" class="form-control" name="ideal_max"
placeholder="Masukan Nilai Ideal Max" required />
<label for="description-field" class="form-label">Deskripsi</label>
<textarea class="form-control" name="description" id="description-field" rows="5"
placeholder="Masukan Deskripsi" required></textarea>
<div class="invalid-feedback">
Masukan Nilai Ideal Max
</div>
</div>
<div>
<label for="mb-field" class="form-label">Meansure Belief</label>
<input type="text" id="mb-field" class="form-control" name="mb"
placeholder="Masukan Meansure Belief" required />
<label for="cf-field" class="form-label">CF(e)</label>
<input type="text" id="cf-field" class="form-control" name="cf"
placeholder="Masukan nilai CF pakar" required oninput="validateCfInput(this)" />
<div class="invalid-feedback">
Masukan Meansure Belief
Masukan Nilai CF
</div>
</div>
</div>
@ -242,42 +336,29 @@ class="fw-medium link-primary">#VZ2101</a>
</div>
<div class="mb-3">
<label for="indicatorname-field" class="form-label">Indikator</label>
<select name="indicator" id="indicator-edit-field" class="form-control">
<option value="" selected disabled>Pilih Indikator</option>
@foreach ($indicators as $indicator)
<option value="{{ $indicator->id }}">{{ $indicator->name }}</option>
@endforeach
</select>
<label for="indicator-type-edit-field" class="form-label">Jenis Indikator</label>
<input type="text" id="indicator-type-edit-field" class="form-control"
name="parameter_type" placeholder="Masukan jenis parameter" required />
<div class="invalid-feedback">
Pilih Indikator
Masukan jenis parameter
</div>
</div>
<div class="mb-3">
<label for="idealmin-field" class="form-label">Ideal Min</label>
<input type="text" id="idealmin-edit-field" class="form-control" name="ideal_min"
placeholder="Masukan Nilai Ideal Min" required />
<label for="description-edit-field" class="form-label">Deskirpsi</label>
<textarea class="form-control" name="description" id="description-edit-field" rows="5"
placeholder="Masukan Deskripsi" required></textarea>
<div class="invalid-feedback">
Masukan Nilai Ideal Min
</div>
</div>
<div class="mb-3">
<label for="idealmax-edit-field" class="form-label">Ideal Max</label>
<input type="text" id="idealmax-edit-field" class="form-control" name="ideal_max"
placeholder="Masukan Nilai Ideal Max" required />
<div class="invalid-feedback">
Masukan Nilai Ideal Max
Masukan Deskirpsi
</div>
</div>
<div>
<label for="mb-edit-field" class="form-label">Meansure Belief</label>
<input type="text" id="mb-edit-field" class="form-control" name="mb"
placeholder="Masukan Nilai Meansure Belief" required />
<label for="cf-edit-field" class="form-label">CF(e)</label>
<input type="text" id="cf-edit-field" class="form-control" name="cf"
placeholder="Masukan Nilai CF(e)" required oninput="validateCfInput(this)" />
<div class="invalid-feedback">
Masukan Meansure Belief
Masukan CF(e)
</div>
</div>
</div>