11<script setup lang="ts">
2- import {ref } from ' vue' ;
2+ import SearchFilterService from ' @/services/SearchFilterService' ;
3+ import {onMounted , onUnmounted , ref } from ' vue' ;
34
4- const expanded = ref (false );
5- const emit = defineEmits ([' add' ]);
5+ const filterService = new SearchFilterService ();
6+ const expanded = ref (false );
7+ const emit = defineEmits ([' add' ]);
68
7- const addFilter = (event : MouseEvent ) => {
9+ const addFilter = (event : UIEvent ) => {
810 const target = event .target as HTMLElement ;
911 const filter = target .closest (' [data-role=filter]' ) as HTMLInputElement ;
1012 const fields = Array .from (filter .querySelectorAll (' input' ));
11- let pattern = String (filter .dataset .pattern );
12- const strip = filter .dataset .strip ;
13- let replaced = false ;
14-
15- for (const input of fields ) {
16- const key = input .name ;
17- let val = input .value .trim ();
18- if (strip !== undefined ) {
19- val = val .replace (strip , ' ' );
20- }
21-
22- const escapeVal = (val .indexOf (' ' ) === - 1 ? val : ' "' + val + ' "' );
23- const matches = pattern .match (' \\ {' + key + ' (=)?\\ }' );
24- if (matches !== null ) {
25- pattern = pattern .replace (matches [0 ], val === ' ' ? ' ' : escapeVal + (matches [1 ] ?? ' ' ));
26- replaced = replaced || val !== ' ' ;
27- }
28- input .value = ' ' ;
29- }
3013
14+ const [pattern, replaced] = filterService .createFilter (fields , filter .dataset .strip , String (filter .dataset .pattern ));
3115 if (replaced ) {
3216 emit (' add' , pattern );
3317 }
3418}
19+
20+ // on escape, close the dropdown if visible
21+ const closeListener = function (event : KeyboardEvent ) {
22+ if (event .key === ' Escape' && expanded .value === true ) {
23+ event .preventDefault ();
24+ expanded .value = ! expanded .value ;
25+ }
26+ }
27+ onMounted (() => document .addEventListener (' keyup' , closeListener ));
28+ onUnmounted (() => document .removeEventListener (' keyup' , closeListener ));
3529 </script >
3630
3731<template >
@@ -59,6 +53,7 @@ const addFilter = (event: MouseEvent) => {
5953 type =" text"
6054 class =" form-control"
6155 placeholder =" Separate multiple by pipe symbol"
56+ @keyup.enter =" addFilter"
6257 aria-label =" Severity"
6358 aria-describedby =" filter-severity" >
6459 <button class =" btn btn-outline-primary" type =" button" @click =" addFilter" >Add</button >
@@ -69,13 +64,19 @@ const addFilter = (event: MouseEvent) => {
6964 type =" text"
7065 class =" form-control"
7166 placeholder =" Separate multiple by pipe symbol"
67+ @keyup.enter =" addFilter"
7268 aria-label =" Severity"
7369 aria-describedby =" filter-severity" >
7470 <button class =" btn btn-outline-primary" type =" button" @click =" addFilter" >Add</button >
7571 </div >
7672 <div class =" input-group mb-1" data-role =" filter" data-pattern =" exclude:{value}" >
7773 <span class =" slv-input-label input-group-text" id =" filter-exclude" >Exclude</span >
78- <input name =" value" type =" text" class =" form-control" aria-label =" Exclude string" aria-describedby =" filter-exclude" >
74+ <input name =" value"
75+ type =" text"
76+ class =" form-control"
77+ @keyup.enter =" addFilter"
78+ aria-label =" Exclude string"
79+ aria-describedby =" filter-exclude" >
7980 <button class =" btn btn-outline-primary" type =" button" @click =" addFilter" >Add</button >
8081 </div >
8182 <div class =" input-group mb-1" data-role =" filter" data-pattern =" context:{key=}{value}" >
@@ -86,7 +87,13 @@ const addFilter = (event: MouseEvent) => {
8687 placeholder =" key (optional)"
8788 aria-label =" Context key (optional)"
8889 aria-describedby =" filter-context" >
89- <input name =" value" type =" text" class =" form-control" placeholder =" search" aria-label =" Context" aria-describedby =" filter-context" >
90+ <input name =" value"
91+ type =" text"
92+ class =" form-control"
93+ placeholder =" search"
94+ @keyup.enter =" addFilter"
95+ aria-label =" Context"
96+ aria-describedby =" filter-context" >
9097 <button class =" btn btn-outline-primary" type =" button" @click =" addFilter" >Add</button >
9198 </div >
9299 <div class =" input-group mb-1" data-role =" filter" data-pattern =" extra:{key=}{value}" >
@@ -97,7 +104,13 @@ const addFilter = (event: MouseEvent) => {
97104 placeholder =" key (optional)"
98105 aria-label =" Extra key (optional)"
99106 aria-describedby =" filter-extra" >
100- <input name =value type =" text" class =" form-control" placeholder =" search" aria-label =" Extra" aria-describedby =" filter-extra" >
107+ <input name =value
108+ type =" text"
109+ class =" form-control"
110+ placeholder =" search"
111+ @keyup.enter =" addFilter"
112+ aria-label =" Extra"
113+ aria-describedby =" filter-extra" >
101114 <button class =" btn btn-outline-primary" type =" button" @click =" addFilter" >Add</button >
102115 </div >
103116 <div >
0 commit comments