mirror of
https://github.com/System-End/YSWS-Catalog.git
synced 2026-04-19 19:55:07 +00:00
Improve user experience with enhanced completion tracking and status clarity
- Add "You Completed" and "Not Completed" program filters - Rename "Completed" category to "Ended" for better status clarity
This commit is contained in:
parent
30e2afb470
commit
1dc261c5fb
3 changed files with 72 additions and 8 deletions
|
|
@ -212,7 +212,9 @@
|
|||
<button class="filter-btn" data-category="active">Active</button>
|
||||
<button class="filter-btn" data-category="ending-soon">Ending Soon</button>
|
||||
<button class="filter-btn" data-category="draft">Draft</button>
|
||||
<button class="filter-btn" data-category="completed">Completed</button>
|
||||
<button class="filter-btn" data-category="ended">Ended</button>
|
||||
<button class="filter-btn user-filter" data-category="user-completed">You Completed</button>
|
||||
<button class="filter-btn user-filter" data-category="user-not-completed">Not Completed</button>
|
||||
</div>
|
||||
|
||||
<div class="sort-container">
|
||||
|
|
|
|||
16
script.js
16
script.js
|
|
@ -185,14 +185,14 @@ async function loadPrograms() {
|
|||
const response = await fetch('data.yml').then(res => res.text());
|
||||
const rawPrograms = jsyaml.load(response);
|
||||
|
||||
const completed = [];
|
||||
const ended = [];
|
||||
programs = Object.fromEntries(
|
||||
Object.entries(rawPrograms).map(([category, programsList]) => [
|
||||
category,
|
||||
(programsList && Array.isArray(programsList)) ?
|
||||
programsList.filter(program => {
|
||||
if (program.status === 'completed' || isEventEnded(program.deadline)) {
|
||||
completed.push({ ...program, status: 'completed' });
|
||||
ended.push({ ...program, status: 'completed' });
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
|
|
@ -201,8 +201,8 @@ async function loadPrograms() {
|
|||
);
|
||||
|
||||
delete programs['Completed'];
|
||||
if (completed.length > 0) {
|
||||
programs['Completed'] = completed;
|
||||
if (ended.length > 0) {
|
||||
programs['Ended'] = ended;
|
||||
}
|
||||
|
||||
programs = Object.fromEntries(
|
||||
|
|
@ -551,6 +551,8 @@ function filterPrograms(category) {
|
|||
const statusElement = card.querySelector('.program-status');
|
||||
const deadlineElement = card.querySelector('.program-deadline');
|
||||
const status = statusElement.textContent;
|
||||
const programName = card.getAttribute('data-name');
|
||||
const isCompletedByUser = completedPrograms.has(programName);
|
||||
|
||||
if (category === 'all') {
|
||||
card.classList.remove('hidden-by-filter');
|
||||
|
|
@ -559,6 +561,12 @@ function filterPrograms(category) {
|
|||
['urgent', 'very-urgent'].some(cls =>
|
||||
deadlineElement.classList.contains(cls));
|
||||
card.classList.toggle('hidden-by-filter', !isEndingSoon);
|
||||
} else if (category === 'user-completed') {
|
||||
card.classList.toggle('hidden-by-filter', !isCompletedByUser);
|
||||
} else if (category === 'user-not-completed') {
|
||||
card.classList.toggle('hidden-by-filter', isCompletedByUser);
|
||||
} else if (category === 'ended') {
|
||||
card.classList.toggle('hidden-by-filter', status !== 'completed');
|
||||
} else {
|
||||
card.classList.toggle('hidden-by-filter', status !== category);
|
||||
}
|
||||
|
|
|
|||
60
styles.css
60
styles.css
|
|
@ -795,6 +795,33 @@ td {
|
|||
color: var(--white);
|
||||
}
|
||||
|
||||
.filter-btn.user-filter {
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
border: 1px solid var(--primary);
|
||||
background: rgba(236, 55, 80, 0.1);
|
||||
transition: all 0.3s ease;
|
||||
}
|
||||
|
||||
.filter-btn.user-filter::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: linear-gradient(90deg,
|
||||
rgba(255, 255, 255, 0) 0%,
|
||||
rgba(255, 255, 255, 0.1) 50%,
|
||||
rgba(255, 255, 255, 0) 100%);
|
||||
transform: translateX(-100%);
|
||||
transition: transform 0.8s ease;
|
||||
}
|
||||
|
||||
.filter-btn.user-filter:hover::before {
|
||||
transform: translateX(100%);
|
||||
}
|
||||
|
||||
.category-section.hidden {
|
||||
display: none;
|
||||
}
|
||||
|
|
@ -1998,9 +2025,9 @@ html {
|
|||
gap: 5px;
|
||||
font-size: var(--font-1);
|
||||
font-weight: var(--font-weight-bold);
|
||||
color: var(--green);
|
||||
background: rgba(51, 214, 166, 0.1);
|
||||
border: 1px solid var(--green);
|
||||
color: var(--white);
|
||||
background: linear-gradient(135deg, var(--green) 0%, #25a080 100%);
|
||||
border: none;
|
||||
padding: var(--spacing-1) var(--spacing-2);
|
||||
border-radius: var(--radii-circle);
|
||||
margin-right: var(--spacing-2);
|
||||
|
|
@ -2009,6 +2036,29 @@ html {
|
|||
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
||||
pointer-events: none;
|
||||
visibility: hidden;
|
||||
box-shadow: 0 2px 8px rgba(51, 214, 166, 0.3);
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
z-index: 2;
|
||||
}
|
||||
|
||||
.user-completed-badge::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: linear-gradient(90deg, rgba(255,255,255,0) 0%, rgba(255,255,255,0.2) 50%, rgba(255,255,255,0) 100%);
|
||||
transform: translateX(-100%);
|
||||
animation: shimmer 2s infinite;
|
||||
z-index: -1;
|
||||
}
|
||||
|
||||
@keyframes shimmer {
|
||||
100% {
|
||||
transform: translateX(100%);
|
||||
}
|
||||
}
|
||||
|
||||
.user-completed-badge.visible {
|
||||
|
|
@ -2017,6 +2067,10 @@ html {
|
|||
visibility: visible;
|
||||
}
|
||||
|
||||
.user-completed-badge svg {
|
||||
filter: drop-shadow(0 0 2px rgba(255, 255, 255, 0.5));
|
||||
}
|
||||
|
||||
.status-container {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue