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)) {