Upload folder using huggingface_hub
Browse files- client/src/index.css +9 -0
- client/src/pages/TutorialTasks.tsx +10 -10
- client/src/pages/WeeklyPractice.tsx +11 -10
client/src/index.css
CHANGED
|
@@ -105,6 +105,15 @@
|
|
| 105 |
}
|
| 106 |
}
|
| 107 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 108 |
/* Chrome-only performance and alignment tweaks (gated) */
|
| 109 |
html.is-chrome body, html.is-chrome #root {
|
| 110 |
will-change: scroll-position;
|
|
|
|
| 105 |
}
|
| 106 |
}
|
| 107 |
|
| 108 |
+
/* Minimal toggle switch (based on W3Schools How-To: Toggle Switch) */
|
| 109 |
+
/* https://www.w3schools.com/howto/howto_css_switch.asp */
|
| 110 |
+
.switch { position: relative; display: inline-block; width: 44px; height: 24px; }
|
| 111 |
+
.switch input { opacity: 0; width: 0; height: 0; }
|
| 112 |
+
.slider { position: absolute; cursor: pointer; top: 0; left: 0; right: 0; bottom: 0; background-color: #d1d5db; transition: .2s; border-radius: 9999px; }
|
| 113 |
+
.slider:before { position: absolute; content: ""; height: 18px; width: 18px; left: 3px; bottom: 3px; background-color: white; transition: .2s; border-radius: 9999px; }
|
| 114 |
+
input:checked + .slider { background-color: #10b981; }
|
| 115 |
+
input:checked + .slider:before { transform: translateX(20px); }
|
| 116 |
+
|
| 117 |
/* Chrome-only performance and alignment tweaks (gated) */
|
| 118 |
html.is-chrome body, html.is-chrome #root {
|
| 119 |
will-change: scroll-position;
|
client/src/pages/TutorialTasks.tsx
CHANGED
|
@@ -1129,20 +1129,20 @@ const TutorialTasks: React.FC = () => {
|
|
| 1129 |
})}
|
| 1130 |
</div>
|
| 1131 |
{isAdmin && (
|
| 1132 |
-
<div className="mt-2">
|
| 1133 |
-
<
|
| 1134 |
-
|
|
|
|
| 1135 |
try {
|
| 1136 |
const base = (((api.defaults as any)?.baseURL as string)||'').replace(/\/$/,'');
|
| 1137 |
-
const
|
| 1138 |
-
const curJson = await cur.json().catch(()=>({}));
|
| 1139 |
-
const nextHidden = !(curJson?.week?.hidden);
|
| 1140 |
await fetch(`${base}/api/admin/weeks/tutorial/${selectedWeek}/visibility`,{ method:'PUT', headers:{ 'Content-Type':'application/json', 'Authorization': localStorage.getItem('token')?`Bearer ${localStorage.getItem('token')}`:'', 'user-role':'admin' }, body: JSON.stringify({ hidden: nextHidden }) });
|
| 1141 |
await fetchTutorialTasks(true);
|
| 1142 |
-
} catch (
|
| 1143 |
-
}}
|
| 1144 |
-
className="
|
| 1145 |
-
|
|
|
|
| 1146 |
</div>
|
| 1147 |
)}
|
| 1148 |
</div>
|
|
|
|
| 1129 |
})}
|
| 1130 |
</div>
|
| 1131 |
{isAdmin && (
|
| 1132 |
+
<div className="mt-2 flex items-center gap-2">
|
| 1133 |
+
<span className="text-xs text-ui-text/70">Visibility</span>
|
| 1134 |
+
<label className="switch">
|
| 1135 |
+
<input type="checkbox" checked={!(tutorialWeek && tutorialWeek.tasks && tutorialWeek.tasks.length)} onChange={async(e)=>{
|
| 1136 |
try {
|
| 1137 |
const base = (((api.defaults as any)?.baseURL as string)||'').replace(/\/$/,'');
|
| 1138 |
+
const nextHidden = e.currentTarget.checked;
|
|
|
|
|
|
|
| 1139 |
await fetch(`${base}/api/admin/weeks/tutorial/${selectedWeek}/visibility`,{ method:'PUT', headers:{ 'Content-Type':'application/json', 'Authorization': localStorage.getItem('token')?`Bearer ${localStorage.getItem('token')}`:'', 'user-role':'admin' }, body: JSON.stringify({ hidden: nextHidden }) });
|
| 1140 |
await fetchTutorialTasks(true);
|
| 1141 |
+
} catch (err) { console.error(err);}
|
| 1142 |
+
}}/>
|
| 1143 |
+
<span className="slider" />
|
| 1144 |
+
</label>
|
| 1145 |
+
<span className="text-xs">{(tutorialWeek && tutorialWeek.tasks && tutorialWeek.tasks.length)? 'Shown' : 'Hidden'}</span>
|
| 1146 |
</div>
|
| 1147 |
)}
|
| 1148 |
</div>
|
client/src/pages/WeeklyPractice.tsx
CHANGED
|
@@ -1460,20 +1460,21 @@ const WeeklyPractice: React.FC = () => {
|
|
| 1460 |
})}
|
| 1461 |
</div>
|
| 1462 |
{isAdmin && (
|
| 1463 |
-
<div className="mt-2">
|
| 1464 |
-
<
|
| 1465 |
-
|
|
|
|
| 1466 |
try {
|
| 1467 |
const base = (((api.defaults as any)?.baseURL as string)||'').replace(/\/$/,'');
|
| 1468 |
-
|
| 1469 |
-
const
|
| 1470 |
-
const nextHidden = !(curJson?.week?.hidden);
|
| 1471 |
await fetch(`${base}/api/admin/weeks/weekly-practice/${selectedWeek}/visibility`,{ method:'PUT', headers:{ 'Content-Type':'application/json', 'Authorization': localStorage.getItem('token')?`Bearer ${localStorage.getItem('token')}`:'', 'user-role':'admin' }, body: JSON.stringify({ hidden: nextHidden }) });
|
| 1472 |
await fetchWeeklyPractice(true);
|
| 1473 |
-
} catch (
|
| 1474 |
-
}}
|
| 1475 |
-
className="
|
| 1476 |
-
|
|
|
|
| 1477 |
</div>
|
| 1478 |
)}
|
| 1479 |
</div>
|
|
|
|
| 1460 |
})}
|
| 1461 |
</div>
|
| 1462 |
{isAdmin && (
|
| 1463 |
+
<div className="mt-2 flex items-center gap-2">
|
| 1464 |
+
<span className="text-xs text-ui-text/70">Visibility</span>
|
| 1465 |
+
<label className="switch">
|
| 1466 |
+
<input type="checkbox" checked={!(weeklyPractice && weeklyPractice.length)} onChange={async(e)=>{
|
| 1467 |
try {
|
| 1468 |
const base = (((api.defaults as any)?.baseURL as string)||'').replace(/\/$/,'');
|
| 1469 |
+
// when checked => Hidden, unchecked => Shown
|
| 1470 |
+
const nextHidden = e.currentTarget.checked;
|
|
|
|
| 1471 |
await fetch(`${base}/api/admin/weeks/weekly-practice/${selectedWeek}/visibility`,{ method:'PUT', headers:{ 'Content-Type':'application/json', 'Authorization': localStorage.getItem('token')?`Bearer ${localStorage.getItem('token')}`:'', 'user-role':'admin' }, body: JSON.stringify({ hidden: nextHidden }) });
|
| 1472 |
await fetchWeeklyPractice(true);
|
| 1473 |
+
} catch (err) { console.error(err);}
|
| 1474 |
+
}}/>
|
| 1475 |
+
<span className="slider" />
|
| 1476 |
+
</label>
|
| 1477 |
+
<span className="text-xs">{(weeklyPractice && weeklyPractice.length)? 'Shown' : 'Hidden'}</span>
|
| 1478 |
</div>
|
| 1479 |
)}
|
| 1480 |
</div>
|