@happyvertical/smrt-content 0.43.6 → 0.43.7

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.
@@ -84,10 +84,17 @@ import {
84
84
  contentListQueryRowsToContents,
85
85
  contentListQueryTotalValue,
86
86
  CONTENT_LIST_QUERY_MAX_OFFSET,
87
+ contentListQueryRequestKey,
87
88
  contentListViewStateToDataQueryRequest,
88
89
  readContentListQueryNotices,
89
90
  resolveContentListMaxPageSize,
90
91
  } from '../content-list-query.js';
92
+ import {
93
+ contentListJobAffectsQuery,
94
+ type ContentListJob,
95
+ type ContentListJobBinding,
96
+ type ContentListJobSnapshot,
97
+ } from '../content-list-runtime.js';
91
98
  import {
92
99
  type ContentListSavedView,
93
100
  type ContentListSavedViewStore,
@@ -144,6 +151,8 @@ interface Props {
144
151
  urlState?: ContentListUrlStateBinding;
145
152
  /** Opt-in saved views. `createContentListSavedViewStore()` is the default store. */
146
153
  savedViews?: ContentListSavedViewStore;
154
+ /** Shared background-workflow state. The same binding guards submissions. */
155
+ jobs?: ContentListJobBinding;
147
156
  }
148
157
 
149
158
  let {
@@ -163,6 +172,7 @@ let {
163
172
  query = undefined,
164
173
  urlState = undefined,
165
174
  savedViews = undefined,
175
+ jobs = undefined,
166
176
  }: Props = $props();
167
177
 
168
178
  const initialQuery = untrack(() => query);
@@ -329,6 +339,58 @@ let pendingDelete = $state<ContentListRow | null>(null);
329
339
  let savedViewList = $state<ContentListSavedView[]>([]);
330
340
  let selectedSavedViewId = $state('');
331
341
  let savedViewName = $state('');
342
+ let offline = $state(false);
343
+ let jobSnapshot = $state<ContentListJobSnapshot>({
344
+ jobs: [],
345
+ pendingRowIds: new Set(),
346
+ pendingQueryKeys: new Set(),
347
+ });
348
+ const MAX_DEFERRED_JOB_COMPLETIONS = 50;
349
+ let completedJobs = $state<ContentListJob[]>([]);
350
+ let completedJobsOverflowed = $state(false);
351
+ let activeQueryKey = $state<string | undefined>(undefined);
352
+
353
+ // Job state is subscribed once so hosts can use a framework-free controller.
354
+ // Only transitions observed after the initial snapshot are completion events;
355
+ // old successful history must not refresh every newly-mounted list.
356
+ $effect(() => {
357
+ const binding = jobs;
358
+ completedJobs = [];
359
+ completedJobsOverflowed = false;
360
+ if (!binding) {
361
+ jobSnapshot = {
362
+ jobs: [],
363
+ pendingRowIds: new Set(),
364
+ pendingQueryKeys: new Set(),
365
+ };
366
+ return;
367
+ }
368
+ let initialized = false;
369
+ let statuses = new Map<string, ContentListJob['status']>();
370
+ return binding.subscribe((next) => {
371
+ const completions: ContentListJob[] = [];
372
+ const nextStatuses = new Map<string, ContentListJob['status']>();
373
+ for (const job of next.jobs) {
374
+ const previous = statuses.get(job.jobId);
375
+ if (
376
+ initialized &&
377
+ job.status === 'succeeded' &&
378
+ previous !== 'succeeded'
379
+ )
380
+ completions.push(job);
381
+ nextStatuses.set(job.jobId, job.status);
382
+ }
383
+ statuses = nextStatuses;
384
+ initialized = true;
385
+ jobSnapshot = next;
386
+ if (completions.length > 0) {
387
+ const combined = [...completedJobs, ...completions];
388
+ if (combined.length > MAX_DEFERRED_JOB_COMPLETIONS)
389
+ completedJobsOverflowed = true;
390
+ completedJobs = combined.slice(-MAX_DEFERRED_JOB_COMPLETIONS);
391
+ }
392
+ });
393
+ });
332
394
 
333
395
  $effect(() =>
334
396
  controller.subscribe((transition) => {
@@ -427,6 +489,9 @@ const sourceContents = $derived(
427
489
  queryBinding ? contentListQueryRowsToContents(queryBinding.rows) : contents,
428
490
  );
429
491
  const rows = $derived(toContentListRows(sourceContents));
492
+ const visibleRowIds = $derived(
493
+ new Set(rows.filter((row) => row.identified).map((row) => String(row.id))),
494
+ );
430
495
  // In server mode the returned rows ARE the answer: the server already applied
431
496
  // the search, the filters, the sort, and the page. Running the local transform
432
497
  // over them again would re-filter with subtly different semantics (untrimmed
@@ -552,6 +617,26 @@ const isLoading = $derived(loading || (queryBinding?.loading ?? false));
552
617
  const refreshing = $derived(
553
618
  (queryBinding?.refreshing ?? false) || (isLoading && pageRows.length > 0),
554
619
  );
620
+ const stale = $derived((queryBinding?.stale ?? false) || offline);
621
+ const blockingError = $derived(
622
+ error ?? (pageRows.length === 0 ? queryErrorMessage : null),
623
+ );
624
+ const recoverableError = $derived(
625
+ error === null && pageRows.length > 0 ? queryErrorMessage : null,
626
+ );
627
+ const lastUpdated = $derived(queryBinding?.lastUpdated);
628
+
629
+ function refreshQuery(): void {
630
+ if (!queryBinding?.refresh || refreshing || isLoading) return;
631
+ const key = activeQueryKey;
632
+ void queryBinding
633
+ .refresh()
634
+ .then((result) => {
635
+ if (result !== undefined && activeQueryKey === key)
636
+ resultNotices = readContentListQueryNotices(result);
637
+ })
638
+ .catch(() => undefined);
639
+ }
555
640
  /**
556
641
  * A retry re-reads the same query, so its answer replaces the rendered rows —
557
642
  * and therefore has to replace the completeness flags that describe them too.
@@ -641,6 +726,7 @@ $effect(() => {
641
726
  // a failure in its error state, so a rejection here is not also an
642
727
  // unhandled one. The resolved envelope carries the server's completeness
643
728
  // flags, which the binding itself does not expose.
729
+ activeQueryKey = contentListQueryRequestKey(translated.request);
644
730
  void queryBinding
645
731
  .execute(translated.request)
646
732
  .then((result) => {
@@ -674,6 +760,69 @@ $effect(() => {
674
760
  });
675
761
  });
676
762
 
763
+ // Query-scoped live updates are opt-in at the transport. Reconnect refreshes
764
+ // the exact active query before resubscribing; without a live transport, the
765
+ // same browser event falls back to an ordinary exact-query refresh.
766
+ $effect(() => {
767
+ const queryKey = activeQueryKey;
768
+ if (!queryBinding || queryKey === undefined || typeof window === 'undefined')
769
+ return;
770
+ offline = typeof navigator !== 'undefined' && navigator.onLine === false;
771
+ let live:
772
+ | { unsubscribe(): void; reconnect?: () => void }
773
+ | undefined;
774
+ try {
775
+ live = queryBinding.subscribeLive?.();
776
+ } catch {
777
+ live = undefined;
778
+ }
779
+ const handleOffline = () => {
780
+ offline = true;
781
+ };
782
+ const handleOnline = () => {
783
+ const wasOffline = offline;
784
+ offline = false;
785
+ if (!wasOffline) return;
786
+ if (live?.reconnect) live.reconnect();
787
+ else refreshQuery();
788
+ };
789
+ window.addEventListener('offline', handleOffline);
790
+ window.addEventListener('online', handleOnline);
791
+ return () => {
792
+ window.removeEventListener('offline', handleOffline);
793
+ window.removeEventListener('online', handleOnline);
794
+ live?.unsubscribe();
795
+ };
796
+ });
797
+
798
+ // A successful workflow refreshes only the page/query it can affect. Failures
799
+ // stay visible and never produce the refresh that a success would.
800
+ $effect(() => {
801
+ const completions = completedJobs;
802
+ const overflowed = completedJobsOverflowed;
803
+ if (completions.length === 0 && !overflowed) return;
804
+ if (!queryBinding?.refresh) {
805
+ // Local lists and structurally valid read-only bindings cannot consume a
806
+ // completion. Discard it rather than retaining unbounded job history.
807
+ completedJobs = [];
808
+ completedJobsOverflowed = false;
809
+ return;
810
+ }
811
+ // A success can arrive while an older query is still in flight. Keep the
812
+ // completion queued until that request settles so its pre-job answer cannot
813
+ // become the indefinitely visible final state.
814
+ if (refreshing || isLoading) return;
815
+ completedJobs = [];
816
+ completedJobsOverflowed = false;
817
+ if (
818
+ overflowed ||
819
+ completions.some((job) =>
820
+ contentListJobAffectsQuery(job, activeQueryKey, visibleRowIds),
821
+ )
822
+ )
823
+ refreshQuery();
824
+ });
825
+
677
826
  const selectedRowKeys = $derived(
678
827
  new Set(tableState.selectedRowIds.map((rowId) => String(rowId))),
679
828
  );
@@ -681,7 +830,9 @@ const selectedRowKeys = $derived(
681
830
  const identifiedRowKeys = $derived(
682
831
  new Set(selectableContentListRowIds(rows).map((rowId) => String(rowId))),
683
832
  );
684
- const selectablePageRowIds = $derived(selectableContentListRowIds(pageRows));
833
+ const selectablePageRowIds = $derived(
834
+ selectableContentListRowIds(pageRows.filter((row) => !rowPending(row))),
835
+ );
685
836
  const allPageSelected = $derived(
686
837
  selectablePageRowIds.length > 0 &&
687
838
  selectablePageRowIds.every((rowId) => selectedRowKeys.has(String(rowId))),
@@ -849,11 +1000,20 @@ const dropNotices = $derived<ContentListDropNotice[]>([
849
1000
  * budget, and the next page is computed from `page * limit`, so those rows are
850
1001
  * skipped on the following page too.
851
1002
  */
1003
+ const boundResultNotices = $derived(
1004
+ queryBinding?.result === undefined
1005
+ ? undefined
1006
+ : readContentListQueryNotices(queryBinding.result),
1007
+ );
852
1008
  const queryTruncated = $derived(
853
- queryBinding?.truncated ?? resultNotices.truncated,
1009
+ queryBinding?.truncated ??
1010
+ boundResultNotices?.truncated ??
1011
+ resultNotices.truncated,
854
1012
  );
855
1013
  const queryWarnings = $derived<ReadonlyArray<string>>(
856
- queryBinding?.warnings ?? resultNotices.warnings,
1014
+ queryBinding?.warnings ??
1015
+ boundResultNotices?.warnings ??
1016
+ resultNotices.warnings,
857
1017
  );
858
1018
  /** Identity of the current set of refusals, so a dismissal is not permanent. */
859
1019
  const dropNoticeKey = $derived(
@@ -997,8 +1157,35 @@ function isSelected(row: ContentListRow): boolean {
997
1157
  return selectedRowKeys.has(String(row.id));
998
1158
  }
999
1159
 
1160
+ function rowPending(row: ContentListRow): boolean {
1161
+ return (
1162
+ jobSnapshot.pendingRowIds.has(String(row.id)) ||
1163
+ (activeQueryKey !== undefined &&
1164
+ jobSnapshot.pendingQueryKeys.has(activeQueryKey))
1165
+ );
1166
+ }
1167
+
1168
+ function retryJob(jobId: string): void {
1169
+ void jobs?.retry(jobId).catch(() => undefined);
1170
+ }
1171
+
1172
+ function jobStatusLabel(job: ContentListJob): string {
1173
+ if (job.status === 'queued') return t(M['content.content_list.job_queued']);
1174
+ if (job.status === 'running') return t(M['content.content_list.job_running']);
1175
+ if (job.status === 'succeeded')
1176
+ return t(M['content.content_list.job_succeeded']);
1177
+ return t(M['content.content_list.job_failed']);
1178
+ }
1179
+
1180
+ function formattedLastUpdated(value: number): string {
1181
+ return new Intl.DateTimeFormat(undefined, {
1182
+ dateStyle: 'medium',
1183
+ timeStyle: 'short',
1184
+ }).format(new Date(value));
1185
+ }
1186
+
1000
1187
  function toggleRow(row: ContentListRow) {
1001
- if (!row.identified) return;
1188
+ if (!row.identified || rowPending(row)) return;
1002
1189
  controller.dispatch({ type: 'toggleRowSelection', rowId: row.id });
1003
1190
  }
1004
1191
 
@@ -1048,13 +1235,14 @@ function selectRowLabel(row: ContentListRow): string {
1048
1235
  }
1049
1236
 
1050
1237
  function handleDeleteContent(row: ContentListRow) {
1238
+ if (rowPending(row)) return;
1051
1239
  pendingDelete = row;
1052
1240
  }
1053
1241
 
1054
1242
  function confirmDelete() {
1055
1243
  const target = pendingDelete;
1056
1244
  pendingDelete = null;
1057
- if (target) {
1245
+ if (target && !rowPending(target)) {
1058
1246
  onDelete(target.content);
1059
1247
  }
1060
1248
  }
@@ -1123,10 +1311,12 @@ const tableColumns: DataTableColumn<ContentListRow>[] = $derived([
1123
1311
  {#snippet selectCell({ row }: { row: ContentListRow })}
1124
1312
  <Checkbox
1125
1313
  checked={isSelected(row)}
1126
- disabled={!row.identified}
1314
+ disabled={!row.identified || rowPending(row)}
1127
1315
  aria-label={selectRowLabel(row)}
1128
1316
  title={row.identified
1129
- ? undefined
1317
+ ? rowPending(row)
1318
+ ? t(M['content.content_list.row_pending'])
1319
+ : undefined
1130
1320
  : t(M['content.content_list.row_not_selectable'])}
1131
1321
  onchange={() => toggleRow(row)}
1132
1322
  />
@@ -1179,6 +1369,7 @@ const tableColumns: DataTableColumn<ContentListRow>[] = $derived([
1179
1369
  size="sm"
1180
1370
  class="icon-btn"
1181
1371
  type="button"
1372
+ disabled={rowPending(row)}
1182
1373
  onclick={() => onEdit(row.content)}
1183
1374
  title={t(M['content.content_list.edit'])}
1184
1375
  aria-label={t(M['content.content_list.edit'])}
@@ -1192,6 +1383,7 @@ const tableColumns: DataTableColumn<ContentListRow>[] = $derived([
1192
1383
  size="sm"
1193
1384
  class="icon-btn delete-icon"
1194
1385
  type="button"
1386
+ disabled={rowPending(row)}
1195
1387
  onclick={() => handleDeleteContent(row)}
1196
1388
  title={t(M['content.content_list.delete'])}
1197
1389
  aria-label={t(M['content.content_list.delete'])}
@@ -1407,10 +1599,77 @@ const tableColumns: DataTableColumn<ContentListRow>[] = $derived([
1407
1599
  </div>
1408
1600
  {/if}
1409
1601
 
1410
- {#if activeError}
1602
+ {#if serverBacked}
1603
+ <div class="content-freshness" aria-live="polite" aria-atomic="true">
1604
+ <span>
1605
+ {#if offline}
1606
+ {t(M['content.content_list.offline'])}
1607
+ {:else if stale}
1608
+ {t(M['content.content_list.stale'])}
1609
+ {:else if lastUpdated !== undefined}
1610
+ {t(M['content.content_list.last_updated'], {
1611
+ time: formattedLastUpdated(lastUpdated),
1612
+ })}
1613
+ {/if}
1614
+ </span>
1615
+ {#if queryBinding?.refresh}
1616
+ <Button
1617
+ variant="ghost"
1618
+ size="sm"
1619
+ type="button"
1620
+ class="refresh-button"
1621
+ disabled={refreshing || isLoading || offline}
1622
+ onclick={refreshQuery}
1623
+ >
1624
+ {t(M['content.content_list.refresh'])}
1625
+ </Button>
1626
+ {/if}
1627
+ </div>
1628
+ {/if}
1629
+
1630
+ {#if jobSnapshot.jobs.length > 0}
1631
+ <section class="content-jobs" aria-label={t(M['content.content_list.jobs'])}>
1632
+ <ul class="content-jobs__list" aria-live="polite" aria-atomic="false">
1633
+ {#each jobSnapshot.jobs as job (job.jobId)}
1634
+ <li class={`content-job content-job--${job.status}`} data-job-id={job.jobId}>
1635
+ <span class="content-job__identity">
1636
+ {t(M['content.content_list.job_identity'], { id: job.jobId })}
1637
+ </span>
1638
+ <span>{jobStatusLabel(job)}</span>
1639
+ {#if job.total !== undefined && job.total > 0}
1640
+ <progress
1641
+ value={Math.min(job.completed ?? 0, job.total)}
1642
+ max={job.total}
1643
+ aria-label={t(M['content.content_list.job_progress'], {
1644
+ completed: job.completed ?? 0,
1645
+ total: job.total,
1646
+ })}
1647
+ ></progress>
1648
+ {/if}
1649
+ {#if job.message}<span>{job.message}</span>{/if}
1650
+ {#if job.status === 'failed'}
1651
+ {#if job.error}<span role="alert">{job.error}</span>{/if}
1652
+ {#if jobs?.canRetry?.(job.jobId) === true}
1653
+ <Button
1654
+ variant="ghost"
1655
+ size="sm"
1656
+ type="button"
1657
+ onclick={() => retryJob(job.jobId)}
1658
+ >
1659
+ {t(M['content.content_list.retry_job'])}
1660
+ </Button>
1661
+ {/if}
1662
+ {/if}
1663
+ </li>
1664
+ {/each}
1665
+ </ul>
1666
+ </section>
1667
+ {/if}
1668
+
1669
+ {#if blockingError}
1411
1670
  <div class="state-panel state-panel--error" role="alert">
1412
1671
  <p class="state-panel__title">{t(M['content.content_list.error_title'])}</p>
1413
- <p class="state-panel__detail">{activeError}</p>
1672
+ <p class="state-panel__detail">{blockingError}</p>
1414
1673
  {#if retryHandler}
1415
1674
  <Button variant="ghost" type="button" class="retry-button" onclick={() => retryHandler?.()}>
1416
1675
  {t(M['content.content_list.retry'])}
@@ -1418,6 +1677,17 @@ const tableColumns: DataTableColumn<ContentListRow>[] = $derived([
1418
1677
  {/if}
1419
1678
  </div>
1420
1679
  {:else}
1680
+ {#if recoverableError}
1681
+ <div class="state-panel state-panel--error state-panel--inline" role="alert">
1682
+ <p class="state-panel__title">{t(M['content.content_list.refresh_error_title'])}</p>
1683
+ <p class="state-panel__detail">{recoverableError}</p>
1684
+ {#if retryHandler}
1685
+ <Button variant="ghost" type="button" class="retry-button" onclick={() => retryHandler?.()}>
1686
+ {t(M['content.content_list.retry'])}
1687
+ </Button>
1688
+ {/if}
1689
+ </div>
1690
+ {/if}
1421
1691
  {#if pageRows.length > 0 || selectedCount > 0}
1422
1692
  <div class="content-selection">
1423
1693
  {#if viewMode !== 'compact'}
@@ -1484,10 +1754,12 @@ const tableColumns: DataTableColumn<ContentListRow>[] = $derived([
1484
1754
  <div class="content-row__select">
1485
1755
  <Checkbox
1486
1756
  checked={isSelected(row)}
1487
- disabled={!row.identified}
1757
+ disabled={!row.identified || rowPending(row)}
1488
1758
  aria-label={selectRowLabel(row)}
1489
1759
  title={row.identified
1490
- ? undefined
1760
+ ? rowPending(row)
1761
+ ? t(M['content.content_list.row_pending'])
1762
+ : undefined
1491
1763
  : t(M['content.content_list.row_not_selectable'])}
1492
1764
  onchange={() => toggleRow(row)}
1493
1765
  />
@@ -1533,7 +1805,13 @@ const tableColumns: DataTableColumn<ContentListRow>[] = $derived([
1533
1805
  <a href={viewHref(row)} class="quiet-action">{t(M['content.content_list.view_article'])}</a>
1534
1806
  {/if}
1535
1807
  {#if actions.includes('edit')}
1536
- <Button variant="ghost" type="button" class="quiet-action" onclick={() => onEdit(content)}>
1808
+ <Button
1809
+ variant="ghost"
1810
+ type="button"
1811
+ class="quiet-action"
1812
+ disabled={rowPending(row)}
1813
+ onclick={() => onEdit(content)}
1814
+ >
1537
1815
  {t(M['content.content_list.edit'])}
1538
1816
  </Button>
1539
1817
  {/if}
@@ -1541,6 +1819,7 @@ const tableColumns: DataTableColumn<ContentListRow>[] = $derived([
1541
1819
  <Button
1542
1820
  variant="ghost"
1543
1821
  type="button"
1822
+ disabled={rowPending(row)}
1544
1823
  class="quiet-action quiet-action--danger"
1545
1824
  onclick={() => handleDeleteContent(row)}
1546
1825
  >
@@ -1569,10 +1848,12 @@ const tableColumns: DataTableColumn<ContentListRow>[] = $derived([
1569
1848
  <div class="content-header__eyebrow">
1570
1849
  <Checkbox
1571
1850
  checked={isSelected(row)}
1572
- disabled={!row.identified}
1851
+ disabled={!row.identified || rowPending(row)}
1573
1852
  aria-label={selectRowLabel(row)}
1574
1853
  title={row.identified
1575
- ? undefined
1854
+ ? rowPending(row)
1855
+ ? t(M['content.content_list.row_pending'])
1856
+ : undefined
1576
1857
  : t(M['content.content_list.row_not_selectable'])}
1577
1858
  onchange={() => toggleRow(row)}
1578
1859
  />
@@ -1609,12 +1890,24 @@ const tableColumns: DataTableColumn<ContentListRow>[] = $derived([
1609
1890
  <a href={viewHref(row)} class="view-btn">{t(M['content.content_list.view_article_button'])}</a>
1610
1891
  {/if}
1611
1892
  {#if actions.includes('edit')}
1612
- <Button variant="ghost" type="button" class="content-action-btn" onclick={() => onEdit(content)}>
1893
+ <Button
1894
+ variant="ghost"
1895
+ type="button"
1896
+ class="content-action-btn"
1897
+ disabled={rowPending(row)}
1898
+ onclick={() => onEdit(content)}
1899
+ >
1613
1900
  {t(M['content.content_list.edit'])}
1614
1901
  </Button>
1615
1902
  {/if}
1616
1903
  {#if actions.includes('delete')}
1617
- <Button variant="ghost" type="button" class="content-action-btn delete-btn" onclick={() => handleDeleteContent(row)}>
1904
+ <Button
1905
+ variant="ghost"
1906
+ type="button"
1907
+ class="content-action-btn delete-btn"
1908
+ disabled={rowPending(row)}
1909
+ onclick={() => handleDeleteContent(row)}
1910
+ >
1618
1911
  {t(M['content.content_list.delete'])}
1619
1912
  </Button>
1620
1913
  {/if}
@@ -2076,6 +2369,58 @@ const tableColumns: DataTableColumn<ContentListRow>[] = $derived([
2076
2369
  font-size: var(--smrt-typography-body-medium-size, 0.875rem);
2077
2370
  }
2078
2371
 
2372
+ .content-freshness {
2373
+ display: flex;
2374
+ align-items: center;
2375
+ justify-content: space-between;
2376
+ gap: 0.75rem;
2377
+ min-height: 2rem;
2378
+ margin-bottom: 0.75rem;
2379
+ color: var(--smrt-color-on-surface-variant);
2380
+ font-size: var(--smrt-typography-body-medium-size, 0.875rem);
2381
+ }
2382
+
2383
+ .content-freshness :global(.refresh-button) {
2384
+ transition: background 0.2s, color 0.2s;
2385
+ }
2386
+
2387
+ .content-jobs {
2388
+ margin-bottom: 1rem;
2389
+ }
2390
+
2391
+ .content-jobs__list {
2392
+ display: grid;
2393
+ gap: 0.5rem;
2394
+ margin: 0;
2395
+ padding: 0;
2396
+ list-style: none;
2397
+ }
2398
+
2399
+ .content-job {
2400
+ display: flex;
2401
+ align-items: center;
2402
+ gap: 0.75rem;
2403
+ padding: 0.65rem 0.75rem;
2404
+ border: 1px solid var(--smrt-color-outline-variant);
2405
+ border-radius: 0.5rem;
2406
+ background: var(--smrt-color-surface-container-low);
2407
+ color: var(--smrt-color-on-surface-variant);
2408
+ font-size: var(--smrt-typography-body-medium-size, 0.875rem);
2409
+ }
2410
+
2411
+ .content-job--failed {
2412
+ border-color: var(--smrt-color-error);
2413
+ }
2414
+
2415
+ .content-job__identity {
2416
+ color: var(--smrt-color-on-surface);
2417
+ font-weight: var(--smrt-typography-weight-semibold, 600);
2418
+ }
2419
+
2420
+ .content-job progress {
2421
+ min-width: 8rem;
2422
+ }
2423
+
2079
2424
  .content-pagination {
2080
2425
  display: flex;
2081
2426
  justify-content: center;
@@ -2181,6 +2526,12 @@ const tableColumns: DataTableColumn<ContentListRow>[] = $derived([
2181
2526
  color: var(--smrt-color-on-surface);
2182
2527
  }
2183
2528
 
2529
+ .state-panel--inline {
2530
+ margin-bottom: 1rem;
2531
+ padding: 1rem;
2532
+ text-align: left;
2533
+ }
2534
+
2184
2535
  .state-panel__title {
2185
2536
  margin: 0 0 0.5rem;
2186
2537
  font-weight: var(--smrt-typography-weight-semibold, 600);
@@ -2237,4 +2588,11 @@ const tableColumns: DataTableColumn<ContentListRow>[] = $derived([
2237
2588
  grid-auto-flow: row;
2238
2589
  }
2239
2590
  }
2591
+
2592
+ @media (prefers-reduced-motion: reduce) {
2593
+ .content-freshness :global(.refresh-button),
2594
+ .actions-cell :global(.icon-btn) {
2595
+ transition: none;
2596
+ }
2597
+ }
2240
2598
  </style>
@@ -27,6 +27,7 @@ import type { Snippet } from 'svelte';
27
27
  import type { ContentData } from '../../mock-smrt-client.js';
28
28
  import { type ContentListDataSurface, type ContentListViewMode } from '../content-list-controller.js';
29
29
  import { type ContentListQuerySource } from '../content-list-query.js';
30
+ import { type ContentListJobBinding } from '../content-list-runtime.js';
30
31
  import { type ContentListSavedViewStore } from '../content-list-saved-views.js';
31
32
  interface Props {
32
33
  apiBaseUrl?: string;
@@ -62,6 +63,8 @@ interface Props {
62
63
  urlState?: ContentListUrlStateBinding;
63
64
  /** Opt-in saved views. `createContentListSavedViewStore()` is the default store. */
64
65
  savedViews?: ContentListSavedViewStore;
66
+ /** Shared background-workflow state. The same binding guards submissions. */
67
+ jobs?: ContentListJobBinding;
65
68
  }
66
69
  declare const ContentList: import("svelte").Component<Props, {}, "">;
67
70
  type ContentList = ReturnType<typeof ContentList>;
@@ -1 +1 @@
1
- {"version":3,"file":"ContentList.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/components/ContentList.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,IAAI,6BAA6B,EAAE,MAAM,6BAA6B,CAAC;AACvG,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAE/E;;;;;;;GAOG;AACH,MAAM,WAAW,0BAA0B;IACzC;;;OAGG;IACH,MAAM,CAAC,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,CAAC;IACzC;;;;OAIG;IACH,QAAQ,CAAC,EAAE,CACT,MAAM,EAAE,eAAe,EACvB,KAAK,EAAE,6BAA6B,KACjC,IAAI,CAAC;IACV,uEAAuE;IACvE,OAAO,CAAC,EAAE,0BAA0B,CAAC;CACtC;AAYD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EASL,KAAK,sBAAsB,EAE3B,KAAK,mBAAmB,EAiBzB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAML,KAAK,sBAAsB,EAS5B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAEL,KAAK,yBAAyB,EAG/B,MAAM,gCAAgC,CAAC;AAgBxC,UAAU,KAAK;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,mBAAmB,CAAC;IACtC,MAAM,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,CAAC;IACvC,QAAQ,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,CAAC;IACzC,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,MAAM,GAAG,IAAI,CAAC;IACtD,mEAAmE;IACnE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kDAAkD;IAClD,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,4EAA4E;IAC5E,WAAW,CAAC,EAAE,sBAAsB,CAAC;IACrC;;;;;OAKG;IACH,KAAK,CAAC,EAAE,sBAAsB,CAAC;IAC/B,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,0BAA0B,CAAC;IACtC,oFAAoF;IACpF,UAAU,CAAC,EAAE,yBAAyB,CAAC;CACxC;AAg2CD,QAAA,MAAM,WAAW,2CAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"ContentList.svelte.d.ts","sourceRoot":"","sources":["../../../src/svelte/components/ContentList.svelte.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,IAAI,6BAA6B,EAAE,MAAM,6BAA6B,CAAC;AACvG,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAE/E;;;;;;;GAOG;AACH,MAAM,WAAW,0BAA0B;IACzC;;;OAGG;IACH,MAAM,CAAC,EAAE,eAAe,GAAG,MAAM,GAAG,IAAI,CAAC;IACzC;;;;OAIG;IACH,QAAQ,CAAC,EAAE,CACT,MAAM,EAAE,eAAe,EACvB,KAAK,EAAE,6BAA6B,KACjC,IAAI,CAAC;IACV,uEAAuE;IACvE,OAAO,CAAC,EAAE,0BAA0B,CAAC;CACtC;AAYD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EASL,KAAK,sBAAsB,EAE3B,KAAK,mBAAmB,EAiBzB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAML,KAAK,sBAAsB,EAU5B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAGL,KAAK,qBAAqB,EAE3B,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAEL,KAAK,yBAAyB,EAG/B,MAAM,gCAAgC,CAAC;AAgBxC,UAAU,KAAK;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,mBAAmB,CAAC;IACtC,MAAM,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,CAAC;IACvC,QAAQ,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,IAAI,CAAC;IACzC,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,MAAM,GAAG,IAAI,CAAC;IACtD,mEAAmE;IACnE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kDAAkD;IAClD,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,+CAA+C;IAC/C,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,4EAA4E;IAC5E,WAAW,CAAC,EAAE,sBAAsB,CAAC;IACrC;;;;;OAKG;IACH,KAAK,CAAC,EAAE,sBAAsB,CAAC;IAC/B,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,0BAA0B,CAAC;IACtC,oFAAoF;IACpF,UAAU,CAAC,EAAE,yBAAyB,CAAC;IACvC,6EAA6E;IAC7E,IAAI,CAAC,EAAE,qBAAqB,CAAC;CAC9B;AAwlDD,QAAA,MAAM,WAAW,2CAAwC,CAAC;AAC1D,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAClD,eAAe,WAAW,CAAC"}
@@ -450,6 +450,10 @@ export interface ContentListQueryBinding {
450
450
  readonly stale: boolean;
451
451
  /** The last failure, or a falsy value when the query is healthy. */
452
452
  readonly error: unknown;
453
+ /** Epoch milliseconds of the last successful answer. */
454
+ readonly lastUpdated?: number;
455
+ /** Latest applied envelope, including query-scoped live replacements. */
456
+ readonly result?: unknown;
453
457
  /**
454
458
  * True when the server had to shorten the answer to fit its byte budget.
455
459
  * Optional because `RemoteQueryBinding` does not surface it; when a binding
@@ -461,7 +465,18 @@ export interface ContentListQueryBinding {
461
465
  execute(request: ContentListDataQueryRequest, options?: {
462
466
  signal?: AbortSignal;
463
467
  }): Promise<unknown>;
468
+ /** Revalidate the active query while retaining its usable rows. */
469
+ refresh?(options?: {
470
+ signal?: AbortSignal;
471
+ }): Promise<unknown>;
464
472
  retry(): Promise<unknown>;
473
+ /** Subscribe to changes for the active query rather than the whole table. */
474
+ subscribeLive?(): {
475
+ unsubscribe(): void;
476
+ reconnect(): void;
477
+ } | {
478
+ unsubscribe(): void;
479
+ } | undefined;
465
480
  }
466
481
  /**
467
482
  * What the server said about the completeness of an answer.
@@ -1 +1 @@
1
- {"version":3,"file":"content-list-query.d.ts","sourceRoot":"","sources":["../../src/svelte/content-list-query.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"content-list-query.d.ts","sourceRoot":"","sources":["../../src/svelte/content-list-query.ts"],"names":[],"mappings":"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"}