|
2 | 2 |
|
3 | 3 | namespace Code16\Sharp\Filters; |
4 | 4 |
|
5 | | -use Carbon\Carbon; |
6 | | -use Code16\Sharp\Enums\FilterType; |
7 | | -use Code16\Sharp\Filters\DateRange\DateRangeFilterValue; |
8 | | -use Code16\Sharp\Filters\DateRange\DateRangePreset; |
9 | | - |
10 | 5 | abstract class DateRangeFilter extends Filter |
11 | 6 | { |
12 | | - private string $dateFormat = 'YYYY-MM-DD'; |
13 | | - private bool $isMondayFirst = true; |
14 | | - |
15 | | - /** @var DateRangePreset[] */ |
16 | | - private ?array $presets = null; |
17 | | - |
18 | | - final public function configureDateFormat(string $dateFormat): self |
19 | | - { |
20 | | - $this->dateFormat = $dateFormat; |
21 | | - |
22 | | - return $this; |
23 | | - } |
24 | | - |
25 | | - final public function configureMondayFirst(bool $isMondayFirst = true): self |
26 | | - { |
27 | | - $this->isMondayFirst = $isMondayFirst; |
28 | | - |
29 | | - return $this; |
30 | | - } |
31 | | - |
32 | | - final public function configureShowPresets(bool $showPresets = true, ?array $presets = null): self |
33 | | - { |
34 | | - if ($showPresets) { |
35 | | - $this->presets = $presets !== null |
36 | | - ? $presets |
37 | | - : [ |
38 | | - DateRangePreset::today(), |
39 | | - DateRangePreset::yesterday(), |
40 | | - DateRangePreset::last7days(), |
41 | | - DateRangePreset::last30days(), |
42 | | - DateRangePreset::last365days(), |
43 | | - DateRangePreset::thisMonth(), |
44 | | - DateRangePreset::lastMonth(), |
45 | | - DateRangePreset::thisYear(), |
46 | | - DateRangePreset::lastYear(), |
47 | | - ]; |
48 | | - } else { |
49 | | - $this->presets = []; |
50 | | - } |
51 | | - |
52 | | - return $this; |
53 | | - } |
54 | | - |
55 | | - final public function getDateFormat(): string |
56 | | - { |
57 | | - return $this->dateFormat; |
58 | | - } |
59 | | - |
60 | | - final public function isMondayFirst(): bool |
61 | | - { |
62 | | - return $this->isMondayFirst; |
63 | | - } |
64 | | - |
65 | | - /** |
66 | | - * @internal |
67 | | - */ |
68 | | - final public function fromQueryParam($value): ?array |
69 | | - { |
70 | | - if (! $value) { |
71 | | - return null; |
72 | | - } |
73 | | - |
74 | | - [$start, $end] = explode('..', $value); |
75 | | - $start = Carbon::createFromFormat('Ymd', $start)->startOfDay(); |
76 | | - $end = Carbon::createFromFormat('Ymd', $end)->endOfDay(); |
77 | | - |
78 | | - return [ |
79 | | - 'start' => $start->format('Y-m-d'), |
80 | | - 'end' => $end->format('Y-m-d'), |
81 | | - 'formatted' => [ |
82 | | - 'start' => $start->isoFormat($this->getDateFormat()), |
83 | | - 'end' => $end->isoFormat($this->getDateFormat()), |
84 | | - ], |
85 | | - ]; |
86 | | - } |
87 | | - |
88 | | - /** |
89 | | - * @internal |
90 | | - */ |
91 | | - final public function toQueryParam($value): ?string |
92 | | - { |
93 | | - if (! $value) { |
94 | | - return null; |
95 | | - } |
96 | | - |
97 | | - return sprintf( |
98 | | - '%s..%s', |
99 | | - Carbon::parse($value['start'])->format('Ymd'), |
100 | | - Carbon::parse($value['end'])->format('Ymd'), |
101 | | - ); |
102 | | - } |
103 | | - |
104 | | - public function toArray(): array |
105 | | - { |
106 | | - return parent::buildArray([ |
107 | | - 'type' => FilterType::DateRange->value, |
108 | | - 'required' => $this instanceof DateRangeRequiredFilter, |
109 | | - 'mondayFirst' => $this->isMondayFirst(), |
110 | | - 'presets' => collect($this->presets) |
111 | | - ->map(fn (DateRangePreset $preset) => $preset->toArray()) |
112 | | - ->toArray(), |
113 | | - ]); |
114 | | - } |
| 7 | + use DateRangeFilterTrait; |
115 | 8 |
|
116 | | - public function formatRawValue(mixed $value): DateRangeFilterValue |
| 9 | + public function defaultValue(): mixed |
117 | 10 | { |
118 | | - return new DateRangeFilterValue(Carbon::parse($value['start']), Carbon::parse($value['end'])); |
| 11 | + return null; |
119 | 12 | } |
120 | 13 | } |
0 commit comments