diff --git a/config/livewire-datatables.php b/config/livewire-datatables.php index 10a028a4..d67a0bd2 100644 --- a/config/livewire-datatables.php +++ b/config/livewire-datatables.php @@ -13,6 +13,7 @@ 'default_time_format' => 'H:i', 'default_date_format' => 'd/m/Y', + 'default_datetime_format' => 'd/m/Y H:i', /* |-------------------------------------------------------------------------- diff --git a/resources/views/livewire/datatables/filters/datetime.blade.php b/resources/views/livewire/datatables/filters/datetime.blade.php new file mode 100644 index 00000000..f7836120 --- /dev/null +++ b/resources/views/livewire/datatables/filters/datetime.blade.php @@ -0,0 +1,24 @@ +
+
+ +
+ +
+
+
+ +
+ +
+
+
\ No newline at end of file diff --git a/src/DatetimeColumn.php b/src/DatetimeColumn.php new file mode 100644 index 00000000..74bc8d53 --- /dev/null +++ b/src/DatetimeColumn.php @@ -0,0 +1,25 @@ +format(); + } + + public function format($format = null) + { + $this->callback = function ($value) use ($format) { + return $value ? Carbon::parse($value)->format($format ?? config('livewire-datatables.default_datetime_format')) : null; + }; + + return $this; + } +} diff --git a/src/Http/Livewire/LivewireDatatable.php b/src/Http/Livewire/LivewireDatatable.php index d799f8cf..acffcef2 100644 --- a/src/Http/Livewire/LivewireDatatable.php +++ b/src/Http/Livewire/LivewireDatatable.php @@ -31,6 +31,7 @@ class LivewireDatatable extends Component public $sort; public $direction; public $activeDateFilters = []; + public $activeDatetimeFilters = []; public $activeTimeFilters = []; public $activeSelectFilters = []; public $activeBooleanFilters = []; @@ -170,6 +171,7 @@ public function applyToTable($options) 'search', 'activeSelectFilters', 'activeDateFilters', + 'activeDatetimeFilters', 'activeTimeFilters', 'activeBooleanFilters', 'activeTextFilters', @@ -197,6 +199,7 @@ public function resetTable() $this->setPage(1); $this->activeSelectFilters = []; $this->activeDateFilters = []; + $this->activeDatetimeFilters = []; $this->activeTimeFilters = []; $this->activeTextFilters = []; $this->activeBooleanFilters = []; @@ -531,6 +534,7 @@ public function setSessionStoredFilters() 'boolean' => $this->activeBooleanFilters, 'select' => $this->activeSelectFilters, 'date' => $this->activeDateFilters, + 'datetime' => $this->activeDatetimeFilters, 'time' => $this->activeTimeFilters, 'number' => $this->activeNumberFilters, 'search' => $this->search, @@ -638,6 +642,10 @@ public function initialiseDefaultFilters() $this->activeDateFilters[$columnIndex] = $value; } + if ($column['type'] === 'datetime') { + $this->activeDatetimeFilters[$columnIndex] = $value; + } + if ($column['type'] === 'time') { $this->activeTimeFilters[$columnIndex] = $value; } @@ -672,6 +680,10 @@ public function initialiseFilters() $this->activeDateFilters = $filters['date']; } + if (! empty($filters['datetime'])) { + $this->activeDatetimeFilters = $filters['datetime']; + } + if (! empty($filters['time'])) { $this->activeTimeFilters = $filters['time']; } @@ -923,6 +935,22 @@ public function doDateFilterEnd($index, $end) $this->setSessionStoredFilters(); } + public function doDatetimeFilterStart($index, $start) + { + $this->activeDatetimeFilters[$index]['start'] = $start; + $this->setVisibleSelected(); + $this->setPage(1); + $this->setSessionStoredFilters(); + } + + public function doDatetimeFilterEnd($index, $end) + { + $this->activeDatetimeFilters[$index]['end'] = $end; + $this->setVisibleSelected(); + $this->setPage(1); + $this->setSessionStoredFilters(); + } + public function doTimeFilterStart($index, $start) { $this->activeTimeFilters[$index]['start'] = $start; @@ -980,6 +1008,7 @@ public function removeSelectFilter($column, $key = null) public function clearAllFilters() { $this->activeDateFilters = []; + $this->activeDatetimeFilters = []; $this->activeTimeFilters = []; $this->activeSelectFilters = []; $this->activeBooleanFilters = []; @@ -1154,6 +1183,7 @@ public function getNumberFiltersProperty() public function getActiveFiltersProperty() { return count($this->activeDateFilters) + || count($this->activeDatetimeFilters) || count($this->activeTimeFilters) || count($this->activeSelectFilters) || count($this->activeBooleanFilters) @@ -1209,6 +1239,7 @@ public function buildDatabaseQuery($export = false) ->addTextFilters() ->addNumberFilters() ->addDateRangeFilter() + ->addDatetimeRangeFilter() ->addTimeRangeFilter() ->addComplexQuery() ->addSort(); @@ -1504,6 +1535,27 @@ public function addDateRangeFilter() return $this; } + public function addDatetimeRangeFilter() + { + if (! count($this->activeDatetimeFilters)) { + return $this; + } + + $this->query->where(function ($query) { + foreach ($this->activeDatetimeFilters as $index => $filter) { + if (! ((isset($filter['start']) && $filter['start'] != '') || (isset($filter['end']) && $filter['end'] != ''))) { + break; + } + $query->whereBetween($this->getColumnFilterStatement($index)[0], [ + isset($filter['start']) && $filter['start'] != '' ? $filter['start'] : config('livewire-datatables.default_time_start', '0000-00-00 00:00'), + isset($filter['end']) && $filter['end'] != '' ? $filter['end'] : config('livewire-datatables.default_time_end', '9999-12-31 23:59'), + ]); + } + }); + + return $this; + } + public function addTimeRangeFilter() { if (! count($this->activeTimeFilters)) {