@nivaro/react 0.2.7 → 0.2.8

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/dist/index.d.ts CHANGED
@@ -501,7 +501,7 @@ export declare function BulkActionButtons({ targets, enabledKeys, tone, disabled
501
501
  onDone?: (result: BulkRunResult & {
502
502
  action: AvailableBulkAction;
503
503
  }) => void;
504
- }): JSX.Element | null;
504
+ }): JSX.Element;
505
505
 
506
506
  declare interface BulkRunResult {
507
507
  succeeded: number;
@@ -516,6 +516,8 @@ declare interface BulkRunResult {
516
516
  declare interface BulkTarget {
517
517
  collection: string;
518
518
  id: string | number;
519
+ /** Optional display label — names the row in per-row result lists. */
520
+ label?: string | null;
519
521
  }
520
522
 
521
523
  /**
@@ -532,6 +534,15 @@ export declare function CacheStamp({ envelope, onRefresh, refreshing, className
532
534
  className?: string;
533
535
  }): JSX.Element | null;
534
536
 
537
+ export declare function CallerChangesSection({ caller, hours }: {
538
+ /** `k<api key id>` or `u<user id>`. */
539
+ caller: {
540
+ key: string;
541
+ label: string;
542
+ };
543
+ hours: number;
544
+ }): JSX.Element;
545
+
535
546
  export declare function canOpenCatalogItem(collection: string | null | undefined): boolean;
536
547
 
537
548
  export declare function canOpenChatRoom(): boolean;
@@ -540,6 +551,8 @@ export declare function canOpenDm(): boolean;
540
551
 
541
552
  export declare function canPreviewFile(type: string | null | undefined): boolean;
542
553
 
554
+ export declare function canViewAs(): boolean;
555
+
543
556
  /**
544
557
  * Grab the replay link for an error being reported right now. Resolves null
545
558
  * when no recorder is active (both settings off, recording failed, or the
@@ -1050,7 +1063,7 @@ export declare interface CollectionBrowserColumn {
1050
1063
  filterable?: boolean;
1051
1064
  }
1052
1065
 
1053
- export declare function CollectionBrowserView({ collection, quickFilters, initialColumns, initialSort, pageSize, initialSearch, initialFilters, initialConditions, onOpenItem, showCreate, className }: CollectionBrowserViewProps): React_2.JSX.Element;
1066
+ export declare function CollectionBrowserView({ collection, quickFilters, initialColumns, initialSort, pageSize, initialSearch, initialFilters, initialConditions, onOpenItem, initialAiPrompt, extraViews, showCreate, className }: CollectionBrowserViewProps): React_2.JSX.Element;
1054
1067
 
1055
1068
  export declare interface CollectionBrowserViewProps {
1056
1069
  collection: string;
@@ -1078,6 +1091,17 @@ export declare interface CollectionBrowserViewProps {
1078
1091
  }>;
1079
1092
  /** Override row-open behavior; defaults to NavigationContext itemUrl. */
1080
1093
  onOpenItem?: (id: string | number) => void;
1094
+ /** Ask the table this question once on open (e.g. a command-palette
1095
+ * hand-off, `?ai=` on the host route). */
1096
+ initialAiPrompt?: string;
1097
+ /** Host-supplied display modes beside the table (e.g. a spreadsheet or
1098
+ * calendar the host app owns). Each renders instead of the table. */
1099
+ extraViews?: Array<{
1100
+ key: string;
1101
+ label: string;
1102
+ icon?: React_2.ReactNode;
1103
+ render: () => React_2.ReactNode;
1104
+ }>;
1081
1105
  showCreate?: boolean;
1082
1106
  className?: string;
1083
1107
  }
@@ -2081,6 +2105,16 @@ export declare function fiscalQuarterOf(d: Date, startMonth?: number): number;
2081
2105
 
2082
2106
  export declare function fiscalYearOf(d: Date, startMonth?: number): number;
2083
2107
 
2108
+ /** Bring a field or a child row of the open record into view (ItemEditForm
2109
+ * listens for 'nvr:record-focus'). */
2110
+ export declare function focusRecordTarget(target: {
2111
+ collection: string;
2112
+ item: string;
2113
+ field?: string;
2114
+ childCollection?: string;
2115
+ rowId?: string;
2116
+ }): void;
2117
+
2084
2118
  /** The window event a host's socket layer dispatches on `client:force-refresh`. */
2085
2119
  export declare const FORCE_RELOAD_EVENT = "nvr:force-refresh";
2086
2120
 
@@ -2466,7 +2500,7 @@ export declare interface ImportDefinition {
2466
2500
  description: string | null;
2467
2501
  staging_table: string | null;
2468
2502
  procedure: string | null;
2469
- loader: 'bulk' | 'insert' | null;
2503
+ loader: 'bulk' | 'bulk_only' | 'insert' | null;
2470
2504
  file_types: string | null;
2471
2505
  is_active: boolean;
2472
2506
  sort: number;
@@ -2484,6 +2518,13 @@ export declare interface ImportDefinition {
2484
2518
  /** JSON array of flow ids run in order after a successful run (migration 294). */
2485
2519
  post_run_flows?: string | null;
2486
2520
  receipt?: string | null;
2521
+ /** #802 — runs sharing a group never overlap; null = the staging table. */
2522
+ lock_group?: string | null;
2523
+ /** #719 — JSON string[] of collections the procedure writes (rollups recomputed). */
2524
+ recalc_rollups?: string | null;
2525
+ /** #846 — days after the last completed run the staging table is emptied; opt-in, null/0 = keep. */
2526
+ staging_purge_days?: number | null;
2527
+ staging_purged_at?: string | null;
2487
2528
  }
2488
2529
 
2489
2530
  declare interface ImportDryRun {
@@ -2586,6 +2627,8 @@ export declare interface ImportJob {
2586
2627
  started_at: string | null;
2587
2628
  completed_at: string | null;
2588
2629
  rolled_back_at?: string | null;
2630
+ /** #748 — rows were written through the items service. */
2631
+ through_items?: boolean;
2589
2632
  }
2590
2633
 
2591
2634
  export declare type ImportJobStatus = 'pending' | 'processing' | 'complete' | 'failed';
@@ -2653,7 +2696,7 @@ export declare interface ImportRun {
2653
2696
  procedure: string | null;
2654
2697
  /** null / 'proc' = stored procedure, 'service', or a registered processor key. */
2655
2698
  processor?: string | null;
2656
- loader: 'bulk' | 'insert' | null;
2699
+ loader: 'bulk' | 'bulk_only' | 'insert' | null;
2657
2700
  definition_active: boolean | null;
2658
2701
  file_name: string | null;
2659
2702
  file_size: string | number | null;
@@ -2768,6 +2811,20 @@ export declare function InboundCallersView({ hours: initialHours }: {
2768
2811
  hours?: number;
2769
2812
  }): JSX.Element;
2770
2813
 
2814
+ /**
2815
+ * A trigger (any inline element) that opens the request behind an inbound
2816
+ * write. The event-path sheet opens AFTER the popover closes, so a sheet
2817
+ * never mounts inside a popover.
2818
+ */
2819
+ export declare function InboundRequestPopover({ activityId, callerName, collection, itemId, children, align }: {
2820
+ activityId: number;
2821
+ callerName: string;
2822
+ collection: string;
2823
+ itemId: string;
2824
+ children: ReactNode;
2825
+ align?: 'start' | 'center' | 'end';
2826
+ }): JSX.Element;
2827
+
2771
2828
  /**
2772
2829
  * Inbound: health first — the host's own live queue (an ingest backlog, say), then whether
2773
2830
  * scheduled imports are arriving on time — and investigation last, since who
@@ -2995,6 +3052,16 @@ export declare interface IntegrationPartnerCard {
2995
3052
  missing: number;
2996
3053
  overdue: number;
2997
3054
  };
3055
+ /** #612 — health-probe uptime over 24h; null when the API is not probed. */
3056
+ uptime24?: {
3057
+ pct: number | null;
3058
+ probes: number;
3059
+ buckets: Array<{
3060
+ at: string;
3061
+ ok: number;
3062
+ failed: number;
3063
+ }>;
3064
+ } | null;
2998
3065
  }
2999
3066
 
3000
3067
  export declare interface IntegrationPartnerDetail {
@@ -3047,6 +3114,29 @@ export declare type IntegrationPathDetail = {
3047
3114
  from?: string | null;
3048
3115
  to?: string | null;
3049
3116
  comment?: string | null;
3117
+ } | {
3118
+ type: 'notify';
3119
+ recipient: string;
3120
+ /** Admins only; null for everyone else. */
3121
+ subject: string | null;
3122
+ category?: string | null;
3123
+ lane?: string | null;
3124
+ channels: Array<{
3125
+ channel: string;
3126
+ status: string;
3127
+ reason?: string | null;
3128
+ }>;
3129
+ } | {
3130
+ type: 'mail';
3131
+ status: string;
3132
+ /** Admins only; null for everyone else. */
3133
+ subject: string | null;
3134
+ template?: string | null;
3135
+ /** Addresses — admins only; null for everyone else. */
3136
+ to?: string | null;
3137
+ recipients: number;
3138
+ mail_log_id: number;
3139
+ error?: string | null;
3050
3140
  };
3051
3141
 
3052
3142
  /** One step of an event's path, with the steps it set off under it. */
@@ -3078,11 +3168,11 @@ export declare interface IntegrationPathNode {
3078
3168
  members?: IntegrationPathNode[];
3079
3169
  }
3080
3170
 
3081
- /** The filter-pill set the collection browser offers (its own conditions[]
3082
- * round trip to `/items/:collection` — the queue has no equivalent server
3083
- * path, so it gets the column but not the filter). Values are the same
3084
- * bucket names `applyIntegrationsFilter` (api/src/services/items.ts) reads,
3085
- * so a picked value needs no translation before it rides a condition. */
3171
+ /** The filter set the collection browser (a `$integrations` condition to
3172
+ * `/items/:collection`) and the queue (`filters.integrations`, #630 —
3173
+ * services/queue-integrations.ts) both offer. Values are the bucket names
3174
+ * `applyIntegrationsFilter` (api/src/services/items.ts) reads, so a picked
3175
+ * value needs no translation on either surface. */
3086
3176
  export declare const INTEGRATIONS_FILTER_OPTIONS: {
3087
3177
  value: string;
3088
3178
  label: string;
@@ -3180,26 +3270,6 @@ export declare interface IntegrationSignalView {
3180
3270
  shown: number;
3181
3271
  }
3182
3272
 
3183
- export declare function IntegrationStatusBanner({ collection, itemId }: IntegrationStatusBannerProps): JSX.Element | null;
3184
-
3185
- /**
3186
- * One line per partner on the record: were they told, when, and if not, why
3187
- * not. Sits above `ErpFailureBanner`, which keeps the payload/response view
3188
- * and the retry mutation — this answers a different question ("was the
3189
- * partner told, and when") and does not replace it.
3190
- *
3191
- * Renders nothing when the record has no obligations, so a collection with
3192
- * no integrations pays one cached request and shows no chrome.
3193
- *
3194
- * `roleForTone` is imported from `IntegrationObligationsView` (the board)
3195
- * rather than duplicated here, so the board and this banner can never
3196
- * disagree about what "overdue" looks like.
3197
- */
3198
- export declare interface IntegrationStatusBannerProps {
3199
- collection: string;
3200
- itemId: string | number;
3201
- }
3202
-
3203
3273
  /** Whether this browser pinned the chat panel open — hosts read it for their
3204
3274
  * initial open state, so a pinned panel is still there after a reload. */
3205
3275
  export declare function isChatPanelPinned(): boolean;
@@ -4259,6 +4329,16 @@ export declare function OpsTasksView({ onNotice }: {
4259
4329
  onNotice?: (message: string) => void;
4260
4330
  }): JSX.Element;
4261
4331
 
4332
+ /** #615 — the Integrations dialog's "What goes out next" block. */
4333
+ export declare function OutboundPreviewSection({ collection, itemId, onShowRequest, onJump }: {
4334
+ collection: string;
4335
+ itemId: string;
4336
+ /** Open the request log row a comparison was made against. */
4337
+ onShowRequest?: (submissionId: number) => void;
4338
+ /** A readiness issue jumps to a line — the hosting dialog closes first. */
4339
+ onJump?: () => void;
4340
+ }): JSX.Element | null;
4341
+
4262
4342
  /**
4263
4343
  * Lets a host put transient overlay state — a drill-down sheet and how deep it
4264
4344
  * is — into browser history, so Back closes the sheet instead of abandoning the
@@ -4408,6 +4488,11 @@ declare interface PartnerContract {
4408
4488
  detail: string | null;
4409
4489
  }
4410
4490
 
4491
+ export declare function PartnerDependenciesPanel({ callerKey, label }: {
4492
+ callerKey: string;
4493
+ label: string;
4494
+ }): JSX.Element;
4495
+
4411
4496
  export declare function PartnerDetail({ apiId, onClose, initialTab }: PartnerDetailProps): JSX.Element;
4412
4497
 
4413
4498
  export declare interface PartnerDetailProps {
@@ -4424,7 +4509,7 @@ export declare interface PartnersViewProps {
4424
4509
  onOpenChange?: (id: number | null) => void;
4425
4510
  }
4426
4511
 
4427
- declare type PathStepKind = 'request' | 'cron' | 'import' | 'feed' | 'write' | 'transition' | 'flow' | 'push' | 'attempt' | 'partner_call' | 'group';
4512
+ declare type PathStepKind = 'request' | 'cron' | 'import' | 'feed' | 'write' | 'transition' | 'flow' | 'push' | 'attempt' | 'partner_call' | 'notify' | 'mail' | 'group';
4428
4513
 
4429
4514
  declare interface PendingTask {
4430
4515
  title: string;
@@ -4438,6 +4523,38 @@ declare interface PendingTask {
4438
4523
  priority?: string;
4439
4524
  }
4440
4525
 
4526
+ /**
4527
+ * The same, minus machine identities (bots, integrations, service accounts,
4528
+ * placeholders — `account_kind` set). A person picking a contact or an
4529
+ * assignee should only ever be offered people; admins keep the machine
4530
+ * accounts because they occasionally configure one on purpose.
4531
+ */
4532
+ export declare const PEOPLE_USER_OPTION_FILTER: {
4533
+ _and: ({
4534
+ is_redacted: {
4535
+ _eq: boolean;
4536
+ };
4537
+ _or?: undefined;
4538
+ } | {
4539
+ _or: ({
4540
+ status: {
4541
+ _neq: string;
4542
+ _null?: undefined;
4543
+ };
4544
+ } | {
4545
+ status: {
4546
+ _null: boolean;
4547
+ _neq?: undefined;
4548
+ };
4549
+ })[];
4550
+ is_redacted?: undefined;
4551
+ } | {
4552
+ account_kind: {
4553
+ _null: boolean;
4554
+ };
4555
+ })[];
4556
+ };
4557
+
4441
4558
  /**
4442
4559
  * The identity band at the top of someone's page: who they are, whether
4443
4560
  * they are reachable right now, and the three ways to reach them. Admin-only
@@ -4531,6 +4648,12 @@ export declare interface PersonProfileData {
4531
4648
  values: string[];
4532
4649
  }>;
4533
4650
  open_tasks: number;
4651
+ /** When they are usually around (UTC hours, 10th–90th percentile of their actions). */
4652
+ typical_hours_utc?: {
4653
+ start: number;
4654
+ end: number;
4655
+ samples: number;
4656
+ } | null;
4534
4657
  admin: {
4535
4658
  account_kind: string | null;
4536
4659
  city: string | null;
@@ -4668,6 +4791,33 @@ export declare function PipelineTransitionButtons({ collection, item, onBeforeTr
4668
4791
  wrap?: boolean;
4669
4792
  }): JSX.Element | null;
4670
4793
 
4794
+ export declare interface PlanGridHost {
4795
+ renderRowHistory?: (args: PlanGridRowHistoryArgs) => ReactNode | null;
4796
+ }
4797
+
4798
+ export declare const PlanGridHostContext: Context<PlanGridHost | null>;
4799
+
4800
+ /**
4801
+ * What a host may put in place of a plan grid's generic parts (#842). Core
4802
+ * stays domain-free: a host that has a richer history for a collection (a
4803
+ * forecast history with restores and accuracy) renders it here; returning
4804
+ * null keeps the generic row-history sheet.
4805
+ */
4806
+ export declare interface PlanGridRowHistoryArgs {
4807
+ /** The plan rows' collection ("forecasts"). */
4808
+ collection: string;
4809
+ /** The record the grid belongs to. */
4810
+ parentId: string;
4811
+ /** The saved row, when there is one. */
4812
+ rowId: string | null;
4813
+ /** The row's key value ("2026"). */
4814
+ key: string;
4815
+ /** The row's category id when the key is split by category, else null. */
4816
+ category: string | null;
4817
+ categoryLabel: (id: string | number) => string;
4818
+ onClose: () => void;
4819
+ }
4820
+
4671
4821
  /** Play the configured notification sound. No-op for 'off'/unknown/unavailable audio. */
4672
4822
  export declare function playNotificationSound(kind: NotificationSound | string | null | undefined): void;
4673
4823
 
@@ -4761,6 +4911,24 @@ declare type ProposalPollAnswer = {
4761
4911
  json: any;
4762
4912
  };
4763
4913
 
4914
+ /**
4915
+ * "Ready" / "2 lines missing Sales order" beside a button that sends
4916
+ * something to a partner. Give it a transition id (the pipeline pre-flight)
4917
+ * or an item action id (the extension's own pre-flight).
4918
+ */
4919
+ export declare function PushReadinessChip({ collection, itemId, transitionId, itemActionId, label, compact, onJump }: {
4920
+ collection: string;
4921
+ itemId: string;
4922
+ transitionId?: string;
4923
+ itemActionId?: string;
4924
+ /** What the button does — "Submit to Warehouse". */
4925
+ label: string;
4926
+ /** Header use: a dot + a short word; the popover says the rest. */
4927
+ compact?: boolean;
4928
+ /** Called before a jump — a hosting dialog closes so the line shows. */
4929
+ onJump?: () => void;
4930
+ }): JSX.Element | null;
4931
+
4764
4932
  export declare function QualityRulesView({ className }: {
4765
4933
  className?: string;
4766
4934
  }): JSX.Element;
@@ -5326,6 +5494,48 @@ export declare function RecordDrilldownSheet({ collection, itemId, layoutId, roo
5326
5494
  onClose: () => void;
5327
5495
  }): JSX.Element;
5328
5496
 
5497
+ export declare function RecordGraphExplorer({ collection, itemId, className }: {
5498
+ collection: string;
5499
+ itemId: string;
5500
+ className?: string;
5501
+ }): JSX.Element;
5502
+
5503
+ export declare interface RecordGraphGroup {
5504
+ key: string;
5505
+ direction: 'out' | 'in' | 'm2m';
5506
+ field: string;
5507
+ label: string;
5508
+ collection: string;
5509
+ collection_label: string;
5510
+ total: number;
5511
+ items: RecordGraphNode[];
5512
+ }
5513
+
5514
+ /**
5515
+ * Relationship explorer (#998). A record's neighbourhood drawn as a tree that
5516
+ * grows one hop at a time: the record, the relations it takes part in
5517
+ * (grouped — "Purchase orders · 3"), and the records behind each group. Any
5518
+ * record node expands the same way, so a workflow → its PO → the PO's
5519
+ * invoices is three clicks. Clicking a record opens it in the drill sheet
5520
+ * (or navigates when the host has none).
5521
+ *
5522
+ * Every hop is read as the viewer by GET /record-graph/:collection/:id, so
5523
+ * the picture never shows a record the viewer could not open themselves.
5524
+ */
5525
+ export declare interface RecordGraphNode {
5526
+ collection: string;
5527
+ id: string;
5528
+ label: string;
5529
+ }
5530
+
5531
+ /** Right sheet hosting the explorer — hosts mount it beside the record form. */
5532
+ export declare function RecordGraphSheet({ collection, itemId, open, onOpenChange }: {
5533
+ collection: string;
5534
+ itemId: string;
5535
+ open: boolean;
5536
+ onOpenChange: (v: boolean) => void;
5537
+ }): JSX.Element;
5538
+
5329
5539
  export declare function RecordGridEditor({ config }: {
5330
5540
  config: RecordGridEditorConfig;
5331
5541
  }): JSX.Element;
@@ -5489,6 +5699,9 @@ export declare function registerLayoutSlot(plugin: LayoutSlotPlugin): void;
5489
5699
 
5490
5700
  export declare function registerRoomOpener(fn: RoomOpener): () => void;
5491
5701
 
5702
+ /** Register the host's opener. Returns an unregister function. */
5703
+ export declare function registerViewAsOpener(fn: ViewAsOpener): () => void;
5704
+
5492
5705
  export declare function RelatedRecordsPanel({ collection, itemId, title, defaultExpanded }: {
5493
5706
  collection: string;
5494
5707
  itemId: string;
@@ -6886,6 +7099,8 @@ export declare function usePeerReadAt(room: string | null): string | null;
6886
7099
 
6887
7100
  export declare function usePersonProfile(userId: string | null | undefined): UseQueryResult<NoInfer<PersonProfileData | null>, Error>;
6888
7101
 
7102
+ export declare function usePlanGridHost(): PlanGridHost | null;
7103
+
6889
7104
  /**
6890
7105
  * The quick picker BEFORE a record exists — the "+ New" menus open it, and on
6891
7106
  * Create the host navigates to the new-record page with the picks in
@@ -6979,6 +7194,33 @@ export declare function useRoomMembership(): {
6979
7194
 
6980
7195
  export declare function useRoomPins(room: string | null): NoInfer<PinnedMessage[]>;
6981
7196
 
7197
+ /** The user-picker option filter for this viewer (#732). */
7198
+ export declare function userOptionFilter(isAdmin: boolean): {
7199
+ _and: ({
7200
+ is_redacted: {
7201
+ _eq: boolean;
7202
+ };
7203
+ _or?: undefined;
7204
+ } | {
7205
+ _or: ({
7206
+ status: {
7207
+ _neq: string;
7208
+ _null?: undefined;
7209
+ };
7210
+ } | {
7211
+ status: {
7212
+ _null: boolean;
7213
+ _neq?: undefined;
7214
+ };
7215
+ })[];
7216
+ is_redacted?: undefined;
7217
+ } | {
7218
+ account_kind: {
7219
+ _null: boolean;
7220
+ };
7221
+ })[];
7222
+ };
7223
+
6982
7224
  /** Stacked avatar cluster (+N) with a hover/pinnable portal roster whose rows
6983
7225
  * are UserChips — the single user-display primitive for owners/user lists.
6984
7226
  * Reused by the item-header Owners chip and the collection browser. */
@@ -7085,6 +7327,23 @@ declare interface ValidationResult {
7085
7327
  unknownTokens: string[];
7086
7328
  }
7087
7329
 
7330
+ export declare function viewAs(person: {
7331
+ id: string;
7332
+ name: string;
7333
+ }): void | Promise<void>;
7334
+
7335
+ /**
7336
+ * "View as" registry (#640). A profile page offers "View as <person>" only
7337
+ * while the host app has said how it opens itself as someone else — the
7338
+ * admin opens a new tab on a per-tab masquerade token; a host without the
7339
+ * idea never registers and the button never shows. Same shape as the chat
7340
+ * DM opener registry.
7341
+ */
7342
+ declare type ViewAsOpener = (person: {
7343
+ id: string;
7344
+ name: string;
7345
+ }) => void | Promise<void>;
7346
+
7088
7347
  export declare function WidgetSlot({ widgetId, inputBindings, itemDraft, itemCollection, ready, label, defaultExpanded, frameless, apiBase: apiBaseProp, compact, strip, onClientAction, onWidgetType, onContentChange }: WidgetSlotProps): JSX.Element | null;
7089
7348
 
7090
7349
  declare interface WidgetSlotProps {