Actualiser assets/js/app.js
CI / PHP Syntax Check (push) Has been cancelled
CI / JavaScript Lint (push) Has been cancelled
CI / Docker Build Test (push) Has been cancelled
CI / Validate Translation Files (push) Has been cancelled
CI / Auto-merge develop → main (push) Has been cancelled
CI / Create GitHub Release (push) Has been cancelled

This commit is contained in:
2026-06-20 08:59:36 +00:00
parent 78310f9fe9
commit ecf7ec53fd
+21 -4
View File
@@ -2401,7 +2401,7 @@ function updateSubcategoryField(selectId, groupId, category, selectedValue = '')
const list = SUBCATEGORIES_BY_CATEGORY[category]; const list = SUBCATEGORIES_BY_CATEGORY[category];
select.innerHTML = getSubcategoryOptionsHtml(category, selectedValue); select.innerHTML = getSubcategoryOptionsHtml(category, selectedValue);
if (group) { if (group) {
group.style.display = (list && list.length > 0) ? 'block' : 'none'; group.style.display = 'block';
const mark = group.querySelector('.subcategory-required-mark'); const mark = group.querySelector('.subcategory-required-mark');
if (mark) { if (mark) {
mark.style.color = '#e74c3c'; mark.style.color = '#e74c3c';
@@ -7794,9 +7794,10 @@ window._editingProduct = {
const itemCatForEdit = mapToLocalCategory(item.category, item.name, item.brand); const itemCatForEdit = mapToLocalCategory(item.category, item.name, item.brand);
const itemSubcatOptions = getSubcategoryOptionsHtml(itemCatForEdit, item.subcategory || ''); const itemSubcatOptions = getSubcategoryOptionsHtml(itemCatForEdit, item.subcategory || '');
const itemSubcatList = SUBCATEGORIES_BY_CATEGORY[itemCatForEdit]; const itemSubcatVisible = 'block';
const itemSubcatVisible = (itemSubcatList && itemSubcatList.length > 0) ? 'block' : 'none';
const itemSubcatRequired = REQUIRED_SUBCATEGORY_CATEGORIES.includes(itemCatForEdit); const itemSubcatRequired = REQUIRED_SUBCATEGORY_CATEGORIES.includes(itemCatForEdit);
let itemTagsSelected = [];
try { itemTagsSelected = JSON.parse(item.tags || '[]'); } catch (e) { itemTagsSelected = []; }
// Rebuild modal content for editing (don't close and reopen - just replace content) // Rebuild modal content for editing (don't close and reopen - just replace content)
document.getElementById('modal-content').innerHTML = ` document.getElementById('modal-content').innerHTML = `
@@ -7805,6 +7806,10 @@ window._editingProduct = {
<button class="modal-close" onclick="closeModal()"></button> <button class="modal-close" onclick="closeModal()"></button>
</div> </div>
<form class="form" onsubmit="submitEditInventory(event, ${id}, ${item.product_id})"> <form class="form" onsubmit="submitEditInventory(event, ${id}, ${item.product_id})">
<div class="form-group">
<label>${t('edit.label_name')}</label>
<input type="text" id="edit-inv-name" class="form-input" value="${escapeHtml(item.name || '')}" required>
</div>
<div class="form-group"> <div class="form-group">
<label>${t('product.category_label')}</label> <label>${t('product.category_label')}</label>
<select id="edit-inv-category" class="form-input" onchange="onEditInvCategoryChange()"> <select id="edit-inv-category" class="form-input" onchange="onEditInvCategoryChange()">
@@ -7817,6 +7822,15 @@ window._editingProduct = {
${itemSubcatOptions} ${itemSubcatOptions}
</select> </select>
</div> </div>
<div class="form-group">
<label>🏷 Tags</label>
<div id="edit-inv-tags-picker" class="rl-tags-picker">
${RECIPE_TAGS.map(tag => {
const selected = itemTagsSelected.includes(tag.key);
return `<button type="button" class="btn btn-small ${selected ? 'btn-primary' : 'btn-secondary'} inv-tag-chip" data-tag="${tag.key}" onclick="this.classList.toggle('btn-primary');this.classList.toggle('btn-secondary')">${tag.icon} ${escapeHtml(tag.label)}</button>`;
}).join('')}
</div>
</div>
<div class="form-group"> <div class="form-group">
<label>${t('product.barcode_label')}</label> <label>${t('product.barcode_label')}</label>
<div class="expiry-input-row"> <div class="expiry-input-row">
@@ -7972,10 +7986,12 @@ async function submitEditInventory(e, id, productId) {
const editedItem = currentInventory.find(i => i.id === id) || {}; const editedItem = currentInventory.find(i => i.id === id) || {};
const barcode = (document.getElementById('edit-inv-barcode')?.value || '').trim(); const barcode = (document.getElementById('edit-inv-barcode')?.value || '').trim();
const editedName = (document.getElementById('edit-inv-name')?.value || '').trim() || editedItem.name;
const selectedTags = Array.from(document.querySelectorAll('#edit-inv-tags-picker .inv-tag-chip.btn-primary')).map(b => b.dataset.tag);
await api('product_save', {}, 'POST', { await api('product_save', {}, 'POST', {
id: productId, id: productId,
barcode: barcode || null, barcode: barcode || null,
name: editedItem.name, name: editedName,
brand: editedItem.brand || '', brand: editedItem.brand || '',
category: category, category: category,
subcategory: subcategory || null, subcategory: subcategory || null,
@@ -7984,6 +8000,7 @@ async function submitEditInventory(e, id, productId) {
default_quantity: editedItem.default_quantity || 1, default_quantity: editedItem.default_quantity || 1,
package_unit: editedItem.package_unit || '', package_unit: editedItem.package_unit || '',
notes: editedItem.notes || '', notes: editedItem.notes || '',
tags: selectedTags,
}); });
await api('inventory_update', {}, 'POST', payload); await api('inventory_update', {}, 'POST', payload);