mirror of
https://github.com/Stirling-Tools/Stirling-PDF.git
synced 2025-06-23 16:05:09 +00:00

# Description of Changes Migrated Stirling PDF to a multi-module structure: * Introduced new `:stirling-pdf` module * Moved all the core logic and features of Stirling PDF into `:stirling-pdf` * Updated paths of jobs and scripts --- ## Checklist ### General - [ ] I have read the [Contribution Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md) - [ ] I have read the [Stirling-PDF Developer Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md) (if applicable) - [ ] I have read the [How to add new languages to Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md) (if applicable) - [ ] I have performed a self-review of my own code - [ ] My changes generate no new warnings ### Documentation - [ ] I have updated relevant docs on [Stirling-PDF's doc repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/) (if functionality has heavily changed) - [ ] I have read the section [Add New Translation Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md#add-new-translation-tags) (for new translation tags only) ### UI Changes (if applicable) - [ ] Screenshots or videos demonstrating the UI changes are attached (e.g., as comments or direct attachments in the PR) ### Testing (if applicable) - [ ] I have tested my changes locally. Refer to the [Testing Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md#6-testing) for more details.
246 lines
8.2 KiB
JavaScript
246 lines
8.2 KiB
JavaScript
function filterCards() {
|
|
var input = document.getElementById('searchBar');
|
|
var filter = input.value.toUpperCase().trim();
|
|
|
|
// Split the input filter into individual words for multi-word matching
|
|
var filterWords = filter.split(/[\s,;.\-]+/);
|
|
|
|
let featureGroups = document.querySelectorAll('.feature-group');
|
|
for (const featureGroup of featureGroups) {
|
|
var cards = featureGroup.querySelectorAll('.dropdown-item');
|
|
|
|
let groupMatchesFilter = false;
|
|
for (var i = 0; i < cards.length; i++) {
|
|
var card = cards[i];
|
|
var title = card.getAttribute('title') || '';
|
|
|
|
// Get the navbar tags associated with the card
|
|
var navbarItem = document.querySelector(`a.dropdown-item[href="${card.id}"]`);
|
|
var navbarTags = navbarItem ? navbarItem.getAttribute('data-bs-tags') : '';
|
|
navbarTags = navbarItem ? navbarTags + ',' + navbarItem.getAttribute('data-bs-title') + ',' + navbarItem.children[0].getAttribute('data-title') : navbarTags;
|
|
|
|
var content = (title + ' ' + navbarTags).toUpperCase();
|
|
|
|
// Check if all words in the filter match the content
|
|
var matches = filterWords.every((word) => content.includes(word));
|
|
|
|
if (matches) {
|
|
card.style.display = '';
|
|
groupMatchesFilter = true;
|
|
} else {
|
|
card.style.display = 'none';
|
|
}
|
|
}
|
|
|
|
if (!groupMatchesFilter) {
|
|
featureGroup.style.display = 'none';
|
|
} else {
|
|
featureGroup.style.display = '';
|
|
}
|
|
}
|
|
}
|
|
|
|
function updateFavoritesSection() {
|
|
const favoritesContainer = document.getElementById('groupFavorites').querySelector('.nav-group-container');
|
|
favoritesContainer.innerHTML = '';
|
|
let favoritesAmount = 0;
|
|
const favouritesList = JSON.parse(localStorage.getItem('favoritesList') || '[]');
|
|
const isFavoritesView = JSON.parse(localStorage.getItem('favoritesView') || 'false');
|
|
|
|
favouritesList.forEach((value) => {
|
|
var navbarEntry = document.querySelector(`a[data-bs-link='${value}']`);
|
|
if (navbarEntry) {
|
|
const duplicate = navbarEntry.cloneNode(true);
|
|
favoritesContainer.appendChild(duplicate);
|
|
}
|
|
favoritesAmount++;
|
|
});
|
|
|
|
if (favoritesAmount === 0 || !isFavoritesView) {
|
|
document.getElementById('groupFavorites').style.display = 'none';
|
|
} else {
|
|
document.getElementById('groupFavorites').style.display = 'flex';
|
|
}
|
|
reorderCards(favoritesContainer);
|
|
//favoritesContainer.style.maxHeight = favoritesContainer.scrollHeight + 'px';
|
|
}
|
|
|
|
function reorderCards(container) {
|
|
var cards = Array.from(container.querySelectorAll('.dropdown-item'));
|
|
cards.forEach(function (card) {
|
|
container.removeChild(card);
|
|
});
|
|
cards.sort(function (a, b) {
|
|
var aIsFavorite = localStorage.getItem(a.id) === 'favorite';
|
|
var bIsFavorite = localStorage.getItem(b.id) === 'favorite';
|
|
|
|
if (aIsFavorite && !bIsFavorite) {
|
|
return -1;
|
|
} else if (!aIsFavorite && bIsFavorite) {
|
|
return 1;
|
|
} else {
|
|
return a.id > b.id;
|
|
}
|
|
});
|
|
cards.forEach(function (card) {
|
|
container.appendChild(card);
|
|
});
|
|
}
|
|
|
|
function initializeCards() {
|
|
updateFavoritesSection();
|
|
updateFavoritesView();
|
|
updateFavoritesDropdown();
|
|
filterCards();
|
|
}
|
|
|
|
function updateFavoritesView() {
|
|
const isFavoritesView = JSON.parse(localStorage.getItem('favoritesView') || 'false');
|
|
const iconElement = document.getElementById('toggle-favourites-icon');
|
|
const favoritesGroup = document.querySelector('#groupFavorites');
|
|
const favoritesList = JSON.parse(localStorage.getItem('favoritesList')) || [];
|
|
|
|
if (isFavoritesView && favoritesList.length > 0) {
|
|
document.getElementById('favouritesVisibility').style.display = 'flex';
|
|
favoritesGroup.style.display = 'flex';
|
|
} else {
|
|
if (favoritesList.length > 0) {
|
|
document.getElementById('favouritesVisibility').style.display = 'flex';
|
|
favoritesGroup.style.display = 'none';
|
|
} else {
|
|
document.getElementById('favouritesVisibility').style.display = 'none';
|
|
}
|
|
}
|
|
}
|
|
|
|
function toggleFavoritesMode() {
|
|
const favoritesMode = !document.querySelector('.toggle-favourites').classList.contains('active');
|
|
document.querySelector('.toggle-favourites').classList.toggle('active', favoritesMode);
|
|
|
|
document.querySelectorAll('.favorite-icon').forEach((icon) => {
|
|
const endpoint = icon.getAttribute('data-endpoint');
|
|
const parent = icon.closest('.dropdown-item');
|
|
const isInGroupRecent = parent.closest('#groupRecent') !== null;
|
|
const isInGroupFavorites = parent.closest('#groupFavorites') !== null;
|
|
|
|
if (isInGroupRecent) {
|
|
icon.style.display = 'none';
|
|
} else if (isInGroupFavorites) {
|
|
icon.style.display = favoritesMode ? 'inline-block' : 'none';
|
|
icon.textContent = 'close_small';
|
|
} else {
|
|
icon.style.display = favoritesMode ? 'inline-block' : 'none';
|
|
|
|
const favoritesList = JSON.parse(localStorage.getItem('favoritesList')) || [];
|
|
icon.textContent = favoritesList.includes(endpoint) ? 'close_small' : 'add';
|
|
}
|
|
});
|
|
|
|
document.querySelectorAll('.dropdown-item').forEach((link) => {
|
|
if (favoritesMode) {
|
|
link.dataset.originalHref = link.getAttribute('href');
|
|
link.setAttribute('href', '#');
|
|
link.classList.add('no-hover');
|
|
} else {
|
|
link.setAttribute('href', link.dataset.originalHref || '#');
|
|
link.classList.remove('no-hover');
|
|
}
|
|
});
|
|
|
|
const isFavoritesView = JSON.parse(localStorage.getItem('favoritesView') || 'false');
|
|
if (favoritesMode && !isFavoritesView) {
|
|
toggleFavoritesView();
|
|
}
|
|
}
|
|
|
|
function toggleFavoritesView() {
|
|
const isFavoritesView = JSON.parse(localStorage.getItem('favoritesView') || 'false');
|
|
localStorage.setItem('favoritesView', !isFavoritesView);
|
|
updateFavoritesView();
|
|
}
|
|
window.onload = function () {
|
|
initializeCards();
|
|
};
|
|
|
|
function sortNavElements(criteria) {
|
|
document.querySelectorAll('.nav-group-container').forEach((container) => {
|
|
const items = Array.from(container.children);
|
|
|
|
items.sort((a, b) => {
|
|
if (criteria === 'alphabetical') {
|
|
const titleA = a.querySelector('.icon-text')?.textContent.trim().toLowerCase() || '';
|
|
const titleB = b.querySelector('.icon-text')?.textContent.trim().toLowerCase() || '';
|
|
return titleA.localeCompare(titleB);
|
|
} else if (criteria === 'global') {
|
|
const popularityA = parseInt(a.dataset.popularity, 10) || 1000;
|
|
const popularityB = parseInt(b.dataset.popularity, 10) || 1000;
|
|
return popularityA - popularityB;
|
|
}
|
|
return 0;
|
|
});
|
|
container.innerHTML = '';
|
|
items.forEach((item) => container.appendChild(item));
|
|
});
|
|
}
|
|
|
|
async function fetchPopularityData(url) {
|
|
const response = await fetch(url);
|
|
if (!response.ok) {
|
|
throw new Error(`HTTP error! status: ${response.status}`);
|
|
}
|
|
return await response.text();
|
|
}
|
|
|
|
function applyPopularityData(popularityData) {
|
|
document.querySelectorAll('.dropdown-item').forEach((item) => {
|
|
const endpoint = item.getAttribute('data-bs-link');
|
|
const popularity = popularityData['/' + endpoint];
|
|
if (endpoint && popularity !== undefined) {
|
|
item.setAttribute('data-popularity', popularity);
|
|
}
|
|
});
|
|
const currentSort = localStorage.getItem('homepageSort') || 'alphabetical';
|
|
const sortDropdown = document.getElementById('sort-options');
|
|
if (sortDropdown) {
|
|
sortDropdown.value = currentSort;
|
|
``;
|
|
}
|
|
sortNavElements(currentSort);
|
|
}
|
|
document.addEventListener('DOMContentLoaded', async function () {
|
|
const sortDropdown = document.getElementById('sort-options');
|
|
if (sortDropdown) {
|
|
sortDropdown.addEventListener('change', (event) => {
|
|
const selectedOption = event.target.value;
|
|
localStorage.setItem('homepageSort', selectedOption);
|
|
|
|
sortNavElements(selectedOption);
|
|
});
|
|
}
|
|
try {
|
|
const response = await fetch('files/popularity.txt');
|
|
if (!response.ok) {
|
|
throw new Error(`HTTP error! status: ${response.status}`);
|
|
}
|
|
const popularityData = await response.json();
|
|
applyPopularityData(popularityData);
|
|
} catch (error) {
|
|
console.error('Error loading popularity data:', error);
|
|
}
|
|
|
|
const materialIcons = new FontFaceObserver('Material Symbols Rounded');
|
|
|
|
materialIcons
|
|
.load()
|
|
.then(() => {
|
|
document.querySelectorAll('.dropdown-item.hidden').forEach((el) => {
|
|
el.classList.remove('hidden');
|
|
});
|
|
})
|
|
.catch(() => {
|
|
console.error('Material Symbols Rounded font failed to load.');
|
|
});
|
|
|
|
|
|
});
|