Merge remote-tracking branch 'composer/feature/senior-officer' into staging
# Conflicts: # resources/views/component/kertas-kerja.blade.php
This commit is contained in:
@@ -311,8 +311,8 @@ class PenilaiController extends Controller
|
|||||||
|
|
||||||
$data = Inspeksi::where('permohonan_id', $permohonanId)->where('dokument_id', $documentId)->first();
|
$data = Inspeksi::where('permohonan_id', $permohonanId)->where('dokument_id', $documentId)->first();
|
||||||
|
|
||||||
// return view('lpj::component.kertas-kerja', compact('data'));
|
return view('lpj::component.kertas-kerja', compact('data'));
|
||||||
return Excel::download(new KertasKerjaExport($data), 'kertas-kerja.xlsx');
|
// return Excel::download(new KertasKerjaExport($data), 'kertas-kerja.xlsx');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -478,7 +478,7 @@ class SurveyorController extends Controller
|
|||||||
$dataPembanding = json_decode($inspeksi->data_pembanding, true);
|
$dataPembanding = json_decode($inspeksi->data_pembanding, true);
|
||||||
|
|
||||||
// Get jenis jaminan to check if it needs denah
|
// Get jenis jaminan to check if it needs denah
|
||||||
$jenisJaminan = JenisJaminan::find($inspeksi->jenis_jaminan_id);
|
$jenisJaminan = JenisJaminan::find($inspeksi->dokument_id);
|
||||||
$isTanahBangunan = !in_array(
|
$isTanahBangunan = !in_array(
|
||||||
strtoupper($jenisJaminan->name ?? ''),
|
strtoupper($jenisJaminan->name ?? ''),
|
||||||
['KAPAL', 'PESAWAT', 'KENDARAAN', 'ALAT BERAT']
|
['KAPAL', 'PESAWAT', 'KENDARAAN', 'ALAT BERAT']
|
||||||
|
|||||||
@@ -470,15 +470,6 @@
|
|||||||
$fotoTypes = ['foto_gistaru', 'foto_bhumi', 'foto_argis_region', 'foto_tempat'];
|
$fotoTypes = ['foto_gistaru', 'foto_bhumi', 'foto_argis_region', 'foto_tempat'];
|
||||||
@endphp
|
@endphp
|
||||||
|
|
||||||
@php
|
|
||||||
$imagePath = $dataform['foto_gistaru'];
|
|
||||||
@endphp
|
|
||||||
<img
|
|
||||||
src="{{ asset('public/' . $imagePath) }}"
|
|
||||||
alt=""
|
|
||||||
class="max-w-full h-auto mx-auto"
|
|
||||||
|
|
||||||
>
|
|
||||||
|
|
||||||
<div class="grid grid-cols-4 gap-4">
|
<div class="grid grid-cols-4 gap-4">
|
||||||
@forelse ($fotoTypes as $type)
|
@forelse ($fotoTypes as $type)
|
||||||
@@ -487,19 +478,19 @@
|
|||||||
$imagePath = $dataform[$type];
|
$imagePath = $dataform[$type];
|
||||||
@endphp
|
@endphp
|
||||||
|
|
||||||
{{-- @if ($imagePath && Storage::exists($imagePath)) --}}
|
@if ($imagePath && Storage::exists($imagePath))
|
||||||
<img
|
<img
|
||||||
src="{{ asset('public/' . $imagePath) }}"
|
src="{{ asset('storage/' . $imagePath) }}"
|
||||||
alt="{{ $type }}"
|
alt="{{ $type }}"
|
||||||
class="max-w-full h-auto mx-auto"
|
class="max-w-full h-auto mx-auto"
|
||||||
onerror="this.src='{{ asset('default-image.png') }}'"
|
onerror="this.src='{{ asset('default-image.png') }}'"
|
||||||
>
|
>
|
||||||
<p class="mt-2 text-sm">{{ Str::title(str_replace('_', ' ', $type)) }}</p>
|
<p class="mt-2 text-sm">{{ Str::title(str_replace('_', ' ', $type)) }}</p>
|
||||||
{{-- @else
|
@else
|
||||||
<div class="bg-gray-200 p-4 text-center">
|
<div class="bg-gray-200 p-4 text-center">
|
||||||
<p>Tidak ada gambar</p>
|
<p>Tidak ada gambar</p>
|
||||||
</div>
|
</div>
|
||||||
@endif --}}
|
@endif
|
||||||
</div>
|
</div>
|
||||||
@empty
|
@empty
|
||||||
<p>Tidak ada tipe foto yang tersedia</p>
|
<p>Tidak ada tipe foto yang tersedia</p>
|
||||||
@@ -536,74 +527,12 @@
|
|||||||
|
|
||||||
<h4 class="mt-6">FOTO OBJEK</h4>
|
<h4 class="mt-6">FOTO OBJEK</h4>
|
||||||
|
|
||||||
@php
|
|
||||||
// Fungsi untuk mengumpulkan foto dengan pengecekan yang aman
|
|
||||||
function collectSafeImages($data, $paths = []) {
|
|
||||||
if (!is_array($data)) {
|
|
||||||
return $paths;
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach ($data as $key => $value) {
|
|
||||||
if (is_array($value)) {
|
|
||||||
// Jika array memiliki kunci foto
|
|
||||||
if (isset($value['foto_rute'])) {
|
|
||||||
$paths[] = $value['foto_rute'];
|
|
||||||
}
|
|
||||||
if (isset($value['foto_objek'])) {
|
|
||||||
$paths[] = $value['foto_objek'];
|
|
||||||
}
|
|
||||||
if (isset($value['foto_lingkungan'])) {
|
|
||||||
$paths[] = $value['foto_lingkungan'];
|
|
||||||
}
|
|
||||||
if (isset($value['foto_lantai_unit'])) {
|
|
||||||
$paths[] = $value['foto_lantai_unit'];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Rekursif untuk nested array
|
|
||||||
$paths = collectSafeImages($value, $paths);
|
|
||||||
} elseif (is_string($value) && strpos($value, 'foto_') !== false) {
|
|
||||||
$paths[] = $value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return $paths;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Decode foto form dengan penanganan error
|
|
||||||
try {
|
|
||||||
$dataFoto = json_decode($data->foto_form, true) ?? [];
|
|
||||||
} catch (Exception $e) {
|
|
||||||
$dataFoto = [];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Kumpulkan foto
|
|
||||||
$images = collectSafeImages($dataFoto);
|
|
||||||
|
|
||||||
// Filter foto yang valid
|
|
||||||
$validImages = array_filter($images, function($image) {
|
|
||||||
return $image && Storage::exists($image);
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@endphp
|
|
||||||
|
|
||||||
<div class="grid grid-cols-4 gap-4">
|
|
||||||
@forelse ($validImages as $image)
|
|
||||||
<div class="text-center">
|
|
||||||
<img
|
|
||||||
src="{{ asset('storage/' . $image) }}"
|
|
||||||
alt="Foto Survey"
|
|
||||||
class="w-full h-64 object-cover"
|
|
||||||
onerror="this.src='{{ asset('default-image.png') }}'"
|
|
||||||
>
|
|
||||||
</div>
|
|
||||||
@empty
|
|
||||||
<div class="col-span-4 text-center bg-gray-200 p-4">
|
|
||||||
<p>Tidak ada foto objek yang tersedia</p>
|
|
||||||
</div>
|
|
||||||
@endforelse
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
@@ -611,6 +540,8 @@
|
|||||||
</html>
|
</html>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
const data = @json($dataFoto);
|
const data = @json($dataform);
|
||||||
console.log(data);
|
console.log(data);
|
||||||
|
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -211,7 +211,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<button type="button" class="btn btn-danger btn-sm delete-btn"
|
<button type="button" class="btn btn-danger btn-sm delete-btn"
|
||||||
onclick="deletePhoto('{{ $index }}')">
|
id="btnDelete">
|
||||||
<i class="ki-filled ki-trash"></i>
|
<i class="ki-filled ki-trash"></i>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
@@ -446,7 +446,7 @@
|
|||||||
<div class="input-group w-full flex gap-2">
|
<div class="input-group w-full flex gap-2">
|
||||||
<input id="inputBasement" type="file" name="foto_basement"
|
<input id="inputBasement" type="file" name="foto_basement"
|
||||||
class="file-input file-input-bordered w-full" accept="image/*"
|
class="file-input file-input-bordered w-full" accept="image/*"
|
||||||
capture="camera">
|
onchange="previewImage(this, 'foto_basement_preview')" capture="camera">
|
||||||
<button type="button" id="btnCamera" class="btn btn-light"
|
<button type="button" id="btnCamera" class="btn btn-light"
|
||||||
data-modal-toggle="#cameraModal">
|
data-modal-toggle="#cameraModal">
|
||||||
<i class="ki-outline ki-abstract-33"></i> Camera
|
<i class="ki-outline ki-abstract-33"></i> Camera
|
||||||
@@ -497,7 +497,9 @@
|
|||||||
<div class="input-group w-full flex gap-2">
|
<div class="input-group w-full flex gap-2">
|
||||||
<input id="inputLingkungan_{{ $key }}" type="file"
|
<input id="inputLingkungan_{{ $key }}" type="file"
|
||||||
name="foto_lingkungan[]" class="file-input file-input-bordered w-full"
|
name="foto_lingkungan[]" class="file-input file-input-bordered w-full"
|
||||||
accept="image/*" capture="camera">
|
accept="image/*" capture="camera"
|
||||||
|
onchange="previewImage(this, 'foto_lingkungan_preview_{{ $key }}')"
|
||||||
|
>
|
||||||
<button type="button" id="btnCamera" class="btn btn-light"
|
<button type="button" id="btnCamera" class="btn btn-light"
|
||||||
data-modal-toggle="#cameraModal">
|
data-modal-toggle="#cameraModal">
|
||||||
<i class="ki-outline ki-abstract-33"></i> Camera
|
<i class="ki-outline ki-abstract-33"></i> Camera
|
||||||
@@ -520,8 +522,12 @@
|
|||||||
</label>
|
</label>
|
||||||
<div class="input-group w-full flex gap-2">
|
<div class="input-group w-full flex gap-2">
|
||||||
<input type="hidden" name="name_lingkungan[]" value="lingkungan">
|
<input type="hidden" name="name_lingkungan[]" value="lingkungan">
|
||||||
|
<img id="foto_lingkungan_preview_0"
|
||||||
|
src="{{ isset($formFoto['lingkungan']) ? asset('storage/' . old('lingkungan', $formFoto['lingkungan'])) : '#' }}"
|
||||||
|
alt="Gambar Lingkungan" style="width: 30rem;" onerror="this.style.display='none';">
|
||||||
<input id="inputLingkungan_0" type="file" name="foto_lingkungan[]"
|
<input id="inputLingkungan_0" type="file" name="foto_lingkungan[]"
|
||||||
class="file-input file-input-bordered w-full" accept="image/*" capture="camera">
|
class="file-input file-input-bordered w-full" accept="image/*" capture="camera"
|
||||||
|
onchange="previewImage(this, 'foto_lingkungan_preview_0')" >
|
||||||
<button type="button" id="btnCamera" class="btn btn-light"
|
<button type="button" id="btnCamera" class="btn btn-light"
|
||||||
data-modal-toggle="#cameraModal">
|
data-modal-toggle="#cameraModal">
|
||||||
<i class="ki-outline ki-abstract-33"></i> Camera
|
<i class="ki-outline ki-abstract-33"></i> Camera
|
||||||
@@ -559,9 +565,12 @@
|
|||||||
|
|
||||||
<div class="input-group w-full flex gap-2">
|
<div class="input-group w-full flex gap-2">
|
||||||
<input id="inputPendamping" type="file" name="pendamping"
|
<input id="inputPendamping" type="file" name="pendamping"
|
||||||
class="file-input file-input-bordered w-full" accept="image/*" capture="camera">
|
class="file-input file-input-bordered w-full" accept="image/*"
|
||||||
|
onchange="previewImage(this, 'pendamping')"
|
||||||
|
capture="camera">
|
||||||
<button type="button" id="btnCamera" class="btn btn-light"
|
<button type="button" id="btnCamera" class="btn btn-light"
|
||||||
data-modal-toggle="#cameraModal">
|
data-modal-toggle="#cameraModal"
|
||||||
|
>
|
||||||
<i class="ki-outline ki-abstract-33"></i> Camera
|
<i class="ki-outline ki-abstract-33"></i> Camera
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -71,134 +71,131 @@
|
|||||||
|
|
||||||
|
|
||||||
function setupInputHandlers(containerId, buttonId, labelText, inputDataClass, buttonDeleteClass) {
|
function setupInputHandlers(containerId, buttonId, labelText, inputDataClass, buttonDeleteClass) {
|
||||||
const addButton = document.getElementById(buttonId);
|
const addButton = document.getElementById(buttonId);
|
||||||
const inputContainer = document.getElementById(containerId);
|
const inputContainer = document.getElementById(containerId);
|
||||||
|
|
||||||
if (!addButton || !inputContainer) {
|
if (!addButton || !inputContainer) {
|
||||||
console.error(`Element with ID ${containerId} or ${buttonId} not found.`);
|
console.error(`Element with ID ${containerId} or ${buttonId} not found.`);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
function updateLabels() {
|
function updateLabels() {
|
||||||
const labels = inputContainer.querySelectorAll('.form-label span');
|
const labels = inputContainer.querySelectorAll('.form-label span');
|
||||||
labels.forEach((label, index) => {
|
labels.forEach((label, index) => {
|
||||||
label.textContent = `${labelText} ${index + 1}`;
|
label.textContent = `${labelText} ${index + 1}`;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function handleDeleteButtons() {
|
function handleDeleteButtons() {
|
||||||
const deleteBtns = inputContainer.querySelectorAll(`.${buttonDeleteClass}`);
|
const deleteBtns = inputContainer.querySelectorAll(`.${buttonDeleteClass}`);
|
||||||
deleteBtns.forEach(btn => {
|
deleteBtns.forEach(btn => {
|
||||||
btn.style.display = inputContainer.children.length > 1 ? 'block' : 'none';
|
btn.style.display = inputContainer.children.length > 1 ? 'block' : 'none';
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function createNewInput() {
|
function createNewInput() {
|
||||||
const newDiv = inputContainer.children[0].cloneNode(true);
|
const newDiv = inputContainer.children[0].cloneNode(true);
|
||||||
|
|
||||||
// Reset semua input dalam elemen baru
|
// Reset semua input dalam elemen baru
|
||||||
const inputFile = newDiv.querySelector(`.${inputDataClass}`);
|
const inputFile = newDiv.querySelector(`.${inputDataClass}`);
|
||||||
if (inputFile) {
|
const previewContainer = newDiv.querySelector('.preview-container');
|
||||||
inputFile.id = `inputLingkungan-${inputContainer.children.length}`;
|
const imgPreview = previewContainer.querySelector('img');
|
||||||
inputFile.value = ''; // Reset input file
|
|
||||||
|
|
||||||
// Tambahkan event listener untuk preview
|
if (inputFile) {
|
||||||
inputFile.addEventListener('change', function() {
|
// Generate unique ID untuk input dan preview
|
||||||
const file = this.files[0];
|
const uniqueId = `${containerId}-${Date.now()}`;
|
||||||
if (file) {
|
inputFile.id = `input-${uniqueId}`;
|
||||||
const reader = new FileReader();
|
imgPreview.id = `preview-${uniqueId}`;
|
||||||
reader.onload = function(e) {
|
|
||||||
const img = document.getElementById(
|
|
||||||
`foto_lingkungan_preview_${inputFile.id}`
|
|
||||||
);
|
|
||||||
img.src = e.target.result;
|
|
||||||
img.style.display = 'block';
|
|
||||||
};
|
|
||||||
reader.readAsDataURL(file);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tambahkan logika reset untuk elemen preview
|
// Reset input file
|
||||||
const imgPreview = newDiv.querySelector('img');
|
inputFile.value = '';
|
||||||
if (imgPreview) {
|
|
||||||
imgPreview.src = '';
|
|
||||||
imgPreview.style.display = 'none';
|
|
||||||
}
|
|
||||||
|
|
||||||
const deleteBtn = newDiv.querySelector(`.${buttonDeleteClass}`);
|
// Tambahkan event listener untuk preview
|
||||||
if (deleteBtn) {
|
inputFile.addEventListener('change', function() {
|
||||||
deleteBtn.addEventListener('click', function() {
|
|
||||||
inputContainer.removeChild(newDiv);
|
|
||||||
handleDeleteButtons();
|
|
||||||
updateLabels();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tambahkan container preview jika tidak ada
|
|
||||||
let previewContainer = newDiv.querySelector('.preview-container');
|
|
||||||
if (!previewContainer) {
|
|
||||||
previewContainer = document.createElement('div');
|
|
||||||
previewContainer.className = 'preview-container';
|
|
||||||
|
|
||||||
const img = document.createElement('img');
|
|
||||||
img.id = `foto_lingkungan_preview_${inputFile.id}`;
|
|
||||||
img.src = '';
|
|
||||||
img.className = 'mt-2 h-auto';
|
|
||||||
img.style.display = 'none';
|
|
||||||
img.style.width = '30rem';
|
|
||||||
previewContainer.appendChild(img);
|
|
||||||
|
|
||||||
const inputGroup = newDiv.querySelector('.input-group');
|
|
||||||
inputGroup.appendChild(previewContainer);
|
|
||||||
}
|
|
||||||
|
|
||||||
newDiv.style.marginTop = '10px';
|
|
||||||
inputContainer.appendChild(newDiv);
|
|
||||||
updateLabels();
|
|
||||||
handleDeleteButtons();
|
|
||||||
}
|
|
||||||
|
|
||||||
addButton.addEventListener('click', createNewInput);
|
|
||||||
|
|
||||||
// Terapkan event listener pada elemen yang sudah ada
|
|
||||||
const existingInputs = inputContainer.querySelectorAll(`.${inputDataClass}`);
|
|
||||||
existingInputs.forEach((input, index) => {
|
|
||||||
const deleteBtn = input.closest('.flex').querySelector(`.${buttonDeleteClass}`);
|
|
||||||
if (deleteBtn) {
|
|
||||||
deleteBtn.addEventListener('click', function() {
|
|
||||||
if (inputContainer.children.length > 1) {
|
|
||||||
inputContainer.removeChild(this.closest('.flex'));
|
|
||||||
handleDeleteButtons();
|
|
||||||
updateLabels();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
input.addEventListener('change', function() {
|
|
||||||
const file = this.files[0];
|
const file = this.files[0];
|
||||||
if (file) {
|
if (file) {
|
||||||
const reader = new FileReader();
|
const reader = new FileReader();
|
||||||
reader.onload = function(e) {
|
reader.onload = function(e) {
|
||||||
const img = document.getElementById(
|
imgPreview.src = e.target.result;
|
||||||
`foto_lingkungan_preview_${index}`
|
imgPreview.style.display = 'block';
|
||||||
);
|
|
||||||
img.src = e.target.result;
|
|
||||||
img.style.display = 'block';
|
|
||||||
};
|
};
|
||||||
reader.readAsDataURL(file);
|
reader.readAsDataURL(file);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
}
|
||||||
|
|
||||||
|
// Reset preview
|
||||||
|
imgPreview.src = '';
|
||||||
|
imgPreview.style.display = 'none';
|
||||||
|
|
||||||
|
const deleteBtn = newDiv.querySelector(`.${buttonDeleteClass}`);
|
||||||
|
if (deleteBtn) {
|
||||||
|
deleteBtn.addEventListener('click', function() {
|
||||||
|
inputContainer.removeChild(newDiv);
|
||||||
|
handleDeleteButtons();
|
||||||
|
updateLabels();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
newDiv.style.marginTop = '10px';
|
||||||
|
inputContainer.appendChild(newDiv);
|
||||||
updateLabels();
|
updateLabels();
|
||||||
handleDeleteButtons();
|
handleDeleteButtons();
|
||||||
}
|
}
|
||||||
|
|
||||||
setupInputHandlers('inputContainerRute', 'btnRute', 'Foto Rute Menuju Lokasi', 'file-input',
|
// Event listener untuk tombol tambah
|
||||||
'delete-btn');
|
addButton.addEventListener('click', createNewInput);
|
||||||
setupInputHandlers('inputContainerLantai', 'btnLantai', 'Foto Lantai', 'file-input', 'delete-btn');
|
|
||||||
setupInputHandlers('inputContainerLingkungan', 'btnLingkungan', 'Lingkungan', 'file-input',
|
// Inisialisasi preview untuk input yang sudah ada
|
||||||
'delete-btn');
|
const existingInputs = inputContainer.querySelectorAll(`.${inputDataClass}`);
|
||||||
|
existingInputs.forEach((input, index) => {
|
||||||
|
const previewContainer = input.closest('.flex').querySelector('.preview-container');
|
||||||
|
const imgPreview = previewContainer.querySelector('img');
|
||||||
|
|
||||||
|
input.addEventListener('change', function() {
|
||||||
|
const file = this.files[0];
|
||||||
|
if (file) {
|
||||||
|
const reader = new FileReader();
|
||||||
|
reader.onload = function(e) {
|
||||||
|
imgPreview.src = e.target.result;
|
||||||
|
imgPreview.style.display = 'block';
|
||||||
|
};
|
||||||
|
reader.readAsDataURL(file);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Tambahkan event listener untuk tombol hapus
|
||||||
|
document.querySelectorAll('.delete-btn').forEach(deleteBtn => {
|
||||||
|
deleteBtn.addEventListener('click', function() {
|
||||||
|
// Temukan container terdekat yang akan dihapus
|
||||||
|
const containerToRemove = this.closest('.flex');
|
||||||
|
const inputContainer = this.closest('#inputContainerRute');
|
||||||
|
|
||||||
|
if (inputContainer.querySelectorAll('.flex').length > 1) {
|
||||||
|
containerToRemove.remove();
|
||||||
|
|
||||||
|
// Update nomor label setelah penghapusan
|
||||||
|
updateLabels(inputContainer);
|
||||||
|
} else {
|
||||||
|
// Jika hanya satu input, reset input tersebut
|
||||||
|
resetInput(containerToRemove);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
updateLabels();
|
||||||
|
handleDeleteButtons();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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>
|
||||||
|
|||||||
Reference in New Issue
Block a user