update
This commit is contained in:
@ -1,4 +1,8 @@
|
||||
let initialWindowHeight;
|
||||
|
||||
document.addEventListener("DOMContentLoaded", function() {
|
||||
initialWindowHeight = window.innerHeight;
|
||||
|
||||
if (localStorage.getItem("dark-mode") === "true") {
|
||||
document.body.classList.add("dark-mode");
|
||||
document.getElementById('theme-icon').classList.remove('fa-moon');
|
||||
@ -8,6 +12,15 @@ document.addEventListener("DOMContentLoaded", function() {
|
||||
document.getElementById('theme-icon').classList.add('fa-moon');
|
||||
}
|
||||
|
||||
if (localStorage.getItem("view-mode") === "list") {
|
||||
document.body.classList.add("list-mode");
|
||||
document.getElementById('view-mode-icon').classList.remove('fa-list');
|
||||
document.getElementById('view-mode-icon').classList.add('fa-table');
|
||||
} else {
|
||||
document.getElementById('view-mode-icon').classList.remove('fa-table');
|
||||
document.getElementById('view-mode-icon').classList.add('fa-list');
|
||||
}
|
||||
|
||||
document.querySelectorAll('.group').forEach(group => {
|
||||
const groupName = group.id;
|
||||
const collapsed = group.dataset.collapsed === 'true';
|
||||
@ -24,8 +37,30 @@ document.addEventListener("DOMContentLoaded", function() {
|
||||
settingsMenu.classList.remove('visible');
|
||||
}
|
||||
});
|
||||
|
||||
const searchInput = document.getElementById('search-input');
|
||||
searchInput.addEventListener('input', handleSearch);
|
||||
searchInput.addEventListener('keydown', handleKeyDown);
|
||||
|
||||
document.addEventListener('keydown', function(event) {
|
||||
if (event.key === '/') {
|
||||
event.preventDefault();
|
||||
searchInput.focus();
|
||||
}
|
||||
if (event.key === 'Escape' || event.key === 'Esc') {
|
||||
event.preventDefault();
|
||||
clearSearch();
|
||||
searchInput.blur();
|
||||
}
|
||||
});
|
||||
|
||||
window.visualViewport.addEventListener('resize', adjustFooterPosition);
|
||||
});
|
||||
|
||||
function searchFocus() {
|
||||
document.getElementById('search-input').focus()
|
||||
}
|
||||
|
||||
function toggleDarkMode() {
|
||||
document.body.classList.toggle("dark-mode");
|
||||
const themeIcon = document.getElementById('theme-icon');
|
||||
@ -56,3 +91,171 @@ function refreshData() {
|
||||
location.reload();
|
||||
}
|
||||
|
||||
function toggleViewMode() {
|
||||
document.body.classList.toggle("list-mode");
|
||||
const viewModeIcon = document.getElementById('view-mode-icon');
|
||||
if (document.body.classList.contains("list-mode")) {
|
||||
localStorage.setItem("view-mode", "list");
|
||||
viewModeIcon.classList.remove('fa-list');
|
||||
viewModeIcon.classList.add('fa-table');
|
||||
} else {
|
||||
localStorage.setItem("view-mode", "box");
|
||||
viewModeIcon.classList.remove('fa-table');
|
||||
viewModeIcon.classList.add('fa-list');
|
||||
}
|
||||
}
|
||||
|
||||
let selectedRouterIndex = -1;
|
||||
|
||||
function handleSearch(event) {
|
||||
const query = event.target.value.toLowerCase();
|
||||
const groups = document.querySelectorAll('.group');
|
||||
const content = document.getElementById('content');
|
||||
|
||||
// Remove the search group if it exists
|
||||
let searchGroup = document.getElementById('search-group');
|
||||
if (searchGroup) {
|
||||
searchGroup.remove();
|
||||
}
|
||||
|
||||
if (query === '') {
|
||||
// Show all original groups
|
||||
groups.forEach(group => group.style.display = '');
|
||||
selectedRouterIndex = -1;
|
||||
} else {
|
||||
// Hide all original groups
|
||||
groups.forEach(group => group.style.display = 'none');
|
||||
|
||||
// Create and show the search group
|
||||
searchGroup = document.createElement('div');
|
||||
searchGroup.id = 'search-group';
|
||||
searchGroup.className = 'group';
|
||||
content.appendChild(searchGroup);
|
||||
|
||||
searchGroup.innerHTML = `
|
||||
<h2 class="group-title"><i class="fas fa-search"></i> ${query}</h2>
|
||||
<div class="router-container"></div>
|
||||
`;
|
||||
|
||||
const routerContainer = searchGroup.querySelector('.router-container');
|
||||
const matchingRouters = [];
|
||||
|
||||
document.querySelectorAll('.router').forEach(router => {
|
||||
const displayName = router.querySelector('h2').textContent.toLowerCase();
|
||||
if (displayName.includes(query)) {
|
||||
const clonedRouter = router.cloneNode(true);
|
||||
matchingRouters.push(clonedRouter);
|
||||
routerContainer.appendChild(clonedRouter);
|
||||
}
|
||||
});
|
||||
|
||||
if (matchingRouters.length > 0) {
|
||||
selectedRouterIndex = 0;
|
||||
matchingRouters[selectedRouterIndex].classList.add('selected');
|
||||
}
|
||||
|
||||
// Scroll to search group
|
||||
document.getElementById("header").scrollIntoView({ behavior: "instant" });
|
||||
}
|
||||
}
|
||||
|
||||
function handleKeyDown(event) {
|
||||
const searchGroup = document.getElementById('search-group');
|
||||
if (!searchGroup) return;
|
||||
|
||||
const matchingRouters = searchGroup.querySelectorAll('.router');
|
||||
if (matchingRouters.length === 0) return;
|
||||
|
||||
const isListMode = document.body.classList.contains('list-mode');
|
||||
const itemsPerRow = getItemsPerRow();
|
||||
|
||||
switch (event.key) {
|
||||
case 'ArrowDown':
|
||||
event.preventDefault();
|
||||
if (isListMode) {
|
||||
if (selectedRouterIndex < matchingRouters.length - 1) {
|
||||
matchingRouters[selectedRouterIndex].classList.remove('selected');
|
||||
selectedRouterIndex++;
|
||||
matchingRouters[selectedRouterIndex].classList.add('selected');
|
||||
matchingRouters[selectedRouterIndex].scrollIntoView({ behavior: 'smooth', block: 'center' });
|
||||
}
|
||||
} else {
|
||||
if (selectedRouterIndex + itemsPerRow < matchingRouters.length) {
|
||||
matchingRouters[selectedRouterIndex].classList.remove('selected');
|
||||
selectedRouterIndex += itemsPerRow;
|
||||
matchingRouters[selectedRouterIndex].classList.add('selected');
|
||||
matchingRouters[selectedRouterIndex].scrollIntoView({ behavior: 'smooth', block: 'center' });
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'ArrowUp':
|
||||
event.preventDefault();
|
||||
if (isListMode) {
|
||||
if (selectedRouterIndex > 0) {
|
||||
matchingRouters[selectedRouterIndex].classList.remove('selected');
|
||||
selectedRouterIndex--;
|
||||
matchingRouters[selectedRouterIndex].classList.add('selected');
|
||||
matchingRouters[selectedRouterIndex].scrollIntoView({ behavior: 'smooth', block: 'center' });
|
||||
}
|
||||
} else {
|
||||
if (selectedRouterIndex - itemsPerRow >= 0) {
|
||||
matchingRouters[selectedRouterIndex].classList.remove('selected');
|
||||
selectedRouterIndex -= itemsPerRow;
|
||||
matchingRouters[selectedRouterIndex].classList.add('selected');
|
||||
matchingRouters[selectedRouterIndex].scrollIntoView({ behavior: 'smooth', block: 'center' });
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'ArrowRight':
|
||||
if (!isListMode) {
|
||||
event.preventDefault();
|
||||
if (selectedRouterIndex < matchingRouters.length - 1) {
|
||||
matchingRouters[selectedRouterIndex].classList.remove('selected');
|
||||
selectedRouterIndex++;
|
||||
matchingRouters[selectedRouterIndex].classList.add('selected');
|
||||
matchingRouters[selectedRouterIndex].scrollIntoView({ behavior: 'smooth', block: 'center' });
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'ArrowLeft':
|
||||
if (!isListMode) {
|
||||
event.preventDefault();
|
||||
if (selectedRouterIndex > 0) {
|
||||
matchingRouters[selectedRouterIndex].classList.remove('selected');
|
||||
selectedRouterIndex--;
|
||||
matchingRouters[selectedRouterIndex].classList.add('selected');
|
||||
matchingRouters[selectedRouterIndex].scrollIntoView({ behavior: 'smooth', block: 'center' });
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'Enter':
|
||||
event.preventDefault();
|
||||
if (selectedRouterIndex >= 0 && selectedRouterIndex < matchingRouters.length) {
|
||||
matchingRouters[selectedRouterIndex].click();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
function getItemsPerRow() {
|
||||
const width = window.innerWidth;
|
||||
if (width <= 480) return 1;
|
||||
if (width <= 1024) return 2;
|
||||
return 3;
|
||||
}
|
||||
|
||||
function clearSearch() {
|
||||
const searchInput = document.getElementById('search-input');
|
||||
searchInput.value = '';
|
||||
handleSearch({ target: searchInput });
|
||||
}
|
||||
|
||||
function adjustFooterPosition() {
|
||||
const footer = document.querySelector('.footer');
|
||||
const visualViewportHeight = window.visualViewport.height;
|
||||
const bottomOffset = window.innerHeight - visualViewportHeight;
|
||||
|
||||
// Set the bottom position
|
||||
footer.style.bottom = `${bottomOffset}px`;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user