Skip to content

Commit 0e441b3

Browse files
committed
Added filter for tasks on page
1 parent ec52a20 commit 0e441b3

File tree

2 files changed

+95
-1
lines changed

2 files changed

+95
-1
lines changed

spin.html

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,61 @@
6868
<span class="loader"></span>
6969
</p>
7070
<div id="tasksList" class="spin-tasks">
71-
71+
<div class="filter-container">
72+
<button id="toggleRegexButton" onclick="toggleRegexFilter()" class="search regex" title="Поиск с помощью регулярного выражения">r"</button>
73+
<input type="text" id="filterValue" placeholder="Фильтровать задачи..." class="filter">
74+
<!-- <button id="filterButton" onclick="filterTasks()" class="search filter">Se</button> -->
75+
<script>
76+
function toggleRegexFilter() {
77+
document.getElementById("toggleRegexButton").classList.toggle("active");
78+
filterTasks();
79+
}
80+
81+
function emptyString(str) {
82+
return str.match(/^\s*$/gm) != null;
83+
}
84+
85+
function satisfiesFilter(node, regex_mode, filter_str) {
86+
if (regex_mode)
87+
return node.textContent.toLowerCase().match(RegExp(filter_str, "gm")) != null;
88+
else
89+
return node.textContent.toLowerCase().includes(filter_str);
90+
}
91+
92+
function filterTasksInContainer(container, regex_mode, filter_str) {
93+
let tasks = container.getElementsByClassName("task-container");
94+
95+
let shown_count = 0;
96+
for (let i = 0; i < tasks.length; i++)
97+
{
98+
if (emptyString(filter_str) || satisfiesFilter(tasks[i], regex_mode, filter_str))
99+
{
100+
tasks[i].style.removeProperty("display");
101+
shown_count++;
102+
}
103+
else
104+
tasks[i].style.setProperty("display", "none");
105+
}
106+
107+
if (shown_count == 0)
108+
container.style.setProperty("display", "none");
109+
else
110+
container.style.removeProperty("display");
111+
}
112+
113+
function filterTasks() {
114+
const regexMode = document.getElementById("toggleRegexButton") == null ? false : document.getElementById("toggleRegexButton").classList.contains("active");
115+
let filter_str = document.getElementById("filterValue").value;
116+
if (!regexMode)
117+
filter_str = filter_str.toLowerCase().trim();
118+
119+
filterTasksInContainer(document.getElementById("solvedTasks"), regexMode, filter_str);
120+
filterTasksInContainer(document.getElementById("unsolvedTasks"), regexMode, filter_str);
121+
}
122+
123+
document.getElementById("filterValue").addEventListener("input", filterTasks);
124+
</script>
125+
</div>
72126
<script>
73127
function restoreAll()
74128
{

styles.css

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -869,3 +869,43 @@ i.no-solution-check {
869869
color: red;
870870
margin-left: 5px;
871871
}
872+
873+
.filter-container {
874+
display: flex;
875+
flex-direction: row;
876+
border-radius: 5px;
877+
overflow: hidden;
878+
max-height: min-content;
879+
border: solid;
880+
background-color: whitesmoke;
881+
border-width: 1px;
882+
max-width: 20em;
883+
margin-left: auto;
884+
}
885+
886+
button.search {
887+
max-width: max-content;
888+
border-radius: 0px;
889+
padding: 5px;
890+
height: 100%;
891+
background-color: transparent;
892+
z-index: 1;
893+
}
894+
895+
button.search:hover {
896+
background-color: lightgray;
897+
}
898+
899+
button.search.regex.active {
900+
background-color: rgb(167, 167, 167);
901+
}
902+
903+
input.filter {
904+
border-radius: 0px;
905+
border: none;
906+
margin: 0px;
907+
padding: 5px;
908+
z-index: 0;
909+
background-color: transparent;
910+
outline: none;
911+
}

0 commit comments

Comments
 (0)