@everscribe/components-element 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +127 -0
- package/dist/index.cjs +2255 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +76 -0
- package/dist/index.d.ts +76 -0
- package/dist/index.js +2253 -0
- package/dist/index.js.map +1 -0
- package/package.json +59 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/dom.ts","../src/eventDetail.ts","../src/exportModal.ts","../src/filters.ts","../src/table.ts","../src/AuditTrailElement.ts","../src/index.ts"],"names":["formatTimeCell","COLUMN_LABELS"],"mappings":"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","file":"index.js","sourcesContent":["// Tiny createElement helper used throughout the web component renderer\n// - saves the createElement / setAttribute / appendChild boilerplate\n// without pulling in JSX or a templating library.\n\ntype AttrValue = string | number | boolean | undefined | null\nexport type Attrs = Record<string, AttrValue> | null\nexport type Child = Node | string | number | null | undefined | false\n\nexport function h(tag: string, attrs?: Attrs, ...children: Child[]): HTMLElement {\n const el = document.createElement(tag)\n if (attrs) {\n for (const [k, v] of Object.entries(attrs)) {\n if (v == null || v === false) continue\n if (k === 'class') el.className = String(v)\n else if (k === 'html') el.innerHTML = String(v)\n else el.setAttribute(k, String(v))\n }\n }\n for (const c of children.flat()) {\n if (c == null || c === false) continue\n el.appendChild(typeof c === 'object' ? c : document.createTextNode(String(c)))\n }\n return el\n}\n","import {\n hasParseableDiff,\n renderDiff,\n type DiffLine,\n type Event,\n} from '@everscribe/components-core'\n\nimport { h } from './dom.js'\n\nexport interface EventDetailOptions {\n event: Event\n theme: 'light' | 'dark'\n // Fired when the user dismisses the modal (Esc, backdrop click,\n // close button). Not fired when the parent dismisses programmatically\n // via the returned cleanup function.\n onClose: () => void\n}\n\ntype Tab = 'raw' | 'diff' | 'metadata'\n\nconst COPY_ICON_SVG =\n '<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" ' +\n 'stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">' +\n '<rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"></rect>' +\n '<path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"></path></svg>'\n\nconst CHECK_ICON_SVG =\n '<svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" ' +\n 'stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\">' +\n '<polyline points=\"20 6 9 17 4 12\"></polyline></svg>'\n\n// openEventDetail mounts the inspect modal as a child of document.body\n// - the React adapter uses createPortal for this; in vanilla we just\n// append. Returns a dispose function that removes the modal and tears\n// down listeners. User-initiated dismissals (Esc, backdrop, X) call\n// dispose() and then opts.onClose. Parent-initiated dismissals call\n// dispose() directly without firing onClose.\nexport function openEventDetail(opts: EventDetailOptions): () => void {\n const { event, theme, onClose } = opts\n\n let tab: Tab = 'raw'\n let copied = false\n\n const showDiff = hasParseableDiff(event.change)\n const diff = showDiff ? renderDiff(event.change) : { lines: [] }\n const rawJson = JSON.stringify(event, null, 2)\n const highlightedJson = highlightJSON(rawJson)\n const metadataRows = buildMetadataRows(event.metadata)\n const showMetadata = metadataRows.length > 0\n\n // The portal wrapper carries the theme class so CSS variables\n // resolve outside `.audit-trail-root`.\n const portal = h('div', { class: `audit-trail-portal audit-trail-theme-${theme}` })\n\n const closeBtn = h(\n 'button',\n {\n type: 'button',\n class: 'audit-trail-inspect-close',\n 'aria-label': 'Close',\n },\n '×',\n ) as HTMLButtonElement\n\n // Modal contents are built lazily because the Raw/Diff tab swap\n // re-renders the panel - keeping this in a closure also avoids a\n // separate \"selected tab\" element ref.\n const panelContainer = h('div')\n\n const renderPanel = () => {\n panelContainer.replaceChildren(buildPanel())\n }\n\n const buildPanel = (): HTMLElement => {\n if (tab === 'diff' && showDiff) {\n return h(\n 'div',\n { class: 'audit-trail-inspect-panel' },\n renderDiffTable(diff.lines),\n )\n }\n if (tab === 'metadata' && showMetadata) {\n return h(\n 'div',\n { class: 'audit-trail-inspect-panel' },\n renderMetadataTable(metadataRows),\n )\n }\n // Default to Raw. highlightedJson carries pre-escaped HTML\n // with token <span>s - set via the `html` attribute so the\n // browser interprets the tags rather than text-escaping them.\n const codeBlock = h(\n 'pre',\n { class: 'audit-trail-code-block' },\n h('code', { html: highlightedJson }),\n )\n const copyBtn = h(\n 'button',\n {\n type: 'button',\n class: 'audit-trail-copy-button',\n 'aria-label': copied ? 'Copied' : 'Copy to clipboard',\n title: copied ? 'Copied' : 'Copy to clipboard',\n html: copied ? CHECK_ICON_SVG : COPY_ICON_SVG,\n },\n )\n copyBtn.addEventListener('click', () => {\n void (async () => {\n try {\n await navigator.clipboard.writeText(rawJson)\n copied = true\n renderPanel()\n setTimeout(() => {\n copied = false\n // Only re-render if the user is still on the Raw tab and\n // the modal hasn't been disposed.\n if (!disposed && tab === 'raw') renderPanel()\n }, 1500)\n } catch {\n // Clipboard permission denied or unsupported - silent no-op.\n }\n })()\n })\n return h(\n 'div',\n { class: 'audit-trail-inspect-panel' },\n h(\n 'div',\n { class: 'audit-trail-code-block-wrap' },\n codeBlock,\n copyBtn,\n ),\n )\n }\n\n const subtitle = h(\n 'p',\n { class: 'audit-trail-inspect-subtitle' },\n h(\n 'span',\n { class: 'audit-trail-inspect-subtitle-line' },\n h('code', null, event.action || '-'),\n ),\n h(\n 'span',\n { class: 'audit-trail-inspect-subtitle-line' },\n formatHeaderTimestamp(event.occurred_at),\n ),\n h(\n 'span',\n { class: 'audit-trail-inspect-subtitle-line' },\n h('code', null, event.id),\n ),\n )\n\n const tabs =\n showDiff || showMetadata\n ? renderTabs(tab, showDiff, showMetadata, (next) => {\n tab = next\n // Toggle visual state on the buttons; rebuild the panel.\n setSelectedTab(tabsEl, next)\n renderPanel()\n })\n : null\n const tabsEl: HTMLElement | null = tabs\n\n const modalChildren: Node[] = [\n closeBtn,\n h(\n 'h2',\n { id: 'audit-trail-inspect-title', class: 'audit-trail-inspect-title' },\n 'Inspect Event',\n ),\n subtitle,\n ]\n if (tabs) modalChildren.push(tabs)\n modalChildren.push(panelContainer)\n\n const modal = h(\n 'div',\n {\n class: 'audit-trail-inspect-modal',\n role: 'dialog',\n 'aria-modal': 'true',\n 'aria-labelledby': 'audit-trail-inspect-title',\n },\n ...modalChildren,\n )\n // Stop backdrop dismissal from firing when the user clicks inside\n // the modal.\n modal.addEventListener('mousedown', (e) => e.stopPropagation())\n\n const backdrop = h('div', { class: 'audit-trail-inspect-backdrop' }, modal)\n\n portal.appendChild(backdrop)\n\n // ---- lifecycle ----\n\n let disposed = false\n const dispose = () => {\n if (disposed) return\n disposed = true\n document.removeEventListener('keydown', onKey)\n portal.remove()\n }\n const userClose = () => {\n if (disposed) return\n dispose()\n onClose()\n }\n\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') userClose()\n }\n\n closeBtn.addEventListener('click', userClose)\n backdrop.addEventListener('mousedown', userClose)\n document.addEventListener('keydown', onKey)\n\n document.body.appendChild(portal)\n renderPanel()\n // Defer focus to the next frame - focusing during append can race\n // with the parent's render and lose to whatever pulls focus next.\n queueMicrotask(() => {\n if (!disposed) closeBtn.focus()\n })\n\n return dispose\n}\n\nfunction renderTabs(\n initial: Tab,\n showDiff: boolean,\n showMetadata: boolean,\n onSelect: (tab: Tab) => void,\n): HTMLElement {\n const make = (key: Tab, label: string) => {\n const btn = h(\n 'button',\n {\n type: 'button',\n role: 'tab',\n class:\n initial === key\n ? 'audit-trail-inspect-tab audit-trail-inspect-tab-active'\n : 'audit-trail-inspect-tab',\n 'aria-selected': initial === key ? 'true' : 'false',\n 'data-tab': key,\n },\n label,\n )\n btn.addEventListener('click', () => onSelect(key))\n return btn\n }\n const tabs: HTMLElement[] = [make('raw', 'Raw')]\n if (showDiff) tabs.push(make('diff', 'Diff'))\n if (showMetadata) tabs.push(make('metadata', 'Metadata'))\n return h(\n 'div',\n { class: 'audit-trail-inspect-tabs', role: 'tablist', 'aria-label': 'View' },\n ...tabs,\n )\n}\n\nfunction setSelectedTab(tabsEl: HTMLElement | null, tab: Tab) {\n if (!tabsEl) return\n for (const child of Array.from(tabsEl.children)) {\n if (!(child instanceof HTMLElement)) continue\n const isMatch = child.dataset.tab === tab\n child.className = isMatch\n ? 'audit-trail-inspect-tab audit-trail-inspect-tab-active'\n : 'audit-trail-inspect-tab'\n child.setAttribute('aria-selected', isMatch ? 'true' : 'false')\n }\n}\n\nfunction renderDiffTable(lines: DiffLine[]): HTMLElement {\n const rows = lines.map((line) =>\n h(\n 'tr',\n null,\n h(\n 'td',\n {\n class: `audit-trail-diff-cell audit-trail-diff-before-${line.beforeKind || 'blank'}`,\n },\n h('pre', null, line.before),\n ),\n h(\n 'td',\n {\n class: `audit-trail-diff-cell audit-trail-diff-after-${line.afterKind || 'blank'}`,\n },\n h('pre', null, line.after),\n ),\n ),\n )\n return h(\n 'div',\n { class: 'audit-trail-diff-wrap' },\n h(\n 'table',\n { class: 'audit-trail-diff-table' },\n h(\n 'thead',\n null,\n h('tr', null, h('th', null, 'Before'), h('th', null, 'After')),\n ),\n h('tbody', null, ...rows),\n ),\n )\n}\n\n// formatHeaderTimestamp renders an ISO timestamp as\n// \"Month D, YYYY HH:MM:SS.mmm UTC\" - matches the upstream events UI\n// header. Always UTC so two readers in different timezones see the\n// same string when comparing notes on an event.\nfunction formatHeaderTimestamp(rfc3339: string | undefined): string {\n if (!rfc3339) return '-'\n const d = new Date(rfc3339)\n if (Number.isNaN(d.getTime())) return rfc3339\n const month = MONTHS[d.getUTCMonth()] ?? ''\n const day = d.getUTCDate()\n const year = d.getUTCFullYear()\n const hh = String(d.getUTCHours()).padStart(2, '0')\n const mm = String(d.getUTCMinutes()).padStart(2, '0')\n const ss = String(d.getUTCSeconds()).padStart(2, '0')\n const ms = String(d.getUTCMilliseconds()).padStart(3, '0')\n return `${month} ${day}, ${year} ${hh}:${mm}:${ss}.${ms} UTC`\n}\n\nconst MONTHS = [\n 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',\n 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec',\n]\n\n// JSON syntax highlighter for the Raw tab. Walks the pretty-\n// printed source, escapes HTML, and wraps tokens in <span>\n// classes the CSS colors. Punctuation (braces, commas, colons)\n// keeps the default text color.\n\nfunction highlightJSON(json: string): string {\n const safe = escapeHTML(json)\n return safe.replace(\n /(\"(?:\\\\u[a-zA-Z0-9]{4}|\\\\[^u]|[^\\\\\"])*\"(?:\\s*:)?|\\b(?:true|false|null)\\b|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?)/g,\n (match) => {\n let cls = 'audit-trail-json-num'\n if (match.startsWith('\"')) {\n cls = /:$/.test(match)\n ? 'audit-trail-json-key'\n : 'audit-trail-json-str'\n } else if (/true|false/.test(match)) {\n cls = 'audit-trail-json-bool'\n } else if (/null/.test(match)) {\n cls = 'audit-trail-json-null'\n }\n return `<span class=\"${cls}\">${match}</span>`\n },\n )\n}\n\nfunction escapeHTML(s: string): string {\n return s\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n}\n\n// Metadata tab - flat key/value table. Renders each top-level\n// metadata field as one row with type hint + value. Nested\n// objects / arrays render compactly so the column doesn't blow\n// out; users still get the full picture from the Raw tab.\n\ninterface MetadataRow {\n key: string\n value: string\n type: string\n}\n\nfunction buildMetadataRows(\n metadata: Record<string, unknown> | undefined,\n): MetadataRow[] {\n if (!metadata) return []\n const keys = Object.keys(metadata)\n if (keys.length === 0) return []\n keys.sort()\n return keys.map((k) => {\n const raw = metadata[k]\n return { key: k, value: renderMetadataValue(raw), type: classifyValue(raw) }\n })\n}\n\nfunction renderMetadataValue(v: unknown): string {\n if (v === null || v === undefined) return ''\n if (typeof v === 'string') return v\n if (typeof v === 'number' || typeof v === 'boolean') return String(v)\n try {\n return JSON.stringify(v)\n } catch {\n return String(v)\n }\n}\n\nfunction classifyValue(v: unknown): string {\n if (v === null) return 'null'\n if (Array.isArray(v)) return 'array'\n if (typeof v === 'object') return 'object'\n return typeof v\n}\n\nfunction renderMetadataTable(rows: MetadataRow[]): HTMLElement {\n return h(\n 'table',\n { class: 'audit-trail-metadata-kv-table' },\n h(\n 'thead',\n null,\n h(\n 'tr',\n null,\n h('th', { class: 'audit-trail-md-col-key' }, 'Key'),\n h('th', { class: 'audit-trail-md-col-type' }, 'Type'),\n h('th', { class: 'audit-trail-md-col-value' }, 'Value'),\n ),\n ),\n h(\n 'tbody',\n null,\n ...rows.map((r) =>\n h(\n 'tr',\n null,\n h('td', { class: 'audit-trail-md-col-key' }, h('code', null, r.key)),\n h(\n 'td',\n { class: 'audit-trail-md-col-type' },\n h('span', { class: 'audit-trail-muted' }, r.type),\n ),\n h('td', { class: 'audit-trail-md-col-value' }, h('code', null, r.value)),\n ),\n ),\n ),\n )\n}\n","import type { ExportFormat } from '@everscribe/components-core'\n\nimport { h } from './dom.js'\n\nexport interface ExportModalOptions {\n theme: 'light' | 'dark'\n // onDownload runs the actual export. Resolves on success; the modal\n // self-closes. Rejects with an Error to surface a message inline\n // without dismissing the modal.\n onDownload: (format: ExportFormat) => Promise<void>\n // Fired on user-initiated dismissal (Esc, backdrop, Cancel button).\n // Not fired on programmatic dispose, nor on a successful download\n // (the modal still closes itself in both cases - the parent already\n // knows or doesn't care).\n onClose: () => void\n}\n\ntype Status = 'idle' | 'downloading' | 'error'\n\n// openExportModal mounts the export modal as a child of document.body\n// and returns a dispose function. See openEventDetail for the dispose\n// vs onClose contract.\nexport function openExportModal(opts: ExportModalOptions): () => void {\n const { theme, onDownload, onClose } = opts\n\n let format: ExportFormat | null = null\n let status: Status = 'idle'\n let errMsg: string | null = null\n\n const csvCard = renderFormatCard(\n 'csv',\n 'CSV',\n 'Spreadsheet-friendly. Common fields are columns; nested fields (origin, metadata, change) are JSON in single columns.',\n () => selectFormat('csv'),\n )\n const jsonCard = renderFormatCard(\n 'json',\n 'JSON',\n 'Full event objects preserving nested structure. Same shape the API returns.',\n () => selectFormat('json'),\n )\n\n const errorSlot = h('div', { class: 'audit-trail-export-error-slot' })\n\n const downloadBtn = h(\n 'button',\n { type: 'button', class: 'audit-trail-button' },\n 'Download',\n ) as HTMLButtonElement\n downloadBtn.disabled = true\n\n const cancelBtn = h(\n 'button',\n {\n type: 'button',\n class: 'audit-trail-button audit-trail-button-secondary',\n },\n 'Cancel',\n ) as HTMLButtonElement\n\n const modal = h(\n 'div',\n {\n class: 'audit-trail-export-modal',\n role: 'dialog',\n 'aria-modal': 'true',\n 'aria-labelledby': 'audit-trail-export-title',\n },\n h(\n 'h2',\n { id: 'audit-trail-export-title', class: 'audit-trail-export-title' },\n 'Export events',\n ),\n h(\n 'p',\n { class: 'audit-trail-export-blurb' },\n 'The current filters and time range are applied. Capped at 100,000 rows - narrow the filters or time window if you hit it.',\n ),\n h('div', { class: 'audit-trail-export-options' }, csvCard, jsonCard),\n errorSlot,\n h('div', { class: 'audit-trail-export-actions' }, downloadBtn, cancelBtn),\n )\n\n const backdrop = h(\n 'div',\n { class: 'audit-trail-export-backdrop', role: 'presentation' },\n modal,\n )\n const portal = h(\n 'div',\n { class: `audit-trail-portal audit-trail-theme-${theme}` },\n backdrop,\n )\n\n // ---- selection / state transitions ----\n\n const selectFormat = (fmt: ExportFormat) => {\n format = fmt\n setSelected(csvCard, fmt === 'csv')\n setSelected(jsonCard, fmt === 'json')\n refreshButtons()\n }\n\n const refreshButtons = () => {\n downloadBtn.disabled = !format || status === 'downloading'\n downloadBtn.textContent = status === 'downloading' ? 'Downloading…' : 'Download'\n cancelBtn.disabled = status === 'downloading'\n if (status === 'error' && errMsg) {\n errorSlot.replaceChildren(\n h(\n 'div',\n { class: 'audit-trail-export-error', role: 'alert' },\n errMsg,\n ),\n )\n } else {\n errorSlot.replaceChildren()\n }\n }\n\n // ---- lifecycle ----\n\n let disposed = false\n const dispose = () => {\n if (disposed) return\n disposed = true\n document.removeEventListener('keydown', onKey)\n portal.remove()\n }\n const userClose = () => {\n if (disposed) return\n if (status === 'downloading') return\n dispose()\n onClose()\n }\n\n const onKey = (e: KeyboardEvent) => {\n if (e.key === 'Escape') userClose()\n }\n\n cancelBtn.addEventListener('click', userClose)\n backdrop.addEventListener('click', (e) => {\n if (e.target !== backdrop) return\n userClose()\n })\n document.addEventListener('keydown', onKey)\n\n downloadBtn.addEventListener('click', () => {\n if (!format || status === 'downloading') return\n status = 'downloading'\n errMsg = null\n refreshButtons()\n void (async () => {\n try {\n await onDownload(format!)\n if (disposed) return\n // Successful download - close the modal. We don't fire\n // onClose because the parent already drove the action.\n dispose()\n } catch (err) {\n if (disposed) return\n status = 'error'\n errMsg = err instanceof Error ? err.message : 'Export failed.'\n refreshButtons()\n }\n })()\n })\n\n document.body.appendChild(portal)\n return dispose\n}\n\nfunction renderFormatCard(\n format: ExportFormat,\n title: string,\n body: string,\n onSelect: () => void,\n): HTMLElement {\n const btn = h(\n 'button',\n {\n type: 'button',\n role: 'radio',\n 'aria-checked': 'false',\n class: 'audit-trail-export-card',\n 'data-format': format,\n },\n h('span', { class: 'audit-trail-export-card-title' }, title),\n h('span', { class: 'audit-trail-export-card-body' }, body),\n )\n btn.addEventListener('click', onSelect)\n return btn\n}\n\nfunction setSelected(card: HTMLElement, selected: boolean) {\n card.className = selected\n ? 'audit-trail-export-card audit-trail-export-card-selected'\n : 'audit-trail-export-card'\n card.setAttribute('aria-checked', selected ? 'true' : 'false')\n}\n","import type {\n DistinctValues,\n EmbedClaims,\n} from '@everscribe/components-core'\n\nimport { h } from './dom.js'\n\nexport type TimeRangePreset = '24h' | '7d' | '30d' | 'custom' | 'all'\nexport type FilterTab = 'ai' | 'filters' | 'query'\n\nexport interface FilterValues {\n range: TimeRangePreset\n // since / before are only meaningful when range === 'custom'.\n // Stored as datetime-local strings (YYYY-MM-DDTHH:mm) - the API\n // wants ISO, so resolveTimeBounds promotes them at send-time.\n since?: string\n before?: string\n action?: string\n actor?: string\n actorType?: string\n tenantId?: string\n targetType?: string\n targetId?: string\n resultStatus?: string\n originIP?: string\n // q is the DSL query - set from the Query tab (user input) or\n // the Prompt tab (model-translated). Active filter chips parse this.\n q?: string\n // NLP echo fields - set when the Prompt tab produced the current q.\n // Render the \"Translated to:\" banner from these.\n nlpQ?: string\n nlpExplanation?: string\n nlpUnsupported?: string[]\n}\n\nexport type NLPErrorReason =\n | 'not_configured'\n | 'not_allowed'\n | 'rate_limited'\n | 'provider_busy'\n | 'bad_request'\n | 'unknown'\n\nexport type NLPState =\n | { phase: 'idle' }\n | { phase: 'loading' }\n | { phase: 'error'; reason: NLPErrorReason }\n\nexport interface FiltersPanelOptions {\n value: FilterValues\n distinct: DistinctValues\n claims: EmbedClaims | null\n activeTab: FilterTab\n nlpState: NLPState\n // Tab + filter mutators. Parent (AuditTrailElement) owns the state;\n // these callbacks are the only way the panel mutates anything.\n onTabChange: (next: FilterTab) => void\n onChange: (next: FilterValues) => void\n // Prompt-tab Search fires the NLP round-trip on the parent. Parent\n // flips nlpState to 'loading' immediately and re-renders.\n onNLPSubmit: (query: string) => void\n // Fired when the user commits a Filters-tab action (\"Add filters\",\n // \"Add filter\"). Parent rolls the panel up so the newly applied\n // filters and resulting table are immediately visible.\n onApplied?: () => void\n}\n\nconst TIME_PRESETS: ReadonlyArray<{ key: TimeRangePreset; label: string }> = [\n { key: '24h', label: '24h' },\n { key: '7d', label: '7d' },\n { key: '30d', label: '30d' },\n { key: 'custom', label: 'Custom' },\n { key: 'all', label: 'All' },\n]\n\n// pickInitialTab figures out which tab to show on first render. NLP\n// echo wins (the user just submitted a NL query); then DSL (they were\n// composing one); then column filters; else Prompt when available.\nexport function pickInitialTab(\n v: FilterValues,\n claims: EmbedClaims | null,\n): FilterTab {\n if (v.nlpQ && claims?.allow_nlp) return 'ai'\n if (v.q && claims?.allow_dsl_input) return 'query'\n if (hasAnyColumnFilter(v)) return 'filters'\n if (claims?.allow_nlp) return 'ai'\n return 'filters'\n}\n\n// Top-level renderer\n\nexport function renderFiltersPanel(opts: FiltersPanelOptions): HTMLElement {\n const { claims, activeTab } = opts\n const allowNLP = !!claims?.allow_nlp\n const allowDSL = !!claims?.allow_dsl_input\n\n const tabBar = renderTabBar({ allowNLP, allowDSL, activeTab, onTabChange: opts.onTabChange })\n\n let body: HTMLElement\n if (activeTab === 'ai' && allowNLP) {\n body = renderAITabPanel(opts)\n } else if (activeTab === 'query' && allowDSL) {\n body = renderQueryTabPanel(opts)\n } else {\n body = renderFiltersTabPanel(opts)\n }\n\n return h('div', { class: 'audit-trail-filter-panel' }, tabBar, body)\n}\n\ninterface TabBarOptions {\n allowNLP: boolean\n allowDSL: boolean\n activeTab: FilterTab\n onTabChange: (next: FilterTab) => void\n}\n\nfunction renderTabBar(opts: TabBarOptions): HTMLElement {\n const tabs: HTMLElement[] = []\n const make = (key: FilterTab, label: string) => {\n const active = opts.activeTab === key\n const btn = h(\n 'button',\n {\n type: 'button',\n role: 'tab',\n 'aria-selected': active ? 'true' : 'false',\n class: active\n ? 'audit-trail-filter-mode audit-trail-filter-mode-selected'\n : 'audit-trail-filter-mode',\n },\n label,\n )\n btn.addEventListener('click', () => opts.onTabChange(key))\n return btn\n }\n if (opts.allowNLP) tabs.push(make('ai', 'Prompt'))\n tabs.push(make('filters', 'Filters'))\n if (opts.allowDSL) tabs.push(make('query', 'Query'))\n return h(\n 'div',\n { class: 'audit-trail-filter-modes', role: 'tablist', 'aria-label': 'Filter mode' },\n ...tabs,\n )\n}\n\n// Prompt (AI) tab\n\nfunction renderAITabPanel(opts: FiltersPanelOptions): HTMLElement {\n const { value, nlpState, onNLPSubmit } = opts\n\n const input = h('input', {\n type: 'text',\n id: 'audit-trail-nlp-input',\n class: 'audit-trail-nlp-input',\n placeholder: 'e.g. failed logins last 24 hours',\n maxlength: 500,\n 'aria-label': 'Natural-language filter query',\n value: value.nlpQ ?? '',\n }) as HTMLInputElement\n input.value = value.nlpQ ?? ''\n if (nlpState.phase === 'loading') input.disabled = true\n\n const submit = () => {\n const q = input.value.trim()\n if (!q) return\n onNLPSubmit(q)\n }\n\n const label = h(\n 'label',\n { class: 'audit-trail-nlp-label', for: 'audit-trail-nlp-input' },\n 'Ask in plain English',\n h(\n 'span',\n {\n class: 'audit-trail-badge audit-trail-badge-info',\n title: 'Beta',\n },\n 'Beta',\n ),\n )\n\n const children: Node[] = [label, input]\n\n if (value.q && value.nlpQ) {\n children.push(\n h(\n 'div',\n { class: 'audit-trail-nlp-banner' },\n h(\n 'p',\n null,\n h('strong', null, 'Translated to:'),\n ' ',\n h('code', { class: 'audit-trail-nlp-translated' }, value.q),\n ),\n ),\n )\n }\n\n if (nlpState.phase === 'error') {\n children.push(\n h('div', { class: 'audit-trail-error' }, nlpErrorMessage(nlpState.reason)),\n )\n }\n\n if (value.nlpUnsupported && value.nlpUnsupported.length > 0) {\n children.push(renderUnsupportedList(value.nlpUnsupported))\n }\n\n const btn = h(\n 'button',\n {\n type: 'button',\n class: 'audit-trail-button audit-trail-button-secondary',\n },\n ) as HTMLButtonElement\n if (nlpState.phase === 'loading') {\n btn.disabled = true\n btn.appendChild(h('span', { class: 'audit-trail-button-spinner' }))\n btn.appendChild(document.createTextNode(' Translating…'))\n } else {\n btn.textContent = 'Search'\n }\n // Re-evaluate disabled state when input changes - empty query\n // keeps Search disabled.\n const updateBtn = () => {\n if (nlpState.phase === 'loading') return\n btn.disabled = input.value.trim() === ''\n }\n input.addEventListener('input', updateBtn)\n updateBtn()\n btn.addEventListener('click', submit)\n input.addEventListener('keydown', (e) => {\n if (e.key === 'Enter') {\n e.preventDefault()\n submit()\n }\n })\n\n children.push(h('div', { class: 'audit-trail-filter-actions' }, btn))\n\n return h('form', { class: 'audit-trail-nlp-form' }, ...children)\n}\n\nfunction nlpErrorMessage(reason: NLPErrorReason): string {\n switch (reason) {\n case 'not_configured':\n return \"Natural-language filtering isn't configured on this server.\"\n case 'not_allowed':\n return 'This embed token does not permit natural-language queries.'\n case 'rate_limited':\n return \"You've hit the per-hour limit. Try again in a few minutes.\"\n case 'provider_busy':\n return 'The natural-language service is busy right now. Try again in a moment.'\n case 'bad_request':\n return \"That query couldn't be processed. Try rephrasing.\"\n default:\n return \"Couldn't process that query. Try simpler terms.\"\n }\n}\n\nfunction renderUnsupportedList(items: string[]): HTMLElement {\n const ul = h(\n 'ul',\n null,\n ...items.map((u) => h('li', null, `Couldn't apply: ${u}`)),\n )\n return h(\n 'div',\n { class: 'audit-trail-error audit-trail-nlp-unsupported' },\n ul,\n )\n}\n\n// Filters tab - time-range presets, column filters, metadata builder.\n// Column filters are draft-based: nothing commits until \"Add filters\"\n// is clicked. Time-range presets apply immediately (view selector).\n\nfunction renderFiltersTabPanel(opts: FiltersPanelOptions): HTMLElement {\n const { value, distinct, onChange, onApplied } = opts\n\n // Drafts live in the DOM inputs themselves. Add filters reads them\n // at click time - no React-style state syncing.\n let actionSelect: HTMLSelectElement\n let actorTypeSelect: HTMLSelectElement\n let targetTypeSelect: HTMLSelectElement\n let tenantSelect: HTMLSelectElement | null = null\n let resultSelect: HTMLSelectElement | null = null\n let actorInput: HTMLInputElement\n let targetIDInput: HTMLInputElement\n let originIPInput: HTMLInputElement\n let sinceInput: HTMLInputElement | null = null\n let beforeInput: HTMLInputElement | null = null\n\n // ---- time-range presets ----\n const timePresets = h(\n 'div',\n {\n class: 'audit-trail-filter-tabs',\n role: 'tablist',\n 'aria-label': 'Time range',\n },\n ...TIME_PRESETS.map((p) => {\n const selected = value.range === p.key\n const btn = h(\n 'button',\n {\n type: 'button',\n role: 'tab',\n 'aria-selected': selected ? 'true' : 'false',\n class: selected\n ? 'audit-trail-filter-tab audit-trail-filter-tab-selected'\n : 'audit-trail-filter-tab',\n },\n p.label,\n )\n btn.addEventListener('click', () => {\n if (p.key === 'custom') {\n onChange({ ...value, range: p.key })\n } else {\n onChange({ ...value, range: p.key, since: undefined, before: undefined })\n }\n })\n return btn\n }),\n )\n\n // ---- custom-range pickers ----\n let customRow: HTMLElement | null = null\n if (value.range === 'custom') {\n sinceInput = buildDateInput(value.since ?? '')\n beforeInput = buildDateInput(value.before ?? '')\n customRow = h(\n 'div',\n { class: 'audit-trail-filter-row' },\n h(\n 'label',\n { class: 'audit-trail-filter-field' },\n h('span', { class: 'audit-trail-filter-field-label' }, 'From'),\n sinceInput,\n ),\n h(\n 'label',\n { class: 'audit-trail-filter-field' },\n h('span', { class: 'audit-trail-filter-field-label' }, 'To'),\n beforeInput,\n ),\n )\n }\n\n // ---- column-filter selects ----\n actionSelect = buildSelect('Action', 'All actions', value.action ?? '', distinct.actions)\n actorTypeSelect = buildSelect(\n 'Actor type',\n 'All actor types',\n value.actorType ?? '',\n distinct.actorTypes,\n )\n targetTypeSelect = buildSelect(\n 'Target type',\n 'All target types',\n value.targetType ?? '',\n distinct.targetTypes,\n )\n const dropdownChildren: HTMLElement[] = [actionSelect, actorTypeSelect, targetTypeSelect]\n if (distinct.tenants.length > 0) {\n tenantSelect = buildSelect(\n 'Tenant',\n 'All tenants',\n value.tenantId ?? '',\n distinct.tenants,\n )\n dropdownChildren.push(tenantSelect)\n }\n if (distinct.resultStatuses.length > 0) {\n resultSelect = buildSelect(\n 'Result',\n 'All results',\n value.resultStatus ?? '',\n distinct.resultStatuses,\n )\n dropdownChildren.push(resultSelect)\n }\n const dropdownRow = h(\n 'div',\n { class: 'audit-trail-filter-row' },\n ...dropdownChildren,\n )\n\n // ---- column-filter text inputs ----\n // Free-text filters each on their own row - three inputs side-by-\n // side wrapped awkwardly on narrow embed widths. Stacked they\n // breathe and read naturally.\n actorInput = buildTextInput(\n value.actor ?? '',\n 'Actor (id, name, email)',\n 'audit-trail-filter-input audit-trail-filter-actor-input',\n )\n targetIDInput = buildTextInput(\n value.targetId ?? '',\n 'Target ID',\n 'audit-trail-filter-input audit-trail-filter-wide-input',\n )\n originIPInput = buildTextInput(\n value.originIP ?? '',\n 'Origin IP',\n 'audit-trail-filter-input audit-trail-filter-wide-input',\n )\n const textRowActor = h('div', { class: 'audit-trail-filter-row' }, actorInput)\n const textRowTarget = h('div', { class: 'audit-trail-filter-row' }, targetIDInput)\n const textRowOrigin = h('div', { class: 'audit-trail-filter-row' }, originIPInput)\n\n // ---- Add filters button (commits all drafts, clears NLP/DSL) ----\n const addBtn = h(\n 'button',\n {\n type: 'button',\n class: 'audit-trail-button audit-trail-button-secondary',\n },\n 'Add filters',\n ) as HTMLButtonElement\n\n const norm = (s: string) => (s === '' ? undefined : s)\n const computeDirty = (): boolean => {\n if (norm(actionSelect.value) !== value.action) return true\n if (norm(actorTypeSelect.value) !== value.actorType) return true\n if (norm(targetTypeSelect.value) !== value.targetType) return true\n if (tenantSelect && norm(tenantSelect.value) !== value.tenantId) return true\n if (resultSelect && norm(resultSelect.value) !== value.resultStatus) return true\n if (norm(actorInput.value) !== value.actor) return true\n if (norm(targetIDInput.value) !== value.targetId) return true\n if (norm(originIPInput.value) !== value.originIP) return true\n if (value.range === 'custom') {\n if (norm(sinceInput?.value ?? '') !== value.since) return true\n if (norm(beforeInput?.value ?? '') !== value.before) return true\n }\n return false\n }\n const refreshDirty = () => {\n addBtn.disabled = !computeDirty()\n }\n refreshDirty()\n\n // Wire input events on every draft surface to re-evaluate the\n // dirty flag. Cheap - no API calls until the button is clicked.\n for (const el of [\n actionSelect,\n actorTypeSelect,\n targetTypeSelect,\n tenantSelect,\n resultSelect,\n ].filter(Boolean) as HTMLSelectElement[]) {\n el.addEventListener('change', refreshDirty)\n }\n for (const el of [actorInput, targetIDInput, originIPInput].filter(\n Boolean,\n ) as HTMLInputElement[]) {\n el.addEventListener('input', refreshDirty)\n }\n if (sinceInput) sinceInput.addEventListener('input', refreshDirty)\n if (beforeInput) beforeInput.addEventListener('input', refreshDirty)\n\n addBtn.addEventListener('click', () => {\n onChange({\n ...value,\n action: norm(actionSelect.value),\n actorType: norm(actorTypeSelect.value),\n targetType: norm(targetTypeSelect.value),\n tenantId: tenantSelect ? norm(tenantSelect.value) : value.tenantId,\n resultStatus: resultSelect ? norm(resultSelect.value) : value.resultStatus,\n actor: norm(actorInput.value),\n targetId: norm(targetIDInput.value),\n originIP: norm(originIPInput.value),\n since:\n value.range === 'custom' ? norm(sinceInput?.value ?? '') : value.since,\n before:\n value.range === 'custom' ? norm(beforeInput?.value ?? '') : value.before,\n q: undefined,\n nlpQ: undefined,\n nlpExplanation: undefined,\n nlpUnsupported: undefined,\n })\n onApplied?.()\n })\n\n const addBtnRow = h('div', { class: 'audit-trail-filter-actions' }, addBtn)\n\n // ---- inline metadata / changed-field builder ----\n const metaSection = renderMetadataFilterSection(value, distinct, onChange, onApplied)\n\n const children: Node[] = [timePresets]\n if (customRow) children.push(customRow)\n children.push(\n dropdownRow,\n textRowActor,\n textRowTarget,\n textRowOrigin,\n addBtnRow,\n metaSection,\n )\n\n return h('div', { class: 'audit-trail-filter-tab-panel' }, ...children)\n}\n\nfunction buildSelect(\n ariaLabel: string,\n emptyLabel: string,\n selected: string,\n options: string[],\n): HTMLSelectElement {\n const sel = h('select', {\n class: 'audit-trail-filter-select',\n 'aria-label': ariaLabel,\n }) as HTMLSelectElement\n const empty = h('option', { value: '' }, emptyLabel) as HTMLOptionElement\n if (selected === '') empty.selected = true\n sel.appendChild(empty)\n for (const opt of options) {\n const o = h('option', { value: opt }, opt) as HTMLOptionElement\n if (opt === selected) o.selected = true\n sel.appendChild(o)\n }\n return sel\n}\n\nfunction buildTextInput(value: string, placeholder: string, className: string): HTMLInputElement {\n const input = h('input', {\n type: 'text',\n class: className,\n placeholder,\n value,\n }) as HTMLInputElement\n input.value = value\n return input\n}\n\nfunction buildDateInput(value: string): HTMLInputElement {\n const input = h('input', {\n type: 'datetime-local',\n class: 'audit-trail-filter-input',\n value,\n }) as HTMLInputElement\n input.value = value\n return input\n}\n\n// Metadata / changed-field builder. One DSL clause composed from\n// picker inputs; Add filter replaces q (and clears NLP echo).\n\ntype AddFilterVariant = 'metadata' | 'change-field' | 'change-before' | 'change-after'\ntype MetadataOperator =\n | 'eq'\n | 'neq'\n | 'contains'\n | 'gt'\n | 'gte'\n | 'lt'\n | 'lte'\n | 'between'\n\nfunction renderMetadataFilterSection(\n value: FilterValues,\n distinct: DistinctValues,\n onChange: (next: FilterValues) => void,\n onApplied?: () => void,\n): HTMLElement {\n let variant: AddFilterVariant = 'metadata'\n\n const typeSelect = h('select', null) as HTMLSelectElement\n for (const [val, label] of [\n ['metadata', 'Metadata key/value'],\n ['change-field', 'Change: a field changed'],\n ['change-before', 'Change: previous value (before)'],\n ['change-after', 'Change: new value (after)'],\n ] as const) {\n const o = h('option', { value: val }, label) as HTMLOptionElement\n typeSelect.appendChild(o)\n }\n typeSelect.value = variant\n\n // Variant-specific inputs are built once and shown/hidden on\n // variant change. Each variant's inputs share a wrapper element\n // so the variant switch can toggle display via a class.\n const mdKey = h('input', {\n type: 'text',\n placeholder: 'e.g. environment',\n list: 'audit-trail-mdk-key-list',\n }) as HTMLInputElement\n const mdKeyList = h('datalist', { id: 'audit-trail-mdk-key-list' })\n for (const k of distinct.metadataKeys) {\n mdKeyList.appendChild(\n h('option', { value: k.key }, `${k.observed_type} · ${k.event_count}`),\n )\n }\n const mdOp = h('select', null) as HTMLSelectElement\n for (const [val, label] of [\n ['eq', 'equals'],\n ['neq', 'not equal'],\n ['contains', 'contains'],\n ['gt', 'greater than'],\n ['gte', 'greater or equal'],\n ['lt', 'less than'],\n ['lte', 'less or equal'],\n ['between', 'between'],\n ] as const) {\n mdOp.appendChild(h('option', { value: val }, label))\n }\n const mdValue = h('input', {\n type: 'text',\n placeholder: 'e.g. prod',\n }) as HTMLInputElement\n const mdValue2 = h('input', {\n type: 'text',\n placeholder: 'e.g. 1000',\n }) as HTMLInputElement\n\n const cfField = h('input', {\n type: 'text',\n placeholder: 'e.g. email',\n list: 'audit-trail-cf-field-list',\n }) as HTMLInputElement\n const cfFieldList = h('datalist', { id: 'audit-trail-cf-field-list' })\n for (const c of distinct.changeFields) {\n cfFieldList.appendChild(h('option', { value: c.field }, `${c.event_count} events`))\n }\n\n const cbField = h('input', {\n type: 'text',\n placeholder: 'e.g. role',\n list: 'audit-trail-cf-field-list',\n }) as HTMLInputElement\n const cbValue = h('input', {\n type: 'text',\n placeholder: 'e.g. user',\n }) as HTMLInputElement\n\n const caField = h('input', {\n type: 'text',\n placeholder: 'e.g. role',\n list: 'audit-trail-cf-field-list',\n }) as HTMLInputElement\n const caValue = h('input', {\n type: 'text',\n placeholder: 'e.g. admin',\n }) as HTMLInputElement\n\n const metadataVariant = h(\n 'div',\n { 'data-variant': 'metadata' },\n addFilterRow('Key', mdKey, mdKeyList),\n addFilterRow('Operator', mdOp),\n addFilterRow('Value', mdValue),\n addFilterRow('Upper bound', mdValue2),\n )\n const changeFieldVariant = h(\n 'div',\n { 'data-variant': 'change-field' },\n addFilterRow('Field', cfField, cfFieldList),\n )\n const changeBeforeVariant = h(\n 'div',\n { 'data-variant': 'change-before' },\n addFilterRow('Field', cbField),\n addFilterRow('Previous value', cbValue),\n )\n const changeAfterVariant = h(\n 'div',\n { 'data-variant': 'change-after' },\n addFilterRow('Field', caField),\n addFilterRow('New value', caValue),\n )\n\n const variants: HTMLElement[] = [\n metadataVariant,\n changeFieldVariant,\n changeBeforeVariant,\n changeAfterVariant,\n ]\n\n const errorEl = h('p', { class: 'audit-trail-add-filter-error' }, '') as HTMLElement\n errorEl.style.display = 'none'\n\n const addBtn = h(\n 'button',\n {\n type: 'button',\n class: 'audit-trail-button audit-trail-button-secondary',\n },\n 'Add filter',\n ) as HTMLButtonElement\n\n const mdValue2Row = metadataVariant.children[3] as HTMLElement\n mdValue2Row.style.display = 'none'\n\n // refresh must be declared BEFORE showVariant - showVariant's body\n // references refresh via closure, and the initial showVariant('metadata')\n // call below would hit refresh in the temporal dead zone otherwise.\n const refresh = () => {\n const compiled = compileMetaClause({\n variant,\n mdKey: mdKey.value,\n mdOp: mdOp.value as MetadataOperator,\n mdValue: mdValue.value,\n mdValue2: mdValue2.value,\n cfField: cfField.value,\n cbField: cbField.value,\n cbValue: cbValue.value,\n caField: caField.value,\n caValue: caValue.value,\n })\n addBtn.disabled = compiled.dsl === null\n // Only surface the \"between\" hint while composing - other compile\n // errors are just \"you haven't filled in X yet\" and would be noisy.\n if (compiled.error && /Both bounds/.test(compiled.error)) {\n errorEl.textContent = compiled.error\n errorEl.style.display = ''\n } else {\n errorEl.textContent = ''\n errorEl.style.display = 'none'\n }\n }\n\n const showVariant = (v: AddFilterVariant) => {\n variant = v\n for (const el of variants) {\n el.style.display = el.dataset.variant === v ? '' : 'none'\n }\n refresh()\n }\n showVariant('metadata')\n\n typeSelect.addEventListener('change', () => showVariant(typeSelect.value as AddFilterVariant))\n mdOp.addEventListener('change', () => {\n mdValue2Row.style.display = mdOp.value === 'between' ? '' : 'none'\n refresh()\n })\n for (const el of [\n mdKey,\n mdValue,\n mdValue2,\n cfField,\n cbField,\n cbValue,\n caField,\n caValue,\n ]) {\n el.addEventListener('input', refresh)\n }\n\n addBtn.addEventListener('click', () => {\n const compiled = compileMetaClause({\n variant,\n mdKey: mdKey.value,\n mdOp: mdOp.value as MetadataOperator,\n mdValue: mdValue.value,\n mdValue2: mdValue2.value,\n cfField: cfField.value,\n cbField: cbField.value,\n cbValue: cbValue.value,\n caField: caField.value,\n caValue: caValue.value,\n })\n if (!compiled.dsl) return\n // Filters-tab actions start clean: replace q with just this\n // clause and strip any AI echo.\n onChange({\n ...value,\n q: compiled.dsl,\n nlpQ: undefined,\n nlpExplanation: undefined,\n nlpUnsupported: undefined,\n })\n onApplied?.()\n })\n\n refresh()\n\n return h(\n 'div',\n { class: 'audit-trail-add-filter-inline' },\n h('h3', { class: 'audit-trail-add-filter-heading' }, 'Metadata and Changed Fields'),\n addFilterRow('Filter type', typeSelect),\n metadataVariant,\n changeFieldVariant,\n changeBeforeVariant,\n changeAfterVariant,\n errorEl,\n h(\n 'div',\n { class: 'audit-trail-filter-actions audit-trail-add-filter-actions' },\n addBtn,\n ),\n )\n}\n\nfunction addFilterRow(label: string, ...children: Node[]): HTMLElement {\n return h(\n 'label',\n { class: 'audit-trail-add-filter-row' },\n h('span', { class: 'audit-trail-add-filter-label' }, label),\n ...children,\n )\n}\n\ninterface MetaCompileInput {\n variant: AddFilterVariant\n mdKey: string\n mdOp: MetadataOperator\n mdValue: string\n mdValue2: string\n cfField: string\n cbField: string\n cbValue: string\n caField: string\n caValue: string\n}\n\ninterface MetaCompileResult {\n dsl: string | null\n error?: string\n}\n\nfunction compileMetaClause(i: MetaCompileInput): MetaCompileResult {\n switch (i.variant) {\n case 'metadata': {\n const key = i.mdKey.trim()\n if (!key) return { dsl: null, error: 'Key is required' }\n const path = 'metadata.' + quoteKeyIfNeeded(key)\n const v1 = i.mdValue\n const v2 = i.mdValue2\n switch (i.mdOp) {\n case 'eq':\n return { dsl: `${path}:${quoteIfNeeded(v1)}` }\n case 'neq':\n return { dsl: `${path}:!${quoteIfNeeded(v1)}` }\n case 'contains':\n return { dsl: `${path}:~${quoteIfNeeded(v1)}` }\n case 'gt':\n return { dsl: `${path}:>${quoteIfNeeded(v1)}` }\n case 'gte':\n return { dsl: `${path}:>=${quoteIfNeeded(v1)}` }\n case 'lt':\n return { dsl: `${path}:<${quoteIfNeeded(v1)}` }\n case 'lte':\n return { dsl: `${path}:<=${quoteIfNeeded(v1)}` }\n case 'between':\n if (v1 === '' || v2 === '') {\n return { dsl: null, error: 'Both bounds required for between' }\n }\n return {\n dsl: `${path}:[${quoteIfNeeded(v1)} TO ${quoteIfNeeded(v2)}]`,\n }\n }\n return { dsl: null, error: 'Unknown operator' }\n }\n case 'change-field': {\n const f = i.cfField.trim()\n if (!f) return { dsl: null, error: 'Field is required' }\n return { dsl: `change.field:${quoteIfNeeded(f)}` }\n }\n case 'change-before': {\n const f = i.cbField.trim()\n if (!f) return { dsl: null, error: 'Field is required' }\n return {\n dsl: `change.${quoteKeyIfNeeded(f)}.before:${quoteIfNeeded(i.cbValue)}`,\n }\n }\n case 'change-after': {\n const f = i.caField.trim()\n if (!f) return { dsl: null, error: 'Field is required' }\n return {\n dsl: `change.${quoteKeyIfNeeded(f)}.after:${quoteIfNeeded(i.caValue)}`,\n }\n }\n }\n}\n\nfunction quoteIfNeeded(raw: string): string {\n if (raw === '') return '\"\"'\n if (/[\\s\"\\(\\)\\[\\]]/.test(raw)) {\n return '\"' + raw.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"') + '\"'\n }\n return raw\n}\n\nfunction quoteKeyIfNeeded(raw: string): string {\n if (/^[A-Za-z_][A-Za-z0-9_-]*$/.test(raw)) return raw\n return '\"' + raw + '\"'\n}\n\n// Query tab - explicit-submit DSL input.\n\nfunction renderQueryTabPanel(opts: FiltersPanelOptions): HTMLElement {\n const { value, onChange } = opts\n\n const input = h('input', {\n type: 'text',\n id: 'audit-trail-query-input',\n class: 'audit-trail-query-input',\n placeholder: 'e.g. action:user.login AND result.status:!ok',\n 'aria-label': 'Advanced query (DSL)',\n spellcheck: 'false',\n value: value.q ?? '',\n }) as HTMLInputElement\n input.value = value.q ?? ''\n\n const label = h(\n 'label',\n { class: 'audit-trail-query-label', for: 'audit-trail-query-input' },\n 'Query ',\n h(\n 'a',\n {\n href: 'https://everscribe.io/docs',\n target: '_blank',\n rel: 'noopener noreferrer',\n },\n '(see docs)',\n ),\n )\n\n const btn = h(\n 'button',\n {\n type: 'button',\n class: 'audit-trail-button audit-trail-button-secondary',\n },\n 'Search',\n ) as HTMLButtonElement\n\n const refresh = () => {\n btn.disabled = input.value.trim() === (value.q ?? '')\n }\n refresh()\n input.addEventListener('input', refresh)\n\n const submit = () => {\n const next = input.value.trim() || undefined\n if (next === value.q) return\n onChange({\n ...value,\n q: next,\n nlpQ: undefined,\n nlpExplanation: undefined,\n nlpUnsupported: undefined,\n })\n }\n btn.addEventListener('click', submit)\n input.addEventListener('keydown', (e) => {\n if (e.key === 'Enter') {\n e.preventDefault()\n submit()\n }\n })\n\n return h(\n 'form',\n { class: 'audit-trail-query-form' },\n label,\n input,\n h('div', { class: 'audit-trail-filter-actions' }, btn),\n )\n}\n\n// Active-filter chips. Rendered above the panel (by AuditTrailElement),\n// not inside it.\n\nexport interface FilterChipsOptions {\n value: FilterValues\n onChange: (next: FilterValues) => void\n}\n\nexport function renderFilterChips(opts: FilterChipsOptions): HTMLElement | null {\n const { value, onChange } = opts\n const chips: { label: string; remove: () => void }[] = []\n\n const colChip = (field: keyof FilterValues, label: string, raw: string | undefined) => {\n if (!raw) return\n chips.push({\n label: `${label}: ${raw}`,\n remove: () => onChange({ ...value, [field]: undefined } as FilterValues),\n })\n }\n colChip('action', 'Action', value.action)\n colChip('actor', 'Actor', value.actor)\n colChip('actorType', 'Actor type', value.actorType)\n colChip('tenantId', 'Tenant', value.tenantId)\n colChip('targetType', 'Target type', value.targetType)\n colChip('targetId', 'Target ID', value.targetId)\n colChip('resultStatus', 'Result', value.resultStatus)\n colChip('originIP', 'Origin IP', value.originIP)\n\n if (value.q) {\n for (const clause of parseQClauses(value.q)) {\n chips.push({\n label: clause.label,\n remove: () => {\n const nextQ = removeClauseFromQ(value.q!, clause.raw)\n onChange({\n ...value,\n q: nextQ,\n nlpQ: nextQ ? value.nlpQ : undefined,\n nlpExplanation: nextQ ? value.nlpExplanation : undefined,\n nlpUnsupported: nextQ ? value.nlpUnsupported : undefined,\n })\n },\n })\n }\n }\n\n if (chips.length === 0) return null\n\n const chipsRow = h(\n 'div',\n { class: 'audit-trail-filter-chips' },\n ...chips.map((c) => {\n const btn = h(\n 'button',\n {\n type: 'button',\n class: 'audit-trail-filter-chip',\n title: 'Remove this filter',\n 'aria-label': `Remove filter: ${c.label}`,\n },\n h('span', null, c.label),\n h('span', { 'aria-hidden': 'true', class: 'audit-trail-filter-chip-x' }, '×'),\n )\n btn.addEventListener('click', c.remove)\n return btn\n }),\n )\n\n const clearAllBtn = h(\n 'button',\n {\n type: 'button',\n class: 'audit-trail-button audit-trail-button-text',\n },\n 'Clear all',\n )\n clearAllBtn.addEventListener('click', () => {\n onChange({\n range: value.range,\n since: value.since,\n before: value.before,\n })\n })\n\n return h(\n 'div',\n { class: 'audit-trail-filter-chips-row' },\n chipsRow,\n clearAllBtn,\n )\n}\n\n// Counters / helpers (used by AuditTrailElement).\n\nfunction hasAnyColumnFilter(v: FilterValues): boolean {\n return !!(\n v.action ||\n v.actor ||\n v.actorType ||\n v.tenantId ||\n v.targetType ||\n v.targetId ||\n v.resultStatus ||\n v.originIP\n )\n}\n\n// countActiveColumnFilters reports active column filters. The DSL `q`\n// is excluded - it gets its own per-clause count via parseQClauses.\nexport function countActiveColumnFilters(v: FilterValues): number {\n let n = 0\n if (v.action) n++\n if (v.actor) n++\n if (v.actorType) n++\n if (v.tenantId) n++\n if (v.targetType) n++\n if (v.targetId) n++\n if (v.resultStatus) n++\n if (v.originIP) n++\n return n\n}\n\nexport interface ParsedClause {\n label: string\n raw: string\n}\n\n// parseQClauses splits a top-level `field:value AND field:value` query\n// into individual chips. Lightweight tokenizer - for queries with\n// parens (within-field OR, range syntax) we bail to a single chip\n// with the full expression so the × still works as a clear-all.\nexport function parseQClauses(q: string): ParsedClause[] {\n const trimmed = q.trim()\n if (!trimmed) return []\n if (/[()]/.test(trimmed)) return [{ label: trimmed, raw: trimmed }]\n return trimmed\n .split(/\\s+AND\\s+/i)\n .map((s) => s.trim())\n .filter((s) => s.length > 0)\n .map((s) => ({ label: s, raw: s }))\n}\n\nexport function removeClauseFromQ(q: string, raw: string): string | undefined {\n const remaining = parseQClauses(q).filter((c) => c.raw !== raw)\n if (remaining.length === 0) return undefined\n return remaining.map((c) => c.raw).join(' AND ')\n}\n\n// Time-range resolution (used by AuditTrailElement on every fetch).\n\nexport function resolveTimeBounds(filters: FilterValues): {\n since?: string\n before?: string\n} {\n switch (filters.range) {\n case '24h':\n return { since: relativeIso(24 * 60 * 60 * 1000) }\n case '7d':\n return { since: relativeIso(7 * 24 * 60 * 60 * 1000) }\n case '30d':\n return { since: relativeIso(30 * 24 * 60 * 60 * 1000) }\n case 'custom':\n return {\n since: localToIso(filters.since),\n before: localToIso(filters.before),\n }\n case 'all':\n default:\n return {}\n }\n}\n\nfunction relativeIso(ms: number): string {\n return new Date(Date.now() - ms).toISOString()\n}\n\nfunction localToIso(value: string | undefined): string | undefined {\n if (!value) return undefined\n const d = new Date(value)\n if (Number.isNaN(d.getTime())) return undefined\n return d.toISOString()\n}\n","import { COLUMN_LABELS, formatTimeCell, type Event } from '@everscribe/components-core'\n\nimport { h, type Child } from './dom.js'\n\nexport function renderTable(\n events: Event[],\n columns: string[],\n onRowClick?: (event: Event) => void,\n): HTMLElement {\n const headerCells = columns.map((col) =>\n h(\n 'th',\n { scope: 'col', class: `audit-trail-th audit-trail-th-${col}` },\n COLUMN_LABELS[col] ?? col,\n ),\n )\n const rows = events.map((event) => renderRow(event, columns, onRowClick))\n return h(\n 'div',\n { class: 'audit-trail-table-wrap' },\n h(\n 'table',\n { class: 'audit-trail-table' },\n h('thead', null, h('tr', null, ...headerCells)),\n h('tbody', null, ...rows),\n ),\n )\n}\n\nfunction renderRow(\n event: Event,\n columns: string[],\n onClick?: (event: Event) => void,\n): HTMLElement {\n const interactive = Boolean(onClick)\n const cells = columns.map((col) =>\n h(\n 'td',\n {\n class: `audit-trail-cell audit-trail-cell-${col}`,\n 'data-label': COLUMN_LABELS[col] ?? col,\n },\n renderCell(col, event),\n ),\n )\n const tr = h(\n 'tr',\n {\n class: 'audit-trail-row',\n tabindex: interactive ? '0' : undefined,\n },\n ...cells,\n )\n if (interactive && onClick) {\n tr.addEventListener('click', () => onClick(event))\n tr.addEventListener('keydown', (e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n onClick(event)\n }\n })\n }\n return tr\n}\n\nfunction renderCell(column: string, event: Event): Child {\n switch (column) {\n case 'result':\n return renderResult(event.result)\n case 'origin':\n return renderOrigin(event.origin)\n case 'change':\n case 'metadata':\n return renderPresence(getField(event, column))\n default: {\n const value = getField(event, column)\n if (value == null) return null\n if (column === 'occurred_at' && typeof value === 'string') {\n return h(\n 'time',\n {\n datetime: value,\n title: value,\n // Marker for AuditTrailElement's 30s tick: each render uses\n // Date.now(), and the timer queries by this attribute to\n // refresh the relative half without rebuilding the table.\n 'data-occurred-at': value,\n },\n formatTimeCell(value, Date.now()),\n )\n }\n if (typeof value === 'string') return value\n if (typeof value === 'object') return summarizeObject(value)\n return String(value)\n }\n }\n}\n\nfunction getField(event: Event, key: string): unknown {\n return (event as unknown as Record<string, unknown>)[key]\n}\n\n// renderResult shows the status as a small pill so the table cell\n// reads at a glance (\"ok\" / \"error\") instead of the generic\n// {N fields} fallback. The numeric code is intentionally omitted -\n// it lives in the Raw tab of the inspect modal for callers who need it.\nfunction renderResult(value: unknown): Child {\n if (value == null || typeof value !== 'object') return '-'\n const obj = value as { status?: unknown }\n const status = typeof obj.status === 'string' ? obj.status : ''\n if (!status) return '-'\n return h(\n 'span',\n { class: `audit-trail-status audit-trail-status-${cssToken(status)}` },\n status,\n )\n}\n\n// renderOrigin prefers the network-identity fields a reader actually\n// scans for (IP, hostname). Falls back to the generic object summary\n// only when none of those are present.\nfunction renderOrigin(value: unknown): Child {\n if (value == null || typeof value !== 'object') return '-'\n const obj = value as Record<string, unknown>\n for (const key of ['ip', 'hostname', 'host']) {\n const v = obj[key]\n if (typeof v === 'string' && v.length > 0) return v\n }\n return summarizeObject(obj)\n}\n\n// renderPresence collapses arbitrary-shape JSON columns (change,\n// metadata) to a single \"View\" affordance when content exists, else\n// \"-\". The full payload is still reachable via the row's detail\n// panel; the cell just signals presence.\nfunction renderPresence(value: unknown): Child {\n if (value == null) return '-'\n if (typeof value === 'object') {\n const keys = Object.keys(value as object)\n if (keys.length === 0) return '-'\n return h('span', { class: 'audit-trail-cell-presence' }, 'View')\n }\n if (typeof value === 'string' && value.length > 0) {\n return h('span', { class: 'audit-trail-cell-presence' }, 'View')\n }\n return '-'\n}\n\nfunction summarizeObject(value: object): string {\n const obj = value as Record<string, unknown>\n for (const key of ['name', 'email', 'id', 'type']) {\n const v = obj[key]\n if (typeof v === 'string' && v.length > 0) return v\n }\n const keys = Object.keys(obj)\n if (keys.length === 0) return '-'\n return `{${keys.length} ${keys.length === 1 ? 'field' : 'fields'}}`\n}\n\nfunction cssToken(s: string): string {\n return s.toLowerCase().replace(/[^a-z0-9_-]+/g, '-')\n}\n","import {\n ALL_COLUMNS,\n COLUMN_LABELS,\n EmbedError,\n RELATIVE_TIME_TICK_MS,\n createDistinctValuesStore,\n createEventsStore,\n exportEvents,\n fetchTokenViaOpts,\n formatTimeCell,\n generateNLPFilters,\n parseClaims,\n type DistinctValues,\n type DistinctValuesStore,\n type EmbedClaims,\n type Event,\n type EventsStore,\n type EventsStoreState,\n type ExportFormat,\n} from '@everscribe/components-core'\n\nimport { h } from './dom.js'\nimport { openEventDetail } from './eventDetail.js'\nimport { openExportModal } from './exportModal.js'\nimport {\n countActiveColumnFilters,\n parseQClauses,\n pickInitialTab,\n renderFilterChips,\n renderFiltersPanel,\n resolveTimeBounds,\n type FilterTab,\n type FilterValues,\n type NLPState,\n type NLPErrorReason,\n type TimeRangePreset,\n} from './filters.js'\nimport { renderTable } from './table.js'\n\nconst DEFAULT_API_BASE = 'https://api.everscribe.io/v1/embed'\nconst DEFAULT_PAGE_SIZE = 25\nconst DEFAULT_POLL_INTERVAL_MS = 5000\nconst DEFAULT_VISIBLE_COLUMNS = [\n 'occurred_at',\n 'action',\n 'actor',\n 'target',\n 'tenant_id',\n 'result',\n]\n\nexport type Theme = 'light' | 'dark'\nexport type DefaultTimeRange = '24h' | '7d' | '30d' | 'all'\n\ntype Bootstrap =\n | { phase: 'idle' }\n | { phase: 'loading' }\n | { phase: 'ready'; token: string; claims: EmbedClaims | null }\n | { phase: 'error'; reason: 'config' | 'fetch' }\n\nconst OBSERVED = [\n 'token',\n 'token-endpoint',\n 'api-base',\n 'page-size',\n 'poll-interval',\n 'theme',\n 'default-time-range',\n] as const\n\nexport class AuditTrailElement extends HTMLElement {\n static get observedAttributes(): readonly string[] {\n return OBSERVED\n }\n\n // JS-only properties (no attribute equivalent). Setting these after the\n // element is connected has no automatic side effect; reset by reassigning\n // and calling .refresh() if you need a redo.\n onTokenExpired?: () => Promise<string>\n\n private bootstrap: Bootstrap = { phase: 'idle' }\n private bootstrapAbort: AbortController | null = null\n private eventsStore: EventsStore | null = null\n private distinctStore: DistinctValuesStore | null = null\n private eventsUnsub: (() => void) | null = null\n private distinctUnsub: (() => void) | null = null\n // Latest snapshots cached so render() doesn't have to peek into stores.\n private eventsState: EventsStoreState | null = null\n private distinctValues: DistinctValues = {\n actions: [],\n actorTypes: [],\n targetTypes: [],\n tenants: [],\n resultStatuses: [],\n metadataKeys: [],\n changeFields: [],\n }\n\n // UI state.\n private filters: FilterValues = { range: 'all' }\n private filtersOpen = false\n private activeTab: FilterTab = 'filters'\n private nlpState: NLPState = { phase: 'idle' }\n private nlpAbort: AbortController | null = null\n private visibleSet: Set<string> = new Set(DEFAULT_VISIBLE_COLUMNS)\n\n // Slot tracking for partial re-renders. bodySlot wraps the table /\n // state messages so events-store subscriptions can update only the\n // table region without touching the toolbar (which would clobber\n // open <details> picker state) or filter inputs (focus + drafts).\n private bodySlot: HTMLElement | null = null\n\n // Modal cleanup hooks. Set when a modal is open; null otherwise.\n private detailDispose: (() => void) | null = null\n private exportDispose: (() => void) | null = null\n\n // 30s timer that refreshes the relative half of each row's\n // \"absolute (N ago)\" timestamp without rebuilding the table.\n private relativeTimeTimer: ReturnType<typeof setInterval> | null = null\n\n connectedCallback() {\n this.classList.add('audit-trail-root')\n this.classList.add(`audit-trail-theme-${this.themeAttr()}`)\n this.filters = { range: this.defaultTimeRangeAttr() }\n this.start()\n this.startRelativeTimeTimer()\n }\n\n disconnectedCallback() {\n this.cleanup()\n this.stopRelativeTimeTimer()\n }\n\n attributeChangedCallback(name: string, oldVal: string | null, newVal: string | null) {\n if (oldVal === newVal) return\n if (!this.isConnected) return\n\n if (name === 'theme') {\n const oldClass = `audit-trail-theme-${oldVal === 'dark' ? 'dark' : 'light'}`\n const newClass = `audit-trail-theme-${newVal === 'dark' ? 'dark' : 'light'}`\n this.classList.remove(oldClass)\n this.classList.add(newClass)\n return\n }\n\n if (name === 'token' || name === 'token-endpoint') {\n this.start()\n return\n }\n\n if (name === 'default-time-range') {\n // Only meaningful as an *initial* preference. After mount, the\n // user-facing time-range tabs own this value.\n return\n }\n\n // page-size / poll-interval / api-base: rebuild events store with\n // the new config without re-bootstrapping the token.\n if (this.bootstrap.phase === 'ready') this.restartEventsStore()\n }\n\n // Public method, mirrors the React component's refresh hatch. Triggers\n // a full re-bootstrap (fresh token fetch + fresh stores).\n refresh() {\n this.start()\n }\n\n // ---- attributes ----\n\n private themeAttr(): Theme {\n return this.getAttribute('theme') === 'dark' ? 'dark' : 'light'\n }\n private apiBaseAttr(): string {\n return this.getAttribute('api-base') || DEFAULT_API_BASE\n }\n private pageSizeAttr(): number {\n const n = Number.parseInt(this.getAttribute('page-size') ?? '', 10)\n return Number.isFinite(n) && n > 0 ? n : DEFAULT_PAGE_SIZE\n }\n private pollIntervalAttr(): number {\n const v = this.getAttribute('poll-interval')\n if (v === null) return DEFAULT_POLL_INTERVAL_MS\n const n = Number.parseInt(v, 10)\n return Number.isFinite(n) ? n : DEFAULT_POLL_INTERVAL_MS\n }\n private defaultTimeRangeAttr(): TimeRangePreset {\n const v = this.getAttribute('default-time-range')\n if (v === '24h' || v === '7d' || v === '30d' || v === 'all') return v\n return 'all'\n }\n\n // storageKey returns a localStorage key namespaced by the current\n // token's project (sub) and tenant. Returns null when the element\n // isn't ready or the token has no usable sub - callers treat null\n // as \"skip persistence.\"\n private storageKey(suffix: 'cols' | 'filters'): string | null {\n if (this.bootstrap.phase !== 'ready') return null\n const sub = this.bootstrap.claims?.sub\n if (!sub) return null\n const tenant = this.bootstrap.claims?.tenant_id || '_'\n return `audit-trail:${suffix}:${sub}:${tenant}`\n }\n\n // ---- bootstrap ----\n\n private start() {\n this.disposeModals()\n this.cleanupStores()\n this.bootstrapAbort?.abort()\n this.bootstrapAbort = null\n\n const token = this.getAttribute('token')\n if (token) {\n this.setReady(token)\n return\n }\n if (!this.getAttribute('token-endpoint') && !this.onTokenExpired) {\n this.bootstrap = { phase: 'error', reason: 'config' }\n this.render()\n return\n }\n this.bootstrap = { phase: 'loading' }\n this.render()\n\n const ctrl = new AbortController()\n this.bootstrapAbort = ctrl\n void (async () => {\n const t = await fetchTokenViaOpts({\n tokenEndpoint: this.getAttribute('token-endpoint') ?? undefined,\n onTokenExpired: this.onTokenExpired,\n })\n if (ctrl.signal.aborted) return\n if (!t) {\n this.bootstrap = { phase: 'error', reason: 'fetch' }\n this.render()\n return\n }\n this.setReady(t)\n })()\n }\n\n private setReady(token: string) {\n const claims = parseClaims(token)\n this.bootstrap = { phase: 'ready', token, claims }\n // Initial visibleSet honors the token's column scope when set;\n // otherwise the React-aligned default visible set.\n if (claims?.columns && claims.columns.length > 0) {\n this.visibleSet = new Set(claims.columns)\n } else {\n this.visibleSet = new Set(DEFAULT_VISIBLE_COLUMNS)\n }\n // Layer per-project saved state on top. Columns are stored as the\n // hidden list (not visible) so a future-added column appears by\n // default for returning users. Filters restore the user's last\n // search state across reloads.\n this.restoreHiddenColumns()\n this.restoreFilters()\n // Active tab is claim-driven: Prompt when allow_nlp is true,\n // otherwise Filters. Picked once on bootstrap; users can switch\n // freely after that.\n this.activeTab = pickInitialTab(this.filters, claims)\n this.startEventsStore(token)\n this.startDistinctStore(token)\n this.render()\n }\n\n private startEventsStore(token: string) {\n this.eventsUnsub?.()\n this.eventsStore?.dispose()\n\n const { since, before } = resolveTimeBounds(this.filters)\n const apiBase = this.apiBaseAttr()\n const tokenEndpoint = this.getAttribute('token-endpoint') ?? undefined\n\n const events = createEventsStore({\n apiBase,\n token,\n pageSize: this.pageSizeAttr(),\n pollInterval: this.pollIntervalAttr(),\n tokenEndpoint,\n onTokenExpired: this.onTokenExpired,\n onError: (err) => this.dispatchError(err),\n since,\n before,\n action: this.filters.action,\n actor: this.filters.actor,\n actorType: this.filters.actorType,\n tenantId: this.filters.tenantId,\n targetType: this.filters.targetType,\n targetId: this.filters.targetId,\n resultStatus: this.filters.resultStatus,\n originIP: this.filters.originIP,\n q: this.filters.q,\n })\n this.eventsStore = events\n this.eventsState = events.getSnapshot()\n this.eventsUnsub = events.subscribe(() => {\n this.eventsState = events.getSnapshot()\n this.renderBody()\n })\n }\n\n private startDistinctStore(token: string) {\n this.distinctUnsub?.()\n this.distinctStore?.dispose()\n\n const apiBase = this.apiBaseAttr()\n const tokenEndpoint = this.getAttribute('token-endpoint') ?? undefined\n\n const distinct = createDistinctValuesStore({\n apiBase,\n token,\n tokenEndpoint,\n onTokenExpired: this.onTokenExpired,\n })\n this.distinctStore = distinct\n this.distinctValues = distinct.getSnapshot()\n this.distinctUnsub = distinct.subscribe(() => {\n this.distinctValues = distinct.getSnapshot()\n // Filter panel dropdowns depend on distinct values; re-render\n // the whole element to refresh them. Distinct fetches once per\n // token, so this happens at most once after bootstrap.\n this.render()\n })\n }\n\n private restartEventsStore() {\n if (this.bootstrap.phase !== 'ready') return\n this.startEventsStore(this.bootstrap.token)\n }\n\n private cleanupStores() {\n this.eventsUnsub?.()\n this.distinctUnsub?.()\n this.eventsStore?.dispose()\n this.distinctStore?.dispose()\n this.eventsUnsub = null\n this.distinctUnsub = null\n this.eventsStore = null\n this.distinctStore = null\n this.eventsState = null\n this.distinctValues = {\n actions: [],\n actorTypes: [],\n targetTypes: [],\n tenants: [],\n resultStatuses: [],\n metadataKeys: [],\n changeFields: [],\n }\n }\n\n private cleanup() {\n this.bootstrapAbort?.abort()\n this.bootstrapAbort = null\n this.nlpAbort?.abort()\n this.nlpAbort = null\n this.disposeModals()\n this.cleanupStores()\n }\n\n private startRelativeTimeTimer() {\n if (this.relativeTimeTimer !== null) return\n this.relativeTimeTimer = setInterval(\n () => this.tickRelativeTimes(),\n RELATIVE_TIME_TICK_MS,\n )\n }\n\n private stopRelativeTimeTimer() {\n if (this.relativeTimeTimer === null) return\n clearInterval(this.relativeTimeTimer)\n this.relativeTimeTimer = null\n }\n\n private tickRelativeTimes() {\n const cells = this.querySelectorAll<HTMLTimeElement>('time[data-occurred-at]')\n if (cells.length === 0) return\n const now = Date.now()\n cells.forEach((c) => {\n const iso = c.getAttribute('data-occurred-at')\n if (!iso) return\n c.textContent = formatTimeCell(iso, now)\n })\n }\n\n private disposeModals() {\n this.detailDispose?.()\n this.detailDispose = null\n this.exportDispose?.()\n this.exportDispose = null\n }\n\n private openDetail(event: Event) {\n this.detailDispose?.()\n this.detailDispose = openEventDetail({\n event,\n theme: this.themeAttr(),\n onClose: () => {\n this.detailDispose = null\n },\n })\n }\n\n private openExport() {\n this.exportDispose?.()\n this.exportDispose = openExportModal({\n theme: this.themeAttr(),\n onDownload: (format) => this.runExport(format),\n onClose: () => {\n this.exportDispose = null\n },\n })\n }\n\n private async runExport(format: ExportFormat) {\n if (this.bootstrap.phase !== 'ready') throw new Error('Not authenticated.')\n const apiBase = this.apiBaseAttr()\n const tokenEndpoint = this.getAttribute('token-endpoint') ?? undefined\n const { since, before } = resolveTimeBounds(this.filters)\n const params = {\n format,\n since,\n before,\n action: this.filters.action,\n actor: this.filters.actor,\n actorType: this.filters.actorType,\n tenantId: this.filters.tenantId,\n targetType: this.filters.targetType,\n targetId: this.filters.targetId,\n resultStatus: this.filters.resultStatus,\n originIP: this.filters.originIP,\n q: this.filters.q,\n }\n const run = (token: string) => exportEvents({ apiBase, token, params })\n\n let result\n try {\n result = await run(this.bootstrap.token)\n } catch (err) {\n if (err instanceof EmbedError && err.kind === 'unauthorized') {\n const refreshed = await fetchTokenViaOpts({\n tokenEndpoint,\n onTokenExpired: this.onTokenExpired,\n })\n if (!refreshed) throw new Error('Authentication failed.')\n result = await run(refreshed)\n } else if (err instanceof EmbedError) {\n throw new Error(exportErrorMessage(err))\n } else {\n throw err\n }\n }\n triggerBrowserDownload(result.blob, result.filename)\n }\n\n private dispatchError(err: Error) {\n this.dispatchEvent(\n new CustomEvent('audit-trail-error', {\n detail: { error: err },\n bubbles: true,\n }),\n )\n }\n\n // ---- columns ----\n\n private get availableColumns(): string[] {\n if (this.bootstrap.phase !== 'ready') return ALL_COLUMNS\n const cols = this.bootstrap.claims?.columns\n if (cols && cols.length > 0) return cols\n return ALL_COLUMNS\n }\n\n private get visibleColumns(): string[] {\n return this.availableColumns.filter((c) => this.visibleSet.has(c))\n }\n\n private toggleColumn(col: string) {\n if (this.visibleSet.has(col)) this.visibleSet.delete(col)\n else this.visibleSet.add(col)\n this.persistHiddenColumns()\n this.render()\n }\n\n private restoreHiddenColumns() {\n const key = this.storageKey('cols')\n if (!key) return\n try {\n const raw = globalThis.localStorage?.getItem(key)\n if (!raw) return\n const hidden = JSON.parse(raw)\n if (!Array.isArray(hidden)) return\n for (const c of hidden) {\n if (typeof c === 'string') this.visibleSet.delete(c)\n }\n } catch {\n // Private mode, quota, or malformed JSON - fall through to defaults.\n }\n }\n\n private persistHiddenColumns() {\n const key = this.storageKey('cols')\n if (!key) return\n try {\n const hidden = this.availableColumns.filter((c) => !this.visibleSet.has(c))\n globalThis.localStorage?.setItem(key, JSON.stringify(hidden))\n } catch {\n // Private mode, quota - silently ignore.\n }\n }\n\n private restoreFilters() {\n const key = this.storageKey('filters')\n if (!key) return\n try {\n const raw = globalThis.localStorage?.getItem(key)\n if (!raw) return\n const parsed = JSON.parse(raw)\n if (!parsed || typeof parsed !== 'object') return\n const range = (parsed as FilterValues).range\n if (range !== '24h' && range !== '7d' && range !== '30d' && range !== 'custom' && range !== 'all') return\n this.filters = parsed as FilterValues\n } catch {\n // Malformed JSON / storage error - keep defaults.\n }\n }\n\n private persistFilters() {\n const key = this.storageKey('filters')\n if (!key) return\n try {\n globalThis.localStorage?.setItem(key, JSON.stringify(this.filters))\n } catch {\n // Private mode, quota - silently ignore.\n }\n }\n\n // ---- filters ----\n\n private setFilters(next: FilterValues) {\n this.filters = next\n this.persistFilters()\n this.render()\n this.restartEventsStore()\n }\n\n private setActiveTab(next: FilterTab) {\n if (this.activeTab === next) return\n this.activeTab = next\n // Switching tabs doesn't fire a fetch; only the explicit Add /\n // Search buttons mutate filters.\n this.render()\n }\n\n // submitNLP fires the LLM round-trip via the embed NLP endpoint.\n // Updates nlpState immediately for the spinner, then folds the\n // result into filters on success or surfaces an error on failure.\n private submitNLP(query: string) {\n if (this.bootstrap.phase !== 'ready') return\n const trimmed = query.trim()\n if (!trimmed) return\n const apiBase = this.apiBaseAttr()\n const token = this.bootstrap.token\n\n this.nlpAbort?.abort()\n const ctrl = new AbortController()\n this.nlpAbort = ctrl\n this.nlpState = { phase: 'loading' }\n this.render()\n\n void (async () => {\n try {\n const result = await generateNLPFilters({\n apiBase,\n token,\n query: trimmed,\n signal: ctrl.signal,\n })\n if (ctrl.signal.aborted) return\n this.nlpState = { phase: 'idle' }\n this.filters = {\n ...this.filters,\n q: result.dsl || undefined,\n nlpQ: trimmed,\n nlpExplanation: result.explanation,\n nlpUnsupported: result.unsupported,\n }\n this.persistFilters()\n this.render()\n this.restartEventsStore()\n } catch (err) {\n if (err instanceof DOMException && err.name === 'AbortError') return\n // Try a token refresh on 401 once, then surface the error.\n if (err instanceof EmbedError && err.kind === 'unauthorized') {\n const refreshed = await fetchTokenViaOpts({\n tokenEndpoint: this.getAttribute('token-endpoint') ?? undefined,\n onTokenExpired: this.onTokenExpired,\n })\n if (refreshed && !ctrl.signal.aborted) {\n try {\n const retry = await generateNLPFilters({\n apiBase,\n token: refreshed,\n query: trimmed,\n signal: ctrl.signal,\n })\n this.nlpState = { phase: 'idle' }\n this.filters = {\n ...this.filters,\n q: retry.dsl || undefined,\n nlpQ: trimmed,\n nlpExplanation: retry.explanation,\n nlpUnsupported: retry.unsupported,\n }\n this.persistFilters()\n this.render()\n this.restartEventsStore()\n return\n } catch (retryErr) {\n this.nlpState = {\n phase: 'error',\n reason: classifyNLPError(retryErr),\n }\n this.render()\n return\n }\n }\n }\n this.nlpState = { phase: 'error', reason: classifyNLPError(err) }\n this.render()\n }\n })()\n }\n\n // ---- rendering ----\n\n private render() {\n // Full rebuild. Slot refs are cleared so renderBody is a no-op\n // until the next render assigns them.\n this.bodySlot = null\n this.replaceChildren(...this.renderChildren())\n }\n\n private renderBody() {\n if (!this.bodySlot) return\n this.bodySlot.replaceChildren(...this.renderBodyChildren())\n }\n\n private renderChildren(): Node[] {\n if (this.bootstrap.phase === 'error' && this.bootstrap.reason === 'config') {\n return [\n this.stateElement(\n 'error',\n h(\n 'span',\n null,\n 'Configure ',\n h('code', null, 'token'),\n ', ',\n h('code', null, 'token-endpoint'),\n ', or set the ',\n h('code', null, 'onTokenExpired'),\n ' property.',\n ),\n ),\n ]\n }\n if (this.bootstrap.phase === 'error' && this.bootstrap.reason === 'fetch') {\n const retry = h('button', { type: 'button', class: 'audit-trail-button' }, 'Retry')\n retry.addEventListener('click', () => this.start())\n return [this.stateElement('error', h('span', null, \"Couldn’t fetch token.\"), retry)]\n }\n if (this.bootstrap.phase !== 'ready') {\n return [this.stateElement('loading', 'Loading…')]\n }\n if (this.bootstrap.claims === null) {\n return [this.stateElement('error', 'Invalid token.')]\n }\n\n const out: Node[] = [this.renderToolbar()]\n\n // Active-filter chips sit between the toolbar and the panel -\n // visible whenever there's at least one active filter, even\n // when the panel is collapsed.\n const chips = renderFilterChips({\n value: this.filters,\n onChange: (next) => this.setFilters(next),\n })\n if (chips) out.push(chips)\n\n if (this.filtersOpen) {\n out.push(\n renderFiltersPanel({\n value: this.filters,\n distinct: this.distinctValues,\n claims: this.bootstrap.claims,\n activeTab: this.activeTab,\n nlpState: this.nlpState,\n onTabChange: (next) => this.setActiveTab(next),\n onChange: (next) => this.setFilters(next),\n onNLPSubmit: (q) => this.submitNLP(q),\n onApplied: () => {\n this.filtersOpen = false\n this.render()\n },\n }),\n )\n }\n const body = h('div', { class: 'audit-trail-body' })\n body.replaceChildren(...this.renderBodyChildren())\n this.bodySlot = body\n out.push(body)\n return out\n }\n\n private renderToolbar(): HTMLElement {\n const livePollActive =\n this.pollIntervalAttr() > 0 && !resolveTimeBounds(this.filters).before\n\n const live = livePollActive ? this.renderLiveIndicator() : null\n const spacer = h('span', { class: 'audit-trail-toolbar-spacer' })\n const filtersToggle = this.renderFiltersToggle()\n const exportBtn = h(\n 'button',\n { type: 'button', class: 'audit-trail-button' },\n 'Export',\n )\n exportBtn.addEventListener('click', () => this.openExport())\n const picker = this.renderColumnPicker()\n\n const children: Node[] = []\n if (live) children.push(live)\n children.push(spacer, filtersToggle, exportBtn, picker)\n return h('div', { class: 'audit-trail-toolbar' }, ...children)\n }\n\n private renderLiveIndicator(): HTMLElement {\n return h(\n 'span',\n {\n class: 'audit-trail-live',\n 'aria-label': 'Live updates',\n title: 'Live updates',\n },\n h('span', { class: 'audit-trail-live-dot', 'aria-hidden': 'true' }),\n h('span', null, 'Live'),\n )\n }\n\n private renderFiltersToggle(): HTMLElement {\n const activeCount =\n countActiveColumnFilters(this.filters) +\n (this.filters.q ? parseQClauses(this.filters.q).length : 0)\n const children: Node[] = [document.createTextNode('Search')]\n if (activeCount > 0) {\n children.push(\n h('span', { class: 'audit-trail-filter-toggle-badge' }, String(activeCount)),\n )\n }\n children.push(\n h(\n 'span',\n { class: 'audit-trail-filter-toggle-caret', 'aria-hidden': 'true' },\n this.filtersOpen ? '▴' : '▾',\n ),\n )\n const btn = h(\n 'button',\n {\n type: 'button',\n class: 'audit-trail-filter-toggle',\n 'aria-expanded': this.filtersOpen ? 'true' : 'false',\n },\n ...children,\n )\n btn.addEventListener('click', () => {\n this.filtersOpen = !this.filtersOpen\n this.render()\n })\n return btn\n }\n\n private renderColumnPicker(): HTMLElement {\n const available = this.availableColumns\n const visibleCount = available.reduce(\n (n, c) => (this.visibleSet.has(c) ? n + 1 : n),\n 0,\n )\n\n const items = available.map((col) => {\n const checkbox = h('input', { type: 'checkbox' }) as HTMLInputElement\n checkbox.checked = this.visibleSet.has(col)\n checkbox.addEventListener('change', () => this.toggleColumn(col))\n return h(\n 'label',\n { class: 'audit-trail-picker-item' },\n checkbox,\n h('span', null, COLUMN_LABELS[col] ?? col),\n )\n })\n\n return h(\n 'details',\n { class: 'audit-trail-picker' },\n h(\n 'summary',\n { class: 'audit-trail-picker-summary' },\n `Columns (${visibleCount}/${available.length})`,\n ),\n h('div', { class: 'audit-trail-picker-content' }, ...items),\n )\n }\n\n private renderBodyChildren(): Node[] {\n const events = this.eventsState?.events ?? []\n const status = this.eventsState?.status ?? 'loading'\n const hasMore = (this.eventsState?.nextCursor ?? null) !== null\n const cols = this.visibleColumns\n\n if (status === 'loading' && events.length === 0) {\n return [this.stateElement('loading', 'Loading…')]\n }\n if (status === 'expired') {\n return [this.stateElement('error', 'Session expired.')]\n }\n if (status === 'error') {\n const retry = h('button', { type: 'button', class: 'audit-trail-button' }, 'Retry')\n retry.addEventListener('click', () => this.eventsStore?.refresh())\n return [this.stateElement('error', 'Could not load events.', retry)]\n }\n if (events.length === 0) {\n return [this.stateElement('empty', 'No events match.')]\n }\n if (cols.length === 0) {\n return [this.stateElement('empty', 'No columns selected.')]\n }\n\n const out: Node[] = [renderTable(events, cols, (event) => this.openDetail(event))]\n if (hasMore) {\n const more = h(\n 'button',\n { type: 'button', class: 'audit-trail-button audit-trail-load-more' },\n 'Load more',\n )\n more.addEventListener('click', () => this.eventsStore?.loadMore())\n out.push(more)\n }\n return out\n }\n\n private stateElement(\n kind: 'loading' | 'error' | 'empty',\n ...children: (Node | string)[]\n ): HTMLElement {\n return h('div', { class: `audit-trail-state audit-trail-state-${kind}` }, ...children)\n }\n}\n\n// triggerBrowserDownload synthesizes an anchor click against a blob\n// URL so the browser saves the export with the server-suggested name.\n// The object URL is revoked on the next tick so the click has time to\n// land in slow / older browsers.\nfunction triggerBrowserDownload(blob: Blob, filename: string) {\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = filename\n document.body.appendChild(a)\n a.click()\n document.body.removeChild(a)\n setTimeout(() => URL.revokeObjectURL(url), 0)\n}\n\n// classifyNLPError folds an EmbedError into the small set of reasons\n// the Prompt tab actually distinguishes. 403 + \"nlp_not_allowed\"\n// message is the AllowNLP claim refusal; everything else falls\n// through to generic buckets.\nfunction classifyNLPError(err: unknown): NLPErrorReason {\n if (!(err instanceof EmbedError)) return 'unknown'\n if (err.status === 503) {\n if (err.message?.includes('busy')) return 'provider_busy'\n return 'not_configured'\n }\n if (err.status === 429) return 'rate_limited'\n if (err.status === 403) return 'not_allowed'\n if (err.kind === 'bad_request') return 'bad_request'\n return 'unknown'\n}\n\nfunction exportErrorMessage(err: EmbedError): string {\n switch (err.kind) {\n case 'rate_limited':\n return 'Too many requests. Try again in a moment.'\n case 'bad_request':\n return err.message || 'Bad request.'\n case 'server':\n return 'Server error. Please try again.'\n case 'network':\n return 'Network error. Check your connection.'\n case 'not_found':\n return 'Not found.'\n case 'unauthorized':\n return 'Authentication failed.'\n }\n}\n","import { AuditTrailElement } from './AuditTrailElement.js'\n\nexport { AuditTrailElement } from './AuditTrailElement.js'\nexport type { Theme, DefaultTimeRange } from './AuditTrailElement.js'\n\n// Auto-register on import. Idempotent - re-importing in another bundle\n// won't throw. Skipped on the server where customElements is undefined.\nif (typeof customElements !== 'undefined' && !customElements.get('audit-trail')) {\n customElements.define('audit-trail', AuditTrailElement)\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'audit-trail': AuditTrailElement\n }\n}\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@everscribe/components-element",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Framework-agnostic <audit-trail> custom element for Everscribe.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/everscribe/components.git",
|
|
9
|
+
"directory": "packages/element"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://github.com/everscribe/components/tree/main/packages/element#readme",
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/everscribe/components/issues"
|
|
14
|
+
},
|
|
15
|
+
"keywords": [
|
|
16
|
+
"everscribe",
|
|
17
|
+
"audit",
|
|
18
|
+
"events",
|
|
19
|
+
"web-component",
|
|
20
|
+
"custom-element",
|
|
21
|
+
"embed"
|
|
22
|
+
],
|
|
23
|
+
"type": "module",
|
|
24
|
+
"main": "./dist/index.cjs",
|
|
25
|
+
"module": "./dist/index.js",
|
|
26
|
+
"types": "./dist/index.d.ts",
|
|
27
|
+
"exports": {
|
|
28
|
+
".": {
|
|
29
|
+
"types": "./dist/index.d.ts",
|
|
30
|
+
"import": "./dist/index.js",
|
|
31
|
+
"require": "./dist/index.cjs"
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
"files": [
|
|
35
|
+
"dist",
|
|
36
|
+
"README.md",
|
|
37
|
+
"LICENSE"
|
|
38
|
+
],
|
|
39
|
+
"dependencies": {
|
|
40
|
+
"@everscribe/components-core": "^0.1.0",
|
|
41
|
+
"@everscribe/components-styles": "^0.1.0"
|
|
42
|
+
},
|
|
43
|
+
"devDependencies": {
|
|
44
|
+
"tsup": "^8.3.0",
|
|
45
|
+
"typescript": "^5.6.0"
|
|
46
|
+
},
|
|
47
|
+
"publishConfig": {
|
|
48
|
+
"access": "public"
|
|
49
|
+
},
|
|
50
|
+
"engines": {
|
|
51
|
+
"node": ">=18"
|
|
52
|
+
},
|
|
53
|
+
"scripts": {
|
|
54
|
+
"build": "tsup",
|
|
55
|
+
"dev": "tsup --watch",
|
|
56
|
+
"typecheck": "tsc --noEmit",
|
|
57
|
+
"clean": "rm -rf dist"
|
|
58
|
+
}
|
|
59
|
+
}
|