feat: default quicklinks, static PDF downloads, improved app icon
@@ -622,6 +622,7 @@ main {
|
||||
.ql-del { position: absolute; top: 3px; right: 4px; font-size: 10px; color: var(--text-subtle); display: none; border: none; background: none; cursor: pointer; line-height: 1; }
|
||||
.ql-item:hover .ql-del { display: block; }
|
||||
.ql-del:hover { color: var(--red); }
|
||||
.ql-item--soon { opacity: .4; cursor: not-allowed; pointer-events: none; }
|
||||
|
||||
/* ── EMPTY STATE ─────────────────────────────────────────── */
|
||||
|
||||
@@ -1418,8 +1419,12 @@ footer {
|
||||
<button class="add-btn" id="btn-add-ql" style="display:none" onclick="openModal('quicklinks')">+ Link</button>
|
||||
</div>
|
||||
<div class="card-body"><div class="ql-grid" id="ql-grid">
|
||||
<a class="ql-item" href="https://www.ifb-schulen.de" target="_blank" rel="noopener"><span class="ql-icon"><i data-lucide="building-2" aria-hidden="true"></i></span>IFB Website</a>
|
||||
<a class="ql-item" href="https://www.bib-info.de" target="_blank" rel="noopener"><span class="ql-icon"><i data-lucide="book-open" aria-hidden="true"></i></span>Bibliothek</a>
|
||||
<span class="ql-item ql-item--soon" title="Demnächst verfügbar"><span class="ql-icon"><i data-lucide="award" aria-hidden="true"></i></span>Notenportal</span>
|
||||
<a class="ql-item" href="https://github.com/lulinretrograde/ifb-schulapp" target="_blank" rel="noopener"><span class="ql-icon"><i data-lucide="github" aria-hidden="true"></i></span>Quellcode</a>
|
||||
<a class="ql-item" href="https://ifb-rosenheim.de/" target="_blank" rel="noopener"><span class="ql-icon"><i data-lucide="building-2" aria-hidden="true"></i></span>IFB-Website</a>
|
||||
<a class="ql-item" href="https://webentwicklerkurs.de/" target="_blank" rel="noopener"><span class="ql-icon"><i data-lucide="globe" aria-hidden="true"></i></span>Webentwicklerkurs</a>
|
||||
<a class="ql-item" href="https://pythonentwicklerkurs.de/" target="_blank" rel="noopener"><span class="ql-icon"><i data-lucide="terminal" aria-hidden="true"></i></span>Pythonentwicklerkurs</a>
|
||||
<a class="ql-item" href="https://kientwicklerkurs.de/" target="_blank" rel="noopener"><span class="ql-icon"><i data-lucide="bot" aria-hidden="true"></i></span>KI-Entwicklerkurs</a>
|
||||
</div></div>
|
||||
</div>
|
||||
|
||||
@@ -2978,8 +2983,22 @@ async function delTeacherGrade(id){
|
||||
async function loadStudentMaterials(){
|
||||
const mats=await api('GET','teacher/materials/class/info1');
|
||||
const el=document.getElementById('list-student-materials');
|
||||
if(!mats||mats.error||!mats.length){el.innerHTML='<div class="empty">Keine Materialien vorhanden</div>';return;}
|
||||
el.innerHTML=mats.map(m=>`<div class="file-item">
|
||||
const staticItems=`<div class="file-item">
|
||||
<div class="file-icon">📕</div>
|
||||
<div class="file-info">
|
||||
<div class="file-name">Stundenplan ab 02.03.26</div>
|
||||
<div class="file-meta">PDF · Allgemein</div>
|
||||
</div>
|
||||
<a class="file-dl" href="/downloads/Stundenplan_ab_02_03_26.pdf" download="Stundenplan_ab_02_03_26.pdf">↓ Laden</a>
|
||||
</div><div class="file-item">
|
||||
<div class="file-icon">📕</div>
|
||||
<div class="file-info">
|
||||
<div class="file-name">Klausurenplan ab 06.03.26</div>
|
||||
<div class="file-meta">PDF · Allgemein</div>
|
||||
</div>
|
||||
<a class="file-dl" href="/downloads/Klausurenplan_ab_06_03_26.pdf" download="Klausurenplan_ab_06_03_26.pdf">↓ Laden</a>
|
||||
</div>`;
|
||||
const dynItems=(!mats||mats.error||!mats.length)?'':mats.map(m=>`<div class="file-item">
|
||||
<div class="file-icon">${fileIcon(m.mime_type)}</div>
|
||||
<div class="file-info">
|
||||
<div class="file-name">${esc(m.title)}</div>
|
||||
@@ -2987,6 +3006,7 @@ async function loadStudentMaterials(){
|
||||
</div>
|
||||
<button class="file-dl" onclick="window.location.href='/api/teacher/materials/${m.id}/download'">↓ Laden</button>
|
||||
</div>`).join('');
|
||||
el.innerHTML=staticItems+dynItems;
|
||||
}
|
||||
|
||||
async function loadStudentAnnouncements(){
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32">
|
||||
<rect width="32" height="32" rx="6" fill="#2563eb"/>
|
||||
<polygon points="16,7 29,13 16,19 3,13" fill="white"/>
|
||||
<path d="M9.5,15.5 L9.5,22 Q16,26 22.5,22 L22.5,15.5" fill="white"/>
|
||||
<line x1="29" y1="13" x2="29" y2="20.5" stroke="white" stroke-width="2" stroke-linecap="round"/>
|
||||
<circle cx="29" cy="22" r="1.8" fill="white"/>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
|
||||
<rect width="512" height="512" rx="96" fill="#2563eb"/>
|
||||
<polygon points="256,76 480,188 256,300 32,188" fill="white"/>
|
||||
<path d="M128,216 L128,326 C128,384 186,428 256,428 C326,428 384,384 384,326 L384,216 L256,300 Z" fill="white"/>
|
||||
<rect x="462" y="188" width="18" height="118" rx="9" fill="white"/>
|
||||
<circle cx="471" cy="330" r="28" fill="white"/>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 399 B After Width: | Height: | Size: 428 B |
|
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 55 KiB After Width: | Height: | Size: 9.8 KiB |
|
Before Width: | Height: | Size: 324 KiB After Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 8.3 KiB After Width: | Height: | Size: 8.2 KiB |
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 26 KiB |
@@ -1,4 +1,4 @@
|
||||
const CACHE = 'klassenportal-v1';
|
||||
const CACHE = 'klassenportal-v2';
|
||||
const PRECACHE = [
|
||||
'/',
|
||||
'/login.html',
|
||||
|
||||