diff --git a/.phpunit.result.cache b/.phpunit.result.cache index 03884ce7..83bd16dd 100644 --- a/.phpunit.result.cache +++ b/.phpunit.result.cache @@ -1 +1 @@ -{"version":1,"defects":{"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_returns_an_array_from_column":3,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_returns_an_array_from_raw":3,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_returns_width_property_from_column":3},"times":{"Mediconesystems\\LivewireDatatables\\Tests\\ColumnSetTest::it_can_generate_an_array_of_columns_from_a_model":0.127,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnSetTest::it_can_correctly_populate_the_columns_from_the_model with data set #0":0.013,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnSetTest::it_can_correctly_populate_the_columns_from_the_model with data set #1":0.012,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnSetTest::it_can_correctly_populate_the_columns_from_the_model with data set #2":0.012,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnSetTest::it_can_correctly_populate_the_columns_from_the_model with data set #3":0.012,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnSetTest::it_can_correctly_populate_the_columns_from_the_model with data set #4":0.012,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnSetTest::it_can_correctly_populate_the_columns_from_the_model with data set #5":0.013,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnSetTest::it_can_correctly_populate_the_columns_from_the_model with data set #6":0.013,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnSetTest::it_can_correctly_populate_the_columns_from_the_model with data set #7":0.012,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnSetTest::it_can_exclude_columns":0.014,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnSetTest::it_can_include_columns":0.012,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnSetTest::it_can_rename_columns":0.011,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_can_generate_a_column_from_a_table_column":0.011,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_can_generate_a_column_from_a_scope":0.012,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_can_generate_a_delete_column":0.011,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_sets_properties_and_parameters with data set #0":0.011,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_sets_properties_and_parameters with data set #1":0.011,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_sets_properties_and_parameters with data set #2":0.011,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_sets_properties_and_parameters with data set #3":0.011,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_sets_properties_and_parameters with data set #4":0.012,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_returns_an_array_from_column":0.014,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_returns_an_array_from_raw":0.012,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_returns_width_property_from_column":0.011,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableClassTest::it_can_mount_using_the_class":0.054,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableClassTest::it_can_set_a_default_sort":0.019,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableClassTest::it_can_show_and_hide_a_column":0.039,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableClassTest::it_can_order_results":0.014,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableClassTest::it_can_filter_results_based_on_text":0.026,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableClassTest::it_can_filter_results_based_on_boolean":0.026,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableClassTest::it_can_filter_strings_as_a_boolean":0.029,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableClassTest::it_can_filter_results_based_on_selects":0.025,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableClassTest::it_can_filter_results_based_on_numbers":0.059,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a_query_builder_for_base_columns":0.013,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a_query_builder_for_has_one_relation_columns":0.013,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a_where_query_for_a_has_one_column":0.013,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a_query_builder_for_has_many_relation_columns":0.014,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a_query_builder_for_has_many_relation_column_with_specific_aggregate":0.014,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a_where_query_for_has_many_relation_columns":0.013,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a_query_builder_for_belongs_to_relation_columns":0.018,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a_where_query_for_belongs_to_relation_columns":0.014,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a_query_builder_for_belongs_to_many_relation_columns":0.016,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a__where_query_for_belongs_to_many_relation_columns":0.013,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableTemplateTest::it_can_mount_from_the_default_template_with_a_model":0.017,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableTemplateTest::the_header_can_be_hidden_with_a_property":0.016,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableTemplateTest::the_pagination_bar_can_be_hidden_with_a_property":0.016,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableTemplateTest::it_can_set_per_page_with_a_property":0.023,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableTemplateTest::it_can_include_columns_from_a_property":0.016,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableTemplateTest::it_can_exclude_columns_from_a_property":0.017,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableTemplateTest::it_can_hide_columns_from_a_property":0.021,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableTemplateTest::it_can_mark_columns_for_date_format_from_a_property":0.017,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableTemplateTest::it_can_mark_columns_for_time_format_from_a_property":0.018,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableTemplateTest::it_can_set_sort_from_a_property":0.018,"Mediconesystems\\LivewireDatatables\\Tests\\MakeDatatableCommandTest::component_is_created_by_make_command":0.017,"Mediconesystems\\LivewireDatatables\\Tests\\MakeDatatableCommandTest::dot_nested_component_is_created_by_make_command":0.019,"Mediconesystems\\LivewireDatatables\\Tests\\MakeDatatableCommandTest::forward_slash_nested_component_is_created_by_make_command":0.016,"Mediconesystems\\LivewireDatatables\\Tests\\MakeDatatableCommandTest::multiword_component_is_created_by_make_command":0.014,"Mediconesystems\\LivewireDatatables\\Tests\\MakeDatatableCommandTest::pascal_case_component_is_automatically_converted_by_make_command":0.014,"Mediconesystems\\LivewireDatatables\\Tests\\MakeDatatableCommandTest::snake_case_component_is_automatically_converted_by_make_command":0.017,"Mediconesystems\\LivewireDatatables\\Tests\\MakeDatatableCommandTest::snake_case_component_is_automatically_converted_by_make_command_on_nested_component":0.018,"Mediconesystems\\LivewireDatatables\\Tests\\MakeDatatableCommandTest::new_component_model_name_matches_option":0.014,"Mediconesystems\\LivewireDatatables\\Tests\\MakeDatatableCommandTest::a_component_is_not_created_with_a_reserved_class_name":0.013}} \ No newline at end of file +{"version":1,"defects":{"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_returns_an_array_from_column":3,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_returns_an_array_from_raw":3,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_returns_width_property_from_column":3,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a_query_builder_for_base_columns":3,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a_query_builder_for_has_one_relation_columns":3,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a_where_query_for_a_has_one_column":3,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a_query_builder_for_has_many_relation_columns":3,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a_query_builder_for_has_many_relation_column_with_specific_aggregate":3,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a_where_query_for_has_many_relation_columns":3,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a_query_builder_for_belongs_to_relation_columns":3,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a_query_builder_for_belongs_to_many_relation_columns":3,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a__where_query_for_belongs_to_many_relation_columns":3},"times":{"Mediconesystems\\LivewireDatatables\\Tests\\ColumnSetTest::it_can_generate_an_array_of_columns_from_a_model":0.135,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnSetTest::it_can_correctly_populate_the_columns_from_the_model with data set #0":0.007,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnSetTest::it_can_correctly_populate_the_columns_from_the_model with data set #1":0.007,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnSetTest::it_can_correctly_populate_the_columns_from_the_model with data set #2":0.007,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnSetTest::it_can_correctly_populate_the_columns_from_the_model with data set #3":0.007,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnSetTest::it_can_correctly_populate_the_columns_from_the_model with data set #4":0.007,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnSetTest::it_can_correctly_populate_the_columns_from_the_model with data set #5":0.007,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnSetTest::it_can_correctly_populate_the_columns_from_the_model with data set #6":0.007,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnSetTest::it_can_correctly_populate_the_columns_from_the_model with data set #7":0.007,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnSetTest::it_can_exclude_columns":0.008,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnSetTest::it_can_include_columns":0.009,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnSetTest::it_can_rename_columns":0.007,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_can_generate_a_column_from_a_table_column":0.007,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_can_generate_a_column_from_a_scope":0.007,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_can_generate_a_delete_column":0.006,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_sets_properties_and_parameters with data set #0":0.007,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_sets_properties_and_parameters with data set #1":0.006,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_sets_properties_and_parameters with data set #2":0.007,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_sets_properties_and_parameters with data set #3":0.006,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_sets_properties_and_parameters with data set #4":0.006,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_returns_an_array_from_column":0.008,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_returns_an_array_from_raw":0.008,"Mediconesystems\\LivewireDatatables\\Tests\\ColumnTest::it_returns_width_property_from_column":0.007,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableClassTest::it_can_mount_using_the_class":0.05,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableClassTest::it_can_set_a_default_sort":0.012,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableClassTest::it_can_show_and_hide_a_column":0.029,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableClassTest::it_can_order_results":0.008,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableClassTest::it_can_filter_results_based_on_text":0.017,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableClassTest::it_can_filter_results_based_on_boolean":0.017,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableClassTest::it_can_filter_strings_as_a_boolean":0.017,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableClassTest::it_can_filter_results_based_on_selects":0.017,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableClassTest::it_can_filter_results_based_on_numbers":0.044,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a_query_builder_for_base_columns":0.009,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a_query_builder_for_has_one_relation_columns":0.008,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a_where_query_for_a_has_one_column":0.008,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a_query_builder_for_has_many_relation_columns":0.008,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a_query_builder_for_has_many_relation_column_with_specific_aggregate":0.008,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a_where_query_for_has_many_relation_columns":0.008,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a_query_builder_for_belongs_to_relation_columns":0.009,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a_where_query_for_belongs_to_relation_columns":0.009,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a_query_builder_for_belongs_to_many_relation_columns":0.01,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableQueryBuilderTest::it_creates_a__where_query_for_belongs_to_many_relation_columns":0.008,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableTemplateTest::it_can_mount_from_the_default_template_with_a_model":0.011,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableTemplateTest::the_header_can_be_hidden_with_a_property":0.013,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableTemplateTest::the_pagination_bar_can_be_hidden_with_a_property":0.01,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableTemplateTest::it_can_set_per_page_with_a_property":0.018,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableTemplateTest::it_can_include_columns_from_a_property":0.01,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableTemplateTest::it_can_exclude_columns_from_a_property":0.011,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableTemplateTest::it_can_hide_columns_from_a_property":0.011,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableTemplateTest::it_can_mark_columns_for_date_format_from_a_property":0.012,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableTemplateTest::it_can_mark_columns_for_time_format_from_a_property":0.013,"Mediconesystems\\LivewireDatatables\\Tests\\LivewireDatatableTemplateTest::it_can_set_sort_from_a_property":0.012,"Mediconesystems\\LivewireDatatables\\Tests\\MakeDatatableCommandTest::component_is_created_by_make_command":0.011,"Mediconesystems\\LivewireDatatables\\Tests\\MakeDatatableCommandTest::dot_nested_component_is_created_by_make_command":0.011,"Mediconesystems\\LivewireDatatables\\Tests\\MakeDatatableCommandTest::forward_slash_nested_component_is_created_by_make_command":0.008,"Mediconesystems\\LivewireDatatables\\Tests\\MakeDatatableCommandTest::multiword_component_is_created_by_make_command":0.009,"Mediconesystems\\LivewireDatatables\\Tests\\MakeDatatableCommandTest::pascal_case_component_is_automatically_converted_by_make_command":0.009,"Mediconesystems\\LivewireDatatables\\Tests\\MakeDatatableCommandTest::snake_case_component_is_automatically_converted_by_make_command":0.009,"Mediconesystems\\LivewireDatatables\\Tests\\MakeDatatableCommandTest::snake_case_component_is_automatically_converted_by_make_command_on_nested_component":0.009,"Mediconesystems\\LivewireDatatables\\Tests\\MakeDatatableCommandTest::new_component_model_name_matches_option":0.008,"Mediconesystems\\LivewireDatatables\\Tests\\MakeDatatableCommandTest::a_component_is_not_created_with_a_reserved_class_name":0.007}} \ No newline at end of file diff --git a/README.md b/README.md index ff4e45af..7cd3b444 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ composer require mediconesystems/livewire-datatables ``` If you use laravel 9 first execute ```bash -composer require psr/simple-cache:^1.0 maatwebsite/excel +composer require psr/simple-cache:^1.0 ``` ### Optional diff --git a/composer.json b/composer.json index f970fae2..8b5bfeba 100644 --- a/composer.json +++ b/composer.json @@ -30,8 +30,8 @@ "php": "^8.0", "illuminate/support": "^7.0|^8.0|^9.0", "livewire/livewire": "^2.4.4", - "maatwebsite/excel": "^3.1", - "reedware/laravel-relation-joins": "^2.4|^3.0" + "reedware/laravel-relation-joins": "^2.4|^3.0", + "spatie/simple-excel": "^3.0" }, "require-dev": { "laravel/legacy-factories": "^1.0.4", diff --git a/resources/views/livewire/datatables/boolean-non-zero.blade.php b/resources/views/livewire/datatables/boolean-non-zero.blade.php new file mode 100644 index 00000000..2202b04c --- /dev/null +++ b/resources/views/livewire/datatables/boolean-non-zero.blade.php @@ -0,0 +1,13 @@ +
+ @if(filled($value)) +
+ + + +
+ @else + + @endif +
diff --git a/resources/views/livewire/datatables/complex-query.blade.php b/resources/views/livewire/datatables/complex-query.blade.php index 57542edf..af86ff30 100644 --- a/resources/views/livewire/datatables/complex-query.blade.php +++ b/resources/views/livewire/datatables/complex-query.blade.php @@ -16,58 +16,64 @@ @endif - @if(count($this->rules[0]['content'])) -
{{ $this->rulesString }}@if($errors->any()) Invalid rules @endif
- @endif +
+ @if(count($this->rules[0]['content'])) +
{{ $this->rulesString }}@if($errors->any()) Invalid rules @endif
+ @endif +
@include('datatables::complex-query-group', ['rules' => $rules, 'parentIndex' => null])
- @if(count($this->rules[0]['content'])) - @unless($errors->any()) -
-
- {{-- --}} +
+ @if(count($this->rules[0]['content'])) + @unless($errors->any()) +
+
+ {{-- --}} +
+
+ @isset($savedQueries) +
+ + +
+ @endisset + +
-
- @isset($savedQueries) -
- -
+ +
+ @if(count($savedQueries ?? [])) +
+
Saved Queries
+
+ @foreach($savedQueries as $saved) +
+ +
- @endisset - + @endforeach
@endif - - @endif - @if(count($savedQueries ?? [])) -
-
Saved Queries
-
- @foreach($savedQueries as $saved) -
- - -
- @endforeach -
-
- @endif +
diff --git a/resources/views/livewire/datatables/filters/boolean-non-zero.blade.php b/resources/views/livewire/datatables/filters/boolean-non-zero.blade.php new file mode 100644 index 00000000..5e82fd8d --- /dev/null +++ b/resources/views/livewire/datatables/filters/boolean-non-zero.blade.php @@ -0,0 +1 @@ +@include('boolean') diff --git a/src/BooleanNonZeroColumn.php b/src/BooleanNonZeroColumn.php new file mode 100644 index 00000000..4996a546 --- /dev/null +++ b/src/BooleanNonZeroColumn.php @@ -0,0 +1,20 @@ +callback = function ($value) { + return view('datatables::boolean-non-zero', ['value' => $value]); + }; + + $this->exportCallback = function ($value) { + return filled($value) ? 1 : 0; + }; + } +} diff --git a/src/Column.php b/src/Column.php index 5208b0f6..d73dd4fe 100644 --- a/src/Column.php +++ b/src/Column.php @@ -398,6 +398,20 @@ public function hide() return $this; } + public function hideIf($boolean) + { + $this->hidden = $boolean; + + return $this; + } + + public function hideUnless($boolean) + { + $this->hidden = ! $boolean; + + return $this; + } + public function alignRight() { $this->headerAlign = 'right'; diff --git a/src/Exports/DatatableExport.php b/src/Exports/DatatableExport.php deleted file mode 100644 index 7800e539..00000000 --- a/src/Exports/DatatableExport.php +++ /dev/null @@ -1,88 +0,0 @@ -collection = $collection; - } - - public function collection() - { - return $this->collection; - } - - public function headings(): array - { - return array_keys((array) $this->collection->first()); - } - - public function setFileName($fileName) - { - $this->fileName = $fileName; - - return $this; - } - - public function getFileName(): string - { - return $this->fileName; - } - - public function setColumnWidths($columnWidths) - { - $this->columnWidths = $columnWidths; - - return $this; - } - - public function getColumnWidths(): array - { - return $this->columnWidths; - } - - public function columnWidths(): array - { - return $this->getColumnWidths(); - } - - public function setStyles($styles) - { - $this->styles = $styles; - - return $this; - } - - public function getStyles(): array - { - return $this->styles; - } - - public function styles(Worksheet $sheet) - { - return $this->getStyles(); - } - - public function download() - { - return Excel::download($this, $this->getFileName()); - } -} diff --git a/src/Http/Controllers/FileExportController.php b/src/Http/Controllers/FileExportController.php index 0f8500c1..0d581e4f 100644 --- a/src/Http/Controllers/FileExportController.php +++ b/src/Http/Controllers/FileExportController.php @@ -5,20 +5,20 @@ use Illuminate\Support\Facades\Response; use Illuminate\Support\Facades\Storage; - class FileExportController - { - public function handle($filename) - { - $response = Response::make(Storage::disk(config('livewire-datatables.file_export.disk') ?: config('filesystems.default')) - ->get('datatables/' . $filename), 200, [ - 'Content-Type' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', - 'Content-Disposition' => 'inline; filename="' . $filename . '"', - 'X-Vapor-Base64-Encode' => 'True', - ]); +class FileExportController +{ + public function handle($filename) + { + $response = Response::make(Storage::disk(config('livewire-datatables.file_export.disk') ?: config('filesystems.default')) + ->get('datatables/' . $filename), 200, [ + 'Content-Type' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', + 'Content-Disposition' => 'inline; filename="' . $filename . '"', + 'X-Vapor-Base64-Encode' => 'True', + ]); - Storage::disk(config('livewire-datatables.file_export.disk') ?: config('filesystems.default')) + Storage::disk(config('livewire-datatables.file_export.disk') ?: config('filesystems.default')) ->delete('datatables/' . $filename); - return $response; - } - } + return $response; + } +} diff --git a/src/Http/Livewire/ComplexQuery.php b/src/Http/Livewire/ComplexQuery.php index 8341c62a..554c1623 100644 --- a/src/Http/Livewire/ComplexQuery.php +++ b/src/Http/Livewire/ComplexQuery.php @@ -209,6 +209,7 @@ public function getOperands($key) 'date' => ['=', '<>', '<', '<=', '>', '>='], 'time' => ['=', '<>', '<', '<=', '>', '>='], 'boolean' => [], + 'boolean-non-zero' => [], 'scope' => ['includes'], ]; diff --git a/src/Http/Livewire/LivewireDatatable.php b/src/Http/Livewire/LivewireDatatable.php index cb0d1269..58e96f1e 100644 --- a/src/Http/Livewire/LivewireDatatable.php +++ b/src/Http/Livewire/LivewireDatatable.php @@ -19,6 +19,7 @@ use Mediconesystems\LivewireDatatables\Traits\WithCallbacks; use Mediconesystems\LivewireDatatables\Traits\WithPresetDateFilters; use Mediconesystems\LivewireDatatables\Traits\WithPresetTimeFilters; +use Spatie\SimpleExcel\SimpleExcelWriter; class LivewireDatatable extends Component { @@ -65,7 +66,7 @@ class LivewireDatatable extends Component public $persistSort = true; public $persistPerPage = true; public $persistFilters = true; - public $visibleSelected = []; + // public $visibleSelected = []; public $row = 1; public $tablePrefix = ''; @@ -218,7 +219,7 @@ public function resetHiddenColumns() public function updatedSearch() { - $this->visibleSelected = ($this->search) ? array_intersect($this->getQuery()->get()->pluck('checkbox_attribute')->toArray(), $this->selected) : $this->selected; + // $this->visibleSelected = ($this->search) ? array_intersect($this->getQuery()->get()->pluck('checkbox_attribute')->toArray(), $this->selected) : $this->selected; $this->setPage(1); } @@ -436,8 +437,8 @@ protected function resolveColumnName($column, $additional = null) return $this->query->getModel()->getTable() . '.' . ($column->base ?? Str::before($column->name, ':')); } - $relations = explode('.', Str::before(($additional ?: $column->name), ':')); - $aggregate = Str::after(($additional ?: $column->name), ':'); + $relations = explode('.', Str::before($additional ?: $column->name, ':')); + $aggregate = Str::after($additional ?: $column->name, ':'); if (! method_exists($this->query->getModel(), $relations[0])) { return $additional ?: $column->name; @@ -503,7 +504,7 @@ public function getSessionStoredPerPage() return; } - $this->perPage = session()->get($this->sessionStorageKey() . $this->name . '_perpage', $this->perPage); + $this->perPage = session()->get($this->sessionStorageKey() . '_perpage', $this->perPage); } public function setSessionStoredSort() @@ -545,7 +546,18 @@ public function setSessionStoredHidden() $hidden = collect($this->columns)->filter->hidden->keys()->toArray(); - session()->put([$this->sessionStorageKey() . $this->name . '_hidden_columns' => $hidden]); + session()->put([$this->sessionStorageKey() . '_hidden_columns' => $hidden]); + } + + public function resetSessionStoredHidden() + { + if (! $this->persistHiddenColumns) { + return; + } + + session()->forget($this->sessionStorageKey() . '_hidden_columns'); + + $this->columns = $this->getViewColumns(); } public function initialiseSearch() @@ -883,7 +895,7 @@ public function isGroupHidden($group) public function doBooleanFilter($index, $value) { $this->activeBooleanFilters[$index] = $value; - $this->setVisibleSelected(); + // $this->setVisibleSelected(); $this->setPage(1); $this->setSessionStoredFilters(); } @@ -891,7 +903,7 @@ public function doBooleanFilter($index, $value) public function doSelectFilter($index, $value) { $this->activeSelectFilters[$index][] = $value; - $this->setVisibleSelected(); + // $this->setVisibleSelected(); $this->setPage(1); $this->setSessionStoredFilters(); } @@ -901,7 +913,7 @@ public function doTextFilter($index, $value) foreach (explode(' ', $value) as $val) { $this->activeTextFilters[$index][] = $val; } - $this->setVisibleSelected(); + // $this->setVisibleSelected(); $this->setPage(1); $this->setSessionStoredFilters(); } @@ -909,7 +921,7 @@ public function doTextFilter($index, $value) public function doDateFilterStart($index, $start) { $this->activeDateFilters[$index]['start'] = $start; - $this->setVisibleSelected(); + // $this->setVisibleSelected(); $this->setPage(1); $this->setSessionStoredFilters(); } @@ -917,7 +929,7 @@ public function doDateFilterStart($index, $start) public function doDateFilterEnd($index, $end) { $this->activeDateFilters[$index]['end'] = $end; - $this->setVisibleSelected(); + // $this->setVisibleSelected(); $this->setPage(1); $this->setSessionStoredFilters(); } @@ -925,7 +937,7 @@ public function doDateFilterEnd($index, $end) public function doTimeFilterStart($index, $start) { $this->activeTimeFilters[$index]['start'] = $start; - $this->setVisibleSelected(); + // $this->setVisibleSelected(); $this->setPage(1); $this->setSessionStoredFilters(); } @@ -933,7 +945,7 @@ public function doTimeFilterStart($index, $start) public function doTimeFilterEnd($index, $end) { $this->activeTimeFilters[$index]['end'] = $end; - $this->setVisibleSelected(); + // $this->setVisibleSelected(); $this->setPage(1); $this->setSessionStoredFilters(); } @@ -942,7 +954,7 @@ public function doNumberFilterStart($index, $start) { $this->activeNumberFilters[$index]['start'] = ($start != '') ? (int) $start : null; $this->clearEmptyNumberFilter($index); - $this->setVisibleSelected(); + // $this->setVisibleSelected(); $this->setPage(1); $this->setSessionStoredFilters(); } @@ -951,7 +963,7 @@ public function doNumberFilterEnd($index, $end) { $this->activeNumberFilters[$index]['end'] = ($end != '') ? (int) $end : null; $this->clearEmptyNumberFilter($index); - $this->setVisibleSelected(); + // $this->setVisibleSelected(); $this->setPage(1); $this->setSessionStoredFilters(); } @@ -968,7 +980,7 @@ public function clearEmptyNumberFilter($index) public function removeSelectFilter($column, $key = null) { unset($this->activeSelectFilters[$column][$key]); - $this->visibleSelected = $this->selected; + // $this->visibleSelected = $this->selected; if (count($this->activeSelectFilters[$column]) < 1) { unset($this->activeSelectFilters[$column]); } @@ -986,7 +998,7 @@ public function clearAllFilters() $this->activeNumberFilters = []; $this->complexQuery = null; $this->userFilter = null; - $this->visibleSelected = $this->selected; + // $this->visibleSelected = $this->selected; $this->setPage(1); $this->setSessionStoredFilters(); @@ -996,7 +1008,7 @@ public function clearAllFilters() public function removeBooleanFilter($column) { unset($this->activeBooleanFilters[$column]); - $this->visibleSelected = $this->selected; + // $this->visibleSelected = $this->selected; $this->setSessionStoredFilters(); } @@ -1010,14 +1022,14 @@ public function removeTextFilter($column, $key = null) } else { unset($this->activeTextFilters[$column]); } - $this->visibleSelected = $this->selected; + // $this->visibleSelected = $this->selected; $this->setSessionStoredFilters(); } public function removeNumberFilter($column) { unset($this->activeNumberFilters[$column]); - $this->visibleSelected = $this->selected; + // $this->visibleSelected = $this->selected; $this->setSessionStoredFilters(); } @@ -1220,6 +1232,7 @@ public function buildDatabaseQuery($export = false) public function complexQuery($rules) { $this->complexQuery = $rules; + $this->setPage(1); } public function addComplexQuery() @@ -1232,8 +1245,6 @@ public function addComplexQuery() $this->processNested($this->complexQuery, $query); }); - $this->setPage(1); - return $this; } @@ -1276,6 +1287,18 @@ public function processNested($rules = null, $query = null, $logic = 'and') } elseif ($rule['content']['operand'] === 'is not empty') { $query->whereNotNull($column); } elseif ($this->columns[$rule['content']['column']]['type'] === 'boolean') { + if ($rule['content']['value'] === 'true') { + $query->where(function ($query) use ($column) { + $query->whereNotNull(Str::contains($column, '(') ? DB::raw($column) : $column) + ->where(Str::contains($column, '(') ? DB::raw($column) : $column, '<>', 0); + }); + } else { + $query->where(function ($query) use ($column) { + $query->whereNull(Str::contains($column, '(') ? DB::raw($column) : $column) + ->orWhere(Str::contains($column, '(') ? DB::raw($column) : $column, 0); + }); + } + } elseif ($this->columns[$rule['content']['column']]['type'] === 'boolean-non-zero') { if ($rule['content']['value'] === 'true') { $query->whereNotNull(Str::contains($column, '(') ? DB::raw($column) : $column); } else { @@ -1411,6 +1434,12 @@ public function addBooleanFilters() ->orWhere(DB::raw($this->getColumnFilterStatement($index)[0]), ''); }); } + } elseif ($this->freshColumns[$index]['type'] === 'boolean-non-zero') { + if ($value == 1) { + $query->whereNotNull($this->getColumnFilterStatement($index)[0]); + } elseif (strlen($value)) { + $query->whereNull(DB::raw($this->getColumnFilterStatement($index)[0])); + } } elseif ($value == 1) { $query->where(DB::raw($this->getColumnFilterStatement($index)[0]), '>', 0); } elseif (strlen($value)) { @@ -1672,10 +1701,10 @@ public function export(string $filename = 'DatatableExport.xlsx') { $this->forgetComputed(); - $export = new DatatableExport($this->getExportResultsSet()); - $export->setFilename($filename); + $writer = SimpleExcelWriter::create(storage_path($filename)) + ->addRows($this->getExportResultsSet()); - return $export->download(); + return response()->download($writer->getPath())->deleteFileAfterSend(); } public function getExportResultsSet() @@ -1686,10 +1715,10 @@ public function getExportResultsSet() })->get(), true )->map(function ($item) { - return collect($this->columns())->reject(function ($value, $key) { - return $value->preventExport == true || $value->hidden == true; - })->mapWithKeys(function ($value, $key) use ($item) { - return [$value->label ?? $value->name => $item->{$value->name}]; + return collect($this->columns)->reject(function ($value) { + return $value['preventExport'] == true || $value['hidden'] == true; + })->mapWithKeys(function ($value) use ($item) { + return [$value['label'] ?? $value['name'] => $item->{$value['name']}]; })->all(); }); } @@ -1710,37 +1739,37 @@ public function checkboxQuery() public function toggleSelectAll() { - $visible_checkboxes = $this->getQuery()->get()->pluck('checkbox_attribute')->toArray(); - $visible_checkboxes = array_map('strval', $visible_checkboxes); - if ($this->searchOrFilterActive()) { - if (count($this->visibleSelected) === count($visible_checkboxes)) { - $this->selected = array_values(array_diff($this->selected, $visible_checkboxes)); - $this->visibleSelected = []; - } else { - $this->selected = array_unique(array_merge($this->selected, $visible_checkboxes)); - sort($this->selected); - $this->visibleSelected = $visible_checkboxes; - } + // $visible_checkboxes = $this->getQuery()->get()->pluck('checkbox_attribute')->toArray(); + // $visible_checkboxes = array_map('strval', $visible_checkboxes); + // if ($this->searchOrFilterActive()) { + // if (count($this->visibleSelected) === count($visible_checkboxes)) { + // $this->selected = array_values(array_diff($this->selected, $visible_checkboxes)); + // $this->visibleSelected = []; + // } else { + // $this->selected = array_unique(array_merge($this->selected, $visible_checkboxes)); + // sort($this->selected); + // $this->visibleSelected = $visible_checkboxes; + // } + // } else { + if (count($this->selected) === $this->getQuery()->getCountForPagination()) { + $this->selected = []; } else { - if (count($this->selected) === $this->getQuery()->getCountForPagination()) { - $this->selected = []; - } else { - $this->selected = $this->checkboxQuery()->values()->toArray(); - } - $this->visibleSelected = $this->selected; + $this->selected = $this->checkboxQuery()->values()->toArray(); } + // $this->visibleSelected = $this->selected; + // } $this->forgetComputed(); } - public function updatedSelected() - { - if ($this->searchOrFilterActive()) { - $this->setVisibleSelected(); - } else { - $this->visibleSelected = $this->selected; - } - } + // public function updatedSelected() + // { + // if ($this->searchOrFilterActive()) { + // $this->setVisibleSelected(); + // } else { + // $this->visibleSelected = $this->selected; + // } + // } public function rowIsSelected($row) { @@ -1858,9 +1887,9 @@ private function searchOrFilterActive() return ! empty($this->search) || $this->getActiveFiltersProperty(); } - private function setVisibleSelected() - { - $this->visibleSelected = array_intersect($this->getQuery()->get()->pluck('checkbox_attribute')->toArray(), $this->selected); - $this->visibleSelected = array_map('strval', $this->visibleSelected); - } + // private function setVisibleSelected() + // { + // $this->visibleSelected = array_intersect($this->getQuery()->get()->pluck('checkbox_attribute')->toArray(), $this->selected); + // $this->visibleSelected = array_map('strval', $this->visibleSelected); + // } } diff --git a/src/JsonColumn.php b/src/JsonColumn.php index 4b89d168..a513b326 100644 --- a/src/JsonColumn.php +++ b/src/JsonColumn.php @@ -4,8 +4,9 @@ class JsonColumn extends Column { - public $type = 'json'; public $callback; + public $type = 'json'; + public $filterView = 'string'; public function __construct() { diff --git a/tests/ColumnSetTest.php b/tests/ColumnSetTest.php index 14130cf0..890ed36f 100644 --- a/tests/ColumnSetTest.php +++ b/tests/ColumnSetTest.php @@ -24,6 +24,7 @@ public function it_can_generate_an_array_of_columns_from_a_model() /** * @test + * * @dataProvider fieldDataProvider */ public function it_can_correctly_populate_the_columns_from_the_model($name, $index, $column) diff --git a/tests/ColumnTest.php b/tests/ColumnTest.php index 20b772b6..81e60a35 100644 --- a/tests/ColumnTest.php +++ b/tests/ColumnTest.php @@ -38,6 +38,7 @@ public function it_can_generate_a_delete_column() /** * @test + * * @dataProvider settersDataProvider */ public function it_sets_properties_and_parameters($method, $value, $attribute) diff --git a/tests/TestCase.php b/tests/TestCase.php index 9680e5d3..2f76c60f 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -5,7 +5,6 @@ use Illuminate\Support\Facades\View; use Illuminate\Support\Str; use Livewire\LivewireServiceProvider; -use Maatwebsite\Excel\ExcelServiceProvider; use Mediconesystems\LivewireDatatables\LivewireDatatablesServiceProvider; use Orchestra\Testbench\TestCase as Orchestra; use Reedware\LaravelRelationJoins\LaravelRelationJoinServiceProvider; @@ -26,7 +25,6 @@ protected function getPackageProviders($app) return [ LivewireServiceProvider::class, LivewireDatatablesServiceProvider::class, - ExcelServiceProvider::class, LaravelRelationJoinServiceProvider::class, ]; }