update form inspeksi dan so bisa ambil alih

This commit is contained in:
majid76
2024-11-28 11:16:45 +07:00
parent b7a60abd3e
commit a2c7df7af3
18 changed files with 1712 additions and 1269 deletions

View File

@@ -9,6 +9,7 @@ use Illuminate\Http\Request;
use Modules\Lpj\Models\Permohonan;
use Modules\Lpj\Models\Penilaian;
use Modules\Lpj\Models\TeamsUsers;
use Modules\Lpj\Models\PenilaianTeam;
use Modules\Lpj\Models\StatusPermohonan;
use Modules\Lpj\Exports\PermohonanExport;
use Maatwebsite\Excel\Facades\Excel;
@@ -65,10 +66,33 @@ class ActivityController extends Controller
})
->get();
return view('lpj::activity.progres_activity.index', compact('teamsActivity'));
}
function updateTeamAssingment(Request $request) {
try {
$id = $request->input('id');
$user = PenilaianTeam::where('penilaian_id', $id)->get();
if ($user) {
foreach ($user as $item) {
if($item->role == 'surveyor') {
$item->update(['user_id' => $request->surveyor_id]);
}
}
return redirect()->route('activity.progres.index')->with('success', 'Surveyor berhasil diganti');
}
} catch (\Throwable $th) {
return redirect()->route('activity.progres.index')->with('success', $th->getMessage());
}
}
public function senior()
{

View File

@@ -48,11 +48,14 @@ use Modules\Lpj\Models\MerupakanDaerah;
use Modules\Lpj\Models\ObjekJaminan;
use Modules\Lpj\Models\ModelAlatBerat;
use Modules\Lpj\Models\JenisPesawat;
use Modules\Lpj\Models\DokumenJaminan;
use Modules\Lpj\Models\DetailDokumenJaminan;
use Modules\Lpj\Models\JenisKapal;
use Modules\Lpj\Models\JenisKendaraan;
use Modules\Lpj\Models\RuteJaminan;
use Modules\Lpj\Models\JenisJaminan;
use Modules\Lpj\Models\HubunganPemilikJaminan;
use Modules\Lpj\Models\HubunganPenghuniJaminan;
use Modules\Lpj\Models\AnalisaUnit;
use Modules\Lpj\Models\GolonganMasySekitar;
use Modules\Lpj\Models\TingkatKeramaian;
@@ -176,6 +179,8 @@ class SurveyorController extends Controller
{
$data = $request->validated();
if (!$data) {
return response()->json(['success' => false, 'message' => 'Invalid data'], 400);
}
@@ -188,20 +193,20 @@ class SurveyorController extends Controller
$inspeksi = Inspeksi::where('permohonan_id', $request->input('permohonan_id'))->where('jenis_jaminan_id', $request->input('jenis_jaminan_id'))->first();
if ($inspeksi) {
$inspeksi->update(['data_form' => json_encode($rules)]);
} else {
if (!$inspeksi) {
Inspeksi::create([
'permohonan_id' => $request->permohonan_id,
'permohonan_id' => $request->input('permohonan_id'),
'data_form' => json_encode($rules),
'name' => $request->type,
'name' => $request->input('type'),
'jenis_jaminan_id' => $request->input('jenis_jaminan_id'),
]);
} else {
$inspeksi->update(['data_form' => json_encode($rules)]);
}
DB::commit();
return response()->json(['success' => true, 'message' => 'Data saved successfully', 'data' => $rules], 200);
return response()->json(['success' => true, 'message' => 'Data saved successfully', 'data' => $data], 200);
} catch (Exception $e) {
DB::rollBack();
return response()->json(['success' => false, 'message' => 'Failed to save data: ' . $e->getMessage()], 500);
@@ -529,6 +534,43 @@ class SurveyorController extends Controller
->with('error', 'Gagal membuat jadwal: ' . $e->getMessage());
}
}
public function storeDataPembanding(Request $request)
{
$data = $request->all();
if (!$data) {
return response()->json(['success' => false, 'message' => 'Invalid data'], 400);
}
try {
DB::beginTransaction();
// $action = $request->input('type');
// $rules = $this->getActionSpecificRules($data, $action, $request);
$inspeksi = Inspeksi::where('permohonan_id', $request->input('permohonan_id'))->where('jenis_jaminan_id', $request->input('jenis_jaminan_id'))->first();
if (!$inspeksi) {
Inspeksi::create([
'permohonan_id' => $request->input('permohonan_id'),
'data_pembanding' => json_encode($data),
'name' => $request->input('type'),
'jenis_jaminan_id' => $request->input('jenis_jaminan_id'),
]);
} else {
$inspeksi->update(['data_pembanding' => json_encode($data)]);
}
DB::commit();
return response()->json(['success' => true, 'message' => 'Data saved successfully', 'data' => json_encode($data)], 200);
} catch (Exception $e) {
DB::rollBack();
return response()->json(['success' => false, 'message' => 'Failed to save data: ' . $e->getMessage()], 500);
}
}
/**
* Form inspeksi.
*/
@@ -574,6 +616,7 @@ class SurveyorController extends Controller
$jenisPesawat = JenisPesawat::all();
$modelAlatBerat = ModelAlatBerat::all();
$hubCadeb = HubunganPemilikJaminan::all();
$hubPenghuni = HubunganPenghuniJaminan::all();
$jenisJaminan = JenisJaminan::all();
$fasilitasObjek = FasilitasObjek::all();
$merupakanDaerah = MerupakanDaerah::all();
@@ -622,7 +665,8 @@ class SurveyorController extends Controller
'merupakanDaerah',
'terletakDiArea',
'posisiUnit',
'bentukUnit'
'bentukUnit',
'hubPenghuni'
));
}
@@ -697,6 +741,7 @@ class SurveyorController extends Controller
$branches = Branch::all();
$provinces = Province::all();
$data = $this->getCommonData();
$inpeksi = Inspeksi::where('permohonan_id', $id)->where('jenis_jaminan_id', $jaminanId)->first();
$forminspeksi = null;
@@ -706,7 +751,7 @@ class SurveyorController extends Controller
}
// return response()->json($forminspeksi);
return view('lpj::surveyor.components.data-pembanding', compact('permohonan', 'surveyor', 'branches', 'provinces', 'forminspeksi'));
return view('lpj::surveyor.components.data-pembanding', compact('permohonan', 'surveyor', 'branches', 'provinces', 'forminspeksi', 'data'));
}
@@ -852,8 +897,92 @@ class SurveyorController extends Controller
->route('basicdata.' . $type . '.index')
->with('success', 'Updated successfully');
}
}
public function update_analisa($id, Request $request)
{
try {
$permohonan = Permohonan::with([
'user',
'debiture.province',
'debiture.city',
'debiture.district',
'debiture.village',
'branch',
'tujuanPenilaian',
'penilaian',
'documents',
])->findOrFail($id);
$jenisAssetUpdated = false;
if ($request->input('types') == 'jenis_asset') {
$this->updateJenisAsset($permohonan, $request);
$jenisAssetUpdated = true;
}
if (in_array($request->input('types'), ['analisa_tanah', 'analisa_bangunan', 'analisa_unit'])) {
$key = match ($request->input('types')) {
'analisa_tanah' => 'luas_tanah',
'analisa_bangunan' => 'luas_bangunan',
'analisa_unit' => 'luas_unit',
};
$this->updateDetails($permohonan, $key, $request->input($key));
}
return response()->json([
'success' => true,
'message' => 'Data berhasil disimpan',
'jenis_asset' => $jenisAssetUpdated,
], 200);
} catch (\Exception $e) {
return response()->json(['error' => 'Something went wrong', 'message' => $e->getMessage()], 500);
}
}
private function updateJenisAsset($permohonan, $request)
{
$jenis_jaminan_id = $permohonan->debiture->documents->first()->jenis_jaminan_id;
DokumenJaminan::where('permohonan_id', $permohonan->id)
->where('jenis_jaminan_id', $jenis_jaminan_id)
->update([
'jenis_jaminan_id' => $request->input('jenis_asset'),
]);
}
private function updateDetails($permohonan, $key, $newValue)
{
$document = $permohonan->debiture->documents->first();
if (!$document) {
throw new \Exception("Document not found");
}
$detailsUpdate = DetailDokumenJaminan::where('dokumen_jaminan_id', $document->id)->first();
if (!$detailsUpdate) {
throw new \Exception("DetailDokumenJaminan not found");
}
$datas = json_decode($detailsUpdate->details, true) ?? [];
if (is_numeric($newValue)) {
$newValue = [$key => $newValue];
}
if (!is_array($newValue)) {
throw new \InvalidArgumentException("'{$key}' must be an array or valid JSON string");
}
foreach ($newValue as $subKey => $value) {
$datas[$subKey] = $value; // Update atau tambahkan key baru
}
$detailsUpdate->update([
'details' => json_encode($datas),
]);
}
@@ -1132,6 +1261,13 @@ class SurveyorController extends Controller
'modelAlatBerat' => ModelAlatBerat::all(),
'jenisKapal' => JenisKapal::all(),
'jenisKendaraan' => JenisKendaraan::all(),
'terletakArea' => TerletakArea::all(),
'posisiUnit' => PosisiUnit::all(),
'bentukUnit' => BentukUnit::all(),
'fasilitasObjek' => FasilitasObjek::all(),
'merupakanDaerah' => MerupakanDaerah::all(),
'jenisUnit' => JenisUnit::all(),
];
}
@@ -1215,15 +1351,25 @@ class SurveyorController extends Controller
private function getBangunanData($data, $request): array
{
// $kategori_bangunan = [];
// if ($request->has('spek_kategori_bagunan')) {
// foreach ($request->input('spek_kategori_bagunan', []) as $value) {
// $kategori_bangunan[] = [
// 'value' => [
// 'data' => $data['spek_bangunan'] ?? [],
// ],
$data = $request->all();
$result = [];
// foreach ($data['nama_bagunan'] as $index => $bangunan) {
// $bangunanData = [
// 'bangunan' => $bangunan,
// 'kategori' => []
// ];
// foreach ($data['spek_kategori_bangunan'] as $kategoriIndex => $kategori) {
// if (isset($data['spek_bangunan'][$kategori])) {
// $bangunanData['kategori'][] = [
// 'kategori' => $kategori,
// 'spesifikasi' => $data['spek_bangunan'][$kategori]
// ];
// }
// }
// $result[] = $bangunanData;
// }
return [
@@ -1233,8 +1379,8 @@ class SurveyorController extends Controller
'kondisi_bangunan' => $data['kondisi_bangunan'] ?? null,
'sifat_bangunan' => $data['sifat_bangunan'] ?? null,
'sifat_bangunan_input' => $data['sifat_bangunan_input'] ?? null,
'spek_kategori_bagunan' => $data['spek_kategori_bagunan'] ?? null,
'spek_bangunan' => $data['spek_bangunan'] ?? [],
'spesifikasi_bangunan' => $result ?? null,
// 'spek_bangunan' => $data['spek_bangunan'] ?? [],
'sarana_pelengkap' => $data['sarana_pelengkap'] ?? [],
'sarana_pelengkap_input' => $data['sarana_pelengkap_input'] ?? null,
],
@@ -1740,6 +1886,3 @@ class SurveyorController extends Controller
}

View File

@@ -100,9 +100,9 @@ class FormSurveyorRequest extends FormRequest
'kondisi_bangunan' => 'nullable',
'sifat_bangunan' => 'required|array',
'sifat_bangunan_input' => 'nullable|array',
'nama_bagunan' => 'required|array',
'spek_kategori_bangunan' => 'required|array',
'spek_kategori_bangunan.*' => 'required|string',
'nama_bagunan' => 'required',
'spek_kategori_bangunan.*' => 'required',
'spek_bangunan.*' => 'required',
'sarana_pelengkap' => 'required',
'sarana_pelengkap_input' => 'nullable|array',
];

View File

@@ -0,0 +1,28 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('inspeksi', function (Blueprint $table) {
$table->json('data_pembanding')->nullable();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('inspeksi', function (Blueprint $table) {
$table->dropColumn('data_pembanding');
});
}
};

View File

@@ -118,12 +118,11 @@
<th class="min-w-[100px]">Paparan</th>
<th class="min-w-[100px]">Approve</th>
<th class="min-w-[50px] text-center">Keterangan</th>
<th class="min-w-[50px] text-center">Action</th>
</tr>
</thead>
<tbody>
<tr>
<td colspan="12" class="text-center">No data available</td>
</tr>
</tbody>
</table>
</div>
@@ -151,6 +150,13 @@
@endsection
@push('scripts')
<script>
function jadwal(id) {
document.getElementById('ids').value = id;
}
</script>
<script type="module">
document.addEventListener('DOMContentLoaded', () => {
const accordions = document.querySelectorAll('[data-accordion-item]');
@@ -224,10 +230,17 @@
title: 'Approve',
render: (item, data) => `${data.approve || ''}`,
},
actions: {
keterangan: {
title: 'Keterangan',
render: (item, data) => `${data.keterangan || ''}`,
},
actions: {
title: 'Action',
render: (item, data) => `
<a class="btn btn-sm btn-icon btn-clear btn-primary" data-modal-toggle="#modal_jadwal" onclick="jadwal(${data.user_penilai[0].penilaian_id})">
<i class="ki-filled ki-calendar-edit"></i>
</a>`,
},
},
};
@@ -241,10 +254,6 @@
});
function formatDateFromISO(isoDateString) {
const date = new Date(isoDateString);
const day = String(date.getDate()).padStart(2, '0');
@@ -254,3 +263,46 @@
}
</script>
@endpush
<div class="modal" data-modal="true" id="modal_jadwal">
<div class="modal-content max-w-[600px] top-[10%]">
<div class="modal-header">
<h3 class="modal-title">Pilih</h3>
<button class="btn btn-xs btn-icon btn-light" data-modal-dismiss="true">
<i class="ki-outline ki-cross"></i>
</button>
</div>
<div class="modal-body">
<form action="{{ route('activity.update-team') }}" method="POST" enctype="multipart/form-data"
id="revisiForm">
@method('put')
@csrf
<input id="ids" type="hidden" name="id">
<div class="pl-1 grid gap-2.5">
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Pilih Team</label>
<div class="flex flex-wrap items-baseline w-full">
<div class="input-group w-full">
<select id="surveyor_id" name="surveyor_id" class="input tomselect">
<option value="">Pilih Team</option>
@foreach ($teamsActivity as $item)
<option value="{{ $item->user->id }}">{{ $item->user->name }}</option>
@endforeach
</select>
</div>
</div>
<em id="error-surveyor_id" class="alert text-danger text-sm"></em>
</div>
</div>
<div class="modal-footer justify-end mt-2">
<div class="flex gap-4">
<button type="button" class="btn btn-light" data-modal-dismiss="true">Cancel</button>
<button id="btnSubmit" type="submit" class="btn btn-primary">Submit</button>
</div>
</div>
</form>
</div>
</div>
</div>

View File

@@ -27,10 +27,10 @@
<div id="luas_unit_tidak_sesuai" class="flex items-baseline gap-2"
style="{{ old('luas_unit', $forminspeksi['luas_unit'] ?? '') == 'tidak sesuai' ? '' : 'display: none;' }}">
<input type="text" name="luas_unit_tidak_sesuai" class="input w-full"
<input id="analisa_luas_unit_tidak_sesuai" type="text" name="luas_unit_tidak_sesuai" class="input w-full"
placeholder="Masukan Luas Tanah"
value="{{ old('luas_unit_tidak_sesuai', $forminspeksi['luas_unit_tidak_sesuai'] ?? '') }}">
<button type="button" class="btn btn-md btn-primary">Save</button>
<button type="button" class="btn btn-md btn-primary" onclick="updateAnalisa('analisa_unit')">Save</button>
</div>
</div>
<em id="error-luas_unit" class="alert text-danger text-sm"></em>
@@ -80,9 +80,6 @@
</div>
</div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Lantai</label>
<div class="flex flex-wrap items-baseline w-full">

View File

@@ -5,7 +5,20 @@
</div>
<div class="grid gap-5">
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Luas Tanah</label>
<label class="form-label max-w-56">Luas Bagunan</label>
<div class="mt-2">
@if (isset($permohonan->debiture->documents))
@foreach ($permohonan->debiture->documents as $item)
@php
$luas = $item->detail;
$details = json_decode($luas[0]->details, true);
$luas_bangunan = isset($details['luas_bangunan']) ? $details['luas_bangunan'] : 'N/A';
@endphp
<p class="text-2sm text-gray-700">{{ $luas_bangunan }} m<sup>2</sup></p>
@endforeach
@endif
<div class="flex flex-wrap items-baseline w-full">
<div class="grid grid-cols-2 md:grid-cols-3 gap-4 mt-2">
<label class="form-label flex items-center gap-3 text-nowrap">
@@ -25,15 +38,16 @@
<div id="luas_tanah_bagunan_tidak_sesuai" class="flex items-baseline gap-2"
style="{{ old('luas_tanah_bagunan_bagunan', $forminspeksi['bangunan']['luas_tanah_bagunan_bagunan'] ?? '') == 'tidak sesuai' ? '' : 'display: none;' }}">
<input type="text" name="luas_tanah_bagunan_tidak_sesuai" class="input w-full"
<input type="text"id="analisa_bangunan_tidak_sesuai" name="luas_tanah_bagunan_tidak_sesuai" class="input w-full"
placeholder="Masukan Luas Bangunan Tidak Sesuai..."
value="{{ old('luas_tanah_bagunan_tidak_sesuai', $forminspeksi['bangunan']['luas_tanah_bagunan_tidak_sesuai'] ?? '') }}">
<button type="button" class="btn btn-md btn-primary">Save</button>
<button type="button" class="btn btn-md btn-primary" onclick="updateAnalisa('analisa_bangunan')">Save</button>
</div>
</div>
<em id="error-luas_tanah_bagunan" class="alert text-danger text-sm"></em>
</div>
</div>
</div>
<!-- Jenis Bangunan -->
@@ -139,7 +153,7 @@
@if (@isset($spekKategoriBagunan))
@foreach ($spekKategoriBagunan as $item)
<div>
<input type="hidden" name="spek_kategori_bangunan[]"
<input type="hidden" name="spek_kategori_bangunan.[]"
value="{{ $item->name }}">
<label
class="form-label flex items-center gap-3 text-nowrap">{{ $item->name }}</label>
@@ -149,7 +163,7 @@
@if ($spek->spek_kategori_bangunan_id == $item->id)
<label class="form-label flex items-center gap-2.5">
<input class="checkbox"
name="spek_bangunan_{{ $item->name }}[]"
name="spek_bangunan[{{ $item->name }}][]"
type="checkbox" value="{{ $spek->name }}" />
{{ $spek->name }}
</label>
@@ -235,33 +249,39 @@
document.getElementById('addBagunan').addEventListener('click', function() {
const newDiv = spekBangunanContainer.querySelector('.spek-bangunan').cloneNode(true);
console.log('Building label');
// Clear the selected values and input fields of the cloned input fields
newDiv.querySelectorAll('select, input').forEach(input => {
// Update input fields
newDiv.querySelectorAll('select, input').forEach((input, index) => {
if (input.type === 'checkbox' || input.type === 'radio') {
input.checked = false;
} else {
input.value = '';
}
// Update name attribute
if (input.name) {
const baseName = input.name.split('[')[0]; // Get the base name
const count = spekBangunanContainer.querySelectorAll('.spek-bangunan').length + 1;
input.name = `${baseName}[${count}]`;
}
});
// Append the cloned div to the container
// Append the cloned div
spekBangunanContainer.appendChild(newDiv);
// Add event listener to the delete button in the cloned div
newDiv.querySelector('.delete-button').addEventListener('click', function() {
spekBangunanContainer.removeChild(newDiv);
updateDeleteButtonsVisibility();
updateBuildingLabels(); // Update the labels after removing
console.log('Building label');
updateBuildingLabels();
});
// Update delete buttons visibility and labels
// Update UI
updateDeleteButtonsVisibility();
updateBuildingLabels();
console.log('Building label');
});
// Initial setup: Ensure "Bangunan 1" is labeled
document.addEventListener('DOMContentLoaded', () => {
updateDeleteButtonsVisibility();

View File

@@ -5,7 +5,8 @@
@endsection --}}
@section('content')
<div class="w-full grid gap-5 lg:gap-7.5 mx-auto">
@include('lpj::assetsku.includenya')
<div class="w-full grid gap-5 lg:gap-7.5">
<div class="card min-w-full">
<div class="card min-w-full">
<div class="card-header">
@@ -13,7 +14,9 @@
Data Pembanding
</h3>
<div class="flex items-center gap-2">
<a href="{{ route('surveyor.show', ['id' => request('pembanding')]) }}?form=data-pembanding"
<a href="{
{ route('surveyor.show', ['id' => request('pembanding')]) }}?form=data-pembanding
"
class="btn btn-xs btn-info">
<i class="ki-filled ki-exit-left"></i> Back
</a>
@@ -25,16 +28,24 @@
<div class="grid gap-5">
<div class="card-grid min-w-full" data-datatable="false" data-datatable-page-size="5"
data-datatable-state-save="false" id="data-table" data-api-url="">
<form id="dataPembandingForm" method="POST" enctype="multipart/form-data">
@csrf
<input type="hidden" name="permohonan_id" value="{{ $permohonan->id }}">
<input type="hidden" name="type" value="tanah">
<input type="hidden" name="jenis_jaminan_id" value="{{ request('jenis_jaminan') }}">
<div class="card">
<div class="card-header py-5 flex-wrap flex justify-end">
<button id="addColumnBtn" class="btn btn-primary btn-sm">
<button type="button" id="addColumnBtn" class="btn btn-primary btn-sm">
<i class="ki-filled ki-plus"></i> Tambah Kolom
</button>
<button id="removeColumnBtn" class="btn btn-danger btn-sm ml-2" style="display: none;">
<button type="button" id="removeColumnBtn" class="btn btn-danger btn-sm ml-2"
style="display: none;">
<i class="ki-filled ki-minus"></i> Hapus Kolom
</button>
</div>
<div class="card-body">
<div class="scrollable-x-auto">
<table id="dataTable"
class="table table-auto table-border align-middle text-gray-700 font-medium text-sm"
@@ -74,17 +85,19 @@
style="width: 10rem; height: 10rem;" id="uploadedImage1">
@else
<img src="#" class="img-responsive" alt="Gambar Pendamping"
style="width: 10rem; height: 10rem; display: none;" id="uploadedImage1">
style="width: 10rem; height: 10rem; display: none;"
id="uploadedImage1">
@endif
<input type="file" class="file-input mt-2" placeholder=""
onchange="previewImage(event, 'uploadedImage1')" />
onchange="previewImage(event, 'uploadedImage1')" name="foto_objek[]" />
</td>
<td class="text-center">
<img src="" class="img-responsive" alt="Gambar Pendamping"
style="width: 10rem; height: 10rem; display: none;" id="uploadedImage2">
<input type="file" class="file-input" placeholder=""
onchange="previewImage(event, 'uploadedImage2')" />
onchange="previewImage(event, 'uploadedImage2')"
name="foto_pembanding[]" />
</td>
</tr>
<tr>
@@ -95,13 +108,12 @@
<td>
<input type="text" class="input"
value="{{ isset($formIns['nama_jalan']) ? $formIns['nama_jalan'] . ' ' . $formIns['desa_kelurahan'] : '' }}" />
value="{{ isset($formIns['asset']['nama_jalan']) ? $formIns['asset']['nama_jalan'] . ' ' . $formIns['desa_kelurahan'] : '' }}"
name="alamat" />
</td>
<td class="text-center">
<input type="text" class="input" placeholder="Data Pembanding 1" />
<input type="text" class="input" placeholder="Data Pembanding 1"
name="alamat_pembanding[]" />
</td>
</tr>
@@ -109,10 +121,12 @@
<td>Desa</td>
<td>
<input type="text" class="input mt-2" placeholder="Objek Penilaian"
value="{{ isset($formIns['kecamatan']) ? $formIns['kecamatan'] : '' }}" />
value="{{ isset($formIns['asset']['kecamatan']) ? $formIns['asset']['desa'] : '' }}"
name="desa" />
</td>
<td class="text-center">
<input type="text" class="input" placeholder="Data Pembanding 1" />
<input type="text" class="input" placeholder="Data Pembanding 1"
name="desa_pembanding[]" />
</td>
</tr>
@@ -120,10 +134,12 @@
<td>Kecamatan</td>
<td>
<input type="text" class="input mt-2" placeholder="Objek Penilaian"
value="{{ isset($formIns['kecamatan']) ? $formIns['kecamatan'] : '' }}" />
value="{{ isset($formIns['asset']['kecamatan']) ? $formIns['asset']['kecamatan'] : '' }}"
name="kecamatan" />
</td>
<td class="text-center">
<input type="text" class="input" placeholder="Data Pembanding 1" />
<input type="text" class="input" placeholder="Data Pembanding 1"
name="kecamatan_pembanding[]" />
</td>
</tr>
@@ -131,10 +147,12 @@
<td>Kabupaten</td>
<td>
<input type="text" class="input mt-2" placeholder="Objek Penilaian"
value="{{ isset($formIns['kota_kabupaten']) ? $formIns['kota_kabupaten'] : '' }}" />
value="{{ isset($formIns['asset']['kota_kabupaten']) ? $formIns['asset']['kota_kabupaten'] : '' }}"
name="kabupaten" />
</td>
<td class="text-center">
<input type="text" class="input" placeholder="Data Pembanding 1" />
<input type="text" class="input" placeholder="Data Pembanding 1"
name="kabupaten_pembanding[]" />
</td>
</tr>
@@ -142,10 +160,12 @@
<td>Provinsi</td>
<td>
<input type="text" class="input mt-2" placeholder="Objek Penilaian"
value="{{ isset($formIns['provinsi']) ? $formIns['provinsi'] : '' }}" />
value="{{ isset($formIns['asset']['provinsi']) ? $formIns['asset']['provinsi'] : '' }}"
name="provinsi" />
</td>
<td class="text-center">
<input type="text" class="input" placeholder="Data Pembanding 1" />
<input type="text" class="input" placeholder="Data Pembanding 1"
name="provinsi_pembanding[]" />
</td>
</tr>
@@ -154,10 +174,12 @@
Tahun Penilaian
</td>
<td>
<input type="text" class="input" placeholder="Objek Penilaian" />
<input type="text" class="input" placeholder="Objek Penilaian"
name="tahun" />
</td>
<td class="text-center">
<input type="text" class="input" placeholder="Data Pembanding 1" />
<input type="text" class="input" placeholder="Data Pembanding 1"
name="tahun_pembanding[]" />
</td>
</tr>
<tr>
@@ -165,10 +187,12 @@
Luas Tanah
</td>
<td>
<input type="text" class="input" placeholder="Objek Penilaian" />
<input type="text" class="input" placeholder="Objek Penilaian"
name="luas_tanah" />
</td>
<td class="text-center">
<input type="text" class="input" placeholder="Data Pembanding 1" />
<input type="text" class="input" placeholder="Data Pembanding 1"
name="luas_tanah_pembanding[]" />
</td>
</tr>
<tr>
@@ -176,10 +200,12 @@
Luas Bangunan
</td>
<td>
<input type="text" class="input" placeholder="Objek Penilaian" />
<input type="text" class="input" placeholder="Objek Penilaian"
name="luas_bangunan" />
</td>
<td class="text-center">
<input type="text" class="input" placeholder="Data Pembanding 1" />
<input type="text" class="input" placeholder="Data Pembanding 1"
name="luas_bangunan_pembanding[]" />
</td>
</tr>
<tr>
@@ -187,10 +213,12 @@
Tahun Bangunan
</td>
<td>
<input type="text" class="input" placeholder="Objek Penilaian" />
<input type="text" class="input" placeholder="Objek Penilaian"
name="tahun_bangunan" />
</td>
<td class="text-center">
<input type="text" class="input" placeholder="Data Pembanding 1" />
<input type="text" class="input" placeholder="Data Pembanding 1"
name="tahun_bangunan_pembanding[]" />
</td>
</tr>
@@ -199,10 +227,12 @@
Estimasi Tahun Visual
</td>
<td>
<input type="text" class="input" placeholder="Objek Penilaian" />
<input type="text" class="input" placeholder="Objek Penilaian"
name="estimasi_tahun_visual" />
</td>
<td class="text-center">
<input type="text" class="input" placeholder="Data Pembanding 1" />
<input type="text" class="input" placeholder="Data Pembanding 1"
name="estimasi_tahun_visual_pembanding[]" />
</td>
</tr>
@@ -211,10 +241,12 @@
Kepemilikan
</td>
<td>
<input type="text" class="input" placeholder="Objek Penilaian" />
<input type="text" class="input" placeholder="Objek Penilaian"
name="kepemilikan" />
</td>
<td class="text-center">
<input type="text" class="input" placeholder="Data Pembanding 1" />
<input type="text" class="input" placeholder="Data Pembanding 1"
name="kepemilikan_pembanding[]" />
</td>
</tr>
@@ -223,10 +255,12 @@
Harga
</td>
<td>
<input type="text" class="input" placeholder="Objek Penilaian" />
<input type="text" class="input" placeholder="Objek Penilaian"
name="harga" />
</td>
<td class="text-center">
<input type="text" class="input" placeholder="Data Pembanding 1" />
<input type="text" class="input" placeholder="Data Pembanding 1"
name="harga_pembanding[]" />
</td>
</tr>
<tr>
@@ -234,10 +268,12 @@
Tinggi Lantai
</td>
<td>
<input type="text" class="input" placeholder="Objek Penilaian" />
<input type="text" class="input" placeholder="Objek Penilaian"
name="tinggi_lantai" />
</td>
<td class="text-center">
<input type="text" class="input" placeholder="Data Pembanding 1" />
<input type="text" class="input" placeholder="Data Pembanding 1"
name="tinggi_lantai_pembanding[]" />
</td>
</tr>
@@ -246,10 +282,12 @@
Lebar Depan
</td>
<td>
<input type="text" class="input" placeholder="Objek Penilaian" />
<input type="text" class="input" placeholder="Objek Penilaian"
name="lebar_depan" />
</td>
<td class="text-center">
<input type="text" class="input" placeholder="Data Pembanding 1" />
<input type="text" class="input" placeholder="Data Pembanding 1"
name="lebar_depan_pembanding[]" />
</td>
</tr>
@@ -258,10 +296,12 @@
Lebar Jalan
</td>
<td>
<input type="text" class="input" placeholder="Objek Penilaian" />
<input type="text" class="input" placeholder="Objek Penilaian"
name="lebar_jalan" />
</td>
<td class="text-center">
<input type="text" class="input" placeholder="Data Pembanding 1" />
<input type="text" class="input" placeholder="Data Pembanding 1"
name="lebar_jalan_pembanding[]" />
</td>
</tr>
<tr>
@@ -269,10 +309,12 @@
Sumber
</td>
<td>
<input type="text" class="input" placeholder="Objek Penilaian" />
<input type="text" class="input" placeholder="Objek Penilaian"
name="sumber" />
</td>
<td class="text-center">
<input type="text" class="input" placeholder="Data Pembanding 1" />
<input type="text" class="input" placeholder="Data Pembanding 1"
name="sumber_pembanding[]" />
</td>
</tr>
<tr>
@@ -280,29 +322,57 @@
Nomor tlp
</td>
<td>
<input type="text" class="input" placeholder="Objek Penilaian" />
<input type="text" class="input" placeholder="Objek Penilaian"
name="nomor_tlp" />
</td>
<td class="text-center">
<input type="text" class="input" placeholder="Data Pembanding 1" />
<input type="text" class="input" placeholder="Data Pembanding 1"
name="nomor_tlp_pembanding[]" />
</td>
</tr>
<tr>
<td>
<td colspan="3">
Titik Lokasi
</td>
</tr>
<tr>
<td>
<div class="flex items-center">
Koordinat Lat
</td>
<td>
<input type="text" class="input" placeholder="Objek Penilaian"
value="{{ isset($formIns['kordinat_lat']) ? $formIns['kordinat_lat'] : '' }}" />
<input type="text" class="input" placeholder="Objek Penilaian"
value="{{ isset($formIns['kordinat_lng']) ? $formIns['kordinat_lng'] : '' }}" />
</div>
value="{{ isset($formIns['asset']['kordinat_lat']) ? $formIns['asset']['kordinat_lat'] : '' }}"
name="kordinat_lat" />
</td>
<td class="text-center">
<div class="flex items-center">
<input type="text" class="input" placeholder="Data pembanding" />
<input type="text" class="input" placeholder="Data pembanding" />
</div>
<input type="text" class="input" placeholder="Data pembanding"
name="kordinat_lat_pembanding[]" />
</td>
</tr>
<tr>
<td>
Koordinat Lng
</td>
<td>
<input type="text" class="input" placeholder="Objek Penilaian"
value="{{ isset($formIns['asset']['kordinat_lng']) ? $formIns['asset']['kordinat_lng'] : '' }}"
name="kordinat_lng" />
</td>
<td class="text-center">
<input type="text" class="input" placeholder="Data pembanding"
name="kordinat_lng_pembanding[]" />
</td>
</tr>
<tr>
@@ -310,10 +380,12 @@
Link Internet
</td>
<td>
<input type="text" class="input" placeholder="Objek Penilaian" />
<input type="text" class="input" placeholder="Objek Penilaian"
name="link_internet" />
</td>
<td class="text-center">
<input type="text" class="input" placeholder="Data Pembanding 1" />
<input type="text" class="input" placeholder="Data Pembanding 1"
name="link_internet_pembanding[]" />
</td>
</tr>
<tr>
@@ -326,10 +398,12 @@
</td>
<td>
<input type="text" class="input mt-2" placeholder="Objek Penilaian"
value="{{ isset($formIns['jarak_jalan_utama']) ? $formIns['jarak_jalan_utama'] : '' }}" />
value="{{ isset($formIns['lingkungan']['jarak_jalan_utama']) ? $formIns['lingkungan']['jarak_jalan_utama'] : '' }}"
name="jarak_jalan_utama" />
</td>
<td class="text-center">
<input type="text" class="input" placeholder="Data Pembanding 1" />
<input type="text" class="input" placeholder="Data Pembanding 1"
name="jarak_jalan_utama_pembanding[]" />
</td>
</tr>
@@ -341,10 +415,12 @@
</td>
<td>
<input type="text" class="input mt-2" placeholder="Objek Penilaian"
value="{{ isset($formIns['jarak_cbd_point']) ? $formIns['jarak_cbd_point'] : '' }}" />
value="{{ isset($formIns['lingkungan']['jarak_cbd_point']) ? $formIns['lingkungan']['jarak_cbd_point'] : '' }}"
name="jarak_cbd_point" />
</td>
<td class="text-center">
<input type="text" class="input" placeholder="Data Pembanding 1" />
<input type="text" class="input" placeholder="Data Pembanding 1"
name="jarak_cbd_point_pembanding[]" />
</td>
</tr>
@@ -355,11 +431,19 @@
</td>
<td>
<input type="text" class="input mt-2" placeholder="Objek Penilaian"
value="{{ isset($formIns['posisi_kavling']) ? $formIns['posisi_kavling'][0] : '' }}" />
value="{{ isset($formIns['tanah']['posisi_kavling']) ? $formIns['tanah']['posisi_kavling'][0] : '' }}"
name="posisi_kavling" />
</td>
<td class="text-center">
<input type="text" class="input" placeholder="Data Pembanding 1" />
<input type="text" class="input" placeholder="Data Pembanding 1"
name="posisi_kavling_pembanding[]" />
{{-- <in/put type="text" class="input" placeholder="Data Pembanding 1" /> --}}
</td>
</tr>
@@ -371,11 +455,12 @@
</td>
<td>
<input type="text" class="input mt-2" placeholder="Objek Penilaian"
value="{{ isset($formIns['tingkat_keramaian']) ? $formIns['tingkat_keramaian'][0] : '' }}" />
value="{{ isset($formIns['tanah']['tingkat_keramaian']) ? $formIns['tanah']['tingkat_keramaian'][0] : '' }}"
name="tingkat_keramaian" />
</td>
<td class="text-center">
<input type="text" class="input" placeholder="Data Pembanding 1" />
<input type="text" class="input" placeholder="Data Pembanding 1"
name="tingkat_keramaian_pembanding[]" />
</td>
</tr>
<tr>
@@ -388,11 +473,13 @@
</td>
<td>
<input type="text" class="input" placeholder="Objek Penilaian"
value="{{ isset($formIns['kondisi_fisik_tanah']) ? $formIns['kondisi_fisik_tanah'][0] : '' }}" />
value="{{ isset($formIns['tanah']['kondisi_fisik_tanah']) ? $formIns['tanah']['kondisi_fisik_tanah'][0] : '' }}"
name="kondisi_fisik_tanah" />
</td>
<td class="text-center">
<input type="text" class="input" placeholder="Data Pembanding 1" />
<input type="text" class="input" placeholder="Data Pembanding 1"
name="kondisi_fisik_tanah_pembanding[]" />
</td>
</tr>
@@ -402,11 +489,12 @@
</td>
<td>
<input type="text" class="input mt-2" placeholder="Objek Penilaian"
value="{{ isset($formIns['ketinggian_jalan']) ? $formIns['ketinggian_jalan'][0] : '' }}" />
value="{{ isset($formIns['tanah']['ketinggian_jalan']) ? $formIns['tanah']['ketinggian_jalan'][0] : '' }}"
name="ketinggian_jalan" />
</td>
<td class="text-center">
<input type="text" class="input mt-2" placeholder="Data Pembanding 1" />
<input type="text" class="input" placeholder="Data Pembanding 1"
name="ketinggian_jalan_pembanding[]" />
</td>
</tr>
@@ -417,12 +505,13 @@
<td>
<input type="text" class="input mt-2" placeholder="Objek Penilaian"
value="{{ isset($formIns['bentuk_tanah']) ? $formIns['bentuk_tanah'][0] : '' }}" />
value="{{ isset($formIns['tanah']['bentuk_tanah']) ? $formIns['tanah']['bentuk_tanah'][0] : '' }}"
name="bentuk_tanah" />
</td>
<td class="text-center">
<input type="text" class="input" placeholder="Data Pembanding 1" />
<input type="text" class="input" placeholder="Data Pembanding 1"
name="bentuk_tanah_pembanding[]" />
</td>
</tr>
@@ -432,10 +521,12 @@
</td>
<td>
<input type="text" class="input mt-2" placeholder="Objek Penilaian"
value="{{ isset($formIns['bentuk_tanah']) ? $formIns['bentuk_tanah'][0] : '' }}" />
value="{{ isset($formIns['tanah']['bentuk_tanah']) ? $formIns['tanah']['bentuk_tanah'][0] : '' }}"
name="lebar_depan" />
</td>
<td class="text-center">
<input type="text" class="input" placeholder="Data Pembanding 1" />
<input type="text" class="input" placeholder="Data Pembanding 1"
name="lebar_depan_pembanding[]" />
</td>
</tr>
@@ -447,11 +538,13 @@
</td>
<td>
<input type="text" class="input mt-2" placeholder="Objek Penilaian" />
<input type="text" class="input mt-2" placeholder="Objek Penilaian" />
<input type="text" class="input mt-2" placeholder="Objek Penilaian"
name="fasos_fasum" />
</td>
<td class="text-center">
<input type="text" class="input" placeholder="Data Pembanding 1" />
<input type="text" class="input" placeholder="Data Pembanding 1"
name="fasos_fasum_pembanding[]" />
</td>
</tr>
@@ -462,10 +555,12 @@
</td>
<td>
<input type="text" class="input mt-2" placeholder="Objek Penilaian" />
<input type="text" class="input mt-2" placeholder="Objek Penilaian"
name="lain_lain" />
</td>
<td class="text-center">
<input type="text" class="input" placeholder="Data Pembanding 1" />
<input type="text" class="input" placeholder="Data Pembanding 1"
name="lain_lain_pembanding[]" />
</td>
</tr>
@@ -475,10 +570,12 @@
Karakteristik Ekonomi
</td>
<td>
<input type="text" class="input" placeholder="Objek Penilaian" />
<input type="text" class="input" placeholder="Objek Penilaian"
name="karakteristik_ekonomi" />
</td>
<td class="text-center">
<input type="text" class="input" placeholder="Data Pembanding 1" />
<input type="text" class="input" placeholder="Data Pembanding 1"
name="karakteristik_ekonomi_pembanding[]" />
</td>
</tr>
<tr>
@@ -490,10 +587,12 @@
Zonasi/Tata Kota
</td>
<td>
<input type="text" class="input" placeholder="Objek Penilaian" />
<input type="text" class="input" placeholder="Objek Penilaian"
name="zonasi_tata_kota" />
</td>
<td>
<input type="text" class="input" placeholder="Data Pembanding 1" />
<input type="text" class="input" placeholder="Data Pembanding 1"
name="zonasi_tata_kota_pembanding[]" />
</td>
</tr>
<tr>
@@ -501,11 +600,14 @@
KDB
</td>
<td>
<input type="text" class="input" placeholder="Objek Penilaian" />
<input type="text" class="input" placeholder="Objek Penilaian"
value="{{ isset($formIns['fakta']['kdb']) ? $formIns['fakta']['kdb'] : '' }}"
name="kdb" />
</td>
<td>
<input type="text" class="input" placeholder="Data Pembanding 1" />
<input type="text" class="input" placeholder="Data Pembanding 1"
name="kdb_pembanding[]" />
</td>
</tr>
@@ -516,11 +618,14 @@
KLB
</td>
<td>
<input type="text" class="input" placeholder="Objek Penilaian" />
<input type="text" class="input" placeholder="Objek Penilaian"
value="{{ isset($formIns['fakta']['klb']) ? $formIns['fakta']['klb'] : '' }}"
name="klb" />
</td>
<td>
<input type="text" class="input" placeholder="Data Pembanding 1" />
<input type="text" class="input" placeholder="Data Pembanding 1"
name="klb_pembanding[]" />
</td>
</tr>
@@ -529,11 +634,14 @@
KTB
</td>
<td>
<input type="text" class="input" placeholder="Objek Penilaian" />
<input type="text" class="input" placeholder="Objek Penilaian"
value="{{ isset($formIns['fakta']['ktb']) ? $formIns['fakta']['ktb'] : '' }}"
name="ktb" />
</td>
<td>
<input type="text" class="input" placeholder="Data Pembanding 1" />
<input type="text" class="input" placeholder="Data Pembanding 1"
name="ktb_pembanding[]" />
</td>
</tr>
@@ -542,11 +650,14 @@
KDH
</td>
<td>
<input type="text" class="input" placeholder="Objek Penilaian" />
<input type="text" class="input" placeholder="Objek Penilaian"
value="{{ isset($formIns['fakta']['kdh']) ? $formIns['fakta']['kdh'] : '' }}"
name="kdh" />
</td>
<td>
<input type="text" class="input" placeholder="Data Pembanding 1" />
<input type="text" class="input" placeholder="Data Pembanding 1"
name="kdh_pembanding[]" />
</td>
</tr>
<tr>
@@ -554,19 +665,34 @@
Peraturan
</td>
<td>
<input type="text" class="input" placeholder="Objek Penilaian" />
<input type="text" class="input" placeholder="Objek Penilaian"
name="peraturan" />
</td>
<td>
<input type="text" class="input" placeholder="Data Pembanding 1" />
<input type="text" class="input" placeholder="Data Pembanding 1"
name="peraturan_pembanding[]" />
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="flex justify-end gap-2" style="margin-right: 20px; margin-top: 20px">
<button type="button" class="btn btn-success" id="saveButton" onclick="submitDataPembanding()">
<span id="saveButtonText">Save</span>
<div class="spinner-border spinner-border-sm text-light" role="status"
style="display: none;" id="saveButtonSpinner">
<span class="visually-hidden">Loading...</span>
</div>
</button>
</div>
</form>
</div>
</div>
<script>
@@ -576,21 +702,39 @@
columnCount++;
// Create new header cell
const headerRow = document.querySelector('#dataTable thead tr');
const newHeader = document.createElement('th');
newHeader.className = 'min-w-[350px] text-center';
newHeader.style.minWidth = '350px';
newHeader.textContent = `Data Pembanding ${columnCount}`;
document.querySelector('#dataTable thead tr').appendChild(newHeader);
headerRow.appendChild(newHeader);
// Show remove column button
document.getElementById('removeColumnBtn').style.display = 'inline-block';
const tableBody = document.querySelector('#dataTable tbody');
const rows = tableBody.querySelectorAll('tr');
rows.forEach((row) => {
// Check if this is a colspan row
const colspanCell = row.querySelector('td[colspan]');
if (colspanCell) {
// Update colspan value
const currentColspan = parseInt(colspanCell.getAttribute('colspan'));
colspanCell.setAttribute('colspan', currentColspan + 1);
return; // Skip adding new cell for colspan rows
}
const rows = document.querySelectorAll('#dataTable tbody tr');
rows.forEach((row, index) => {
const newCell = document.createElement('td');
newCell.className = 'text-center';
if (index === 0) {
// Check if the row contains an image upload field
const hasImageUpload = row.querySelector('.file-input');
if (hasImageUpload) {
// Create image upload structure
const imgContainer = document.createElement('div');
imgContainer.className = 'flex flex-col items-center';
const imgElement = document.createElement('img');
imgElement.src = '';
imgElement.className = 'img-responsive';
@@ -598,72 +742,87 @@
imgElement.style.width = '10rem';
imgElement.style.height = '10rem';
imgElement.style.display = 'none';
imgElement.id = `uploadedImage${columnCount}-${index + 1}`;
imgElement.id = `uploadedImage${columnCount + 1}`;
const fileInput = document.createElement('input');
fileInput.type = 'file';
fileInput.className = 'file-input';
fileInput.placeholder = '';
fileInput.className = 'file-input mt-2';
fileInput.name = `foto_pembanding[]`; // Add name attribute for file inputs
fileInput.onchange = function(event) {
previewImage(event, imgElement.id);
};
newCell.appendChild(imgElement);
newCell.appendChild(fileInput);
imgContainer.appendChild(imgElement);
imgContainer.appendChild(fileInput);
newCell.appendChild(imgContainer);
} else {
// Other rows get text inputs
const numInputs = row.querySelectorAll('input').length;
// for (let i = 0; i < numInputs; i++) {
// Create text input for non-image cells
const textInput = document.createElement('input');
textInput.type = 'text';
textInput.className = 'input mt-2';
textInput.className = 'input';
textInput.placeholder = `Data Pembanding ${columnCount}`;
// Get the name from the first column's input
const firstColumnInput = row.querySelector('input[name]');
if (firstColumnInput) {
const baseFieldName = firstColumnInput.name.replace('[]', '');
if (baseFieldName.includes('_pembanding')) {
textInput.name = baseFieldName + '[]';
} else {
textInput.name = baseFieldName + '_pembanding[]';
}
}
newCell.appendChild(textInput);
// }
}
row.appendChild(newCell);
});
// Update colspan on label row
const colspanRow = document.createElement('tr');
const colspanCell = document.createElement('td');
colspanCell.colSpan = 3 + columnCount - 1;
colspanCell.textContent = `Data Pembanding ${columnCount}`;
colspanRow.appendChild(colspanCell);
document.querySelector('#dataTable tbody').insertBefore(colspanRow, rows[0]);
});
document.getElementById('removeColumnBtn').addEventListener('click', function() {
if (columnCount > 1) { // Pastikan ada kolom yang bisa dihapus
columnCount--; // Decrement jumlah kolom
// Modified submit function to collect all data
function submitDataPembanding() {
const formElement = $('#dataPembandingForm')[0];
const formData = new FormData(formElement);
$('#saveButton').prop('disabled', true);
$('#saveButtonText').hide();
$('#saveButtonSpinner').show();
const headers = document.querySelectorAll('#dataTable thead tr th');
headers[headers.length - 1].remove();
const rows = document.querySelectorAll('#dataTable tbody tr');
rows.forEach(row => {
const cells = row.querySelectorAll('td');
cells[cells.length - 1].remove();
});
if (columnCount === 1) {
document.getElementById('removeColumnBtn').style.display = 'none';
// Log form data for debugging
for (let pair of formData.entries()) {
console.log(pair[0] + ': ' + pair[1]);
}
$.ajax({
url: '{{ route('surveyor.storeDataPembanding') }}',
type: 'POST',
data: formData,
processData: false,
contentType: false,
headers: {
'X-CSRF-TOKEN': '{{ csrf_token() }}'
},
success: function(response) {
if (response.success) {
window.location.href =
'{{ route('surveyor.show', ['id' => $permohonan->id]) }}?form=form-inspeksi';
toastrSuccessBuild(response.message);
}
console.log(response);
},
error: function(xhr, status, error) {
console.error('Terjadi error:', error);
console.log('Status:', status);
console.log('Response:', xhr.responseText);
toastrErrorBuild(error);
},
complete: function() {
$('#saveButton').prop('disabled', false);
$('#saveButtonText').show();
$('#saveButtonSpinner').hide();
}
});
function previewImage(event, imgElementId) {
const file = event.target.files[0];
const imgElement = document.getElementById(imgElementId);
if (file) {
const reader = new FileReader();
reader.onload = function(e) {
imgElement.src = e.target.result;
imgElement.style.display = 'block';
}
reader.readAsDataURL(file);
}
}
</script>
</div>

View File

@@ -5,6 +5,7 @@
@endsection --}}
@section('content')
@include('lpj::assetsku.includenya')
<div class="w-full grid gap-5 lg:gap-7.5 mx-auto">
<div class="card min-w-full">
<div class="card min-w-full">
@@ -234,6 +235,7 @@
if (response.success) {
window.location.href =
'{{ route('surveyor.show', ['id' => $permohonan->id]) }}?form=denah';
toastrSuccessBuild(response.message);
}
console.log(response);
},
@@ -249,6 +251,8 @@
console.log('Status:', status);
console.log('Response:', xhr.responseText);
console.log(errors);
toastrErrorBuild(error);
},
complete: function() {
// Re-enable the button and hide the spinner

View File

@@ -5,6 +5,7 @@
@endsection --}}
@section('content')
@include('lpj::assetsku.includenya')
<div class="w-full grid gap-5 lg:gap-7.5 mx-auto">
<div class="card min-w-full">
<div class="card min-w-full">
@@ -588,104 +589,14 @@
</div>
<!-- Modal Kamera -->
<div class="modal fade" data-modal="true" id="cameraModal" data-backdrop="" data-keyboard="false">
<div class="modal-content">
<div class="modal-header">
<h3 class="modal-title">Ambil Foto</h3>
<button class="btn btn-xs btn-icon btn-light" data-modal-dismiss="true" id="closeModal">
<i class="ki-outline ki-cross"></i>
</button>
</div>
<!-- Camera Interface -->
<div class="modal-body">
<div class="camera-container relative">
<video id="video" class="w-full h-auto" autoplay playsinline></video>
<canvas id="canvas" class="hidden w-full h-auto"></canvas>
<canvas id="drawingCanvas" class="hidden absolute top-0 left-0 w-full h-full"></canvas>
<div id="textOverlay" class="position-absolute top-0 left-0 w-100 h-100 pointer-events-none">
</div>
</div>
<div class="modal-footer mt-2">
<div id="cameraControls" class="flex justify-center gap-2 mt-4">
<button id="startButton" class="btn btn-primary">
<i class="ki-outline ki-camera"></i> Start Camera
</button>
<button id="takePhotoButton" class="btn btn-success" disabled>
<i class="ki-outline ki-photograph"></i> Ambil Foto
</button>
<button id="switchButton" class="btn btn-info" disabled>
<i class="ki-outline ki-arrows-circle"></i> Switch Camera
</button>
</div>
<!-- Editor Controls -->
<div id="editorControls" class=" flex flex-wrap gap-2 mt-4">
<div class="drawing-tools flex gap-2">
<button class="tool-btn btn btn-sm" data-tool="brush">
<i class="ki-filled ki-brush"></i>
</button>
<button class="tool-btn btn btn-sm" data-tool="rectangle">
<i class="ki-filled ki-frame"></i>
</button>
<button class="btn btn-light btn-sm tool-btn" data-tool="arrow">
<i class="ki-duotone ki-arrow-right fs-2"></i>
</button>
<button class="tool-btn btn btn-sm" data-tool="circle">
<i class="ki-filled ki-mouse-circle"></i>
</button>
<button class="tool-btn btn btn-sm" data-tool="text">
<i class="ki-filled ki-text"></i>
</button>
</div>
<div class="drawing-settings flex gap-2">
<input type="color" id="colorPicker" class="w-8 h-8 rounded">
<div class="flex items-center gap-2">
<input type="range" id="brushSize" min="1" max="20" value="5"
class="range range-sm">
<span id="brushSizeValue" class="text-sm">5px</span>
</div>
<input type="text" id="textInput" class="input" placeholder="Enter text">
<button type="button" class="btn btn-primary" id="confirmTextBtn">Add Text</button>
</div>
<div class="history-controls flex gap-2">
<button id="undoButton" class="btn btn-sm">
<i class="ki-filled ki-arrows-loop"></i>
</button>
<button id="resetButton" class="btn btn-sm">
<i class="ki-outline ki-trash"></i>
</button>
</div>
<div class="final-controls flex gap-2">
<button type="button" class="btn btn-light btn-sm" data-modal-dismiss="true">Cancel</button>
<button id="backButton" class="btn btn-warning btn-sm">
<i class="ki-outline ki-arrow-left"></i> Kembali
</button>
<button id="saveButton" class="btn btn-success btn-sm" data-modal-dismiss="true">
<i class="ki-outline ki-check"></i> Simpan
</button>
</div>
</div>
</div>
</div>
</div>
</div>
@include('lpj::surveyor.components.modal-kamera')
@endsection
@push('scripts')
<script>
function submitFoto() {
const formElement = $('#formFoto')[0];
const formData = new FormData(formElement);
@@ -712,6 +623,7 @@
if (response.success) {
window.location.href =
'{{ route('surveyor.show', ['id' => $permohonan->id]) }}?form=foto';
toastrSuccessBuild(response.message);
}
},
@@ -727,6 +639,7 @@
console.log('Status:', status);
console.log('Response:', xhr.responseText);
console.log(errors);
toastrErrorBuild(error);
},
complete: function() {
// Re-enable the button and hide the spinner
@@ -738,307 +651,6 @@
}
</script>
@include('lpj::surveyor.js.camera-editor')
<script>
document.addEventListener("DOMContentLoaded", function() {
const ruteLainnyaDiv = document.getElementById("ruteLainnya");
const lantaiLainnyaDiv = document.getElementById("lantaiLainnya");
// Function to add delete event listeners to existing buttons
function addDeleteListeners(container) {
container.querySelectorAll(".delete-button").forEach(button => {
button.addEventListener("click", function() {
this.closest(
".flex.items-baseline.flex-wrap.lg\\:flex-nowrap.gap-2\\.5.mb-5"
).remove();
});
});
}
// Add delete listeners to existing buttons
addDeleteListeners(ruteLainnyaDiv);
addDeleteListeners(lantaiLainnyaDiv);
function createNewDiv(container, inputName) {
const newDiv = document.createElement("div");
newDiv.className = "flex items-baseline flex-wrap lg:flex-nowrap gap-2.5 mb-5";
newDiv.innerHTML = `
<label class="flex flex-col form-label max-w-56">
Masukkan nama ${inputName}
</label>
<div class="flex flex-wrap items-baseline w-full">
<div class="flex flex-col lg:flex-row gap-2 w-full">
<div class="flex flex-wrap items-baseline px-2">
<input class="input" type="text" name="name_${inputName}[]">
</div>
<div class=" w-full flex flex-col gap-2">
<img id="foto_${inputName}-preview"
src="{{ isset($formFoto['gerbang']) ? asset('storage/' . $formFoto['gerbang']) : '' }}"
alt="Foto Gerbong" class="mt-2 max-w-full h-auto"
style="{{ isset($formFoto['gerbang']) ? '' : 'display: none;' }} width: 30rem;">
<div class="input-group w-full flex gap-2">
<input id="inputLainnya" type="file" name="foto_${inputName}[]"
class="file-input file-input-bordered w-full" accept="image/*" capture="camera"
onchange="previewImage(this, 'foto_${inputName}-preview')"
>
<button type="button" id="btnCamera" class="btn btn-light"
data-modal-toggle="#cameraModal">
<i class="ki-outline ki-abstract-33"></i> Camera
</button>
</div>
</div>
<button type="button" class="btn btn-danger btn-sm delete-button">
<i class="ki-filled ki-trash"></i>
</button>
</div>
</div>
`;
container.appendChild(newDiv);
addDeleteListeners(container);
}
document.getElementById("btnAddMore").addEventListener("click", function() {
createNewDiv(ruteLainnyaDiv, "rute_lainnya");
});
document.getElementById("btnAddMoreObject").addEventListener("click", function() {
createNewDiv(lantaiLainnyaDiv, "lantai_lainnya");
});
});
const style = document.createElement('style');
style.textContent = `
.draggable-text {
z-index: 1000;
}
.draggable-text:hover {
outline: 1px dashed #666;
}
`;
document.head.appendChild(style);
document.addEventListener('DOMContentLoaded', function() {
const editor = new UniversalCameraEditor();
const cameraButtons = document.querySelectorAll('#btnCamera');
const modal = document.getElementById('cameraModal');
const closeModal = document.getElementById('closeModal');
// Current input field to update
let currentInputField = null;
// Handle camera button click
cameraButtons.forEach(button => {
button.addEventListener('click', function(e) {
e.preventDefault();
const inputContainer = this.closest('.input-group');
currentInputField = inputContainer.querySelector('input[type="file"]');
modal.classList.remove('hidden');
modal.classList.add('modal-open');
editor.startCamera();
});
});
closeModal.addEventListener('click', function() {
modal.classList.add('hidden');
editor.closeCamera();
});
// Override save function
editor.saveAndUpload = async function() {
try {
// Create final canvas
const finalCanvas = document.createElement('canvas');
finalCanvas.width = this.canvas.width;
finalCanvas.height = this.canvas.height;
const ctx = finalCanvas.getContext('2d');
// Draw original photo and edited result on final canvas
ctx.drawImage(this.canvas, 0, 0);
ctx.drawImage(this.drawingCanvas, 0, 0);
// Convert canvas to Blob and create file
finalCanvas.toBlob(async (blob) => {
const file = new File([blob], `camera_photo_${Date.now()}.jpg`, {
type: "image/jpeg"
});
// Create FileList and update input field
const dataTransfer = new DataTransfer();
dataTransfer.items.add(file);
if (currentInputField) {
currentInputField.files = dataTransfer.files;
const event = new Event('change', {
bubbles: true
});
currentInputField.dispatchEvent(event);
const previewContainer = currentInputField.closest('.input-group')
.querySelector('.preview-container');
if (previewContainer) {
const img = document.createElement('img');
img.src = URL.createObjectURL(file);
img.className = 'w-full h-32 object-cover rounded-lg';
previewContainer.innerHTML = '';
previewContainer.appendChild(img);
}
}
// Close modal
modal.classList.remove('show');
modal.style.display = 'none';
modal.setAttribute('aria-hidden', 'true');
// document.body.classList.remove('modal-open');
// Remove modal backdrop if exists
const backdrop = document.querySelector('.modal-backdrop');
if (backdrop) {
backdrop.remove();
}
// Stop camera stream
if (editor.stream) {
editor.stream.getTracks().forEach(track => track.stop());
editor.stream = null;
}
// Reset camera to initial state
editor.closeCamera();
// Reset scroll if needed
window.scrollTo(0, 0); // Adjust as necessary
}, 'image/jpeg', 0.8);
} catch (error) {
console.error('Error saving photo:', error);
alert('Error saving photo. Please try again.');
}
};
// Handle escape key
document.addEventListener('keydown', function(e) {
if (e.key === 'Escape') {
const modal = document.getElementById('cameraModal');
if (modal.classList.contains('modal-open')) {
modal.classList.remove('modal-open');
modal.classList.add('hidden');
if (editor.stream) {
editor.stream.getTracks().forEach(track => track.stop());
}
}
}
});
function setupInputHandlers(containerId, buttonId, labelText, inputDataClass, buttonDeleteClass) {
const inputContainer = document.getElementById(containerId);
const addButton = document.getElementById(buttonId);
function updateLabels() {
const labels = inputContainer.querySelectorAll('.form-label span');
labels.forEach((label, index) => {
label.textContent = `${labelText} ${index + 1}`;
});
}
function handleDeleteButtons() {
const deleteBtns = inputContainer.querySelectorAll(`.${buttonDeleteClass}`);
deleteBtns.forEach(btn => {
btn.style.display = inputContainer.children.length > 1 ? 'block' : 'none';
});
}
function createNewInput() {
const newDiv = inputContainer.children[0].cloneNode(true);
const inputFile = newDiv.querySelector(`.${inputDataClass}`);
inputFile.id = `inputRute-${inputContainer.children.length}`;
// Reset input file value
if (inputFile) {
inputFile.value = '';
}
// Update the camera button to set currentInputField
const cameraButton = newDiv.querySelector('#btnCamera');
if (cameraButton) {
cameraButton.addEventListener('click', function(e) {
e.preventDefault();
currentInputField = inputFile; // Set current input field to the new input
modal.classList.remove('hidden');
modal.classList.add('modal-open');
editor.startCamera();
});
}
// Add delete button functionality
const deleteBtn = newDiv.querySelector(`.${buttonDeleteClass}`);
if (deleteBtn) {
deleteBtn.addEventListener('click', function() {
inputContainer.removeChild(newDiv);
handleDeleteButtons();
updateLabels();
});
}
// Update preview container
const previewContainer = document.createElement('div');
previewContainer.className = 'preview-container';
const img = document.createElement('img');
img.id = `foto_rute-preview-${inputFile.id}`;
img.src = '';
img.className = 'mt-2 h-auto';
img.style.display = 'none';
img.style.width = '30rem';
previewContainer.appendChild(img);
// Append preview container to the new input group
const inputGroup = newDiv.querySelector('.input-group');
inputGroup.appendChild(previewContainer);
newDiv.style.marginTop = '10px';
inputContainer.appendChild(newDiv);
updateLabels();
handleDeleteButtons();
}
if (addButton) {
addButton.addEventListener('click', createNewInput);
}
const firstDeleteBtn = inputContainer.children[0].querySelector(`.${buttonDeleteClass}`);
if (firstDeleteBtn) {
firstDeleteBtn.addEventListener('click', function() {
if (inputContainer.children.length > 1) {
inputContainer.removeChild(this.closest('.flex'));
handleDeleteButtons();
updateLabels();
}
});
}
updateLabels();
}
setupInputHandlers('inputContainerRute', 'btnRute', 'Foto Rute Menuju Lokasi', 'file-input',
'delete-btn');
setupInputHandlers('inputContainerLantai', 'btnLantai', 'Foto Lantai', 'file-input', 'delete-btn');
setupInputHandlers('inputContainerLingkungan', 'btnLingkungan', 'Lingkungan', 'file-input',
'delete-btn');
});
</script>
@endpush

View File

@@ -1,4 +1,4 @@
<div class=" card w-full bg-white rounded-lg shadow-md overflow-hidden">
<div class=" card w-full bg-white rounded-lg shadow-md ">
<div class="card-body">
<div class="py-4">
<h1 class="text-md font-medium text-gray-900">Order Penilaian</h1>
@@ -79,7 +79,7 @@
</div>
<div class="card w-full bg-white rounded-lg shadow-md overflow-hidden">
<div class="card w-full bg-white rounded-lg shadow-md ">
<div class="card-body">
<div class="py-4 ">
<h1 class="text-md font-medium text-gray-900">Deskripsi Aset jaminan</h1>
@@ -99,35 +99,35 @@
<div class="flex-wrap items-stretch">
<div class="grid grid-cols-3 md:grid-cols-3 gap-4 mt-2">
<label class="form-label flex items-center gap-3 text-nowrap">
<input onclick="toggleFieldVisibility('jenis_asset', 'jenis_asset', ['tidak sesuai'])" type="radio" class="radio"
name="jenis_asset" value="sesuai"
<input onclick="toggleFieldVisibility('jenis_asset', 'jenis_asset', ['tidak sesuai'])"
type="radio" class="radio" name="jenis_asset" value="sesuai"
{{ old('jenis_asset', $forminspeksi['asset']['jenis_asset'] ?? '') == 'sesuai' ? 'checked' : '' }}>
<span class="ml-2">Ya</span>
</label>
<label class="form-label flex items-center gap-2.5 text-nowrap">
<input onclick="toggleFieldVisibility('jenis_asset', 'jenis_asset', ['tidak sesuai'])" type="radio" class="radio"
name="jenis_asset" value="tidak sesuai"
<input onclick="toggleFieldVisibility('jenis_asset', 'jenis_asset', ['tidak sesuai'])"
type="radio" class="radio" name="jenis_asset" value="tidak sesuai"
{{ old('jenis_asset', $forminspeksi['asset']['jenis_asset'] ?? '') == 'tidak sesuai' ? 'checked' : '' }}>
<span class="ml-2">Tidak</span>
</label>
<!-- Select dropdown untuk "Tidak Sesuai" -->
<div id="jenis_asset" class="flex items-baseline gap-2" style="{{ old('jenis_asset', $forminspeksi['asset']['jenis_asset'] ?? '') == 'tidak sesuai' ? '' : 'display: none;' }}">
<select
class="input w-full"
name="jenis_asset_tidak_sesuai"
>
<div id="jenis_asset" class="flex items-baseline gap-2"
style="{{ old('jenis_asset', $forminspeksi['asset']['jenis_asset'] ?? '') == 'tidak sesuai' ? '' : 'display: none;' }}">
<select id="jenis_asset_tidak_sesuai" class="input w-full"
name="jenis_asset_tidak_sesuai">
<option value="">Select Jenis asset</option>
@if (isset($jenisJaminan))
@foreach ($jenisJaminan as $item)
<option value="{{ $item->name }}"
<option value="{{ $item->id }}"
{{ old('jenis_asset_tidak_sesuai', $forminspeksi['asset']['jenis_asset_tidak_sesuai'] ?? '') == $item->name ? 'selected' : '' }}>
{{ $item->name }}
</option>
@endforeach
@endif
</select>
<button type="button" class="btn btn-md btn-primary">Save</button>
<button type="button" class="btn btn-md btn-primary"
onclick="updateAnalisa('jenis_asset')">Save</button>
</div>
</div>
@@ -139,7 +139,6 @@
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Alamat</label>
<div>
@foreach ($permohonan->debiture->documents as $dokumen)
<span class="text-2sm text-gray-700">
{{ formatAlamat($dokumen) }}
@@ -147,209 +146,138 @@
@endforeach
<div class="flex-wrap items-stretch">
<div class="grid grid-cols-3 md:grid-cols-3 gap-4 mt-2">
<div class="grid grid-cols-3 md:grid-cols-3 gap-4 mt-2">
<label class="form-label flex items-center gap-3 text-nowrap">
<input onclick="toggleTidakSesuai('alamat_sesuai','alamat_tidak_sesuai')" type="radio"
class="radio" name="alamat_sesuai" value="sesuai"
{{ old('alamat_sesuai', $forminspeksi['asset']['alamat_sesuai'] ?? '') == 'sesuai' ? 'checked' : '' }}>
<input
onclick="toggleAlamatVisibility('alamat_sesuai', 'alamat_tidak_sesuai', 'sesuai')"
type="radio" class="radio" name="alamat_sesuai" value="sesuai"
{{ old('jenis_asset', $forminspeksi['asset']['jenis_asset'] ?? '') == 'sesuai' ? 'checked' : '' }}>
<span class="ml-2">Ya</span>
</label>
<label class="form-label flex items-center gap-2.5 text-nowrap">
<input onclick="toggleTidakSesuai('alamat_sesuai','alamat_tidak_sesuai')" type="radio"
class="radio" name="alamat_sesuai" value="tidak sesuai"
{{ old('alamat_sesuai', $forminspeksi['asset']['alamat_sesuai'] ?? '') == 'tidak sesuai' ? 'checked' : '' }}>
<label class="form-label flex items-center gap-3 text-nowrap">
<input
onclick="toggleAlamatVisibility('alamat_sesuai', 'alamat_tidak_sesuai', 'tidak sesuai')"
type="radio" class="radio" name="alamat_sesuai" value="tidak sesuai"
{{ old('jenis_asset', $forminspeksi['asset']['jenis_asset'] ?? '') == 'tidak sesuai' ? 'checked' : '' }}>
<span class="ml-2">Tidak</span>
</label>
</div>
</div>
<em id="error-alamat" class="alert text-danger text-sm"></em>
</div>
<div id="alamat_tidak_sesuai" class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5" style="display: none;">
<label class="form-label max-w-56">
Address
</label>
<div class="flex flex-wrap items-baseline w-full">
<div class="flex flex-col lg:flex-row gap-2 w-full">
<div class="flex flex-wrap items-baseline w-full">
<select id="province_code" name="province_code" class="select w-full @error('province_code') border-danger bg-danger-light @enderror">
<option value="">Select Province</option>
@foreach($provinces as $province)
@if(isset($debitur))
<option value="{{ $province->code }}" {{ isset($debitur->province_code) && $debitur->province_code == $province->code?'selected' : '' }}>
{{ $province->name }}
</option>
@else
<option value="{{ $province->code }}">
{{ $province->name }}
</option>
@endif
@endforeach
</select>
@error('province_code')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
<div class="flex flex-wrap items-baseline w-full">
<select id="city_code" name="city_code" class="select w-full @error('city_code') border-danger bg-danger-light @enderror">
<option value="">Select City</option>
@if(isset($cities))
@foreach($cities as $city)
@if(isset($debitur))
<option value="{{ $city->code }}" {{ isset($debitur->city_code) && $debitur->city_code == $city->code?'selected' : '' }}>
{{ $city->name }}
</option>
@else
<option value="{{ $city->code }}">
{{ $city->name }}
</option>
@endif
@endforeach
@endif
</select>
@error('city_code')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
<div class="flex flex-col lg:flex-row gap-2 w-full mt-2 lg:mt-5">
<div class="flex flex-wrap items-baseline w-full">
<select id="district_code" name="district_code" class="select w-full @error('district_code') border-danger bg-danger-light @enderror">
<option value="">Select District</option>
@if(isset($districts))
@foreach($districts as $district)
@if(isset($debitur))
<option value="{{ $district->code }}" {{ isset($debitur->district_code) && $debitur->district_code == $district->code?'selected' : '' }}>
{{ $district->name }}
</option>
@else
<option value="{{ $district->code }}">
{{ $district->name }}
</option>
@endif
@endforeach
@endif
</select>
@error('district_code')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
<div class="flex flex-wrap items-baseline w-full">
<select id="village_code" name="village_code" class="select w-full @error('district_code') border-danger bg-danger-light @enderror">
<option value="">Select Village</option>
@if(isset($villages))
@foreach($villages as $village)
@if(isset($debitur))
<option value="{{ $village->code }}" {{ isset($debitur->village_code) && $debitur->village_code == $village->code?'selected' : '' }}>
{{ $village->name }}
</option>
@else
<option value="{{ $village->code }}">
{{ $village->name }}
</option>
@endif
@endforeach
@endif
</select>
@error('district_code')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
<div class="flex flex-wrap items-baseline w-full">
<input class="input @error('postal_code') border-danger bg-danger-light @enderror" type="number" id="postal_code" name="postal_code" value="{{ $debitur->postal_code ?? '' }}" placeholder="Postal Code">
@error('postal_code')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
<div class="flex flex-row w-full mt-2 lg:mt-5">
<textarea class="textarea @error('address') border-danger bg-danger-light @enderror" rows="3" type="number" id="address" name="address">{{ $debitur->address ?? '' }}</textarea>
@error('address')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</div>
</div>
<div id="alamat_tidak_sesuai" class="grid gap-2 mt-5" style="display: none;">
{{-- Alamat Sesuai --}}
<div id="alamat_sesuai" class="grid gap-2 mt-5" style="display: none;">
@foreach ($permohonan->debiture->documents as $dokumen)
@php
$inputDataLoaksi = [];
$inputDataLoaksi = [
$fields = [
[
'label' => 'Jl.',
'index' => 0,
'value' => $dokumen->address ?? '',
'name' => 'nama_jalan',
'value' => old(
'nama_jalan',
isset($forminspeksi['asset']['nama_jalan']) ? $forminspeksi['asset']['nama_jalan'] : '',
),
],
[
'label' => 'Desa/Kelurahan',
'index' => 3,
'name' => 'desa_kelurahan',
'value' => old(
'desa_kelurahan',
isset($forminspeksi['asset']['desa_kelurahan']) ? $forminspeksi['asset']['desa_kelurahan'] : '',
),
],
[
'label' => 'Kecamatan',
'index' => 4,
'name' => 'kecamatan',
'value' => old(
'kecamatan',
isset($forminspeksi['asset']['kecamatan']) ? $forminspeksi['asset']['kecamatan'] : '',
),
],
[
'label' => 'Kota/Kabupaten',
'index' => 5,
'name' => 'kota_kabupaten',
'value' => old(
'kota_kabupaten',
isset($forminspeksi['asset']['kota_kabupaten']) ? $forminspeksi['asset']['kota_kabupaten'] : '',
),
'readonly' => false,
],
[
'label' => 'Provinsi',
'index' => 6,
'value' => $dokumen->province->name ?? '',
'name' => 'provinsi',
'value' => old(
'provinsi',
isset($forminspeksi['asset']['provinsi']) ? $forminspeksi['asset']['provinsi'] : '',
),
'readonly' => true,
],
[
'label' => 'Kota/Kabupaten',
'value' => $dokumen->city->name ?? '',
'name' => 'kota_kabupaten',
'readonly' => true,
],
[
'label' => 'Kecamatan',
'value' => $dokumen->district->name ?? '',
'name' => 'kecamatan',
'readonly' => true,
],
[
'label' => 'Kelurahan',
'value' => $dokumen->village->name ?? '',
'name' => 'desa_kelurahan',
'readonly' => true,
],
];
@endphp
@if (count($inputDataLoaksi) > 0)
@foreach ($inputDataLoaksi as $item)
<!-- Nomor Lambung -->
@foreach ($fields as $field)
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">{{ $item['label'] }}</label>
<label class="form-label max-w-56">{{ $field['label'] }}</label>
<div class="flex flex-wrap items-baseline w-full">
<input type="text" name="{{ $item['name'] }}" class="input"
placeholder="Masukkan {{ $item['label'] }}"
value="{{ $item['value'] }}">
<em id="error-{{ $item['name'] }}" class="alert text-danger text-sm"></em>
<input type="text" class="input" name="{{ $field['name'] }}"
value="{{ $field['value'] }}" {{ $field['readonly'] ? 'readonly' : '' }}>
</div>
</div>
@endforeach
@endforeach
</div>
{{-- Alamat Tidak Sesuai --}}
<div id="alamat_tidak_sesuai" class="grid gap-2 mt-5" style="display: none;">
@php
$inputDataLokasi = [
['label' => 'Jl.', 'id' => 'address', 'name' => 'address', 'type' => 'text'],
[
'label' => 'Provinsi',
'id' => 'province_code',
'name' => 'provinsi',
'type' => 'select',
'options' => $provinces,
],
[
'label' => 'Kota/Kabupaten',
'id' => 'city_code',
'name' => 'kota_kabupaten',
'type' => 'select',
'options' => $provinces,
],
[
'label' => 'Kecamatan',
'id' => 'district_code',
'name' => 'kecamatan',
'type' => 'select',
'options' => $provinces,
],
[
'label' => 'Desa/Kelurahan',
'id' => 'village_code',
'name' => 'desa_kelurahan',
'type' => 'select',
'options' => $provinces,
],
];
@endphp
@foreach ($inputDataLokasi as $item)
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">{{ $item['label'] }}</label>
<div class="flex flex-wrap items-baseline w-full">
@if ($item['type'] === 'text')
<input id="{{ $item['id'] }}" name="{{ $item['name'] }}" class="input">
@else
<select id="{{ $item['id'] }}" name="{{ $item['name'] }}"
class="select w-full">
<option value="">{{ $item['label'] }}</option>
@if ($item['id'] === 'province_code')
@foreach ($item['options'] as $option)
<option value="{{ $option->code }}">{{ $option->name }}</option>
@endforeach
@endif
</select>
@endif
</div>
</div>
@endforeach
</div>
</div>
</div>
</div>
</div>
</div>
@@ -363,12 +291,15 @@
<label class="form-label max-w-56">Kordinat</label>
<div id="perwakilan" class="flex items-baseline w-full gap-5">
<div class="grid grid-cols-2 gap-4 items-center w-full">
<input class="input" type="text" placeholder="Masukan Koordinat Latitude" type="text" name="kordinat_lat" id="lat"
<input class="input" type="text" placeholder="Masukan Koordinat Latitude" type="text"
name="kordinat_lat" id="lat"
value="{{ old('kordinat_lat', isset($forminspeksi['asset']['kordinat_lat']) ? $forminspeksi['asset']['kordinat_lat'] : '') }}">
<input class="input" type="text" placeholder="Masukan Koordinat Longitude" name="kordinat_lng" id="lng"
value="{{ old('kordinat_lng', isset($forminspeksi['asset']['kordinat_lng']) ? $forminspeksi['asset']['kordinat_lng'] : '') }}" >
<input class="input" type="text" placeholder="Masukan Koordinat Longitude"
name="kordinat_lng" id="lng"
value="{{ old('kordinat_lng', isset($forminspeksi['asset']['kordinat_lng']) ? $forminspeksi['asset']['kordinat_lng'] : '') }}">
</div>
<a target="_blank" href="https://www.google.com/maps"type="button" class="btn btn-md btn-outline btn-primary" >
<a target="_blank" href="https://www.google.com/maps"type="button"
class="btn btn-md btn-outline btn-primary">
<i class="ki-filled ki-map"></i>Ambil
Kordinat</a>
</div>
@@ -477,21 +408,23 @@
<div>
<div class="flex flex-wrap items-baseline w-full">
@foreach ($permohonan->debiture->documents as $dokumen)
{{ $dokumen->pemilik->hubungan_pemilik->name?? "" }}
{{ $dokumen->pemilik->hubungan_pemilik->name ?? '' }}
@endforeach
</div>
<div class="flex-wrap items-stretch">
<div class="grid grid-cols-3 md:grid-cols-3 gap-4 mt-2">
<label class="form-label flex items-center gap-3 text-nowrap">
<input onclick="toggleFieldVisibility('hub_cadeb','hub_cadeb_tidak_sesuai', ['tidak sesuai'])" type="radio" class="radio"
name="hub_cadeb" value="sesuai"
<input
onclick="toggleFieldVisibility('hub_cadeb','hub_cadeb_tidak_sesuai', ['tidak sesuai'])"
type="radio" class="radio" name="hub_cadeb" value="sesuai"
{{ old('hub_cadeb', $forminspeksi['asset']['hub_cadeb'] ?? '') == 'sesuai' ? 'checked' : '' }}>
<span class="ml-2">Ya</span>
</label>
<label class="form-label flex items-center gap-2.5 text-nowrap">
<input onclick="toggleFieldVisibility('hub_cadeb','hub_cadeb_tidak_sesuai', ['tidak sesuai'])" type="radio" class="radio"
name="hub_cadeb" value="tidak sesuai"
<input
onclick="toggleFieldVisibility('hub_cadeb','hub_cadeb_tidak_sesuai', ['tidak sesuai'])"
type="radio" class="radio" name="hub_cadeb" value="tidak sesuai"
{{ old('hub_cadeb', $forminspeksi['asset']['hub_cadeb'] ?? '') == 'tidak sesuai' ? 'checked' : '' }}>
<span class="ml-2">Tidak</span>
</label>
@@ -524,24 +457,26 @@
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Penghuni Jaminan</label>
<div>
<div class="flex flex-wrap items-baseline w-full">
<div class="mt-2">
<div class="flex flex-wrap items-baseline w-full text-sm">
@foreach ($permohonan->debiture->documents as $dokumen)
{{ $dokumen->penghuni->hubungan_penghuni->name?? "" }}
{{ $dokumen->penghuni->hubungan_penghuni->name ?? 'N/A' }}
@endforeach
</div>
<div class="flex-wrap items-stretch">
<div class="grid grid-cols-3 md:grid-cols-3 gap-4 mt-2">
<label class="form-label flex items-center gap-3 text-nowrap">
<input onclick="toggleFieldVisibility('hub_cadeb_penghuni','hub_cadeb_Penghuni_tidak_sesuai', ['tidak sesuai'])" type="radio" class="radio"
name="hub_cadeb_penghuni" value="sesuai"
<input
onclick="toggleFieldVisibility('hub_cadeb_penghuni','hub_cadeb_Penghuni_tidak_sesuai', ['tidak sesuai'])"
type="radio" class="radio" name="hub_cadeb_penghuni" value="sesuai"
{{ old('hub_cadeb_penghuni', $forminspeksi['asset']['hub_cadeb_penghuni'] ?? '') == 'sesuai' ? 'checked' : '' }}>
<span class="ml-2">Ya</span>
</label>
<label class="form-label flex items-center gap-2.5 text-nowrap">
<input onclick="toggleFieldVisibility('hub_cadeb_penghuni', 'hub_cadeb_Penghuni_tidak_sesuai', ['tidak sesuai'])" type="radio" class="radio"
name="hub_cadeb_penghuni" value="tidak sesuai"
<input
onclick="toggleFieldVisibility('hub_cadeb_penghuni', 'hub_cadeb_Penghuni_tidak_sesuai', ['tidak sesuai'])"
type="radio" class="radio" name="hub_cadeb_penghuni" value="tidak sesuai"
{{ old('hub_cadeb_penghuni', $forminspeksi['asset']['hub_cadeb_penghuni'] ?? '') == 'tidak sesuai' ? 'checked' : '' }}>
<span class="ml-2">Tidak</span>
</label>
@@ -551,8 +486,8 @@
name="hub_cadeb_Penghuni_tidak_sesuai"
style="{{ old('hub_cadeb', $forminspeksi['asset']['hub_cadeb'] ?? '') == 'tidak sesuai' ? '' : 'display: none;' }}">
<option value="">Select Hubungan Cadeb</option>
@if (isset($hubCadeb))
@foreach ($hubCadeb as $item)
@if (isset($hubPenghuni))
@foreach ($hubPenghuni as $item)
<option value="{{ $item->name }}"
{{ old('hub_cadeb_Penghuni_tidak_sesuai', $forminspeksi['asset']['hub_cadeb_Penghuni_tidak_sesuai'] ?? '') == $item->name ? 'selected' : '' }}>
{{ $item->name }}
@@ -570,5 +505,3 @@
</div>
</div>

View File

@@ -165,15 +165,21 @@
@endif
</div>
<!-- Upload Photo Button -->
<div class=" flex w-full mt-2" style="margin-top: 20px">
<div class="flex flex-col input-group w-full">
<label for="" class="block text-sm font-medium text-gray-700">Upload Photo</label>
<div class="w-full">
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5" style="margin-top: 20px">
<label for="" class="form-label max-w-56 text-sm font-medium text-gray-700">Upload Photo</label>
<div class="w-full grid gap-5">
<div class="input-group w-full flex gap-2">
<input id="foto_tempat" type="file" name="foto_tempat"
class="file-input file-input-bordered w-full" accept="image/*"
onchange="previewImage(this, 'foto_tempat-preview')">
<button type="button" id="btnCamera" class="btn btn-light"
data-modal-toggle="#cameraModal">
<i class="ki-outline ki-abstract-33"></i> Camera
</button>
</div>
<img id="foto_tempat-preview"
src="{{ asset('storage/' . (isset($forminspeksi['foto_tempat']) ? $forminspeksi['foto_tempat'] : '')) }}"
@@ -181,14 +187,22 @@
style="{{ isset($forminspeksi['foto_tempat']) ? '' : 'display: none;' }}">
</div>
</div>
</div>77r7777
<!-- Notes Section -->
<div class="mt-2" >
<div class="bg-white rounded-lg">
<h4 class="block text-sm font-medium text-gray-700 mt-2">Catatan yang Perlu Diperhatikan
</h4>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5" style="margin-top: 20px">
<label class="form-label max-w-56">Catatan yang Perlu Diperhatikan
</label>
<div class="input-group w-full flex gap-2">
<textarea name="keterangan" class="textarea mt-2" placeholder="Masukkan catatan penting" rows="3">{{ old('keterangan', $forminspeksi['fakta']['keterangan'] ?? '') }}</textarea>
</div>
</div>
</div>
</div>
@include('lpj::surveyor.components.modal-kamera')
@push('scripts')
@include('lpj::surveyor.js.camera-editor')
@endpush

View File

@@ -5,6 +5,7 @@
@endsection --}}
@section('content')
@include('lpj::assetsku.includenya')
<div class="w-full grid gap-5 lg:gap-7.5 mx-auto">
<div class="card min-w-full">
<div class="card min-w-full">
@@ -124,6 +125,22 @@
}
function toggleAlamatVisibility(idSesuai, idTidakSesuai, selectedValue) {
// Ambil elemen berdasarkan ID
const alamatSesuai = document.getElementById(idSesuai);
const alamatTidakSesuai = document.getElementById(idTidakSesuai);
// Periksa nilai yang dipilih dan tampilkan elemen yang sesuai
if (selectedValue === 'sesuai') {
alamatSesuai.style.display = 'grid'; // Tampilkan "Alamat Sesuai"
alamatTidakSesuai.style.display = 'none'; // Sembunyikan "Alamat Tidak Sesuai"
} else if (selectedValue === 'tidak sesuai') {
alamatSesuai.style.display = 'none'; // Sembunyikan "Alamat Sesuai"
alamatTidakSesuai.style.display = 'grid'; // Tampilkan "Alamat Tidak Sesuai"
}
}
function submitData() {
const formElement = $('#formInspeksi')[0];
@@ -144,10 +161,12 @@
'X-CSRF-TOKEN': '{{ csrf_token() }}'
},
success: function(response) {
if (response.success) {
window.location.href =
'{{ route('surveyor.show', ['id' => $permohonan->id]) }}?form=inspeksi';
}
// if (response.success) {
// toastrSuccessBuild(response.message)
// window.location.href =
// '{{ route('surveyor.show', ['id' => $permohonan->id]) }}?form=inspeksi';
// }
console.log(response);
},
error: function(xhr, status, error) {
@@ -162,6 +181,7 @@
console.log('Status:', status);
console.log('Response:', xhr.responseText);
console.log(errors);
toastrErrorBuild(error);
},
complete: function() {
// Re-enable the button and hide the spinner
@@ -211,8 +231,53 @@
container.appendChild(newElement);
}
function updateAnalisa(params) {
const inputMap = {
jenis_asset: 'jenis_asset_tidak_sesuai',
analisa_tanah: 'analisa_tanah_tidak_sesuai',
analisa_unit: 'analisa_luas_unit_tidak_sesuai',
analisa_bangunan: 'analisa_bangunan_tidak_sesuai',
};
// Pastikan elemen ID ada di inputMap
if (!inputMap[params]) {
console.error('Parameter tidak valid:', params);
return;
}
// Ambil nilai berdasarkan parameter
const inputValue = document.getElementById(inputMap[params]).value;
const data = {
[params === 'jenis_asset' ? 'jenis_asset' : params.replace('analisa_', 'luas_')]: inputValue,
types: params
};
$.ajax({
url: '{{ route('surveyor.update_analisa', ['id' => $permohonan->id]) }}',
type: 'POST',
data: data,
headers: {
'X-CSRF-TOKEN': '{{ csrf_token() }}'
},
success: function(response) {
console.log(response);
if (response.success) {
if (response.jenis_asset) {
window.location.href =
'{{ route('surveyor.show', ['id' => $permohonan->id]) }}?form=inspeksi';
}
toastrSuccessBuild(response.message);
}
},
error: function(xhr, status, error) {
console.error('Terjadi error:', error);
console.log('Status:', status);
console.log('Response:', xhr.responseText);
toastrErrorBuild(error);
}
});
}
</script>
@endpush

View File

@@ -0,0 +1,88 @@
<div class="modal fade" data-modal="true" id="cameraModal" data-backdrop="" data-keyboard="false">
<div class="modal-content">
<div class="modal-header">
<h3 class="modal-title">Ambil Foto</h3>
<button class="btn btn-xs btn-icon btn-light" data-modal-dismiss="true" id="closeModal">
<i class="ki-outline ki-cross"></i>
</button>
</div>
<!-- Camera Interface -->
<div class="modal-body">
<div class="camera-container relative">
<video id="video" class="w-full h-auto" autoplay playsinline></video>
<canvas id="canvas" class="hidden w-full h-auto"></canvas>
<canvas id="drawingCanvas" class="hidden absolute top-0 left-0 w-full h-full"></canvas>
<div id="textOverlay" class="position-absolute top-0 left-0 w-100 h-100 pointer-events-none">
</div>
</div>
<div class="modal-footer mt-2">
<div id="cameraControls" class="flex justify-center gap-2 mt-4">
<button type="button" id="startButton" class="btn btn-primary">
<i class="ki-outline ki-camera"></i> Start Camera
</button>
<button type="button" id="takePhotoButton" class="btn btn-success" disabled>
<i class="ki-outline ki-photograph"></i> Ambil Foto
</button>
<button type="button" id="switchButton" class="btn btn-info" disabled>
<i class="ki-outline ki-arrows-circle"></i> Switch Camera
</button>
</div>
<!-- Editor Controls -->
<div id="editorControls" class=" flex flex-wrap gap-2 mt-4">
<div class="drawing-tools flex gap-2">
<button type="button" class="tool-btn btn btn-sm" data-tool="brush">
<i class="ki-filled ki-brush"></i>
</button>
<button type="button" class="tool-btn btn btn-sm" data-tool="rectangle">
<i class="ki-filled ki-frame"></i>
</button>
<button type="button" class="btn btn-light btn-sm tool-btn" data-tool="arrow">
<i class="ki-duotone ki-arrow-right fs-2"></i>
</button>
<button type="button" class="tool-btn btn btn-sm" data-tool="circle">
<i class="ki-filled ki-mouse-circle"></i>
</button>
<button type="button" class="tool-btn btn btn-sm" data-tool="text">
<i class="ki-filled ki-text"></i>
</button>
</div>
<div class="drawing-settings flex gap-2">
<input type="color" id="colorPicker" class="w-8 h-8 rounded">
<div class="flex items-center gap-2">
<input type="range" id="brushSize" min="1" max="20" value="5"
class="range range-sm">
<span id="brushSizeValue" class="text-sm">5px</span>
</div>
<input type="text" id="textInput" class="input" placeholder="Enter text">
<button type="button" class="btn btn-primary" id="confirmTextBtn">Add Text</button>
</div>
<div class="history-controls flex gap-2">
<button type="button" id="undoButton" class="btn btn-sm">
<i class="ki-filled ki-arrows-loop"></i>
</button>
<button type="button" id="resetButton" class="btn btn-sm">
<i class="ki-outline ki-trash"></i>
</button>
</div>
<div class="final-controls flex gap-2">
<button type="button" class="btn btn-light btn-sm" data-modal-dismiss="true">Cancel</button>
<button id="backButton" class="btn btn-warning btn-sm">
<i class="ki-outline ki-arrow-left"></i> Kembali
</button>
<button type="button" id="saveButton" class="btn btn-success btn-sm" data-modal-dismiss="true">
<i class="ki-outline ki-check"></i> Simpan
</button>
</div>
</div>
</div>
</div>
</div>
</div>

View File

@@ -15,11 +15,13 @@
@if (isset($permohonan->debiture->documents))
@foreach ($permohonan->debiture->documents as $item)
@php
$details = json_decode($item->detail);
$luas = $item->detail;
$details = json_decode($luas[0]->details, true);
$luas_tanah = isset($details['luas_tanah']) ? $details['luas_tanah'] : 'N/A';
@endphp
<p class="text-2sm text-gray-700">{{ $luas_tanah }} m2</p>
<p class="text-2sm text-gray-700">{{ $luas_tanah }} m<sup>2</sup></p>
@endforeach
@endif
<div class="flex-wrap items-stretch">
<div class="flex flex-wrap items-baseline w-full">
@@ -38,10 +40,10 @@
</label>
<div id="luas_tanah_tidak_sesuai" class="flex items-baseline gap-2"
style="{{ old('luas_tanah', $forminspeksi['tanah']['luas_tanah'] ?? '') == 'tidak sesuai' ? '' : 'display: none;' }}">
<input type="text" name="luas_tanah_tidak_sesuai" class="input w-full"
<input id="analisa_tanah_tidak_sesuai" type="text" name="luas_tanah_tidak_sesuai" class="input w-full"
placeholder="Masukan Luas Tanah"
value="{{ old('luas_tanah_tidak_sesuai', $forminspeksi['tanah']['luas_tanah_tidak_sesuai'] ?? '') }}">
<button type="button" class="btn btn-md btn-primary">Save</button>
<button type="button" class="btn btn-md btn-primary" onclick="updateAnalisa('analisa_tanah')">Save</button>
</div>
</div>
<em id="error-luas_tanah" class="alert text-danger text-sm"></em>
@@ -74,7 +76,8 @@
style="{{ old('hadap_mata_angin', $forminspeksi['tanah']['hadap_mata_angin'] ?? '') == 'tidak sesuai' ? '' : 'display: none;' }}">
<select
class="input w-full
name="hadap_mata_angin_tidak_sesuai">
id="hadap_matangin_tidak_sesuai"
name="analisa_tanah_hadap_mata_angin_tidak_sesuai">
<option value="">Select Hadap Mata Angin</option>
@if (isset($arahMataAngin))
@foreach ($arahMataAngin as $item)
@@ -85,7 +88,7 @@
@endforeach
@endif
</select>
<button type="button" class="btn btn-md btn-primary">Save</button>
{{-- <button type="button" class="btn btn-md btn-primary" onclick="updateAnalisa('hadap_mata_angin')">Save</button> --}}
</div>
</div>
<em id="error-hadap_mata_angin" class="alert text-danger text-sm"></em>

View File

@@ -200,8 +200,6 @@ function jadwal(id){
return `${day}-${month}-${year}`;
}
ihfdksfjhjfjbkdfkdsfdsjkjdjdsgjjgdgjhgdgjkhdshggkhgkhdghskghkjkhjsdgjkgdjhg
</script>
@endpush

View File

@@ -1,4 +1,304 @@
@push('scripts')
<script>
document.addEventListener("DOMContentLoaded", function() {
const ruteLainnyaDiv = document.getElementById("ruteLainnya");
const lantaiLainnyaDiv = document.getElementById("lantaiLainnya");
// Function to add delete event listeners to existing buttons
function addDeleteListeners(container) {
container.querySelectorAll(".delete-button").forEach(button => {
button.addEventListener("click", function() {
this.closest(
".flex.items-baseline.flex-wrap.lg\\:flex-nowrap.gap-2\\.5.mb-5"
).remove();
});
});
}
// Add delete listeners to existing buttons
addDeleteListeners(ruteLainnyaDiv);
addDeleteListeners(lantaiLainnyaDiv);
function createNewDiv(container, inputName) {
const newDiv = document.createElement("div");
newDiv.className = "flex items-baseline flex-wrap lg:flex-nowrap gap-2.5 mb-5";
newDiv.innerHTML = `
<label class="flex flex-col form-label max-w-56">
Masukkan nama ${inputName}
</label>
<div class="flex flex-wrap items-baseline w-full">
<div class="flex flex-col lg:flex-row gap-2 w-full">
<div class="flex flex-wrap items-baseline px-2">
<input class="input" type="text" name="name_${inputName}[]">
</div>
<div class=" w-full flex flex-col gap-2">
<img id="foto_${inputName}-preview"
src="{{ isset($formFoto['gerbang']) ? asset('storage/' . $formFoto['gerbang']) : '' }}"
alt="Foto Gerbong" class="mt-2 max-w-full h-auto"
style="{{ isset($formFoto['gerbang']) ? '' : 'display: none;' }} width: 30rem;">
<div class="input-group w-full flex gap-2">
<input id="inputLainnya" type="file" name="foto_${inputName}[]"
class="file-input file-input-bordered w-full" accept="image/*" capture="camera"
onchange="previewImage(this, 'foto_${inputName}-preview')"
>
<button type="button" id="btnCamera" class="btn btn-light"
data-modal-toggle="#cameraModal">
<i class="ki-outline ki-abstract-33"></i> Camera
</button>
</div>
</div>
<button type="button" class="btn btn-danger btn-sm delete-button">
<i class="ki-filled ki-trash"></i>
</button>
</div>
</div>
`;
container.appendChild(newDiv);
addDeleteListeners(container);
}
document.getElementById("btnAddMore").addEventListener("click", function() {
createNewDiv(ruteLainnyaDiv, "rute_lainnya");
});
document.getElementById("btnAddMoreObject").addEventListener("click", function() {
createNewDiv(lantaiLainnyaDiv, "lantai_lainnya");
});
});
const style = document.createElement('style');
style.textContent = `
.draggable-text {
z-index: 1000;
}
.draggable-text:hover {
outline: 1px dashed #666;
}
`;
document.head.appendChild(style);
document.addEventListener('DOMContentLoaded', function() {
const editor = new UniversalCameraEditor();
const cameraButtons = document.querySelectorAll('#btnCamera');
const modal = document.getElementById('cameraModal');
const closeModal = document.getElementById('closeModal');
// Current input field to update
let currentInputField = null;
// Handle camera button click
cameraButtons.forEach(button => {
button.addEventListener('click', function(e) {
e.preventDefault();
const inputContainer = this.closest('.input-group');
currentInputField = inputContainer.querySelector('input[type="file"]');
modal.classList.remove('hidden');
modal.classList.add('modal-open');
editor.startCamera();
});
});
closeModal.addEventListener('click', function() {
modal.classList.add('hidden');
editor.closeCamera();
});
// Override save function
editor.saveAndUpload = async function() {
try {
// Create final canvas
const finalCanvas = document.createElement('canvas');
finalCanvas.width = this.canvas.width;
finalCanvas.height = this.canvas.height;
const ctx = finalCanvas.getContext('2d');
// Draw original photo and edited result on final canvas
ctx.drawImage(this.canvas, 0, 0);
ctx.drawImage(this.drawingCanvas, 0, 0);
// Convert canvas to Blob and create file
finalCanvas.toBlob(async (blob) => {
const file = new File([blob], `camera_photo_${Date.now()}.jpg`, {
type: "image/jpeg"
});
// Create FileList and update input field
const dataTransfer = new DataTransfer();
dataTransfer.items.add(file);
if (currentInputField) {
currentInputField.files = dataTransfer.files;
const event = new Event('change', {
bubbles: true
});
currentInputField.dispatchEvent(event);
const previewContainer = currentInputField.closest('.input-group')
.querySelector('.preview-container');
if (previewContainer) {
const img = document.createElement('img');
img.src = URL.createObjectURL(file);
img.className = 'w-full h-32 object-cover rounded-lg';
previewContainer.innerHTML = '';
previewContainer.appendChild(img);
}
}
// Close modal
modal.classList.remove('show');
modal.style.display = 'none';
modal.setAttribute('aria-hidden', 'true');
// document.body.classList.remove('modal-open');
// Remove modal backdrop if exists
const backdrop = document.querySelector('.modal-backdrop');
if (backdrop) {
backdrop.remove();
}
// Stop camera stream
if (editor.stream) {
editor.stream.getTracks().forEach(track => track.stop());
editor.stream = null;
}
// Reset camera to initial state
editor.closeCamera();
// Reset scroll if needed
window.scrollTo(0, 0); // Adjust as necessary
}, 'image/jpeg', 0.8);
} catch (error) {
console.error('Error saving photo:', error);
alert('Error saving photo. Please try again.');
}
};
// Handle escape key
document.addEventListener('keydown', function(e) {
if (e.key === 'Escape') {
const modal = document.getElementById('cameraModal');
if (modal.classList.contains('modal-open')) {
modal.classList.remove('modal-open');
modal.classList.add('hidden');
if (editor.stream) {
editor.stream.getTracks().forEach(track => track.stop());
}
}
}
});
function setupInputHandlers(containerId, buttonId, labelText, inputDataClass, buttonDeleteClass) {
const inputContainer = document.getElementById(containerId);
const addButton = document.getElementById(buttonId);
function updateLabels() {
const labels = inputContainer.querySelectorAll('.form-label span');
labels.forEach((label, index) => {
label.textContent = `${labelText} ${index + 1}`;
});
}
function handleDeleteButtons() {
const deleteBtns = inputContainer.querySelectorAll(`.${buttonDeleteClass}`);
deleteBtns.forEach(btn => {
btn.style.display = inputContainer.children.length > 1 ? 'block' : 'none';
});
}
function createNewInput() {
const newDiv = inputContainer.children[0].cloneNode(true);
const inputFile = newDiv.querySelector(`.${inputDataClass}`);
inputFile.id = `inputRute-${inputContainer.children.length}`;
// Reset input file value
if (inputFile) {
inputFile.value = '';
}
// Update the camera button to set currentInputField
const cameraButton = newDiv.querySelector('#btnCamera');
if (cameraButton) {
cameraButton.addEventListener('click', function(e) {
e.preventDefault();
currentInputField = inputFile; // Set current input field to the new input
modal.classList.remove('hidden');
modal.classList.add('modal-open');
editor.startCamera();
});
}
// Add delete button functionality
const deleteBtn = newDiv.querySelector(`.${buttonDeleteClass}`);
if (deleteBtn) {
deleteBtn.addEventListener('click', function() {
inputContainer.removeChild(newDiv);
handleDeleteButtons();
updateLabels();
});
}
// Update preview container
const previewContainer = document.createElement('div');
previewContainer.className = 'preview-container';
const img = document.createElement('img');
img.id = `foto_rute-preview-${inputFile.id}`;
img.src = '';
img.className = 'mt-2 h-auto';
img.style.display = 'none';
img.style.width = '30rem';
previewContainer.appendChild(img);
// Append preview container to the new input group
const inputGroup = newDiv.querySelector('.input-group');
inputGroup.appendChild(previewContainer);
newDiv.style.marginTop = '10px';
inputContainer.appendChild(newDiv);
updateLabels();
handleDeleteButtons();
}
if (addButton) {
addButton.addEventListener('click', createNewInput);
}
const firstDeleteBtn = inputContainer.children[0].querySelector(`.${buttonDeleteClass}`);
if (firstDeleteBtn) {
firstDeleteBtn.addEventListener('click', function() {
if (inputContainer.children.length > 1) {
inputContainer.removeChild(this.closest('.flex'));
handleDeleteButtons();
updateLabels();
}
});
}
updateLabels();
}
setupInputHandlers('inputContainerRute', 'btnRute', 'Foto Rute Menuju Lokasi', 'file-input',
'delete-btn');
setupInputHandlers('inputContainerLantai', 'btnLantai', 'Foto Lantai', 'file-input', 'delete-btn');
setupInputHandlers('inputContainerLingkungan', 'btnLingkungan', 'Lingkungan', 'file-input',
'delete-btn');
});
</script>
<script>
class UniversalCameraEditor {
constructor() {

View File

@@ -448,7 +448,7 @@ Route::middleware(['auth'])->group(function () {
Route::get('export', [ActivityController::class, 'export'])->name('export');
Route::get('/', [ActivityController::class, 'index'])->name('index');
Route::put('update-team', [ActivityController::class, 'updateTeamAssingment'])->name('update-team');
Route::get('/{id}/show', [ActivityController::class, 'show'])->name('show');
Route::get('download/{id}', [ActivityController::class, 'download'])->name('download');
Route::get('senior', [ActivityController::class, 'senior'])->name('senior');
@@ -485,6 +485,7 @@ Route::middleware(['auth'])->group(function () {
Route::put('storeJadwal', [SurveyorController::class, 'storeJadwal'])->name('storeJadwal');
Route::put('storeAproved/{id}', [SurveyorController::class, 'storeAproved'])->name('storeAproved');
Route::post('storeFoto', [SurveyorController::class, 'storeFoto'])->name('storeFoto');
Route::post('storeDataPembanding', [SurveyorController::class, 'storeDataPembanding'])->name('storeDataPembanding');
Route::get('checkButtonStatus/{id}', [SurveyorController::class, 'checkButtonStatus'])->name('checkButtonStatus');
Route::get('datatables', [SurveyorController::class, 'dataForDatatables'])->name('datatables');
@@ -493,6 +494,8 @@ Route::middleware(['auth'])->group(function () {
Route::get('foto/{id}/{jaminanId}', [SurveyorController::class, 'foto'])->name('foto');
Route::get('data-pembanding/{id}/{jaminanId}', [SurveyorController::class, 'dataPembanding'])->name('data-pembanding');
Route::post('submitSurveyor/{id}', [SurveyorController::class, 'submitSurveyor'])->name('submitSurveyor');
Route::post('update_analisa/{id}', [SurveyorController::class, 'update_analisa'])->name('update_analisa');
});
Route::name('penilai.')->prefix('penilai')->group(function () {