Skip to content

Commit fe29084

Browse files
committed
improve frontend search
Signed-off-by: Markus Blaschke <mblaschke82@gmail.com>
1 parent 81c924f commit fe29084

File tree

1 file changed

+49
-7
lines changed

1 file changed

+49
-7
lines changed

templates/report.js

Lines changed: 49 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,14 @@ let processGlobalSettings = () => {
6969
$(document).on("change", ".global-settings input:checkbox", processGlobalSettings);
7070
processGlobalSettings();
7171

72+
// ################################
73+
// funcs
74+
// ################################
75+
76+
function escapeRegExp(string) {
77+
return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
78+
}
79+
7280
// ################################
7381
// Report
7482
// ################################
@@ -242,6 +250,17 @@ let refreshTableData = () => {
242250

243251
let refreshTableFilter = () => {
244252
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+
245264
$("#report-form :input[data-report-filter]").each((num, el) => {
246265
el = $(el);
247266
let fieldName = el.data("report-filter");
@@ -253,16 +272,38 @@ let refreshTableFilter = () => {
253272
fieldValue.split("\n").forEach(value => {
254273
value = value.trim();
255274
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");
260299
reportFilter.push({field: fieldName, type: "regex", value: valueRegex});
261300
} 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});
264305
} else {
265-
// normal filter
306+
// fulltext search: like
266307
reportFilter.push({field:fieldName, type:"like", value:value});
267308
}
268309

@@ -279,6 +320,7 @@ let refreshTableFilter = () => {
279320
}
280321
}
281322
});
323+
282324
table.setFilter(reportFilter);
283325
};
284326

0 commit comments

Comments
 (0)