Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
71 commits
Select commit Hold shift + click to select a range
bb3e36b
Cegah RCE via Theme Hook include_once dan Backtick Operator Bypass pa…
habibie11 Aug 31, 2026
37d69d6
perbaikan ecryptString
pandigresik Aug 31, 2026
cba89b4
sesuaikan validator tema
habibie11 Aug 31, 2026
4525060
perbaiki sesuai reviewer
habibie11 Sep 1, 2026
6026ed1
Perbaikan pagination unduhan
pandigresik Sep 2, 2026
831d05d
perbaikan prosedur
pandigresik Sep 4, 2026
16dc991
Perbaikan entri anggota suplemen
pandigresik Sep 7, 2026
0c9eee6
perbaikan path
pandigresik Sep 7, 2026
5f76ddb
Sesuaikan Pratinjau File PDF dan Gambar pada Menu Prosedur, Regulasi,…
habibie11 Sep 7, 2026
fc227e4
perbaikan download detail suplemen dan filter berdasarkan desa
pandigresik Sep 7, 2026
783bd0e
perbaikan test
pandigresik Sep 7, 2026
0374b19
Perbaikan Tampilan Thumbnail Galeri, Pratinjau Gambar Dinamis
habibie11 Sep 7, 2026
856a60f
perbaikan filter kesehatan
pandigresik Sep 7, 2026
9dedd96
perbaikan helper
pandigresik Sep 7, 2026
d196ebf
fix tombol sarana ui
habibie11 Sep 7, 2026
0cf0135
Fix: tampilan datatable overlapping
habibie11 Sep 7, 2026
17011a6
Perbaikan lembaga dan anggota untuk database gabungan
pandigresik Sep 8, 2026
301f286
perbaikan test
pandigresik Sep 8, 2026
04c16b4
perbaiki test
pandigresik Sep 8, 2026
22d97d5
perbaikan validasi nik pada database gabungan
pandigresik Sep 8, 2026
6f6849c
perbaikan typo
pandigresik Sep 8, 2026
9f5df47
perbaikan test
pandigresik Sep 8, 2026
b92583f
perbaikan kirim pesan
pandigresik Sep 8, 2026
93a6579
perbaikan pesan keluar
pandigresik Sep 8, 2026
4c5dbb5
Fix: Bug pada Modul Potensi (#1719)
pandigresik Sep 10, 2026
7bb421f
Fix: Peta Letak Geografis Kosong pada Mode Database Gabungan (Bounds …
pandigresik Sep 10, 2026
e9a0f0a
update package
habibie11 Sep 11, 2026
a5cadd6
Merge branch 'rilis-dev' into fix/pagination_dokumen
vickyrolanda Sep 14, 2026
5f1629a
[ci skip] memutahirkan catatan rilis
vickyrolanda Sep 14, 2026
68ec92f
Fix: Pagination DataTables pada Halaman Unduhan Tidak Berfungsi (#1722)
analisopendesa Sep 14, 2026
7b61d16
Merge branch 'rilis-dev' into fix/logviewer
vickyrolanda Sep 14, 2026
45a53c7
[ci skip] memutahirkan catatan rilis
vickyrolanda Sep 14, 2026
4bf3d64
Fix: Prevent object injection via unserialize on LogViewer encrypted …
analisopendesa Sep 14, 2026
b397751
Merge branch 'rilis-dev' into dev-57-keamanan-rce-theme
vickyrolanda Sep 14, 2026
91b8e0c
[ci skip] memutahirkan catatan rilis
vickyrolanda Sep 14, 2026
af8c966
Keamanan: Cegah RCE via Theme Hook include_once dan Backtick Operator…
analisopendesa Sep 14, 2026
597d86c
Merge branch 'rilis-dev' into fix/suplemen_gabungan
vickyrolanda Sep 14, 2026
6b8e35e
[ci skip] memutahirkan catatan rilis
vickyrolanda Sep 14, 2026
c644c3d
Perbaikan entri anggota suplemen (#1741)
analisopendesa Sep 14, 2026
284acc5
Merge branch 'rilis-dev' into fix/laporan_penduduk_download
vickyrolanda Sep 14, 2026
50b8936
[ci skip] memutahirkan catatan rilis
vickyrolanda Sep 14, 2026
ff12f63
Fix : Berkas download laporan penduduk tidak ditemukan saat Database …
analisopendesa Sep 14, 2026
a95afc3
Merge branch 'rilis-dev' into 1725-dev
vickyrolanda Sep 14, 2026
aa113cb
[ci skip] memutahirkan catatan rilis
vickyrolanda Sep 14, 2026
137a30f
Penyesuaian Pratinjau File PDF dan Gambar pada Menu Prosedur, Regulas…
analisopendesa Sep 14, 2026
ca454d4
Merge branch 'rilis-dev' into 1727-dev
vickyrolanda Sep 14, 2026
4946f50
[ci skip] memutahirkan catatan rilis
vickyrolanda Sep 14, 2026
363f1b9
Perbaikan Tampilan Thumbnail Galeri dan Pratinjau Gambar Dinamis (#1744)
analisopendesa Sep 14, 2026
efadd76
Merge branch 'rilis-dev' into fix/filter_kesehatan
vickyrolanda Sep 14, 2026
e11dfd3
[ci skip] memutahirkan catatan rilis
vickyrolanda Sep 14, 2026
cc3a74c
perbaikan filter kesehatan (#1745)
analisopendesa Sep 14, 2026
30a3c21
Merge branch 'rilis-dev' into tombol-aksi-sarana
vickyrolanda Sep 14, 2026
f7e8b46
[ci skip] memutahirkan catatan rilis
vickyrolanda Sep 14, 2026
bb6d2b8
fix tombol sarana ui (#1746)
analisopendesa Sep 14, 2026
7432d74
Merge branch 'rilis-dev' into fix-overlapping-table
vickyrolanda Sep 14, 2026
7352db2
[ci skip] memutahirkan catatan rilis
vickyrolanda Sep 14, 2026
f5b785f
Tampilan DataTable Pengurus dan Arsip Pengurus (#1747)
analisopendesa Sep 14, 2026
a0b1ddd
Merge branch 'rilis-dev' into fix/ketua_lembaga_gabungan
vickyrolanda Sep 14, 2026
9755579
[ci skip] memutahirkan catatan rilis
vickyrolanda Sep 14, 2026
dd42a41
Fix: Tambah/edit ketua lembaga dan anggota saat menggunakan database …
analisopendesa Sep 14, 2026
5ed623c
Merge branch 'rilis-dev' into fix/komplain_database_gabungan
vickyrolanda Sep 14, 2026
8bc4eba
[ci skip] memutahirkan catatan rilis
vickyrolanda Sep 14, 2026
1f8fce0
Fix Penyesuaian Validasi NIK pada Pengiriman Keluhan untuk Database G…
analisopendesa Sep 14, 2026
d700b28
Merge branch 'rilis-dev' into fix/pesan
vickyrolanda Sep 14, 2026
f0f4953
[ci skip] memutahirkan catatan rilis
vickyrolanda Sep 14, 2026
55dd1cc
Fix Kirim Pesan Error 500 (#1750)
analisopendesa Sep 14, 2026
bfa7727
Merge branch 'rilis-dev' into audit-1759
vickyrolanda Sep 14, 2026
a83b3ac
[ci skip] memutahirkan catatan rilis
vickyrolanda Sep 14, 2026
cde4188
Security update package (#1760)
analisopendesa Sep 14, 2026
3b3a82c
Rilis v2609.0.1
habibie11 Sep 22, 2026
8abf0d2
Blade Prettier Code
habibie11 Sep 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
55 changes: 55 additions & 0 deletions app/Events/ProsedurChanged.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
<?php

/*
* File ini bagian dari:
*
* OpenDK
*
* Aplikasi dan source code ini dirilis berdasarkan lisensi GPL V3
*
* Hak Cipta 2017 - 2025 Perkumpulan Desa Digital Terbuka (https://opendesa.id)
*
* Dengan ini diberikan izin, secara gratis, kepada siapa pun yang mendapatkan salinan
* dari perangkat lunak ini dan file dokumentasi terkait ("Aplikasi Ini"), untuk diperlakukan
* tanpa batasan, termasuk hak untuk menggunakan, menyalin, mengubah dan/atau mendistribusikan,
* asal tunduk pada syarat berikut:
*
* Pemberitahuan hak cipta di atas dan pemberitahuan izin ini harus disertakan dalam
* setiap salinan atau bagian penting Aplikasi Ini. Barang siapa yang menghapus atau menghilangkan
* pemberitahuan ini melanggar ketentuan lisensi Aplikasi Ini.
*
* PERANGKAT LUNAK INI DISEDIAKAN "SEBAGAIMANA ADANYA", TANPA JAMINAN APA PUN, BAIK TERSURAT MAUPUN
* TERSIRAT. PENULIS ATAU PEMEGANG HAK CIPTA SAMA SEKALI TIDAK BERTANGGUNG JAWAB ATAS KLAIM, KERUSAKAN ATAU
* KEWAJIBAN APAPUN ATAS PENGGUNAAN ATAU LAINNYA TERKAIT APLIKASI INI.
*
* @package OpenDK
* @author Tim Pengembang OpenDesa
* @copyright Hak Cipta 2017 - 2025 Perkumpulan Desa Digital Terbuka (https://opendesa.id)
* @license http://www.gnu.org/licenses/gpl.html GPL V3
* @link https://github.com/OpenSID/opendk
*/

namespace App\Events;

use App\Models\Prosedur;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

class ProsedurChanged
{
use Dispatchable;
use SerializesModels;

public Prosedur $prosedur;

/**
* Create a new event instance.
*
* @param Prosedur $prosedur
* @return void
*/
public function __construct(Prosedur $prosedur)
{
$this->prosedur = $prosedur;
}
}
2 changes: 1 addition & 1 deletion app/Exports/ExportAKIAKB.php
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ public function map($akiAkb): array

return [
$akiAkb->id,
$akiAkb->desa->nama ?? 'Tidak Diketahui',
nama_desa($akiAkb->desa_id) ?? 'Tidak Diketahui',
$akiAkb->desa_id,
$akiAkb->aki,
$akiAkb->akb,
Expand Down
2 changes: 1 addition & 1 deletion app/Exports/ExportEpidemiPenyakit.php
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ public function map($epidemiPenyakit): array
{
return [
$epidemiPenyakit->id,
$epidemiPenyakit->desa->nama ?? '',
nama_desa($epidemiPenyakit->desa_id) ?? '',
$epidemiPenyakit->penyakit->nama ?? '',
$epidemiPenyakit->jumlah_penderita,
months_list()[$epidemiPenyakit->bulan] ?? $epidemiPenyakit->bulan,
Expand Down
2 changes: 1 addition & 1 deletion app/Exports/ExportFasilitasPaud.php
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ public function map($fasilitasPaud): array
{
return [
$fasilitasPaud->id,
$fasilitasPaud->desa->nama ?? '',
nama_desa($fasilitasPaud->desa_id) ?? '',
$fasilitasPaud->jumlah_paud,
$fasilitasPaud->jumlah_guru_paud,
$fasilitasPaud->jumlah_siswa_paud,
Expand Down
2 changes: 1 addition & 1 deletion app/Exports/ExportImunisasi.php
Original file line number Diff line number Diff line change
Expand Up @@ -82,7 +82,7 @@ public function map($imunisasi): array

return [
$imunisasi->id,
$imunisasi->desa->nama ?? 'Tidak Diketahui',
nama_desa($imunisasi->desa_id) ?? 'Tidak Diketahui',
$imunisasi->desa_id,
$imunisasi->cakupan_imunisasi, // Format dengan persen
$bulanList[$imunisasi->bulan] ?? 'Tidak Diketahui',
Expand Down
2 changes: 1 addition & 1 deletion app/Exports/ExportPutusSekolah.php
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ public function map($putusSekolah): array
{
return [
$putusSekolah->id,
$putusSekolah->desa->nama ?? '',
nama_desa($putusSekolah->desa_id) ?? '',
$putusSekolah->siswa_paud,
$putusSekolah->anak_usia_paud,
$putusSekolah->siswa_sd,
Expand Down
9 changes: 1 addition & 8 deletions app/Exports/ExportSuplemenTerdata.php
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
class ExportSuplemenTerdata implements FromCollection, WithHeadings, WithMapping, WithStyles
{
protected $suplemenId;

protected $filters;

public function __construct($suplemenId = null, array $filters = [])
Expand Down Expand Up @@ -77,9 +78,6 @@ public function collection()
return $query->get();
}

/**
* @return array
*/
public function headings(): array
{
return [
Expand All @@ -99,10 +97,6 @@ public function headings(): array
];
}

/**
* @param mixed $suplemenTerdata
* @return array
*/
public function map($suplemenTerdata): array
{
$penduduk = $suplemenTerdata->penduduk;
Expand All @@ -126,7 +120,6 @@ public function map($suplemenTerdata): array
}

/**
* @param Worksheet $sheet
* @return array
*/
public function styles(Worksheet $sheet)
Expand Down
128 changes: 128 additions & 0 deletions app/Exports/ExportSuplemenTerdataGabungan.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
<?php

/*
* File ini bagian dari:
*
* OpenDK
*
* Aplikasi dan source code ini dirilis berdasarkan lisensi GPL V3
*
* Hak Cipta 2017 - 2026 Perkumpulan Desa Digital Terbuka (https://opendesa.id)
*
* Dengan ini diberikan izin, secara gratis, kepada siapa pun yang mendapatkan salinan
* dari perangkat lunak ini dan file dokumentasi terkait ("Aplikasi Ini"), untuk diperlakukan
* tanpa batasan, termasuk hak untuk menggunakan, menyalin, mengubah dan/atau mendistribusikan,
* asal tunduk pada syarat berikut:
*
* Pemberitahuan hak cipta di atas dan pemberitahuan izin ini harus disertakan dalam
* setiap salinan atau bagian penting Aplikasi Ini. Barang siapa yang menghapus atau menghilangkan
* pemberitahuan ini melanggar ketentuan lisensi Aplikasi Ini.
*
* PERANGKAT LUNAK INI DISEDIAKAN "SEBAGAIMANA ADANYA", TANPA JAMINAN APA PUN, BAIK TERSURAT MAUPUN
* TERSIRAT. PENULIS ATAU PEMEGANG HAK CIPTA SAMA SEKALI TIDAK BERTANGGUNG JAWAB ATAS KLAIM, KERUSAKAN ATAU
* KEWAJIBAN APAPUN ATAS PENGGUNAAN ATAU LAINNYA TERKAIT APLIKASI INI.
*
* @package OpenDK
* @author Tim Pengembang OpenDesa
* @copyright Hak Cipta 2017 - 2026 Perkumpulan Desa Digital Terbuka (https://opendesa.id)
* @license http://www.gnu.org/licenses/gpl.html GPL V3
* @link https://github.com/OpenSID/opendk
*/

namespace App\Exports;

use App\Models\DataDesa;
use App\Models\Penduduk;
use App\Models\SuplemenTerdata;
use App\Services\PendudukService;
use Illuminate\Support\Collection;

class ExportSuplemenTerdataGabungan extends ExportSuplemenTerdata
{
/**
* @param array<int, int|string> $pendudukGabunganIds
*/
public function __construct($suplemenId = null, array $filters = [], array $pendudukGabunganIds = [])
{
parent::__construct($suplemenId, $filters);
$this->pendudukGabunganIds = array_map('intval', $pendudukGabunganIds);
}

public function collection(): Collection
{
$collection = parent::collection();

if ($collection->isEmpty() || empty($this->pendudukGabunganIds)) {
return $collection;
}

$missingIds = $this->pendudukGabunganIds;

foreach ($collection as $row) {
if ($row->penduduk_id_gabungan) {
$key = (int) $row->penduduk_id_gabungan;

if (isset($missingIds[$key])) {
unset($missingIds[$key]);
}
}
}

if (empty($missingIds)) {
return $collection;
}

$resolved = (new PendudukService())->pendudukGabunganByIds(array_values($missingIds));

if ($resolved->isEmpty()) {
return $collection;
}

$resolvedMap = [];
foreach ($resolved as $item) {
if (! is_array($item)) {
continue;
}

$penduduk = $this->mapGabunganPenduduk($item);
$resolvedMap[(int) ($item['id'] ?? 0)] = $penduduk;
}

return $collection->map(function (SuplemenTerdata $row) use ($resolvedMap) {
if ($row->penduduk_id_gabungan && ! $row->penduduk) {
$penduduk = $resolvedMap[(int) $row->penduduk_id_gabungan] ?? null;

if ($penduduk) {
$row->setRelation('penduduk', $penduduk);
}
}

return $row;
});
}

private function mapGabunganPenduduk(array $item): Penduduk
{
$attributes = $item['attributes'] ?? [];

$penduduk = new Penduduk();
$penduduk->forceFill([
'id' => $item['id'] ?? null,
'no_kk' => data_get($attributes, 'keluarga.no_kk') ?? $attributes['no_kk'] ?? null,
'nik' => $attributes['nik'] ?? null,
'nama' => $attributes['nama'] ?? null,
'tempat_lahir' => $attributes['tempatlahir'] ?? $attributes['tempat_lahir'] ?? null,
'tanggal_lahir' => $attributes['tanggallahir'] ?? $attributes['tanggal_lahir'] ?? null,
'umur' => $attributes['umur'] ?? null,
'sex' => $attributes['sex'] ?? null,
'alamat' => $attributes['alamat_sekarang'] ?? $attributes['alamat'] ?? null,
]);

$penduduk->setRelation('desa', new DataDesa([
'nama' => data_get($attributes, 'config.nama_desa') ?? $attributes['nama_desa'] ?? null,
'desa_id' => data_get($attributes, 'config.kode_desa') ?? $attributes['kode_desa'] ?? null,
]));

return $penduduk;
}
}
2 changes: 1 addition & 1 deletion app/Exports/ExportTingkatPendidikan.php
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ public function map($tingkatPendidikan): array
{
return [
$tingkatPendidikan->id,
$tingkatPendidikan->desa->nama ?? '',
nama_desa($tingkatPendidikan->desa_id) ?? '',
$tingkatPendidikan->tidak_tamat_sekolah,
$tingkatPendidikan->tamat_sd,
$tingkatPendidikan->tamat_smp,
Expand Down
2 changes: 1 addition & 1 deletion app/Exports/ExportToiletSanitasi.php
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ public function map($toiletSanitasi): array

return [
$toiletSanitasi->id,
$toiletSanitasi->desa->nama ?? 'Tidak Diketahui',
nama_desa($toiletSanitasi->desa_id) ?? 'Tidak Diketahui',
$toiletSanitasi->desa_id,
$toiletSanitasi->toilet,
$toiletSanitasi->sanitasi,
Expand Down
7 changes: 6 additions & 1 deletion app/Http/Controllers/Data/AKIAKBController.php
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
use App\Exports\ExportAKIAKB;
use App\Http\Controllers\Controller;
use App\Http\Requests\ImportAKIAKBRequest;
use App\Http\Requests\UpdateAKIAKBRequest;
use App\Imports\ImporAKIAKB;
use App\Models\AkiAkb;
use App\Services\DesaService;
Expand Down Expand Up @@ -65,8 +66,12 @@ public function index()
*/
public function getDataAKIAKB()
{
$desa = request()->input('desa');
$listDesa = (new DesaService)->listDesa()->pluck('nama', 'desa_id');
return DataTables::of(AkiAkb::with(['desa'])->get())
return DataTables::of(AkiAkb::when($desa && $desa !== 'Semua', function ($query) use ($desa) {
return $query->where('desa_id', $desa);
})
->with(['desa'])->get())
->addColumn('aksi', function ($row) {
$data['edit_url'] = auth()->user()->can('access.data.aki_akb.edit') ? route('data.aki-akb.edit', $row->id) : null;
$data['delete_url'] = auth()->user()->can('access.data.aki_akb.delete') ? route('data.aki-akb.destroy', $row->id) : null;
Expand Down
24 changes: 12 additions & 12 deletions app/Http/Controllers/Data/FasilitasPaudController.php
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,10 @@
use App\Exports\ExportFasilitasPaud;
use App\Http\Controllers\Controller;
use App\Http\Requests\ImportFasilitasPaudRequest;
use App\Http\Requests\UpdateFasilitasPaudRequest;
use App\Imports\ImporFasilitasPaud;
use App\Models\FasilitasPAUD;
use App\Services\DesaService;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\Log;
Expand All @@ -59,12 +61,18 @@ public function index()
*/
public function getDataFasilitasPAUD()
{
return DataTables::of(FasilitasPAUD::with(['desa'])->get())
$desa = request()->input('desa');
$listDesa = (new DesaService)->listDesa()->pluck('nama', 'desa_id');
return DataTables::of(FasilitasPAUD::when($desa && $desa !== 'Semua', function ($query) use ($desa) {
return $query->where('desa_id', $desa);
})->with(['desa'])->get())
->addColumn('aksi', function ($row) {
$data['edit_url'] = auth()->user()->can('access.data.fasilitas_paud.edit') ? route('data.fasilitas-paud.edit', $row->id) : null;
$data['delete_url'] = auth()->user()->can('access.data.fasilitas_paud.delete') ? route('data.fasilitas-paud.destroy', $row->id) : null;

return view('forms.aksi', $data);
})->addColumn('nama_desa', function ($row) use ($listDesa) {
return $row->desa->nama ?? $listDesa[$row->desa_id] ?? '-';
})
->rawColumns(['aksi'])->make();
}
Expand Down Expand Up @@ -116,7 +124,7 @@ public function edit($id)
{
$fasilitas = FasilitasPAUD::with(['desa'])->findOrFail($id);
$page_title = 'Fasilitas PAUD';
$page_description = 'Ubah Fasilitas PAUD : Desa ' . $fasilitas->desa->nama;
$page_description = 'Ubah Fasilitas PAUD : Desa ' . nama_desa($fasilitas->desa_id);

return view('data.fasilitas_paud.edit', compact('page_title', 'page_description', 'fasilitas'));
}
Expand All @@ -127,18 +135,10 @@ public function edit($id)
* @param int $id
* @return Response
*/
public function update(Request $request, $id)
public function update(UpdateFasilitasPaudRequest $request, $id)
{
request()->validate([
'jumlaah_paud' => 'required',
'jumlah_guru_paud' => 'required',
'jumlah_siswa_paud' => 'required',
'semester' => 'required',
'tahun' => 'required',
]);

try {
FasilitasPAUD::findOrFail($id)->update($request->all());
FasilitasPAUD::findOrFail($id)->update($request->validated());
} catch (\Exception $e) {
Log::error('Fasilitas PAUD update failed', [
'error' => $e->getMessage(),
Expand Down
6 changes: 5 additions & 1 deletion app/Http/Controllers/Data/ImunisasiController.php
Original file line number Diff line number Diff line change
Expand Up @@ -65,8 +65,12 @@ public function index()
*/
public function getDataAKIAKB()
{
$desa = request()->input('desa');
$listDesa = (new DesaService)->listDesa()->pluck('nama', 'desa_id');
return DataTables::of(Imunisasi::with(['desa'])->get())
return DataTables::of(Imunisasi::when($desa && $desa !== 'Semua', function ($query) use ($desa) {
return $query->where('desa_id', $desa);
})
->with(['desa'])->get())
->addColumn('aksi', function ($row) {
$data['edit_url'] = auth()->user()->can('access.data.imunisasi.edit') ? route('data.imunisasi.edit', $row->id) : null;
$data['delete_url'] = auth()->user()->can('access.data.imunisasi.delete') ? route('data.imunisasi.destroy', $row->id) : null;
Expand Down
Loading