@@ -495,34 +495,17 @@ Sometimes standard filters are not enough, and you want to make a convenient UI
495
495
< p class = " font-medium mb-1 dark:text-white" > {{ $t (' Square meters filter' ) }}< / p>
496
496
< div class = " flex gap-2" >
497
497
< button
498
- : class = " [
499
- baseBtnClass,
500
- selected === 'small' ? activeBtnClass : inactiveBtnClass
501
- ]"
502
- @click= " select('small')"
498
+ v- for = " option in options"
499
+ : key= " option.value"
503
500
type= " button"
501
+ class = " flex gap-1 items-center py-1 px-3 text-sm font-medium rounded-default border focus:outline-none focus:z-10 focus:ring-4"
502
+ : class = " {
503
+ 'text-white bg-blue-500 border-blue-500 hover:bg-blue-600 focus:ring-blue-200 dark:focus:ring-blue-800': selected === option.value,
504
+ 'text-gray-900 bg-white border-gray-300 hover:bg-gray-100 hover:text-blue-500 focus:ring-gray-100 dark:focus:ring-gray-700 dark:bg-gray-800 dark:text-gray-400 dark:border-gray-600 dark:hover:text-white dark:hover:bg-gray-700': selected !== option.value
505
+ }"
506
+ @click= " select(option.value)"
504
507
>
505
- {{ $t (' Small' ) }}
506
- < / button>
507
- < button
508
- : class = " [
509
- baseBtnClass,
510
- selected === 'medium' ? activeBtnClass : inactiveBtnClass
511
- ]"
512
- @click= " select('medium')"
513
- type= " button"
514
- >
515
- {{ $t (' Medium' ) }}
516
- < / button>
517
- < button
518
- : class = " [
519
- baseBtnClass,
520
- selected === 'large' ? activeBtnClass : inactiveBtnClass
521
- ]"
522
- @click= " select('large')"
523
- type= " button"
524
- >
525
- {{ $t (' Large' ) }}
508
+ {{ $t (option .label ) }}
526
509
< / button>
527
510
< / div>
528
511
< / div>
@@ -539,29 +522,44 @@ const props = defineProps<{
539
522
540
523
const selected = ref< string | null > (null );
541
524
542
- const baseBtnClass =
543
- ' flex gap-1 items-center py-1 px-3 text-sm font-medium rounded-default border focus:outline-none focus:z-10 focus:ring-4' ;
544
- const activeBtnClass =
545
- ' text-white bg-blue-500 border-blue-500 hover:bg-blue-600 focus:ring-blue-200 dark:focus:ring-blue-800' ;
546
- const inactiveBtnClass =
547
- ' text-gray-900 bg-white border-gray-300 hover:bg-gray-100 hover:text-blue-500 focus:ring-gray-100 dark:focus:ring-gray-700 dark:bg-gray-800 dark:text-gray-400 dark:border-gray-600 dark:hover:text-white dark:hover:bg-gray-700' ;
548
-
549
- watch (
550
- () => props .modelValue ,
551
- (val ) => {
552
- if (! val || val .length === 0 ) {
553
- selected .value = null ;
554
- return ;
555
- }
556
- const ops = val .map ((v ) => ` ${ v .operator } :${ v .value } ` );
557
-
558
- if (ops .includes (' lt:25' )) selected .value = ' small' ;
559
- else if (ops .includes (' gte:25' ) && ops .includes (' lte:90' )) selected .value = ' medium' ;
560
- else if (ops .includes (' gt:90' )) selected .value = ' large' ;
561
- else selected .value = null ;
562
- },
563
- { immediate: true }
564
- );
525
+ const options = [
526
+ { value: ' small' , label: ' Small' },
527
+ { value: ' medium' , label: ' Medium' },
528
+ { value: ' large' , label: ' Large' }
529
+ ];
530
+
531
+ onMounted (() => {
532
+ const val = props .modelValue ;
533
+ if (! val || val .length === 0 ) {
534
+ selected .value = null ;
535
+ return ;
536
+ }
537
+
538
+ const ops = val .map ((v ) => ` ${ v .operator } :${ v .value } ` );
539
+
540
+ if (ops .includes (' lt:25' )) selected .value = ' small' ;
541
+ else if (ops .includes (' gte:25' ) && ops .includes (' lte:90' )) selected .value = ' medium' ;
542
+ else if (ops .includes (' gt:90' )) selected .value = ' large' ;
543
+ else selected .value = null ;
544
+ });
545
+
546
+ watch (selected, (size ) => {
547
+ if (! size) {
548
+ emit (' update:modelValue' , []);
549
+ return ;
550
+ }
551
+
552
+ const filters = {
553
+ small: [{ operator: ' lt' , value: 25 }],
554
+ medium: [
555
+ { operator: ' gte' , value: 25 },
556
+ { operator: ' lte' , value: 90 }
557
+ ],
558
+ large: [{ operator: ' gt' , value: 90 }]
559
+ };
560
+
561
+ emit (' update:modelValue' , filters[size]);
562
+ });
565
563
566
564
function select (size : string ) {
567
565
selected .value = size;
0 commit comments