UX: Formular-Buttons in Modal-Footer + Kalender-Icons amber
- Alle Formular-Buttons (health, praxen, diary, dog-profile, poison) aus dem scrollbaren Body in den festen Modal-Footer verschoben (form="form-id" Attribut, btn-Suche via document.querySelector) - Kalender-Icon Filter korrigiert: brightness(0)+invert(0.55) vermeidet Channel-Clipping bei sepia auf Weiß → ergibt echtes Amber (~#C4843A) - SW-Cache: by-v18 → by-v19
This commit is contained in:
parent
e5492841ec
commit
956e34db88
6 changed files with 57 additions and 38 deletions
|
|
@ -239,8 +239,10 @@
|
||||||
|
|
||||||
.form-control::placeholder { color: var(--c-text-muted); }
|
.form-control::placeholder { color: var(--c-text-muted); }
|
||||||
|
|
||||||
/* Kalender-Icon in Datumseingaben: Amber statt weiß/schwarz
|
/* Kalender-Icon in Datumseingaben: Amber statt schwarz
|
||||||
color-scheme: light → Browser rendert schwarzes Icon → Filter tönt es amber */
|
color-scheme: light → schwarzes Icon
|
||||||
|
invert(0.55) → mittleres Grau (vermeidet Clipping bei sepia auf Weiß)
|
||||||
|
→ sepia → saturate → brightness auf ~#C4843A bringen */
|
||||||
input[type="date"],
|
input[type="date"],
|
||||||
input[type="time"] {
|
input[type="time"] {
|
||||||
color-scheme: light;
|
color-scheme: light;
|
||||||
|
|
@ -248,7 +250,7 @@ input[type="time"] {
|
||||||
input[type="date"]::-webkit-calendar-picker-indicator,
|
input[type="date"]::-webkit-calendar-picker-indicator,
|
||||||
input[type="time"]::-webkit-calendar-picker-indicator {
|
input[type="time"]::-webkit-calendar-picker-indicator {
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
filter: sepia(1) saturate(1.8) hue-rotate(-8deg) brightness(0.85);
|
filter: brightness(0) invert(0.55) sepia(1) saturate(4) brightness(0.77);
|
||||||
}
|
}
|
||||||
|
|
||||||
.form-control:focus {
|
.form-control:focus {
|
||||||
|
|
|
||||||
|
|
@ -417,16 +417,17 @@ window.Page_diary = (() => {
|
||||||
object-fit:cover;border-radius:var(--radius-md);margin-top:var(--space-2)">
|
object-fit:cover;border-radius:var(--radius-md);margin-top:var(--space-2)">
|
||||||
</div>
|
</div>
|
||||||
` : ''}
|
` : ''}
|
||||||
<div style="display:flex;gap:var(--space-2);margin-top:var(--space-4)">
|
|
||||||
<button type="button" class="btn btn-secondary flex-1" id="diary-form-cancel">Abbrechen</button>
|
|
||||||
<button type="submit" class="btn btn-primary flex-1">
|
|
||||||
${isEdit ? 'Speichern' : 'Erstellen'}
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</form>
|
</form>
|
||||||
`;
|
`;
|
||||||
|
|
||||||
UI.modal.open({ title: isEdit ? 'Eintrag bearbeiten' : 'Neuer Eintrag', body });
|
const footer = `
|
||||||
|
<button type="button" class="btn btn-secondary flex-1" id="diary-form-cancel">Abbrechen</button>
|
||||||
|
<button type="submit" form="diary-form" class="btn btn-primary flex-1">
|
||||||
|
${isEdit ? 'Speichern' : 'Erstellen'}
|
||||||
|
</button>
|
||||||
|
`;
|
||||||
|
|
||||||
|
UI.modal.open({ title: isEdit ? 'Eintrag bearbeiten' : 'Neuer Eintrag', body, footer });
|
||||||
|
|
||||||
const form = document.getElementById('diary-form');
|
const form = document.getElementById('diary-form');
|
||||||
|
|
||||||
|
|
@ -454,7 +455,7 @@ window.Page_diary = (() => {
|
||||||
|
|
||||||
form.addEventListener('submit', async e => {
|
form.addEventListener('submit', async e => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
const submitBtn = form.querySelector('[type="submit"]');
|
const submitBtn = document.querySelector('[form="diary-form"][type="submit"]') || form.querySelector('[type="submit"]');
|
||||||
const fd = UI.formData(form);
|
const fd = UI.formData(form);
|
||||||
|
|
||||||
// dog_ids zusammenbauen: aktiver Hund + gewählte weitere
|
// dog_ids zusammenbauen: aktiver Hund + gewählte weitere
|
||||||
|
|
|
||||||
|
|
@ -210,7 +210,14 @@ window.Page_dog_profile = (() => {
|
||||||
// NEUEN HUND ANLEGEN (Modal) — auch aufrufbar via addNew()
|
// NEUEN HUND ANLEGEN (Modal) — auch aufrufbar via addNew()
|
||||||
// ----------------------------------------------------------
|
// ----------------------------------------------------------
|
||||||
function _openCreateModal() {
|
function _openCreateModal() {
|
||||||
UI.modal.open({ title: 'Weiteren Hund anlegen', body: _formHTML(null, true) });
|
UI.modal.open({
|
||||||
|
title: 'Weiteren Hund anlegen',
|
||||||
|
body: _formHTML(null, true),
|
||||||
|
footer: `
|
||||||
|
<button type="button" class="btn btn-secondary flex-1" id="dp-form-cancel">Abbrechen</button>
|
||||||
|
<button type="submit" form="dp-form" class="btn btn-primary flex-1">🐕 Hund anlegen</button>
|
||||||
|
`,
|
||||||
|
});
|
||||||
_bindForm(null, true);
|
_bindForm(null, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -218,7 +225,14 @@ window.Page_dog_profile = (() => {
|
||||||
// BEARBEITEN (Modal)
|
// BEARBEITEN (Modal)
|
||||||
// ----------------------------------------------------------
|
// ----------------------------------------------------------
|
||||||
function _openEditModal(dog) {
|
function _openEditModal(dog) {
|
||||||
UI.modal.open({ title: `${dog.name} bearbeiten`, body: _formHTML(dog, true) });
|
UI.modal.open({
|
||||||
|
title: `${dog.name} bearbeiten`,
|
||||||
|
body: _formHTML(dog, true),
|
||||||
|
footer: `
|
||||||
|
<button type="button" class="btn btn-secondary flex-1" id="dp-form-cancel">Abbrechen</button>
|
||||||
|
<button type="submit" form="dp-form" class="btn btn-primary flex-1">Speichern</button>
|
||||||
|
`,
|
||||||
|
});
|
||||||
_bindForm(dog, true);
|
_bindForm(dog, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -310,13 +324,14 @@ window.Page_dog_profile = (() => {
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
${!inModal ? `
|
||||||
<div style="display:flex;gap:var(--space-2);margin-top:var(--space-4)">
|
<div style="display:flex;gap:var(--space-2);margin-top:var(--space-4)">
|
||||||
${(dog || inModal) ? `<button type="button" class="btn btn-secondary flex-1"
|
${dog ? `<button type="button" class="btn btn-secondary flex-1"
|
||||||
id="dp-form-cancel">Abbrechen</button>` : ''}
|
id="dp-form-cancel">Abbrechen</button>` : ''}
|
||||||
<button type="submit" class="btn btn-primary flex-1">
|
<button type="submit" class="btn btn-primary flex-1">
|
||||||
${dog ? 'Speichern' : '🐕 Hund anlegen'}
|
${dog ? 'Speichern' : '🐕 Hund anlegen'}
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>` : ''}
|
||||||
|
|
||||||
${dog ? `
|
${dog ? `
|
||||||
<div style="margin-top:var(--space-5);padding-top:var(--space-4);
|
<div style="margin-top:var(--space-5);padding-top:var(--space-4);
|
||||||
|
|
@ -380,7 +395,7 @@ window.Page_dog_profile = (() => {
|
||||||
|
|
||||||
form.addEventListener('submit', async e => {
|
form.addEventListener('submit', async e => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
const btn = form.querySelector('[type="submit"]');
|
const btn = document.querySelector('[form="dp-form"][type="submit"]') || form.querySelector('[type="submit"]');
|
||||||
const fd = UI.formData(form);
|
const fd = UI.formData(form);
|
||||||
|
|
||||||
if (!fd.name?.trim()) {
|
if (!fd.name?.trim()) {
|
||||||
|
|
|
||||||
|
|
@ -782,15 +782,16 @@ window.Page_health = (() => {
|
||||||
${extraFields}
|
${extraFields}
|
||||||
${notizField}
|
${notizField}
|
||||||
${uploadField}
|
${uploadField}
|
||||||
<div style="display:flex;gap:var(--space-2);margin-top:var(--space-4)">
|
|
||||||
<button type="button" class="btn btn-secondary flex-1" id="health-form-cancel">Abbrechen</button>
|
|
||||||
<button type="submit" class="btn btn-primary flex-1">${isEdit ? 'Speichern' : 'Erstellen'}</button>
|
|
||||||
</div>
|
|
||||||
</form>
|
</form>
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
const footer = `
|
||||||
|
<button type="button" class="btn btn-secondary flex-1" id="health-form-cancel">Abbrechen</button>
|
||||||
|
<button type="submit" form="health-form" class="btn btn-primary flex-1">${isEdit ? 'Speichern' : 'Erstellen'}</button>
|
||||||
|
`;
|
||||||
|
|
||||||
const tabInfo = TABS.find(tab => tab.key === t) || TABS[0];
|
const tabInfo = TABS.find(tab => tab.key === t) || TABS[0];
|
||||||
UI.modal.open({ title: `${tabInfo.icon} ${isEdit ? 'Bearbeiten' : tabInfo.label}`, body });
|
UI.modal.open({ title: `${tabInfo.icon} ${isEdit ? 'Bearbeiten' : tabInfo.label}`, body, footer });
|
||||||
|
|
||||||
const form = document.getElementById('health-form');
|
const form = document.getElementById('health-form');
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
|
|
@ -807,7 +808,7 @@ window.Page_health = (() => {
|
||||||
|
|
||||||
form.addEventListener('submit', async e => {
|
form.addEventListener('submit', async e => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
const btn = form.querySelector('[type="submit"]');
|
const btn = document.querySelector('[form="health-form"][type="submit"]') || form.querySelector('[type="submit"]');
|
||||||
const fd = UI.formData(form);
|
const fd = UI.formData(form);
|
||||||
|
|
||||||
await UI.asyncButton(btn, async () => {
|
await UI.asyncButton(btn, async () => {
|
||||||
|
|
@ -1178,19 +1179,19 @@ window.Page_health = (() => {
|
||||||
Als ehemalige Praxis markieren (bei Umzug / Arztwechsel)
|
Als ehemalige Praxis markieren (bei Umzug / Arztwechsel)
|
||||||
</label>
|
</label>
|
||||||
</div>` : ''}
|
</div>` : ''}
|
||||||
<div style="display:flex;gap:var(--space-2);margin-top:var(--space-4)">
|
|
||||||
<button type="button" class="btn btn-secondary flex-1" id="praxis-cancel">Abbrechen</button>
|
|
||||||
<button type="submit" class="btn btn-primary flex-1">${isEdit ? 'Speichern' : 'Hinzufügen'}</button>
|
|
||||||
</div>
|
|
||||||
</form>
|
</form>
|
||||||
`,
|
`,
|
||||||
|
footer: `
|
||||||
|
<button type="button" class="btn btn-secondary flex-1" id="praxis-cancel">Abbrechen</button>
|
||||||
|
<button type="submit" form="praxis-form" class="btn btn-primary flex-1">${isEdit ? 'Speichern' : 'Hinzufügen'}</button>
|
||||||
|
`,
|
||||||
});
|
});
|
||||||
|
|
||||||
document.getElementById('praxis-cancel')?.addEventListener('click', UI.modal.close);
|
document.getElementById('praxis-cancel')?.addEventListener('click', UI.modal.close);
|
||||||
|
|
||||||
document.getElementById('praxis-form')?.addEventListener('submit', async e => {
|
document.getElementById('praxis-form')?.addEventListener('submit', async e => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
const btn = e.target.querySelector('[type="submit"]');
|
const btn = document.querySelector('[form="praxis-form"][type="submit"]') || e.target.querySelector('[type="submit"]');
|
||||||
const fd = UI.formData(e.target);
|
const fd = UI.formData(e.target);
|
||||||
|
|
||||||
await UI.asyncButton(btn, async () => {
|
await UI.asyncButton(btn, async () => {
|
||||||
|
|
|
||||||
|
|
@ -505,17 +505,17 @@ window.Page_poison = (() => {
|
||||||
border-radius:var(--radius-md);margin-top:var(--space-2)">
|
border-radius:var(--radius-md);margin-top:var(--space-2)">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div style="display:flex;gap:var(--space-2);margin-top:var(--space-4)">
|
|
||||||
<button type="button" class="btn btn-secondary flex-1"
|
|
||||||
id="pf-cancel">Abbrechen</button>
|
|
||||||
<button type="submit" class="btn btn-danger flex-1">
|
|
||||||
⚠️ Meldung abschicken
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</form>
|
</form>
|
||||||
`;
|
`;
|
||||||
|
|
||||||
UI.modal.open({ title: '⚠️ Giftköder melden', body });
|
const footer = `
|
||||||
|
<button type="button" class="btn btn-secondary flex-1" id="pf-cancel">Abbrechen</button>
|
||||||
|
<button type="submit" form="poison-form" class="btn btn-danger flex-1">
|
||||||
|
⚠️ Meldung abschicken
|
||||||
|
</button>
|
||||||
|
`;
|
||||||
|
|
||||||
|
UI.modal.open({ title: '⚠️ Giftköder melden', body, footer });
|
||||||
|
|
||||||
// Standort vorausfüllen wenn bekannt
|
// Standort vorausfüllen wenn bekannt
|
||||||
if (_userPos) {
|
if (_userPos) {
|
||||||
|
|
@ -559,7 +559,7 @@ window.Page_poison = (() => {
|
||||||
// Formular absenden
|
// Formular absenden
|
||||||
document.getElementById('poison-form')?.addEventListener('submit', async e => {
|
document.getElementById('poison-form')?.addEventListener('submit', async e => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
const submitBtn = e.target.querySelector('[type="submit"]');
|
const submitBtn = document.querySelector('[form="poison-form"][type="submit"]') || e.target.querySelector('[type="submit"]');
|
||||||
const fd = UI.formData(e.target);
|
const fd = UI.formData(e.target);
|
||||||
|
|
||||||
if (!fd.lat || !fd.lon) {
|
if (!fd.lat || !fd.lon) {
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@
|
||||||
Offline-Cache + Push Notifications
|
Offline-Cache + Push Notifications
|
||||||
============================================================ */
|
============================================================ */
|
||||||
|
|
||||||
const CACHE_VERSION = 'by-v18';
|
const CACHE_VERSION = 'by-v19';
|
||||||
const CACHE_STATIC = `${CACHE_VERSION}-static`;
|
const CACHE_STATIC = `${CACHE_VERSION}-static`;
|
||||||
|
|
||||||
// Diese Dateien werden beim Install gecacht (App Shell)
|
// Diese Dateien werden beim Install gecacht (App Shell)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue