diff --git a/src/admin/routes/catalog.js b/src/admin/routes/catalog.js index 1452b3d..1ef57f0 100644 --- a/src/admin/routes/catalog.js +++ b/src/admin/routes/catalog.js @@ -70,6 +70,14 @@ router.post('/categories', async (req, res) => { res.redirect('/catalog?msg=Category+added&msg_type=success'); }); +router.post('/categories/json', async (req, res) => { + const { name, location_id } = req.body; + if (!name || !location_id) return res.status(400).json({ error: 'Name and location required' }); + const result = await db.runAsync('INSERT INTO categories (name,location_id) VALUES (?,?)', [name.trim(), location_id]); + const cat = await db.getAsync('SELECT * FROM categories WHERE id=?', [result.lastInsertRowid]); + res.json(cat); +}); + router.post('/categories/:id/delete', async (req, res) => { const c = await db.getAsync('SELECT COUNT(*) as n FROM products WHERE category_id=?', [req.params.id]); if (c?.n > 0) return res.redirect('/catalog?msg=Cannot+delete+has+products&msg_type=error'); diff --git a/src/admin/routes/catalogProducts.js b/src/admin/routes/catalogProducts.js index bbe327d..3242ce5 100644 --- a/src/admin/routes/catalogProducts.js +++ b/src/admin/routes/catalogProducts.js @@ -15,30 +15,30 @@ const router = Router(); router.post('/products', upload.fields([{ name: 'photo_file' }, { name: 'hidden_photo_file' }]), async (req, res) => { const { name, price, quantity_in_stock, description, photo_url, hidden_photo_url, - hidden_coordinates, hidden_description, private_data, category_id, subcategory_id } = req.body; + hidden_coordinates, hidden_description, private_data, category_id, subcategory_id, location_id } = req.body; if (!name || !price || !category_id) return res.redirect('/catalog?msg=Name+price+category+required&msg_type=error'); const pu = req.files?.photo_file?.[0] ? `/uploads/${req.files.photo_file[0].filename}` : (photo_url || ''); const hu = req.files?.hidden_photo_file?.[0] ? `/uploads/${req.files.hidden_photo_file[0].filename}` : (hidden_photo_url || ''); - const locRow = await db.getAsync('SELECT location_id FROM categories WHERE id=?', [category_id]); + const locId = location_id || (await db.getAsync('SELECT location_id FROM categories WHERE id=?', [category_id]))?.location_id || null; await db.runAsync(`INSERT INTO products (name,price,quantity_in_stock,description,photo_url,hidden_photo_url, hidden_coordinates,hidden_description,private_data,category_id,subcategory_id,location_id) VALUES (?,?,?,?,?,?,?,?,?,?,?,?)`, [name.trim(), parseFloat(price), parseInt(quantity_in_stock)||0, description||'', pu, hu, - hidden_coordinates||'', hidden_description||'', private_data||'', category_id, subcategory_id||null, locRow?.location_id||null]); + hidden_coordinates||'', hidden_description||'', private_data||'', category_id, subcategory_id||null, locId]); res.redirect('/catalog?msg=Product+added&msg_type=success'); }); router.post('/products/:id/edit', upload.fields([{ name: 'photo_file' }, { name: 'hidden_photo_file' }]), async (req, res) => { const { name, price, quantity_in_stock, description, photo_url, hidden_photo_url, - hidden_coordinates, hidden_description, private_data, category_id, subcategory_id } = req.body; + hidden_coordinates, hidden_description, private_data, category_id, subcategory_id, location_id } = req.body; if (!name || !price || !category_id) return res.redirect('/catalog?msg=Name+price+category+required&msg_type=error'); const pu = req.files?.photo_file?.[0] ? `/uploads/${req.files.photo_file[0].filename}` : (photo_url || ''); const hu = req.files?.hidden_photo_file?.[0] ? `/uploads/${req.files.hidden_photo_file[0].filename}` : (hidden_photo_url || ''); - const locRow = await db.getAsync('SELECT location_id FROM categories WHERE id=?', [category_id]); + const locId = location_id || (await db.getAsync('SELECT location_id FROM categories WHERE id=?', [category_id]))?.location_id || null; await db.runAsync(`UPDATE products SET name=?,price=?,quantity_in_stock=?,description=?,photo_url=?,hidden_photo_url=?, hidden_coordinates=?,hidden_description=?,private_data=?,category_id=?,subcategory_id=?,location_id=? WHERE id=?`, [name.trim(), parseFloat(price), parseInt(quantity_in_stock)||0, description||'', pu, hu, - hidden_coordinates||'', hidden_description||'', private_data||'', category_id, subcategory_id||null, locRow?.location_id||null, req.params.id]); + hidden_coordinates||'', hidden_description||'', private_data||'', category_id, subcategory_id||null, locId, req.params.id]); res.redirect('/catalog?msg=Product+updated&msg_type=success'); }); diff --git a/src/admin/views/catalog.js b/src/admin/views/catalog.js index 15e36de..0005b2c 100644 --- a/src/admin/views/catalog.js +++ b/src/admin/views/catalog.js @@ -3,9 +3,10 @@ import { renderProductEditForm } from './catalogProduct.js'; export function renderCatalog(tree, products, filter, categories, subcategories, locations, msg, msgType) { const { loc, cat, sub } = filter; - const catOptions = categories.map(c => ``).join(''); + const catOptions = categories.map(c => ``).join(''); const subcatJson = JSON.stringify(subcategories.map(s => ({ id: s.id, name: s.name, category_id: s.category_id }))); const locJson = JSON.stringify(locations || []); + const catJson = JSON.stringify(categories.map(c => ({ id: c.id, name: c.name, location_id: c.location_id }))); const addFormHtml = renderProductEditForm('/catalog/products', catOptions, subcatJson, locations) .replace(/`/g, '\\`').replace(/\$/g, '\\$'); const editFormHtml = renderProductEditForm('/catalog/products/__ID__/edit', catOptions, subcatJson, locations) @@ -69,6 +70,7 @@ export function renderCatalog(tree, products, filter, categories, subcategories,