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,