feat: default quicklinks, static PDF downloads, improved app icon

This commit is contained in:
Simon
2026-04-22 22:49:35 +02:00
parent 6b54e3c813
commit 62ebc53875
10 changed files with 31 additions and 11 deletions
+24 -4
View File
@@ -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-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-item:hover .ql-del { display: block; }
.ql-del:hover { color: var(--red); } .ql-del:hover { color: var(--red); }
.ql-item--soon { opacity: .4; cursor: not-allowed; pointer-events: none; }
/* ── EMPTY STATE ─────────────────────────────────────────── */ /* ── EMPTY STATE ─────────────────────────────────────────── */
@@ -1418,8 +1419,12 @@ footer {
<button class="add-btn" id="btn-add-ql" style="display:none" onclick="openModal('quicklinks')">+ Link</button> <button class="add-btn" id="btn-add-ql" style="display:none" onclick="openModal('quicklinks')">+ Link</button>
</div> </div>
<div class="card-body"><div class="ql-grid" id="ql-grid"> <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> <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://www.bib-info.de" target="_blank" rel="noopener"><span class="ql-icon"><i data-lucide="book-open" aria-hidden="true"></i></span>Bibliothek</a> <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></div>
</div> </div>
@@ -2978,8 +2983,22 @@ async function delTeacherGrade(id){
async function loadStudentMaterials(){ async function loadStudentMaterials(){
const mats=await api('GET','teacher/materials/class/info1'); const mats=await api('GET','teacher/materials/class/info1');
const el=document.getElementById('list-student-materials'); const el=document.getElementById('list-student-materials');
if(!mats||mats.error||!mats.length){el.innerHTML='<div class="empty">Keine Materialien vorhanden</div>';return;} const staticItems=`<div class="file-item">
el.innerHTML=mats.map(m=>`<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-icon">${fileIcon(m.mime_type)}</div>
<div class="file-info"> <div class="file-info">
<div class="file-name">${esc(m.title)}</div> <div class="file-name">${esc(m.title)}</div>
@@ -2987,6 +3006,7 @@ async function loadStudentMaterials(){
</div> </div>
<button class="file-dl" onclick="window.location.href='/api/teacher/materials/${m.id}/download'">↓ Laden</button> <button class="file-dl" onclick="window.location.href='/api/teacher/materials/${m.id}/download'">↓ Laden</button>
</div>`).join(''); </div>`).join('');
el.innerHTML=staticItems+dynItems;
} }
async function loadStudentAnnouncements(){ async function loadStudentAnnouncements(){
Binary file not shown.
Binary file not shown.
+6 -6
View File
@@ -1,7 +1,7 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512">
<rect width="32" height="32" rx="6" fill="#2563eb"/> <rect width="512" height="512" rx="96" fill="#2563eb"/>
<polygon points="16,7 29,13 16,19 3,13" fill="white"/> <polygon points="256,76 480,188 256,300 32,188" fill="white"/>
<path d="M9.5,15.5 L9.5,22 Q16,26 22.5,22 L22.5,15.5" 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"/>
<line x1="29" y1="13" x2="29" y2="20.5" stroke="white" stroke-width="2" stroke-linecap="round"/> <rect x="462" y="188" width="18" height="118" rx="9" fill="white"/>
<circle cx="29" cy="22" r="1.8" fill="white"/> <circle cx="471" cy="330" r="28" fill="white"/>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 399 B

After

Width:  |  Height:  |  Size: 428 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

After

Width:  |  Height:  |  Size: 9.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 324 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.3 KiB

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 26 KiB

+1 -1
View File
@@ -1,4 +1,4 @@
const CACHE = 'klassenportal-v1'; const CACHE = 'klassenportal-v2';
const PRECACHE = [ const PRECACHE = [
'/', '/',
'/login.html', '/login.html',