@@ -69,6 +69,14 @@ let processGlobalSettings = () => {
69
69
$ ( document ) . on ( "change" , ".global-settings input:checkbox" , processGlobalSettings ) ;
70
70
processGlobalSettings ( ) ;
71
71
72
+ // ################################
73
+ // funcs
74
+ // ################################
75
+
76
+ function escapeRegExp ( string ) {
77
+ return string . replace ( / [ . * + ? ^ $ { } ( ) | [ \] \\ ] / g, '\\$&' ) ; // $& means the whole matched string
78
+ }
79
+
72
80
// ################################
73
81
// Report
74
82
// ################################
@@ -242,6 +250,17 @@ let refreshTableData = () => {
242
250
243
251
let refreshTableFilter = ( ) => {
244
252
reportFilter = [ ] ;
253
+
254
+ let searchValueArrayToRegexString = ( val ) => {
255
+ let list = val . substring ( 1 , val . length - 1 ) . split ( "," ) ;
256
+ list = list . map ( s => escapeRegExp ( s . trim ( ) ) ) ;
257
+ return "(" + list . join ( "|" ) + ")" ;
258
+ }
259
+ let searchValueRegexToRegexString = ( val ) => {
260
+ return val . substring ( 1 , val . length - 1 )
261
+ }
262
+
263
+
245
264
$ ( "#report-form :input[data-report-filter]" ) . each ( ( num , el ) => {
246
265
el = $ ( el ) ;
247
266
let fieldName = el . data ( "report-filter" ) ;
@@ -253,16 +272,38 @@ let refreshTableFilter = () => {
253
272
fieldValue . split ( "\n" ) . forEach ( value => {
254
273
value = value . trim ( ) ;
255
274
if ( value !== "" ) {
256
- if ( value . startsWith ( "/" ) && value . endsWith ( "/" ) ) {
257
- // regexp filter
258
- let valueRegexString = "^.*" + value . substring ( 1 , value . length - 1 ) + ".*$"
259
- let valueRegex = new RegExp ( valueRegexString , "gim" )
275
+ if ( value . includes ( ":" ) ) {
276
+ // field:value
277
+ let valueList = value . split ( ":" ) ;
278
+ let resourceName = valueList [ 0 ] . trim ( ) ;
279
+ valueList . splice ( 0 , 1 ) ;
280
+ let resourceValue = valueList . join ( ":" ) . trim ( ) ;
281
+
282
+ let resourceNameRegexpString = escapeRegExp ( resourceName ) ;
283
+ let resourceValueRegexpString = escapeRegExp ( resourceValue ) ;
284
+
285
+ if ( resourceValue . startsWith ( "/" ) && resourceValue . endsWith ( "/" ) ) {
286
+ resourceValueRegexpString = searchValueRegexToRegexString ( resourceValue ) ;
287
+ } else if ( resourceValue . startsWith ( "[" ) && resourceValue . endsWith ( "]" ) ) {
288
+ let valueList = resourceValue . substring ( 1 , resourceValue . length - 1 ) . split ( "," ) ;
289
+ resourceValueRegexpString = searchValueArrayToRegexString ( resourceValue ) ;
290
+ }
291
+
292
+ let valueRegexString = "^" + resourceNameRegexpString + ":[\\s]*" + resourceValueRegexpString + ".*$" ;
293
+ let valueRegex = new RegExp ( valueRegexString , "gim" ) ;
294
+ reportFilter . push ( { field : fieldName , type : "regex" , value : valueRegex } ) ;
295
+ } else if ( value . startsWith ( "/" ) && value . endsWith ( "/" ) ) {
296
+ // fulltext search: regex
297
+ let valueRegexString = "^.*" + searchValueRegexToRegexString ( value ) + ".*$" ;
298
+ let valueRegex = new RegExp ( valueRegexString , "gim" ) ;
260
299
reportFilter . push ( { field : fieldName , type : "regex" , value : valueRegex } ) ;
261
300
} else if ( value . startsWith ( "[" ) && value . endsWith ( "]" ) ) {
262
- let valueList = value . substring ( 1 , value . length - 1 ) . split ( "," ) ;
263
- reportFilter . push ( { field :fieldName , type :"in" , value :valueList } ) ;
301
+ // fulltext search: list
302
+ let valueRegexString = "^.*" + searchValueArrayToRegexString ( value ) + ".*$" ;
303
+ let valueRegex = new RegExp ( valueRegexString , "gim" ) ;
304
+ reportFilter . push ( { field :fieldName , type :"regex" , value :valueRegex } ) ;
264
305
} else {
265
- // normal filter
306
+ // fulltext search: like
266
307
reportFilter . push ( { field :fieldName , type :"like" , value :value } ) ;
267
308
}
268
309
@@ -279,6 +320,7 @@ let refreshTableFilter = () => {
279
320
}
280
321
}
281
322
} ) ;
323
+
282
324
table . setFilter ( reportFilter ) ;
283
325
} ;
284
326
0 commit comments