From 6bc466f548b15ab72496e5f72d572a4eddfc04e2 Mon Sep 17 00:00:00 2001 From: Saiful Islam Date: Sat, 16 Jan 2021 18:26:58 +0600 Subject: [PATCH 1/3] https://github.com/yajra/laravel-datatables/issues/2493 This will insert lengthMenu parameter according to max_record_per_page in config file. This will not affect manual lengthMenu insertion in "builder parameters". PSR2 CS Fix. --- src/Html/Builder.php | 29 ++++++++++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/src/Html/Builder.php b/src/Html/Builder.php index 12b2737..6dd6025 100644 --- a/src/Html/Builder.php +++ b/src/Html/Builder.php @@ -119,7 +119,8 @@ public function generateScripts() public function generateJson() { $args = array_merge( - $this->attributes, [ + $this->attributes, + [ 'ajax' => $this->ajax, 'columns' => $this->collection->map(function (Column $column) { $column = $column->toArray(); @@ -143,6 +144,26 @@ public function parameterize($attributes = []) { $parameters = (new Parameters($attributes))->toArray(); + $max_record_per_page = $this->config->get('datatables.max_record_per_page', 0); + if (!array_key_exists('lengthMenu', $parameters)) { + $parameters['lengthMenu'] = [10, 25, 50, 100]; + } + + if ($max_record_per_page != 0) { + $lengthMenu = array_unique($parameters['lengthMenu']); + foreach ($lengthMenu as $key => $value) { + if ($value > $max_record_per_page) { + unset($lengthMenu[$key]); + } + } + $lengthMenu = array_values($lengthMenu); + if (empty($lengthMenu)) { + $lengthMenu = [$max_record_per_page]; + } + sort($lengthMenu); + $parameters['lengthMenu'] = $lengthMenu; + } + $values = []; $replacements = []; @@ -212,8 +233,10 @@ public function table(array $attributes = [], $drawFooter = false, $drawSearch = $htmlAttr = $this->html->attributes($this->tableAttributes); $tableHtml = ''; - $searchHtml = $drawSearch ? '' . implode('', - $this->compileTableSearchHeaders()) . '' : ''; + $searchHtml = $drawSearch ? '' . implode( + '', + $this->compileTableSearchHeaders() + ) . '' : ''; $tableHtml .= '' . implode('', $th) . '' . $searchHtml . ''; if ($drawFooter) { $tf = $this->compileTableFooter(); From 115cc1057644c2e52fd06eb78d013d38a454512f Mon Sep 17 00:00:00 2001 From: Saiful Islam Date: Sat, 16 Jan 2021 18:53:26 +0600 Subject: [PATCH 2/3] Test for lengthMenu --- tests/HtmlBuilderTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/HtmlBuilderTest.php b/tests/HtmlBuilderTest.php index cdf28fc..43d9715 100644 --- a/tests/HtmlBuilderTest.php +++ b/tests/HtmlBuilderTest.php @@ -36,10 +36,10 @@ public function test_generate_table_html() $builder->html->shouldReceive('attributes')->once()->andReturn(); $script = $builder->scripts()->toHtml(); - $expected = '' . "\n"; + $expected = '' . "\n"; $this->assertEquals($expected, $script); - $expected = '$(function(){window.{{ config(\'datatables-html.namespace\', \'LaravelDataTables\') }}=window.{{ config(\'datatables-html.namespace\', \'LaravelDataTables\') }}||{};window.{{ config(\'datatables-html.namespace\', \'LaravelDataTables\') }}["foo"]=$("#foo").DataTable({"serverSide":true,"processing":true,"ajax":"ajax-url","columns":[{"name":"foo","data":"foo","title":"Foo","orderable":true,"searchable":true},{"name":"foo","data":"foo","title":"Bar","orderable":true,"searchable":true},{"name":"baz","data":"biz","title":"Biz","orderable":true,"searchable":true},{"defaultContent":"","title":"","data":"checkbox","name":"checkbox","orderable":false,"searchable":false,"width":"10px","id":"foo"},{"name":"id","data":"id","title":"Id","orderable":true,"searchable":true},{"data":"meh","title":"Muh","orderable":true,"searchable":true,"name":"meh"},{"name":"a","data":"a","title":"A","orderable":true,"searchable":true},{"defaultContent":"","data":"action","name":"action","title":"Options","render":null,"orderable":false,"searchable":false}],"bFilter":false});});'; + $expected = '$(function(){window.{{ config(\'datatables-html.namespace\', \'LaravelDataTables\') }}=window.{{ config(\'datatables-html.namespace\', \'LaravelDataTables\') }}||{};window.{{ config(\'datatables-html.namespace\', \'LaravelDataTables\') }}["foo"]=$("#foo").DataTable({"serverSide":true,"processing":true,"ajax":"ajax-url","columns":[{"name":"foo","data":"foo","title":"Foo","orderable":true,"searchable":true},{"name":"foo","data":"foo","title":"Bar","orderable":true,"searchable":true},{"name":"baz","data":"biz","title":"Biz","orderable":true,"searchable":true},{"defaultContent":"","title":"","data":"checkbox","name":"checkbox","orderable":false,"searchable":false,"width":"10px","id":"foo"},{"name":"id","data":"id","title":"Id","orderable":true,"searchable":true},{"data":"meh","title":"Muh","orderable":true,"searchable":true,"name":"meh"},{"name":"a","data":"a","title":"A","orderable":true,"searchable":true},{"defaultContent":"","data":"action","name":"action","title":"Options","render":null,"orderable":false,"searchable":false}],"bFilter":false,"lengthMenu":[10,25,50,100]});});'; $this->assertEquals($expected, $builder->generateScripts()->toHtml()); } From ba605360f1efffa1af2365497256ea9d14186920 Mon Sep 17 00:00:00 2001 From: Saiful Islam Date: Sat, 16 Jan 2021 19:04:20 +0600 Subject: [PATCH 3/3] Unit Test Update --- tests/HtmlBuilderTest.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/HtmlBuilderTest.php b/tests/HtmlBuilderTest.php index 43d9715..8153d23 100644 --- a/tests/HtmlBuilderTest.php +++ b/tests/HtmlBuilderTest.php @@ -79,10 +79,10 @@ public function test_generate_table_html_with_empty_footer() $builder->html->shouldReceive('attributes')->once()->andReturn(); $script = $builder->scripts()->toHtml(); - $expected = '' . "\n"; + $expected = '' . "\n"; $this->assertEquals($expected, $script); - $expected = '$(function(){window.{{ config(\'datatables-html.namespace\', \'LaravelDataTables\') }}=window.{{ config(\'datatables-html.namespace\', \'LaravelDataTables\') }}||{};window.{{ config(\'datatables-html.namespace\', \'LaravelDataTables\') }}["foo"]=$("#foo").DataTable({"serverSide":true,"processing":true,"ajax":"ajax-url","columns":[{"name":"foo","data":"foo","title":"Foo","orderable":true,"searchable":true},{"name":"foo","data":"foo","title":"Bar","orderable":true,"searchable":true},{"defaultContent":"","title":"","data":"checkbox","name":"checkbox","orderable":false,"searchable":false,"width":"10px","id":"foo"},{"name":"id","data":"id","title":"Id","orderable":true,"searchable":true},{"name":"a","data":"a","title":"A","orderable":true,"searchable":true},{"defaultContent":"","data":"action","name":"action","title":"Options","render":null,"orderable":false,"searchable":false}],"bFilter":false});});'; + $expected = '$(function(){window.{{ config(\'datatables-html.namespace\', \'LaravelDataTables\') }}=window.{{ config(\'datatables-html.namespace\', \'LaravelDataTables\') }}||{};window.{{ config(\'datatables-html.namespace\', \'LaravelDataTables\') }}["foo"]=$("#foo").DataTable({"serverSide":true,"processing":true,"ajax":"ajax-url","columns":[{"name":"foo","data":"foo","title":"Foo","orderable":true,"searchable":true},{"name":"foo","data":"foo","title":"Bar","orderable":true,"searchable":true},{"defaultContent":"","title":"","data":"checkbox","name":"checkbox","orderable":false,"searchable":false,"width":"10px","id":"foo"},{"name":"id","data":"id","title":"Id","orderable":true,"searchable":true},{"name":"a","data":"a","title":"A","orderable":true,"searchable":true},{"defaultContent":"","data":"action","name":"action","title":"Options","render":null,"orderable":false,"searchable":false}],"bFilter":false,"lengthMenu":[10,25,50,100]});});'; $this->assertEquals($expected, $builder->generateScripts()->toHtml()); } @@ -112,10 +112,10 @@ public function test_generate_table_html_with_footer_content() $builder->html->shouldReceive('attributes')->once()->andReturn(); $script = $builder->scripts()->toHtml(); - $expected = '' . "\n"; + $expected = '' . "\n"; $this->assertEquals($expected, $script); - $expected = '$(function(){window.{{ config(\'datatables-html.namespace\', \'LaravelDataTables\') }}=window.{{ config(\'datatables-html.namespace\', \'LaravelDataTables\') }}||{};window.{{ config(\'datatables-html.namespace\', \'LaravelDataTables\') }}["foo"]=$("#foo").DataTable({"serverSide":true,"processing":true,"ajax":"ajax-url","columns":[{"name":"foo","data":"foo","title":"Foo","orderable":true,"searchable":true},{"name":"foo","data":"foo","title":"Bar","orderable":true,"searchable":true},{"defaultContent":"","title":"","data":"checkbox","name":"checkbox","orderable":false,"searchable":false,"width":"10px","id":"foo"},{"name":"id","data":"id","title":"Id","orderable":true,"searchable":true},{"name":"a","data":"a","title":"A","orderable":true,"searchable":true},{"defaultContent":"","data":"action","name":"action","title":"Options","render":null,"orderable":false,"searchable":false}],"bFilter":false});});'; + $expected = '$(function(){window.{{ config(\'datatables-html.namespace\', \'LaravelDataTables\') }}=window.{{ config(\'datatables-html.namespace\', \'LaravelDataTables\') }}||{};window.{{ config(\'datatables-html.namespace\', \'LaravelDataTables\') }}["foo"]=$("#foo").DataTable({"serverSide":true,"processing":true,"ajax":"ajax-url","columns":[{"name":"foo","data":"foo","title":"Foo","orderable":true,"searchable":true},{"name":"foo","data":"foo","title":"Bar","orderable":true,"searchable":true},{"defaultContent":"","title":"","data":"checkbox","name":"checkbox","orderable":false,"searchable":false,"width":"10px","id":"foo"},{"name":"id","data":"id","title":"Id","orderable":true,"searchable":true},{"name":"a","data":"a","title":"A","orderable":true,"searchable":true},{"defaultContent":"","data":"action","name":"action","title":"Options","render":null,"orderable":false,"searchable":false}],"bFilter":false,"lengthMenu":[10,25,50,100]});});'; $this->assertEquals($expected, $builder->generateScripts()->toHtml()); } @@ -146,10 +146,10 @@ public function test_generate_table_html_with_render_helpers() $builder->html->shouldReceive('attributes')->once()->andReturn(); $script = $builder->scripts()->toHtml(); - $expected = '' . "\n"; + $expected = '' . "\n"; $this->assertEquals($expected, $script); - $expected = '$(function(){window.{{ config(\'datatables-html.namespace\', \'LaravelDataTables\') }}=window.{{ config(\'datatables-html.namespace\', \'LaravelDataTables\') }}||{};window.{{ config(\'datatables-html.namespace\', \'LaravelDataTables\') }}["foo"]=$("#foo").DataTable({"serverSide":true,"processing":true,"ajax":"ajax-url","columns":[{"name":"foo","data":"foo","title":"Foo","orderable":true,"searchable":true},{"name":"foo","data":"foo","title":"Bar","orderable":true,"searchable":true},{"name":"baz","data":"biz","title":"Biz","orderable":true,"searchable":true},{"defaultContent":"","title":"","data":"checkbox","name":"checkbox","orderable":false,"searchable":false,"width":"10px","id":"foo"},{"data":"1.0000","title":"Num","render":"$.fn.dataTable.render.number( \",\", \".\", 2, \"\" )","orderable":true,"searchable":true,"name":"1.0000"},{"data":"","title":"Tex","render":"$.fn.dataTable.render.text()","orderable":true,"searchable":true,"name":""},{"defaultContent":"","data":"action","name":"action","title":"Options","render":null,"orderable":false,"searchable":false}],"bFilter":false});});'; + $expected = '$(function(){window.{{ config(\'datatables-html.namespace\', \'LaravelDataTables\') }}=window.{{ config(\'datatables-html.namespace\', \'LaravelDataTables\') }}||{};window.{{ config(\'datatables-html.namespace\', \'LaravelDataTables\') }}["foo"]=$("#foo").DataTable({"serverSide":true,"processing":true,"ajax":"ajax-url","columns":[{"name":"foo","data":"foo","title":"Foo","orderable":true,"searchable":true},{"name":"foo","data":"foo","title":"Bar","orderable":true,"searchable":true},{"name":"baz","data":"biz","title":"Biz","orderable":true,"searchable":true},{"defaultContent":"","title":"","data":"checkbox","name":"checkbox","orderable":false,"searchable":false,"width":"10px","id":"foo"},{"data":"1.0000","title":"Num","render":"$.fn.dataTable.render.number( \",\", \".\", 2, \"\" )","orderable":true,"searchable":true,"name":"1.0000"},{"data":"","title":"Tex","render":"$.fn.dataTable.render.text()","orderable":true,"searchable":true,"name":""},{"defaultContent":"","data":"action","name":"action","title":"Options","render":null,"orderable":false,"searchable":false}],"bFilter":false,"lengthMenu":[10,25,50,100]});});'; $this->assertEquals($expected, $builder->generateScripts()->toHtml()); }