Skip to content

Commit 34b0298

Browse files
committed
refactor(defaultTheme): refine filter logic
use `NodeList.foreach()` instead of iterate manually.
1 parent 4846faf commit 34b0298

File tree

3 files changed

+43
-45
lines changed

3 files changed

+43
-45
lines changed

src/tpl/defaultTheme/frontend/index.css

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ em {
9191
border-radius: 3px;
9292
}
9393

94-
.none, :root body .none {
94+
.none {
9595
display: none;
9696
}
9797

@@ -395,7 +395,6 @@ html.dragging::before {
395395
}
396396

397397
.filter button {
398-
display: none;
399398
position: absolute;
400399
right: 0;
401400
top: 0;

src/tpl/defaultTheme/frontend/index.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,8 @@
9292
{{if .SubItemsHtml}}
9393
<div class="panel filter">
9494
<div class="form">
95-
<input type="text" accesskey="r" placeholder="{{.Trans.FilterLabel}}"/>
96-
<button type="reset">X</button>
95+
<input type="text" name="filter" accesskey="r" placeholder="{{.Trans.FilterLabel}}"/>
96+
<button type="reset" class="none">&#215</button>
9797
</div>
9898
</div>
9999
{{end}}

src/tpl/defaultTheme/frontend/index.js

Lines changed: 40 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@
55
var classNone = 'none';
66
var classHeader = 'header';
77

8-
var selectorNone = '.' + classNone;
9-
var selectorNotNone = ':not(' + selectorNone + ')';
8+
var selectorIsNone = '.' + classNone;
9+
var selectorNotNone = ':not(' + selectorIsNone + ')';
1010
var selectorItem = '.item-list > li:not(.' + classHeader + '):not(.parent)';
11-
var selectorItemNone = selectorItem + selectorNone;
11+
var selectorItemIsNone = selectorItem + selectorIsNone;
1212
var selectorItemNotNone = selectorItem + selectorNotNone;
1313

1414
var leavingEvent = typeof window.onpagehide !== strUndef ? 'pagehide' : 'beforeunload';
@@ -34,61 +34,58 @@
3434
var lastFocused;
3535

3636
function enableFilter() {
37-
// pre check
3837
var filter = document.body.querySelector('.filter');
39-
if (!filter) {
40-
return;
41-
}
38+
if (!filter) return;
4239

4340
var input = filter.querySelector('input');
44-
if (!input) {
45-
return;
46-
}
41+
if (!input) return;
4742

4843
var clear = filter.querySelector('button');
4944

50-
// event handler
5145
var timeoutId;
5246
var lastFilterText = '';
5347
var doFilter = function () {
5448
var filterText = input.value.trim().toLowerCase();
55-
if (filterText === lastFilterText) {
56-
return;
57-
}
58-
59-
var selector, items, i;
49+
if (filterText === lastFilterText) return;
6050

61-
if (!filterText) { // filter cleared, show all items
51+
var items
52+
if (filterText) {
6253
if (clear) {
63-
clear.style.display = '';
64-
}
65-
selector = selectorItemNone;
66-
items = document.body.querySelectorAll(selector);
67-
for (i = items.length - 1; i >= 0; i--) {
68-
items[i].classList.remove(classNone);
69-
}
70-
} else {
71-
if (clear) {
72-
clear.style.display = 'block';
54+
clear.classList.remove(classNone)
7355
}
56+
57+
var selector
7458
if (filterText.indexOf(lastFilterText) >= 0) { // increment search, find in visible items
7559
selector = selectorItemNotNone;
7660
} else if (lastFilterText.indexOf(filterText) >= 0) { // decrement search, find in hidden items
77-
selector = selectorItemNone;
61+
selector = selectorItemIsNone;
7862
} else {
7963
selector = selectorItem;
8064
}
8165

8266
items = document.body.querySelectorAll(selector);
83-
for (i = items.length - 1; i >= 0; i--) {
84-
var item = items[i];
67+
if (!items.forEach) items = Array.prototype.slice.call(items); // IE9+/ClassicEdge
68+
items.forEach(function (item) {
8569
var name = item.querySelector('.name');
86-
if (name && name.textContent.toLowerCase().indexOf(filterText) < 0) {
87-
item.classList.add(classNone);
70+
if (name.textContent.toLowerCase().indexOf(filterText) < 0) {
71+
if (selector !== selectorItemIsNone) {
72+
item.classList.add(classNone);
73+
}
8874
} else {
89-
item.classList.remove(classNone);
75+
if (selector !== selectorItemNotNone) {
76+
item.classList.remove(classNone);
77+
}
9078
}
79+
});
80+
} else { // filter cleared, show all items
81+
if (clear) {
82+
clear.classList.add(classNone)
9183
}
84+
items = document.body.querySelectorAll(selectorItemIsNone);
85+
if (!items.forEach) items = Array.prototype.slice.call(items); // IE9+/ClassicEdge
86+
items.forEach(function (item) {
87+
item.classList.remove(classNone);
88+
});
9289
}
9390

9491
lastFilterText = filterText;
@@ -98,8 +95,8 @@
9895
clearTimeout(timeoutId);
9996
timeoutId = setTimeout(doFilter, 350);
10097
};
101-
input.addEventListener('input', onValueMayChange, false);
102-
input.addEventListener('change', onValueMayChange, false);
98+
input.addEventListener('input', onValueMayChange);
99+
input.addEventListener('change', onValueMayChange);
103100

104101
var onEnter = function () {
105102
clearTimeout(timeoutId);
@@ -124,7 +121,7 @@
124121
e.preventDefault();
125122
break;
126123
}
127-
}, false);
124+
});
128125

129126
clear && clear.addEventListener('click', function () {
130127
clearTimeout(timeoutId);
@@ -136,17 +133,19 @@
136133
// init
137134
if (hasStorage) {
138135
var prevSessionFilter = sessionStorage.getItem(location.pathname);
139-
sessionStorage.removeItem(location.pathname);
136+
if (prevSessionFilter) {
137+
input.value = prevSessionFilter;
138+
}
139+
if (prevSessionFilter !== null) {
140+
sessionStorage.removeItem(location.pathname);
141+
}
140142

141143
window.addEventListener(leavingEvent, function () {
142144
if (input.value) {
143145
sessionStorage.setItem(location.pathname, input.value);
144146
}
145-
}, false);
147+
});
146148

147-
if (prevSessionFilter) {
148-
input.value = prevSessionFilter;
149-
}
150149
}
151150
if (input.value) {
152151
doFilter();

0 commit comments

Comments
 (0)