diff --git a/.gitignore b/.gitignore
index 593879c2d..c3fd092b0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,5 @@
+.idea
+
# build output
dist/
.output/
diff --git a/src/components/RoadmapHint.astro b/src/components/RoadmapHint.astro
index fa22ef1c7..eca421903 100644
--- a/src/components/RoadmapHint.astro
+++ b/src/components/RoadmapHint.astro
@@ -1,4 +1,6 @@
---
+import { ClearProgress } from './Activity/ClearProgress';
+import AstroIcon from './AstroIcon.astro';
import Icon from './AstroIcon.astro';
export interface Props {
@@ -42,30 +44,25 @@ const roadmapTitle =
}
-
-
- New
- Track your progress and learn by clicking roadmap items.
-
+
+
+ 0% Done
+
-
-
- Search Topics
-
+ 0 completed·
+ 0 learning·
+ 0 skipped·
+ 0 Total
+
@@ -74,4 +71,4 @@ const roadmapTitle =
>
Track your progress and learn about the topics by clicking the roadmap items.
-
+
\ No newline at end of file
diff --git a/src/components/TopicDetail/TopicProgressButton.tsx b/src/components/TopicDetail/TopicProgressButton.tsx
index 65237df59..80844d736 100644
--- a/src/components/TopicDetail/TopicProgressButton.tsx
+++ b/src/components/TopicDetail/TopicProgressButton.tsx
@@ -8,6 +8,7 @@ import {
ResourceProgressType,
ResourceType,
getTopicStatus,
+ refreshProgressCounters,
renderTopicProgress,
updateResourceProgress,
} from '../../lib/resource-progress';
@@ -135,6 +136,7 @@ export function TopicProgressButton(props: TopicProgressButtonProps) {
setProgress(progress);
onClose();
renderTopicProgress(topicId, progress);
+ refreshProgressCounters();
})
.catch((err) => {
alert(err.message);
diff --git a/src/lib/resource-progress.ts b/src/lib/resource-progress.ts
index fccd508f1..fe6c616f2 100644
--- a/src/lib/resource-progress.ts
+++ b/src/lib/resource-progress.ts
@@ -223,4 +223,61 @@ export async function renderResourceProgress(
skipped.forEach((topicId) => {
renderTopicProgress(topicId, 'skipped');
});
+
+ refreshProgressCounters();
+}
+
+export function refreshProgressCounters() {
+ const progressNumsContainer = document.getElementById('progress-nums-container');
+ const progressNums = document.getElementById('progress-nums');
+ if (!progressNumsContainer || !progressNums) {
+ return;
+ }
+
+ const totalClickable = document.querySelectorAll('.clickable-group').length;
+ const externalLinks = document.querySelectorAll(
+ '[data-group-id^="ext_link:"]'
+ ).length;
+ const roadmapSwitchers = document.querySelectorAll(
+ '[data-group-id^="json:"]'
+ ).length;
+
+ const totalItems = totalClickable - externalLinks - roadmapSwitchers;
+ const totalDone = document.querySelectorAll('.clickable-group.done').length;
+ const totalLearning = document.querySelectorAll(
+ '.clickable-group.learning'
+ ).length;
+ const totalSkipped = document.querySelectorAll(
+ '.clickable-group.skipped'
+ ).length;
+
+ const doneCountEl = document.querySelector('.progress-done');
+ if (doneCountEl) {
+ doneCountEl.innerHTML = `${totalDone}`;
+ }
+
+ const learningCountEl = document.querySelector('.progress-learning');
+ if (learningCountEl) {
+ learningCountEl.innerHTML = `${totalLearning}`;
+ }
+
+ const skippedCountEl = document.querySelector('.progress-skipped');
+ if (skippedCountEl) {
+ skippedCountEl.innerHTML = `${totalSkipped}`;
+ }
+
+ const totalCountEl = document.querySelector('.progress-total');
+ if (totalCountEl) {
+ totalCountEl.innerHTML = `${totalItems}`;
+ }
+
+ const progressPercentage = Math.round(((totalDone + totalSkipped) / totalItems) * 100);
+ const progressPercentageEl = document.querySelector('.progress-percentage');
+ if (progressPercentageEl) {
+ progressPercentageEl.innerHTML = `${progressPercentage}`;
+ }
+
+ progressNumsContainer.classList.remove('striped-loader')
+ progressNums.classList.remove('opacity-0');
+ progressNums.classList.remove('opacity-100');
}
diff --git a/src/styles/global.css b/src/styles/global.css
index ba9c6535c..12bce1559 100644
--- a/src/styles/global.css
+++ b/src/styles/global.css
@@ -63,3 +63,21 @@ a > code:before {
)
hsla(203, 11%, 95%, 0.4);
}
+
+.striped-loader {
+ background-image: repeating-linear-gradient(
+ -45deg,
+ transparent,
+ transparent 5px,
+ hsla(0, 0%, 0%, 0.025) 5px,
+ hsla(0, 0%, 0%, 0.025) 10px
+ );
+ background-size: 200% 200%;
+ animation: barberpole 15s linear infinite;
+}
+
+@keyframes barberpole {
+ 100% {
+ background-position: 100% 100%;
+ }
+}
\ No newline at end of file