Session 2026-04-19: Navigation, Kompass, Übungsfortschritt
Routen-Navigation:
- POI-Marker: farbige Kreise mit Phosphor-Icons (wie Hauptkarte)
- Screensaver: Navi-Pfeil dreht sich via DeviceOrientationEvent (iOS+Android)
- Pfeil-Dämpfung: EMA α=0.12 mit Wrap-Around
- GPS-Distanz-Bug: Fortschritt nur wenn <500m zur Route
- fitBounds: User-Position nur wenn <20km von Route
- Screensaver: "zur Route" vs "verbleibend" kontextabhängig
- Richtungspfeile entlang Route (blau, max 7 Stück)
- Umkehren ins Route-Detail verschoben, Detail-Map rebuildet sich
- rk-header z-index:10 (Leaflet-Tiles liefen drüber)
- 2-Sek. Screensaver-Entsperrung
km-Tracking:
- route_walks Tabelle
- POST /api/routes/{id}/walked (≥50%)
- total_km = erstellte Routes + gelaufene route_walks
- Toast bei neuem Badge
Übungsfortschritt:
- exercise_progress + training_plan_progress Tabellen
- GET/POST /api/training/progress, /plan-progress, /suggestions
- uebungen.js: API-first + localStorage-Fallback + Auto-Migration
- Empfehlungs-Banner (regelbasiert)
- Toast bei "sitzt"
This commit is contained in:
parent
390176383f
commit
9a78121a3e
25 changed files with 2487 additions and 248 deletions
|
|
@ -371,17 +371,53 @@ window.Page_diary = (() => {
|
|||
// ----------------------------------------------------------
|
||||
// LIGHTBOX
|
||||
// ----------------------------------------------------------
|
||||
function _showLightbox(src) {
|
||||
// ----------------------------------------------------------
|
||||
// LIGHTBOX — Fotos mit Vor/Zurück-Navigation
|
||||
// ----------------------------------------------------------
|
||||
function _showLightbox(urls, startIdx = 0) {
|
||||
const photos = Array.isArray(urls) ? urls : [urls];
|
||||
let idx = startIdx;
|
||||
|
||||
const lb = document.createElement('div');
|
||||
lb.style.cssText = 'position:fixed;inset:0;background:rgba(0,0,0,.92);z-index:9999;display:flex;align-items:center;justify-content:center;cursor:zoom-out';
|
||||
lb.innerHTML = `<img src="${UI.escape(src)}" style="max-width:100%;max-height:100%;object-fit:contain;touch-action:pinch-zoom">
|
||||
<button style="position:absolute;top:16px;right:16px;background:rgba(255,255,255,.2);border:none;border-radius:50%;width:40px;height:40px;color:#fff;font-size:22px;cursor:pointer;display:flex;align-items:center;justify-content:center">✕</button>`;
|
||||
lb.addEventListener('click', () => lb.remove());
|
||||
lb.id = 'diary-lightbox';
|
||||
lb.style.cssText = 'position:fixed;inset:0;z-index:1100;background:#000;display:flex;flex-direction:column';
|
||||
|
||||
const render = () => {
|
||||
lb.innerHTML = `
|
||||
<div style="display:flex;align-items:center;justify-content:space-between;
|
||||
padding:calc(env(safe-area-inset-top,0px)+10px) 16px 10px;flex-shrink:0">
|
||||
<button id="lb-close" style="background:rgba(255,255,255,.15);border:none;border-radius:50%;
|
||||
width:40px;height:40px;color:#fff;font-size:22px;cursor:pointer;
|
||||
display:flex;align-items:center;justify-content:center">←</button>
|
||||
${photos.length > 1
|
||||
? `<span style="color:rgba(255,255,255,.7);font-size:13px">${idx+1} / ${photos.length}</span>`
|
||||
: ''}
|
||||
<div style="width:40px"></div>
|
||||
</div>
|
||||
<div style="flex:1;display:flex;align-items:center;justify-content:center;overflow:hidden;position:relative">
|
||||
<img src="${UI.escape(photos[idx])}" style="max-width:100%;max-height:100%;object-fit:contain;touch-action:pinch-zoom;display:block">
|
||||
${photos.length > 1 ? `
|
||||
<button id="lb-prev" style="position:absolute;left:8px;top:50%;transform:translateY(-50%);
|
||||
background:rgba(255,255,255,.15);border:none;border-radius:50%;width:44px;height:44px;
|
||||
color:#fff;font-size:24px;cursor:pointer;display:flex;align-items:center;justify-content:center
|
||||
${idx === 0 ? ';opacity:.3;pointer-events:none' : ''}">‹</button>
|
||||
<button id="lb-next" style="position:absolute;right:8px;top:50%;transform:translateY(-50%);
|
||||
background:rgba(255,255,255,.15);border:none;border-radius:50%;width:44px;height:44px;
|
||||
color:#fff;font-size:24px;cursor:pointer;display:flex;align-items:center;justify-content:center
|
||||
${idx === photos.length-1 ? ';opacity:.3;pointer-events:none' : ''}">›</button>
|
||||
` : ''}
|
||||
</div>
|
||||
`;
|
||||
lb.querySelector('#lb-close').addEventListener('click', () => lb.remove());
|
||||
lb.querySelector('#lb-prev')?.addEventListener('click', () => { if (idx > 0) { idx--; render(); } });
|
||||
lb.querySelector('#lb-next')?.addEventListener('click', () => { if (idx < photos.length-1) { idx++; render(); } });
|
||||
};
|
||||
render();
|
||||
document.body.appendChild(lb);
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------
|
||||
// DETAIL-ANSICHT
|
||||
// DETAIL-ANSICHT — Fullscreen (DayOne-Stil)
|
||||
// ----------------------------------------------------------
|
||||
function _openDetail(entryId) {
|
||||
const entry = _entries.find(e => e.id === entryId);
|
||||
|
|
@ -390,113 +426,110 @@ window.Page_diary = (() => {
|
|||
const typ = TYPEN[entry.typ] || TYPEN.eintrag;
|
||||
const isMile = entry.is_milestone || entry.typ === 'meilenstein';
|
||||
const tags = (entry.tags || []).filter(t => t && t.trim());
|
||||
|
||||
const allMedia = _allMedia(entry);
|
||||
const photo = allMedia.length > 0
|
||||
? (allMedia.length === 1
|
||||
? `<div style="position:relative;margin-bottom:var(--space-4)">
|
||||
${_mediaHtml(allMedia[0].url)}
|
||||
</div>`
|
||||
: `<div class="diary-gallery" style="margin-bottom:var(--space-4)">
|
||||
${allMedia.map(m => `
|
||||
<div class="diary-gallery-wrap" style="position:relative">
|
||||
${m.media_type === 'video'
|
||||
? `<video src="${m.url}" controls playsinline class="diary-gallery-item"></video>`
|
||||
: `<img src="${m.url}" alt="Foto" class="diary-gallery-item">`}
|
||||
<button type="button"
|
||||
class="diary-cover-btn${m.is_cover ? ' diary-cover-btn--active' : ''}"
|
||||
data-media-id="${m.id}"
|
||||
aria-label="${m.is_cover ? 'Cover-Bild' : 'Als Cover setzen'}"
|
||||
title="${m.is_cover ? 'Cover-Bild' : 'Als Cover setzen'}"
|
||||
style="background:${m.is_cover ? '#f5c518' : 'rgba(0,0,0,.45)'};color:${m.is_cover ? '#fff' : 'rgba(255,255,255,.7)'}"><svg style="width:16px;height:16px;display:block" aria-hidden="true"><use href="/icons/phosphor.svg#star"></use></svg></button>
|
||||
</div>`).join('')}
|
||||
</div>`)
|
||||
: '';
|
||||
|
||||
// Hunde-Anzeige wenn mehrere beteiligt
|
||||
const dogIds = entry.dog_ids || [entry.dog_id];
|
||||
|
||||
const dogsHtml = dogIds.length > 1
|
||||
? `<div class="diary-detail-dogs">
|
||||
? `<div class="diary-detail-dogs" style="margin-bottom:var(--space-3)">
|
||||
${dogIds.map(did => {
|
||||
const dog = _appState.dogs.find(d => d.id === did);
|
||||
return dog ? `<div class="diary-dog-chip">
|
||||
<div class="diary-dog-av">
|
||||
${dog.foto_url ? `<img src="${UI.escape(dog.foto_url)}" alt="">` : `<span>${UI.icon('dog')}</span>`}
|
||||
</div>
|
||||
<span>${UI.escape(dog.name)}</span>
|
||||
</div>` : '';
|
||||
</div><span>${UI.escape(dog.name)}</span></div>` : '';
|
||||
}).join('')}
|
||||
</div>`
|
||||
: '';
|
||||
</div>` : '';
|
||||
|
||||
const body = `
|
||||
${isMile ? `<div class="diary-detail-milestone-badge">${UI.icon('trophy')} Meilenstein</div>` : ''}
|
||||
<div style="display:flex;gap:var(--space-2);align-items:center;margin-bottom:var(--space-3)">
|
||||
<span class="badge badge-primary">${typ.icon} ${typ.label}</span>
|
||||
<span style="color:var(--c-text-secondary);font-size:var(--text-sm)">
|
||||
${entry.datum ? UI.time.format(entry.datum + 'T00:00:00') : ''}
|
||||
</span>
|
||||
const view = document.createElement('div');
|
||||
view.id = 'diary-detail-view';
|
||||
view.style.cssText = 'position:fixed;inset:0;z-index:800;background:var(--c-bg);overflow-y:auto;display:flex;flex-direction:column';
|
||||
|
||||
// Medien-HTML für Hero-Bereich
|
||||
const _heroHtml = (m) => m.media_type === 'pdf'
|
||||
? `<a href="${UI.escape(m.url)}" target="_blank" rel="noopener"
|
||||
style="display:flex;flex-direction:column;align-items:center;justify-content:center;
|
||||
gap:12px;padding:32px 16px;background:var(--c-surface-2);text-decoration:none;color:var(--c-text)">
|
||||
<svg class="ph-icon" style="width:48px;height:48px;color:var(--c-danger)" aria-hidden="true"><use href="/icons/phosphor.svg#file-text"></use></svg>
|
||||
<span style="font-size:14px;font-weight:600">${UI.escape(m.url.split('/').pop())}</span>
|
||||
<span style="font-size:12px;color:var(--c-text-secondary)">PDF öffnen</span>
|
||||
</a>`
|
||||
: m.media_type === 'video'
|
||||
? `<video src="${UI.escape(m.url)}" controls playsinline style="width:100%;max-height:55vh;display:block;object-fit:contain;background:#000"></video>`
|
||||
: `<img src="${UI.escape(m.url)}" data-idx="${allMedia.indexOf(m)}" style="width:100%;max-height:55vh;object-fit:cover;display:block;cursor:zoom-in">`;
|
||||
|
||||
let mediaSection = '';
|
||||
if (allMedia.length === 1) {
|
||||
mediaSection = `<div style="background:#000;flex-shrink:0" id="diary-dv-hero">${_heroHtml(allMedia[0])}</div>`;
|
||||
} else if (allMedia.length > 1) {
|
||||
mediaSection = `
|
||||
<div style="background:#000;flex-shrink:0" id="diary-dv-hero">${_heroHtml(allMedia[0])}</div>
|
||||
<div style="display:flex;gap:3px;padding:3px;overflow-x:auto;background:#111;flex-shrink:0" id="diary-dv-thumbs">
|
||||
${allMedia.map((m, i) => `
|
||||
<div data-idx="${i}" style="flex-shrink:0;width:64px;height:64px;border-radius:4px;overflow:hidden;
|
||||
cursor:pointer;border:2px solid ${i===0?'var(--c-primary)':'transparent'};box-sizing:border-box">
|
||||
${m.media_type === 'pdf'
|
||||
? `<div style="width:100%;height:100%;display:flex;align-items:center;justify-content:center;background:var(--c-surface-2)"><svg class="ph-icon" style="width:28px;height:28px;color:var(--c-danger)" aria-hidden="true"><use href="/icons/phosphor.svg#file-text"></use></svg></div>`
|
||||
: m.media_type === 'video'
|
||||
? `<video src="${UI.escape(m.url)}" style="width:100%;height:100%;object-fit:cover;pointer-events:none"></video>`
|
||||
: `<img src="${UI.escape(m.url)}" style="width:100%;height:100%;object-fit:cover">`}
|
||||
</div>`).join('')}
|
||||
</div>`;
|
||||
}
|
||||
|
||||
view.innerHTML = `
|
||||
<div style="position:sticky;top:0;z-index:10;display:flex;align-items:center;
|
||||
justify-content:space-between;
|
||||
padding:calc(env(safe-area-inset-top,0px) + 8px) 16px 8px;
|
||||
background:var(--c-surface);border-bottom:1px solid var(--c-border);flex-shrink:0">
|
||||
<button id="diary-dv-back" style="display:flex;align-items:center;gap:6px;background:none;
|
||||
border:none;color:var(--c-primary);font-size:16px;cursor:pointer;padding:4px 0">
|
||||
← Zurück
|
||||
</button>
|
||||
${!_appState?.activeDog?.is_guest
|
||||
? `<button id="diary-dv-edit" style="background:none;border:none;color:var(--c-primary);
|
||||
font-size:14px;cursor:pointer;padding:4px 0">Bearbeiten</button>`
|
||||
: '<div></div>'}
|
||||
</div>
|
||||
|
||||
${mediaSection}
|
||||
|
||||
<div style="padding:var(--space-4);flex:1">
|
||||
${isMile ? `<div class="diary-detail-milestone-badge" style="margin-bottom:var(--space-3)">${UI.icon('trophy')} Meilenstein</div>` : ''}
|
||||
${entry.titel ? `<h2 style="margin:0 0 var(--space-2);font-size:1.3rem;font-weight:700;color:var(--c-text)">${UI.escape(entry.titel)}</h2>` : ''}
|
||||
<div style="display:flex;gap:var(--space-2);align-items:center;margin-bottom:var(--space-3);flex-wrap:wrap">
|
||||
<span class="badge badge-primary">${typ.icon} ${typ.label}</span>
|
||||
<span style="color:var(--c-text-secondary);font-size:var(--text-sm)">
|
||||
${entry.datum ? UI.time.format(entry.datum + 'T00:00:00') : ''}
|
||||
</span>
|
||||
</div>
|
||||
${entry.location_name ? `
|
||||
<div class="diary-detail-location" style="margin-bottom:var(--space-3)">
|
||||
<svg class="ph-icon" aria-hidden="true"><use href="/icons/phosphor.svg#map-pin"></use></svg>
|
||||
${entry.gps_lat
|
||||
? `<a href="https://maps.apple.com/?q=${encodeURIComponent(entry.location_name)}&ll=${entry.gps_lat},${entry.gps_lon}"
|
||||
target="_blank" rel="noopener" style="color:inherit">${UI.escape(entry.location_name)}</a>`
|
||||
: UI.escape(entry.location_name)}
|
||||
</div>` : ''}
|
||||
${dogsHtml}
|
||||
${entry.text
|
||||
? `<p style="white-space:pre-wrap;line-height:1.7;color:var(--c-text);margin:0 0 var(--space-4)">${UI.escape(_cleanText(entry.text))}</p>`
|
||||
: ''}
|
||||
${tags.length
|
||||
? `<div style="display:flex;flex-wrap:wrap;gap:var(--space-1)">
|
||||
${tags.map(t => `<span class="badge">${t}</span>`).join('')}
|
||||
</div>`
|
||||
: ''}
|
||||
</div>
|
||||
${entry.location_name ? `
|
||||
<div class="diary-detail-location" style="margin-bottom:var(--space-3)">
|
||||
<svg class="ph-icon" aria-hidden="true"><use href="/icons/phosphor.svg#map-pin"></use></svg>
|
||||
${entry.gps_lat ? `<a href="https://maps.apple.com/?q=${encodeURIComponent(entry.location_name)}&ll=${entry.gps_lat},${entry.gps_lon}" target="_blank" rel="noopener" style="color:inherit">${UI.escape(entry.location_name)}</a>` : UI.escape(entry.location_name)}
|
||||
</div>` : ''}
|
||||
${entry.text
|
||||
? `<p style="white-space:pre-wrap;line-height:1.6;color:var(--c-text);margin-bottom:var(--space-4)">${UI.escape(_cleanText(entry.text))}</p>`
|
||||
: ''}
|
||||
${tags.length
|
||||
? `<div style="display:flex;flex-wrap:wrap;gap:var(--space-1);margin-bottom:var(--space-4)">
|
||||
${tags.map(t => `<span class="badge">${t}</span>`).join('')}
|
||||
</div>`
|
||||
: ''}
|
||||
${dogsHtml}
|
||||
${photo}
|
||||
${!_appState?.activeDog?.is_guest ? `<button class="btn btn-secondary" style="width:100%;margin-top:var(--space-4)" id="detail-edit">Bearbeiten</button>` : ''}
|
||||
`;
|
||||
|
||||
UI.modal.open({ title: entry.titel || typ.label, body });
|
||||
document.body.appendChild(view);
|
||||
|
||||
// Bilder anklickbar machen (Lightbox)
|
||||
document.querySelector('#modal-container .modal-body')?.querySelectorAll('img').forEach(img => {
|
||||
img.style.cursor = 'zoom-in';
|
||||
img.addEventListener('click', () => _showLightbox(img.src));
|
||||
});
|
||||
// Zurück
|
||||
view.querySelector('#diary-dv-back').addEventListener('click', () => view.remove());
|
||||
|
||||
// Stern-Buttons: Cover-Bild setzen
|
||||
document.querySelectorAll('.diary-cover-btn').forEach(btn => {
|
||||
btn.addEventListener('click', async (ev) => {
|
||||
ev.stopPropagation();
|
||||
const mediaId = parseInt(btn.dataset.mediaId);
|
||||
try {
|
||||
await API.diary.setCover(_appState.activeDog.id, entry.id, mediaId);
|
||||
// Lokalen State aktualisieren
|
||||
if (entry.media_items) {
|
||||
entry.media_items.forEach(m => { m.is_cover = m.id === mediaId ? 1 : 0; });
|
||||
}
|
||||
entry.cover_url = (entry.media_items || []).find(m => m.id === mediaId)?.url || null;
|
||||
_updateEntryInList(entry);
|
||||
// Alle Sterne im Modal aktualisieren
|
||||
document.querySelectorAll('.diary-cover-btn').forEach(b => {
|
||||
const active = parseInt(b.dataset.mediaId) === mediaId;
|
||||
b.classList.toggle('diary-cover-btn--active', active);
|
||||
b.style.background = active ? '#f5c518' : 'rgba(0,0,0,.45)';
|
||||
b.style.color = active ? '#fff' : 'rgba(255,255,255,.7)';
|
||||
b.setAttribute('aria-label', active ? 'Cover-Bild' : 'Als Cover setzen');
|
||||
b.setAttribute('title', active ? 'Cover-Bild' : 'Als Cover setzen');
|
||||
const use = b.querySelector('use');
|
||||
if (use) use.setAttribute('href', `/icons/phosphor.svg#${active ? 'star-fill' : 'star'}`);
|
||||
});
|
||||
UI.toast.success('Cover-Bild gesetzt.');
|
||||
} catch {
|
||||
UI.toast.error('Cover konnte nicht gesetzt werden.');
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
document.getElementById('detail-edit')?.addEventListener('click', async () => {
|
||||
UI.modal.close();
|
||||
// Nur nachladen wenn location_name/gps_lat fehlen (älterer In-Memory-Eintrag)
|
||||
// Bearbeiten
|
||||
view.querySelector('#diary-dv-edit')?.addEventListener('click', async () => {
|
||||
view.remove();
|
||||
if (entry.location_name !== undefined || entry.gps_lat !== undefined) {
|
||||
_showForm(entry);
|
||||
} else {
|
||||
|
|
@ -505,11 +538,41 @@ window.Page_diary = (() => {
|
|||
const idx = _entries.findIndex(e => e.id === entry.id);
|
||||
if (idx !== -1) _entries[idx] = fresh;
|
||||
_showForm(fresh);
|
||||
} catch {
|
||||
_showForm(entry);
|
||||
}
|
||||
} catch { _showForm(entry); }
|
||||
}
|
||||
});
|
||||
|
||||
// Foto in Hero → Lightbox
|
||||
const photoUrls = allMedia.filter(m => m.media_type !== 'video').map(m => m.url);
|
||||
view.querySelector('#diary-dv-hero')?.querySelector('img')?.addEventListener('click', e => {
|
||||
const clickedIdx = parseInt(e.target.dataset.idx ?? 0);
|
||||
const photoIdx = allMedia.slice(0, clickedIdx+1).filter(m => m.media_type !== 'video').length - 1;
|
||||
_showLightbox(photoUrls, Math.max(0, photoIdx));
|
||||
});
|
||||
|
||||
// Thumbnail-Strip → Hero wechseln
|
||||
view.querySelector('#diary-dv-thumbs')?.addEventListener('click', e => {
|
||||
const thumb = e.target.closest('[data-idx]');
|
||||
if (!thumb) return;
|
||||
const i = parseInt(thumb.dataset.idx);
|
||||
const hero = view.querySelector('#diary-dv-hero');
|
||||
if (hero) hero.innerHTML = _heroHtml(allMedia[i]);
|
||||
// Foto in neuem Hero → Lightbox
|
||||
hero?.querySelector('img')?.addEventListener('click', ev => {
|
||||
const clickedIdx = parseInt(ev.target.dataset.idx ?? i);
|
||||
const photoIdx = allMedia.slice(0, clickedIdx+1).filter(m => m.media_type !== 'video').length - 1;
|
||||
_showLightbox(photoUrls, Math.max(0, photoIdx));
|
||||
});
|
||||
// Aktive Markierung
|
||||
view.querySelectorAll('#diary-dv-thumbs [data-idx]').forEach((t, j) => {
|
||||
t.style.borderColor = j === i ? 'var(--c-primary)' : 'transparent';
|
||||
});
|
||||
});
|
||||
|
||||
// Cover-Button: Stern-Icon auf aktiven Medien (optional, nur für eingeloggte)
|
||||
if (!_appState?.activeDog?.is_guest && allMedia.some(m => m.id)) {
|
||||
// Cover-Verwaltung über Edit-Dialog
|
||||
}
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------
|
||||
|
|
@ -618,11 +681,11 @@ window.Page_diary = (() => {
|
|||
<div id="diary-new-media-grid" class="diary-media-grid" style="display:none"></div>
|
||||
|
||||
<!-- versteckter Input — multiple für Mehrfachauswahl -->
|
||||
<input type="file" id="diary-media-input" accept="image/*,video/*" multiple style="display:none">
|
||||
<input type="file" id="diary-media-input" accept="image/*,video/*,application/pdf" multiple style="display:none">
|
||||
|
||||
<!-- Einzelner Button — iOS zeigt nativen Picker (Mediathek / Kamera / Datei) -->
|
||||
<label for="diary-media-input" class="btn btn-secondary" style="margin-top:var(--space-2);cursor:pointer;display:flex;align-items:center;gap:var(--space-2);justify-content:center">
|
||||
<svg class="ph-icon" aria-hidden="true"><use href="/icons/phosphor.svg#images"></use></svg>
|
||||
<svg class="ph-icon" aria-hidden="true"><use href="/icons/phosphor.svg#image"></use></svg>
|
||||
Fotos / Videos hinzufügen
|
||||
</label>
|
||||
</div>
|
||||
|
|
@ -661,7 +724,13 @@ window.Page_diary = (() => {
|
|||
grid.style.cssText = 'display:grid;grid-template-columns:repeat(auto-fill,minmax(90px,1fr));gap:8px;margin-bottom:8px';
|
||||
grid.innerHTML = _newFiles.map((f, i) => {
|
||||
const objUrl = URL.createObjectURL(f);
|
||||
const thumb = f.type.startsWith('video/')
|
||||
const thumb = f.type === 'application/pdf' || f.name?.endsWith('.pdf')
|
||||
? `<div style="display:flex;flex-direction:column;align-items:center;justify-content:center;
|
||||
height:100%;gap:4px;padding:8px;text-align:center">
|
||||
<svg class="ph-icon" style="width:32px;height:32px;color:var(--c-danger)" aria-hidden="true"><use href="/icons/phosphor.svg#file-text"></use></svg>
|
||||
<div style="font-size:10px;color:var(--c-text-secondary);word-break:break-all;line-height:1.2">${f.name}</div>
|
||||
</div>`
|
||||
: f.type.startsWith('video/')
|
||||
? `<video src="${objUrl}" class="diary-media-thumb" muted playsinline></video>`
|
||||
: `<img src="${objUrl}" alt="" class="diary-media-thumb">`;
|
||||
return `<div style="position:relative;aspect-ratio:1;border-radius:8px;overflow:hidden;background:var(--c-surface-2)" data-new-idx="${i}">
|
||||
|
|
@ -786,6 +855,7 @@ window.Page_diary = (() => {
|
|||
}
|
||||
});
|
||||
|
||||
|
||||
document.getElementById('diary-form-cancel')?.addEventListener('click', UI.modal.close);
|
||||
|
||||
// Milestone-Toggle
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue