Merge branch 'staging' of https://git.putrakuningan.com/daengdeni/lpj into andydev

This commit is contained in:
Andy Chaerudin
2024-12-04 16:17:32 +07:00
23 changed files with 1748 additions and 1259 deletions

View File

@@ -0,0 +1,74 @@
<?php
namespace Modules\Lpj\Exports;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithColumnFormatting;
use Maatwebsite\Excel\Concerns\WithHeadings;
use Maatwebsite\Excel\Concerns\WithMapping;
use PhpOffice\PhpSpreadsheet\Style\NumberFormat;
class KertasKerjaExport implements WithColumnFormatting, WithHeadings, FromCollection, WithMapping
{
protected $data;
public function __construct($data)
{
$this->data = $data;
}
public function collection()
{
return collect([
[
'Pendekatan pasar',
'Nama Pemilik Aset',
'',
],
[
'Metode Perbandingan Data Pasar',
'Nama Pemberi Tugas: ',
'',
'',
],
[
'Tanggal Penilaian: ',
'Lokasi: ',
'',
'',
],
[
'No.',
'Objek Penilaian',
'Data Pembanding 1',
'Data Pembanding 2',
'Data Pembanding 3'
],
]);
}
// Tambahkan method map()
public function map($row): array
{
return $row;
}
public function headings(): array
{
return [];
}
public function columnFormats(): array
{
return [
'A' => NumberFormat::FORMAT_NUMBER,
'C' => NumberFormat::FORMAT_NUMBER,
'D' => NumberFormat::FORMAT_NUMBER,
'F' => NumberFormat::FORMAT_NUMBER,
'G' => NumberFormat::FORMAT_NUMBER,
'P' => NumberFormat::FORMAT_DATE_DATETIME,
'Q' => NumberFormat::FORMAT_DATE_DATETIME
];
}
}

View File

@@ -6,7 +6,9 @@ use Illuminate\Http\Request;
use Modules\Lpj\Models\Permohonan; use Modules\Lpj\Models\Permohonan;
use Modules\Lpj\Models\Inspeksi; use Modules\Lpj\Models\Inspeksi;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Maatwebsite\Excel\Facades\Excel;
use Modules\Lpj\Exports\KertasKerjaExport;
class PenilaiController extends Controller class PenilaiController extends Controller
{ {
public $user; public $user;
@@ -22,7 +24,8 @@ class PenilaiController extends Controller
/** /**
* Show the form for creating a new resource. * Show the form for creating a new resource.
*/ */
public function lampiran($id){ public function lampiran($id)
{
$permohonan = Permohonan::with('debiture.documents')->find($id); $permohonan = Permohonan::with('debiture.documents')->find($id);
$jaminanId = $permohonan->debiture->documents->first()->jenis_jaminan_id; $jaminanId = $permohonan->debiture->documents->first()->jenis_jaminan_id;
@@ -93,21 +96,26 @@ class PenilaiController extends Controller
} }
// Retrieve data from the database // Retrieve data from the database
$query = Permohonan::query()->where('status', '=', 'done'); $query = Permohonan::query();
// Apply search filter if provided // Apply search filter if provided
if ($request->has('search') && !empty($request->get('search'))) { if ($request->has('search') && !empty($request->get('search'))) {
$search = $request->get('search'); $search = $request->get('search');
$query->where(function ($q) use ($search) { $columns = ['nomor_registrasi', 'debiture.name', 'branch.name', 'user.name', 'tujuanPenilaian.name', 'jenisfasilitasKredit.name'];
$q->where('nomor_registrasi', 'LIKE', '%' . $search . '%');
$q->orWhereRelation('debiture', 'name', 'LIKE', '%' . $search . '%'); $query->where(function ($q) use ($search, $columns) {
$q->orWhereRelation('branch', 'name', 'LIKE', '%' . $search . '%'); foreach ($columns as $column) {
$q->orWhereRelation('user', 'name', 'LIKE', '%' . $search . '%'); $q->orWhereRelation(explode('.', $column)[0], explode('.', $column)[1], 'LIKE', '%' . $search . '%');
$q->orWhereRelation('tujuanPenilaian', 'name', 'LIKE', '%' . $search . '%'); }
$q->orWhereRelation('jenisfasilitasKredit', 'name', 'LIKE', '%' . $search . '%');
}); });
} }
// Apply whereHas to check penilai_id, role, and user_id specifically for 'penilai' role
$query->whereHas('penilaian.userPenilai', function ($q) {
$q->where('role', 'penilai') // Ensure the role is 'penilai'
->where('user_id', 12); // Ganti dengan Auth::user()->id jika dinamis
});
// Apply sorting if provided // Apply sorting if provided
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) { if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
$order = $request->get('sortOrder'); $order = $request->get('sortOrder');
@@ -122,7 +130,7 @@ class PenilaiController extends Controller
if ($request->has('page') && $request->has('size')) { if ($request->has('page') && $request->has('size')) {
$page = $request->get('page'); $page = $request->get('page');
$size = $request->get('size'); $size = $request->get('size');
$offset = ($page - 1) * $size; // Calculate the offset $offset = ($page - 1) * $size;
$query->skip($offset)->take($size); $query->skip($offset)->take($size);
} }
@@ -131,13 +139,20 @@ class PenilaiController extends Controller
$filteredRecords = $query->count(); $filteredRecords = $query->count();
// Get the data for the current page // Get the data for the current page
$data = $query->with(['user', 'debiture', 'branch', 'tujuanPenilaian', 'jenisfasilitasKredit'])->get(); $data = $query->with([
'user',
'debiture',
'branch',
'tujuanPenilaian',
'jenisfasilitasKredit',
'penilaian.userPenilai' // Ensure this relation is included
])->get();
// Calculate the page count // Calculate the page count
$pageCount = ceil($totalRecords / $request->get('size')); $pageCount = ceil($totalRecords / $request->get('size'));
// Calculate the current page number // Calculate the current page number
$currentPage = 0 + 1; $currentPage = $request->get('page', 1);
// Return the response data as a JSON object // Return the response data as a JSON object
return response()->json([ return response()->json([
@@ -150,4 +165,134 @@ class PenilaiController extends Controller
'data' => $data, 'data' => $data,
]); ]);
} }
public function kertas_kerja()
{
$data = [
[
'Pendekatan pasar',
'Nama Pemilik Aset',
'',
],
[
'Metode Perbandingan Data Pasar',
'Nama Pemberi Tugas: ',
'',
'',
],
[
'Tanggal Penilaian: ',
'Lokasi: ',
'',
'',
],
[
'No.',
'Objek Penilaian',
'Data Pembanding 1',
'Data Pembanding 2',
'Data Pembanding 3'
],[
'1',
'Jenis Aset',
'Pembanding 1',
'Pembanding 1',
'Pembanding 1'
],
[
'2',
'Luas Tanah',
'Pembanding 2',
'Pembanding 2',
'Pembanding 2'
],
[
'3',
'Penawaran/Transaksi',
'',
'Pembanding 3',
'Pembanding 3'
],
[
'4',
'Harga penawaran/Transaksi',
'',
'Pembanding 3',
'Pembanding 3'
],[
'5',
'Nomor Telepon',
'',
'Pembanding 3',
'Pembanding 3'
],
[
'6',
'Estimasi Harga Transaksi',
'',
'Pembanding 3',
'Pembanding 3'
],
[
'7',
'Nama Nara sumber',
'',
'Pembanding 3',
'Pembanding 3'
],
[
'8',
'Status Nara sumber',
'',
'Pembanding 3',
'Pembanding 3'
],
[
'9',
'Waktu Penawaran/Transaksi',
'',
'Pembanding 3',
'Pembanding 3'
],
[
'10',
'Titik GPS',
'',
'Pembanding 3',
],
[
'11',
'Alamat',
'',
'Pembanding 3',
'Pembanding 3'
],
[
'12',
'Jarak Pembanding dengan Objek (m)',
'',
'Pembanding 3',
'Pembanding 3'
],
[
'13',
'Estimasi Rangking Tanah',
'',
'Pembanding 3',
'Pembanding 3'
],
[
'14',
'Estimasi Rangking Bangunan',
'',
'Pembanding 3',
'Pembanding 3'
]
];
return Excel::download(new KertasKerjaExport($data), 'kertas-kerja.xlsx');
}
} }

View File

@@ -298,10 +298,15 @@ class PenilaianController extends Controller
$q->orWhere('status', 'LIKE', '%' . $search . '%'); $q->orWhere('status', 'LIKE', '%' . $search . '%');
}); });
} }
$query->whereIn('status', ['registered', 'registrasi-final']); $query->whereIn('status', ['registered', 'registrasi-final']);
// Filter berdasarkan role
if (Auth::user()->roles[0]->name !== 'administrator') {
$query->whereHas('region.teams.teamsUsers.user', function ($q) { $query->whereHas('region.teams.teamsUsers.user', function ($q) {
$q->where('id', Auth::user()->id); $q->where('id', Auth::user()->id);
}); });
}
if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) { if ($request->has('sortOrder') && !empty($request->get('sortOrder'))) {
$order = $request->get('sortOrder'); $order = $request->get('sortOrder');

View File

@@ -5,6 +5,7 @@ namespace Modules\Lpj\Http\Controllers;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use Illuminate\Http\RedirectResponse; use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use Maatwebsite\Excel\Facades\Excel; use Maatwebsite\Excel\Facades\Excel;
use Modules\Lpj\Exports\BasicDataSurveyorExport; use Modules\Lpj\Exports\BasicDataSurveyorExport;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
@@ -21,6 +22,7 @@ use Modules\Lpj\Models\PosisiKavling;
use Modules\Lpj\Models\KondisiFisikTanah; use Modules\Lpj\Models\KondisiFisikTanah;
use Modules\Lpj\Models\KetinggianTanah; use Modules\Lpj\Models\KetinggianTanah;
use Modules\Lpj\Models\SifatBangunan; use Modules\Lpj\Models\SifatBangunan;
use Modules\Lpj\Models\JenisJaminan;
use Modules\Lpj\Models\JenisBangunan; use Modules\Lpj\Models\JenisBangunan;
use Modules\Lpj\Models\KondisiBangunan; use Modules\Lpj\Models\KondisiBangunan;
use Modules\Lpj\Models\SpekBangunan; use Modules\Lpj\Models\SpekBangunan;
@@ -56,7 +58,7 @@ 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\HubunganPemilikJaminan; use Modules\Lpj\Models\HubunganPemilikJaminan;
use Modules\Lpj\Models\HubunganPenghuniJaminan; use Modules\Lpj\Models\HubunganPenghuniJaminan;
use Modules\Lpj\Models\AnalisaUnit; use Modules\Lpj\Models\AnalisaUnit;
@@ -116,6 +118,7 @@ class SurveyorController extends Controller
]; ];
}); });
return view('lpj::surveyor.detail', compact( return view('lpj::surveyor.detail', compact(
'permohonan', 'permohonan',
'surveyor', 'surveyor',
@@ -377,7 +380,7 @@ private function deleteOfFile($filePath)
return $request->validate([ return $request->validate([
'permohonan_id' => 'required', 'permohonan_id' => 'required',
'jenis_jaminan_id' => 'required', 'jenis_jaminan_id' => 'required',
'pendamping' => 'required|image|mimes:jpeg,png,jpg,gif,svg|max:2048', 'pendamping' => 'nullable|image|mimes:jpeg,png,jpg,gif,svg|max:2048',
'foto_objek.*' => 'required|image|mimes:jpeg,png,jpg,gif,svg|max:2048', 'foto_objek.*' => 'required|image|mimes:jpeg,png,jpg,gif,svg|max:2048',
'name_objek.*' => 'required|string|max:255', 'name_objek.*' => 'required|string|max:255',
'foto_lingkungan.*' => 'required|image|mimes:jpeg,png,jpg,gif,svg|max:2048', 'foto_lingkungan.*' => 'required|image|mimes:jpeg,png,jpg,gif,svg|max:2048',
@@ -414,11 +417,11 @@ private function deleteOfFile($filePath)
} }
// If validation passes, update permohonan status // If validation passes, update permohonan status
// $permohonan = Permohonan::findOrFail($id); $permohonan = Permohonan::findOrFail($id);
// $permohonan->update([ $permohonan->update([
// 'status' => 'done', 'status' => 'done',
// 'submitted_at' => now() 'submitted_at' => now()
// ]); ]);
return response()->json([ return response()->json([
'success' => true, 'success' => true,
@@ -548,41 +551,146 @@ private function deleteOfFile($filePath)
} }
public function storeDataPembanding(Request $request) public function storeFreeze() {
}
private function formatDataPembanding($request)
{ {
$data = $request->all(); $dataPembanding = [];
if (!$data) { $pembandingCount = count($request->input('alamat_pembanding', []));
return response()->json(['success' => false, 'message' => 'Invalid data'], 400);
for ($i = 0; $i < $pembandingCount; $i++) {
$pembanding = $this->formatSinglePembanding($request, $i);
// Perbaikan penanganan foto pembanding
$fotoKey = "foto_objek_pembanding_{$i}"; // Sesuaikan dengan nama field di form
if ($request->hasFile($fotoKey)) {
$pembanding['foto_objek'] = $this->handleFileUpload(
$request->file($fotoKey),
'pembanding',
"pembanding_{$i}"
);
}
$dataPembanding[] = $pembanding;
}
return $dataPembanding;
}
private function handleFileUpload($file, $folder, $prefix)
{
if (!$file) {
return null;
} }
try {
// Buat nama file yang unik
$extension = $file->getClientOriginalExtension();
$fileName = $prefix . '_' . time() . '_' . uniqid() . '.' . $extension;
// Pastikan folder exists
$path = storage_path("app/public/{$folder}");
if (!File::exists($path)) {
File::makeDirectory($path, 0777, true);
}
// Simpan file
$file->storeAs("public/{$folder}", $fileName);
// Log untuk debugging
\Log::info("File berhasil disimpan: {$folder}/{$fileName}");
return $fileName;
} catch (\Exception $e) {
\Log::error("Error saat upload file: " . $e->getMessage());
throw $e;
}
}
private function formatSinglePembanding($request, $index)
{
$fields = [
'alamat', 'desa', 'kecamatan', 'kabupaten', 'provinsi',
'tahun', 'luas_tanah', 'luas_bangunan', 'tahun_bangunan',
'status_nara_sumber', 'harga', 'nama_nara_sumber',
'peruntukan', 'penawaran_transaksi', 'nomor_tlp',
'kordinat_lat', 'kordinat_lng', 'jenis_aset',
];
$pembanding = [];
foreach ($fields as $field) {
$inputName = "{$field}_pembanding";
$pembanding[$field] = $request->input($inputName)[$index] ?? null;
}
// Inisialisasi foto_objek sebagai null
$pembanding['foto_objek'] = null;
return $pembanding;
}
public function storeDataPembanding(Request $request)
{
try { try {
DB::beginTransaction(); DB::beginTransaction();
// $action = $request->input('type'); $validator = $request->validate([
// $rules = $this->getActionSpecificRules($data, $action, $request); 'permohonan_id' => 'required|exists:permohonan,id',
'type' => 'required|string',
$inspeksi = Inspeksi::where('permohonan_id', $request->input('permohonan_id'))->where('jenis_jaminan_id', $request->input('jenis_jaminan_id'))->first(); 'jenis_jaminan_id' => 'required',
'foto_objek' => 'nullable|image|max:2048',
if (!$inspeksi) { 'foto_objek_pembanding_*' => 'nullable|image|max:2048',
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)]); if ($validator->fails()) {
return response()->json([
'success' => false,
'message' => 'Validasi gagal',
'errors' => $validator->errors()
], 422);
} }
$objekPenilaian = $this->formatObjekPenilaian($request);
if ($request->hasFile('foto_objek')) {
$objekPenilaian['foto_objek'] = $this->handleFileUpload(
$request->file('foto_objek'),
'pembanding',
'objek_penilaian'
);
}
$formattedData = [
'permohonan_id' => $request->input('permohonan_id'),
'type' => $request->input('type'),
'jenis_jaminan_id' => $request->input('jenis_jaminan_id'),
'objek_penilaian' => $objekPenilaian,
'data_pembanding' => $this->formatDataPembanding($request)
];
$inspeksi = $this->saveInspeksi($formattedData);
DB::commit(); DB::commit();
return response()->json(['success' => true, 'message' => 'Data saved successfully', 'data' => json_encode($data)], 200); return response()->json([
} catch (Exception $e) { 'success' => true,
'message' => 'Data berhasil disimpan',
'data' => $formattedData
], 200);
} 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' => 'Gagal menyimpan data: ' . $e->getMessage()
], 500);
} }
} }
/** /**
* Form inspeksi. * Form inspeksi.
*/ */
@@ -737,8 +845,9 @@ private function deleteOfFile($filePath)
public function dataPembanding($id, $jaminanId) public function dataPembanding($id, $jaminanId)
{ {
$permohonan = Permohonan::with( try {
[ // Ambil data permohonan dengan eager loading
$permohonan = Permohonan::with([
'user', 'user',
'debiture.province', 'debiture.province',
'debiture.city', 'debiture.city',
@@ -747,28 +856,65 @@ private function deleteOfFile($filePath)
'branch', 'branch',
'tujuanPenilaian', 'tujuanPenilaian',
'penilaian' 'penilaian'
], ])->findOrFail($id);
)->findOrFail($id);
$surveyor = $id; // Ambil data inspeksi
$inspeksi = Inspeksi::where([
'permohonan_id' => $id,
'jenis_jaminan_id' => $jaminanId
])->first();
// Inisialisasi variabel
$inspectionData = null;
$comparisons = null;
$fotoForm = null;
if ($inspeksi) {
$inspectionData = json_decode($inspeksi->data_form, true);
if (json_last_error() !== JSON_ERROR_NONE) {
throw new \Exception('Error decoding inspection data: ' . json_last_error_msg());
}
if ($inspeksi->data_pembanding) {
$comparisons = json_decode($inspeksi->data_pembanding, true);
if (json_last_error() !== JSON_ERROR_NONE) {
throw new \Exception('Error decoding comparison data: ' . json_last_error_msg());
}
}
$fotoForm = json_decode($inspeksi->foto_form, true);
}
// Ambil data pendukung
$data = $this->getCommonData();
$branches = Branch::all(); $branches = Branch::all();
$provinces = Province::all(); $provinces = Province::all();
$data = $this->getCommonData(); return view('lpj::surveyor.components.data-pembanding', compact(
'permohonan',
'id',
'branches',
'provinces',
'inspectionData',
'comparisons',
'data',
'jaminanId',
'fotoForm'
));
$inpeksi = Inspeksi::where('permohonan_id', $id)->where('jenis_jaminan_id', $jaminanId)->first(); } catch (\Exception $e) {
$forminspeksi = null; return redirect()
if ($inpeksi) { ->back()
$forminspeksi = $inpeksi; ->with('error', 'Terjadi kesalahan saat memuat data: ' . $e->getMessage());
// $forminspeksi = json_decode($inpeksi->data_form, true);
} }
// return response()->json($forminspeksi);
return view('lpj::surveyor.components.data-pembanding', compact('permohonan', 'surveyor', 'branches', 'provinces', 'forminspeksi', 'data'));
} }
private function getHeader(string $type): array private function getHeader(string $type): array
{ {
return self::HEADERS[$type] ?? []; return self::HEADERS[$type] ?? [];
@@ -1276,8 +1422,7 @@ private function deleteOfFile($filePath)
'fasilitasObjek' => FasilitasObjek::all(), 'fasilitasObjek' => FasilitasObjek::all(),
'merupakanDaerah' => MerupakanDaerah::all(), 'merupakanDaerah' => MerupakanDaerah::all(),
'jenisUnit' => JenisUnit::all(), 'jenisUnit' => JenisUnit::all(),
'jenisJaminan' => JenisJaminan::all(),
]; ];
} }
@@ -1407,23 +1552,23 @@ private function deleteOfFile($filePath)
$data = $request->all(); $data = $request->all();
$result = []; $result = [];
foreach ($data['nama_bagunan'] as $index => $bangunan) { // foreach ($data['nama_bangunan'] as $index => $bangunan) {
$bangunanData = [ // $bangunanData = [
'bangunan' => $bangunan, // 'bangunan' => $bangunan,
'kategori' => [] // 'kategori' => []
]; // ];
foreach ($data['spek_kategori_bangunan'] as $kategoriIndex => $kategori) { // foreach ($data['spek_kategori_bangunan'] as $kategoriIndex => $kategori) {
if (isset($data['spek_bangunan'][$kategori])) { // if (isset($data['spek_bangunan'][$kategori])) {
$bangunanData['kategori'][] = [ // $bangunanData['kategori'][] = [
'kategori' => $kategori, // 'kategori' => $kategori,
'spesifikasi' => $data['spek_bangunan'][$kategori] // 'spesifikasi' => $data['spek_bangunan'][$kategori]
]; // ];
} // }
} // }
$result[] = $bangunanData; // $result[] = $bangunanData;
} // }
return [ return [
'bangunan' => [ 'bangunan' => [
@@ -1459,7 +1604,10 @@ private function deleteOfFile($filePath)
'gol_mas_sekitar' => $data['gol_mas_sekitar'] ?? null, 'gol_mas_sekitar' => $data['gol_mas_sekitar'] ?? null,
'tingkat_keramaian' => $data['tingkat_keramaian'] ?? null, 'tingkat_keramaian' => $data['tingkat_keramaian'] ?? null,
'terletak_diarea' => $data['terletak_diarea'] ?? null, 'terletak_diarea' => $data['terletak_diarea'] ?? null,
'disekitar_lokasi' => $data['disekitar_lokasi'] ?? null, 'disekitar_lokasi' => $data['disekitar_lokasi'] === 'yes' ? [
'kondisi' => $data['kondisi_bagunan_disekitar_lokasi'] ?? null,
'sifat' => $data['sifat_bagunan_disekitar_lokasi'] ?? null,
] : $data['disekitar_lokasi'],
'kondisi_bangunan_sekitar' => $data['kondisi_bangunan_sekitar'] ?? null, 'kondisi_bangunan_sekitar' => $data['kondisi_bangunan_sekitar'] ?? null,
'sifat_bangunan_sekitar' => $data['sifat_bangunan_sekitar'] ?? null, 'sifat_bangunan_sekitar' => $data['sifat_bangunan_sekitar'] ?? null,
'dekat_makam' => $data['dekat_makam'] ?? null, 'dekat_makam' => $data['dekat_makam'] ?? null,
@@ -1917,7 +2065,6 @@ private function deleteOfFile($filePath)
'luas_unit', 'luas_unit',
true true
), ),
'jenis_unit' => $data['jenis_unit'] ?? null,
'kondisi_unit' => $data['kondisi_unit'] ?? null, 'kondisi_unit' => $data['kondisi_unit'] ?? null,
'posisi_unit' => $data['posisi_unit'] ?? null, 'posisi_unit' => $data['posisi_unit'] ?? null,
'lantai' => $data['lantai'] ?? null, 'lantai' => $data['lantai'] ?? null,

View File

@@ -104,7 +104,7 @@ 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', 'nama_bagunan' => 'required|nullable',
'spek_kategori_bangunan.*' => 'required', 'spek_kategori_bangunan.*' => 'required',
'spek_bangunan.*' => 'required', 'spek_bangunan.*' => 'required',
'sarana_pelengkap' => 'required', 'sarana_pelengkap' => 'required',
@@ -122,7 +122,6 @@ class FormSurveyorRequest extends FormRequest
'luas_unit' => 'required', 'luas_unit' => 'required',
'luas_unit_sesuai' => 'nullable', 'luas_unit_sesuai' => 'nullable',
'luas_unit_tidak_sesuai' => 'nullable', 'luas_unit_tidak_sesuai' => 'nullable',
'jenis_unit' => 'required|array',
'kondisi_unit' => 'required|array', 'kondisi_unit' => 'required|array',
'posisi_unit' => 'required|array', 'posisi_unit' => 'required|array',
'lantai' => 'required|array', 'lantai' => 'required|array',
@@ -150,8 +149,8 @@ class FormSurveyorRequest extends FormRequest
'tingkat_keramaian' => 'nullable', 'tingkat_keramaian' => 'nullable',
'terletak_diarea' => 'nullable', 'terletak_diarea' => 'nullable',
'disekitar_lokasi' => 'nullable', 'disekitar_lokasi' => 'nullable',
'kondisi_bangunan_sekitar' => 'nullable', 'kondisi_bagunan_disekitar_lokasi' => 'nullable',
'sifat_bangunan_sekitar' => 'nullable', 'sifat_bagunan_disekitar_lokasi' => 'nullable',
'dekat_makam' => 'nullable', 'dekat_makam' => 'nullable',
'jarak_makam' => 'nullable', 'jarak_makam' => 'nullable',
'nama_makam' => 'nullable', 'nama_makam' => 'nullable',

View File

@@ -14,7 +14,7 @@ class Inspeksi extends Model
/** /**
* The attributes that are mass assignable. * The attributes that are mass assignable.
*/ */
protected $fillable = ['data_form', 'foto_form', 'denah_form','permohonan_id', 'name', 'status', 'authorized_status', 'authorized_at', 'authorized_by', 'created_by', 'updated_by', 'deleted_by','jenis_jaminan_id']; protected $fillable = ['data_form', 'foto_form', 'denah_form','permohonan_id', 'name', 'status', 'authorized_status', 'authorized_at', 'authorized_by', 'created_by', 'updated_by', 'deleted_by','jenis_jaminan_id','data_pembanding'];
public function permohonan() public function permohonan()
{ {

View File

@@ -23,4 +23,8 @@ class Regions extends Model
public function teams(){ public function teams(){
return $this->hasMany(Teams::class, 'regions_id', 'id'); return $this->hasMany(Teams::class, 'regions_id', 'id');
} }
public function penilaiTeam(){
return $this->hasMany(PenilaianTeam::class, 'team_id', 'id');
}
} }

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->string('name')->nullable()->change();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('inspeksi', function (Blueprint $table) {
$table->string('name')->nullable(false)->change();
});
}
};

View File

@@ -51,13 +51,12 @@
@php @php
$sortedTeamsActivity = $teamsActivity->sortBy(function ($item) { $sortedTeamsActivity = $teamsActivity->sortBy(function ($item) {
return $item->team->penilaianTeam return $item->team->regions->penilaiTeam
->filter(function ($penilaianTeam) use ($item) { ->filter(function ($penilaiTeam) use ($item) {
return $penilaianTeam->user_id == $item->user->id; return $penilaiTeam->user_id == $item->user->id;
}) })
->count(); ->count();
}); });
@endphp @endphp
@foreach ($sortedTeamsActivity as $index => $item) @foreach ($sortedTeamsActivity as $index => $item)
@@ -75,9 +74,9 @@
<th class="min-w-[150px]"> <th class="min-w-[150px]">
<span class="text-base text-gray-900 font-normal"> <span class="text-base text-gray-900 font-normal">
@php @php
$totalTasks = $item->team->penilaianTeam $totalTasks = $item->team->regions->penilaiTeam
->filter(function ($penilaianTeam) use ($item) { ->filter(function ($penilaiTeam) use ($item) {
return $penilaianTeam->user_id == $item->user->id; return $penilaiTeam->user_id == $item->user->id;
}) })
->count(); ->count();
@endphp @endphp
@@ -208,7 +207,7 @@
tanggal_kunjungan: { tanggal_kunjungan: {
title: 'Tgl Kunjungan', title: 'Tgl Kunjungan',
render: (item, data) => render: (item, data) =>
`${formatDateFromISO(data.tanggal_kunjungan) || ''}`, `${formatDateFromISO(data.waktu_penilaian) || ''}`,
}, },
progress: { progress: {
title: 'Progress', title: 'Progress',
@@ -222,6 +221,7 @@
return `${mulai.getDate()}-${mulai.getMonth() + 1}-${mulai.getFullYear()} - ${selesai.getDate()}-${selesai.getMonth() + 1}-${selesai.getFullYear()}` return `${mulai.getDate()}-${mulai.getMonth() + 1}-${mulai.getFullYear()} - ${selesai.getDate()}-${selesai.getMonth() + 1}-${selesai.getFullYear()}`
}, },
}, },
paparan: { paparan: {
title: 'Paparan', title: 'Paparan',
render: (item, data) => `${data.paparan || ''}`, render: (item, data) => `${data.paparan || ''}`,

View File

@@ -183,10 +183,61 @@
PAPARAN PAPARAN
</a> </a>
<a class="btn btn-primary" href="#"> <div class="dropdown" data-dropdown="true" data-dropdown-trigger="click">
<button class="dropdown-toggle btn btn-primary">
WORKSHEET WORKSHEET
</button>
<div class="dropdown-content w-full max-w-56 py-2">
<div class="menu menu-default flex flex-col w-full">
<div class="menu-item">
<a class="menu-link" href="#">
<span class="menu-icon">
<i class="ki-outline ki-badge">
</i>
</span>
<span class="menu-title">
MEMO
</span>
</a> </a>
</div> </div>
<div class="menu-item">
<a class="menu-link" href="#">
<span class="menu-icon">
<i class="ki-outline ki-profile-circle">
</i>
</span>
<span class="menu-title">
RESUME
</span>
</a>
</div>
<div class="menu-item">
<a class="menu-link" onclick="seletSederhanaStandart()">
<span class="menu-icon">
<i class="ki-outline ki-setting-2">
</i>
</span>
<span class="menu-title">
LPJ
</span>
</a>
</div>
<div class="menu-item">
<a class="menu-link" href="#">
<span class="menu-icon">
<i class="ki-outline ki-message-programming">
</i>
</span>
<span class="menu-title">
RAP
</span>
</a>
</div>
</div>
</div>
</div>
</div>
<div class="flex justify-end gap-5"> <div class="flex justify-end gap-5">
<a class="btn btn-success" href="#"> <a class="btn btn-success" href="#">
@@ -211,6 +262,7 @@
<div class="modal" data-modal="true" id="modal_2"> <div class="modal" data-modal="true" id="modal_2">
<div class="modal-content modal-center-y max-w-[600px]"> <div class="modal-content modal-center-y max-w-[600px]">
<div class="modal-header"> <div class="modal-header">
@@ -233,7 +285,8 @@
</div> </div>
<div class="form-group flex items-baseline flex-wrap"> <div class="form-group flex items-baseline flex-wrap">
<a class="btn btn-outline btn-primary w-full" href="#">Export Kertas Kerja</a> <a class="btn btn-outline btn-primary w-full"
href="{{ route('penilai.export.kertas-kerja', $permohonan->id) }}">Export Kertas Kerja</a>
</div> </div>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
@@ -242,3 +295,23 @@
</div> </div>
</div> </div>
@endsection @endsection
<script>
function seletSederhanaStandart() {
Swal.fire({
title: 'Apakah kamu akan memilih lpj standar?',
icon: 'warning',
showDenyButton: true,
showCancelButton: false,
confirmButtonText: 'Yes',
denyButtonText: 'No',
}).then((result) => {
if (result.isConfirmed) {
} else if (result.isDenied) {
Swal.fire('Changes are not saved', '', 'info')
}
})
}
</script>

View File

@@ -254,7 +254,7 @@
<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"> <label class="form-label max-w-56">
Jadwal Kunjungan Tanggal assign
</label> </label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">

View File

@@ -26,24 +26,29 @@
<input type="radio" <input type="radio"
onclick="toggleFieldVisibility('luas_tanah_bagunan', 'luas_tanah_bagunan_tidak_sesuai', ['tidak sesuai'])" onclick="toggleFieldVisibility('luas_tanah_bagunan', 'luas_tanah_bagunan_tidak_sesuai', ['tidak sesuai'])"
class="radio" name="luas_tanah_bagunan" value="sesuai" class="radio" name="luas_tanah_bagunan" value="sesuai"
{{ old('luas_tanah_bagunan', $forminspeksi['bangunan']['luas_tanah_bagunan'] ?? '') == 'sesuai' ? 'checked' : '' }}> {{ old('luas_tanah_bagunan', isset($forminspeksi['bangunan']['luas_tanah_bagunan']['sesuai'])) ? 'checked' : '' }}>
<span class="ml-2">Sesuai</span> <span class="ml-2">Sesuai</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 type="radio" class="radio" name="luas_tanah_bagunan" <input type="radio" class="radio" name="luas_tanah_bagunan"
onclick="toggleFieldVisibility('luas_tanah_bagunan', 'luas_tanah_bagunan_tidak_sesuai', ['tidak sesuai'])" onclick="toggleFieldVisibility('luas_tanah_bagunan', 'luas_tanah_bagunan_tidak_sesuai', ['tidak sesuai'])"
value="tidak sesuai" value="tidak sesuai"
{{ old('luas_tanah_bagunan', $forminspeksi['bangunan']['luas_tanah_bagunan'] ?? '') == 'tidak sesuai' ? 'checked' : '' }}> {{ old('luas_tanah_bagunan', isset($forminspeksi['bangunan']['luas_tanah_bagunan']['tidak sesuai'])) ? 'checked' : '' }}>
<span class="ml-2">Tidak Sesuai</span> <span class="ml-2">Tidak Sesuai</span>
</label> </label>
<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="{{ isset($forminspeksi['bangunan']['luas_tanah_bagunan']['tidak_sesuai']) ? '' : 'display: none;' }}">
<input type="text"id="analisa_bangunan_tidak_sesuai" 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" onclick="updateAnalisa('analisa_bangunan')">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>
@@ -62,8 +67,7 @@
<input class="checkbox" name="jenis_bangunan[]" type="checkbox" <input class="checkbox" name="jenis_bangunan[]" type="checkbox"
value="{{ $item->name }}" value="{{ $item->name }}"
{{ old('jenis_bangunan') == $item->name || isset($forminspeksi['bangunan']['jenis_bangunan']) == $item->name ? 'checked' : '' }} {{ old('jenis_bangunan') == $item->name || isset($forminspeksi['bangunan']['jenis_bangunan']) == $item->name ? 'checked' : '' }}
onclick="toggleCheckboxVisibility('jenis_bangunan', 'jenis_bangunan_lainnya', ['lainnya'])" onclick="toggleCheckboxVisibility('jenis_bangunan', 'jenis_bangunan_lainnya', ['lainnya'])" />
/>
{{ $item->name }} {{ $item->name }}
</label> </label>
@if (strcasecmp($item->name, 'Lainnya') == 0) @if (strcasecmp($item->name, 'Lainnya') == 0)
@@ -196,16 +200,28 @@
<div class="flex flex-col items-start gap-4"> <div class="flex flex-col items-start gap-4">
@if (isset($saranaPelengkap)) @if (isset($saranaPelengkap))
@foreach ($saranaPelengkap as $item) @foreach ($saranaPelengkap as $item)
@php
$isChecked = false;
$inputValue = '';
if (isset($forminspeksi['bangunan']['sarana_pelengkap'])) {
foreach ($forminspeksi['bangunan']['sarana_pelengkap'] as $key => $value) {
if ($key === $item->name) {
$isChecked = true;
$inputValue = $value;
break;
}
}
}
@endphp
<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 gap-2.5" style="width: 500px"> <label class="form-label max-w-56 gap-2.5" style="width: 500px">
<input class="checkbox" name="sarana_pelengkap[]" type="checkbox" <input class="checkbox" name="sarana_pelengkap[]" type="checkbox"
value="{{ $item->name }}" value="{{ $item->name }}" {{ $isChecked ? 'checked' : '' }} />
{{ in_array($item->name, old('sarana_pelengkap', $forminspeksi['bangunan']['sarana_pelengkap'] ?? [])) ? 'checked' : '' }} />
{{ $item->name }} {{ $item->name }}
</label> </label>
<input type="text" name="sarana_pelengkap_input[]" class="input w-full" <input type="text" name="sarana_pelengkap_input[]" class="input w-full"
id="bentukTanahInput" placeholder="Masukkan {{ $item->name }}..." placeholder="Masukkan {{ $item->name }}..." value="{{ $inputValue }}">
value="{{ old('sarana_pelengkap_input.' . $loop->index, $forminspeksi['bangunan']['sarana_pelengkap_input'][$loop->index] ?? '') }}">
</div> </div>
@endforeach @endforeach
@endif @endif
@@ -213,6 +229,7 @@
<em id="error-sarana_pelengkap" class="alert text-danger text-sm"></em> <em id="error-sarana_pelengkap" class="alert text-danger text-sm"></em>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>

View File

@@ -57,7 +57,14 @@
<div class="card-group flex items-center flex-wrap sm:flex-nowrap justify-between py-4 gap-2.5"> <div class="card-group flex items-center flex-wrap sm:flex-nowrap justify-between py-4 gap-2.5">
<div class="flex items-center gap-3.5"> <div class="flex items-center gap-3.5">
<div class="relative size-[50px] shrink-0"> <div class="relative size-[50px] shrink-0">
<!-- SVG code remains the same --> <svg class="w-full h-full stroke-brand-clarity fill-light" fill="none" height="48"
viewBox="0 0 44 48" width="44" xmlns="http://www.w3.org/2000/svg">
<path d="M16 2.4641C19.7128 0.320509 24.2872 0.320508 28 2.4641L37.6506 8.0359C41.3634 10.1795 43.6506 14.141 43.6506 18.4282V29.5718C43.6506 33.859 41.3634 37.8205 37.6506 39.9641L28 45.5359C24.2872 47.6795 19.7128 47.6795 16 45.5359L6.34937 39.9641C2.63655 37.8205 0.349365 33.859 0.349365 29.5718V18.4282C0.349365 14.141 2.63655 10.1795 6.34937 8.0359L16 2.4641Z" fill=""></path>
<path d="M16.25 2.89711C19.8081 0.842838 24.1919 0.842837 27.75 2.89711L37.4006 8.46891C40.9587 10.5232 43.1506 14.3196 43.1506 18.4282V29.5718C43.1506 33.6804 40.9587 37.4768 37.4006 39.5311L27.75 45.1029C24.1919 47.1572 19.8081 47.1572 16.25 45.1029L6.59937 39.5311C3.04125 37.4768 0.849365 33.6803 0.849365 29.5718V18.4282C0.849365 14.3196 3.04125 10.5232 6.59937 8.46891L16.25 2.89711Z" stroke=""></path>
</svg>
<div class="absolute leading-none left-2/4 top-2/4 -translate-y-2/4 -translate-x-2/4">
<i class="ki-filled ki-additem text-2xl text-brand"></i>
</div>
</div> </div>
</div> </div>
<div class="flex items-center gap-2.5"> <div class="flex items-center gap-2.5">

File diff suppressed because it is too large Load Diff

View File

@@ -142,7 +142,8 @@
<div class="w-full grid gap-5"> <div class="w-full grid gap-5">
<img id="foto_denah-preview" <img id="foto_denah-preview"
src="{{ isset($formDenah['foto_denah']) ? asset('storage/' . old('foto_denah', $formDenah['foto_denah'])) : '' }}" src="{{ isset($formDenah['foto_denah']) ? asset('storage/' . old('foto_denah', $formDenah['foto_denah'])) : '' }}"
alt="Gambar foto_denah" style="{{ isset($formDenah['foto_denah']) ? 'width: 30rem;' : 'display: none;' }}"> alt="Gambar foto_denah"
style="{{ isset($formDenah['foto_denah']) ? 'width: 30rem;' : 'display: none;' }}">
@@ -150,9 +151,7 @@
<input type="file" <input type="file"
value="{{ old('foto_denah', isset($formDenah['foto_denah']) ? $formDenah['foto_denah'] : '') }}" value="{{ old('foto_denah', isset($formDenah['foto_denah']) ? $formDenah['foto_denah'] : '') }}"
name="foto_denah" class="file-input file-input-bordered w-full " name="foto_denah" class="file-input file-input-bordered w-full "
accept="image/*" accept="image/*" onchange="previewImage(this, 'foto_denah-preview')">
onchange="previewImage(this, 'foto_denah-preview')"
>
</div> </div>
</div> </div>
</div> </div>
@@ -185,16 +184,19 @@
<div class="flex justify-end gap-2" style="margin-right: 20px; margin-top: 20px"> <div class="flex justify-end gap-2" style="margin-right: 20px; margin-top: 20px">
<button type="button" class="btn btn-success" id="saveButton" onclick="submitDenah()"> <button type="button" class="btn btn-success" id="saveButton" onclick="submitDenah()">
<span id="saveButtonText">Save</span> <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> </button>
</div> </div>
</form> </form>
</div> </div>
</div> </div>
</div> </div>
<div id="loadingOverlay" class="fixed inset-0 bg-black bg-opacity-50 hidden items-center justify-center z-50">
<div class="bg-white p-4 rounded-lg">
<div class="loader"></div>
<p class="mt-2 text-center">Sedang memproses...</p>
</div>
</div>
@endsection @endsection
@@ -213,15 +215,13 @@
} }
function submitDenah() { function submitDenah() {
const loadingOverlay = document.getElementById('loadingOverlay');
loadingOverlay.classList.remove('hidden');
loadingOverlay.classList.add('flex');
const formElement = $('#formDenah')[0]; const formElement = $('#formDenah')[0];
const formData = new FormData(formElement); const formData = new FormData(formElement);
// Disable the button and show the spinner
$('#saveButton').prop('disabled', true);
$('#saveButtonText').hide();
$('#saveButtonSpinner').show();
$.ajax({ $.ajax({
url: '{{ route('surveyor.storeDenah') }}', url: '{{ route('surveyor.storeDenah') }}',
type: 'POST', type: 'POST',
@@ -233,9 +233,24 @@
}, },
success: function(response) { success: function(response) {
if (response.success) { if (response.success) {
Swal.fire({
title: 'Berhasil!',
text: response.message,
icon: 'success',
confirmButtonText: 'OK'
}).then((response) => {
if (response.isConfirmed) {
window.location.href = window.location.href =
'{{ route('surveyor.show', ['id' => $permohonan->id]) }}?form=denah'; '{{ route('surveyor.show', ['id' => $permohonan->id]) }}';
toastrSuccessBuild(response.message); }
});
} else {
Swal.fire({
title: 'Error!',
text: response.message || 'Terjadi kesalahan',
icon: 'error',
confirmButtonText: 'OK'
});
} }
console.log(response); console.log(response);
}, },
@@ -255,13 +270,32 @@
}, },
complete: function() { complete: function() {
// Re-enable the button and hide the spinner loadingOverlay.classList.add('hidden');
$('#saveButton').prop('disabled', false); loadingOverlay.classList.remove('flex');
$('#saveButtonText').show();
$('#saveButtonSpinner').hide();
} }
}); });
} }
</script> </script>
@endpush @endpush
<style>
.loader {
border: 4px solid #f3f3f3;
border-radius: 50%;
border-top: 4px solid #3498db;
width: 40px;
height: 40px;
animation: spin 1s linear infinite;
margin: 0 auto;
}
@keyframes spin {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
</style>

View File

@@ -76,19 +76,32 @@
<label class="form-label max-w-56">Batas batas</label> <label class="form-label max-w-56">Batas batas</label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<div class="grid grid-cols-1 gap-4 items-center w-full"> <div class="grid grid-cols-1 gap-4 items-center w-full">
@if (isset($arahMataAngin)) @if (isset($arahMataAngin))
@foreach ($arahMataAngin as $item) @foreach ($arahMataAngin as $item)
@php
$isChecked = false;
$inputValue = '';
if (isset($forminspeksi['fakta']['batas_batas'])) {
foreach ($forminspeksi['fakta']['batas_batas'] as $key => $value) {
if ($key === $item->name) {
$isChecked = true;
$inputValue = $value;
break;
}
}
}
@endphp
<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 gap-2.5" style="width: 500px"> <label class="form-label max-w-56 gap-2.5" style="width: 500px">
<input class="checkbox" name="batas_batas[]" type="checkbox" <input class="checkbox" name="batas_batas[]" type="checkbox"
value="{{ $item->name }}" value="{{ $item->name }}"
{{ in_array($item->name, old('batas_batas', $forminspeksi['fakta']['batas_batas'] ?? [])) ? 'checked' : '' }} /> {{ $isChecked ? 'checked' : '' }} />
{{ $item->name }} {{ $item->name }}
</label> </label>
<input type="text" name="batas_batas_input[]" class="input w-full" <input type="text" name="batas_batas_input[]" class="input w-full"
id="bentukTanahInput" placeholder="Masukkan Batas {{ $item->name }}..." placeholder="Masukkan Batas {{ $item->name }}..."
value="{{ old('batas_batas_input.' . $loop->index, $forminspeksi['fakta']['batas_batas_input'][$loop->index] ?? '') }}"> value="{{ $inputValue }}">
</div> </div>
@endforeach @endforeach
@endif @endif
@@ -98,6 +111,7 @@
</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">Kondisi lain terkait lingkungan</label> <label class="form-label max-w-56">Kondisi lain terkait lingkungan</label>
<div class="flex flex-wrap items-baseline w-full" id="kondisi-lingkungan-container"> <div class="flex flex-wrap items-baseline w-full" id="kondisi-lingkungan-container">

View File

@@ -585,8 +585,12 @@
</div> </div>
</form> </form>
</div>
<div id="loadingOverlay" class="fixed inset-0 bg-black bg-opacity-50 hidden items-center justify-center z-50">
<div class="bg-white p-4 rounded-lg">
<div class="loader"></div>
<p class="mt-2 text-center">Sedang memproses...</p>
</div>
</div> </div>
<!-- Modal Kamera --> <!-- Modal Kamera -->
@@ -598,17 +602,16 @@
@push('scripts') @push('scripts')
<script> <script>
function submitFoto() { function submitFoto() {
const loadingOverlay = document.getElementById('loadingOverlay');
loadingOverlay.classList.remove('hidden');
loadingOverlay.classList.add('flex');
const formElement = $('#formFoto')[0]; const formElement = $('#formFoto')[0];
const formData = new FormData(formElement); const formData = new FormData(formElement);
// for (const [key, value] of formData.entries()) { // for (const [key, value] of formData.entries()) {
// console.log(`Key: ${key}, Value: ${value}`); // console.log(`Key: ${key}, Value: ${value}`);
// } // }
// Disable the button and show the spinner
$('#saveButtonFoto').prop('disabled', true);
$('#saveButtonFotoText').hide();
$('#saveButtonSpinner').show();
$.ajax({ $.ajax({
url: '{{ route('surveyor.storeFoto') }}', url: '{{ route('surveyor.storeFoto') }}',
type: 'POST', type: 'POST',
@@ -621,9 +624,24 @@
}, },
success: function(response) { success: function(response) {
if (response.success) { if (response.success) {
// window.location.href = Swal.fire({
// '{{ route('surveyor.show', ['id' => $permohonan->id]) }}?form=foto'; title: 'Berhasil!',
toastrSuccessBuild(response.message); text: response.message,
icon: 'success',
confirmButtonText: 'OK'
}).then((response) => {
if (response.isConfirmed) {
window.location.href =
'{{ route('surveyor.show', ['id' => $permohonan->id]) }}';
}
});
} else {
Swal.fire({
title: 'Error!',
text: response.message || 'Terjadi kesalahan',
icon: 'error',
confirmButtonText: 'OK'
});
} }
console.log(response); console.log(response);
@@ -645,9 +663,8 @@
}, },
complete: function() { complete: function() {
// Re-enable the button and hide the spinner // Re-enable the button and hide the spinner
$('#saveButtonFoto').prop('disabled', false); loadingOverlay.classList.add('hidden');
$('#saveButtonFotoText').show(); loadingOverlay.classList.remove('flex');
$('#saveButtonSpinner').hide();
} }
}); });
} }
@@ -655,6 +672,28 @@
@include('lpj::surveyor.js.camera-editor') @include('lpj::surveyor.js.camera-editor')
@endpush @endpush
<style>
.loader {
border: 4px solid #f3f3f3;
border-radius: 50%;
border-top: 4px solid #3498db;
width: 40px;
height: 40px;
animation: spin 1s linear infinite;
margin: 0 auto;
}
@keyframes spin {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
</style>

View File

@@ -141,8 +141,8 @@
@endforeach @endforeach
@endif @endif
</select> </select>
<button type="button" class="btn btn-md btn-primary" {{-- <button type="button" class="btn btn-md btn-primary"
onclick="updateAnalisa('jenis_asset')">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>
@@ -161,134 +161,91 @@
@endforeach @endforeach
<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"> <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 <input
onclick="toggleAlamatVisibility('alamat_sesuai', 'alamat_tidak_sesuai', 'sesuai')" onclick="updateAlamatFields('sesuai')"
type="radio" class="radio" name="alamat_sesuai" value="sesuai" type="radio"
class="radio"
name="alamat_sesuai"
value="sesuai"
{{ old('jenis_asset', isset($forminspeksi['asset']['alamat']['sesuai'])) ? 'checked' : '' }}> {{ old('jenis_asset', isset($forminspeksi['asset']['alamat']['sesuai'])) ? 'checked' : '' }}>
<span class="ml-2">Ya</span> <span class="ml-2">Ya</span>
</label> </label>
<label class="form-label flex items-center gap-3 text-nowrap"> <label class="form-label flex items-center gap-3 text-nowrap">
<input <input
onclick="toggleAlamatVisibility('alamat_sesuai', 'alamat_tidak_sesuai', 'tidak sesuai')" onclick="updateAlamatFields('tidak sesuai')"
type="radio" class="radio" name="alamat_sesuai" value="tidak sesuai" type="radio"
class="radio"
name="alamat_sesuai"
value="tidak sesuai"
{{ old('jenis_asset', isset($forminspeksi['asset']['alamat']['tidak sesuai'])) ? 'checked' : '' }}> {{ old('jenis_asset', isset($forminspeksi['asset']['alamat']['tidak sesuai'])) ? 'checked' : '' }}>
<span class="ml-2">Tidak</span> <span class="ml-2">Tidak</span>
</label> </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_form" class="grid gap-2 mt-5">
<div id="alamat_sesuai" class="grid gap-2 mt-5" style="{{ isset($forminspeksi['asset']['alamat']['sesuai']) ? '' : 'display: none;' }}">
@foreach ($permohonan->debiture->documents as $dokumen)
@php @php
$fields = [ $fields = [
[ [
'label' => 'Jl.', 'label' => 'Jl.',
'value' => $dokumen->address ?? '',
'name' => 'nama_jalan', 'name' => 'nama_jalan',
'id' => 'nama_jalan',
'readonly' => false, 'readonly' => false,
], ],
[ [
'label' => 'Provinsi', 'label' => 'Provinsi',
'value' => $dokumen->province->name ?? '',
'name' => 'provinsi', 'name' => 'provinsi',
'readonly' => true, 'id' => 'provinsi',
'type' => 'select',
'options' => $provinces,
], ],
[ [
'label' => 'Kota/Kabupaten', 'label' => 'Kota/Kabupaten',
'value' => $dokumen->city->name ?? '',
'name' => 'kota_kabupaten', 'name' => 'kota_kabupaten',
'readonly' => true, 'id' => 'kota_kabupaten',
'type' => 'select',
'options' => $provinces,
], ],
[ [
'label' => 'Kecamatan', 'label' => 'Kecamatan',
'value' => $dokumen->district->name ?? '',
'name' => 'kecamatan', 'name' => 'kecamatan',
'readonly' => true, 'id' => 'kecamatan',
'type' => 'select',
'options' => $provinces,
], ],
[ [
'label' => 'Kelurahan', 'label' => 'Kelurahan',
'value' => $dokumen->village->name ?? '',
'name' => 'desa_kelurahan', 'name' => 'desa_kelurahan',
'readonly' => true, 'id' => 'desa_kelurahan',
'type' => 'select',
'options' => $provinces,
], ],
]; ];
@endphp @endphp
@foreach ($fields as $field) @foreach ($fields as $field)
<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">{{ $field['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" class="input" name="{{ $field['name'] }}" @if (isset($field['type']) && $field['type'] === 'select')
value="{{ $field['value'] }}" {{ $field['readonly'] ? 'readonly' : '' }}> <select id="{{ $field['id'] }}" name="{{ $field['name'] }}" class="select w-full">
</div> <option value="">{{ $field['label'] }}</option>
</div> @foreach ($field['options'] as $option)
@endforeach
@endforeach
</div>
{{-- Alamat Tidak Sesuai --}}
<div id="alamat_tidak_sesuai" class="grid gap-2 mt-5" style="{{ isset($forminspeksi['asset']['alamat']['tidak sesuai']) ? '' : '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> <option value="{{ $option->code }}">{{ $option->name }}</option>
@endforeach @endforeach
@endif
</select> </select>
@else
<input type="text" id="{{ $field['id'] }}" name="{{ $field['name'] }}" class="input"
{{ $field['readonly'] ? 'readonly' : '' }}>
@endif @endif
</div> </div>
</div> </div>
@endforeach @endforeach
</div> </div>
</div> </div>
</div> </div>

View File

@@ -37,15 +37,42 @@
<span id="saveButtonText">Save</span> <span id="saveButtonText">Save</span>
<div class="spinner-border spinner-border-sm text-light" role="status" style="display: none;" <div class="spinner-border spinner-border-sm text-light" role="status" style="display: none;"
id="saveButtonSpinner"> id="saveButtonSpinner">
<span class="visually-hidden">Loading...</span>
</div> </div>
</button> </button>
</div> </div>
</form> </form>
</div> </div>
<!-- Loading Overlay -->
<div id="loadingOverlay" class="fixed inset-0 bg-black bg-opacity-50 hidden items-center justify-center z-50">
<div class="bg-white p-4 rounded-lg">
<div class="loader"></div>
<p class="mt-2 text-center">Sedang memproses...</p>
</div>
</div>
@endsection @endsection
@push('scripts') @push('scripts')
<script type="text/javascript"> <script type="text/javascript">
function updateAlamatFields(type) {
if (type === 'sesuai') {
// Update nilai form dengan data sesuai
document.getElementById('nama_jalan').value = "{{ $dokumen->address ?? '' }}";
document.getElementById('provinsi').value = "{{ $dokumen->province->code ?? '' }}";
document.getElementById('kota_kabupaten').value = "{{ $dokumen->city->code ?? '' }}";
document.getElementById('kecamatan').value = "{{ $dokumen->district->code ?? '' }}";
document.getElementById('desa_kelurahan').value = "{{ $dokumen->village->code ?? '' }}";
} else if (type === 'tidak sesuai') {
// Reset nilai form untuk input manual
document.getElementById('nama_jalan').value = '';
document.getElementById('provinsi').value = '';
document.getElementById('kota_kabupaten').value = '';
document.getElementById('kecamatan').value = '';
document.getElementById('desa_kelurahan').value = '';
}
}
function toggleFieldVisibility(fieldName, inputId, visibleValues = []) { function toggleFieldVisibility(fieldName, inputId, visibleValues = []) {
const selectedValue = $(`[name="${fieldName}"]:checked`).val(); const selectedValue = $(`[name="${fieldName}"]:checked`).val();
const inputField = $(`#${inputId}`); const inputField = $(`#${inputId}`);
@@ -118,14 +145,13 @@
function submitData() { function submitData() {
const loadingOverlay = document.getElementById('loadingOverlay');
loadingOverlay.classList.remove('hidden');
loadingOverlay.classList.add('flex');
const formElement = $('#formInspeksi')[0]; const formElement = $('#formInspeksi')[0];
const formData = new FormData(formElement); const formData = new FormData(formElement);
// Disable the button and show the spinner
$('#saveButton').prop('disabled', true);
$('#saveButtonText').hide();
$('#saveButtonSpinner').show();
$.ajax({ $.ajax({
url: '{{ route('surveyor.store') }}', url: '{{ route('surveyor.store') }}',
type: 'POST', type: 'POST',
@@ -136,12 +162,26 @@
'X-CSRF-TOKEN': '{{ csrf_token() }}' 'X-CSRF-TOKEN': '{{ csrf_token() }}'
}, },
success: function(response) { success: function(response) {
// if (response.success) { if (response.success) {
// toastrSuccessBuild(response.message) Swal.fire({
// window.location.href = title: 'Berhasil!',
// '{{ route('surveyor.show', ['id' => $permohonan->id]) }}?form=inspeksi'; text: response.message,
// } icon: 'success',
confirmButtonText: 'OK'
}).then((response) => {
if (response.isConfirmed) {
window.location.href =
'{{ route('surveyor.show', ['id' => $permohonan->id]) }}';
}
});
} else {
Swal.fire({
title: 'Error!',
text: response.message || 'Terjadi kesalahan',
icon: 'error',
confirmButtonText: 'OK'
});
}
console.log(response); console.log(response);
}, },
error: function(xhr, status, error) { error: function(xhr, status, error) {
@@ -160,9 +200,8 @@
}, },
complete: function() { complete: function() {
// Re-enable the button and hide the spinner // Re-enable the button and hide the spinner
$('#saveButton').prop('disabled', false); loadingOverlay.classList.add('hidden');
$('#saveButtonText').show(); loadingOverlay.classList.remove('flex');
$('#saveButtonSpinner').hide();
} }
}); });
} }
@@ -239,10 +278,8 @@
success: function(response) { success: function(response) {
console.log(response); console.log(response);
if (response.success) { if (response.success) {
if (response.jenis_asset) { // window.location.href =
window.location.href = // '{{ route('surveyor.show', ['id' => $permohonan->id]) }}';
'{{ route('surveyor.show', ['id' => $permohonan->id]) }}?form=inspeksi';
}
toastrSuccessBuild(response.message); toastrSuccessBuild(response.message);
} }
}, },
@@ -260,3 +297,34 @@
} }
</script> </script>
@endpush @endpush
<style>
.loader {
border: 4px solid #f3f3f3;
border-radius: 50%;
border-top: 4px solid #3498db;
width: 40px;
height: 40px;
animation: spin 1s linear infinite;
margin: 0 auto;
}
@keyframes spin {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
.scrollable-x-auto {
overflow-x: auto;
max-width: 100%;
}
.table {
min-width: 100%;
}
</style>

View File

@@ -169,25 +169,38 @@
<span class="ml-2">Telah ada bangunan</span> <span class="ml-2">Telah ada bangunan</span>
</label> </label>
<div class="flex w-full items-center gap-4"> <div class="flex w-full items-center gap-4">
<div id="disekitar_lokasi_sesuai" class="grid grid-cols-2 gap-4 mt-5 mb-5" <div id="disekitar_lokasi_sesuai" class="grid grid-cols-2 gap-4 mt-5 mb-5"
style="display: none;"> style="{{ old('disekitar_lokasi', $forminspeksi['lingkungan']['disekitar_lokasi'] ?? '') == 'ya' ? '' : 'display: none;' }}">
<div class="flex items-center gap-2"> <div class="flex items-center gap-2">
<label for="" class="text-sm text-gray-700">Kondisi bangunan</label> <label for="" class="text-sm text-gray-700">Kondisi bangunan</label>
@php
$kondisi = ['Cukup', 'Baik', 'Kurang'];
@endphp
<select class="select" name="kondisi_bagunan_disekitar_lokasi" id=""> <select class="select" name="kondisi_bagunan_disekitar_lokasi" id="">
<option value="">pilih kondisi</option> <option value="">pilih kondisi</option>
<option value="Cukup">Cukup</option> @foreach ($kondisi as $item)
<option value="Baik">Baik</option> <option value="{{ $item }}"
<option value="Kurang">Kurang</option> {{ old('kondisi_bagunan_disekitar_lokasi', $forminspeksi['lingkungan']['disekitar_lokasi'] ?? '') == $item ? 'selected' : '' }}>
{{ $item }}
</option>
@endforeach
</select> </select>
</div> </div>
<div class="flex items-center gap-2"> <div class="flex items-center gap-2">
<label for="" class="text-sm text-gray-700">Sifat bangunan</label> <label for="" class="text-sm text-gray-700">Sifat bangunan</label>
@php
$sifat = ['Permanen', 'Semi Permanen', 'Tidak Permanen'];
@endphp
<select class="select" name="sifat_bagunan_disekitar_lokasi" id=""> <select class="select" name="sifat_bagunan_disekitar_lokasi" id="">
<option value="">pilih sifat bagunan</option> <option value="">pilih sifat bagunan</option>
<option value="Permanen">Permanen</option> @foreach ($sifat as $item)
<option value="Semi Permanen">Semi Permanen</option> <option value="{{ $item }}"
<option value="Tidak Permanen">Tidak Permanen</option> {{ old('sifat_bagunan_disekitar_lokasi', $forminspeksi['lingkungan']['disekitar_lokasi'] ?? '') == $item ? 'selected' : '' }}>
{{ $item }}
</option>
@endforeach
</select> </select>
</div> </div>

View File

@@ -42,7 +42,7 @@
style="{{ old('luas_tanah', isset($forminspeksi['tanah']['luas_tanah']['tidak sesuai'])) ? '' : 'display: none;' }}"> style="{{ old('luas_tanah', isset($forminspeksi['tanah']['luas_tanah']['tidak sesuai'])) ? '' : 'display: none;' }}">
<input id="analisa_tanah_tidak_sesuai" type="text" name="luas_tanah_tidak_sesuai" <input id="analisa_tanah_tidak_sesuai" type="text" name="luas_tanah_tidak_sesuai"
class="input w-full" placeholder="Masukan Luas Tanah" class="input w-full" 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" <button type="button" class="btn btn-md btn-primary"
onclick="updateAnalisa('analisa_tanah')">Save</button> onclick="updateAnalisa('analisa_tanah')">Save</button>
</div> </div>
@@ -85,6 +85,7 @@
</label> </label>
<!-- Select dropdown untuk "Tidak Sesuai" --> <!-- Select dropdown untuk "Tidak Sesuai" -->
<div id="hadap_mata_angin_tidak_sesuai" class="flex items-baseline gap-2" <div id="hadap_mata_angin_tidak_sesuai" class="flex items-baseline gap-2"
style="{{ old('hadap_mata_angin', isset($forminspeksi['tanah']['hadap_mata_angin']['tidak sesuai'])) ? '' : 'display: none;' }}"> style="{{ old('hadap_mata_angin', isset($forminspeksi['tanah']['hadap_mata_angin']['tidak sesuai'])) ? '' : 'display: none;' }}">
<select class="input w-full <select class="input w-full
@@ -94,7 +95,7 @@
@if (isset($arahMataAngin)) @if (isset($arahMataAngin))
@foreach ($arahMataAngin as $item) @foreach ($arahMataAngin as $item)
<option value="{{ $item->name }}" <option value="{{ $item->name }}"
{{ old('hadap_mata_angin_tidak_sesuai', $forminspeksi['tanah']['hadap_mata_angin_tidak_sesuai'] ?? '') == $item->name ? 'selected' : '' }}> {{ old('hadap_mata_angin_tidak_sesuai', $forminspeksi['tanah']['hadap_mata_angin']['tidak sesuai'] ?? '') == $item->name ? 'selected' : '' }}>
{{ $item->name }} {{ $item->name }}
</option> </option>
@endforeach @endforeach
@@ -233,14 +234,14 @@
<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 class="checkbox" name="posisi_kavling[]" type="checkbox" <input class="checkbox" name="posisi_kavling[]" type="checkbox"
value="{{ $item->name }}" value="{{ $item->name }}"
{{ in_array($item->name, old('posisi_kavling', $forminspeksi['tanah']['posisi_kavling'] ?? [])) ? 'checked' : '' }} {{ in_array($item->name, old('posisi_kavling', $forminspeksi['tanah']['posisi_kavling']['posisi_kavling'] ?? [])) ? 'checked' : '' }}
onclick="toggleCheckboxVisibility('posisi_kavling', 'posisi_kavling_lainnya', ['Lainnya'])" /> onclick="toggleCheckboxVisibility('posisi_kavling', 'posisi_kavling_lainnya', ['Lainnya'])" />
{{ $item->name }} {{ $item->name }}
</label> </label>
@if (strcasecmp($item->name, 'Lainnya') == 0) @if (strcasecmp($item->name, 'Lainnya') == 0)
<input id="posisi_kavling_lainnya" type="text" style="display: none;" <input id="posisi_kavling_lainnya" type="text" style="display: none;"
name="posisi_kavling_lainnya" class="input w-full mt-2" name="posisi_kavling_lainnya" class="input w-full mt-2"
placeholder="Masukkan Posisi Kavling lainnya..." /> placeholder="Masukkan Posisi Kavling lainnya..." value="{{ old('posisi_kavling_lainnya', $forminspeksi['tanah']['posisi_kavling']['lainnya'] ?? '') }}" />
@endif @endif
</div> </div>
@endforeach @endforeach

View File

@@ -5,7 +5,6 @@
@endsection @endsection
@section('content') @section('content')
@push('styles') @push('styles')
@endpush @endpush
<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">
@@ -96,8 +95,6 @@
</div> </div>
</div> </div>
@endsection @endsection
@push('scripts') @push('scripts')
@@ -105,9 +102,12 @@
function jadwal(id) { function jadwal(id) {
document.getElementById('ids').value = id; document.getElementById('ids').value = id;
} }
function freezeInputSurveyor(data) {
}
</script> </script>
<script type="module"> <script type="module">
const element = document.querySelector('#permohonan-table'); const element = document.querySelector('#permohonan-table');
const searchInput = document.getElementById('search'); const searchInput = document.getElementById('search');
const statusFilter = document.getElementById('status-filter'); const statusFilter = document.getElementById('status-filter');
@@ -172,6 +172,11 @@ function jadwal(id){
<a class="btn btn-sm btn-icon btn-clear btn-warning" href="surveyor/${data.id}/show?form=inspeksi"> <a class="btn btn-sm btn-icon btn-clear btn-warning" href="surveyor/${data.id}/show?form=inspeksi">
<i class="ki-outline ki-eye"></i> <i class="ki-outline ki-eye"></i>
</a> </a>
<button type="button" class="btn btn-sm btn-icon btn-clear btn-info" onclick="freezeInputSurveyor(${data.id})" data-modal-toggle="#modal_freeze">
<i class="ki-filled ki-arrow-circle-right"></i>
</button>
`; `;
} }
return actionHtml; return actionHtml;
@@ -200,11 +205,13 @@ function jadwal(id){
return `${day}-${month}-${year}`; return `${day}-${month}-${year}`;
} }
</script> </script>
@endpush @endpush
<div class="modal" data-modal="true" id="modal_jadwal"> <div class="modal" data-modal="true" id="modal_jadwal">
<div class="modal-content max-w-[600px] top-[10%]"> <div class="modal-content modal-center-y max-w-[600px]">
<div class="modal-header"> <div class="modal-header">
<h3 class="modal-title">Kunjungan</h3> <h3 class="modal-title">Kunjungan</h3>
<button class="btn btn-xs btn-icon btn-light" data-modal-dismiss="true"> <button class="btn btn-xs btn-icon btn-light" data-modal-dismiss="true">
@@ -212,7 +219,8 @@ function jadwal(id){
</button> </button>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<form action="{{ route('surveyor.storeJadwal')}}" method="POST" enctype="multipart/form-data" id="revisiForm"> <form action="{{ route('surveyor.storeJadwal') }}" method="POST" enctype="multipart/form-data"
id="revisiForm">
@method('put') @method('put')
@csrf @csrf
<input id="ids" type="hidden" name="id"> <input id="ids" type="hidden" name="id">
@@ -231,8 +239,51 @@ function jadwal(id){
<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">Catatan</label> <label class="form-label max-w-56">Catatan</label>
<div class="flex flex-wrap items-baseline w-full"> <div class="flex flex-wrap items-baseline w-full">
<textarea id="deskripsi_penilaian" class="textarea @error('deskripsi_penilaian') border-danger bg-danger-light @enderror" <textarea id="deskripsi_penilaian"
rows="3" name="deskripsi_penilaian"></textarea> class="textarea @error('deskripsi_penilaian') border-danger bg-danger-light @enderror" rows="3"
name="deskripsi_penilaian"></textarea>
@error('deskripsi_penilaian')
<em class="alert text-danger text-sm">{{ $message }}</em>
@enderror
</div>
</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>
<div class="modal" data-modal="true" id="modal_freeze">
<div class="modal-content modal-center-y max-w-[600px]">
<div class="modal-header">
<h3 class="modal-title">Freeze Surveyor</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('surveyor.storeFreeze') }}" method="POST" enctype="multipart/form-data"
id="freezeSurveyor">
@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">Catatan</label>
<div class="flex flex-wrap items-baseline w-full">
<textarea id="deskripsi_penilaian"
class="textarea @error('deskripsi_penilaian') border-danger bg-danger-light @enderror" rows="3"
name="deskripsi_penilaian"></textarea>
@error('deskripsi_penilaian') @error('deskripsi_penilaian')
<em class="alert text-danger text-sm">{{ $message }}</em> <em class="alert text-danger text-sm">{{ $message }}</em>
@enderror @enderror

View File

@@ -514,7 +514,8 @@ Route::middleware(['auth'])->group(function () {
Route::post('store', [SurveyorController::class, 'store'])->name('store'); Route::post('store', [SurveyorController::class, 'store'])->name('store');
Route::post('storeDenah', [SurveyorController::class, 'storeDenah'])->name('storeDenah'); Route::post('storeDenah', [SurveyorController::class, 'storeDenah'])->name('storeDenah');
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::get('storeAproved/{id}', [SurveyorController::class, 'storeAproved'])->name('storeAproved');
Route::put('storeFreeze', [SurveyorController::class, 'storeFreeze'])->name('storeFreeze');
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::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');
@@ -535,6 +536,7 @@ Route::middleware(['auth'])->group(function () {
Route::get('datatables', [PenilaiController::class, 'dataForDatatables'])->name('dataForTables'); Route::get('datatables', [PenilaiController::class, 'dataForDatatables'])->name('dataForTables');
Route::get('lampiran/{id}', [PenilaiController::class, 'lampiran'])->name('lampiran'); Route::get('lampiran/{id}', [PenilaiController::class, 'lampiran'])->name('lampiran');
Route::get('export/kertas-kerja', [PenilaiController::class, 'kertas_kerja'])->name('export.kertas-kerja');