Skip to content

Commit f5f2fd9

Browse files
committed
feat: added sort by time solved at asc and desc
1 parent 838d662 commit f5f2fd9

File tree

2 files changed

+27
-13
lines changed

2 files changed

+27
-13
lines changed

options/options.html

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,10 @@ <h2>All Solved Problems</h2>
3131
<div class="problems-toolbar">
3232
<input type="text" id="searchInput" placeholder="Search by title...">
3333
<div id="tagDropdownContainer"></div>
34+
<select id="sortDropdown" style="margin-left:8px;">
35+
<option value="recent-desc">Most recently solved</option>
36+
<option value="recent-asc">Least recently solved</option>
37+
</select>
3438
</div>
3539
<div id="problemsList"></div>
3640
</section>

options/options.js

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,15 @@ document.addEventListener('DOMContentLoaded', () => {
1313
});
1414
});
1515

16+
const sortDropdown = document.getElementById('sortDropdown');
17+
1618
// All Problems: load and render problems
1719
const problemsList = document.getElementById('problemsList');
1820
const searchInput = document.getElementById('searchInput');
1921
const tagDropdownContainer = document.getElementById('tagDropdownContainer');
2022
let tagDropdownInstance = null;
2123

22-
function renderProblems(problems, filterTag, searchTerm) {
24+
function renderProblems(problems, filterTag, searchTerm, sortOrder = 'recent-desc') {
2325
problemsList.innerHTML = '';
2426
let filtered = problems;
2527
if (filterTag && filterTag !== 'all') {
@@ -28,31 +30,33 @@ document.addEventListener('DOMContentLoaded', () => {
2830
if (searchTerm) {
2931
filtered = filtered.filter(p => p.title.toLowerCase().includes(searchTerm.toLowerCase()));
3032
}
33+
// Sorting
34+
if (sortOrder === 'recent-desc') {
35+
filtered.sort((a, b) => (b.solvedAt || 0) - (a.solvedAt || 0));
36+
} else if (sortOrder === 'recent-asc') {
37+
filtered.sort((a, b) => (a.solvedAt || 0) - (b.solvedAt || 0));
38+
}
3139
if (filtered.length === 0) {
3240
problemsList.innerHTML = '<p>No problems found.</p>';
3341
}
3442
filtered.forEach(problem => {
3543
const item = document.createElement('div');
3644
item.className = 'problem-item';
3745
const difficultyClass = problem.difficulty ? problem.difficulty.toLowerCase() : '';
38-
// Use DOM methods instead of innerHTML for safety
3946
const link = document.createElement('a');
4047
link.href = problem.url;
4148
link.target = '_blank';
4249
link.textContent = problem.title;
43-
4450
const diffSpan = document.createElement('span');
4551
diffSpan.className = `difficulty ${difficultyClass}`;
4652
diffSpan.textContent = problem.difficulty;
47-
4853
const tagsSpan = document.createElement('span');
4954
tagsSpan.style.fontSize = '0.85em';
5055
tagsSpan.style.color = problem.tags && problem.tags.length > 0 ? '#666' : '#bbb';
5156
tagsSpan.style.marginLeft = '8px';
5257
tagsSpan.textContent = problem.tags && problem.tags.length > 0
5358
? `[${problem.tags.join(', ')}]`
5459
: '[No tags]';
55-
5660
item.appendChild(link);
5761
item.appendChild(diffSpan);
5862
item.appendChild(tagsSpan);
@@ -77,20 +81,26 @@ document.addEventListener('DOMContentLoaded', () => {
7781
}
7882
});
7983
const allTags = Array.from(tagSet).sort((a, b) => a.localeCompare(b));
84+
let currentProblems = problems; // Store for re-sorting/filtering
85+
function rerender() {
86+
renderProblems(
87+
currentProblems,
88+
tagDropdownInstance ? tagDropdownInstance.selectedTag : 'all',
89+
searchInput.value,
90+
sortDropdown.value
91+
);
92+
}
8093
if (tagDropdownInstance) {
8194
tagDropdownInstance.setTags(allTags);
8295
} else {
83-
tagDropdownInstance = new window.TagDropdown(tagDropdownContainer, allTags, (selectedTag) => {
84-
renderProblems(problems, selectedTag, searchInput.value);
85-
});
96+
tagDropdownInstance = new window.TagDropdown(tagDropdownContainer, allTags, () => rerender());
8697
}
8798
// Initial render
88-
renderProblems(problems, tagDropdownInstance ? tagDropdownInstance.selectedTag : 'all', searchInput.value);
99+
rerender();
89100
// Event listeners
90-
searchInput.addEventListener('input', () => {
91-
renderProblems(problems, tagDropdownInstance ? tagDropdownInstance.selectedTag : 'all', searchInput.value);
92-
});
93-
// set extension version in About section
101+
searchInput.addEventListener('input', rerender);
102+
sortDropdown.addEventListener('change', rerender);
103+
94104
const extVersionElem = document.getElementById('extVersion');
95105
if (extVersionElem && browser.runtime.getManifest) {
96106
const manifest = browser.runtime.getManifest();

0 commit comments

Comments
 (0)