- Add DataTable.svelte: declarative columns, built-in sorting, sticky headers, text truncation, column alignment, configurable widths, optional pagination/search - 12 built-in renderers: BadgeRenderer, StatusBadgeRenderer (unified risk/severity/ execution/state/type variant mapping), HealthDotRenderer, RelativeTimeRenderer, DateRenderer, DurationRenderer, StatusDotRenderer, SignalActions, ApprovalActions, ActivityAction, ActivityCancel - Migrate Overview (task board), Signals, Ops (3 tables) to DataTable - Refactor EntityTable treegrid to use shared SortHeader, EmptyState, HealthDotRenderer - Create shared components: EmptyState, StatusBadge, FilterTabs - Clean up Knowledge.svelte: replace inline relTime() and typeVariant() with shared utils - Add width, align, truncate column props; table-fixed layout; rounded-xl borders - Bump version to 0.11.0
16 lines
454 B
Svelte
16 lines
454 B
Svelte
<script lang="ts">
|
|
import type { ActivityItem } from '$lib/api'
|
|
|
|
let { value }: { value: unknown } = $props()
|
|
|
|
function fmtDuration(ms: number | null): string {
|
|
if (ms == null) return '—'
|
|
if (ms < 1000) return `${ms}ms`
|
|
const s = Math.round(ms / 1000)
|
|
if (s < 60) return `${s}s`
|
|
return `${Math.floor(s / 60)}m ${s % 60}s`
|
|
}
|
|
</script>
|
|
|
|
<span class="text-xs text-muted-foreground">{fmtDuration(value as number | null)}</span>
|