linguabot commited on
Commit
f9db30f
·
verified ·
1 Parent(s): 84e8611

Upload folder using huggingface_hub

Browse files
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
- <button
1134
- onClick={async()=>{
 
1135
  try {
1136
  const base = (((api.defaults as any)?.baseURL as string)||'').replace(/\/$/,'');
1137
- const cur = await fetch(`${base}/api/admin/weeks/tutorial/${selectedWeek}/visibility`, { headers:{ 'Authorization': localStorage.getItem('token')?`Bearer ${localStorage.getItem('token')}`:'', 'user-role':'admin' } });
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 (e) { console.error(e);}
1143
- }}
1144
- className="inline-flex items-center px-3 py-1.5 text-xs rounded-md border border-ui-border bg-white/70"
1145
- >{(tutorialWeek && tutorialWeek.tasks && tutorialWeek.tasks.length)?'Hide this week from students':'Show this week to students'}</button>
 
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
- <button
1465
- onClick={async()=>{
 
1466
  try {
1467
  const base = (((api.defaults as any)?.baseURL as string)||'').replace(/\/$/,'');
1468
- const cur = await fetch(`${base}/api/admin/weeks/weekly-practice/${selectedWeek}/visibility`, { headers:{ 'Authorization': localStorage.getItem('token')?`Bearer ${localStorage.getItem('token')}`:'', 'user-role':'admin' } });
1469
- const curJson = await cur.json().catch(()=>({}));
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 (e) { console.error(e);}
1474
- }}
1475
- className="inline-flex items-center px-3 py-1.5 text-xs rounded-md border border-ui-border bg-white/70"
1476
- >{(()=>{ return (weeklyPractice && weeklyPractice.length)? 'Hide this week from students' : 'Show this week to students'; })()}</button>
 
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>