Ich habe bei mir mal probehalber ein "Filter" Feature für die Logfile Anzeige eingebaut (mit relativ überschaubaren Änderungen in 01_FHEMWEB.pm und fhemweb.json), und möchte das hier mal zur Diskussion stellen. Für mich ist das vor allem im FHEM Logfile eine Hilfe, weil ich da immer mal wieder nach bestimmten Dingen suche, oder manche Sachen ausblenden will, um mich auf das Wesentliche konzentrieren zu können (kann man natürlich auch mit Betriebssystem Funktionen machen, ist aber so komfortabler).
Die Änderungen in 01_FHEMWEB.pm:
Zeile 2218ff:
FW_outputChunk($FW_chash, "<a name='top'></a>".
"<div><label>Filter:</label><input id='flf_filter' type='search'><input id='flf_check' type='checkbox'></div><br>" . # Anchor point for filter features for FileLog
"<a href='#end_of_file'>jump to the end</a><br><br><div id='flf_content'>", $d)
Zeile 2230ff:
FW_outputChunk($FW_chash, "</div><br/><a name='end_of_file'></a>".
"<a href='#top'>jump to the top</a><br/><br/>", $d)
Die Änderungen in fhemweb.js:
Zeile 341ff:
FW_treeMenu();
FW_filelogFilter(); // register filtering function for logfile display
Zeile 1043ff:
function
FW_filelogFilter()
{
var setFilteredContent = function(elem) {
var flfFilter = elem.find("input#flf_filter");
var flfCheck = elem.find("input#flf_check");
var flfActive = flfCheck.is(':checked'); // state of toggle button for switching filter on/off
var flfRegExp = new RegExp("^.*^((?!" + flfFilter.val() + ").)*$.*$\n","mg"); // need to invert search to only keep lines matching input search string
var flfFullText = elem.find("#flf_backup");
if (flfFullText.length==0) { // save original content for further processing but hide
flfFullText = elem.find("[id=flf_content]").clone(true);
flfFullText.attr("id","flf_backup");
flfCheck.after(flfFullText);
flfFullText.hide();
}
var flfContent = elem.find("[id=flf_backup]"); // get original text as input for filtering
if (flfActive) { // filter needs to be applied
var flfFilteredContent = flfContent.text().replace(flfRegExp,'');
} else { // no filtering, keep original text
var flfFilteredContent = flfContent.text();
}
elem.find("[id=flf_content]").text(flfFilteredContent); // exchange displayed text with filtered one
};
$(document).find('input#flf_filter').change(function(){ // callback for changes in filter string
setFilteredContent($(this).parent().parent());
});
$(document).find('input#flf_check').change(function(){
setFilteredContent($(this).parent().parent()); // callback for filter toggle button
})
}