3v324v23 commited on
Commit
854d36e
路
1 Parent(s): 20ad837

feat: add teacher's guides dialog with instructional content for video management

Browse files
Files changed (1) hide show
  1. static/index.html +72 -0
static/index.html CHANGED
@@ -341,6 +341,12 @@ body:not(.manage) #manage,body.manage #wrap>header,body.manage #path,body.manage
341
  #manage.content :is(#mTutors,#mTabs,#mHead,#mLessons,#mRoster,#mStudent),#manage:not(.content) #mContent{display:none}
342
  /* the content part: a level's name, then a card per lesson with its topics and videos, a row each, and the form that adds a video */
343
  #mContent{display:flex;flex-direction:column;gap:12px}
 
 
 
 
 
 
344
  .csec[open]>:not(:last-child){margin-bottom:12px}
345
  .clevel{display:flex;align-items:baseline;gap:10px;margin:0;padding:12px 14px;border:1px solid var(--line);border-radius:12px;background:var(--surface);font:400 24px/1.2 var(--f-display);cursor:pointer;list-style:none}
346
  .clevel::-webkit-details-marker{display:none}
@@ -858,6 +864,63 @@ body.quiet :is(#mic,#playMine,#driveBtn,.phone-btn),body.driving :is(#quietBtn,#
858
  <div class="dlg-head"><h2 id="flagTitle">馃毄 讛讚讬讜讜讞 谞砖诪专<small>讝讛 诪讛 砖讛诪讜专讛 讬专讗讛 注诇 讛讛拽诇讟讛 讛讝讜</small></h2><button class="btn" id="flagClose">住讙讬专讛</button></div>
859
  <dl class="flag-facts" id="flagFacts"></dl>
860
  </dialog>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
861
  <div id="whyTip" role="tooltip" hidden></div>
862
  <button id="logoutBtn" hidden>讬爪讬讗讛</button>
863
 
@@ -2489,8 +2552,17 @@ function drawClasses(classes){
2489
  video or a text, and it is deleted there too. */
2490
  const send=(url,method,body)=>api(url,{method,headers:{"Content-Type":"application/json"},body:JSON.stringify(body)});
2491
  const refused=async(res,what)=>(await res.json().catch(()=>({}))).detail||`${what} 谞讻砖诇讛 (${res.status})`;
 
 
 
 
 
 
2492
  function drawContent(){
2493
  const box=$("mContent"), listed=listedPhrases(); box.innerHTML="";
 
 
 
2494
  const voices=[...$("voiceId").options].filter(o=>o.value).map(o=>o.text.replace(/[謶-讎]/g,""));
2495
  const adder=(adds,label,fields,note,submit)=>{ // a closed form under a lesson, or under a level's daily videos
2496
  const add=document.createElement("details"), form=document.createElement("form"), row=mark("row",""), msg=mark("msg","");
 
341
  #manage.content :is(#mTutors,#mTabs,#mHead,#mLessons,#mRoster,#mStudent),#manage:not(.content) #mContent{display:none}
342
  /* the content part: a level's name, then a card per lesson with its topics and videos, a row each, and the form that adds a video */
343
  #mContent{display:flex;flex-direction:column;gap:12px}
344
+ .guides{display:flex;flex-wrap:wrap;align-items:center;gap:8px;color:var(--muted);font-size:14px}
345
+ #guideDlg article{line-height:1.55}
346
+ #guideDlg h3{font:700 16px/1.3 var(--f-body);margin:16px 0 6px}
347
+ #guideDlg :is(ol,ul){margin:0;padding-inline-start:22px;display:flex;flex-direction:column;gap:4px}
348
+ #guideDlg p{margin:6px 0}
349
+ #guideDlg code{direction:ltr;unicode-bidi:isolate;font-size:12px;overflow-wrap:anywhere}
350
  .csec[open]>:not(:last-child){margin-bottom:12px}
351
  .clevel{display:flex;align-items:baseline;gap:10px;margin:0;padding:12px 14px;border:1px solid var(--line);border-radius:12px;background:var(--surface);font:400 24px/1.2 var(--f-display);cursor:pointer;list-style:none}
352
  .clevel::-webkit-details-marker{display:none}
 
864
  <div class="dlg-head"><h2 id="flagTitle">馃毄 讛讚讬讜讜讞 谞砖诪专<small>讝讛 诪讛 砖讛诪讜专讛 讬专讗讛 注诇 讛讛拽诇讟讛 讛讝讜</small></h2><button class="btn" id="flagClose">住讙讬专讛</button></div>
865
  <dl class="flag-facts" id="flagFacts"></dl>
866
  </dialog>
867
+ <!-- The teacher's guides, opened from the top of the panel's content part: an article each, one on show (see `showGuide`). -->
868
+ <dialog id="guideDlg" aria-labelledby="guideTitle">
869
+ <div class="dlg-head"><h2 id="guideTitle"></h2><button class="btn" id="guideClose">住讙讬专讛</button></div>
870
+ <article data-guide="daily" data-title="讗讬讱 诪讜住讬驻讬诐 住专讟讜谉 讬讜诪讬" hidden>
871
+ <p>讛讜住驻转 住专讟讜谉 讬讜诪讬 谞注砖讬转 讘砖谞讬 砖诇讘讬诐: 拽讜讚诐 诪讜住讬驻讬诐 讗转 讛住专讟讜谉 诇专砖讬诪转 讛住专讟讜谞讬诐 砖诇 讛砖诇讘, 讜讗讞专 讻讱 拽讜讘注讬诐 诇讜 转讗专讬讱 讘讻讬转讛. 住专讟讜谉 讘诇讬 转讗专讬讱 诇讗 诪讜爪讙 诇讗祝 转诇诪讬讚.</p>
872
+ <h3>诇驻谞讬 砖诪转讞讬诇讬诐</h3>
873
+ <ul><li>谞讻谞住讬诐 注诐 讞砖讘讜谉 砖诇 诪讜专讛 讜诇讜讞爪讬诐 注诇 <b>谞讬讛讜诇</b> 讘诪住讱 讛驻转讬讞讛.</li>
874
+ <li>诪讻讬谞讬诐 拽讬砖讜专 诇住专讟讜谉 讘-Vimeo 讗讜 讘-YouTube. 讘-Vimeo 诪注转讬拽讬诐 讗转 讛拽讬砖讜专 诪讻驻转讜专 讛砖讬转讜祝 (诇诪砖诇 <code>https://vimeo.com/1233611297/d46ac373c8</code>); 讛讞诇拽 砖讗讞专讬 讛诪住驻专 讛讜讗 诪讛 砖驻讜转讞 住专讟讜谉 诇讗 专砖讜诐, 讗讝 诇讗 诇诪讞讜拽 讗讜转讜.</li></ul>
875
+ <h3>砖诇讘 1: 诪讜住讬驻讬诐 讗转 讛住专讟讜谉 诇砖诇讘</h3>
876
+ <ol><li>讘专讗砖 讛驻讗谞诇 讘讜讞专讬诐 讘讞诇拽 <b>转讜讻谉</b>.</li>
877
+ <li>诇讜讞爪讬诐 注诇 砖诐 讛砖诇讘 砖讛住专讟讜谉 砖讬讬讱 讗诇讬讜 (诇诪砖诇 "砖诇讘 讗") 讻讚讬 诇驻转讜讞 讗讜转讜.</li>
878
+ <li>讘讻专讟讬住 <b>住专讟讜谞讬诐 讬讜诪讬讬诐</b> 诇讜讞爪讬诐 注诇 <b>+ 讛讜住驻转 住专讟讜谉 讬讜诪讬</b>.</li>
879
+ <li>诪诪诇讗讬诐 <b>砖诐 讛住专讟讜谉</b> (注讚 80 转讜讜讬诐) 讜<b>拽讬砖讜专 诇-Vimeo 讗讜 诇-YouTube</b>.</li>
880
+ <li>诇讜讞爪讬诐 <b>讛讜住驻讛</b>.</li></ol>
881
+ <p>讛住专讟讜谉 诪讜驻讬注 注讻砖讬讜 讘专砖讬诪讛 砖诇 讛讻专讟讬住. 讻驻转讜专 <b>爪驻讬讬讛</b> 砖诇讬讚讜 诪讗驻砖专 诇讘讚讜拽 砖讛讜讗 谞驻转讞 讻诪讜 砖爪专讬讱.</p>
882
+ <h3>砖诇讘 2: 拽讜讘注讬诐 诇住专讟讜谉 转讗专讬讱 讘讻讬转讛</h3>
883
+ <ol><li>讘专讗砖 讛驻讗谞诇 讘讜讞专讬诐 讘讞诇拽 <b>讻讬转讜转</b>.</li>
884
+ <li>诇讬讚 讛讻讬转讛 诇讜讞爪讬诐 <b>注专讬讻讛</b>.</li>
885
+ <li>讘讞诇拽 <b>住专讟讜谞讬诐 讬讜诪讬讬诐</b> 诪讜驻讬注讬诐 讻诇 讛住专讟讜谞讬诐 砖诇 讛砖诇讘讬诐 砖讛讻讬转讛 诇讜诪讚转. 讘讜讞专讬诐 转讗专讬讱 讘砖讚讛 砖诇讬讚 讛住专讟讜谉.</li>
886
+ <li>诇讜讞爪讬诐 <b>砖诪讬专讛</b>.</li></ol>
887
+ <p>讞讜讝专讬诐 注诇 讛砖诇讘 讛讝讛 诇讻诇 讻讬转讛 砖爪专讬讻讛 诇专讗讜转 讗转 讛住专讟讜谉; 讻诇 讻讬转讛 讬讻讜诇讛 诇拽讘诇 转讗专讬讱 讗讞专.</p>
888
+ <h3>诪讛 讛转诇诪讬讚讬诐 专讜讗讬诐</h3>
889
+ <ul><li>诪讛转讗专讬讱 砖谞拽讘注, 讛住专讟讜谉 诪讜驻讬注 讘讻驻转讜专 <b>住专讟讜谉 讬讜诪讬</b> 砖诪注诇 讛诪住诇讜诇. 讛讻驻转讜专 诪讜讚讙砖 注讚 砖讛转诇诪讬讚 驻讜转讞 讗转 讛住专讟讜谉.</li>
890
+ <li>讘讬讜诐 砖讗讬谉 讘讜 住专讟讜谉 讞讚砖, 讛讻驻转讜专 驻讜转讞 讗转 专砖讬诪转 讛住专讟讜谞讬诐 讛拽讜讚诪讬诐, 讻讱 砖讗驻砖专 诇讛砖诇讬诐 讬讜诐 砖讛讜讞诪抓.</li>
891
+ <li>住专讟讜谉 砖讛转讗专讬讱 砖诇讜 注讜讚 诇讗 讛讙讬注 诇讗 诪讜爪讙.</li></ul>
892
+ <h3>讗诐 诪砖讛讜 诇讗 注讜讘讚</h3>
893
+ <ul><li><b>讛转诇诪讬讚讬诐 诇讗 专讜讗讬诐 讗转 讛住专讟讜谉:</b> 讘讜讚拽讬诐 砖谞拽讘注 诇讜 转讗专讬讱 讘注专讬讻转 讛讻讬转讛, 砖讛转讗专讬讱 讻讘专 讛讙讬注, 讜砖讛讻讬转讛 诇讜诪讚转 讗转 讛砖诇讘 砖讛住专讟讜谉 谞讜住祝 讗诇讬讜.</li>
894
+ <li><b>"讝讛 诇讗 拽讬砖讜专 诇住专讟讜谉":</b> 讘讜讚拽讬诐 砖讛拽讬砖讜专 讛讜讗 砖诇 Vimeo 讗讜 YouTube 讜砖讛讜注转拽 讘诪诇讜讗讜.</li>
895
+ <li><b>讛讜讚注讛 砖讛讟讘诇讛 <code>dailies</code> 诇讗 拽讬讬诪转:</b> 诪专讬爪讬诐 驻注诐 讗讞转 讘-SQL Editor 砖诇 Supabase 讗转 讛驻拽讜讚讛 砖诪讜驻讬注讛 讘讛讜讚注讛.</li></ul>
896
+ <h3>砖讬谞讜讬 讜诪讞讬拽讛</h3>
897
+ <ul><li><b>砖讬谞讜讬 转讗专讬讱 讗讜 讘讬讟讜诇:</b> 讘注专讬讻转 讛讻讬转讛 诪砖谞讬诐 讗讜 诪专讜拽谞讬诐 讗转 砖讚讛 讛转讗专讬讱 讜砖讜诪专讬诐.</li>
898
+ <li><b>诪讞讬拽转 讛住专讟讜谉:</b> 讘<b>转讜讻谉</b>, 讘讻专讟讬住 <b>住专讟讜谞讬诐 讬讜诪讬讬诐</b>, 诇讜讞爪讬诐 <b>诪讞讬拽讛</b> 诇讬讚 讛住专讟讜谉. 讙诐 讻讬转讜转 砖讻讘专 拽讘注讜 诇讜 转讗专讬讱 讬驻住讬拽讜 诇专讗讜转 讗讜转讜.</li></ul>
899
+ </article>
900
+ <article data-guide="library" data-title="讗讬讱 诪讜住讬驻讬诐 住专讟讜谞讬诐 诇住驻专讬讛 讛讚讬讙讬讟诇讬转" hidden>
901
+ <p>讛住驻专讬讛 讛讚讬讙讬讟诇讬转 诪砖讜转驻转 诇讻诇 讛砖诇讘讬诐: 住专讟讜谉 砖谞讜住祝 讗诇讬讛 驻转讜讞 诪讬讚 诇讻诇 讛转诇诪讬讚讬诐, 讘讻诇 讻讬转讛. 讘砖讜谞讛 诪住专讟讜谉 讬讜诪讬, 诇讗 拽讜讘注讬诐 诇讜 转讗专讬讱 讜诇讗 诪砖讬讬讻讬诐 讗讜转讜 诇讻讬转讛.</p>
902
+ <h3>诇驻谞讬 砖诪转讞讬诇讬诐</h3>
903
+ <ul><li>谞讻谞住讬诐 注诐 讞砖讘讜谉 砖诇 诪讜专讛 讜诇讜讞爪讬诐 注诇 <b>谞讬讛讜诇</b> 讘诪住讱 讛驻转讬讞讛.</li>
904
+ <li>诪讻讬谞讬诐 拽讬砖讜专 诇住专讟讜谉 讘-Vimeo 讗讜 讘-YouTube. 讘-Vimeo 诪注转讬拽讬诐 讗转 讛拽讬砖讜专 诪讻驻转讜专 讛砖讬转讜祝 (诇诪砖诇 <code>https://vimeo.com/1233611297/d46ac373c8</code>); 讛讞诇拽 砖讗讞专讬 讛诪住驻专 讛讜讗 诪讛 砖驻讜转讞 住专讟讜谉 诇讗 专砖讜诐, 讗讝 诇讗 诇诪讞讜拽 讗讜转讜.</li></ul>
905
+ <h3>讛讜住驻转 住专讟讜谉</h3>
906
+ <ol><li>讘专讗砖 讛驻讗谞诇 讘讜讞专讬诐 讘讞诇拽 <b>转讜讻谉</b>.</li>
907
+ <li>诇讜讞爪讬诐 注诇 <b>住驻专讬讛 讚讬讙讬讟诇讬转</b> (讛砖讜专讛 讛专讗砖讜谞讛, 诪注诇 讛砖诇讘讬诐) 讻讚讬 诇驻转讜讞 讗讜转讛.</li>
908
+ <li>讘讻专讟讬住 <b>讛住专讟讜谞讬诐 砖讘住驻专讬讛</b> 诇讜讞爪讬诐 注诇 <b>+ 讛讜住驻转 住专讟讜谉 诇住驻专讬讛</b>.</li>
909
+ <li>诪诪诇讗讬诐 <b>砖诐 讛住专讟讜谉</b> (注讚 80 转讜讜讬诐) 讜<b>拽讬砖讜专 诇-Vimeo 讗讜 诇-YouTube</b>.</li>
910
+ <li>诇讜讞爪讬诐 <b>讛讜住驻讛</b>.</li></ol>
911
+ <p>讛住专讟讜谉 诪讜驻讬注 讘专砖讬诪讛 砖诇 讛讻专讟讬住. 讻驻转讜专 <b>爪驻讬讬讛</b> 砖诇讬讚讜 诪讗驻砖专 诇讘讚讜拽 砖讛讜讗 谞驻转讞 讻诪讜 砖爪专讬讱. 讻讚讬 诇讛讜住讬祝 住专讟讜谞讬诐 谞讜住驻讬诐 讞讜讝专讬诐 注诇 砖诇讘讬诐 3 注讚 5; 讛诐 诪讜爪讙讬诐 讘住讚专 砖讘讜 谞讜住驻讜.</p>
912
+ <h3>诪讛 讛转诇诪讬讚讬诐 专讜讗讬诐</h3>
913
+ <ul><li>讛转诇诪讬讚讬诐 诪讙讬注讬诐 诇住专讟讜谞讬诐 讚专讱 讛诇砖讜谞讬转 <b>住驻专讬讛 讚讬讙讬讟诇讬转</b> 砖讘转讞转讬转 讛诪住讱.</li>
914
+ <li>讻诇 转诇诪讬讚 专讜讗讛 讗转 讻诇 讛住专讟讜谞讬诐, 讘诇讬 拽砖专 诇砖诇讘 讗讜 诇讻讬转讛 砖诇讜.</li>
915
+ <li>住专讟讜谉 讘住驻专讬讛 讗讬谞讜 转专讙讜诇, 讜诇讻谉 讛讜讗 诇讗 谞住驻专 讘讛转拽讚诪讜转 讗讜 讘爪讬讜谞讬诐.</li></ul>
916
+ <h3>讗诐 诪砖讛讜 诇讗 注讜讘讚</h3>
917
+ <ul><li><b>"讝讛 诇讗 拽讬砖讜专 诇住专讟讜谉":</b> 讘讜讚拽讬诐 砖讛拽讬砖讜专 讛讜讗 砖诇 Vimeo 讗讜 YouTube 讜砖讛讜注转拽 讘诪诇讜讗讜.</li>
918
+ <li><b>讛讜讚注讛 砖讛讟讘诇讛 <code>library</code> 诇讗 拽讬讬诪转:</b> 诪专讬爪讬诐 驻注诐 讗讞转 讘-SQL Editor 砖诇 Supabase 讗转 讛驻拽讜讚讛 砖诪讜驻讬注讛 讘讛讜讚注讛.</li>
919
+ <li><b>转诇诪讬讚 诇讗 专讜讗讛 住专讟讜谉 讞讚砖:</b> 砖讬专注谞谉 讗转 讛讚祝; 讛专砖讬诪讛 诪转注讚讻谞转 讗爪诇 讛转诇诪讬讚讬诐 转讜讱 讻讚拽讛.</li></ul>
920
+ <h3>诪讞讬拽讛</h3>
921
+ <p>讘<b>转讜讻谉</b>, 讘讻专讟讬住 <b>讛住专讟讜谞讬诐 砖讘住驻专讬讛</b>, 诇讜讞爪讬诐 <b>诪讞讬拽讛</b> 诇讬讚 讛住专讟讜谉 讜诪讗砖专讬诐. 讛住专讟讜谉 谞注诇诐 诇讻诇 讛转诇诪讬讚讬诐. 讗讬谉 注专讬讻讛 砖诇 砖诐 讗讜 拽讬砖讜专: 讻讚讬 诇砖谞讜转, 诪讜讞拽讬诐 讜诪讜住讬驻讬诐 诪讞讚砖.</p>
922
+ </article>
923
+ </dialog>
924
  <div id="whyTip" role="tooltip" hidden></div>
925
  <button id="logoutBtn" hidden>讬爪讬讗讛</button>
926
 
 
2552
  video or a text, and it is deleted there too. */
2553
  const send=(url,method,body)=>api(url,{method,headers:{"Content-Type":"application/json"},body:JSON.stringify(body)});
2554
  const refused=async(res,what)=>(await res.json().catch(()=>({}))).detail||`${what} 谞讻砖诇讛 (${res.status})`;
2555
+ /* The teacher's guides (the articles of #guideDlg): a button each at the top of the content part. */
2556
+ function showGuide(key){
2557
+ for(const a of $("guideDlg").querySelectorAll("article")){ a.hidden=a.dataset.guide!==key; if(!a.hidden) $("guideTitle").textContent=a.dataset.title; }
2558
+ $("guideDlg").showModal(); $("guideDlg").scrollTop=0;
2559
+ }
2560
+ $("guideClose").onclick=()=>$("guideDlg").close();
2561
  function drawContent(){
2562
  const box=$("mContent"), listed=listedPhrases(); box.innerHTML="";
2563
+ const guides=mark("guides","诪讚专讬讻讬诐:","div");
2564
+ for(const a of $("guideDlg").querySelectorAll("article")){ const b=mark("btn",a.dataset.title,"button"); b.onclick=()=>showGuide(a.dataset.guide); guides.append(b); }
2565
+ box.append(guides);
2566
  const voices=[...$("voiceId").options].filter(o=>o.value).map(o=>o.text.replace(/[謶-讎]/g,""));
2567
  const adder=(adds,label,fields,note,submit)=>{ // a closed form under a lesson, or under a level's daily videos
2568
  const add=document.createElement("details"), form=document.createElement("form"), row=mark("row",""), msg=mark("msg","");