33namespace Cone \Root \Fields ;
44
55use Closure ;
6+ use Cone \Root \Filters \Filter ;
7+ use Cone \Root \Filters \RenderableFilter ;
68use Cone \Root \Root ;
79use DateTimeInterface ;
810use DateTimeZone ;
11+ use Illuminate \Database \Eloquent \Builder ;
912use Illuminate \Database \Eloquent \Model ;
1013use Illuminate \Http \Request ;
1114use Illuminate \Support \Facades \Config ;
@@ -118,12 +121,20 @@ public function getValue(Model $model): mixed
118121 {
119122 $ value = parent ::getValue ($ model );
120123
121- if (! is_null ($ value )) {
122- $ value = DateFactory::parse ($ value , Config::get ('app.timezone ' ))
123- ->setTimezone ($ this ->timezone );
124+ return $ this ->parseValue ($ value );
125+ }
126+
127+ /**
128+ * Parse the given value.
129+ */
130+ public function parseValue (mixed $ value ): ?DateTimeInterface
131+ {
132+ if (is_null ($ value )) {
133+ return $ value ;
124134 }
125135
126- return $ value ;
136+ return DateFactory::parse ($ value , Config::get ('app.timezone ' ))
137+ ->setTimezone ($ this ->timezone );
127138 }
128139
129140 /**
@@ -132,9 +143,65 @@ public function getValue(Model $model): mixed
132143 public function resolveFormat (Request $ request , Model $ model ): ?string
133144 {
134145 if (is_null ($ this ->formatResolver )) {
135- $ this ->formatResolver = fn (Request $ request , Model $ model , mixed $ value ): ?string => is_null ($ value ) ? $ value : $ value ->format ($ this ->format );
146+ $ this ->formatResolver = function (Request $ request , Model $ model , mixed $ value ): ?string {
147+ return is_null ($ value ) ? $ value : $ value ->format ($ this ->format );
148+ };
136149 }
137150
138151 return parent ::resolveFormat ($ request , $ model );
139152 }
153+
154+ /**
155+ * Set the filterable attribute.
156+ */
157+ public function filterable (?Closure $ callback = null , bool |Closure $ search = false ): static
158+ {
159+ $ callback ??= function (Request $ request , Builder $ query , mixed $ value , string $ attribute ): Builder {
160+ return $ query ->whereDate ($ query ->qualifyColumn ($ attribute ), $ value );
161+ };
162+
163+ return parent ::filterable ($ callback , $ search );
164+ }
165+
166+ /**
167+ * Get the form component data.
168+ */
169+ public function toDisplay (Request $ request , Model $ model ): array
170+ {
171+ return array_merge (parent ::toDisplay ($ request , $ model ), [
172+ 'value ' => $ this ->resolveFormat ($ request , $ model ),
173+ ]);
174+ }
175+
176+ /**
177+ * Get the filter representation of the field.
178+ */
179+ public function toFilter (): Filter
180+ {
181+ return new class ($ this ) extends RenderableFilter
182+ {
183+ protected Date $ field ;
184+
185+ public function __construct (Date $ field )
186+ {
187+ parent ::__construct ($ field ->getModelAttribute ());
188+
189+ $ this ->field = $ field ;
190+ }
191+
192+ public function apply (Request $ request , Builder $ query , mixed $ value ): Builder
193+ {
194+ return $ this ->field ->resolveFilterQuery ($ request , $ query , $ value );
195+ }
196+
197+ public function toField (): Field
198+ {
199+ return Date::make ($ this ->field ->getLabel (), $ this ->getRequestKey ())
200+ ->value (function (Request $ request ): ?DateTimeInterface {
201+ return $ this ->field ->parseValue ($ this ->getValue ($ request ));
202+ })
203+ ->suffix ('' );
204+ }
205+ };
206+ }
140207}
0 commit comments