@@ -27,6 +27,12 @@ export interface Filter {
27
27
gt ?: number | null ;
28
28
lt ?: number | null ;
29
29
} | null ;
30
+ date_range ?: {
31
+ gte ?: string | null ;
32
+ lte ?: string | null ;
33
+ gt ?: string | null ;
34
+ lt ?: string | null ;
35
+ } | null ;
30
36
}
31
37
32
38
export interface Filters {
@@ -259,33 +265,35 @@ export const FilterItem = (props: FilterItemProps) => {
259
265
? "geo_radius"
260
266
: props . initialFilter ?. range
261
267
? "range"
262
- : "match" ,
268
+ : props . initialFilter ?. date_range
269
+ ? "date_range"
270
+ : props . initialFilter ?. match
271
+ ? "match"
272
+ : "match" ,
263
273
) ;
264
274
const [ tempFilterField , setTempFilterField ] = createSignal < string > (
265
275
props . initialFilter ?. field ?? "" ,
266
276
) ;
267
- const [ latitude , setLatitude ] = createSignal < number | null > (
268
- props . initialFilter ?. geo_radius ?. center ?. lat ?? null ,
269
- ) ;
270
- const [ longitude , setLongitude ] = createSignal < number | null > (
271
- props . initialFilter ?. geo_radius ?. center ?. lon ?? null ,
272
- ) ;
273
- const [ radius , setRadius ] = createSignal < number | null > (
274
- props . initialFilter ?. geo_radius ?. radius ?? null ,
275
- ) ;
276
- const [ greaterThan , setGreaterThan ] = createSignal < number | null > (
277
- props . initialFilter ?. range ?. gt ?? null ,
278
- ) ;
279
- const [ lessThan , setLessThan ] = createSignal < number | null > (
280
- props . initialFilter ?. range ?. lt ?? null ,
281
- ) ;
282
- const [ greaterThanOrEqual , setGreaterThanOrEqual ] = createSignal <
283
- number | null
284
- > ( props . initialFilter ?. range ?. gte ?? null ) ;
277
+ const [ location , setLocation ] = createSignal ( {
278
+ lat : props . initialFilter ?. geo_radius ?. center ?. lat ?? null ,
279
+ lon : props . initialFilter ?. geo_radius ?. center ?. lon ?? null ,
280
+ radius : props . initialFilter ?. geo_radius ?. radius ?? null ,
281
+ } ) ;
282
+
283
+ const [ range , setRange ] = createSignal ( {
284
+ gt : props . initialFilter ?. range ?. gt ?? null ,
285
+ lt : props . initialFilter ?. range ?. lt ?? null ,
286
+ gte : props . initialFilter ?. range ?. gte ?? null ,
287
+ lte : props . initialFilter ?. range ?. lte ?? null ,
288
+ } ) ;
289
+
290
+ const [ dateRange , setDateRange ] = createSignal ( {
291
+ gt : props . initialFilter ?. date_range ?. gt ?? null ,
292
+ lt : props . initialFilter ?. date_range ?. lt ?? null ,
293
+ gte : props . initialFilter ?. date_range ?. gte ?? null ,
294
+ lte : props . initialFilter ?. date_range ?. lte ?? null ,
295
+ } ) ;
285
296
286
- const [ lessThanOrEqual , setLessThanOrEqual ] = createSignal < number | null > (
287
- props . initialFilter ?. range ?. lte ?? null ,
288
- ) ;
289
297
const [ match , setMatch ] = createSignal < ( string | number ) [ ] | null > (
290
298
props . initialFilter ?. match ?? null ,
291
299
) ;
@@ -305,10 +313,10 @@ export const FilterItem = (props: FilterItemProps) => {
305
313
field : tempFilterField ( ) ,
306
314
geo_radius : {
307
315
center : {
308
- lat : latitude ( ) ,
309
- lon : longitude ( ) ,
316
+ lat : location ( ) . lat ,
317
+ lon : location ( ) . lon ,
310
318
} ,
311
- radius : radius ( ) ,
319
+ radius : location ( ) . radius ,
312
320
} ,
313
321
} ) ;
314
322
}
@@ -317,10 +325,10 @@ export const FilterItem = (props: FilterItemProps) => {
317
325
setCurFilter ( {
318
326
field : tempFilterField ( ) ,
319
327
range : {
320
- gt : greaterThan ( ) ,
321
- lt : lessThan ( ) ,
322
- gte : greaterThanOrEqual ( ) ,
323
- lte : lessThanOrEqual ( ) ,
328
+ gt : range ( ) . gt ,
329
+ lt : range ( ) . lt ,
330
+ gte : range ( ) . gte ,
331
+ lte : range ( ) . lte ,
324
332
} ,
325
333
} ) ;
326
334
}
@@ -331,6 +339,18 @@ export const FilterItem = (props: FilterItemProps) => {
331
339
match : match ( ) ,
332
340
} ) ;
333
341
}
342
+
343
+ if ( changedMode === "date_range" ) {
344
+ setCurFilter ( {
345
+ field : tempFilterField ( ) ,
346
+ date_range : {
347
+ gt : dateRange ( ) . gt ,
348
+ lt : dateRange ( ) . lt ,
349
+ gte : dateRange ( ) . gte ,
350
+ lte : dateRange ( ) . lte ,
351
+ } ,
352
+ } ) ;
353
+ }
334
354
} ) ;
335
355
336
356
createEffect ( ( ) => {
@@ -397,7 +417,7 @@ export const FilterItem = (props: FilterItemProps) => {
397
417
} }
398
418
value = { tempFilterMode ( ) }
399
419
>
400
- < For each = { [ "match" , "geo_radius" , "range" ] } >
420
+ < For each = { [ "match" , "geo_radius" , "range" , "date_range" ] } >
401
421
{ ( filter_mode ) => {
402
422
return (
403
423
< option
@@ -424,9 +444,12 @@ export const FilterItem = (props: FilterItemProps) => {
424
444
placeholder = "Latitude"
425
445
class = "rounded-md border border-neutral-400 bg-neutral-100 p-1 dark:border-neutral-900 dark:bg-neutral-800"
426
446
onChange = { ( e ) => {
427
- setLatitude ( parseFloat ( e . currentTarget . value ) ) ;
447
+ setLocation ( {
448
+ ...location ( ) ,
449
+ lat : parseFloat ( e . currentTarget . value ) ,
450
+ } ) ;
428
451
} }
429
- value = { latitude ( ) ?? "" }
452
+ value = { location ( ) . lat ?? "" }
430
453
/>
431
454
</ div >
432
455
< div class = "grid w-full grid-cols-2 items-center gap-y-1" >
@@ -436,9 +459,12 @@ export const FilterItem = (props: FilterItemProps) => {
436
459
placeholder = "Longitude"
437
460
class = "rounded-md border border-neutral-400 bg-neutral-100 p-1 dark:border-neutral-900 dark:bg-neutral-800"
438
461
onChange = { ( e ) => {
439
- setLongitude ( parseFloat ( e . currentTarget . value ) ) ;
462
+ setLocation ( {
463
+ ...location ( ) ,
464
+ lon : parseFloat ( e . currentTarget . value ) ,
465
+ } ) ;
440
466
} }
441
- value = { longitude ( ) ?? "" }
467
+ value = { location ( ) . lon ?? "" }
442
468
/>
443
469
</ div >
444
470
< div class = "grid w-full grid-cols-2 items-center gap-y-1" >
@@ -448,9 +474,12 @@ export const FilterItem = (props: FilterItemProps) => {
448
474
placeholder = "Radius"
449
475
class = "rounded-md border border-neutral-400 bg-neutral-100 p-1 dark:border-neutral-900 dark:bg-neutral-800"
450
476
onChange = { ( e ) => {
451
- setRadius ( parseFloat ( e . currentTarget . value ) ) ;
477
+ setLocation ( {
478
+ ...location ( ) ,
479
+ radius : parseFloat ( e . currentTarget . value ) ,
480
+ } ) ;
452
481
} }
453
- value = { radius ( ) ?? "" }
482
+ value = { location ( ) . radius ?? "" }
454
483
/>
455
484
</ div >
456
485
</ div >
@@ -464,19 +493,19 @@ export const FilterItem = (props: FilterItemProps) => {
464
493
placeholder = "Greater Than"
465
494
class = "rounded-md border border-neutral-400 bg-neutral-100 p-1 dark:border-neutral-900 dark:bg-neutral-800"
466
495
onChange = { ( e ) => {
467
- setGreaterThan ( parseFloat ( e . currentTarget . value ) ) ;
496
+ setRange ( { ... range ( ) , gt : parseFloat ( e . currentTarget . value ) } ) ;
468
497
} }
469
- value = { greaterThan ( ) ?? "" }
498
+ value = { range ( ) . gt ?? "" }
470
499
/>
471
500
< label aria-label = "Less Than" > Less Than:</ label >
472
501
< input
473
502
type = "number"
474
503
placeholder = "Less Than"
475
504
class = "rounded-md border border-neutral-400 bg-neutral-100 p-1 dark:border-neutral-900 dark:bg-neutral-800"
476
505
onChange = { ( e ) => {
477
- setLessThan ( parseFloat ( e . currentTarget . value ) ) ;
506
+ setRange ( { ... range ( ) , lt : parseFloat ( e . currentTarget . value ) } ) ;
478
507
} }
479
- value = { lessThan ( ) ?? "" }
508
+ value = { range ( ) . lt ?? "" }
480
509
/>
481
510
</ div >
482
511
< div class = "grid w-full grid-cols-2 items-center gap-y-1" >
@@ -488,19 +517,86 @@ export const FilterItem = (props: FilterItemProps) => {
488
517
placeholder = "Greater Than or Equal"
489
518
class = "rounded-md border border-neutral-400 bg-neutral-100 p-1 dark:border-neutral-900 dark:bg-neutral-800"
490
519
onChange = { ( e ) => {
491
- setGreaterThanOrEqual ( parseFloat ( e . currentTarget . value ) ) ;
520
+ setRange ( {
521
+ ...range ( ) ,
522
+ gte : parseFloat ( e . currentTarget . value ) ,
523
+ } ) ;
492
524
} }
493
- value = { greaterThanOrEqual ( ) ?? "" }
525
+ value = { range ( ) . gte ?? "" }
494
526
/>
495
527
< label aria-label = "Less Than or Equal" > Less Than or Equal:</ label >
496
528
< input
497
529
type = "number"
498
530
placeholder = "Less Than or Equal"
499
531
class = "rounded-md border border-neutral-400 bg-neutral-100 p-1 dark:border-neutral-900 dark:bg-neutral-800"
500
532
onChange = { ( e ) => {
501
- setLessThanOrEqual ( parseFloat ( e . currentTarget . value ) ) ;
533
+ setRange ( {
534
+ ...range ( ) ,
535
+ lte : parseFloat ( e . currentTarget . value ) ,
536
+ } ) ;
537
+ } }
538
+ value = { range ( ) . lte ?? "" }
539
+ />
540
+ </ div >
541
+ </ div >
542
+ </ Show >
543
+ < Show when = { tempFilterMode ( ) === "date_range" } >
544
+ < div class = "flex w-full flex-col gap-y-1 pl-2" >
545
+ < div class = "grid w-full grid-cols-2 items-center gap-y-1" >
546
+ < label aria-label = "Greater Than" > Greater Than:</ label >
547
+ < input
548
+ type = "date"
549
+ class = "rounded-md border border-neutral-400 bg-neutral-100 p-1 dark:border-neutral-900 dark:bg-neutral-800"
550
+ onChange = { ( e ) => {
551
+ setDateRange ( {
552
+ ...dateRange ( ) ,
553
+ gt : e . currentTarget . value + " 00:00:00" ,
554
+ } ) ;
555
+ } }
556
+ value = { dateRange ( ) . gt ?. replace ( " 00:00:00" , "" ) ?? "" }
557
+ />
558
+ < label aria-label = "Less Than" > Less Than:</ label >
559
+ < input
560
+ type = "date"
561
+ placeholder = "Less Than"
562
+ class = "rounded-md border border-neutral-400 bg-neutral-100 p-1 dark:border-neutral-900 dark:bg-neutral-800"
563
+ onChange = { ( e ) => {
564
+ setDateRange ( {
565
+ ...dateRange ( ) ,
566
+ lt : e . currentTarget . value + " 00:00:00" ,
567
+ } ) ;
568
+ } }
569
+ value = { dateRange ( ) . lt ?. replace ( " 00:00:00" , "" ) ?? "" }
570
+ />
571
+ </ div >
572
+ < div class = "grid w-full grid-cols-2 items-center gap-y-1" >
573
+ < label aria-label = "Greater Than or Equal" >
574
+ Greater Than or Equal:
575
+ </ label >
576
+ < input
577
+ type = "date"
578
+ placeholder = "Greater Than or Equal"
579
+ class = "rounded-md border border-neutral-400 bg-neutral-100 p-1 dark:border-neutral-900 dark:bg-neutral-800"
580
+ onChange = { ( e ) => {
581
+ setDateRange ( {
582
+ ...dateRange ( ) ,
583
+ gte : e . currentTarget . value + " 00:00:00" ,
584
+ } ) ;
585
+ } }
586
+ value = { dateRange ( ) . gte ?. replace ( " 00:00:00" , "" ) ?? "" }
587
+ />
588
+ < label aria-label = "Less Than or Equal" > Less Than or Equal:</ label >
589
+ < input
590
+ type = "date"
591
+ placeholder = "Less Than or Equal"
592
+ class = "rounded-md border border-neutral-400 bg-neutral-100 p-1 dark:border-neutral-900 dark:bg-neutral-800"
593
+ onChange = { ( e ) => {
594
+ setDateRange ( {
595
+ ...dateRange ( ) ,
596
+ lte : e . currentTarget . value + " 00:00:00" ,
597
+ } ) ;
502
598
} }
503
- value = { lessThanOrEqual ( ) ?? "" }
599
+ value = { dateRange ( ) . lte ?. replace ( " 00:00:00" , "" ) ?? "" }
504
600
/>
505
601
</ div >
506
602
</ div >
0 commit comments