From 13b6e4a60ad43f24e7281e9ae4d3640644cf2a89 Mon Sep 17 00:00:00 2001 From: colorlink Date: Fri, 16 Oct 2026 03:33:08 +0000 Subject: [PATCH] Admin UI: collapsible tool categories + per-card minimize + expand/collapse-all + AskTam.net footer (fixes Tools-tab lag at 300+ tools) Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01Q8t9GEyyLZbUQu26na1JQg --- assets/js/admin.js | 91 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 89 insertions(+), 2 deletions(-) diff --git a/assets/js/admin.js b/assets/js/admin.js index 94875b5..c200bd5 100644 --- a/assets/js/admin.js +++ b/assets/js/admin.js @@ -26,6 +26,91 @@ function updateCards(form){ }); } +/* ---- Collapsible categories + per-card minimize (keeps the Tools tab light) ---- */ +var LSKEY='asktamMcpCatCollapsed'; +function loadState(){try{return JSON.parse(localStorage.getItem(LSKEY)||'{}')||{};}catch(e){return {};}} +function saveState(m){try{localStorage.setItem(LSKEY,JSON.stringify(m));}catch(e){}} + +function initCollapsibleTools(){ + var form=document.getElementById('asktam-mcp-tools-form'); + if(!form)return; + var firstVisit=!localStorage.getItem(LSKEY); + var state=loadState(); + var cats=form.querySelectorAll('.asktam-mcp-category'); + + function setAll(collapsed){ + cats.forEach(function(cat){ + cat.classList.toggle('is-collapsed',collapsed); + state[cat.getAttribute('data-category')||'']=collapsed; + }); + saveState(state); + } + + // Global expand / collapse controls + var bulk=form.querySelector('.asktam-mcp-bulk-actions'); + if(bulk && !bulk.querySelector('.asktam-mcp-expand-all')){ + var wrap=document.createElement('span'); + wrap.className='asktam-mcp-collapse-tools'; + var exp=document.createElement('button');exp.type='button';exp.className='button asktam-mcp-expand-all';exp.textContent='Expand all'; + var col=document.createElement('button');col.type='button';col.className='button asktam-mcp-collapse-all';col.textContent='Collapse all'; + wrap.appendChild(exp);wrap.appendChild(col); + var save=bulk.querySelector('.asktam-mcp-bulk-save'); + if(save)bulk.insertBefore(wrap,save);else bulk.appendChild(wrap); + exp.addEventListener('click',function(){setAll(false);}); + col.addEventListener('click',function(){setAll(true);}); + } + + cats.forEach(function(cat){ + var id=cat.getAttribute('data-category')||''; + var header=cat.querySelector('.asktam-mcp-category-header'); + if(header && !header.querySelector('.asktam-mcp-cat-caret')){ + var caret=document.createElement('span'); + caret.className='asktam-mcp-cat-caret'; + caret.setAttribute('aria-hidden','true'); + caret.textContent='▾'; + header.insertBefore(caret,header.firstChild); + } + // Default: collapsed (keeps the page from rendering hundreds of cards at once) + var collapsed=(id in state)?!!state[id]:true; + cat.classList.toggle('is-collapsed',collapsed); + if(header && !header.dataset.collBound){ + header.dataset.collBound='1'; + header.addEventListener('click',function(e){ + if(e.target.closest('.asktam-mcp-category-actions'))return; // let All/None work + var now=!cat.classList.contains('is-collapsed'); + cat.classList.toggle('is-collapsed',now); + state[id]=now;saveState(state); + }); + } + }); + if(firstVisit){cats.forEach(function(cat){state[cat.getAttribute('data-category')||'']=true;});saveState(state);} + + // Per-card minimize (hides description + slug for that one tool) + form.querySelectorAll('.asktam-mcp-tool-card').forEach(function(card){ + if(card.querySelector('.asktam-mcp-card-min'))return; + var b=document.createElement('button'); + b.type='button'; + b.className='asktam-mcp-card-min'; + b.setAttribute('aria-label','Minimize tool'); + b.textContent='–'; + b.addEventListener('click',function(e){ + e.preventDefault();e.stopPropagation(); // don't toggle the tool's checkbox + var min=card.classList.toggle('is-min'); + b.textContent=min?'+':'–'; + }); + card.appendChild(b); + }); +} + +function initFooter(){ + var admin=document.querySelector('.asktam-mcp-admin'); + if(!admin||admin.querySelector('.asktam-mcp-footer'))return; + var f=document.createElement('div'); + f.className='asktam-mcp-footer'; + f.innerHTML='Built by AskTam.net'; + admin.appendChild(f); +} + function setBlock(codeId,copyId,text){ var c=document.getElementById(codeId); var t=document.getElementById(copyId); @@ -101,9 +186,11 @@ function initCopyButtons(){ }); } +function boot(){initToolsForm();initCollapsibleTools();initConnectionConfigs();initCopyButtons();initFooter();} + if(document.readyState==='loading'){ - document.addEventListener('DOMContentLoaded',function(){initToolsForm();initConnectionConfigs();initCopyButtons();}); + document.addEventListener('DOMContentLoaded',boot); }else{ - initToolsForm();initConnectionConfigs();initCopyButtons(); + boot(); } })();