diff --git a/resources/views/informasi/sinergi_program/create.blade.php b/resources/views/informasi/sinergi_program/create.blade.php
index 9d38c6886..87536f3ff 100644
--- a/resources/views/informasi/sinergi_program/create.blade.php
+++ b/resources/views/informasi/sinergi_program/create.blade.php
@@ -19,7 +19,7 @@
{!! html()->form('POST', route('informasi.sinergi-program.store'))->acceptsFiles()->id('form-sinergi-program')->class(
'form-horizontal
- form-label-left',
+ form-label-left',
)->open() !!}
diff --git a/resources/views/informasi/sinergi_program/edit.blade.php b/resources/views/informasi/sinergi_program/edit.blade.php
index 13b94aa68..60dfcb312 100644
--- a/resources/views/informasi/sinergi_program/edit.blade.php
+++ b/resources/views/informasi/sinergi_program/edit.blade.php
@@ -32,7 +32,7 @@
{!! html()->form('PUT', route('informasi.sinergi-program.update', $sinergi->id))->id('form-sinergi-program')->class(
'form-horizontal
- form-label-left',
+ form-label-left',
)->acceptsFiles()->open() !!}
diff --git a/resources/views/pesan/masuk/index.blade.php b/resources/views/pesan/masuk/index.blade.php
index 86e144b3f..f60937624 100644
--- a/resources/views/pesan/masuk/index.blade.php
+++ b/resources/views/pesan/masuk/index.blade.php
@@ -46,7 +46,7 @@
{!! html()->form('POST', route('pesan.arsip.multiple'))->class(
'form-group
- inline',
+ inline',
)->id('form-multiple-arsip-pesan')->open() !!}
{!! html()->hidden('array_id')->id('array_multiple_id_arsip') !!}
@@ -54,7 +54,7 @@
{!! html()->form('POST', route('pesan.read.multiple'))->class(
'form-group
- inline',
+ inline',
)->id('form-multiple-read-pesan')->open() !!}
{!! html()->hidden('array_id')->id('array_multiple_id') !!}
diff --git a/resources/views/pesan/read_pesan.blade.php b/resources/views/pesan/read_pesan.blade.php
index 840e2f9f8..50210f2ed 100644
--- a/resources/views/pesan/read_pesan.blade.php
+++ b/resources/views/pesan/read_pesan.blade.php
@@ -28,7 +28,7 @@
@if ($pesan->diarsipkan === 0)
{!! html()->form('POST', route('pesan.arsip.post'))->class(
'form-group
- inline',
+ inline',
)->id('form-arisp-pesan')->open() !!}
{!! html()->hidden('id', $pesan->id) !!}
@@ -77,11 +77,11 @@
diff --git a/resources/views/role/index.blade.php b/resources/views/role/index.blade.php
index ec1cf7f1b..c5c4b8ab4 100644
--- a/resources/views/role/index.blade.php
+++ b/resources/views/role/index.blade.php
@@ -47,7 +47,10 @@
var data = $('#user-table').DataTable({
processing: true,
serverSide: true,
- ajax: "{!! route('setting.role.getdata') !!}",
+ ajax: {
+ url: "{!! route('setting.role.getdata') !!}",
+ type: "POST"
+ },
columns: [{
data: 'name',
name: 'name'
diff --git a/resources/views/setting/aplikasi/form.blade.php b/resources/views/setting/aplikasi/form.blade.php
index 169cc7aa9..96bffb7bb 100644
--- a/resources/views/setting/aplikasi/form.blade.php
+++ b/resources/views/setting/aplikasi/form.blade.php
@@ -28,7 +28,7 @@
{!! html()->select('value', [
'OpenStreetMap' => 'OpenStreetMap',
'OpenStreetMap H.O.T.' => 'OpenStreetMap
- H.O.T.',
+ H.O.T.',
'Mapbox Streets' => 'Mapbox Streets',
'Mapbox Satellite' => 'Mapbox Satellite',
'Mapbox Satellite-Streets' => 'Mapbox Satellite-Streets',
diff --git a/resources/views/setting/pengaturan_database/table-backup.blade.php b/resources/views/setting/pengaturan_database/table-backup.blade.php
index 6404b0ae0..31e923102 100644
--- a/resources/views/setting/pengaturan_database/table-backup.blade.php
+++ b/resources/views/setting/pengaturan_database/table-backup.blade.php
@@ -34,7 +34,10 @@
var data = $('#data-backup-database').DataTable({
processing: true,
serverSide: true,
- ajax: "{!! route('setting.pengaturan-database.getdata') !!}",
+ ajax: {
+ url: "{!! route('setting.pengaturan-database.getdata') !!}",
+ type: "POST"
+ },
columns: [{
data: 'DT_RowIndex',
class: 'padat',
diff --git a/resources/views/setting/slide/form.blade.php b/resources/views/setting/slide/form.blade.php
index 51e89ca4d..585e43f14 100644
--- a/resources/views/setting/slide/form.blade.php
+++ b/resources/views/setting/slide/form.blade.php
@@ -9,7 +9,7 @@
{!! html()->textarea('deskripsi')->class('textarea')->style(
'width: 100%; height: 200px; font-size: 14px;
- line-height: 18px; border: 1px solid #dddddd; padding: 10px;',
+ line-height: 18px; border: 1px solid #dddddd; padding: 10px;',
)->placeholder('deskripsi')->value(old('deskripsi', isset($slide) ? $slide->deskripsi : '')) !!}
diff --git a/resources/views/setting/tipe_regulasi/index.blade.php b/resources/views/setting/tipe_regulasi/index.blade.php
index ec50b2c74..e65706f65 100644
--- a/resources/views/setting/tipe_regulasi/index.blade.php
+++ b/resources/views/setting/tipe_regulasi/index.blade.php
@@ -45,7 +45,10 @@
var data = $('#data-tipe-regulasi').DataTable({
processing: true,
serverSide: true,
- ajax: "{!! route('setting.tipe-regulasi.getdata') !!}",
+ ajax: {
+ url: "{!! route('setting.tipe-regulasi.getdata') !!}",
+ type: "POST"
+ },
columns: [{
data: 'aksi',
name: 'aksi',
diff --git a/resources/views/user/index.blade.php b/resources/views/user/index.blade.php
index bf6499921..27cbee4b1 100644
--- a/resources/views/user/index.blade.php
+++ b/resources/views/user/index.blade.php
@@ -45,7 +45,10 @@
var data = $('#user-table').DataTable({
processing: true,
serverSide: true,
- ajax: "{!! route('setting.user.getdata') !!}",
+ ajax: {
+ url: "{!! route('setting.user.getdata') !!}",
+ type: "POST"
+ },
columns: [{
data: 'aksi',
name: 'aksi',
diff --git a/routes/web.php b/routes/web.php
index f16e6e8cb..d0b99a5a1 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -863,7 +863,7 @@
// User Management
Route::group(['prefix' => 'user', 'controller' => UserController::class, 'middleware' => ['action_permission:access.setting.user']], function () {
Route::get('/', 'index')->name('setting.user.index');
- Route::get('getdata', 'getDataUser')->name('setting.user.getdata');
+ Route::match(['GET', 'POST'], 'getdata', 'getDataUser')->name('setting.user.getdata');
Route::get('create', 'create')->name('setting.user.create');
Route::post('store', 'store')->name('setting.user.store');
Route::put('updatePassword/{id}', 'updatePassword')->name('setting.user.updatePassword');
@@ -886,7 +886,7 @@
// Role Management
Route::group(['prefix' => 'role', 'controller' => RoleController::class, 'middleware' => ['action_permission:access.setting.role']], function () {
Route::get('/', 'index')->name('setting.role.index');
- Route::get('getdata', 'getData')->name('setting.role.getdata');
+ Route::match(['GET', 'POST'], 'getdata', 'getData')->name('setting.role.getdata');
Route::get('create', 'create')->name('setting.role.create');
Route::post('store', 'store')->name('setting.role.store');
Route::get('edit/{id}', 'edit')->name('setting.role.edit');
@@ -909,7 +909,7 @@
// Tipe Regulasi
Route::group(['prefix' => 'tipe-regulasi', 'controller' => TipeRegulasiController::class, 'middleware' => ['action_permission:access.setting.tipe_regulasi']], function () {
Route::get('/', 'index')->name('setting.tipe-regulasi.index');
- Route::get('getdata', 'getData')->name('setting.tipe-regulasi.getdata');
+ Route::match(['GET', 'POST'], 'getdata', 'getData')->name('setting.tipe-regulasi.getdata');
Route::post('store', 'store')->name('setting.tipe-regulasi.store');
Route::get('edit/{id}', 'edit')->name('setting.tipe-regulasi.edit');
Route::put('update/{id}', 'update')->name('setting.tipe-regulasi.update');
@@ -1007,7 +1007,7 @@
// Pengaturan Database (Backup)
Route::group(['prefix' => 'backup-database', 'controller' => PengaturanDatabaseController::class, 'middleware' => ['action_permission:access.setting.database']], function () {
Route::get('/', 'index')->name('setting.pengaturan-database.backup');
- Route::get('/getdata', 'getDataBackup')->name('setting.pengaturan-database.getdata');
+ Route::match(['GET', 'POST'], '/getdata', 'getDataBackup')->name('setting.pengaturan-database.getdata');
Route::post('/backup-running', 'createBackup')->name('setting.pengaturan-database.runbackup');
Route::get('/backup-download/{file}', 'downloadBackup')->name('setting.pengaturan-database.download');
Route::get('/backup-delete/{file}', 'deleteBackup')->name('setting.pengaturan-database.delete');
diff --git a/tests/Feature/Settings/SettingDataTablesPostTest.php b/tests/Feature/Settings/SettingDataTablesPostTest.php
new file mode 100644
index 000000000..bbd7884f5
--- /dev/null
+++ b/tests/Feature/Settings/SettingDataTablesPostTest.php
@@ -0,0 +1,276 @@
+ 'XMLHttpRequest'];
+
+function settingDatatablePostPayload(array $extra = []): array
+{
+ return array_merge([
+ 'draw' => 1,
+ 'start' => 0,
+ 'length' => 10,
+ 'search' => ['value' => '', 'regex' => 'false'],
+ 'columns[0][data]' => 'aksi',
+ 'columns[0][name]' => 'aksi',
+ 'columns[0][searchable]' => 'false',
+ 'columns[0][orderable]' => 'false',
+ 'columns[0][search][value]' => '',
+ 'order[0][column]' => '1',
+ 'order[0][dir]' => 'asc',
+ ], $extra);
+}
+
+beforeEach(function () {
+ $this->withoutMiddleware([
+ Authenticate::class,
+ RoleMiddleware::class,
+ PermissionMiddleware::class,
+ CompleteProfile::class,
+ GlobalShareMiddleware::class,
+ ]);
+});
+
+// =============================================================================
+// 1. TIPE REGULASI
+// =============================================================================
+describe('DataTables Tipe Regulasi via POST', function () {
+
+ test('endpoint getdata menerima POST dan mengembalikan struktur DataTables', function () {
+ TipeRegulasi::create(['nama' => 'Peraturan Desa Test']);
+
+ $response = $this->postJson(
+ route('setting.tipe-regulasi.getdata'),
+ settingDatatablePostPayload(),
+ SETTING_AJAX_HEADERS
+ );
+
+ $response->assertStatus(200);
+ $response->assertJsonStructure([
+ 'draw',
+ 'recordsTotal',
+ 'recordsFiltered',
+ 'data',
+ ]);
+ });
+
+ test('POST ke getdata mengembalikan kolom yang diharapkan', function () {
+ TipeRegulasi::create(['nama' => 'Peraturan Desa Kolom Test']);
+
+ $response = $this->postJson(
+ route('setting.tipe-regulasi.getdata'),
+ settingDatatablePostPayload(),
+ SETTING_AJAX_HEADERS
+ );
+
+ $response->assertStatus(200);
+ $data = $response->json('data');
+ $this->assertNotEmpty($data);
+
+ $firstRow = $data[0];
+ $this->assertArrayHasKey('nama', $firstRow);
+ $this->assertArrayHasKey('aksi', $firstRow);
+ });
+
+ test('GET pada getdata masih berfungsi (backward-compatible)', function () {
+ $response = $this->getJson(
+ route('setting.tipe-regulasi.getdata'),
+ SETTING_AJAX_HEADERS
+ );
+
+ $response->assertStatus(200);
+ $response->assertJsonStructure(['draw', 'recordsTotal', 'recordsFiltered', 'data']);
+ });
+});
+
+// =============================================================================
+// 2. GRUP PENGGUNA (ROLE)
+// =============================================================================
+describe('DataTables Grup Pengguna via POST', function () {
+
+ test('endpoint getdata menerima POST dan mengembalikan struktur DataTables', function () {
+ Role::create(['name' => 'Test Role', 'guard_name' => 'web']);
+
+ $response = $this->postJson(
+ route('setting.role.getdata'),
+ settingDatatablePostPayload(),
+ SETTING_AJAX_HEADERS
+ );
+
+ $response->assertStatus(200);
+ $response->assertJsonStructure([
+ 'draw',
+ 'recordsTotal',
+ 'recordsFiltered',
+ 'data',
+ ]);
+ });
+
+ test('POST ke getdata mengembalikan kolom name dan users_count', function () {
+ $role = Role::create(['name' => 'Role Kolom Test', 'guard_name' => 'web']);
+
+ $response = $this->postJson(
+ route('setting.role.getdata'),
+ settingDatatablePostPayload(),
+ SETTING_AJAX_HEADERS
+ );
+
+ $response->assertStatus(200);
+ $data = $response->json('data');
+ $this->assertNotEmpty($data);
+
+ $firstRow = $data[0];
+ $this->assertArrayHasKey('name', $firstRow);
+ $this->assertArrayHasKey('users_count', $firstRow);
+ $this->assertArrayHasKey('aksi', $firstRow);
+ });
+
+ test('GET pada getdata masih berfungsi (backward-compatible)', function () {
+ $response = $this->getJson(
+ route('setting.role.getdata'),
+ SETTING_AJAX_HEADERS
+ );
+
+ $response->assertStatus(200);
+ $response->assertJsonStructure(['draw', 'recordsTotal', 'recordsFiltered', 'data']);
+ });
+});
+
+// =============================================================================
+// 3. PENGGUNA (USER)
+// =============================================================================
+describe('DataTables Pengguna via POST', function () {
+
+ test('endpoint getdata menerima POST dan mengembalikan struktur DataTables', function () {
+ User::factory()->create(['name' => 'Test User POST']);
+
+ $response = $this->postJson(
+ route('setting.user.getdata'),
+ settingDatatablePostPayload(),
+ SETTING_AJAX_HEADERS
+ );
+
+ $response->assertStatus(200);
+ $response->assertJsonStructure([
+ 'draw',
+ 'recordsTotal',
+ 'recordsFiltered',
+ 'data',
+ ]);
+ });
+
+ test('POST ke getdata mengembalikan kolom yang diharapkan', function () {
+ User::factory()->create([
+ 'name' => 'User Kolom Test',
+ 'email' => 'kolom@test.com',
+ ]);
+
+ $response = $this->postJson(
+ route('setting.user.getdata'),
+ settingDatatablePostPayload(),
+ SETTING_AJAX_HEADERS
+ );
+
+ $response->assertStatus(200);
+ $data = $response->json('data');
+ $this->assertNotEmpty($data);
+
+ $firstRow = $data[0];
+ $this->assertArrayHasKey('name', $firstRow);
+ $this->assertArrayHasKey('email', $firstRow);
+ $this->assertArrayHasKey('status', $firstRow);
+ $this->assertArrayHasKey('aksi', $firstRow);
+ });
+
+ test('GET pada getdata masih berfungsi (backward-compatible)', function () {
+ $response = $this->getJson(
+ route('setting.user.getdata'),
+ SETTING_AJAX_HEADERS
+ );
+
+ $response->assertStatus(200);
+ $response->assertJsonStructure(['draw', 'recordsTotal', 'recordsFiltered', 'data']);
+ });
+});
+
+// =============================================================================
+// 4. PENGATURAN DATABASE
+// =============================================================================
+describe('DataTables Pengaturan Database via POST', function () {
+
+ test('endpoint getdata menerima POST dan mengembalikan struktur DataTables', function () {
+ $response = $this->postJson(
+ route('setting.pengaturan-database.getdata'),
+ settingDatatablePostPayload(),
+ SETTING_AJAX_HEADERS
+ );
+
+ $response->assertStatus(200);
+ $response->assertJsonStructure([
+ 'draw',
+ 'recordsTotal',
+ 'recordsFiltered',
+ 'data',
+ ]);
+ });
+
+ test('GET pada getdata masih berfungsi (backward-compatible)', function () {
+ $response = $this->getJson(
+ route('setting.pengaturan-database.getdata'),
+ SETTING_AJAX_HEADERS
+ );
+
+ $response->assertStatus(200);
+ $response->assertJsonStructure(['draw', 'recordsTotal', 'recordsFiltered', 'data']);
+ });
+});