mirror of
https://github.com/thegeneralist01/archivr
synced 2026-07-21 18:55:36 +02:00
- Scaffold Vite+React project in frontend/ (bun, react 18, @vitejs/plugin-react) - vite.config.js outputs to crates/archivr-server/static/ directly - src/utils.js: formatBytes, valueText, formatTimestamp, SOURCE_ICONS, sourceIconSvg - src/api.js: typed fetch wrappers for all API endpoints - App.jsx: full state management, archive switching, debounced search, tag filter, view routing, capture dialog orchestration - components/Topbar.jsx: archive switcher, nav, capture button - components/CaptureDialog.jsx: native <dialog> ref with showModal/close, Escape key support, locator validation - components/EntriesView.jsx + EntryRow.jsx: flex table with source icons, type pills, keyboard selection - components/ContextRail.jsx: parallel detail+tags fetch, stale-race guard via selectSeqRef, inline tag assign/remove - components/RunsView.jsx: runs kept as <table> (matches original) - components/AdminView.jsx: mounted archives list - components/TagsView.jsx: recursive tag tree with active state - Remove old app.js; styles.css moved to frontend/src/ (Vite bundles it)
24 lines
1,011 B
JavaScript
24 lines
1,011 B
JavaScript
import { formatTimestamp, formatBytes, valueText, sourceIconSvg } from '../utils';
|
|
|
|
export default function EntryRow({ entry, isSelected, onSelect }) {
|
|
return (
|
|
<div
|
|
className={isSelected ? 'is-selected' : undefined}
|
|
tabIndex={0}
|
|
data-entry-uid={entry.entry_uid}
|
|
onClick={onSelect}
|
|
onKeyDown={e => { if (e.key === 'Enter') onSelect(); }}
|
|
>
|
|
<div className="col-added">{formatTimestamp(entry.archived_at)}</div>
|
|
<div className="col-title">
|
|
<span className="source-icon" dangerouslySetInnerHTML={{ __html: sourceIconSvg(entry.source_kind) }} />
|
|
<span className="entry-title">{valueText(entry.title) || valueText(entry.entry_uid)}</span>
|
|
</div>
|
|
<div className="col-type">
|
|
<span className="type-pill">{valueText(entry.entity_kind)}</span>
|
|
</div>
|
|
<div className="col-size">{formatBytes(entry.total_artifact_bytes)}</div>
|
|
<div className="url-cell col-url">{valueText(entry.original_url)}</div>
|
|
</div>
|
|
);
|
|
}
|