diff --git a/backend/src/routes/search.js b/backend/src/routes/search.js index 6fb6e80..4bcb670 100644 --- a/backend/src/routes/search.js +++ b/backend/src/routes/search.js @@ -4,54 +4,83 @@ const { authenticate } = require('../middleware/auth'); const router = express.Router(); router.get('/', authenticate, (req, res) => { - const q = (req.query.q || '').trim(); - if (q.length < 2) return res.json({ links:[], snippets:[], calculations:[], orders:[] }); + const q = (req.query.q || '').trim(); + if (q.length < 2) return res.json({ + links:[], folders:[], snippets:[], calculations:[], orders:[], + todos:[], files:[], file_folders:[], push_schedules:[], calendar_feeds:[], qr_codes:[] + }); const uid = req.user.id; const like = `%${q.toLowerCase()}%`; - const links = db.prepare(` - SELECT id, title, url, icon, description, folder_id FROM link_list + const safeAll = (fn) => { try { return fn(); } catch { return []; } }; + + const links = safeAll(() => db.prepare(` + SELECT id, title, url, icon, description FROM link_list WHERE user_id=? AND (LOWER(title) LIKE ? OR LOWER(url) LIKE ? OR LOWER(description) LIKE ?) ORDER BY title LIMIT 8 - `).all(uid, like, like, like); + `).all(uid, like, like, like)); - let folders = []; - try { - folders = db.prepare(` - SELECT id, name, icon FROM link_list_folders - WHERE user_id=? AND LOWER(name) LIKE ? - ORDER BY name LIMIT 5 - `).all(uid, like); - } catch {} + const folders = safeAll(() => db.prepare(` + SELECT id, name, icon FROM link_list_folders + WHERE user_id=? AND LOWER(name) LIKE ? + ORDER BY name LIMIT 5 + `).all(uid, like)); - let snippets = []; - try { - snippets = db.prepare(` - SELECT id, title, description, language FROM snippets - WHERE user_id=? AND (LOWER(title) LIKE ? OR LOWER(description) LIKE ?) - ORDER BY title LIMIT 5 - `).all(uid, like, like); - } catch {} + const snippets = safeAll(() => db.prepare(` + SELECT id, title, description, language FROM snippets + WHERE user_id=? AND (LOWER(title) LIKE ? OR LOWER(description) LIKE ?) + ORDER BY title LIMIT 6 + `).all(uid, like, like)); - let calculations = []; - try { - calculations = db.prepare(` - SELECT id, name FROM calculations - WHERE user_id=? AND LOWER(name) LIKE ? - ORDER BY name LIMIT 5 - `).all(uid, like); - } catch {} + const calculations = safeAll(() => db.prepare(` + SELECT id, name FROM calculations + WHERE user_id=? AND LOWER(name) LIKE ? + ORDER BY name LIMIT 5 + `).all(uid, like)); - let orders = []; - try { - orders = db.prepare(` - SELECT id, name, status FROM orders - WHERE user_id=? AND LOWER(name) LIKE ? - ORDER BY name LIMIT 5 - `).all(uid, like); - } catch {} + const orders = safeAll(() => db.prepare(` + SELECT id, name, status FROM orders + WHERE user_id=? AND LOWER(name) LIKE ? + ORDER BY name LIMIT 5 + `).all(uid, like)); - res.json({ links, folders, snippets, calculations, orders }); + const todos = safeAll(() => db.prepare(` + SELECT id, text, done FROM todos + WHERE user_id=? AND LOWER(text) LIKE ? + ORDER BY done, created_at DESC LIMIT 5 + `).all(uid, like)); + + const files = safeAll(() => db.prepare(` + SELECT id, originalname, mimetype, size FROM files + WHERE user_id=? AND (LOWER(originalname) LIKE ? OR LOWER(filename) LIKE ?) + ORDER BY originalname LIMIT 6 + `).all(uid, like, like)); + + const file_folders = safeAll(() => db.prepare(` + SELECT id, name FROM folders + WHERE user_id=? AND LOWER(name) LIKE ? + ORDER BY name LIMIT 5 + `).all(uid, like)); + + const push_schedules = safeAll(() => db.prepare(` + SELECT id, message, scheduled_at, sent FROM push_schedules + WHERE user_id=? AND LOWER(message) LIKE ? AND sent=0 + ORDER BY scheduled_at LIMIT 5 + `).all(uid, like)); + + const calendar_feeds = safeAll(() => db.prepare(` + SELECT id, name, url FROM calendar_feeds + WHERE user_id=? AND (LOWER(name) LIKE ? OR LOWER(url) LIKE ?) + ORDER BY name LIMIT 5 + `).all(uid, like, like)); + + const qr_codes = safeAll(() => db.prepare(` + SELECT id, label, url FROM qr_codes + WHERE user_id=? AND (LOWER(label) LIKE ? OR LOWER(url) LIKE ?) + ORDER BY created_at DESC LIMIT 5 + `).all(uid, like, like)); + + res.json({ links, folders, snippets, calculations, orders, todos, files, file_folders, push_schedules, calendar_feeds, qr_codes }); }); module.exports = router; diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index 38cc3fe..0783179 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -1442,9 +1442,15 @@ function SearchResultItem({ item, idx, activeIdx, onNavigate, onHover }) { icon = hasCustom ? item.icon : 'πŸ”—'; primary = item.title; secondary = item.url; } - if (item.type==='snippet') { icon='πŸ“„'; primary=item.title; secondary=`Code Β· ${item.language||''}`; } - if (item.type==='calc') { icon='πŸ–¨'; primary=item.name; secondary='3D-Archiv'; } - if (item.type==='order') { icon='πŸ“¦'; primary=item.name; secondary=`Bestellung Β· ${item.status||''}`; } + if (item.type==='snippet') { icon='πŸ“„'; primary=item.title; secondary=`Code Β· ${item.language||''}`; } + if (item.type==='calc') { icon='πŸ–¨'; primary=item.name; secondary='3D-Archiv'; } + if (item.type==='order') { icon='πŸ“¦'; primary=item.name; secondary=`Bestellung Β· ${item.status||''}`; } + if (item.type==='todo') { icon=item.done?'βœ…':'☐'; primary=item.text; secondary='ToDo'; } + if (item.type==='file') { icon='πŸ“„'; primary=item.originalname; secondary=`Datei Β· ${(item.size/1024/1024).toFixed(1)} MB`; } + if (item.type==='file_folder') { icon='πŸ“'; primary=item.name; secondary='Datei-Ordner'; } + if (item.type==='push') { icon='πŸ””'; primary=item.message; secondary=`Push-Erinnerung Β· ${item.scheduled_at?.slice(0,16)||''}`; } + if (item.type==='calendar') { icon='πŸ“…'; primary=item.name; secondary=`Kalender-Abo Β· ${item.url||''}`; } + if (item.type==='qr') { icon='β—»'; primary=item.label||item.url; secondary=`QR-Code Β· ${item.url}`; } return (
onNavigate(item)} onMouseEnter={()=>onHover(idx)} style={{display:'flex',alignItems:'center',gap:10,padding:'9px 14px',cursor:'pointer', @@ -1464,45 +1470,116 @@ function SearchResultItem({ item, idx, activeIdx, onNavigate, onHover }) { } // ── Globale Suche ───────────────────────────────────────────────────────────── -// Statischer Such-Index – Tools, Dev-Tools Inhalte, Einstellungen +// Statischer Such-Index – wirklich vollstΓ€ndig const SEARCH_TOOL_INDEX = [ - // ── Haupt-Tools ── + // ── Haupt-Tools ────────────────────────────────────────────────────────── {type:'tool',label:'Dashboard',icon:'🏠',sub:'',id:'dashboard'}, {type:'tool',label:'Bestellungen',icon:'πŸ“¦',sub:'3D-Druck',id:'bestellungen'}, {type:'tool',label:'Kalkulator3D',icon:'πŸ–¨',sub:'3D-Druck',id:'kalkulator3d'}, + {type:'tool',label:'3D-Archiv',icon:'πŸ–¨',sub:'3D-Druck',id:'kalkulator3d'}, {type:'tool',label:'Dateien',icon:'πŸ“',sub:'Werkzeuge',id:'dateien'}, + {type:'tool',label:'Datei-Manager',icon:'πŸ“',sub:'Werkzeuge',id:'dateien'}, {type:'tool',label:'Nachrichten',icon:'πŸ’¬',sub:'Werkzeuge',id:'nachrichten'}, + {type:'tool',label:'Chat',icon:'πŸ’¬',sub:'Werkzeuge',id:'nachrichten'}, {type:'tool',label:'Linkliste',icon:'πŸ”—',sub:'Werkzeuge',id:'linkliste'}, {type:'tool',label:'Code-Schnipsel',icon:'πŸ“„',sub:'Werkzeuge',id:'codeschnipsel'}, + {type:'tool',label:'Snippets',icon:'πŸ“„',sub:'Werkzeuge',id:'codeschnipsel'}, {type:'tool',label:'CAD-Skizzen',icon:'πŸ“',sub:'Werkzeuge',id:'skizze'}, + {type:'tool',label:'Sketchpad',icon:'πŸ“',sub:'Werkzeuge',id:'skizze'}, {type:'tool',label:'Dev-Tools',icon:'πŸ”§',sub:'Werkzeuge',id:'devtools'}, - // ── Einstellungen-Sektionen ── - {type:'settings',label:'Einstellungen – Profil',icon:'πŸ‘€',sub:'Einstellungen',section:'profil'}, - {type:'settings',label:'Einstellungen – Sicherheit',icon:'πŸ”’',sub:'Einstellungen',section:'sicherheit'}, - {type:'settings',label:'Einstellungen – Dashboard',icon:'🏠',sub:'Einstellungen',section:'dashboard'}, - {type:'settings',label:'Einstellungen – Benutzer',icon:'πŸ‘₯',sub:'Einstellungen (Admin)',section:'benutzer'}, - {type:'settings',label:'Einstellungen – Backup',icon:'πŸ’Ύ',sub:'Einstellungen (Admin)',section:'backup'}, - // ── Dev-Tools Sub-Tools ── + // ── Dashboard-Widgets ──────────────────────────────────────────────────── + {type:'tool',label:'Schnellzugriff',icon:'⚑',sub:'Dashboard',id:'dashboard'}, + {type:'tool',label:'Kalender',icon:'πŸ“…',sub:'Dashboard',id:'dashboard'}, + {type:'tool',label:'iCal',icon:'πŸ“…',sub:'Dashboard',id:'dashboard'}, + {type:'tool',label:'ToDo',icon:'βœ…',sub:'Dashboard',id:'dashboard'}, + {type:'tool',label:'Notizen',icon:'πŸ“',sub:'Dashboard',id:'dashboard'}, + {type:'tool',label:'Push-Erinnerungen',icon:'πŸ””',sub:'Dashboard',id:'dashboard'}, + {type:'tool',label:'Roadmap',icon:'πŸ—Ί',sub:'Dashboard',id:'dashboard'}, + {type:'tool',label:'WΓΌnsche',icon:'⭐',sub:'Dashboard',id:'dashboard'}, + {type:'tool',label:'Board',icon:'πŸ“‹',sub:'Dashboard',id:'dashboard'}, + {type:'tool',label:'Changelog',icon:'πŸ“‹',sub:'Dashboard',id:'dashboard'}, + // ── Einstellungen – Profil ──────────────────────────────────────────────── + {type:'settings',label:'Profil',icon:'πŸ‘€',sub:'Einstellungen',section:'profil'}, + {type:'settings',label:'Avatar',icon:'πŸ–Ό',sub:'Einstellungen β†’ Profil',section:'profil'}, + {type:'settings',label:'Passwort Γ€ndern',icon:'πŸ”‘',sub:'Einstellungen β†’ Profil',section:'profil'}, + {type:'settings',label:'Benutzername Γ€ndern',icon:'✏️',sub:'Einstellungen β†’ Profil',section:'profil'}, + {type:'settings',label:'Pushover',icon:'πŸ””',sub:'Einstellungen β†’ Profil',section:'profil'}, + {type:'settings',label:'Push-Benachrichtigungen',icon:'πŸ””',sub:'Einstellungen β†’ Profil',section:'profil'}, + {type:'settings',label:'Account lΓΆschen',icon:'⚠️',sub:'Einstellungen β†’ Profil',section:'profil'}, + // ── Einstellungen – Sicherheit ──────────────────────────────────────────── + {type:'settings',label:'Sicherheit',icon:'πŸ”’',sub:'Einstellungen',section:'sicherheit'}, + {type:'settings',label:'Login-Schutz',icon:'πŸ”’',sub:'Einstellungen β†’ Sicherheit',section:'sicherheit'}, + {type:'settings',label:'Account sperren',icon:'πŸ”’',sub:'Einstellungen β†’ Sicherheit',section:'sicherheit'}, + {type:'settings',label:'Login-Versuche',icon:'πŸ”’',sub:'Einstellungen β†’ Sicherheit',section:'sicherheit'}, + // ── Einstellungen – Dashboard ───────────────────────────────────────────── + {type:'settings',label:'Dashboard-Einstellungen',icon:'🏠',sub:'Einstellungen',section:'dashboard'}, + {type:'settings',label:'Schnellzugriff verwalten',icon:'⚑',sub:'Einstellungen β†’ Dashboard',section:'dashboard'}, + {type:'settings',label:'Kalender hinzufΓΌgen',icon:'πŸ“…',sub:'Einstellungen β†’ Dashboard',section:'dashboard'}, + {type:'settings',label:'iCal Abo',icon:'πŸ“…',sub:'Einstellungen β†’ Dashboard',section:'dashboard'}, + // ── Einstellungen – Admin ───────────────────────────────────────────────── + {type:'settings',label:'Benutzer verwalten',icon:'πŸ‘₯',sub:'Einstellungen (Admin)',section:'benutzer'}, + {type:'settings',label:'Neuen Benutzer anlegen',icon:'βž•',sub:'Einstellungen (Admin)',section:'benutzer'}, + {type:'settings',label:'Datei-Manager Limits',icon:'πŸ“',sub:'Einstellungen (Admin)',section:'benutzer'}, + {type:'settings',label:'Gesperrte Konten',icon:'πŸ”’',sub:'Einstellungen (Admin)',section:'benutzer'}, + {type:'settings',label:'Backup',icon:'πŸ’Ύ',sub:'Einstellungen (Admin)',section:'backup'}, + {type:'settings',label:'Datenbank sichern',icon:'πŸ’Ύ',sub:'Einstellungen (Admin)',section:'backup'}, + {type:'settings',label:'Datenbank wiederherstellen',icon:'♻️',sub:'Einstellungen (Admin)',section:'backup'}, + // ── Dev-Tools – Crontab ─────────────────────────────────────────────────── {type:'devtool',label:'Crontab',icon:'⏱',sub:'Dev-Tools',tool:'cron'}, + {type:'devtool',label:'Crontab erklΓ€ren',icon:'⏱',sub:'Crontab',tool:'cron'}, + {type:'devtool',label:'Crontab erstellen',icon:'⏱',sub:'Crontab',tool:'cron'}, + {type:'devtool',label:'Cronjob',icon:'⏱',sub:'Crontab',tool:'cron'}, + {type:'devtool',label:'Schedule',icon:'⏱',sub:'Crontab',tool:'cron'}, + // ── Dev-Tools – Elektro ─────────────────────────────────────────────────── {type:'devtool',label:'Elektro-Rechner',icon:'⚑',sub:'Dev-Tools',tool:'elektro'}, - {type:'devtool',label:'Ohmsches Gesetz',icon:'⚑',sub:'Elektro-Rechner',tool:'elektro'}, - {type:'devtool',label:'JSON Viewer & Builder',icon:'{}',sub:'Dev-Tools',tool:'json'}, + {type:'devtool',label:'Ohmsches Gesetz',icon:'⚑',sub:'Elektro',tool:'elektro'}, + {type:'devtool',label:'Spannung Strom Widerstand',icon:'⚑',sub:'Elektro',tool:'elektro'}, + {type:'devtool',label:'Leistung Watt',icon:'⚑',sub:'Elektro',tool:'elektro'}, + {type:'devtool',label:'Stromkosten berechnen',icon:'⚑',sub:'Elektro',tool:'elektro'}, + {type:'devtool',label:'WiderstΓ€nde Serie Parallel',icon:'⚑',sub:'Elektro',tool:'elektro'}, + {type:'devtool',label:'Wirkungsgrad',icon:'⚑',sub:'Elektro',tool:'elektro'}, + {type:'devtool',label:'kWh Verbrauch',icon:'⚑',sub:'Elektro',tool:'elektro'}, + // ── Dev-Tools – JSON ────────────────────────────────────────────────────── + {type:'devtool',label:'JSON Viewer',icon:'{}',sub:'Dev-Tools',tool:'json'}, + {type:'devtool',label:'JSON Builder',icon:'{}',sub:'Dev-Tools',tool:'json'}, + {type:'devtool',label:'JSON formatieren',icon:'{}',sub:'JSON',tool:'json'}, + {type:'devtool',label:'XML konvertieren',icon:'{}',sub:'JSON',tool:'json'}, + {type:'devtool',label:'JSON zu XML',icon:'{}',sub:'JSON',tool:'json'}, + // ── Dev-Tools – Regex ───────────────────────────────────────────────────── {type:'devtool',label:'Regex Builder',icon:'πŸ”',sub:'Dev-Tools',tool:'regex'}, + {type:'devtool',label:'Regex erklΓ€ren',icon:'πŸ”',sub:'Regex',tool:'regex'}, + {type:'devtool',label:'RegulΓ€rer Ausdruck',icon:'πŸ”',sub:'Regex',tool:'regex'}, + {type:'devtool',label:'E-Mail Regex',icon:'πŸ”',sub:'Regex',tool:'regex'}, + {type:'devtool',label:'PLZ Regex',icon:'πŸ”',sub:'Regex',tool:'regex'}, + {type:'devtool',label:'URL Regex',icon:'πŸ”',sub:'Regex',tool:'regex'}, + // ── Dev-Tools – Text Diff ───────────────────────────────────────────────── {type:'devtool',label:'Text Diff',icon:'Β±',sub:'Dev-Tools',tool:'diff'}, + {type:'devtool',label:'Texte vergleichen',icon:'Β±',sub:'Text Diff',tool:'diff'}, + {type:'devtool',label:'Unterschiede finden',icon:'Β±',sub:'Text Diff',tool:'diff'}, + // ── Dev-Tools – Netzwerk ────────────────────────────────────────────────── {type:'devtool',label:'Netzwerk-Rechner',icon:'🌐',sub:'Dev-Tools',tool:'netzwerk'}, - {type:'devtool',label:'IP / Subnetz',icon:'🌐',sub:'Netzwerk',tool:'netzwerk'}, - {type:'devtool',label:'Geschwindigkeit MB/s Mbit',icon:'🌐',sub:'Netzwerk',tool:'netzwerk'}, + {type:'devtool',label:'IP Adresse',icon:'🌐',sub:'Netzwerk',tool:'netzwerk'}, + {type:'devtool',label:'Subnetz Maske',icon:'🌐',sub:'Netzwerk',tool:'netzwerk'}, {type:'devtool',label:'CIDR Tabelle',icon:'🌐',sub:'Netzwerk',tool:'netzwerk'}, - {type:'devtool',label:'Datetime – Uhrzeitrechner',icon:'πŸ“…',sub:'Dev-Tools',tool:'datetime'}, + {type:'devtool',label:'Mbit/s MB/s Umrechner',icon:'🌐',sub:'Netzwerk',tool:'netzwerk'}, + {type:'devtool',label:'Downloadzeit berechnen',icon:'🌐',sub:'Netzwerk',tool:'netzwerk'}, + {type:'devtool',label:'Ping IPv4',icon:'🌐',sub:'Netzwerk',tool:'netzwerk'}, + // ── Dev-Tools – Datetime ────────────────────────────────────────────────── + {type:'devtool',label:'Datetime Rechner',icon:'πŸ“…',sub:'Dev-Tools',tool:'datetime'}, {type:'devtool',label:'Unix Timestamp',icon:'πŸ“…',sub:'Datetime',tool:'datetime'}, {type:'devtool',label:'Moseszeit Umrechner',icon:'πŸ“…',sub:'Datetime',tool:'datetime'}, - {type:'devtool',label:'Geburtstagsrechner',icon:'πŸ“…',sub:'Datetime',tool:'datetime'}, + {type:'devtool',label:'Geburtstagsrechner',icon:'πŸŽ‚',sub:'Datetime',tool:'datetime'}, {type:'devtool',label:'Zeitdifferenz',icon:'πŸ“…',sub:'Datetime',tool:'datetime'}, + {type:'devtool',label:'Datum umrechnen',icon:'πŸ“…',sub:'Datetime',tool:'datetime'}, + {type:'devtool',label:'Kalenderwoche',icon:'πŸ“…',sub:'Datetime',tool:'datetime'}, + // ── Dev-Tools – Farben ──────────────────────────────────────────────────── {type:'devtool',label:'Farb-Rechner',icon:'🎨',sub:'Dev-Tools',tool:'farben'}, - {type:'devtool',label:'HEX RGB HSL Farben',icon:'🎨',sub:'Farben',tool:'farben'}, + {type:'devtool',label:'HEX RGB HSL',icon:'🎨',sub:'Farben',tool:'farben'}, {type:'devtool',label:'CMYK Farbkonverter',icon:'🎨',sub:'Farben',tool:'farben'}, - {type:'devtool',label:'QR-Code Generator',icon:'β—»',sub:'Dev-Tools',tool:'qrcode'}, - // ── Key-Gen EintrΓ€ge (direkt durchsuchbar) ── + {type:'devtool',label:'Color Picker',icon:'🎨',sub:'Farben',tool:'farben'}, + {type:'devtool',label:'WCAG Kontrast',icon:'🎨',sub:'Farben',tool:'farben'}, + {type:'devtool',label:'Farbcode',icon:'🎨',sub:'Farben',tool:'farben'}, + // ── Dev-Tools – Key-Gen ─────────────────────────────────────────────────── {type:'devtool',label:'Key-Generator',icon:'πŸ”',sub:'Dev-Tools',tool:'keygen'}, {type:'devtool',label:'Laravel APP_KEY',icon:'πŸ”',sub:'Key-Gen',tool:'keygen'}, {type:'devtool',label:'JWT Secret HS256',icon:'πŸ”',sub:'Key-Gen',tool:'keygen'}, @@ -1512,18 +1589,23 @@ const SEARCH_TOOL_INDEX = [ {type:'devtool',label:'Generic Secret',icon:'πŸ”',sub:'Key-Gen',tool:'keygen'}, {type:'devtool',label:'Passwort Generator',icon:'πŸ”',sub:'Key-Gen',tool:'keygen'}, {type:'devtool',label:'UUID v4',icon:'πŸ”',sub:'Key-Gen',tool:'keygen'}, - {type:'devtool',label:'NanoID Generator',icon:'πŸ”',sub:'Key-Gen',tool:'keygen'}, + {type:'devtool',label:'NanoID',icon:'πŸ”',sub:'Key-Gen',tool:'keygen'}, {type:'devtool',label:'DB-Passwort Docker',icon:'πŸ”',sub:'Key-Gen',tool:'keygen'}, - {type:'devtool',label:'Hex Token Generator',icon:'πŸ”',sub:'Key-Gen',tool:'keygen'}, + {type:'devtool',label:'Hex Token',icon:'πŸ”',sub:'Key-Gen',tool:'keygen'}, {type:'devtool',label:'Base64 Token',icon:'πŸ”',sub:'Key-Gen',tool:'keygen'}, - {type:'devtool',label:'Base64url Token',icon:'πŸ”',sub:'Key-Gen',tool:'keygen'}, + {type:'devtool',label:'Base64url',icon:'πŸ”',sub:'Key-Gen',tool:'keygen'}, {type:'devtool',label:'NEXTAUTH_SECRET',icon:'πŸ”',sub:'Key-Gen',tool:'keygen'}, - {type:'devtool',label:'Webhook Secret',icon:'πŸ”',sub:'Key-Gen',tool:'keygen'}, - {type:'devtool',label:'OAuth Secret',icon:'πŸ”',sub:'Key-Gen',tool:'keygen'}, - {type:'devtool',label:'VAPID Key',icon:'πŸ”',sub:'Key-Gen',tool:'keygen'}, - {type:'devtool',label:'docker-compose Passwort',icon:'πŸ”',sub:'Key-Gen',tool:'keygen'}, {type:'devtool',label:'MYSQL_ROOT_PASSWORD',icon:'πŸ”',sub:'Key-Gen',tool:'keygen'}, {type:'devtool',label:'POSTGRES_PASSWORD',icon:'πŸ”',sub:'Key-Gen',tool:'keygen'}, + {type:'devtool',label:'SESSION_SECRET',icon:'πŸ”',sub:'Key-Gen',tool:'keygen'}, + {type:'devtool',label:'Webhook Signing Secret',icon:'πŸ”',sub:'Key-Gen',tool:'keygen'}, + {type:'devtool',label:'VAPID Key',icon:'πŸ”',sub:'Key-Gen',tool:'keygen'}, + {type:'devtool',label:'OAuth Client Secret',icon:'πŸ”',sub:'Key-Gen',tool:'keygen'}, + {type:'devtool',label:'API Key generieren',icon:'πŸ”',sub:'Key-Gen',tool:'keygen'}, + // ── Dev-Tools – QR-Code ─────────────────────────────────────────────────── + {type:'devtool',label:'QR-Code Generator',icon:'β—»',sub:'Dev-Tools',tool:'qrcode'}, + {type:'devtool',label:'QR-Code erstellen',icon:'β—»',sub:'QR-Code',tool:'qrcode'}, + {type:'devtool',label:'QR-Code herunterladen',icon:'β—»',sub:'QR-Code',tool:'qrcode'}, ]; function GlobalSearch({ setActive, setDevToolsNav, mobile }) { @@ -1570,11 +1652,17 @@ function GlobalSearch({ setActive, setDevToolsNav, mobile }) { ...(results.snippets||[]).map(s=>({...s,type:'snippet'})), ...(results.calculations||[]).map(c=>({...c,type:'calc'})), ...(results.orders||[]).map(o=>({...o,type:'order'})), + ...(results.todos||[]).map(t=>({...t,type:'todo'})), + ...(results.files||[]).map(f=>({...f,type:'file'})), + ...(results.file_folders||[]).map(f=>({...f,type:'file_folder'})), + ...(results.push_schedules||[]).map(p=>({...p,type:'push'})), + ...(results.calendar_feeds||[]).map(f=>({...f,type:'calendar'})), + ...(results.qr_codes||[]).map(q=>({...q,type:'qr'})), ] : []; const navigate = (item) => { close(); - if (item.type === 'tool') { setActive(item.id); } + if (item.type === 'tool') { setActive(item.id); } else if (item.type === 'devtool') { setActive('devtools'); setDevToolsNav({tool: item.tool, ts: Date.now()}); } else if (item.type === 'settings') { setActive('admin'); setDevToolsNav({section: item.section, ts: Date.now()}); } else if (item.type === 'link') { window.open(item.url, '_blank', 'noopener'); } @@ -1582,6 +1670,11 @@ function GlobalSearch({ setActive, setDevToolsNav, mobile }) { else if (item.type === 'snippet') { setActive('codeschnipsel'); } else if (item.type === 'calc') { setActive('kalkulator3d'); } else if (item.type === 'order') { setActive('bestellungen'); } + else if (item.type === 'todo') { setActive('dashboard'); } + else if (item.type === 'file' || item.type === 'file_folder') { setActive('dateien'); } + else if (item.type === 'push') { setActive('dashboard'); } + else if (item.type === 'calendar') { setActive('dashboard'); } + else if (item.type === 'qr') { setActive('devtools'); setDevToolsNav({tool:'qrcode', ts: Date.now()}); } }; const onKey = e => { @@ -1681,6 +1774,45 @@ function GlobalSearch({ setActive, setDevToolsNav, mobile }) { })}
)} + {results.todos?.length>0 && ( +
+
TODOS
+ {results.todos.map((item,i)=>{ + const off=allItems.length-((results.todos||[]).length+(results.files||[]).length+(results.file_folders||[]).length+(results.push_schedules||[]).length+(results.calendar_feeds||[]).length+(results.qr_codes||[]).length)+i; + return ; + })} +
+ )} + {results.files?.length>0 && ( +
+
DATEIEN
+ {results.files.map((item,i)=>({}}/>))} +
+ )} + {results.file_folders?.length>0 && ( +
+
DATEI-ORDNER
+ {results.file_folders.map((item,i)=>({}}/>))} +
+ )} + {results.push_schedules?.length>0 && ( +
+
PUSH-ERINNERUNGEN
+ {results.push_schedules.map((item,i)=>({}}/>))} +
+ )} + {results.calendar_feeds?.length>0 && ( +
+
KALENDER-ABOS
+ {results.calendar_feeds.map((item,i)=>({}}/>))} +
+ )} + {results.qr_codes?.length>0 && ( +
+
QR-CODES
+ {results.qr_codes.map((item,i)=>({}}/>))} +
+ )} )}