* use case-insensetive search

* reflect search phrase in URL, so the link can be sharable

Signed-off-by: hagen1778 <roman@victoriametrics.com>
This commit is contained in:
hagen1778 2024-02-20 11:21:25 +01:00
parent f8f3f07736
commit 7815e06f4b
No known key found for this signature in database
GPG key ID: 3BF75F3741CA9640
3 changed files with 64 additions and 45 deletions

View file

@ -19,7 +19,7 @@ function toggleByID(id) {
function debounce(func, delay) {
let timer;
return function(...args) {
return function (...args) {
clearTimeout(timer);
timer = setTimeout(() => {
func.apply(this, args);
@ -27,75 +27,87 @@ function debounce(func, delay) {
};
}
$('#filter').on("keyup", debounce(filter, 500));
$('#search').on("keyup", debounce(search, 500));
function filter(){
function search() {
$(".rule-table").removeClass('show');
$(".rule").show();
if($("#filter").val().length === 0){
$(".group-heading").show()
let groupHeader = $(".group-heading")
let searchPhrase = $("#search").val().toLowerCase()
if (searchPhrase.length === 0) {
groupHeader.show()
setParamURL('search', '')
return
}
$(".group-heading").hide()
groupHeader.hide()
filterRuleByName();
filterRuleByLabels();
filterGroupsByName();
searchPhrase = searchPhrase.toLowerCase()
filterRuleByName(searchPhrase);
filterRuleByLabels(searchPhrase);
filterGroupsByName(searchPhrase);
setParamURL('search', searchPhrase)
}
function filterGroupsByName(){
$( ".group-heading" ).each(function() {
const groupName = $(this).attr('data-group-name');
const filter = $("#filter").val()
const hasValue = groupName.indexOf(filter) >= 0
function setParamURL(key, value) {
let url = new URL(location.href)
url.searchParams.set(key, value);
window.history.replaceState(null, null, `?${url.searchParams.toString()}`);
}
if (hasValue){
const target = $(this).attr("data-bs-target");
$(this).show();
$(`div[id="${target}"] .rule`).show();
function getParamURL(key) {
let url = new URL(location.href)
return url.searchParams.get(key)
}
function filterGroupsByName(searchPhrase) {
$(".group-heading").each(function () {
const groupName = $(this).attr('data-group-name').toLowerCase();
const hasValue = groupName.indexOf(searchPhrase) >= 0
if (!hasValue) {
return
}
const target = $(this).attr("data-bs-target");
$(`div[id="${target}"] .rule`).show();
$(this).show();
});
}
function filterRuleByName(){
$( ".rule" ).each(function() {
function filterRuleByName(searchPhrase) {
$(".rule").each(function () {
const ruleName = $(this).attr("data-rule-name");
const filter = $("#filter").val()
const hasValue = ruleName.indexOf(filter) >= 0
const hasValue = ruleName.indexOf(searchPhrase) >= 0
if (hasValue){
const target = $(this).attr('data-bs-target')
$(`#rules-${target}`).addClass('show');
$(`div[data-bs-target='rules-${target}']`).show();
$(this).show();
}else{
if (!hasValue) {
$(this).hide();
return
}
});
const target = $(this).attr('data-bs-target')
$(`#rules-${target}`).addClass('show');
$(`div[data-bs-target='rules-${target}']`).show();
$(this).show();
});
}
function filterRuleByLabels(){
$( ".rule" ).each(function() {
const filter = $("#filter").val()
const matches = $( ".label", this ).filter(function() {
function filterRuleByLabels(searchPhrase) {
$(".rule").each(function () {
const matches = $(".label", this).filter(function () {
const label = $(this).text();
const hasValue = label.indexOf(filter) >= 0
return hasValue;
}).length;
return label.indexOf(searchPhrase) >= 0;
}).length;
if (matches > 0){
if (matches > 0) {
const target = $(this).attr('data-bs-target')
$(`#rules-${target}`).addClass('show');
$(`div[data-bs-target='rules-${target}']`).show();
$(this).show();
}
});
});
}
$(document).ready(function () {
@ -115,6 +127,13 @@ $(document).ready(function () {
});
});
// update search element with value from URL, if any
let searchPhrase = getParamURL('search')
$("#search").val(searchPhrase)
// apply filtering by search phrase
search()
let hash = window.location.hash.substr(1);
toggleByID(hash);
});

View file

@ -85,7 +85,7 @@ btn-primary
<svg fill="#000000" height="25px" width="20px" version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 490.4 490.4" xml:space="preserve"><g id="SVGRepo_bgCarrier" stroke-width="0"></g><g id="SVGRepo_tracerCarrier" stroke-linecap="round" stroke-linejoin="round"></g><g id="SVGRepo_iconCarrier"> <g> <path d="M484.1,454.796l-110.5-110.6c29.8-36.3,47.6-82.8,47.6-133.4c0-116.3-94.3-210.6-210.6-210.6S0,94.496,0,210.796 s94.3,210.6,210.6,210.6c50.8,0,97.4-18,133.8-48l110.5,110.5c12.9,11.8,25,4.2,29.2,0C492.5,475.596,492.5,463.096,484.1,454.796z M41.1,210.796c0-93.6,75.9-169.5,169.5-169.5s169.6,75.9,169.6,169.5s-75.9,169.5-169.5,169.5S41.1,304.396,41.1,210.796z"></path> </g> </g></svg>
</span>
</div>
<input id="filter" placeholder="Filter by group, rule or labels" type="text" class="form-control"/>
<input id="search" placeholder="Filter by group, rule or labels" type="text" class="form-control"/>
</div>
</div>
</div>

View file

@ -269,7 +269,7 @@ func StreamListGroups(qw422016 *qt422016.Writer, r *http.Request, originGroups [
<svg fill="#000000" height="25px" width="20px" version="1.1" id="Capa_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 490.4 490.4" xml:space="preserve"><g id="SVGRepo_bgCarrier" stroke-width="0"></g><g id="SVGRepo_tracerCarrier" stroke-linecap="round" stroke-linejoin="round"></g><g id="SVGRepo_iconCarrier"> <g> <path d="M484.1,454.796l-110.5-110.6c29.8-36.3,47.6-82.8,47.6-133.4c0-116.3-94.3-210.6-210.6-210.6S0,94.496,0,210.796 s94.3,210.6,210.6,210.6c50.8,0,97.4-18,133.8-48l110.5,110.5c12.9,11.8,25,4.2,29.2,0C492.5,475.596,492.5,463.096,484.1,454.796z M41.1,210.796c0-93.6,75.9-169.5,169.5-169.5s169.6,75.9,169.6,169.5s-75.9,169.5-169.5,169.5S41.1,304.396,41.1,210.796z"></path> </g> </g></svg>
</span>
</div>
<input id="filter" placeholder="Filter by group, rule or labels" type="text" class="form-control"/>
<input id="search" placeholder="Filter by group, rule or labels" type="text" class="form-control"/>
</div>
</div>
</div>