diff options
Diffstat (limited to 'frontend/coverage/src/components/Settings.tsx.html')
| -rw-r--r-- | frontend/coverage/src/components/Settings.tsx.html | 316 |
1 files changed, 242 insertions, 74 deletions
diff --git a/frontend/coverage/src/components/Settings.tsx.html b/frontend/coverage/src/components/Settings.tsx.html index 3d8d219..892218e 100644 --- a/frontend/coverage/src/components/Settings.tsx.html +++ b/frontend/coverage/src/components/Settings.tsx.html @@ -23,30 +23,30 @@ <div class='clearfix'> <div class='fl pad1y space-right2'> - <span class="strong">56.25% </span> + <span class="strong">80% </span> <span class="quiet">Statements</span> - <span class='fraction'>36/64</span> + <span class='fraction'>60/75</span> </div> <div class='fl pad1y space-right2'> - <span class="strong">41.66% </span> + <span class="strong">66.66% </span> <span class="quiet">Branches</span> - <span class='fraction'>10/24</span> + <span class='fraction'>20/30</span> </div> <div class='fl pad1y space-right2'> - <span class="strong">63.63% </span> + <span class="strong">85.18% </span> <span class="quiet">Functions</span> - <span class='fraction'>14/22</span> + <span class='fraction'>23/27</span> </div> <div class='fl pad1y space-right2'> - <span class="strong">62.5% </span> + <span class="strong">87.87% </span> <span class="quiet">Lines</span> - <span class='fraction'>35/56</span> + <span class='fraction'>58/66</span> </div> @@ -61,7 +61,7 @@ </div> </template> </div> - <div class='status-line medium'></div> + <div class='status-line high'></div> <pre><table class="coverage"> <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> <a name='L2'></a><a href='#L2'>2</a> @@ -243,55 +243,138 @@ <a name='L178'></a><a href='#L178'>178</a> <a name='L179'></a><a href='#L179'>179</a> <a name='L180'></a><a href='#L180'>180</a> -<a name='L181'></a><a href='#L181'>181</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> +<a name='L181'></a><a href='#L181'>181</a> +<a name='L182'></a><a href='#L182'>182</a> +<a name='L183'></a><a href='#L183'>183</a> +<a name='L184'></a><a href='#L184'>184</a> +<a name='L185'></a><a href='#L185'>185</a> +<a name='L186'></a><a href='#L186'>186</a> +<a name='L187'></a><a href='#L187'>187</a> +<a name='L188'></a><a href='#L188'>188</a> +<a name='L189'></a><a href='#L189'>189</a> +<a name='L190'></a><a href='#L190'>190</a> +<a name='L191'></a><a href='#L191'>191</a> +<a name='L192'></a><a href='#L192'>192</a> +<a name='L193'></a><a href='#L193'>193</a> +<a name='L194'></a><a href='#L194'>194</a> +<a name='L195'></a><a href='#L195'>195</a> +<a name='L196'></a><a href='#L196'>196</a> +<a name='L197'></a><a href='#L197'>197</a> +<a name='L198'></a><a href='#L198'>198</a> +<a name='L199'></a><a href='#L199'>199</a> +<a name='L200'></a><a href='#L200'>200</a> +<a name='L201'></a><a href='#L201'>201</a> +<a name='L202'></a><a href='#L202'>202</a> +<a name='L203'></a><a href='#L203'>203</a> +<a name='L204'></a><a href='#L204'>204</a> +<a name='L205'></a><a href='#L205'>205</a> +<a name='L206'></a><a href='#L206'>206</a> +<a name='L207'></a><a href='#L207'>207</a> +<a name='L208'></a><a href='#L208'>208</a> +<a name='L209'></a><a href='#L209'>209</a> +<a name='L210'></a><a href='#L210'>210</a> +<a name='L211'></a><a href='#L211'>211</a> +<a name='L212'></a><a href='#L212'>212</a> +<a name='L213'></a><a href='#L213'>213</a> +<a name='L214'></a><a href='#L214'>214</a> +<a name='L215'></a><a href='#L215'>215</a> +<a name='L216'></a><a href='#L216'>216</a> +<a name='L217'></a><a href='#L217'>217</a> +<a name='L218'></a><a href='#L218'>218</a> +<a name='L219'></a><a href='#L219'>219</a> +<a name='L220'></a><a href='#L220'>220</a> +<a name='L221'></a><a href='#L221'>221</a> +<a name='L222'></a><a href='#L222'>222</a> +<a name='L223'></a><a href='#L223'>223</a> +<a name='L224'></a><a href='#L224'>224</a> +<a name='L225'></a><a href='#L225'>225</a> +<a name='L226'></a><a href='#L226'>226</a> +<a name='L227'></a><a href='#L227'>227</a> +<a name='L228'></a><a href='#L228'>228</a> +<a name='L229'></a><a href='#L229'>229</a> +<a name='L230'></a><a href='#L230'>230</a> +<a name='L231'></a><a href='#L231'>231</a> +<a name='L232'></a><a href='#L232'>232</a> +<a name='L233'></a><a href='#L233'>233</a> +<a name='L234'></a><a href='#L234'>234</a> +<a name='L235'></a><a href='#L235'>235</a> +<a name='L236'></a><a href='#L236'>236</a> +<a name='L237'></a><a href='#L237'>237</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">34x</span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">34x</span> +<span class="cline-any cline-yes">34x</span> +<span class="cline-any cline-yes">34x</span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">34x</span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">34x</span> +<span class="cline-any cline-yes">9x</span> +<span class="cline-any cline-yes">9x</span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">9x</span> +<span class="cline-any cline-yes">9x</span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">9x</span> +<span class="cline-any cline-yes">9x</span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-no"> </span> +<span class="cline-any cline-no"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">14x</span> -<span class="cline-any cline-yes">14x</span> -<span class="cline-any cline-yes">14x</span> -<span class="cline-any cline-yes">14x</span> +<span class="cline-any cline-yes">34x</span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">14x</span> +<span class="cline-any cline-yes">7x</span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">14x</span> -<span class="cline-any cline-yes">4x</span> -<span class="cline-any cline-yes">4x</span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">4x</span> -<span class="cline-any cline-yes">4x</span> <span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">34x</span> +<span class="cline-any cline-yes">2x</span> +<span class="cline-any cline-yes">2x</span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">4x</span> -<span class="cline-any cline-yes">4x</span> +<span class="cline-any cline-yes">2x</span> +<span class="cline-any cline-yes">2x</span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-no"> </span> -<span class="cline-any cline-no"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">14x</span> -<span class="cline-any cline-yes">3x</span> +<span class="cline-any cline-yes">2x</span> +<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">14x</span> <span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span> <span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> <span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">34x</span> +<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span> <span class="cline-any cline-neutral"> </span> @@ -301,12 +384,22 @@ <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">14x</span> +<span class="cline-any cline-yes">34x</span> +<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-yes">1x</span> <span class="cline-any cline-yes">1x</span> +<span class="cline-any cline-yes">1x</span> +<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">1x</span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">1x</span> +<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-yes">1x</span> @@ -319,35 +412,28 @@ <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">14x</span> -<span class="cline-any cline-no"> </span> -<span class="cline-any cline-no"> </span> -<span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-no"> </span> -<span class="cline-any cline-no"> </span> -<span class="cline-any cline-no"> </span> -<span class="cline-any cline-no"> </span> +<span class="cline-any cline-yes">34x</span> +<span class="cline-any cline-yes">1x</span> +<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-no"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">1x</span> +<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-no"> </span> -<span class="cline-any cline-no"> </span> +<span class="cline-any cline-yes">1x</span> +<span class="cline-any cline-yes">1x</span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-no"> </span> <span class="cline-any cline-no"> </span> -<span class="cline-any cline-no"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-no"> </span> -<span class="cline-any cline-no"> </span> <span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">34x</span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">14x</span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> @@ -375,8 +461,32 @@ <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">2x</span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">1x</span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-no"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> @@ -403,7 +513,9 @@ <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> -<span class="cline-any cline-yes">5x</span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-neutral"> </span> +<span class="cline-any cline-yes">6x</span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> <span class="cline-any cline-neutral"> </span> @@ -428,15 +540,22 @@ import type { Feed } from '../types'; import './Settings.css'; import { apiFetch } from '../utils'; -export default function Settings() { +interface SettingsProps { + fontTheme?: string; + setFontTheme?: (t: string) => void; +} + +export default function Settings({ fontTheme, setFontTheme }: SettingsProps) { const [feeds, setFeeds] = useState<Feed[]>([]); + /* ... existing state ... */ const [newFeedUrl, setNewFeedUrl] = useState(''); const [loading, setLoading] = useState(false); const [error, setError] = useState<string | null>(null); const [importFile, setImportFile] = useState<File | null>(null); - const fetchFeeds = () => { + /* ... existing fetchFeeds ... */ + const fetchFeeds = React.useCallback(() => { setLoading(true); apiFetch('/api/feed/') .then((res) => { @@ -451,12 +570,14 @@ export default function Settings() { <span class="cstat-no" title="statement not covered" > setError(err.message);</span> <span class="cstat-no" title="statement not covered" > setLoading(false);</span> }); - }; + }, []); useEffect(() => { + // eslint-disable-next-line fetchFeeds(); - }, []); + }, [fetchFeeds]); + /* ... existing handlers ... */ const handleAddFeed = (e: React.FormEvent) => { e.preventDefault(); <span class="missing-if-branch" title="if path not taken" >I</span>if (!newFeedUrl) <span class="cstat-no" title="statement not covered" >return;</span> @@ -468,16 +589,16 @@ export default function Settings() { body: JSON.stringify({ url: newFeedUrl }), }) .then((res) => { - <span class="missing-if-branch" title="if path not taken" >I</span>if (!res.ok) <span class="cstat-no" title="statement not covered" >throw new Error('Failed to add feed');</span> + if (!res.ok) throw new Error('Failed to add feed'); return res.json(); }) .then(() => { setNewFeedUrl(''); fetchFeeds(); }) - .catch(<span class="fstat-no" title="function not covered" >(e</span>rr) => { -<span class="cstat-no" title="statement not covered" > setError(err.message);</span> -<span class="cstat-no" title="statement not covered" > setLoading(false);</span> + .catch((err) => { + setError(err.message); + setLoading(false); }); }; @@ -499,27 +620,46 @@ export default function Settings() { }); }; - const handleImport = <span class="fstat-no" title="function not covered" >(e</span>: React.FormEvent) => { -<span class="cstat-no" title="statement not covered" > e.preventDefault();</span> -<span class="cstat-no" title="statement not covered" > if (!importFile) <span class="cstat-no" title="statement not covered" >return;</span></span> + const handleImport = (e: React.FormEvent) => { + e.preventDefault(); + <span class="missing-if-branch" title="if path not taken" >I</span>if (!importFile) <span class="cstat-no" title="statement not covered" >return;</span> -<span class="cstat-no" title="statement not covered" > setLoading(true);</span> - const formData = <span class="cstat-no" title="statement not covered" >new FormData();</span> -<span class="cstat-no" title="statement not covered" > formData.append('file', importFile);</span> -<span class="cstat-no" title="statement not covered" > formData.append('format', 'opml');</span> + setLoading(true); + const formData = new FormData(); + formData.append('file', importFile); + formData.append('format', 'opml'); -<span class="cstat-no" title="statement not covered" > apiFetch('/api/import', {</span> + apiFetch('/api/import', { method: 'POST', body: formData, }) - .then(<span class="fstat-no" title="function not covered" >(r</span>es) => { -<span class="cstat-no" title="statement not covered" > if (!res.ok) <span class="cstat-no" title="statement not covered" >throw new Error('Failed to import feeds');</span></span> -<span class="cstat-no" title="statement not covered" > return res.json();</span> + .then((res) => { + <span class="missing-if-branch" title="if path not taken" >I</span>if (!res.ok) <span class="cstat-no" title="statement not covered" >throw new Error('Failed to import feeds');</span> + return res.json(); }) - .then(<span class="fstat-no" title="function not covered" >() => {</span> -<span class="cstat-no" title="statement not covered" > setImportFile(null);</span> -<span class="cstat-no" title="statement not covered" > fetchFeeds();</span> -<span class="cstat-no" title="statement not covered" > alert('Import successful!');</span> + .then(() => { + setImportFile(null); + fetchFeeds(); + alert('Import successful!'); + }) + .catch(<span class="fstat-no" title="function not covered" >(e</span>rr) => { +<span class="cstat-no" title="statement not covered" > setError(err.message);</span> +<span class="cstat-no" title="statement not covered" > setLoading(false);</span> + }); + }; + + const handleCrawl = () => { + setLoading(true); + apiFetch('/api/crawl', { + method: 'POST', + }) + .then((res) => { + <span class="missing-if-branch" title="if path not taken" >I</span>if (!res.ok) <span class="cstat-no" title="statement not covered" >throw new Error('Failed to start crawl');</span> + return res.json(); + }) + .then(() => { + setLoading(false); + alert('Crawl started!'); }) .catch(<span class="fstat-no" title="function not covered" >(e</span>rr) => { <span class="cstat-no" title="statement not covered" > setError(err.message);</span> @@ -528,9 +668,29 @@ export default function Settings() { }; return ( - <div className="settings-page"> + <div className="settings-page variant-glass"> <h2>Settings</h2> + {setFontTheme && ( + <div className="appearance-section"> + <h3>Appearance</h3> + <div className="font-selector"> + <label htmlFor="font-theme-select">Font Theme:</label> + <select + id="font-theme-select" + value={fontTheme || <span class="branch-1 cbranch-no" title="branch not covered" >'default'}</span> + onChange={(e) => setFontTheme(e.target.value)} + className="font-select" + > + <option value="default">Default</option> + <option value="serif">Serif</option> + <option value="sans">Sans-Serif</option> + <option value="mono">Monospace</option> + </select> + </div> + </div> + )} + <div className="add-feed-section"> <h3>Add New Feed</h3> <form onSubmit={handleAddFeed} className="add-feed-form"> @@ -556,11 +716,12 @@ export default function Settings() { <input type="file" accept=".opml,.xml,.txt" - onChange={<span class="fstat-no" title="function not covered" >(e</span>) => <span class="cstat-no" title="statement not covered" >setImportFile(e.target.files?.[0] || null)}</span> + aria-label="Import Feeds" + onChange={(e) => setImportFile(e.target.files?.[0] || <span class="branch-1 cbranch-no" title="branch not covered" >null)</span>} className="file-input" disabled={loading} /> - <button type="submit" disabled={!importFile || <span class="branch-1 cbranch-no" title="branch not covered" >loading}></span> + <button type="submit" disabled={!importFile || loading}> Import </button> </form> @@ -574,9 +735,16 @@ export default function Settings() { <a href="/api/export/json" className="export-btn">JSON</a> </div> </div> + + <div className="crawl-section"> + <h3>Actions</h3> + <button onClick={handleCrawl} disabled={loading} className="crawl-btn"> + Crawl All Feeds Now + </button> + </div> </div> - {error && <span class="branch-1 cbranch-no" title="branch not covered" ><p className="error-message">{error}</p>}</span> + {error && <p className="error-message">{error}</p>} <div className="feed-list-section"> <h3>Manage Feeds</h3> @@ -610,7 +778,7 @@ export default function Settings() { <div class='footer quiet pad2 space-top1 center small'> Code coverage generated by <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> - at 2026-02-14T18:02:09.004Z + at 2026-02-15T05:30:50.842Z </div> <script src="../../prettify.js"></script> <script> |
