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)=>(
{}}/>))}
+
+ )}
>
)}