diff --git a/modules/backend/widgets/Filter.php b/modules/backend/widgets/Filter.php
index 8e53d0da7..3f01ae2f3 100644
--- a/modules/backend/widgets/Filter.php
+++ b/modules/backend/widgets/Filter.php
@@ -499,21 +499,56 @@ class Filter extends WidgetBase
}
switch ($scope->type) {
- case 'datepicker':
- if ($scope->value instanceof Carbon && $scopeConditions = $scope->conditions) {
- $query->whereRaw(strtr($scopeConditions, [':filtered' => $scope->value->format('Y-m-d')]));
+ case 'date':
+ if ($scope->value instanceof Carbon) {
+ $value = $scope->value->setTime(0, 0, 0);
+
+ /*
+ * Condition
+ */
+ if($scopeConditions = $scope->conditions) {
+ $query->whereRaw(DbDongle::parse(strtr($scopeConditions, [
+ ':filtered' => $value->format('Y-m-d'),
+ ':after' => $value->format('Y-m-d H:i:s'),
+ ':before' => $value->copy()->setTime(23, 59, 59)->format('Y-m-d H:i:s')
+ ])));
+ }
+
+ /*
+ * Scope
+ */
+ if ($scopeMethod = $scope->scope) {
+ $query->$scopeMethod($value);
+ }
}
break;
- case 'daterangepicker':
- if (is_array($scope->value) && count($scope->value) > 1 && ($scopeConditions = $scope->conditions)) {
+ case 'daterange':
+ if (is_array($scope->value) && count($scope->value) > 1) {
list($after, $before) = array_values($scope->value);
- if($after instanceof Carbon && $before instanceof Carbon) {
- $query->whereRaw(strtr($scopeConditions, [
- ':after' => $after->format('Y-m-d'),
- ':before' => $before->format('Y-m-d')
- ]));
+ if($after && $after instanceof Carbon && $before && $before instanceof Carbon) {
+ $after->setTime(0, 0, 0);
+ $before->setTime(23, 59, 59);
+
+ /*
+ * Condition
+ */
+ if($scopeConditions = $scope->conditions) {
+ $query->whereRaw(DbDongle::parse(strtr($scopeConditions, [
+ ':afterDate' => $after->format('Y-m-d'),
+ ':after' => $after->format('Y-m-d H:i:s'),
+ ':beforeDate' => $before->format('Y-m-d'),
+ ':before' => $before->format('Y-m-d H:i:s')
+ ])));
+ }
+
+ /*
+ * Scope
+ */
+ if ($scopeMethod = $scope->scope) {
+ $query->$scopeMethod($after, $before);
+ }
}
}
@@ -693,7 +728,12 @@ class Filter extends WidgetBase
}
foreach ($ajaxDates as $date) {
- $dates[] = Carbon::createFromFormat('Y-m-d', $date);
+ if(preg_match('/\d{4}-\d{2}-\d{2}/', $date)) {
+ $dates[] = Carbon::createFromFormat('Y-m-d', $date);
+ } else {
+ $dates = [];
+ break;
+ }
}
}
diff --git a/modules/backend/widgets/filter/partials/_scope_daterange.htm b/modules/backend/widgets/filter/partials/_scope_daterange.htm
index 9d1332d40..46e20d2ab 100644
--- a/modules/backend/widgets/filter/partials/_scope_daterange.htm
+++ b/modules/backend/widgets/filter/partials/_scope_daterange.htm
@@ -4,11 +4,11 @@
href="javascript:;"
data-scope-name="= $scope->scopeName ?>"
data-scope-data="= e(json_encode([
- 'dates' => $scope->value && is_array($scope->value) ? array_map(function($value) { return $value instanceof \Carbon\Carbon ? $value->format('Y-m-d') : null; }, $scope->value) : null,
+ 'dates' => $scope->value && is_array($scope->value) ? array_map(function($value) { return $value && $value instanceof \Carbon\Carbon ? $value->format('Y-m-d') : null; }, $scope->value) : null,
'minDate' => $scope->minDate ? $scope->minDate : '2000-01-01',
'maxDate' => $scope->maxDate ? $scope->maxDate : '2099-12-31',
]))
?>">
= e(trans($scope->label)) ?>:
- = $scope->value && is_array($scope->value) ? join(' → ', array_map(function($value) { return $value instanceof \Carbon\Carbon ? $value->format('Y-m-d') : null; }, $scope->value)) : e(trans('backend::lang.filter.date_all')) ?>
+ = $scope->value && is_array($scope->value) ? join(' → ', array_map(function($value) { return $value && $value instanceof \Carbon\Carbon ? $value->format('Y-m-d') : null; }, $scope->value)) : e(trans('backend::lang.filter.date_all')) ?>
diff --git a/modules/system/assets/ui/js/filter.dates.js b/modules/system/assets/ui/js/filter.dates.js
index 0956366c7..2e02ca76a 100644
--- a/modules/system/assets/ui/js/filter.dates.js
+++ b/modules/system/assets/ui/js/filter.dates.js
@@ -288,14 +288,20 @@
FilterWidget.prototype.updateScopeDateSetting = function ($scope, dates) {
var self = this,
$setting = $scope.find('.filter-setting'),
- dateFormat = self.getDateFormat()
+ dateFormat = self.getDateFormat(),
+ dateRegex =/\d{4}-\d{2}-\d{2}/,
+ reset = false
- if (dates && dates.length) {
+ if (dates && dates.length && dates[0].match(dateRegex)) {
if (dates.length > 1) {
- var after = moment(dates[0], 'YYYY-MM-DD').format(dateFormat),
- before = moment(dates[1], 'YYYY-MM-DD').format(dateFormat);
+ if(dates[1].match(dateRegex)) {
+ var after = moment(dates[0], 'YYYY-MM-DD').format(dateFormat),
+ before = moment(dates[1], 'YYYY-MM-DD').format(dateFormat);
- $setting.text(after + ' → ' + before)
+ $setting.text(after + ' → ' + before)
+ } else {
+ reset = true
+ }
}
else {
$setting.text(moment(dates[0], 'YYYY-MM-DD').format(dateFormat))
@@ -304,6 +310,10 @@
$scope.addClass('active')
}
else {
+ reset = true
+ }
+
+ if(reset) {
$setting.text(this.getLang('filter.dates.all', 'all'));
$scope.removeClass('active')
}