feat: add teacher's guides dialog with instructional content for video management
Browse files- 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","");
|