Suche: Notizen, Kalendereinträge, Board, Changelog jetzt vollständig im Frontend und Backend

This commit is contained in:
2026-06-05 13:17:24 +02:00
parent f5988d3af6
commit afc56d9fca
3 changed files with 190 additions and 18 deletions

View File

@@ -1445,12 +1445,16 @@ function SearchResultItem({ item, idx, activeIdx, onNavigate, onHover }) {
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}`; }
if (item.type==='todo') { icon=item.done?'✅':'☐'; primary=item.text; secondary='ToDo'; }
if (item.type==='note') { icon='📝'; primary='Notiz'; secondary=item.preview||''; }
if (item.type==='board') { icon=item.btype==='roadmap'?'🗺':'⭐'; primary=item.title; secondary=`${item.btype==='roadmap'?'Roadmap':'Wünsche'}${item.description?' · '+item.description.slice(0,40):''}`; }
if (item.type==='changelog') { icon='📋'; primary=`${item.version} ${item.title}`; secondary='Changelog'; }
if (item.type==='file') { icon='📄'; primary=item.originalname; secondary=`Datei · ${item.size?(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 · ${(item.scheduled_at||'').slice(0,16)}`; }
if (item.type==='calendar_feed') { icon='📅'; primary=item.name; secondary='Kalender-Abo'; }
if (item.type==='calendar_event') { icon='📆'; primary=item.summary; secondary=`${item.feed_name||'Kalender'}${item.start_dt?' · '+item.start_dt.slice(0,10):''}`; }
if (item.type==='qr') { icon='◻'; primary=item.label||item.url; secondary=`QR-Code · ${item.url}`; }
return (
<div onClick={()=>onNavigate(item)} onMouseEnter={()=>onHover(idx)}
style={{display:'flex',alignItems:'center',gap:10,padding:'9px 14px',cursor:'pointer',
@@ -1653,10 +1657,14 @@ function GlobalSearch({ setActive, setDevToolsNav, mobile }) {
...(results.calculations||[]).map(c=>({...c,type:'calc'})),
...(results.orders||[]).map(o=>({...o,type:'order'})),
...(results.todos||[]).map(t=>({...t,type:'todo'})),
...(results.notes||[]).map(n=>({...n,type:'note'})),
...(results.board_items||[]).map(b=>({...b,type:'board'})),
...(results.changelog||[]).map(e=>({...e,type:'changelog'})),
...(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.calendar_feeds||[]).map(f=>({...f,type:'calendar_feed'})),
...(results.calendar_events||[]).map(e=>({...e,type:'calendar_event'})),
...(results.qr_codes||[]).map(q=>({...q,type:'qr'})),
] : [];
@@ -1670,11 +1678,14 @@ 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 === 'todo') { setActive('dashboard'); }
else if (item.type === 'note') { setActive('dashboard'); }
else if (item.type === 'board') { setActive('dashboard'); }
else if (item.type === 'changelog') { 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()}); }
else if (item.type === 'push') { setActive('dashboard'); }
else if (item.type === 'calendar_feed' || item.type === 'calendar_event') { setActive('dashboard'); }
else if (item.type === 'qr') { setActive('devtools'); setDevToolsNav({tool:'qrcode', ts: Date.now()}); }
};
const onKey = e => {
@@ -1813,6 +1824,36 @@ function GlobalSearch({ setActive, setDevToolsNav, mobile }) {
{results.qr_codes.map((item,i)=>(<SearchResultItem key={`qr${i}`} item={{...item,type:'qr'}} idx={0} activeIdx={-1} onNavigate={navigate} onHover={()=>{}}/>))}
</div>
)}
{results.notes?.length>0 && (
<div>
<div style={{padding:'7px 14px 4px',color:'rgba(255,255,255,0.3)',fontFamily:'monospace',fontSize:9,letterSpacing:1}}>NOTIZEN</div>
{results.notes.map((item,i)=>(<SearchResultItem key={`n${i}`} item={{...item,type:'note'}} idx={0} activeIdx={-1} onNavigate={navigate} onHover={()=>{}}/>))}
</div>
)}
{results.board_items?.length>0 && (
<div>
<div style={{padding:'7px 14px 4px',color:'rgba(255,255,255,0.3)',fontFamily:'monospace',fontSize:9,letterSpacing:1}}>ROADMAP / WÜNSCHE</div>
{results.board_items.map((item,i)=>(<SearchResultItem key={`b${i}`} item={{...item,type:'board',btype:item.type}} idx={0} activeIdx={-1} onNavigate={navigate} onHover={()=>{}}/>))}
</div>
)}
{results.changelog?.length>0 && (
<div>
<div style={{padding:'7px 14px 4px',color:'rgba(255,255,255,0.3)',fontFamily:'monospace',fontSize:9,letterSpacing:1}}>CHANGELOG</div>
{results.changelog.map((item,i)=>(<SearchResultItem key={`cl${i}`} item={{...item,type:'changelog'}} idx={0} activeIdx={-1} onNavigate={navigate} onHover={()=>{}}/>))}
</div>
)}
{results.calendar_events?.length>0 && (
<div>
<div style={{padding:'7px 14px 4px',color:'rgba(255,255,255,0.3)',fontFamily:'monospace',fontSize:9,letterSpacing:1}}>KALENDER-EINTRÄGE</div>
{results.calendar_events.map((item,i)=>(<SearchResultItem key={`ce${i}`} item={{...item,type:'calendar_event'}} idx={0} activeIdx={-1} onNavigate={navigate} onHover={()=>{}}/>))}
</div>
)}
{results.calendar_feeds?.length>0 && (
<div>
<div style={{padding:'7px 14px 4px',color:'rgba(255,255,255,0.3)',fontFamily:'monospace',fontSize:9,letterSpacing:1}}>KALENDER-ABOS</div>
{results.calendar_feeds.map((item,i)=>(<SearchResultItem key={`cf${i}`} item={{...item,type:'calendar_feed'}} idx={0} activeIdx={-1} onNavigate={navigate} onHover={()=>{}}/>))}
</div>
)}
</>
)}
</div>