Skip to content

Commit b1c5fa8

Browse files
authored
Merge pull request #3018 from Arkhas/prevent_edit_columns_when_columns_not_shown
feat: Prevent editColumn when column is not shown
2 parents cb61786 + e9a2697 commit b1c5fa8

File tree

2 files changed

+104
-60
lines changed

2 files changed

+104
-60
lines changed

src/DataTableAbstract.php

Lines changed: 33 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -52,13 +52,13 @@ abstract class DataTableAbstract implements DataTable
5252
* @var array
5353
*/
5454
protected array $columnDef = [
55-
'index' => false,
56-
'append' => [],
57-
'edit' => [],
58-
'filter' => [],
59-
'order' => [],
60-
'only' => null,
61-
'hidden' => [],
55+
'index' => false,
56+
'append' => [],
57+
'edit' => [],
58+
'filter' => [],
59+
'order' => [],
60+
'only' => null,
61+
'hidden' => [],
6262
'visible' => [],
6363
];
6464

@@ -103,10 +103,10 @@ abstract class DataTableAbstract implements DataTable
103103
* @var array
104104
*/
105105
protected array $templates = [
106-
'DT_RowId' => '',
106+
'DT_RowId' => '',
107107
'DT_RowClass' => '',
108-
'DT_RowData' => [],
109-
'DT_RowAttr' => [],
108+
'DT_RowData' => [],
109+
'DT_RowAttr' => [],
110110
];
111111

112112
/**
@@ -147,6 +147,8 @@ abstract class DataTableAbstract implements DataTable
147147

148148
protected mixed $transformer;
149149

150+
protected bool $editOnlySelectedColumns = false;
151+
150152
/**
151153
* Can the DataTable engine be created with these parameters.
152154
*
@@ -231,7 +233,13 @@ public function addIndexColumn(): static
231233
*/
232234
public function editColumn($name, $content): static
233235
{
234-
$this->columnDef['edit'][] = ['name' => $name, 'content' => $content];
236+
if ($this->editOnlySelectedColumns) {
237+
if (! count($this->request->columns()) || in_array($name, Arr::pluck($this->request->columns(), 'name'))) {
238+
$this->columnDef['edit'][] = ['name' => $name, 'content' => $content];
239+
}
240+
} else {
241+
$this->columnDef['edit'][] = ['name' => $name, 'content' => $content];
242+
}
235243

236244
return $this;
237245
}
@@ -867,10 +875,10 @@ protected function processResults($results, $object = false): array
867875
protected function render(array $data): JsonResponse
868876
{
869877
$output = $this->attachAppends([
870-
'draw' => $this->request->draw(),
871-
'recordsTotal' => $this->totalRecords,
878+
'draw' => $this->request->draw(),
879+
'recordsTotal' => $this->totalRecords,
872880
'recordsFiltered' => $this->filteredRecords ?? 0,
873-
'data' => $data,
881+
'data' => $data,
874882
]);
875883

876884
if ($this->config->isDebugging()) {
@@ -934,11 +942,11 @@ protected function errorResponse(\Exception $exception)
934942
$this->getLogger()->error($exception);
935943

936944
return new JsonResponse([
937-
'draw' => $this->request->draw(),
938-
'recordsTotal' => $this->totalRecords,
945+
'draw' => $this->request->draw(),
946+
'recordsTotal' => $this->totalRecords,
939947
'recordsFiltered' => 0,
940-
'data' => [],
941-
'error' => $error ? __($error) : "Exception Message:\n\n".$exception->getMessage(),
948+
'data' => [],
949+
'error' => $error ? __($error) : "Exception Message:\n\n".$exception->getMessage(),
942950
]);
943951
}
944952

@@ -1039,4 +1047,11 @@ protected function getPrimaryKeyName(): string
10391047
{
10401048
return 'id';
10411049
}
1050+
1051+
public function editOnlySelectedColumns(): static
1052+
{
1053+
$this->editOnlySelectedColumns = true;
1054+
1055+
return $this;
1056+
}
10421057
}

tests/Integration/QueryDataTableTest.php

Lines changed: 71 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ public function it_can_set_total_records()
2323
{
2424
$crawler = $this->call('GET', '/set-total-records');
2525
$crawler->assertJson([
26-
'draw' => 0,
27-
'recordsTotal' => 10,
26+
'draw' => 0,
27+
'recordsTotal' => 10,
2828
'recordsFiltered' => 10,
2929
]);
3030
}
@@ -34,8 +34,8 @@ public function it_can_set_zero_total_records()
3434
{
3535
$crawler = $this->call('GET', '/zero-total-records');
3636
$crawler->assertJson([
37-
'draw' => 0,
38-
'recordsTotal' => 0,
37+
'draw' => 0,
38+
'recordsTotal' => 0,
3939
'recordsFiltered' => 0,
4040
]);
4141
}
@@ -45,8 +45,8 @@ public function it_can_set_total_filtered_records()
4545
{
4646
$crawler = $this->call('GET', '/set-filtered-records');
4747
$crawler->assertJson([
48-
'draw' => 0,
49-
'recordsTotal' => 20,
48+
'draw' => 0,
49+
'recordsTotal' => 20,
5050
'recordsFiltered' => 10,
5151
]);
5252
}
@@ -56,8 +56,8 @@ public function it_returns_all_records_when_no_parameters_is_passed()
5656
{
5757
$crawler = $this->call('GET', '/query/users');
5858
$crawler->assertJson([
59-
'draw' => 0,
60-
'recordsTotal' => 20,
59+
'draw' => 0,
60+
'recordsTotal' => 20,
6161
'recordsFiltered' => 20,
6262
]);
6363
}
@@ -70,12 +70,12 @@ public function it_can_perform_global_search()
7070
['data' => 'name', 'name' => 'name', 'searchable' => 'true', 'orderable' => 'true'],
7171
['data' => 'email', 'name' => 'email', 'searchable' => 'true', 'orderable' => 'true'],
7272
],
73-
'search' => ['value' => 'Record-19'],
73+
'search' => ['value' => 'Record-19'],
7474
]);
7575

7676
$crawler->assertJson([
77-
'draw' => 0,
78-
'recordsTotal' => 20,
77+
'draw' => 0,
78+
'recordsTotal' => 20,
7979
'recordsFiltered' => 1,
8080
]);
8181
}
@@ -88,12 +88,12 @@ public function it_can_skip_total_records_count_query()
8888
['data' => 'name', 'name' => 'name', 'searchable' => 'true', 'orderable' => 'true'],
8989
['data' => 'email', 'name' => 'email', 'searchable' => 'true', 'orderable' => 'true'],
9090
],
91-
'search' => ['value' => 'Record-19'],
91+
'search' => ['value' => 'Record-19'],
9292
]);
9393

9494
$crawler->assertJson([
95-
'draw' => 0,
96-
'recordsTotal' => 0,
95+
'draw' => 0,
96+
'recordsTotal' => 0,
9797
'recordsFiltered' => 1,
9898
]);
9999
}
@@ -106,12 +106,12 @@ public function it_can_perform_multiple_term_global_search()
106106
['data' => 'name', 'name' => 'name', 'searchable' => 'true', 'orderable' => 'true'],
107107
['data' => 'email', 'name' => 'email', 'searchable' => 'true', 'orderable' => 'true'],
108108
],
109-
'search' => ['value' => 'Record-19 Email-19'],
109+
'search' => ['value' => 'Record-19 Email-19'],
110110
]);
111111

112112
$crawler->assertJson([
113-
'draw' => 0,
114-
'recordsTotal' => 20,
113+
'draw' => 0,
114+
'recordsTotal' => 20,
115115
'recordsFiltered' => 1,
116116
]);
117117
}
@@ -170,12 +170,12 @@ public function it_does_not_allow_search_on_added_columns()
170170
['data' => 'name', 'name' => 'name', 'searchable' => 'true', 'orderable' => 'true'],
171171
['data' => 'email', 'name' => 'email', 'searchable' => 'true', 'orderable' => 'true'],
172172
],
173-
'search' => ['value' => 'Record-19'],
173+
'search' => ['value' => 'Record-19'],
174174
]);
175175

176176
$crawler->assertJson([
177-
'draw' => 0,
178-
'recordsTotal' => 20,
177+
'draw' => 0,
178+
'recordsTotal' => 20,
179179
'recordsFiltered' => 1,
180180
]);
181181
}
@@ -188,6 +188,20 @@ public function it_returns_only_the_selected_columns()
188188
$this->assertArrayHasKey('name', $json['data'][0]);
189189
}
190190

191+
/** @test */
192+
public function it_edit_only_the_selected_columns_after_using_editOnlySelectedColumns()
193+
{
194+
$json = $this->call('GET', '/query/edit-columns', [
195+
'columns' => [
196+
['data' => 'name', 'name' => 'name', 'searchable' => 'true', 'orderable' => 'true'],
197+
],
198+
])->json();
199+
200+
$this->assertEquals('edited', $json['data'][0]['name']);
201+
$this->assertEquals('edited', $json['data'][0]['id']);
202+
$this->assertNotEquals('edited', $json['data'][0]['email']);
203+
}
204+
191205
/** @test */
192206
public function it_does_not_allow_raw_html_on_added_columns()
193207
{
@@ -222,12 +236,12 @@ public function it_can_return_auto_index_column()
222236
['data' => 'name', 'name' => 'name', 'searchable' => 'true', 'orderable' => 'true'],
223237
['data' => 'email', 'name' => 'email', 'searchable' => 'true', 'orderable' => 'true'],
224238
],
225-
'search' => ['value' => 'Record-19'],
239+
'search' => ['value' => 'Record-19'],
226240
]);
227241

228242
$crawler->assertJson([
229-
'draw' => 0,
230-
'recordsTotal' => 20,
243+
'draw' => 0,
244+
'recordsTotal' => 20,
231245
'recordsFiltered' => 1,
232246
]);
233247

@@ -243,12 +257,12 @@ public function it_allows_search_on_added_column_with_custom_filter_handler()
243257
['data' => 'name', 'name' => 'name', 'searchable' => 'true', 'orderable' => 'true'],
244258
['data' => 'email', 'name' => 'email', 'searchable' => 'true', 'orderable' => 'true'],
245259
],
246-
'search' => ['value' => 'Record-19'],
260+
'search' => ['value' => 'Record-19'],
247261
]);
248262

249263
$crawler->assertJson([
250-
'draw' => 0,
251-
'recordsTotal' => 20,
264+
'draw' => 0,
265+
'recordsTotal' => 20,
252266
'recordsFiltered' => 1,
253267
]);
254268

@@ -262,10 +276,10 @@ public function it_returns_search_panes_options()
262276
$crawler = $this->call('GET', '/query/search-panes');
263277

264278
$crawler->assertJson([
265-
'draw' => 0,
266-
'recordsTotal' => 20,
279+
'draw' => 0,
280+
'recordsTotal' => 20,
267281
'recordsFiltered' => 20,
268-
'searchPanes' => [
282+
'searchPanes' => [
269283
'options' => [
270284
'id' => [],
271285
],
@@ -287,8 +301,8 @@ public function it_performs_search_using_search_panes()
287301
]);
288302

289303
$crawler->assertJson([
290-
'draw' => 0,
291-
'recordsTotal' => 20,
304+
'draw' => 0,
305+
'recordsTotal' => 20,
292306
'recordsFiltered' => 2,
293307
]);
294308
}
@@ -299,21 +313,21 @@ public function it_allows_column_search_added_column_with_custom_filter_handler(
299313
$crawler = $this->call('GET', '/query/blacklisted-filter', [
300314
'columns' => [
301315
[
302-
'data' => 'foo',
303-
'name' => 'foo',
316+
'data' => 'foo',
317+
'name' => 'foo',
304318
'searchable' => 'true',
305-
'orderable' => 'true',
306-
'search' => ['value' => 'Record-1'],
319+
'orderable' => 'true',
320+
'search' => ['value' => 'Record-1'],
307321
],
308322
['data' => 'name', 'name' => 'name', 'searchable' => 'true', 'orderable' => 'true'],
309323
['data' => 'email', 'name' => 'email', 'searchable' => 'true', 'orderable' => 'true'],
310324
],
311-
'search' => ['value' => ''],
325+
'search' => ['value' => ''],
312326
]);
313327

314328
$crawler->assertJson([
315-
'draw' => 0,
316-
'recordsTotal' => 20,
329+
'draw' => 0,
330+
'recordsTotal' => 20,
317331
'recordsFiltered' => 1,
318332
]);
319333
}
@@ -324,8 +338,8 @@ public function it_can_return_formatted_columns()
324338
$crawler = $this->call('GET', '/query/formatColumn');
325339

326340
$crawler->assertJson([
327-
'draw' => 0,
328-
'recordsTotal' => 20,
341+
'draw' => 0,
342+
'recordsTotal' => 20,
329343
'recordsFiltered' => 20,
330344
]);
331345

@@ -345,8 +359,8 @@ public function it_can_return_added_column_with_dependency_injection()
345359
$crawler = $this->call('GET', '/closure-di');
346360

347361
$crawler->assertJson([
348-
'draw' => 0,
349-
'recordsTotal' => 20,
362+
'draw' => 0,
363+
'recordsTotal' => 20,
350364
'recordsFiltered' => 20,
351365
]);
352366

@@ -417,6 +431,21 @@ protected function setUp(): void
417431
->toJson();
418432
});
419433

434+
$router->get('/query/edit-columns', function (DataTables $dataTable) {
435+
return $dataTable->query(DB::table('users'))
436+
->editColumn('id', function () {
437+
return 'edited';
438+
})
439+
->editOnlySelectedColumns()
440+
->editColumn('name', function () {
441+
return 'edited';
442+
})
443+
->editColumn('email', function () {
444+
return 'edited';
445+
})
446+
->toJson();
447+
});
448+
420449
$router->get('/query/xss-add', function (DataTables $dataTable) {
421450
return $dataTable->query(DB::table('users'))
422451
->addColumn('foo', '<a href="#">Allowed</a>')

0 commit comments

Comments
 (0)