diff --git a/assets/js/app.js b/assets/js/app.js index 169ed5c..ed1486b 100644 --- a/assets/js/app.js +++ b/assets/js/app.js @@ -2499,9 +2499,24 @@ function _injectKioskOverlay() { _kioskBridge.hardReload(); }); + // Settings button — replaces the native Android settings button + const settBtn = document.createElement('button'); + settBtn.id = '_kiosk_settings_btn'; + settBtn.textContent = '\u2699\uFE0F'; + settBtn.title = t('settings.title') || 'Settings'; + settBtn.style.cssText = btnStyle.replace('font-size:15px', 'font-size:16px'); + settBtn.addEventListener('click', (e) => { + e.stopPropagation(); + showPage('settings'); + }); + wrap.appendChild(exitBtn); wrap.appendChild(refBtn); + wrap.appendChild(settBtn); headerLeft.appendChild(wrap); + + // Permanently hide the native Android settings button — replaced by the web overlay button above. + try { _kioskBridge.setNativeSettingsVisible(false); } catch(_) {} } function renderAppliances(appliances) { @@ -3604,8 +3619,16 @@ async function loadDashboard() { if (days !== null && days !== undefined) { let expiryClass, expiryText; if (!isEdible) { - expiryClass = 'opened-expiry-spoiled'; - expiryText = t('expiry.badge_expired'); + // Only show the red ⛔ badge for items that are genuinely dangerous. + // For conserve/condiments classified as safe, use a gentler amber badge. + const spoiledSafety = getExpiredSafety(item, Math.abs(item.days_to_expiry ?? 1)); + if (spoiledSafety.level === 'ok') { + expiryClass = 'opened-expiry-soon'; + expiryText = '\u26A0\uFE0F ' + t('expiry.badge_check_soon'); + } else { + expiryClass = 'opened-expiry-spoiled'; + expiryText = t('expiry.badge_expired'); + } } else if (days > 365) { expiryClass = 'opened-expiry-ok'; expiryText = t('expiry.badge_stable'); @@ -4887,8 +4910,8 @@ function showItemDetail(inventoryId, productId) { function closeModal() { document.getElementById('modal-overlay').style.display = 'none'; clearMoveModalTimer(); - // Restore native kiosk settings button visibility - try { if (typeof _kioskBridge !== 'undefined') _kioskBridge.setNativeSettingsVisible(true); } catch (_) {} + // Native kiosk settings button is permanently replaced by the web overlay button — keep hidden. + try { if (typeof _kioskBridge !== 'undefined') _kioskBridge.setNativeSettingsVisible(false); } catch (_) {} _cancelScaleAutoConfirm(false); _scaleRecipeAutoFillPaused = false; _scaleUserDismissed = false; diff --git a/index.html b/index.html index 031884d..5b1cb1d 100644 --- a/index.html +++ b/index.html @@ -67,7 +67,7 @@

- EverShelfv1.7.12 + EverShelfv1.7.13

diff --git a/translations/de.json b/translations/de.json index 337806d..8dbde5c 100644 --- a/translations/de.json +++ b/translations/de.json @@ -717,7 +717,8 @@ "opened_suffix": "— Zu lange geöffnet!", "opened_suffix_ok": "— Geöffnet (noch ok)", "opened_suffix_warning": "— Geöffnet (erst prüfen)", - "days_compact": "{n}T" + "days_compact": "{n}T", + "badge_check_soon": "Bald prüfen" }, "status": { "ok": "OK", diff --git a/translations/en.json b/translations/en.json index 1cb474a..f3ff1b6 100644 --- a/translations/en.json +++ b/translations/en.json @@ -717,7 +717,8 @@ "opened_suffix": "— Opened too long!", "opened_suffix_ok": "— Opened (still ok)", "opened_suffix_warning": "— Opened (check first)", - "days_compact": "{n}d" + "days_compact": "{n}d", + "badge_check_soon": "Check soon" }, "status": { "ok": "OK", diff --git a/translations/it.json b/translations/it.json index 6bbff69..ee3de8b 100644 --- a/translations/it.json +++ b/translations/it.json @@ -717,7 +717,8 @@ "opened_suffix": "— Aperto da troppo tempo!", "opened_suffix_ok": "— Aperto (ancora ok)", "opened_suffix_warning": "— Aperto (controlla)", - "days_compact": "{n}gg" + "days_compact": "{n}gg", + "badge_check_soon": "Controlla presto" }, "status": { "ok": "OK",