From 429e40f841f97cdee9fe36fd8a25997f0660b769 Mon Sep 17 00:00:00 2001 From: Raphael <68374617+raphaelscholle@users.noreply.github.com> Date: Mon, 2 Nov 2026 11:59:52 +0100 Subject: [PATCH 01/10] feat: add unified tracker page --- src/pages/bugs.tsx | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 src/pages/bugs.tsx diff --git a/src/pages/bugs.tsx b/src/pages/bugs.tsx new file mode 100644 index 00000000..2a16eef8 --- /dev/null +++ b/src/pages/bugs.tsx @@ -0,0 +1,14 @@ +import React, {useEffect, useMemo, useState} from 'react'; +import Layout from '@theme/Layout'; +import styles from './bugs.module.css'; + +type Entry = {id:number; number:number; title:string; state:string; html_url:string; updated_at:string; repository_url:string; pull_request?:object; labels:{name:string}[]}; +export default function Bugs() { + const [items,setItems]=useState([]); + const [error,setError]=useState(''); + const [query,setQuery]=useState(''); + const [type,setType]=useState('all'); + useEffect(()=>{ const abort=new AbortController(); fetch('https://api.github.com/search/issues?q=org%3AOpenHD%20sort%3Aupdated-desc&per_page=100',{signal:abort.signal,headers:{Accept:'application/vnd.github+json'}}).then(r=>{if(!r.ok)throw Error('GitHub API unavailable');return r.json()}).then(j=>setItems(j.items||[])).catch(e=>{if(!abort.signal.aborted)setError(String(e))});return ()=>abort.abort();},[]); + const filtered=useMemo(()=>items.filter(i=>(type==='all'||(type==='pulls'?!!i.pull_request:!i.pull_request))&&(i.title+' '+i.repository_url+' '+i.number).toLowerCase().includes(query.toLowerCase())),[items,query,type]); + return

OpenHD Bug Tracker

GitHub issues and pull requests across the OpenHD organization.

Report a bug
setQuery(e.target.value)}/>
{error?

{error}

:filtered.length===0?

No items loaded or matching.

:filtered.map(i=>#{i.number} {i.title}{i.pull_request?'Pull request':'Issue'}{i.state}{i.repository_url.split('/').pop()})}

Latest 100 updated public GitHub items. Open an entry on GitHub for full details.

; +} From 400e61270aab06c2dd83779ae5a1d93c2c5fc1ef Mon Sep 17 00:00:00 2001 From: Raphael <68374617+raphaelscholle@users.noreply.github.com> Date: Mon, 2 Nov 2026 12:00:38 +0100 Subject: [PATCH 02/10] style: tracker page layout --- src/pages/bugs.module.css | 1 + 1 file changed, 1 insertion(+) create mode 100644 src/pages/bugs.module.css diff --git a/src/pages/bugs.module.css b/src/pages/bugs.module.css new file mode 100644 index 00000000..4267224b --- /dev/null +++ b/src/pages/bugs.module.css @@ -0,0 +1 @@ +.page{max-width:1200px;margin:auto;padding:3rem 1.5rem 5rem;min-height:65vh}.header{display:flex;align-items:center;justify-content:space-between;gap:2rem;margin-bottom:2rem}.header h1{margin-bottom:.4rem}.header p,.note{color:var(--ifm-color-emphasis-600)}.controls{display:flex;gap:1rem;margin-bottom:1.5rem}.controls input{flex:1}.controls select,.controls input{padding:.75rem;border:1px solid var(--ifm-color-emphasis-300);border-radius:7px;background:var(--ifm-background-surface-color);color:var(--ifm-font-color-base)}.list{border:1px solid var(--ifm-color-emphasis-200);border-radius:9px;overflow:hidden}.item{display:grid;grid-template-columns:minmax(0,3fr) 1fr .6fr 1fr;gap:1rem;padding:1.1rem 1.2rem;border-bottom:1px solid var(--ifm-color-emphasis-200);align-items:center;color:var(--ifm-font-color-base)}.item:last-child{border-bottom:0}.item:hover{background:var(--ifm-hover-overlay);text-decoration:none}.title{font-weight:600;color:var(--ifm-color-primary)}.note{font-size:.85rem;margin-top:1.5rem}.form{max-width:780px}.form label{display:block;font-weight:600;margin:1.2rem 0}.form input,.form textarea,.form select{display:block;width:100%;margin-top:.45rem;padding:.75rem;background:var(--ifm-background-surface-color);color:var(--ifm-font-color-base);border:1px solid var(--ifm-color-emphasis-300);border-radius:7px}.columns{display:grid;grid-template-columns:1fr 1fr;gap:1rem}.notice{padding:1rem;border:1px solid var(--ifm-color-emphasis-300);border-radius:8px;margin:1rem 0}.error{color:var(--ifm-color-danger);font-weight:600}.help{font-size:.9rem;color:var(--ifm-color-emphasis-700)}@media(max-width:760px){.header,.controls{flex-direction:column;align-items:stretch}.item{grid-template-columns:1fr 1fr}.title{grid-column:1/-1}.columns{grid-template-columns:1fr}} \ No newline at end of file From bc857225ace31d84a8ccc91db90b93054e1145c3 Mon Sep 17 00:00:00 2001 From: Raphael <68374617+raphaelscholle@users.noreply.github.com> Date: Mon, 2 Nov 2026 12:00:55 +0100 Subject: [PATCH 03/10] feat: require Air and Ground logs in report form --- src/pages/bugs/report.tsx | 43 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/pages/bugs/report.tsx diff --git a/src/pages/bugs/report.tsx b/src/pages/bugs/report.tsx new file mode 100644 index 00000000..2d455266 --- /dev/null +++ b/src/pages/bugs/report.tsx @@ -0,0 +1,43 @@ +import React, {useState} from 'react'; +import Layout from '@theme/Layout'; +import useDocusaurusContext from '@docusaurus/useDocusaurusContext'; +import Link from '@docusaurus/Link'; +import styles from '../bugs.module.css'; + +export default function ReportBug() { + const {siteConfig}=useDocusaurusContext(); + const endpoint=String(siteConfig.customFields?.bugReportApiUrl||''); + const [title,setTitle]=useState(''); + const [description,setDescription]=useState(''); + const [air,setAir]=useState(null); + const [ground,setGround]=useState(null); + const [busy,setBusy]=useState(false); + const [message,setMessage]=useState(''); + const valid=(f:File|null)=>Boolean(f&&f.size>0&&f.size<=52428800&&(/\.zip$|\.tgz$|\.tar\.gz$/i).test(f.name)); + const ready=Boolean(endpoint&&title.trim()&&description.trim()&&valid(air)&&valid(ground)&&!busy); + async function submit(e:React.FormEvent) { + e.preventDefault();if(!ready)return; + const body=new FormData();body.set('title',title);body.set('description',description);body.set('air_logs',air!);body.set('ground_logs',ground!); + setBusy(true);setMessage(''); + try{ + const response=await fetch(endpoint,{method:'POST',body}); + if(!response.ok)throw new Error('Report submission failed.'); + const result=await response.json(); + setMessage(typeof result.url==='string'&&result.url.startsWith('https://github.com/OpenHD/')?'Report created: '+result.url:'Report submitted.'); + }catch(e){setMessage(e instanceof Error?e.message:'Unable to submit report.');} + finally{setBusy(false);} + } + return

Report a bug

Air and Ground diagnostic logs are required.

Back to tracker
+
+ +