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\Permohonan;
use Modules\Lpj\Models\Penilaian; use Modules\Lpj\Models\Penilaian;
use Modules\Lpj\Models\TeamsUsers; use Modules\Lpj\Models\TeamsUsers;
use Modules\Lpj\Models\PenilaianTeam;
use Modules\Lpj\Models\StatusPermohonan; use Modules\Lpj\Models\StatusPermohonan;
use Modules\Lpj\Exports\PermohonanExport; use Modules\Lpj\Exports\PermohonanExport;
use Maatwebsite\Excel\Facades\Excel; use Maatwebsite\Excel\Facades\Excel;
@@ -65,10 +66,33 @@ class ActivityController extends Controller
}) })
->get(); ->get();
return view('lpj::activity.progres_activity.index', compact('teamsActivity')); 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() public function senior()
{ {

View File

@@ -48,11 +48,14 @@ use Modules\Lpj\Models\MerupakanDaerah;
use Modules\Lpj\Models\ObjekJaminan; use Modules\Lpj\Models\ObjekJaminan;
use Modules\Lpj\Models\ModelAlatBerat; use Modules\Lpj\Models\ModelAlatBerat;
use Modules\Lpj\Models\JenisPesawat; use Modules\Lpj\Models\JenisPesawat;
use Modules\Lpj\Models\DokumenJaminan;
use Modules\Lpj\Models\DetailDokumenJaminan;
use Modules\Lpj\Models\JenisKapal; use Modules\Lpj\Models\JenisKapal;
use Modules\Lpj\Models\JenisKendaraan; use Modules\Lpj\Models\JenisKendaraan;
use Modules\Lpj\Models\RuteJaminan; use Modules\Lpj\Models\RuteJaminan;
use Modules\Lpj\Models\JenisJaminan; use Modules\Lpj\Models\JenisJaminan;
use Modules\Lpj\Models\HubunganPemilikJaminan; use Modules\Lpj\Models\HubunganPemilikJaminan;
use Modules\Lpj\Models\HubunganPenghuniJaminan;
use Modules\Lpj\Models\AnalisaUnit; use Modules\Lpj\Models\AnalisaUnit;
use Modules\Lpj\Models\GolonganMasySekitar; use Modules\Lpj\Models\GolonganMasySekitar;
use Modules\Lpj\Models\TingkatKeramaian; use Modules\Lpj\Models\TingkatKeramaian;
@@ -176,6 +179,8 @@ class SurveyorController extends Controller
{ {
$data = $request->validated(); $data = $request->validated();
if (!$data) { if (!$data) {
return response()->json(['success' => false, 'message' => 'Invalid data'], 400); 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(); $inspeksi = Inspeksi::where('permohonan_id', $request->input('permohonan_id'))->where('jenis_jaminan_id', $request->input('jenis_jaminan_id'))->first();
if ($inspeksi) { if (!$inspeksi) {
$inspeksi->update(['data_form' => json_encode($rules)]);
} else {
Inspeksi::create([ Inspeksi::create([
'permohonan_id' => $request->permohonan_id, 'permohonan_id' => $request->input('permohonan_id'),
'data_form' => json_encode($rules), 'data_form' => json_encode($rules),
'name' => $request->type, 'name' => $request->input('type'),
'jenis_jaminan_id' => $request->input('jenis_jaminan_id'), 'jenis_jaminan_id' => $request->input('jenis_jaminan_id'),
]); ]);
} else {
$inspeksi->update(['data_form' => json_encode($rules)]);
} }
DB::commit(); 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) { } catch (Exception $e) {
DB::rollBack(); DB::rollBack();
return response()->json(['success' => false, 'message' => 'Failed to save data: ' . $e->getMessage()], 500); 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()); ->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. * Form inspeksi.
*/ */
@@ -574,6 +616,7 @@ class SurveyorController extends Controller
$jenisPesawat = JenisPesawat::all(); $jenisPesawat = JenisPesawat::all();
$modelAlatBerat = ModelAlatBerat::all(); $modelAlatBerat = ModelAlatBerat::all();
$hubCadeb = HubunganPemilikJaminan::all(); $hubCadeb = HubunganPemilikJaminan::all();
$hubPenghuni = HubunganPenghuniJaminan::all();
$jenisJaminan = JenisJaminan::all(); $jenisJaminan = JenisJaminan::all();
$fasilitasObjek = FasilitasObjek::all(); $fasilitasObjek = FasilitasObjek::all();
$merupakanDaerah = MerupakanDaerah::all(); $merupakanDaerah = MerupakanDaerah::all();
@@ -622,7 +665,8 @@ class SurveyorController extends Controller
'merupakanDaerah', 'merupakanDaerah',
'terletakDiArea', 'terletakDiArea',
'posisiUnit', 'posisiUnit',
'bentukUnit' 'bentukUnit',
'hubPenghuni'
)); ));
} }
@@ -697,6 +741,7 @@ class SurveyorController extends Controller
$branches = Branch::all(); $branches = Branch::all();
$provinces = Province::all(); $provinces = Province::all();
$data = $this->getCommonData();
$inpeksi = Inspeksi::where('permohonan_id', $id)->where('jenis_jaminan_id', $jaminanId)->first(); $inpeksi = Inspeksi::where('permohonan_id', $id)->where('jenis_jaminan_id', $jaminanId)->first();
$forminspeksi = null; $forminspeksi = null;
@@ -706,7 +751,7 @@ class SurveyorController extends Controller
} }
// return response()->json($forminspeksi); // 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') ->route('basicdata.' . $type . '.index')
->with('success', 'Updated successfully'); ->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(), 'modelAlatBerat' => ModelAlatBerat::all(),
'jenisKapal' => JenisKapal::all(), 'jenisKapal' => JenisKapal::all(),
'jenisKendaraan' => JenisKendaraan::all(), 'jenisKendaraan' => JenisKendaraan::all(),
'terletakArea' => TerletakArea::all(),
'posisiUnit' => PosisiUnit::all(),
'bentukUnit' => BentukUnit::all(),
'fasilitasObjek' => FasilitasObjek::all(),
'merupakanDaerah' => MerupakanDaerah::all(),
'jenisUnit' => JenisUnit::all(),
]; ];
} }
@@ -1215,16 +1351,26 @@ class SurveyorController extends Controller
private function getBangunanData($data, $request): array private function getBangunanData($data, $request): array
{ {
// $kategori_bangunan = []; $data = $request->all();
// if ($request->has('spek_kategori_bagunan')) { $result = [];
// foreach ($request->input('spek_kategori_bagunan', []) as $value) {
// $kategori_bangunan[] = [ // foreach ($data['nama_bagunan'] as $index => $bangunan) {
// 'value' => [ // $bangunanData = [
// 'data' => $data['spek_bangunan'] ?? [], // '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 [ return [
'bangunan' => [ 'bangunan' => [
@@ -1233,8 +1379,8 @@ class SurveyorController extends Controller
'kondisi_bangunan' => $data['kondisi_bangunan'] ?? null, 'kondisi_bangunan' => $data['kondisi_bangunan'] ?? null,
'sifat_bangunan' => $data['sifat_bangunan'] ?? null, 'sifat_bangunan' => $data['sifat_bangunan'] ?? null,
'sifat_bangunan_input' => $data['sifat_bangunan_input'] ?? null, 'sifat_bangunan_input' => $data['sifat_bangunan_input'] ?? null,
'spek_kategori_bagunan' => $data['spek_kategori_bagunan'] ?? null, 'spesifikasi_bangunan' => $result ?? null,
'spek_bangunan' => $data['spek_bangunan'] ?? [], // 'spek_bangunan' => $data['spek_bangunan'] ?? [],
'sarana_pelengkap' => $data['sarana_pelengkap'] ?? [], 'sarana_pelengkap' => $data['sarana_pelengkap'] ?? [],
'sarana_pelengkap_input' => $data['sarana_pelengkap_input'] ?? null, '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', 'kondisi_bangunan' => 'nullable',
'sifat_bangunan' => 'required|array', 'sifat_bangunan' => 'required|array',
'sifat_bangunan_input' => 'nullable|array', 'sifat_bangunan_input' => 'nullable|array',
'nama_bagunan' => 'required|array', 'nama_bagunan' => 'required',
'spek_kategori_bangunan' => 'required|array', 'spek_kategori_bangunan.*' => 'required',
'spek_kategori_bangunan.*' => 'required|string', 'spek_bangunan.*' => 'required',
'sarana_pelengkap' => 'required', 'sarana_pelengkap' => 'required',
'sarana_pelengkap_input' => 'nullable|array', '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]">Paparan</th>
<th class="min-w-[100px]">Approve</th> <th class="min-w-[100px]">Approve</th>
<th class="min-w-[50px] text-center">Keterangan</th> <th class="min-w-[50px] text-center">Keterangan</th>
<th class="min-w-[50px] text-center">Action</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
<tr>
<td colspan="12" class="text-center">No data available</td>
</tr>
</tbody> </tbody>
</table> </table>
</div> </div>
@@ -151,6 +150,13 @@
@endsection @endsection
@push('scripts') @push('scripts')
<script>
function jadwal(id) {
document.getElementById('ids').value = id;
}
</script>
<script type="module"> <script type="module">
document.addEventListener('DOMContentLoaded', () => { document.addEventListener('DOMContentLoaded', () => {
const accordions = document.querySelectorAll('[data-accordion-item]'); const accordions = document.querySelectorAll('[data-accordion-item]');
@@ -224,10 +230,17 @@
title: 'Approve', title: 'Approve',
render: (item, data) => `${data.approve || ''}`, render: (item, data) => `${data.approve || ''}`,
}, },
actions: { keterangan: {
title: 'Keterangan', title: 'Keterangan',
render: (item, data) => `${data.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) { function formatDateFromISO(isoDateString) {
const date = new Date(isoDateString); const date = new Date(isoDateString);
const day = String(date.getDate()).padStart(2, '0'); const day = String(date.getDate()).padStart(2, '0');
@@ -254,3 +263,46 @@
} }
</script> </script>
@endpush @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" <div id="luas_unit_tidak_sesuai" class="flex items-baseline gap-2"
style="{{ old('luas_unit', $forminspeksi['luas_unit'] ?? '') == 'tidak sesuai' ? '' : 'display: none;' }}"> 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" placeholder="Masukan Luas Tanah"
value="{{ old('luas_unit_tidak_sesuai', $forminspeksi['luas_unit_tidak_sesuai'] ?? '') }}"> 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>
</div> </div>
<em id="error-luas_unit" class="alert text-danger text-sm"></em> <em id="error-luas_unit" class="alert text-danger text-sm"></em>
@@ -80,9 +80,6 @@
</div> </div>
</div> </div>
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Lantai</label> <label class="form-label max-w-56">Lantai</label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">

View File

@@ -5,7 +5,20 @@
</div> </div>
<div class="grid gap-5"> <div class="grid gap-5">
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.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="flex flex-wrap items-baseline w-full">
<div class="grid grid-cols-2 md:grid-cols-3 gap-4 mt-2"> <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"> <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" <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;' }}"> 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..." placeholder="Masukan Luas Bangunan Tidak Sesuai..."
value="{{ old('luas_tanah_bagunan_tidak_sesuai', $forminspeksi['bangunan']['luas_tanah_bagunan_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>
</div> </div>
<em id="error-luas_tanah_bagunan" class="alert text-danger text-sm"></em> <em id="error-luas_tanah_bagunan" class="alert text-danger text-sm"></em>
</div> </div>
</div> </div>
</div>
<!-- Jenis Bangunan --> <!-- Jenis Bangunan -->
@@ -139,7 +153,7 @@
@if (@isset($spekKategoriBagunan)) @if (@isset($spekKategoriBagunan))
@foreach ($spekKategoriBagunan as $item) @foreach ($spekKategoriBagunan as $item)
<div> <div>
<input type="hidden" name="spek_kategori_bangunan[]" <input type="hidden" name="spek_kategori_bangunan.[]"
value="{{ $item->name }}"> value="{{ $item->name }}">
<label <label
class="form-label flex items-center gap-3 text-nowrap">{{ $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) @if ($spek->spek_kategori_bangunan_id == $item->id)
<label class="form-label flex items-center gap-2.5"> <label class="form-label flex items-center gap-2.5">
<input class="checkbox" <input class="checkbox"
name="spek_bangunan_{{ $item->name }}[]" name="spek_bangunan[{{ $item->name }}][]"
type="checkbox" value="{{ $spek->name }}" /> type="checkbox" value="{{ $spek->name }}" />
{{ $spek->name }} {{ $spek->name }}
</label> </label>
@@ -235,33 +249,39 @@
document.getElementById('addBagunan').addEventListener('click', function() { document.getElementById('addBagunan').addEventListener('click', function() {
const newDiv = spekBangunanContainer.querySelector('.spek-bangunan').cloneNode(true); const newDiv = spekBangunanContainer.querySelector('.spek-bangunan').cloneNode(true);
console.log('Building label');
// Clear the selected values and input fields of the cloned input fields // Update input fields
newDiv.querySelectorAll('select, input').forEach(input => { newDiv.querySelectorAll('select, input').forEach((input, index) => {
if (input.type === 'checkbox' || input.type === 'radio') { if (input.type === 'checkbox' || input.type === 'radio') {
input.checked = false; input.checked = false;
} else { } else {
input.value = ''; 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); spekBangunanContainer.appendChild(newDiv);
// Add event listener to the delete button in the cloned div // Add event listener to the delete button in the cloned div
newDiv.querySelector('.delete-button').addEventListener('click', function() { newDiv.querySelector('.delete-button').addEventListener('click', function() {
spekBangunanContainer.removeChild(newDiv); spekBangunanContainer.removeChild(newDiv);
updateDeleteButtonsVisibility(); updateDeleteButtonsVisibility();
updateBuildingLabels(); // Update the labels after removing updateBuildingLabels();
console.log('Building label');
}); });
// Update delete buttons visibility and labels // Update UI
updateDeleteButtonsVisibility(); updateDeleteButtonsVisibility();
updateBuildingLabels(); updateBuildingLabels();
console.log('Building label');
}); });
// Initial setup: Ensure "Bangunan 1" is labeled // Initial setup: Ensure "Bangunan 1" is labeled
document.addEventListener('DOMContentLoaded', () => { document.addEventListener('DOMContentLoaded', () => {
updateDeleteButtonsVisibility(); updateDeleteButtonsVisibility();

File diff suppressed because it is too large Load Diff

View File

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

View File

@@ -5,6 +5,7 @@
@endsection --}} @endsection --}}
@section('content') @section('content')
@include('lpj::assetsku.includenya')
<div class="w-full grid gap-5 lg:gap-7.5 mx-auto"> <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">
<div class="card min-w-full"> <div class="card min-w-full">
@@ -588,104 +589,14 @@
</div> </div>
<!-- Modal Kamera --> <!-- Modal Kamera -->
<div class="modal fade" data-modal="true" id="cameraModal" data-backdrop="" data-keyboard="false"> @include('lpj::surveyor.components.modal-kamera')
<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>
@endsection @endsection
@push('scripts') @push('scripts')
<script> <script>
function submitFoto() { function submitFoto() {
const formElement = $('#formFoto')[0]; const formElement = $('#formFoto')[0];
const formData = new FormData(formElement); const formData = new FormData(formElement);
@@ -712,6 +623,7 @@
if (response.success) { if (response.success) {
window.location.href = window.location.href =
'{{ route('surveyor.show', ['id' => $permohonan->id]) }}?form=foto'; '{{ route('surveyor.show', ['id' => $permohonan->id]) }}?form=foto';
toastrSuccessBuild(response.message);
} }
}, },
@@ -727,6 +639,7 @@
console.log('Status:', status); console.log('Status:', status);
console.log('Response:', xhr.responseText); console.log('Response:', xhr.responseText);
console.log(errors); console.log(errors);
toastrErrorBuild(error);
}, },
complete: function() { complete: function() {
// Re-enable the button and hide the spinner // Re-enable the button and hide the spinner
@@ -738,307 +651,6 @@
} }
</script> </script>
@include('lpj::surveyor.js.camera-editor') @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 @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="card-body">
<div class="py-4"> <div class="py-4">
<h1 class="text-md font-medium text-gray-900">Order Penilaian</h1> <h1 class="text-md font-medium text-gray-900">Order Penilaian</h1>
@@ -79,7 +79,7 @@
</div> </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="card-body">
<div class="py-4 "> <div class="py-4 ">
<h1 class="text-md font-medium text-gray-900">Deskripsi Aset jaminan</h1> <h1 class="text-md font-medium text-gray-900">Deskripsi Aset jaminan</h1>
@@ -99,36 +99,36 @@
<div class="flex-wrap items-stretch"> <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"> <label class="form-label flex items-center gap-3 text-nowrap">
<input onclick="toggleFieldVisibility('jenis_asset', 'jenis_asset', ['tidak sesuai'])" type="radio" class="radio" <input onclick="toggleFieldVisibility('jenis_asset', 'jenis_asset', ['tidak sesuai'])"
name="jenis_asset" value="sesuai" type="radio" class="radio" name="jenis_asset" value="sesuai"
{{ old('jenis_asset', $forminspeksi['asset']['jenis_asset'] ?? '') == 'sesuai' ? 'checked' : '' }}> {{ old('jenis_asset', $forminspeksi['asset']['jenis_asset'] ?? '') == 'sesuai' ? 'checked' : '' }}>
<span class="ml-2">Ya</span> <span class="ml-2">Ya</span>
</label> </label>
<label class="form-label flex items-center gap-2.5 text-nowrap"> <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" <input onclick="toggleFieldVisibility('jenis_asset', 'jenis_asset', ['tidak sesuai'])"
name="jenis_asset" value="tidak sesuai" type="radio" class="radio" name="jenis_asset" value="tidak sesuai"
{{ old('jenis_asset', $forminspeksi['asset']['jenis_asset'] ?? '') == 'tidak sesuai' ? 'checked' : '' }}> {{ old('jenis_asset', $forminspeksi['asset']['jenis_asset'] ?? '') == 'tidak sesuai' ? 'checked' : '' }}>
<span class="ml-2">Tidak</span> <span class="ml-2">Tidak</span>
</label> </label>
<!-- Select dropdown untuk "Tidak Sesuai" --> <!-- 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;' }}"> <div id="jenis_asset" class="flex items-baseline gap-2"
<select style="{{ old('jenis_asset', $forminspeksi['asset']['jenis_asset'] ?? '') == 'tidak sesuai' ? '' : 'display: none;' }}">
class="input w-full" <select id="jenis_asset_tidak_sesuai" class="input w-full"
name="jenis_asset_tidak_sesuai" name="jenis_asset_tidak_sesuai">
> <option value="">Select Jenis asset</option>
<option value="">Select Jenis asset</option> @if (isset($jenisJaminan))
@if (isset($jenisJaminan)) @foreach ($jenisJaminan as $item)
@foreach ($jenisJaminan as $item) <option value="{{ $item->id }}"
<option value="{{ $item->name }}" {{ old('jenis_asset_tidak_sesuai', $forminspeksi['asset']['jenis_asset_tidak_sesuai'] ?? '') == $item->name ? 'selected' : '' }}>
{{ old('jenis_asset_tidak_sesuai', $forminspeksi['asset']['jenis_asset_tidak_sesuai'] ?? '') == $item->name ? 'selected' : '' }}> {{ $item->name }}
{{ $item->name }} </option>
</option> @endforeach
@endforeach @endif
@endif </select>
</select> <button type="button" class="btn btn-md btn-primary"
<button type="button" class="btn btn-md btn-primary">Save</button> onclick="updateAnalisa('jenis_asset')">Save</button>
</div> </div>
</div> </div>
<em id="error-jenis_asset" class="alert text-danger text-sm"></em> <em id="error-jenis_asset" class="alert text-danger text-sm"></em>
@@ -139,7 +139,6 @@
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Alamat</label> <label class="form-label max-w-56">Alamat</label>
<div> <div>
@foreach ($permohonan->debiture->documents as $dokumen) @foreach ($permohonan->debiture->documents as $dokumen)
<span class="text-2sm text-gray-700"> <span class="text-2sm text-gray-700">
{{ formatAlamat($dokumen) }} {{ formatAlamat($dokumen) }}
@@ -148,207 +147,136 @@
<div class="flex-wrap items-stretch"> <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"> <div class="grid grid-cols-3 md:grid-cols-3 gap-4 mt-2">
<input onclick="toggleTidakSesuai('alamat_sesuai','alamat_tidak_sesuai')" type="radio" <label class="form-label flex items-center gap-3 text-nowrap">
class="radio" name="alamat_sesuai" value="sesuai" <input
{{ old('alamat_sesuai', $forminspeksi['asset']['alamat_sesuai'] ?? '') == 'sesuai' ? 'checked' : '' }}> onclick="toggleAlamatVisibility('alamat_sesuai', 'alamat_tidak_sesuai', 'sesuai')"
<span class="ml-2">Ya</span> type="radio" class="radio" name="alamat_sesuai" value="sesuai"
</label> {{ old('jenis_asset', $forminspeksi['asset']['jenis_asset'] ?? '') == 'sesuai' ? 'checked' : '' }}>
<label class="form-label flex items-center gap-2.5 text-nowrap"> <span class="ml-2">Ya</span>
<input onclick="toggleTidakSesuai('alamat_sesuai','alamat_tidak_sesuai')" type="radio" </label>
class="radio" name="alamat_sesuai" value="tidak sesuai" <label class="form-label flex items-center gap-3 text-nowrap">
{{ old('alamat_sesuai', $forminspeksi['asset']['alamat_sesuai'] ?? '') == 'tidak sesuai' ? 'checked' : '' }}> <input
<span class="ml-2">Tidak</span> onclick="toggleAlamatVisibility('alamat_sesuai', 'alamat_tidak_sesuai', 'tidak sesuai')"
</label> 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> </div>
<em id="error-alamat" class="alert text-danger text-sm"></em> <em id="error-alamat" class="alert text-danger text-sm"></em>
</div> </div>
{{-- Alamat Sesuai --}}
<div id="alamat_tidak_sesuai" class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5" style="display: none;"> <div id="alamat_sesuai" class="grid gap-2 mt-5" style="display: none;">
<label class="form-label max-w-56"> @foreach ($permohonan->debiture->documents as $dokumen)
Address @php
</label> $fields = [
<div class="flex flex-wrap items-baseline w-full"> [
<div class="flex flex-col lg:flex-row gap-2 w-full"> 'label' => 'Jl.',
<div class="flex flex-wrap items-baseline w-full"> 'value' => $dokumen->address ?? '',
<select id="province_code" name="province_code" class="select w-full @error('province_code') border-danger bg-danger-light @enderror"> 'name' => 'nama_jalan',
<option value="">Select Province</option> 'readonly' => false,
@foreach($provinces as $province) ],
@if(isset($debitur)) [
<option value="{{ $province->code }}" {{ isset($debitur->province_code) && $debitur->province_code == $province->code?'selected' : '' }}> 'label' => 'Provinsi',
{{ $province->name }} 'value' => $dokumen->province->name ?? '',
</option> 'name' => 'provinsi',
@else 'readonly' => true,
<option value="{{ $province->code }}"> ],
{{ $province->name }} [
</option> 'label' => 'Kota/Kabupaten',
@endif 'value' => $dokumen->city->name ?? '',
@endforeach 'name' => 'kota_kabupaten',
</select> 'readonly' => true,
@error('province_code') ],
<em class="alert text-danger text-sm">{{ $message }}</em> [
@enderror 'label' => 'Kecamatan',
</div> 'value' => $dokumen->district->name ?? '',
<div class="flex flex-wrap items-baseline w-full"> 'name' => 'kecamatan',
<select id="city_code" name="city_code" class="select w-full @error('city_code') border-danger bg-danger-light @enderror"> 'readonly' => true,
<option value="">Select City</option> ],
@if(isset($cities)) [
@foreach($cities as $city) 'label' => 'Kelurahan',
@if(isset($debitur)) 'value' => $dokumen->village->name ?? '',
<option value="{{ $city->code }}" {{ isset($debitur->city_code) && $debitur->city_code == $city->code?'selected' : '' }}> 'name' => 'desa_kelurahan',
{{ $city->name }} 'readonly' => true,
</option> ],
@else ];
<option value="{{ $city->code }}"> @endphp
{{ $city->name }} @foreach ($fields as $field)
</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;">
@php
$inputDataLoaksi = [];
$inputDataLoaksi = [
[
'label' => 'Jl.',
'index' => 0,
'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'] : '',
),
],
[
'label' => 'Provinsi',
'index' => 6,
'name' => 'provinsi',
'value' => old(
'provinsi',
isset($forminspeksi['asset']['provinsi']) ? $forminspeksi['asset']['provinsi'] : '',
),
],
];
@endphp
@if (count($inputDataLoaksi) > 0)
@foreach ($inputDataLoaksi as $item)
<!-- Nomor Lambung -->
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <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"> <div class="flex flex-wrap items-baseline w-full">
<input type="text" name="{{ $item['name'] }}" class="input" <input type="text" class="input" name="{{ $field['name'] }}"
placeholder="Masukkan {{ $item['label'] }}" value="{{ $field['value'] }}" {{ $field['readonly'] ? 'readonly' : '' }}>
value="{{ $item['value'] }}">
<em id="error-{{ $item['name'] }}" class="alert text-danger text-sm"></em>
</div> </div>
</div> </div>
@endforeach @endforeach
@endif @endforeach
</div> </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> </div>
</div> </div>
</div> </div>
@@ -363,12 +291,15 @@
<label class="form-label max-w-56">Kordinat</label> <label class="form-label max-w-56">Kordinat</label>
<div id="perwakilan" class="flex items-baseline w-full gap-5"> <div id="perwakilan" class="flex items-baseline w-full gap-5">
<div class="grid grid-cols-2 gap-4 items-center w-full"> <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'] : '') }}"> 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" <input class="input" type="text" placeholder="Masukan Koordinat Longitude"
value="{{ old('kordinat_lng', isset($forminspeksi['asset']['kordinat_lng']) ? $forminspeksi['asset']['kordinat_lng'] : '') }}" > name="kordinat_lng" id="lng"
value="{{ old('kordinat_lng', isset($forminspeksi['asset']['kordinat_lng']) ? $forminspeksi['asset']['kordinat_lng'] : '') }}">
</div> </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 <i class="ki-filled ki-map"></i>Ambil
Kordinat</a> Kordinat</a>
</div> </div>
@@ -477,21 +408,23 @@
<div> <div>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
@foreach ($permohonan->debiture->documents as $dokumen) @foreach ($permohonan->debiture->documents as $dokumen)
{{ $dokumen->pemilik->hubungan_pemilik->name?? "" }} {{ $dokumen->pemilik->hubungan_pemilik->name ?? '' }}
@endforeach @endforeach
</div> </div>
<div class="flex-wrap items-stretch"> <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"> <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" <input
name="hub_cadeb" value="sesuai" 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' : '' }}> {{ old('hub_cadeb', $forminspeksi['asset']['hub_cadeb'] ?? '') == 'sesuai' ? 'checked' : '' }}>
<span class="ml-2">Ya</span> <span class="ml-2">Ya</span>
</label> </label>
<label class="form-label flex items-center gap-2.5 text-nowrap"> <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" <input
name="hub_cadeb" value="tidak sesuai" 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' : '' }}> {{ old('hub_cadeb', $forminspeksi['asset']['hub_cadeb'] ?? '') == 'tidak sesuai' ? 'checked' : '' }}>
<span class="ml-2">Tidak</span> <span class="ml-2">Tidak</span>
</label> </label>
@@ -524,24 +457,26 @@
<div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5"> <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5">
<label class="form-label max-w-56">Penghuni Jaminan</label> <label class="form-label max-w-56">Penghuni Jaminan</label>
<div> <div class="mt-2">
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full text-sm">
@foreach ($permohonan->debiture->documents as $dokumen) @foreach ($permohonan->debiture->documents as $dokumen)
{{ $dokumen->penghuni->hubungan_penghuni->name?? "" }} {{ $dokumen->penghuni->hubungan_penghuni->name ?? 'N/A' }}
@endforeach @endforeach
</div> </div>
<div class="flex-wrap items-stretch"> <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"> <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" <input
name="hub_cadeb_penghuni" value="sesuai" 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' : '' }}> {{ old('hub_cadeb_penghuni', $forminspeksi['asset']['hub_cadeb_penghuni'] ?? '') == 'sesuai' ? 'checked' : '' }}>
<span class="ml-2">Ya</span> <span class="ml-2">Ya</span>
</label> </label>
<label class="form-label flex items-center gap-2.5 text-nowrap"> <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" <input
name="hub_cadeb_penghuni" value="tidak sesuai" 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' : '' }}> {{ old('hub_cadeb_penghuni', $forminspeksi['asset']['hub_cadeb_penghuni'] ?? '') == 'tidak sesuai' ? 'checked' : '' }}>
<span class="ml-2">Tidak</span> <span class="ml-2">Tidak</span>
</label> </label>
@@ -551,8 +486,8 @@
name="hub_cadeb_Penghuni_tidak_sesuai" name="hub_cadeb_Penghuni_tidak_sesuai"
style="{{ old('hub_cadeb', $forminspeksi['asset']['hub_cadeb'] ?? '') == 'tidak sesuai' ? '' : 'display: none;' }}"> style="{{ old('hub_cadeb', $forminspeksi['asset']['hub_cadeb'] ?? '') == 'tidak sesuai' ? '' : 'display: none;' }}">
<option value="">Select Hubungan Cadeb</option> <option value="">Select Hubungan Cadeb</option>
@if (isset($hubCadeb)) @if (isset($hubPenghuni))
@foreach ($hubCadeb as $item) @foreach ($hubPenghuni as $item)
<option value="{{ $item->name }}" <option value="{{ $item->name }}"
{{ old('hub_cadeb_Penghuni_tidak_sesuai', $forminspeksi['asset']['hub_cadeb_Penghuni_tidak_sesuai'] ?? '') == $item->name ? 'selected' : '' }}> {{ old('hub_cadeb_Penghuni_tidak_sesuai', $forminspeksi['asset']['hub_cadeb_Penghuni_tidak_sesuai'] ?? '') == $item->name ? 'selected' : '' }}>
{{ $item->name }} {{ $item->name }}
@@ -570,5 +505,3 @@
</div> </div>
</div> </div>

View File

@@ -165,30 +165,44 @@
@endif @endif
</div> </div>
<!-- Upload Photo Button --> <!-- Upload Photo Button -->
<div class=" flex w-full mt-2" style="margin-top: 20px">
<div class="flex flex-col input-group w-full"> <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5" style="margin-top: 20px">
<label for="" class="block text-sm font-medium text-gray-700">Upload Photo</label> <label for="" class="form-label max-w-56 text-sm font-medium text-gray-700">Upload Photo</label>
<div class="w-full"> <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" <input id="foto_tempat" type="file" name="foto_tempat"
class="file-input file-input-bordered w-full" accept="image/*" class="file-input file-input-bordered w-full" accept="image/*"
onchange="previewImage(this, 'foto_tempat-preview')"> 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" <img id="foto_tempat-preview"
src="{{ asset('storage/' . (isset($forminspeksi['foto_tempat']) ? $forminspeksi['foto_tempat'] : '')) }}" src="{{ asset('storage/' . (isset($forminspeksi['foto_tempat']) ? $forminspeksi['foto_tempat'] : '')) }}"
alt="Foto Argis Region" class="mt-2 max-w-full h-auto" alt="Foto Argis Region" class="mt-2 max-w-full h-auto"
style="{{ isset($forminspeksi['foto_tempat']) ? '' : 'display: none;' }}"> style="{{ isset($forminspeksi['foto_tempat']) ? '' : 'display: none;' }}">
</div> </div>
</div> </div>
</div>77r7777
<!-- Notes Section --> <!-- Notes Section -->
<div class="mt-2" > <div class="flex items-baseline flex-wrap lg:flex-nowrap gap-2.5" style="margin-top: 20px">
<div class="bg-white rounded-lg">
<h4 class="block text-sm font-medium text-gray-700 mt-2">Catatan yang Perlu Diperhatikan <label class="form-label max-w-56">Catatan yang Perlu Diperhatikan
</h4> </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> <textarea name="keterangan" class="textarea mt-2" placeholder="Masukkan catatan penting" rows="3">{{ old('keterangan', $forminspeksi['fakta']['keterangan'] ?? '') }}</textarea>
</div> </div>
</div> </div>
</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 --}} @endsection --}}
@section('content') @section('content')
@include('lpj::assetsku.includenya')
<div class="w-full grid gap-5 lg:gap-7.5 mx-auto"> <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">
<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() { function submitData() {
const formElement = $('#formInspeksi')[0]; const formElement = $('#formInspeksi')[0];
@@ -144,10 +161,12 @@
'X-CSRF-TOKEN': '{{ csrf_token() }}' 'X-CSRF-TOKEN': '{{ csrf_token() }}'
}, },
success: function(response) { success: function(response) {
if (response.success) { // if (response.success) {
window.location.href = // toastrSuccessBuild(response.message)
'{{ route('surveyor.show', ['id' => $permohonan->id]) }}?form=inspeksi'; // window.location.href =
} // '{{ route('surveyor.show', ['id' => $permohonan->id]) }}?form=inspeksi';
// }
console.log(response); console.log(response);
}, },
error: function(xhr, status, error) { error: function(xhr, status, error) {
@@ -162,6 +181,7 @@
console.log('Status:', status); console.log('Status:', status);
console.log('Response:', xhr.responseText); console.log('Response:', xhr.responseText);
console.log(errors); console.log(errors);
toastrErrorBuild(error);
}, },
complete: function() { complete: function() {
// Re-enable the button and hide the spinner // Re-enable the button and hide the spinner
@@ -211,8 +231,53 @@
container.appendChild(newElement); 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> </script>
@endpush @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

@@ -13,13 +13,15 @@
<label class="form-label max-w-56">Luas Tanah</label> <label class="form-label max-w-56">Luas Tanah</label>
<div class="mt-2"> <div class="mt-2">
@if (isset($permohonan->debiture->documents)) @if (isset($permohonan->debiture->documents))
@foreach ($permohonan->debiture->documents as $item) @foreach ($permohonan->debiture->documents as $item)
@php @php
$details = json_decode($item->detail); $luas = $item->detail;
$luas_tanah = isset($details['luas_tanah']) ? $details['luas_tanah'] : 'N/A'; $details = json_decode($luas[0]->details, true);
@endphp $luas_tanah = isset($details['luas_tanah']) ? $details['luas_tanah'] : 'N/A';
<p class="text-2sm text-gray-700">{{ $luas_tanah }} m2</p> @endphp
@endforeach <p class="text-2sm text-gray-700">{{ $luas_tanah }} m<sup>2</sup></p>
@endforeach
@endif @endif
<div class="flex-wrap items-stretch"> <div class="flex-wrap items-stretch">
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
@@ -38,10 +40,10 @@
</label> </label>
<div id="luas_tanah_tidak_sesuai" class="flex items-baseline gap-2" <div id="luas_tanah_tidak_sesuai" class="flex items-baseline gap-2"
style="{{ old('luas_tanah', $forminspeksi['tanah']['luas_tanah'] ?? '') == 'tidak sesuai' ? '' : 'display: none;' }}"> 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" placeholder="Masukan Luas Tanah"
value="{{ old('luas_tanah_tidak_sesuai', $forminspeksi['tanah']['luas_tanah_tidak_sesuai'] ?? '') }}"> 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>
</div> </div>
<em id="error-luas_tanah" class="alert text-danger text-sm"></em> <em id="error-luas_tanah" class="alert text-danger text-sm"></em>
@@ -63,7 +65,7 @@
</label> </label>
<label class="form-label flex items-center gap-2.5 text-nowrap"> <label class="form-label flex items-center gap-2.5 text-nowrap">
<input type="radio" class="radio" name="hadap_mata_angin" value="tidak sesuai" <input type="radio" class="radio" name="hadap_mata_angin" value="tidak sesuai"
onclick="toggleFieldVisibility('hadap_mata_angin', 'hadap_mata_angin_tidak_sesuai' ,['tidak sesuai'])" onclick="toggleFieldVisibility('hadap_mata_angin', 'hadap_mata_angin_tidak_sesuai' ,['tidak sesuai'])"
{{ old('hadap_mata_angin', $forminspeksi['tanah']['hadap_mata_angin'] ?? '') == 'tidak sesuai' ? 'checked' : '' }}> {{ old('hadap_mata_angin', $forminspeksi['tanah']['hadap_mata_angin'] ?? '') == 'tidak sesuai' ? 'checked' : '' }}>
<span class="ml-2">Tidak Sesuai</span> <span class="ml-2">Tidak Sesuai</span>
@@ -74,7 +76,8 @@
style="{{ old('hadap_mata_angin', $forminspeksi['tanah']['hadap_mata_angin'] ?? '') == 'tidak sesuai' ? '' : 'display: none;' }}"> style="{{ old('hadap_mata_angin', $forminspeksi['tanah']['hadap_mata_angin'] ?? '') == 'tidak sesuai' ? '' : 'display: none;' }}">
<select <select
class="input w-full 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> <option value="">Select Hadap Mata Angin</option>
@if (isset($arahMataAngin)) @if (isset($arahMataAngin))
@foreach ($arahMataAngin as $item) @foreach ($arahMataAngin as $item)
@@ -85,7 +88,7 @@
@endforeach @endforeach
@endif @endif
</select> </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>
</div> </div>
<em id="error-hadap_mata_angin" class="alert text-danger text-sm"></em> <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}`; return `${day}-${month}-${year}`;
} }
ihfdksfjhjfjbkdfkdsfdsjkjdjdsgjjgdgjhgdgjkhdshggkhgkhdghskghkjkhjsdgjkgdjhg
</script> </script>
@endpush @endpush

View File

@@ -1,4 +1,304 @@
@push('scripts') @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> <script>
class UniversalCameraEditor { class UniversalCameraEditor {
constructor() { constructor() {

View File

@@ -448,7 +448,7 @@ Route::middleware(['auth'])->group(function () {
Route::get('export', [ActivityController::class, 'export'])->name('export'); Route::get('export', [ActivityController::class, 'export'])->name('export');
Route::get('/', [ActivityController::class, 'index'])->name('index'); 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('/{id}/show', [ActivityController::class, 'show'])->name('show');
Route::get('download/{id}', [ActivityController::class, 'download'])->name('download'); Route::get('download/{id}', [ActivityController::class, 'download'])->name('download');
Route::get('senior', [ActivityController::class, 'senior'])->name('senior'); 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('storeJadwal', [SurveyorController::class, 'storeJadwal'])->name('storeJadwal');
Route::put('storeAproved/{id}', [SurveyorController::class, 'storeAproved'])->name('storeAproved'); Route::put('storeAproved/{id}', [SurveyorController::class, 'storeAproved'])->name('storeAproved');
Route::post('storeFoto', [SurveyorController::class, 'storeFoto'])->name('storeFoto'); 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('checkButtonStatus/{id}', [SurveyorController::class, 'checkButtonStatus'])->name('checkButtonStatus');
Route::get('datatables', [SurveyorController::class, 'dataForDatatables'])->name('datatables'); 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('foto/{id}/{jaminanId}', [SurveyorController::class, 'foto'])->name('foto');
Route::get('data-pembanding/{id}/{jaminanId}', [SurveyorController::class, 'dataPembanding'])->name('data-pembanding'); Route::get('data-pembanding/{id}/{jaminanId}', [SurveyorController::class, 'dataPembanding'])->name('data-pembanding');
Route::post('submitSurveyor/{id}', [SurveyorController::class, 'submitSurveyor'])->name('submitSurveyor'); 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 () { Route::name('penilai.')->prefix('penilai')->group(function () {