feat: banner opened items show 'aperto da X giorni in frigo' instead of 'scaduto'

When inventory item has opened_at set, the expired banner now shows:
- Title: '[Nome] — Aperto da troppo tempo!' (instead of '— Scaduto!')
- Detail: 'Aperto da N giorni in [icon] [location] · hai ancora X'
Also removed hardcoded Italian 'scade il' string from non-opened expired detail.
This commit is contained in:
dadaloop82
2026-05-11 17:11:07 +00:00
parent 85090ecc9f
commit 3391106010
5 changed files with 63 additions and 15 deletions
+43 -13
View File
@@ -3746,10 +3746,32 @@ function renderBannerItem() {
if (entry.type === 'expired') {
const item = entry.data;
const qtyDisplay = formatQuantity(item.quantity, item.unit, item.default_quantity, item.package_unit);
const daysText = item.days_expired === 0
? t('expiry.expired_today_long')
: t('expiry.expired_ago_long').replace('{n}', item.days_expired);
const isOpenedExpiry = !!item.opened_at;
const safety = getExpiredSafety(item, item.days_expired);
let daysText, suffix;
if (isOpenedExpiry) {
const todayMs = new Date(); todayMs.setHours(0, 0, 0, 0);
const daysSinceOpened = Math.round((todayMs - new Date(item.opened_at)) / 86400000);
daysText = daysSinceOpened === 0
? t('expiry.opened_today_long')
: t('expiry.opened_ago_long').replace('{n}', daysSinceOpened);
suffix = safety.level === 'ok'
? t('expiry.opened_suffix_ok')
: safety.level === 'warning'
? t('expiry.opened_suffix_warning')
: t('expiry.opened_suffix');
} else {
daysText = item.days_expired === 0
? t('expiry.expired_today_long')
: t('expiry.expired_ago_long').replace('{n}', item.days_expired);
suffix = safety.level === 'ok'
? t('expiry.expired_suffix_ok')
: safety.level === 'warning'
? t('expiry.expired_suffix_warning')
: t('expiry.expired_suffix');
}
if (safety.level === 'danger') {
banner.className = 'alert-banner banner-expired banner-expired-danger';
iconEl.textContent = '🚫';
@@ -3760,16 +3782,24 @@ function renderBannerItem() {
banner.className = 'alert-banner banner-expired banner-expired-ok';
iconEl.textContent = '✅';
}
const expiredSuffix = safety.level === 'ok'
? t('expiry.expired_suffix_ok')
: safety.level === 'warning'
? t('expiry.expired_suffix_warning')
: t('expiry.expired_suffix');
titleEl.textContent = `${item.name}${item.brand ? ' (' + item.brand + ')' : ''} ${expiredSuffix}`;
const baseDetail = t('dashboard.banner_expired_detail').replace('{when}', daysText).replace('{qty}', qtyDisplay);
const locationTag = item.location ? ` · <strong>${escapeHtml(item.location)}</strong>` : '';
const expiryTag = item.expiry_date ? ` · scade il <strong>${escapeHtml(item.expiry_date)}</strong>` : '';
detailEl.innerHTML = `${baseDetail}${locationTag}${expiryTag} <span class="banner-safety-tip banner-safety-${safety.level}">${safety.icon} ${safety.tip}</span>`;
titleEl.textContent = `${item.name}${item.brand ? ' (' + item.brand + ')' : ''} ${suffix}`;
let baseDetail;
if (isOpenedExpiry) {
const locLabel = (LOCATIONS[item.location]
? LOCATIONS[item.location].icon + ' ' + LOCATIONS[item.location].label
: (item.location || ''));
baseDetail = t('dashboard.banner_opened_detail')
.replace('{when}', daysText)
.replace('{location}', escapeHtml(locLabel))
.replace('{qty}', qtyDisplay);
} else {
baseDetail = t('dashboard.banner_expired_detail').replace('{when}', daysText).replace('{qty}', qtyDisplay);
const locationTag = item.location ? ` · <strong>${escapeHtml(item.location)}</strong>` : '';
const expiryTag = item.expiry_date ? ` · ${escapeHtml(item.expiry_date)}` : '';
baseDetail += locationTag + expiryTag;
}
detailEl.innerHTML = `${baseDetail} <span class="banner-safety-tip banner-safety-${safety.level}">${safety.icon} ${safety.tip}</span>`;
let btns = '';
if (safety.level !== 'danger') {
btns += `<button class="btn-banner btn-banner-use" onclick="bannerQuickUse()">${t('dashboard.banner_expired_action_use')}</button>`;