diff --git a/public/assets/js/ui-list.js b/public/assets/js/ui-list.js index 1a9b529..ecdeb18 100644 --- a/public/assets/js/ui-list.js +++ b/public/assets/js/ui-list.js @@ -99,13 +99,12 @@ export async function loadList(resource){ const prevBtn = ``; const delBtn = ``; - const debugBtn= `GET`; return `
${name || '(ohne Name)'}
#${item.id}
${parentBadge(resource,item)}
-
${[openBtn, editBtn, prevBtn, delBtn, debugBtn].filter(Boolean).join('')}
+
${[openBtn, editBtn, prevBtn, delBtn].filter(Boolean).join('')}
`; }).join(''); diff --git a/public/assets/js/ui-tools.js b/public/assets/js/ui-tools.js deleted file mode 100644 index d7e98cc..0000000 --- a/public/assets/js/ui-tools.js +++ /dev/null @@ -1,158 +0,0 @@ -// assets/js/ui-tools.js -// Öffnet API-Health (JSON), DB-Doctor (Iframe) & beliebige JSON-GETs im Popup, -// ohne die Seite zu verlassen. Links bleiben als Fallback nutzbar. - -(function () { - const dlg = document.getElementById('toolsDialog'); - if (!dlg) return; - - const title = document.getElementById('toolsTitle'); - const btnX = document.getElementById('toolsClose'); - const btnCopy = document.getElementById('toolsCopy'); - const btnDl = document.getElementById('toolsDownload'); - - const jsonWrap = document.getElementById('toolsJsonWrap'); - const jsonPre = document.getElementById('toolsJsonPre'); - const frame = document.getElementById('toolsFrame'); - - function showJson(obj, ttl) { - title.textContent = ttl || 'Antwort (JSON)'; - const txt = (typeof obj === 'string') ? obj : JSON.stringify(obj, null, 2); - jsonPre.textContent = txt; - jsonWrap.classList.remove('hidden'); - frame.classList.add('hidden'); - btnCopy.classList.remove('hidden'); - btnDl.classList.remove('hidden'); - try { dlg.showModal(); } catch {} - } - - function showFrame(url, ttl) { - title.textContent = ttl || 'Werkzeug'; - frame.src = url + (url.includes('?') ? '&' : '?') + 't=' + Date.now(); - frame.classList.remove('hidden'); - jsonWrap.classList.add('hidden'); - btnCopy.classList.add('hidden'); - btnDl.classList.add('hidden'); - try { dlg.showModal(); } catch {} - } - - btnX?.addEventListener('click', () => { - try { dlg.close(); } catch {} - frame.src = 'about:blank'; - }); - - btnCopy?.addEventListener('click', async () => { - const txt = jsonPre.textContent || ''; - try { - await navigator.clipboard.writeText(txt); - // optional: kleines Feedback - (window.Toast?.show || window.toast || (()=>{}))('In Zwischenablage kopiert'); - } catch {} - }); - - btnDl?.addEventListener('click', () => { - const blob = new Blob([jsonPre.textContent || ''], { type:'application/json;charset=utf-8' }); - const a = document.createElement('a'); - a.href = URL.createObjectURL(blob); - const stamp = new Date().toISOString().replace(/[:.]/g,'-'); - a.download = `response-${stamp}.json`; - document.body.appendChild(a); - a.click(); - setTimeout(()=>{ URL.revokeObjectURL(a.href); a.remove(); }, 0); - }); - - // ------------------------------------------------------------ - // 1) Offizieller Weg: Links mit data-popup="json" | "frame" - // ------------------------------------------------------------ - document.addEventListener('click', async (ev) => { - const a = ev.target.closest('a[data-popup]'); - if (!a) return; - - const mode = (a.getAttribute('data-popup') || '').toLowerCase(); - const href = a.getAttribute('href') || '#'; - const ttl = a.getAttribute('data-title') || a.textContent.trim() || 'Werkzeug'; - - if (!/^json|frame$/.test(mode)) return; - // Cmd/Strg-Klick & Mittelklick respektieren (neuer Tab) - if (ev.metaKey || ev.ctrlKey || ev.button === 1) return; - - ev.preventDefault(); - - if (mode === 'frame') { - showFrame(href, ttl); - return; - } - - // mode === 'json' - try { - const r = await fetch(href, { credentials: 'include' }); - const txt = await r.text(); - let data = null; - try { data = JSON.parse(txt); } catch { data = txt; } - showJson(data, ttl); - } catch (e) { - showJson({ ok:false, error: String(e) }, ttl); - } - }); - - // ------------------------------------------------------------ - // 2) Fallback: *alle* API-GET-Links (action=get) ohne data-popup - // -> automatisch im JSON-Popup öffnen - // ------------------------------------------------------------ - document.addEventListener('click', async (ev) => { - const a = ev.target.closest('a'); - if (!a) return; - // bereits oben behandelt - if (a.hasAttribute('data-popup')) return; - - const href = a.getAttribute('href') || ''; - // nur api.php-GET-Routen mit action=get abfangen - if (!/api\.php/i.test(href) || !/[?&]action=get(&|$)/i.test(href)) return; - - // Cmd/Strg/Mittelklick respektieren - if (ev.metaKey || ev.ctrlKey || ev.button === 1) return; - - ev.preventDefault(); - - const makeTitle = () => { - try { - const u = new URL(href, location.href); - const res = u.searchParams.get('resource') || 'resource'; - const id = u.searchParams.get('id') || ''; - // Optional: Name aus data-title wenn vorhanden - const custom = a.getAttribute('data-title'); - return custom || `GET ${res}${id ? ` #${id}` : ''}`; - } catch { return 'GET'; } - }; - - const title = makeTitle(); - - // Popup öffnen (wie oben) - try { - const r = await fetch(href, { credentials: 'include' }); - const txt = await r.text(); - let data = null; - try { data = JSON.parse(txt); } catch { data = txt; } - showJson(data, title); - } catch (e) { - showJson({ ok:false, error: String(e) }, title); - } - }, true); - - // Utility: Öffnen aus Code - window.AdminTools = { - openJson(url, title) { - fetch(url, { credentials: 'include' }) - .then(r => r.text()) - .then(txt => { - try { showJson(JSON.parse(txt), title); } - catch { showJson(txt, title); } - }) - .catch(err => showJson({ ok:false, error:String(err) }, title)); - }, - openFrame(url, title) { - showFrame(url, title); - } - }; -})(); - diff --git a/public/index.php b/public/index.php index 1738ec9..df8f1a3 100644 --- a/public/index.php +++ b/public/index.php @@ -49,17 +49,6 @@ $assetVersion = defined('ASSET_VERSION') ? ASSET_VERSION : time();
- - - API-Health - - DB-Doctor
@@ -141,30 +130,9 @@ $assetVersion = defined('ASSET_VERSION') ? ASSET_VERSION : time(); - - -
-
- Werkzeug - - - -
- - - - - - -
-
-
-