Refactored: Improved search functionality in MonitorList.vue

- Enhanced the search logic to support regular expressions with case-insensitive matching.
- Escaped special characters in the search text to prevent invalid regex patterns.
- Expanded search coverage to include `monitor.url`, `monitor.hostname`, and `monitor.dns_resolve_server`.
- Added error handling to catch and log invalid regex patterns, ensuring robustness.
- Maintained compatibility with existing search fields, such as monitor name and tags.

modified: src/components/MonitorList.vue

Co-authored-by: Ionys <Ionys320@users.noreply.github.com>
This commit is contained in:
GJS 2024-12-29 07:30:40 +01:00
parent be2faf64ce
commit 488e542ad8
No known key found for this signature in database
GPG key ID: BE32D9EAF927E85B

View file

@ -320,15 +320,35 @@ export default {
}
}
// filter by search text
// finds monitor name, tag name or tag value
// Filter monitors based on the search text
// Matches monitor name, URL, hostname, DNS resolve server, or tag names and values
let searchTextMatch = true;
if (this.searchText !== "") {
const loweredSearchText = this.searchText.toLowerCase();
searchTextMatch =
monitor.name.toLowerCase().includes(loweredSearchText)
|| monitor.tags.find(tag => tag.name.toLowerCase().includes(loweredSearchText)
|| tag.value?.toLowerCase().includes(loweredSearchText));
try {
// Escape special characters for use in the regular expression
const escapeRegExp = (string) => {
return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
};
// Create a case-insensitive regex for the search text
const escapedSearchText = escapeRegExp(this.searchText);
const regex = new RegExp(escapedSearchText, "i");
// Test the regex against strings safely
const safeRegexTest = (str) => str && regex.test(str);
// Check if any relevant fields match the search text
searchTextMatch =
regex.test(monitor.name) ||
safeRegexTest(monitor.url) ||
safeRegexTest(monitor.hostname) ||
safeRegexTest(monitor.dns_resolve_server) ||
monitor.tags.some(tag => regex.test(tag.name) || safeRegexTest(tag.value));
} catch (e) {
// Log error if the regex pattern is invalid
console.error("Invalid regex pattern:", e);
searchTextMatch = false;
}
}
// filter by status