diff --git a/src/admin/public/style.css b/src/admin/public/style.css index 8dee3f1..e6c7d07 100644 --- a/src/admin/public/style.css +++ b/src/admin/public/style.css @@ -291,7 +291,6 @@ pre { font-size: 0.8rem; white-space: pre-wrap; word-break: break-all; max-width .tree-node { margin-left: 0; } .tree-toggle { - cursor: pointer; user-select: none; padding: 0.4rem 0; display: flex; @@ -308,10 +307,16 @@ pre { font-size: 0.8rem; white-space: pre-wrap; word-break: break-all; max-width transition: transform 0.15s; width: 12px; text-align: center; + cursor: pointer; } .tree-toggle .arrow.open { transform: rotate(90deg); } +.tree-toggle .node-label { + cursor: pointer; + flex: 1; +} + .tree-children { display: none; } .tree-children.open { display: block; } diff --git a/src/admin/views/catalog.js b/src/admin/views/catalog.js index 0005b2c..486599b 100644 --- a/src/admin/views/catalog.js +++ b/src/admin/views/catalog.js @@ -12,7 +12,7 @@ export function renderCatalog(tree, products, filter, categories, subcategories, const editFormHtml = renderProductEditForm('/catalog/products/__ID__/edit', catOptions, subcatJson, locations) .replace(/`/g, '\\`').replace(/\$/g, '\\$'); - let treeHtml = '
No products found.
'; @@ -181,12 +181,17 @@ async function addCategoryInline() { function escHtml(s) { const d = document.createElement('div'); d.textContent = s; return d.innerHTML; } -document.querySelectorAll('.tree-toggle').forEach(el=>{el.addEventListener('click',()=>{ - const ch=el.nextElementSibling; if(!ch||!ch.classList.contains('tree-children')) return; - ch.classList.toggle('open'); el.querySelector('.arrow').classList.toggle('open'); +document.querySelectorAll('.tree-toggle .arrow').forEach(el=>{el.addEventListener('click',e=>{ + e.stopPropagation(); + const toggle=el.closest('.tree-toggle'); + const ch=toggle.nextElementSibling; if(!ch||!ch.classList.contains('tree-children')) return; + ch.classList.toggle('open'); el.classList.toggle('open'); +})}); +document.querySelectorAll('.tree-toggle .node-label').forEach(el=>{el.addEventListener('click',e=>{ + e.stopPropagation(); const loc=el.dataset.loc, cat=el.dataset.cat, sub=el.dataset.sub, all=el.dataset.all; if(loc||cat||sub||all){ let u='/catalog?'; if(loc) u+='loc='+loc; if(cat) u+='cat='+cat; if(sub) u+='sub='+sub; location.href=u; } -})}); +}); function openAdd(){ document.getElementById('modal-body').innerHTML=addFormTpl; initLocationSelects(null); document.getElementById('product-modal').style.display='flex'; } async function openEdit(id){ const r=await fetch('/catalog/products/'+id+'/json'); const p=await r.json(); document.getElementById('modal-body').innerHTML=editFormTpl.replace('/__ID__/','/'+p.id+'/'); fillEditForm(p); document.getElementById('product-modal').style.display='flex'; }