diff --git a/resources/views/base-web.blade.php b/resources/views/base-web.blade.php index aa0ecb0..7e79fdb 100644 --- a/resources/views/base-web.blade.php +++ b/resources/views/base-web.blade.php @@ -105,6 +105,19 @@ function popupConfirm(row, title, body, routeTemplate, routeReplacements, routeH }) } + function addMetaDataToUrl(url) + { + let metaData = { + timezone: Intl.DateTimeFormat().resolvedOptions().timeZone, + } + + let encodedMetaData = btoa(JSON.stringify(metaData)) + + url.searchParams.append('metaData', encodedMetaData) + + return url + } + (() => { $('#filterContainer .custom-select').change() @@ -177,8 +190,17 @@ function popupConfirm(row, title, body, routeTemplate, routeReplacements, routeH } }) - history.replaceState(null, '', endpoint.replace('.json', '') + '?' + filterParams.toString()); - table.setData(endpoint + '?' + filterParams.toString()); + let viewReportUrl = endpoint.replace('.json', '') + '?' + filterParams.toString() + let dataReportUrl = endpoint + '?' + filterParams.toString() + + viewReportUrlObject = new URL(viewReportUrl) + dataReportUrlObject = new URL(dataReportUrl) + + viewReportUrlObject = addMetaDataToUrl(viewReportUrlObject) + dataReportUrlObject = addMetaDataToUrl(dataReportUrlObject) + + history.replaceState(null, '', viewReportUrlObject.toString()); + table.setData(dataReportUrlObject.toString()); }); @if($autoloadInitialData) { diff --git a/src/BaseFeatures/Data/Types/DateTime.php b/src/BaseFeatures/Data/Types/DateTime.php index 54c3975..259f633 100755 --- a/src/BaseFeatures/Data/Types/DateTime.php +++ b/src/BaseFeatures/Data/Types/DateTime.php @@ -23,6 +23,8 @@ class DateTime extends BaseType protected string $outputFormat = 'L'; + protected ?string $formatter = 'datetime'; + public function __construct( string|null $outputFormat = null, string|null $placeholder = null, @@ -55,6 +57,11 @@ public function setInputFormat(string|null $format) : self return $this; } + public function getOutputTimezone() : ?string + { + return $this->outputTzName; + } + public function setOutputTimezone(string|null $timezone) : self { $this->outputTzName = $timezone; @@ -64,7 +71,7 @@ public function setOutputTimezone(string|null $timezone) : self public function formatter(): string { - return 'datetime'; + return $this->formatter; } public function formatterParams(): array diff --git a/src/BaseFeatures/Filters/BaseFilter.php b/src/BaseFeatures/Filters/BaseFilter.php index fa67d93..bce4f3f 100755 --- a/src/BaseFeatures/Filters/BaseFilter.php +++ b/src/BaseFeatures/Filters/BaseFilter.php @@ -24,10 +24,10 @@ abstract class BaseFilter implements Arrayable /** * BaseFilter constructor. * - * @param Column $column - * @param null $value + * @param Column $column + * @param mixed|null $value */ - public function __construct(Column $column, $value = null) + public function __construct(Column $column, mixed $value = null) { $this->setColumn($column); $this->setValue($value); diff --git a/src/BaseFeatures/Filters/DoesNotEqualFilter.php b/src/BaseFeatures/Filters/DoesNotEqualFilter.php index 609e033..7a1644c 100644 --- a/src/BaseFeatures/Filters/DoesNotEqualFilter.php +++ b/src/BaseFeatures/Filters/DoesNotEqualFilter.php @@ -2,7 +2,9 @@ namespace BluefynInternational\ReportEngine\BaseFeatures\Filters; +use Carbon\Carbon; use Illuminate\Database\Query\Builder; +use Illuminate\Support\Arr; class DoesNotEqualFilter extends BaseFilter { @@ -45,4 +47,27 @@ public static function key(): string { return 'does_not_equal'; } + + /** + * @return null|string|Carbon + */ + public function getValue(array $options = []) + { + if ($this->valueIsDate()) { + /** + * @var Carbon $value + */ + $value = parent::getValue(); + $timeZoneString = $this->getColumn()->type()->getOutputTimezone() + ?? Arr::get($options, 'timezone'); + + if ($timeZoneString) { + $value->shiftTimezone($timeZoneString); + } + + return $value->utc(); + } + + return parent::getValue(); + } } diff --git a/src/BaseFeatures/Filters/EqualsFilter.php b/src/BaseFeatures/Filters/EqualsFilter.php index 1161cd4..81a3b83 100644 --- a/src/BaseFeatures/Filters/EqualsFilter.php +++ b/src/BaseFeatures/Filters/EqualsFilter.php @@ -17,9 +17,9 @@ public function apply(Builder $builder, array $options = []) : Builder if ($this->valueIsDate()) { $greaterThanEqual = new GreaterThanOrEqualFilter($this->getColumn(), $this->getValue()); $lessThanEqual = new LessThanOrEqualFilter($this->getColumn(), $this->getValue()); - $builder = $greaterThanEqual->apply($builder); + $builder = $greaterThanEqual->apply($builder, $options); - return $lessThanEqual->apply($builder); + return $lessThanEqual->apply($builder, $options); } $action = $this->getAction(); diff --git a/src/BaseFeatures/Filters/GreaterThanFilter.php b/src/BaseFeatures/Filters/GreaterThanFilter.php index 05211a1..d5f894d 100644 --- a/src/BaseFeatures/Filters/GreaterThanFilter.php +++ b/src/BaseFeatures/Filters/GreaterThanFilter.php @@ -2,7 +2,9 @@ namespace BluefynInternational\ReportEngine\BaseFeatures\Filters; +use Carbon\Carbon; use Illuminate\Database\Query\Builder; +use Illuminate\Support\Arr; class GreaterThanFilter extends BaseFilter { @@ -15,17 +17,29 @@ class GreaterThanFilter extends BaseFilter public function apply(Builder $builder, array $options = []) : Builder { $action = $this->getAction(); + $value = $this->getValue($options); - return $builder->$action($this->getField(), '>', $this->getValue()); + return $builder->$action($this->getField(), '>', $value); } /** * @return null|string|mixed */ - public function getValue() + public function getValue(array $options = []) { if ($this->valueIsDate()) { - return parent::getValue()->endOfDay()->toDateTimeString(); + /** + * @var Carbon $value + */ + $value = parent::getValue(); + $timeZoneString = $this->getColumn()->type()->getOutputTimezone() + ?? Arr::get($options, 'timezone'); + + if ($timeZoneString) { + $value->shiftTimezone($timeZoneString); + } + + return $value->endOfDay()->utc()->toDateTimeString(); } return parent::getValue(); diff --git a/src/BaseFeatures/Filters/GreaterThanOrEqualFilter.php b/src/BaseFeatures/Filters/GreaterThanOrEqualFilter.php index a730be1..12f8c40 100644 --- a/src/BaseFeatures/Filters/GreaterThanOrEqualFilter.php +++ b/src/BaseFeatures/Filters/GreaterThanOrEqualFilter.php @@ -2,7 +2,9 @@ namespace BluefynInternational\ReportEngine\BaseFeatures\Filters; +use Carbon\Carbon; use Illuminate\Database\Query\Builder; +use Illuminate\Support\Arr; class GreaterThanOrEqualFilter extends BaseFilter { @@ -15,17 +17,29 @@ class GreaterThanOrEqualFilter extends BaseFilter public function apply(Builder $builder, array $options = []) : Builder { $action = $this->getAction(); + $value = $this->getValue($options); - return $builder->$action($this->getField(), '>=', $this->getValue()); + return $builder->$action($this->getField(), '>=', $value); } /** * @return null|string */ - public function getValue() + public function getValue(array $options = []) { if ($this->valueIsDate()) { - return parent::getValue()->startOfDay()->toDateTimeString(); + /** + * @var Carbon $value + */ + $value = parent::getValue(); + $timeZoneString = $this->getColumn()->type()->getOutputTimezone() + ?? Arr::get($options, 'timezone'); + + if ($timeZoneString) { + $value->shiftTimezone($timeZoneString); + } + + return $value->startOfDay()->utc()->toDateTimeString(); } return parent::getValue(); diff --git a/src/BaseFeatures/Filters/LessThanFilter.php b/src/BaseFeatures/Filters/LessThanFilter.php index 687cda6..9767835 100644 --- a/src/BaseFeatures/Filters/LessThanFilter.php +++ b/src/BaseFeatures/Filters/LessThanFilter.php @@ -2,7 +2,9 @@ namespace BluefynInternational\ReportEngine\BaseFeatures\Filters; +use Carbon\Carbon; use Illuminate\Database\Query\Builder; +use Illuminate\Support\Arr; class LessThanFilter extends BaseFilter { @@ -15,17 +17,29 @@ class LessThanFilter extends BaseFilter public function apply(Builder $builder, array $options = []) : Builder { $action = $this->getAction(); + $value = $this->getValue($options); - return $builder->$action($this->getField(), '<', $this->getValue()); + return $builder->$action($this->getField(), '<', $value); } /** * @return null|string */ - public function getValue() + public function getValue(array $options = []) { if ($this->valueIsDate()) { - return parent::getValue()->startOfDay()->toDateTimeString(); + /** + * @var Carbon $value + */ + $value = parent::getValue(); + $timeZoneString = $this->getColumn()->type()->getOutputTimezone() + ?? Arr::get($options, 'timezone'); + + if ($timeZoneString) { + $value->shiftTimezone($timeZoneString); + } + + return $value->startOfDay()->utc()->toDateTimeString(); } return parent::getValue(); diff --git a/src/BaseFeatures/Filters/LessThanOrEqualFilter.php b/src/BaseFeatures/Filters/LessThanOrEqualFilter.php index f14e98a..8ccdd20 100644 --- a/src/BaseFeatures/Filters/LessThanOrEqualFilter.php +++ b/src/BaseFeatures/Filters/LessThanOrEqualFilter.php @@ -2,7 +2,9 @@ namespace BluefynInternational\ReportEngine\BaseFeatures\Filters; +use Carbon\Carbon; use Illuminate\Database\Query\Builder; +use Illuminate\Support\Arr; class LessThanOrEqualFilter extends BaseFilter { @@ -15,17 +17,29 @@ class LessThanOrEqualFilter extends BaseFilter public function apply(Builder $builder, array $options = []) : Builder { $action = $this->getAction(); + $value = $this->getValue($options); - return $builder->$action($this->getField(), '<=', $this->getValue()); + return $builder->$action($this->getField(), '<=', $value); } /** * @return null|string */ - public function getValue() + public function getValue(array $options = []) { if ($this->valueIsDate()) { - return parent::getValue()->endOfDay()->toDateTimeString(); + /** + * @var Carbon $value + */ + $value = parent::getValue(); + $timeZoneString = $this->getColumn()->type()->getOutputTimezone() + ?? Arr::get($options, 'timezone'); + + if ($timeZoneString) { + $value->shiftTimezone($timeZoneString); + } + + return $value->endOfDay()->utc()->toDateTimeString(); } return parent::getValue(); diff --git a/src/BaseFeatures/Traits/Filterable.php b/src/BaseFeatures/Traits/Filterable.php index b67522c..daa0223 100755 --- a/src/BaseFeatures/Traits/Filterable.php +++ b/src/BaseFeatures/Traits/Filterable.php @@ -21,10 +21,12 @@ trait Filterable */ protected function applyFilters(array $params, Builder $builder) : Builder { + $options = $this->getMetaData(); + $this->getAppliedfilters($params) - ->each(function ($fields) use (&$builder) { - $fields->each(function ($filter) use (&$builder) { - $builder = $this->filter($filter, $builder); + ->each(function ($fields) use ($options, &$builder) { + $fields->each(function ($filter) use ($options, &$builder) { + $builder = $this->filter($filter, $builder, $options); }); }); diff --git a/src/ReportBase.php b/src/ReportBase.php index 1c9aae8..befb82c 100644 --- a/src/ReportBase.php +++ b/src/ReportBase.php @@ -481,4 +481,11 @@ public static function rendersFilters(Collection $filterColumns, int $columnsWid return $output; } + + public function getMetaData() : array + { + $encodedData = $this->currentRequest->get('metaData', ''); + + return json_decode(json: base64_decode($encodedData), associative: true) ?? []; + } }