From bbf49ec54636ea8e8df66f421a8d0b0de3544466 Mon Sep 17 00:00:00 2001 From: NW Date: Wed, 24 Jun 2026 22:57:38 +0100 Subject: [PATCH] fix: add location selectors (country/city/district) to product add/edit form MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The admin product form now has cascading dropdowns for Country → City → District that filter categories by location. Previously there was no way to select location when adding a product — only a static tag display on edit. - catalogProduct.js: replaced static location tags with 3 cascading selects - catalog.js: pass locations data, init JS for cascading selects + category filtering - catalog route: pass locations array to renderCatalog - style.css: added .pf-location-selects styling for the dropdown row --- src/admin/public/style.css | 16 +++++ src/admin/routes/catalog.js | 2 +- src/admin/views/catalog.js | 99 +++++++++++++++++++++++++++---- src/admin/views/catalogProduct.js | 21 ++++--- 4 files changed, 118 insertions(+), 20 deletions(-) diff --git a/src/admin/public/style.css b/src/admin/public/style.css index a6bc145..8dee3f1 100644 --- a/src/admin/public/style.css +++ b/src/admin/public/style.css @@ -444,6 +444,22 @@ pre { font-size: 0.8rem; white-space: pre-wrap; word-break: break-all; max-width flex-wrap: wrap; } +.pf-location-selects { + display: flex; + gap: 0.4rem; + flex-wrap: wrap; +} + +.pf-location-selects select { + flex: 1; + min-width: 120px; + padding: 0.4rem; + border: 1px solid #d1d5db; + border-radius: 6px; + font-size: 0.85rem; + background: #fff; +} + .pf-loc-tag { display: inline-block; padding: 0.2rem 0.5rem; diff --git a/src/admin/routes/catalog.js b/src/admin/routes/catalog.js index 8c40971..1452b3d 100644 --- a/src/admin/routes/catalog.js +++ b/src/admin/routes/catalog.js @@ -29,7 +29,7 @@ router.get('/', async (req, res) => { id: l.id, cats: (cl[l.id]||[]).map(c=>({...c, subs: sc[c.id]||[]})) }; } - res.send(renderCatalog(tree, products, { loc, cat, sub }, categories, subcategories, msg||'', msg_type||'info')); + res.send(renderCatalog(tree, products, { loc, cat, sub }, categories, subcategories, locations, msg||'', msg_type||'info')); }); router.post('/locations', async (req, res) => { diff --git a/src/admin/views/catalog.js b/src/admin/views/catalog.js index d410f43..15e36de 100644 --- a/src/admin/views/catalog.js +++ b/src/admin/views/catalog.js @@ -1,13 +1,14 @@ import { layout, flash } from './layout.js'; import { renderProductEditForm } from './catalogProduct.js'; -export function renderCatalog(tree, products, filter, categories, subcategories, msg, msgType) { +export function renderCatalog(tree, products, filter, categories, subcategories, locations, msg, msgType) { const { loc, cat, sub } = filter; 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 addFormHtml = renderProductEditForm('/catalog/products', catOptions, subcatJson) + const locJson = JSON.stringify(locations || []); + const addFormHtml = renderProductEditForm('/catalog/products', catOptions, subcatJson, locations) .replace(/`/g, '\\`').replace(/\$/g, '\\$'); - const editFormHtml = renderProductEditForm('/catalog/products/__ID__/edit', catOptions, subcatJson) + const editFormHtml = renderProductEditForm('/catalog/products/__ID__/edit', catOptions, subcatJson, locations) .replace(/`/g, '\\`').replace(/\$/g, '\\$'); let treeHtml = '
All Products(' + products.length + ')
'; @@ -67,15 +68,93 @@ export function renderCatalog(tree, products, filter, categories, subcategories,