Audit Log

{#if spinnerVisible} {:else if refreshError} {/if}
{#if error && !data}

{error}

{:else}
{#each table.getHeaderGroups() as headerGroup} {#each headerGroup.headers as header} {/each} {/each} {#if !data} {#each Array(20) as _} {#each columns as col} {/each} {/each} {:else if data.entries.length === 0} {:else} {#each table.getRowModel().rows as row (row.id)} {@const entry = row.original} {@const change = analyzeChange(entry)} {@const isExpanded = expandedId === entry.id} {@const clickable = change.kind === "json-multi"} toggleExpanded(entry.id) : undefined} > {#each row.getVisibleCells() as cell (cell.id)} {@const colId = cell.column.id} {#if colId === "time"} {@const rel = relativeTime(new Date(entry.timestamp), now)} {:else if colId === "course"} {:else if colId === "field"} {:else if colId === "change"} {/if} {/each} {#if isExpanded && change.kind === "json-multi"} {/if} {/each} {/if}
{#if header.column.getCanSort()} {#if typeof header.column.columnDef.header === "string"} {header.column.columnDef.header} {:else} {/if} {#if header.column.getIsSorted() === "asc"} {:else if header.column.getIsSorted() === "desc"} {:else} {/if} {:else if typeof header.column.columnDef.header === "string"} {header.column.columnDef.header} {:else} {/if}
No audit log entries found.
{rel.text === "now" ? "just now" : `${rel.text} ago`} {formatCourse(entry)} {entry.fieldChanged} {#if change.kind === "scalar"} {#if change.delta !== null} {formatDelta(change.delta)}, {/if} {change.oldRaw} {change.newRaw} {:else if change.kind === "json-single"} {#if change.diffs.length === 1} {@const d = change.diffs[0]} {formatDiffPath(d.path)}: {" "} {stringify(d.oldVal)} {stringify(d.newVal)} {:else} No changes {/if} {:else if change.kind === "json-multi"} {#if isExpanded} {:else} {/if} {change.diffs.length} fields changed {/if}
{#each change.diffs as d}
{formatDiffPath(d.path)}: {" "} {stringify(d.oldVal)} {stringify(d.newVal)}
{/each}
{/if}