@ai-matrx/records-ui 0.103.7 → 0.104.2
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/CHANGELOG.md +27 -0
- package/dist/index.cjs +18829 -17776
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +786 -691
- package/dist/index.d.ts +786 -691
- package/dist/index.js +18397 -17335
- package/dist/index.js.map +1 -1
- package/dist/pickers.cjs.map +1 -1
- package/dist/pickers.js.map +1 -1
- package/package.json +3 -3
package/dist/index.d.cts
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
2
|
import { ReactNode, KeyboardEvent, ReactElement, ComponentType, RefObject, SVGAttributes } from 'react';
|
|
3
3
|
import * as _ai_matrx_records from '@ai-matrx/records';
|
|
4
|
-
import {
|
|
4
|
+
import { Uuid, RowAction, Field, RowActionStep, RecordScopeContext, EnrichCell, RecordsError, RecordDocument, Table, ReadRow, RecordRead, PermissionLevel, AggregateFilter, RelationDisplay, WriteConflict, RecordsErrorCode, TableDecorations, RecordFilter, RuleExpression, RecordsResult, SavedViewRow, StoreFilter as StoreFilter$1, ImportRun, DeclarableFieldKind, NewerFieldKind, ParityFieldType, NewFieldDeclaration, ChoiceRehome, FieldOptionEdit, StoredRecord, ChoiceNudge, HiddenFieldNotice, ValueEnvelope, ChecklistRequirementKind, ContextPolicy, WorkDueState, FieldSensitivity, StageRuleOnFail, SubscriptionCadence, WorkApprovalState, WorkInboxKind, FieldKind, ArchiveLane, ArchivedRow, WorkInboxView, WorkInboxItem, PortalAccent, FormSummary, PortalCard, PortalPrincipal, PortalPreviewRow, PublicPicture, PortalStyle, MySubscription, DashboardBlockKind, AggregateBucket, AggregateMeasure, AggregateCompare, DashboardTarget, DashboardBlock, DashboardSummary, AggregateGroupValue, DocTemplateRow, DocRenderRow, QuietHours, DashboardBlockResult, ChecklistRunStep, BookingSummary, CaptureSheetFace, CaptureField, AnonTokenBinding, RecordsConfig, RecordsActor, RecordsDataSource, TableDuplicated, HistoryActor, FieldHistoryEntry, DrillDefinition, DrillSource, TableDuplicateProgress, TableArchiveProgress } from '@ai-matrx/records';
|
|
5
5
|
import { ReversibleAnnouncement } from '@ai-matrx/kit/reversible';
|
|
6
6
|
import { W as WhatYouMayDo, T as TableActionHost, O as ObjectAction, a as ObjectActionIcon } from './objectActions-XkhxU-DP.cjs';
|
|
7
7
|
export { A as ACTION_CHECKING_ACCESS_REASON, b as ACTION_NOT_HERE_REASON, c as ACTION_NO_ACCESS_REASON, d as ACTION_PLATFORM_TABLE_REASON, B as BuiltOnDestination, C as Capability, D as DEFAULT_ACTION_ORIGIN, K as KERNEL_REASON, L as LEVEL_WORD, N as NOT_ANSWERED_YET, e as OBJECT_ACTION_GROUPS, f as ObjectActionDropdownEntry, g as ObjectActionGroup, h as ObjectActionGroupDef, i as ObjectActionSection, S as STANDARD_VERBS, j as STRIP_FEATURE_ROWS, k as StandardVerbId, l as StripAndRows, m as TableActionSubject, n as TableActionsInput, o as dropdownActionIds, p as dropdownActions, q as groupObjectActions, r as levelNeededFor, s as rightsReason, t as tableActions, u as tableLink, v as toDropdownEntries, w as toStripAndRows, x as whatYouMayDo, y as whatYouMayDoWithTable, z as withExtensions } from './objectActions-XkhxU-DP.cjs';
|
|
8
|
-
import { Uuid
|
|
9
|
-
import { TableStyle, GroupAggregateSpec, GroupOrder, ChoiceColorLookup, MatrxTableCardProps, StyleColor, MatrxDataTableDrillConfig, MatrxColumnDef as MatrxColumnDef$1, MatrxDrillDimension, MatrxDrillMeasure, MatrxDrillFilter, MatrxDrillQuestion, MatrxDrillAnswers } from '@ai-matrx/design-system/data-table';
|
|
10
|
-
import { FieldFormatConfig } from '@ai-matrx/design-system/field-formats';
|
|
8
|
+
import { Uuid as Uuid$1, Table as Table$1, Field as Field$1, ReadRow as ReadRow$1, StoreFilter, useRecordsClient } from '@ai-matrx/records/react';
|
|
11
9
|
import { RecordsClient, ParsedImport, NewFieldSpec } from '@ai-matrx/records/core';
|
|
12
10
|
export { DEFAULT_FIELDS, DeclareResult, NewFieldSpec, NewTableSpec, addFields, declareTable, fieldDeclarationFor, tokenFor } from '@ai-matrx/records/core';
|
|
11
|
+
import { FieldFormatConfig } from '@ai-matrx/design-system/field-formats';
|
|
12
|
+
import { TableStyle, GroupAggregateSpec, GroupOrder, ChoiceColorLookup, MatrxTableCardProps, StyleColor, MatrxDataTableDrillConfig, MatrxColumnDef as MatrxColumnDef$1, MatrxDrillDimension, MatrxDrillMeasure, MatrxDrillFilter, MatrxDrillQuestion, MatrxDrillAnswers } from '@ai-matrx/design-system/data-table';
|
|
13
13
|
import { GuessedFieldType, TableShape } from './table-shape.cjs';
|
|
14
14
|
export { ColumnGuess, FEWEST_KEY_VALUE_PAIRS, FEWEST_LIST_ITEMS, TableShapeKind, TableShapeSplit, cellWords, guessColumn, hasTableShape, parseDelimited, readTableShape, readTableShapes, shapeOfGrid, shapeOfValue, shapeTextOfNode } from './table-shape.cjs';
|
|
15
15
|
import { Column, Row, Values } from '@ai-matrx/records/data';
|
|
@@ -19,6 +19,37 @@ import { TemplateSpec } from '@ai-matrx/records/templates';
|
|
|
19
19
|
import { TemplatePreview as TemplatePreview$1 } from '@ai-matrx/records/memory';
|
|
20
20
|
import { MatrxColumnDef } from '@ai-matrx/design-system/data-table/types';
|
|
21
21
|
|
|
22
|
+
/** What the settings panel can see right now, in the words the agent reads. */
|
|
23
|
+
interface TableSettingsSnapshot {
|
|
24
|
+
table_id: Uuid;
|
|
25
|
+
/** True when the description or an open row action holds edits not saved yet. */
|
|
26
|
+
has_unsaved_changes: boolean;
|
|
27
|
+
table_details_draft: {
|
|
28
|
+
table_name: string;
|
|
29
|
+
description: string;
|
|
30
|
+
row_label: string | null;
|
|
31
|
+
};
|
|
32
|
+
saved_row_actions?: Array<Record<string, unknown>>;
|
|
33
|
+
editing_row_action?: Record<string, unknown>;
|
|
34
|
+
editing_row_action_problems?: string[];
|
|
35
|
+
}
|
|
36
|
+
/** What the host's surface reads and calls. Every call reads the panel as it is at that moment. */
|
|
37
|
+
interface TableSettingsAgent {
|
|
38
|
+
read: () => TableSettingsSnapshot;
|
|
39
|
+
/** Replace the open row action (or open a new one) with a whole action. */
|
|
40
|
+
stageRowAction: (input: unknown) => Promise<void>;
|
|
41
|
+
/** Write one Calculate step's formula in the open update action. */
|
|
42
|
+
stageStepFormula: (input: unknown) => Promise<void>;
|
|
43
|
+
/** Stage the description in "About this table". */
|
|
44
|
+
stageTableDetails: (input: unknown) => Promise<void>;
|
|
45
|
+
}
|
|
46
|
+
/** One step the agent sent, in the manifest's words, as the store's step. Throws on anything else. */
|
|
47
|
+
declare function stepFromAgent(input: unknown, index: number, fields: readonly Field[], check: (expression: string, where: string) => Promise<void>): Promise<RowActionStep>;
|
|
48
|
+
/** A whole row action the agent sent, as the store's action. Throws on anything the Save would refuse. */
|
|
49
|
+
declare function rowActionFromAgent(input: unknown, fields: readonly Field[], check: (expression: string, where: string) => Promise<void>): Promise<RowAction>;
|
|
50
|
+
/** The action as the agent reads it: columns by machine name, formulas as text. */
|
|
51
|
+
declare function actionForAgent(action: RowAction, fields: readonly Field[]): Record<string, unknown>;
|
|
52
|
+
|
|
22
53
|
/** One named piece of grounding, shaped the way the platform's context slice takes them. */
|
|
23
54
|
interface RecordChatEntry {
|
|
24
55
|
key: string;
|
|
@@ -33,8 +64,8 @@ interface RecordChatEntry {
|
|
|
33
64
|
* answer into a link to the record AND to the version it was read at.
|
|
34
65
|
*/
|
|
35
66
|
cite?: {
|
|
36
|
-
record_id: Uuid;
|
|
37
|
-
field_id: Uuid;
|
|
67
|
+
record_id: Uuid$1;
|
|
68
|
+
field_id: Uuid$1;
|
|
38
69
|
value_version: number;
|
|
39
70
|
written_at: string | null;
|
|
40
71
|
};
|
|
@@ -63,8 +94,8 @@ interface RecordChatContext {
|
|
|
63
94
|
* constant.
|
|
64
95
|
*/
|
|
65
96
|
surfaceKey: string;
|
|
66
|
-
tableId: Uuid;
|
|
67
|
-
recordId: Uuid;
|
|
97
|
+
tableId: Uuid$1;
|
|
98
|
+
recordId: Uuid$1;
|
|
68
99
|
tableName: string;
|
|
69
100
|
/** The record's own title, for the panel's one-row header and the chip. */
|
|
70
101
|
title: string;
|
|
@@ -89,16 +120,16 @@ interface RecordChatContext {
|
|
|
89
120
|
*/
|
|
90
121
|
declare const NO_CHAT_REASON: string;
|
|
91
122
|
interface RecordChatProps {
|
|
92
|
-
tableId: Uuid;
|
|
93
|
-
recordId: Uuid;
|
|
123
|
+
tableId: Uuid$1;
|
|
124
|
+
recordId: Uuid$1;
|
|
94
125
|
className?: string | undefined;
|
|
95
126
|
}
|
|
96
127
|
declare function RecordChat({ tableId, recordId, className }: RecordChatProps): react.JSX.Element;
|
|
97
128
|
|
|
98
129
|
/** What the host is asked to have the SERVER's `records` tool do. */
|
|
99
130
|
interface EnrichAsk {
|
|
100
|
-
tableId: Uuid;
|
|
101
|
-
fieldId: Uuid;
|
|
131
|
+
tableId: Uuid$1;
|
|
132
|
+
fieldId: Uuid$1;
|
|
102
133
|
fieldKey: string;
|
|
103
134
|
/** How many records this run covers. */
|
|
104
135
|
rows: number;
|
|
@@ -147,15 +178,15 @@ declare function EnrichBadge({ cell, onPin, className }: EnrichBadgeProps): reac
|
|
|
147
178
|
* badges, which is why the store answers the whole page at once. The hook is keyed by the
|
|
148
179
|
* record ids the grid is actually drawing, so paging re-asks and scrolling does not.
|
|
149
180
|
*/
|
|
150
|
-
declare function useEnrichCells(tableId: Uuid | undefined, recordIds: Uuid[] | undefined): {
|
|
181
|
+
declare function useEnrichCells(tableId: Uuid$1 | undefined, recordIds: Uuid$1[] | undefined): {
|
|
151
182
|
cells: Map<string, EnrichCell>;
|
|
152
183
|
refresh: () => Promise<void>;
|
|
153
184
|
error: RecordsError | null;
|
|
154
185
|
};
|
|
155
186
|
interface EnrichPanelProps {
|
|
156
|
-
tableId: Uuid;
|
|
187
|
+
tableId: Uuid$1;
|
|
157
188
|
/** Open straight onto one column. Absent, the panel lists every agent-owned column. */
|
|
158
|
-
fieldId?: Uuid | undefined;
|
|
189
|
+
fieldId?: Uuid$1 | undefined;
|
|
159
190
|
className?: string | undefined;
|
|
160
191
|
}
|
|
161
192
|
/**
|
|
@@ -169,258 +200,14 @@ interface EnrichPanelProps {
|
|
|
169
200
|
*/
|
|
170
201
|
declare function EnrichPanel({ tableId, fieldId, className }: EnrichPanelProps): react.JSX.Element;
|
|
171
202
|
|
|
172
|
-
/**
|
|
173
|
-
* HOW A TABLE LOOKS — colors, formats and the frozen column.
|
|
174
|
-
*
|
|
175
|
-
* THE SPLIT, AND WHY IT IS THIS ONE. A Field declares WHAT it holds: a
|
|
176
|
-
* currency, a percent, a date, a person. A VIEW declares HOW that reads and
|
|
177
|
-
* what it is worth looking at: two decimal places or none, tint the row when
|
|
178
|
-
* Status is Blocked, keep Name in place while the rest scrolls. Airtable draws
|
|
179
|
-
* the line in exactly this place, and it has to be here: two people read one
|
|
180
|
-
* table two different ways, and neither reading is a fact about the records.
|
|
181
|
-
*
|
|
182
|
-
* So nothing in this module is a new column on a Field and nothing here needed
|
|
183
|
-
* a migration. A presentation lives on the saved-view record (`views.ts`), which
|
|
184
|
-
* is an ordinary record of an ordinary Table — which means an agent sets it
|
|
185
|
-
* through the same `records` tool it uses for everything else, and it travels
|
|
186
|
-
* with the table the way every other record does.
|
|
187
|
-
*
|
|
188
|
-
* A FIELD STILL GETS ITS MONEY RIGHT WITH NO CONFIGURATION. `formatForField`
|
|
189
|
-
* reads the Field's OWN declaration — a `currency` parity type with unit `$`, a
|
|
190
|
-
* `percent`, a `datetime` with `config.kind` — and returns the format that
|
|
191
|
-
* follows from it. The view's `formats` map only OVERRIDES that. A table nobody
|
|
192
|
-
* has ever styled still shows `$1,250.50` and `45%`.
|
|
193
|
-
*/
|
|
194
|
-
|
|
195
|
-
/**
|
|
196
|
-
* SECTIONS BY A FIELD — the view's own grouping.
|
|
197
|
-
*
|
|
198
|
-
* `field` is a Field KEY, exactly like `frozen` and the keys of `formats`,
|
|
199
|
-
* because a view is written against the Table's declaration and never against
|
|
200
|
-
* whatever id a screen happened to build its columns with.
|
|
201
|
-
*
|
|
202
|
-
* `aggregates` is keyed by Field key too, and `collapsed` holds the data
|
|
203
|
-
* table's own group keys (`s:Blocked`, `n:3`, `empty`), which is what the
|
|
204
|
-
* primitive emits and the only thing that survives a value rendering the same
|
|
205
|
-
* text as another.
|
|
206
|
-
*
|
|
207
|
-
* NOTHING HERE IS EVER CALLED `valueOf`, `toString` or `hasOwnProperty`: every
|
|
208
|
-
* object in JavaScript already has all three, so an optional field by one of
|
|
209
|
-
* those names is NEVER absent and a `config.valueOf ? … : …` check silently
|
|
210
|
-
* reads `Object.prototype`. It cost the primitive a whole grouping once.
|
|
211
|
-
*/
|
|
212
|
-
type GridGrouping = {
|
|
213
|
-
/** The Field key whose value makes the sections. */
|
|
214
|
-
field: string;
|
|
215
|
-
/** Per-Field-key subtotal on every section header. */
|
|
216
|
-
aggregates?: Record<string, GroupAggregateSpec>;
|
|
217
|
-
/** Section order. The primitive's default is `value-asc`; blanks sort last. */
|
|
218
|
-
order?: GroupOrder;
|
|
219
|
-
/** The sections this view keeps shut, by the primitive's own group key. */
|
|
220
|
-
collapsed?: string[];
|
|
221
|
-
/** The grouped column drawn as a column too. Absent = it steps aside (the headers name its value). */
|
|
222
|
-
showColumn?: boolean;
|
|
223
|
-
/**
|
|
224
|
-
* SUB-GROUPS (lane S1-PRIME VIEW-KEYS; ui-bench LISTS "sub-grouping"): up to two more levels
|
|
225
|
-
* inside each section, by Field key. At most three levels in all — the store refuses a fourth
|
|
226
|
-
* (`custom.view_declare`). A layout that draws one level ignores the rest; it never drops them,
|
|
227
|
-
* because this list is parsed and written back whole with the rest of the look.
|
|
228
|
-
*/
|
|
229
|
-
then?: GridSubGroup[];
|
|
230
|
-
/**
|
|
231
|
-
* DRILL (lane DRILL-TABLE-PRIMITIVE): the Dimension pivoted across the top — a Field key, or
|
|
232
|
-
* `<key>:<grain>` for a date cut into periods.
|
|
233
|
-
*/
|
|
234
|
-
across?: string;
|
|
235
|
-
/** DRILL: the period `field` is cut into when it is a date (`month`); the store keeps `field` a Field key. */
|
|
236
|
-
grain?: string;
|
|
237
|
-
/** The Measures shown ("what to display"), by the store's own keys (`count`, `sum_quantity`). */
|
|
238
|
-
show?: string[];
|
|
239
|
-
/** The drill trail, in order: each crumb a Dimension reference and the value it narrowed to. */
|
|
240
|
-
trail?: GridDrillStep[];
|
|
241
|
-
};
|
|
242
|
-
/** One crumb of a saved drill trail. `value: null` is "no value". */
|
|
243
|
-
type GridDrillStep = {
|
|
244
|
-
dim: string;
|
|
245
|
-
value: string | null;
|
|
246
|
-
};
|
|
247
|
-
/** One sub-group level: a Field key and its section order. */
|
|
248
|
-
type GridSubGroup = {
|
|
249
|
-
field: string;
|
|
250
|
-
order?: GroupOrder;
|
|
251
|
-
grain?: string;
|
|
252
|
-
};
|
|
253
|
-
/** Everything a view says about how its table LOOKS. */
|
|
254
|
-
type GridPresentation = {
|
|
255
|
-
/** Color-by-a-column, rules and manual highlights. */
|
|
256
|
-
style?: TableStyle;
|
|
257
|
-
/** Per-column format overrides, by the Field's key. */
|
|
258
|
-
formats?: Record<string, FieldFormatConfig>;
|
|
259
|
-
/**
|
|
260
|
-
* The columns that stay in place while the table scrolls sideways, by Field
|
|
261
|
-
* key. Only the LEADING run of the view's column order can actually freeze —
|
|
262
|
-
* the data table decides that, and declines rather than pinning a column at a
|
|
263
|
-
* guessed offset.
|
|
264
|
-
*/
|
|
265
|
-
frozen?: string[];
|
|
266
|
-
/** Collapsible sections by one Field, with subtotals on each header. */
|
|
267
|
-
grouping?: GridGrouping;
|
|
268
|
-
/**
|
|
269
|
-
* The width a person dragged a column to, by Field key. SPARSE on purpose —
|
|
270
|
-
* a view saved before widths existed carries none and still parses, and a
|
|
271
|
-
* column nobody resized is left to the table's own measurement.
|
|
272
|
-
*/
|
|
273
|
-
widths?: Record<string, number>;
|
|
274
|
-
/** The body row height this view remembers, in px. */
|
|
275
|
-
rowHeight?: number;
|
|
276
|
-
/**
|
|
277
|
-
* Field keys hidden from this view — the SAME hidden-column list the grid's
|
|
278
|
-
* own column picker holds, now given a place on the view so it survives a
|
|
279
|
-
* reload and a layout switch reads the identical set gallery and grid agree
|
|
280
|
-
* on, rather than a second "fields shown" list nobody kept in sync.
|
|
281
|
-
*/
|
|
282
|
-
hiddenFields?: string[];
|
|
283
|
-
/**
|
|
284
|
-
* THE FIELDS A CARD LEAVES OFF (board, list, gallery, calendar, timeline), by Field key — the
|
|
285
|
-
* card's own choice, kept apart from `hiddenFields` so a board's "Card fields" never hides the
|
|
286
|
-
* grid's columns when the view switches layout (v7 TABLE-EXPERIENCE, walk 2026-10-05). An empty
|
|
287
|
-
* list is a choice (every field shown); absent means the card never chose.
|
|
288
|
-
*/
|
|
289
|
-
cardHidden?: string[];
|
|
290
|
-
/**
|
|
291
|
-
* THE ORDER A PERSON DRAGGED THE COLUMNS INTO, by Field key (merge tranche 6a). Sparse like
|
|
292
|
-
* `widths`: a key it does not name keeps its Field's own place after the named ones, and a key
|
|
293
|
-
* whose Field is gone is skipped — a column order can never hide or invent a column.
|
|
294
|
-
*/
|
|
295
|
-
columnOrder?: string[];
|
|
296
|
-
/**
|
|
297
|
-
* The gallery's card size, remembered the same way the grid remembers its
|
|
298
|
-
* row height — a per-view look, not a global default.
|
|
299
|
-
*/
|
|
300
|
-
gallerySize?: "small" | "medium" | "large";
|
|
301
|
-
/**
|
|
302
|
-
* THIS VIEW'S OWN LAYOUT CHOICES, over the organization's `custom/grid_layout` knob (lane
|
|
303
|
-
* DEFAULT-GRID-PARITY, TABLE-PARITY D1 D5 D6). Absent means "whatever the organization
|
|
304
|
-
* says"; present is the view's word. `freezeFirst: false` is an explicit NO over an
|
|
305
|
-
* organization that freezes the first column — an empty `frozen` cannot say that.
|
|
306
|
-
*/
|
|
307
|
-
wrap?: boolean;
|
|
308
|
-
/** NOTION'S "WRAP COLUMN" (N5): the columns that wrap their text when the view as a whole does not. */
|
|
309
|
-
wrapColumns?: string[];
|
|
310
|
-
fit?: "auto" | "fit" | "scroll";
|
|
311
|
-
freezeFirst?: boolean;
|
|
312
|
-
/**
|
|
313
|
-
* THE SUMMARY BAR (TABLE-PARITY F1): Field key → the store measure shown under that column
|
|
314
|
-
* (`count`, `sum`, `avg`, `min`, `max`, `median`, `filled`, `empty`, `unique`), worked out
|
|
315
|
-
* by `custom.record_aggregate` over the whole table.
|
|
316
|
-
*/
|
|
317
|
-
summaries?: Record<string, string>;
|
|
318
|
-
/**
|
|
319
|
-
* WHERE THE FOOTER SITS (lane TABLE-PAGE-CHROME, owner 2026-09-25) — the row count and the
|
|
320
|
-
* pages: `sticky`, pinned to the bottom of the screen while the rows scroll (the older grid's
|
|
321
|
-
* way, and the default when a view says nothing), or `inline`, right after the last row with
|
|
322
|
-
* the page scrolling. Read by the Grid and a host's Sheet.
|
|
323
|
-
*/
|
|
324
|
-
footer?: FooterPlacement;
|
|
325
|
-
};
|
|
326
|
-
/** Where a grid's footer sits. */
|
|
327
|
-
type FooterPlacement = "sticky" | "inline";
|
|
328
|
-
/** What a view that says nothing gets — the older grid's pinned footer. */
|
|
329
|
-
declare const DEFAULT_FOOTER: FooterPlacement;
|
|
330
|
-
/** Where THIS view's footer sits, said or defaulted. */
|
|
331
|
-
declare function footerOf(p: GridPresentation | null | undefined): FooterPlacement;
|
|
332
|
-
declare const EMPTY_PRESENTATION: GridPresentation;
|
|
333
|
-
/** A frozen column needs a known width, or the table declines to freeze at all. */
|
|
334
|
-
declare const FROZEN_COLUMN_WIDTH = 200;
|
|
335
|
-
/**
|
|
336
|
-
* WHAT A ROW HEIGHT IS ALLOWED TO BE. Below the floor the text is clipped and
|
|
337
|
-
* no editor fits; above the ceiling one record fills the screen. A view asking
|
|
338
|
-
* for anything outside it is DROPPED rather than obeyed, because a saved look
|
|
339
|
-
* must not be able to make a table unreadable — and the Fields' own heights
|
|
340
|
-
* still draw, which is the tolerant half.
|
|
341
|
-
*/
|
|
342
|
-
declare const MIN_ROW_HEIGHT = 24;
|
|
343
|
-
declare const MAX_ROW_HEIGHT = 96;
|
|
344
|
-
/**
|
|
345
|
-
* Read a presentation out of whatever the view record holds — an object, or the
|
|
346
|
-
* JSON string a text field stores.
|
|
347
|
-
*
|
|
348
|
-
* Tolerant in exactly the way `parseTableStyle` is: an unreadable half is
|
|
349
|
-
* dropped and the rest still applies, because a table must keep drawing when
|
|
350
|
-
* one piece of its styling goes out of date.
|
|
351
|
-
*/
|
|
352
|
-
declare function parseGridPresentation(raw: unknown): GridPresentation;
|
|
353
|
-
/** True when nothing here would change how anything looks. */
|
|
354
|
-
declare function presentationIsEmpty(p: GridPresentation): boolean;
|
|
355
|
-
/** The string a view record stores. Empty string for "this view styles nothing". */
|
|
356
|
-
declare function presentationDocument(p: GridPresentation): string;
|
|
357
|
-
/**
|
|
358
|
-
* The format a Field's OWN declaration implies, before any view says anything.
|
|
359
|
-
*
|
|
360
|
-
* Returns `undefined` for a Field whose value the record renderer already draws
|
|
361
|
-
* better than a formatter could — a relation chip, a person, an attachment, a
|
|
362
|
-
* choice — because handing those to a text formatter would REPLACE a working
|
|
363
|
-
* control with a string.
|
|
364
|
-
*/
|
|
365
|
-
declare function formatForField(field: Field): FieldFormatConfig | undefined;
|
|
366
|
-
declare function currencyCodeFor(unit: string | null | undefined): string;
|
|
367
|
-
/**
|
|
368
|
-
* The color a value paints with when a view colors BY a column.
|
|
369
|
-
*
|
|
370
|
-
* NOTHING FAILS SILENTLY, so this never returns "no color" for a value that
|
|
371
|
-
* exists. The store keeps a list column's choices as records of another Table,
|
|
372
|
-
* and this grid has not read that Table's option colors, so the color is
|
|
373
|
-
* derived from the value's own text: the same word always gets the same color,
|
|
374
|
-
* different words get different ones, and `true` is green the way every
|
|
375
|
-
* checklist reads. When those option colors do land, this is the ONE function
|
|
376
|
-
* that changes and every screen follows.
|
|
377
|
-
*/
|
|
378
|
-
declare const colorFromTheValue: ChoiceColorLookup;
|
|
379
|
-
/**
|
|
380
|
-
* G1's TABLE-LEVEL COLORS (`custom.table_decorations` / `client.tableDecorations`),
|
|
381
|
-
* TRANSLATED INTO A `TableStyle` — the same document a saved view's own `presentation.style`
|
|
382
|
-
* is, so one resolver (`resolveTableStyle`, below) can treat "the table's colors" and "this
|
|
383
|
-
* view's colors" as two layers of the SAME thing instead of two unrelated systems.
|
|
384
|
-
*
|
|
385
|
-
* THE TRANSLATION IS NECESSARY AND IT IS THE ONLY ONE. G1 addresses a Field by its ID
|
|
386
|
-
* (REC-17 — a column renamed keeps its color), because it is the STORE's own door; a
|
|
387
|
-
* `TableStyle` addresses a Field by its KEY, because it reads straight off `row.document`,
|
|
388
|
-
* which is keyed by Field key. A rule or a color-by whose Field has been deleted (its id no
|
|
389
|
-
* longer resolves to a key) is dropped rather than crashing the whole style — a defect in
|
|
390
|
-
* one rule costs that rule, never the read.
|
|
391
|
-
*/
|
|
392
|
-
declare function styleFromDecorations(decorations: TableDecorations | null | undefined, fields: readonly Field[]): TableStyle;
|
|
393
|
-
/**
|
|
394
|
-
* THE ONE PRESENTATION RESOLVER every colored surface in this package reads —
|
|
395
|
-
* `Grid`, and (via `Card`) the kanban board, the calendar and the gallery.
|
|
396
|
-
*
|
|
397
|
-
* THE CLASS THIS CLOSES (lane UI-QUICK-1, TABLE-PARITY review, 2026-09-24). Threading
|
|
398
|
-
* `view.presentation.style` into `Card` closed the instance the CALENDAR-GALLERY bench
|
|
399
|
-
* found — a VIEW that had its own color-by looked right everywhere — but it left the
|
|
400
|
-
* class open: a table whose colors are the ORGANIZATION's decorations (G1's
|
|
401
|
-
* `custom.table_decorations` — "color rows by Account Type", "MAXED and NEAR rules" on
|
|
402
|
-
* Arman's own Coding Accounts table) and whose views never set a `presentation.style` of
|
|
403
|
-
* their own drew NOTHING, on the grid exactly as much as on every other layout, because
|
|
404
|
-
* nothing in this package had ever read G1's door at all.
|
|
405
|
-
*
|
|
406
|
-
* TWO LAYERS, ONE DOCUMENT. The table's decorations are the base coat — what every view
|
|
407
|
-
* of this table shows until a view says otherwise. A view's OWN `presentation.style` is
|
|
408
|
-
* an override, piece by piece: a view that only ever set manual row highlights still
|
|
409
|
-
* inherits the table's color-by and rules for everything it never touched, and a view
|
|
410
|
-
* that fully redecorated (its own `colorBy` AND its own `rules`) is not haunted by a
|
|
411
|
-
* table rule it meant to replace. Per-piece, never all-or-nothing, because a view is a
|
|
412
|
-
* LOOK on top of the table, not a wholesale substitute for it.
|
|
413
|
-
*/
|
|
414
|
-
declare function resolveTableStyle(decorations: TableDecorations | null | undefined, fields: readonly Field[], viewStyle: TableStyle | undefined): TableStyle;
|
|
415
|
-
|
|
416
203
|
/** One record as the grid shows it: its id, its name (the row label) and its masked document. */
|
|
417
204
|
interface GridContextRecord {
|
|
418
|
-
id: Uuid
|
|
205
|
+
id: Uuid;
|
|
419
206
|
title: string;
|
|
420
207
|
document: RecordDocument;
|
|
421
208
|
}
|
|
422
209
|
interface GridContextSnapshot {
|
|
423
|
-
tableId: Uuid
|
|
210
|
+
tableId: Uuid;
|
|
424
211
|
tableName: string;
|
|
425
212
|
/** The table's own description (`metadata.description`), when it has one. */
|
|
426
213
|
tableDescription: string | null;
|
|
@@ -434,7 +221,7 @@ interface GridContextSnapshot {
|
|
|
434
221
|
canWrite: boolean;
|
|
435
222
|
/** The cell the cursor is on: its record, its Field key and the value drawn in it. */
|
|
436
223
|
currentCell: {
|
|
437
|
-
rowId: Uuid
|
|
224
|
+
rowId: Uuid;
|
|
438
225
|
key: string;
|
|
439
226
|
value: unknown;
|
|
440
227
|
} | null;
|
|
@@ -444,7 +231,7 @@ interface GridContextSnapshot {
|
|
|
444
231
|
selectedRange: {
|
|
445
232
|
tsv: string;
|
|
446
233
|
cellCount: number;
|
|
447
|
-
rowIds: Uuid
|
|
234
|
+
rowIds: Uuid[];
|
|
448
235
|
keys: string[];
|
|
449
236
|
} | null;
|
|
450
237
|
/** The rows ticked with the row boxes. */
|
|
@@ -467,7 +254,7 @@ interface GridCursor {
|
|
|
467
254
|
tsv: string;
|
|
468
255
|
}
|
|
469
256
|
declare function gridContextSnapshot(args: {
|
|
470
|
-
tableId: Uuid
|
|
257
|
+
tableId: Uuid;
|
|
471
258
|
table: Table | null;
|
|
472
259
|
fields: readonly Field[];
|
|
473
260
|
/** The Field keys on screen, in order. */
|
|
@@ -478,7 +265,7 @@ declare function gridContextSnapshot(args: {
|
|
|
478
265
|
cursor: GridCursor | null;
|
|
479
266
|
/** The cell whose editor is open, which wins over the cursor. */
|
|
480
267
|
editing: {
|
|
481
|
-
rowId: Uuid
|
|
268
|
+
rowId: Uuid;
|
|
482
269
|
key: string;
|
|
483
270
|
draft: unknown;
|
|
484
271
|
} | null;
|
|
@@ -514,52 +301,13 @@ interface TableRights extends WhatYouMayDo {
|
|
|
514
301
|
*/
|
|
515
302
|
declare const NO_RIGHTS: TableRights;
|
|
516
303
|
/**
|
|
517
|
-
* THE ONE WAY TO BUILD A `TableRights` BY HAND — for a host with its own
|
|
518
|
-
* authority, and for a suite that wants to mount one seat's screen. It takes
|
|
519
|
-
* the LEVEL, never six booleans, so nobody can hand a screen a combination the
|
|
520
|
-
* ladder cannot produce (write without read, share without edit).
|
|
521
|
-
*/
|
|
522
|
-
declare function tableRightsAt(level: PermissionLevel | null): TableRights;
|
|
523
|
-
/**
|
|
524
|
-
* A LAYOUT THE HOST DRAWS, beside the package's own four (Grid, Kanban, Calendar,
|
|
525
|
-
* Gallery) in the SAME layout row of every table page. The host owns what it
|
|
526
|
-
* draws; the package owns where it sits, its button, and its address (`?view=<id>`).
|
|
527
|
-
*
|
|
528
|
-
* WHY A PORT: an app with a richer surface for one kind of looking at a table —
|
|
529
|
-
* AI Matrx's spreadsheet-feel Sheet, the older /data grid ported onto the record
|
|
530
|
-
* store — must be a layout of the one table page, never a second page for the
|
|
531
|
-
* same table. It is page-level, not saved onto the view record: the store's
|
|
532
|
-
* layout words are the four the package draws.
|
|
533
|
-
*/
|
|
534
|
-
interface HostLayout {
|
|
535
|
-
/** The address word (`?view=sheet`). Lowercase; must not be one of the package's own. */
|
|
536
|
-
id: string;
|
|
537
|
-
/** The button's words. */
|
|
538
|
-
label: string;
|
|
539
|
-
/** Draw it for this table, with the question the address asked when there is one. */
|
|
540
|
-
render: (args: {
|
|
541
|
-
tableId: Uuid$1;
|
|
542
|
-
filter?: StoreFilter | undefined;
|
|
543
|
-
/**
|
|
544
|
-
* Opens the page's own export (CSV, XLSX, copy and transform) — the one export a table has,
|
|
545
|
-
* so a host layout's "Export this table…" never needs a second one or a hunt for a button.
|
|
546
|
-
* Absent on a page that draws no export.
|
|
547
|
-
*/
|
|
548
|
-
openExport?: (() => void) | undefined;
|
|
549
|
-
/**
|
|
550
|
-
* Where the view's footer sits (lane TABLE-PAGE-CHROME): `sticky` — fill the height given and
|
|
551
|
-
* keep the counts and pages on the bottom edge; `inline` — after the last row.
|
|
552
|
-
*/
|
|
553
|
-
footer?: FooterPlacement | undefined;
|
|
554
|
-
/**
|
|
555
|
-
* THE PAGE'S ONE TOOLBAR ROW (lane TABLE-PAGE-CHROME). A host layout with controls of its own
|
|
556
|
-
* (search, columns, sort) draws them INTO this element — never a second bar under the page's.
|
|
557
|
-
* `null`: the row is mounting (draw nothing yet). Absent: no page row, draw in place.
|
|
558
|
-
*/
|
|
559
|
-
toolbarSlot?: HTMLElement | null | undefined;
|
|
560
|
-
}) => ReactNode;
|
|
561
|
-
}
|
|
562
|
-
/**
|
|
304
|
+
* THE ONE WAY TO BUILD A `TableRights` BY HAND — for a host with its own
|
|
305
|
+
* authority, and for a suite that wants to mount one seat's screen. It takes
|
|
306
|
+
* the LEVEL, never six booleans, so nobody can hand a screen a combination the
|
|
307
|
+
* ladder cannot produce (write without read, share without edit).
|
|
308
|
+
*/
|
|
309
|
+
declare function tableRightsAt(level: PermissionLevel | null): TableRights;
|
|
310
|
+
/**
|
|
563
311
|
* The authored-text slots `renderText` is asked to draw. `cell`: a long-text cell of the merged
|
|
564
312
|
* grid and the whole-text dialog's preview — the host may return block content there (the grid
|
|
565
313
|
* clips it to the row); the form slots take phrasing content only.
|
|
@@ -578,10 +326,10 @@ interface RichTextEditProps {
|
|
|
578
326
|
}
|
|
579
327
|
interface ReferenceChipRef {
|
|
580
328
|
token: string;
|
|
581
|
-
id: Uuid
|
|
329
|
+
id: Uuid;
|
|
582
330
|
label: string | null;
|
|
583
331
|
/** For `token: "record"`, the Table the relation points into. */
|
|
584
|
-
tableId?: Uuid
|
|
332
|
+
tableId?: Uuid | undefined;
|
|
585
333
|
/**
|
|
586
334
|
* The record it names sits in Archived items. An archive keeps every reference to what it
|
|
587
335
|
* archived (chair ruling B3-21), so the chip still names it and draws the archived state.
|
|
@@ -605,8 +353,6 @@ interface RecordsUiHost {
|
|
|
605
353
|
* merge step 9, when `merged` is the only grid.
|
|
606
354
|
*/
|
|
607
355
|
grid?: "classic" | "merged";
|
|
608
|
-
/** Layouts the host draws beside the package's own. See `HostLayout`. */
|
|
609
|
-
layouts?: HostLayout[];
|
|
610
356
|
/**
|
|
611
357
|
* OPTIONAL. CLEAN A PASTED PIECE OF HTML INTO PLAIN TEXT (merge tranche 6m, inventory A7).
|
|
612
358
|
*
|
|
@@ -639,12 +385,32 @@ interface RecordsUiHost {
|
|
|
639
385
|
label: string;
|
|
640
386
|
onChange: (name: string) => void;
|
|
641
387
|
}) => ReactNode;
|
|
388
|
+
/**
|
|
389
|
+
* OPTIONAL. HELP WRITING A FORMULA (Sheet retirement). The formula box hands the host what it
|
|
390
|
+
* holds — the text, the table's other columns and the store's reading of what is wrong — and the
|
|
391
|
+
* host draws its own help control beside the box (matrx-frontend runs its formula-writing job).
|
|
392
|
+
* Whatever formula the help arrives at goes back through `onFormula` into the box, unsaved, for
|
|
393
|
+
* the person to keep or change. Unbound, nothing is drawn.
|
|
394
|
+
*/
|
|
395
|
+
formulaHelp?: (ask: FormulaHelpAsk) => ReactNode;
|
|
396
|
+
/**
|
|
397
|
+
* OPTIONAL. AN AGENT OVER A TABLE'S SETTINGS (Sheet retirement). While the settings panel is open
|
|
398
|
+
* it wraps itself in what this returns, handing the host a `TableSettingsAgent`: what the panel
|
|
399
|
+
* can see (the description as edited, the row actions and the one being edited, what stops it
|
|
400
|
+
* saving) and three staging calls (a whole row action, one step's formula, the description).
|
|
401
|
+
* Staging never saves; the person presses Save. Unbound, the panel draws bare.
|
|
402
|
+
*/
|
|
403
|
+
settingsAgent?: (args: {
|
|
404
|
+
tableId: Uuid;
|
|
405
|
+
agent: TableSettingsAgent;
|
|
406
|
+
children: ReactNode;
|
|
407
|
+
}) => ReactNode;
|
|
642
408
|
/** Answer the rights question for one table. Synchronous: a screen renders now. */
|
|
643
409
|
rights?: (table: Table) => TableRights;
|
|
644
410
|
/** Where a record's own page lives, when the host has one. A peek is used when it does not. */
|
|
645
411
|
hrefForRecord?: (args: {
|
|
646
412
|
table: Table;
|
|
647
|
-
recordId: Uuid
|
|
413
|
+
recordId: Uuid;
|
|
648
414
|
}) => string | undefined;
|
|
649
415
|
/**
|
|
650
416
|
* OPTIONAL. WHERE A FILE OPENS. A value too big for one cell is kept as a file and the cell
|
|
@@ -653,7 +419,7 @@ interface RecordsUiHost {
|
|
|
653
419
|
* screen cannot open — never a dead link.
|
|
654
420
|
*/
|
|
655
421
|
hrefForFile?: (args: {
|
|
656
|
-
fileId: Uuid
|
|
422
|
+
fileId: Uuid;
|
|
657
423
|
}) => string | undefined;
|
|
658
424
|
/**
|
|
659
425
|
* OPTIONAL. READ A FILE'S WHOLE TEXT, so an export writes a big value's whole content rather
|
|
@@ -661,7 +427,7 @@ interface RecordsUiHost {
|
|
|
661
427
|
* the file (`wholeValueNotRead`) — never the words passed off as the value.
|
|
662
428
|
*/
|
|
663
429
|
readFileText?: (args: {
|
|
664
|
-
fileId: Uuid
|
|
430
|
+
fileId: Uuid;
|
|
665
431
|
}) => Promise<string>;
|
|
666
432
|
/**
|
|
667
433
|
* OPTIONAL. A FILE DRAWN AS A PICTURE — the gallery card's cover when the view's picture column
|
|
@@ -670,7 +436,7 @@ interface RecordsUiHost {
|
|
|
670
436
|
* the cover says in words that this screen cannot draw files, never a broken image.
|
|
671
437
|
*/
|
|
672
438
|
fileImage?: (args: {
|
|
673
|
-
fileId: Uuid
|
|
439
|
+
fileId: Uuid;
|
|
674
440
|
alt: string;
|
|
675
441
|
}) => ReactNode;
|
|
676
442
|
/**
|
|
@@ -750,7 +516,7 @@ interface RecordsUiHost {
|
|
|
750
516
|
*/
|
|
751
517
|
upload?: (file: File) => Promise<{
|
|
752
518
|
ok: true;
|
|
753
|
-
fileId: Uuid
|
|
519
|
+
fileId: Uuid;
|
|
754
520
|
} | {
|
|
755
521
|
ok: false;
|
|
756
522
|
reason: string;
|
|
@@ -769,7 +535,7 @@ interface RecordsUiHost {
|
|
|
769
535
|
pickFiles?: (ask: {
|
|
770
536
|
multiple: boolean;
|
|
771
537
|
accept?: string;
|
|
772
|
-
}) => Promise<Uuid
|
|
538
|
+
}) => Promise<Uuid[] | null>;
|
|
773
539
|
/**
|
|
774
540
|
* Where this app serves its PUBLIC pages from, when that is not the origin
|
|
775
541
|
* the screen is running on. A form's link is built here, so an owner copying
|
|
@@ -789,7 +555,7 @@ interface RecordsUiHost {
|
|
|
789
555
|
* an empty picker that looks like "you have no views".
|
|
790
556
|
*/
|
|
791
557
|
savedViews?: () => Promise<Array<{
|
|
792
|
-
id: Uuid
|
|
558
|
+
id: Uuid;
|
|
793
559
|
name: string;
|
|
794
560
|
}>>;
|
|
795
561
|
/**
|
|
@@ -827,8 +593,8 @@ interface RecordsUiHost {
|
|
|
827
593
|
* stamped with it). Unbound, nothing is drawn.
|
|
828
594
|
*/
|
|
829
595
|
recordSections?: (target: {
|
|
830
|
-
tableId: Uuid
|
|
831
|
-
recordId: Uuid
|
|
596
|
+
tableId: Uuid;
|
|
597
|
+
recordId: Uuid;
|
|
832
598
|
}) => ReactNode;
|
|
833
599
|
/**
|
|
834
600
|
* OPTIONAL. THE PLATFORM'S ONE RICH EDITOR, for a record page's body (lane TABLE-EXPERIENCE,
|
|
@@ -858,8 +624,8 @@ interface RecordsUiHost {
|
|
|
858
624
|
* available here.
|
|
859
625
|
*/
|
|
860
626
|
linkRecord?: (target: {
|
|
861
|
-
tableId: Uuid
|
|
862
|
-
recordId: Uuid
|
|
627
|
+
tableId: Uuid;
|
|
628
|
+
recordId: Uuid;
|
|
863
629
|
name: string;
|
|
864
630
|
}) => void;
|
|
865
631
|
/**
|
|
@@ -878,8 +644,8 @@ interface RecordsUiHost {
|
|
|
878
644
|
* not render at all.
|
|
879
645
|
*/
|
|
880
646
|
talkToRecord?: (target: {
|
|
881
|
-
tableId: Uuid
|
|
882
|
-
recordId: Uuid
|
|
647
|
+
tableId: Uuid;
|
|
648
|
+
recordId: Uuid;
|
|
883
649
|
title: string;
|
|
884
650
|
}) => void;
|
|
885
651
|
/**
|
|
@@ -900,8 +666,8 @@ interface RecordsUiHost {
|
|
|
900
666
|
* job, and the agent is handed exactly what the person was looking at.
|
|
901
667
|
*/
|
|
902
668
|
runAgentAction?: (target: {
|
|
903
|
-
tableId: Uuid
|
|
904
|
-
recordId: Uuid
|
|
669
|
+
tableId: Uuid;
|
|
670
|
+
recordId: Uuid;
|
|
905
671
|
title: string;
|
|
906
672
|
action: string;
|
|
907
673
|
prompt: string;
|
|
@@ -990,9 +756,9 @@ interface RecordsUiHost {
|
|
|
990
756
|
* Dashboards area lists no pages and offers no "New page" — absent, never dead.
|
|
991
757
|
*/
|
|
992
758
|
pageHref?: (target: {
|
|
993
|
-
pageId: Uuid
|
|
759
|
+
pageId: Uuid;
|
|
994
760
|
} | {
|
|
995
|
-
newOnTable: Uuid
|
|
761
|
+
newOnTable: Uuid;
|
|
996
762
|
}) => string;
|
|
997
763
|
/**
|
|
998
764
|
* OPTIONAL. ASK THE AGENT TO CHANGE THIS DASHBOARD (SCR-16).
|
|
@@ -1028,6 +794,20 @@ interface RecordsUiHost {
|
|
|
1028
794
|
*/
|
|
1029
795
|
onAskForOne?: (ask: AgentBuildAsk) => void;
|
|
1030
796
|
}
|
|
797
|
+
/** What the formula box hands the host's help (`formulaHelp`). */
|
|
798
|
+
interface FormulaHelpAsk {
|
|
799
|
+
tableId: Uuid;
|
|
800
|
+
/** The formula as it stands in the box (may be empty). */
|
|
801
|
+
text: string;
|
|
802
|
+
/** The table's other columns, the ones the formula may read as {Name}. */
|
|
803
|
+
columns: readonly Field[];
|
|
804
|
+
/** The store's reading of what is wrong with the text, when it does not parse. */
|
|
805
|
+
mistake: string | null;
|
|
806
|
+
/** The functions the store works out, as a person types them. */
|
|
807
|
+
functions: readonly string[];
|
|
808
|
+
/** Put a formula into the box (unsaved). */
|
|
809
|
+
onFormula: (text: string) => void;
|
|
810
|
+
}
|
|
1031
811
|
/** What a person is asking an agent to make, and where they were standing. */
|
|
1032
812
|
interface AgentBuildAsk {
|
|
1033
813
|
/**
|
|
@@ -1035,7 +815,7 @@ interface AgentBuildAsk {
|
|
|
1035
815
|
* agent adds it through the store's field door, held for approval like every agent schema change.
|
|
1036
816
|
*/
|
|
1037
817
|
kind: "form" | "booking" | "portal" | "digest" | "column";
|
|
1038
|
-
tableId: Uuid
|
|
818
|
+
tableId: Uuid;
|
|
1039
819
|
/** The sentence this package would say. A host opens its composer with it. */
|
|
1040
820
|
suggestion: string;
|
|
1041
821
|
}
|
|
@@ -1047,16 +827,16 @@ interface AgentBuildAsk {
|
|
|
1047
827
|
* counted, which is the one way this control can lie.
|
|
1048
828
|
*/
|
|
1049
829
|
interface OpenRecordsAsk {
|
|
1050
|
-
tableId: Uuid
|
|
830
|
+
tableId: Uuid;
|
|
1051
831
|
filter: Record<string, AggregateFilter>;
|
|
1052
832
|
/** What the person clicked, in words: "Jobs by stage this month · Awaiting parts". */
|
|
1053
833
|
label: string;
|
|
1054
834
|
}
|
|
1055
835
|
/** Which dashboard a re-ask is about, so the agent re-states it rather than making a second one. */
|
|
1056
836
|
interface ReaskContext {
|
|
1057
|
-
tableId: Uuid
|
|
837
|
+
tableId: Uuid;
|
|
1058
838
|
/** Null while the canvas has no dashboard yet — the answer is the first one. */
|
|
1059
|
-
dashboardId: Uuid
|
|
839
|
+
dashboardId: Uuid | null;
|
|
1060
840
|
dashboardName: string | null;
|
|
1061
841
|
}
|
|
1062
842
|
/**
|
|
@@ -1068,8 +848,8 @@ interface ReaskContext {
|
|
|
1068
848
|
interface ShareSubject {
|
|
1069
849
|
kind: "record" | "table";
|
|
1070
850
|
/** The store is keyed (organization_id, id); this package never guesses one. */
|
|
1071
|
-
organizationId: Uuid
|
|
1072
|
-
subjectId: Uuid
|
|
851
|
+
organizationId: Uuid;
|
|
852
|
+
subjectId: Uuid;
|
|
1073
853
|
/** What to call it on screen. Never empty — the id's first eight characters at worst. */
|
|
1074
854
|
name: string;
|
|
1075
855
|
/** Close the dialog. The control owns the open/closed state, the host owns the dialog. */
|
|
@@ -1097,7 +877,7 @@ interface PendingCapture {
|
|
|
1097
877
|
* tell a retry from a second capture.
|
|
1098
878
|
*/
|
|
1099
879
|
clientKey: string;
|
|
1100
|
-
tableId: Uuid
|
|
880
|
+
tableId: Uuid;
|
|
1101
881
|
payload: Record<string, unknown>;
|
|
1102
882
|
capturedAt: string;
|
|
1103
883
|
device: string;
|
|
@@ -1164,7 +944,7 @@ declare function useTableRights(table: Table | null | undefined): TableRights;
|
|
|
1164
944
|
* colleague at Editor inside a table she holds at Viewer. The grid used to
|
|
1165
945
|
* label that row "viewer" while the store let her write to it.
|
|
1166
946
|
*/
|
|
1167
|
-
declare function useRecordRights(recordId: Uuid
|
|
947
|
+
declare function useRecordRights(recordId: Uuid | null): WhatYouMayDo;
|
|
1168
948
|
/**
|
|
1169
949
|
* The same question for a whole page of records, in ONE call — the door takes a
|
|
1170
950
|
* list precisely so a grid never makes one call per row.
|
|
@@ -1173,7 +953,37 @@ declare function useRecordRights(recordId: Uuid$1 | null): WhatYouMayDo;
|
|
|
1173
953
|
* table level already admits editing, every row it returned is editable and
|
|
1174
954
|
* there is nothing a per-record answer could add.
|
|
1175
955
|
*/
|
|
1176
|
-
declare function useRowRights(rowIds: Uuid
|
|
956
|
+
declare function useRowRights(rowIds: Uuid[], enabled: boolean): (rowId: Uuid) => WhatYouMayDo | null;
|
|
957
|
+
|
|
958
|
+
/** The functions the store's evaluator answers, from its generated vocabulary. */
|
|
959
|
+
declare const FORMULA_FUNCTIONS: string[];
|
|
960
|
+
|
|
961
|
+
/** The columns a record may be named by, in the table's order. Pure. */
|
|
962
|
+
declare function rowLabelChoices(fields: readonly Field$1[]): Array<{
|
|
963
|
+
value: string;
|
|
964
|
+
label: string;
|
|
965
|
+
}>;
|
|
966
|
+
/** The patch that keeps a description: the table's other metadata is carried, never dropped. Pure. */
|
|
967
|
+
declare function descriptionPatch(table: Pick<Table$1, "metadata">, text: string): {
|
|
968
|
+
metadata: Record<string, unknown>;
|
|
969
|
+
};
|
|
970
|
+
declare function TableDetails({ tableId, table, fields, onSaved, }: {
|
|
971
|
+
tableId: Uuid$1;
|
|
972
|
+
table: Table$1;
|
|
973
|
+
fields: readonly Field$1[];
|
|
974
|
+
onSaved?: (() => void) | undefined;
|
|
975
|
+
}): react.JSX.Element;
|
|
976
|
+
/**
|
|
977
|
+
* WRITE A TABLE'S DESCRIPTION, from outside this panel (an agent's confirmed write, Sheet
|
|
978
|
+
* retirement): the table read fresh, the same patch and the same version-checked door the panel's
|
|
979
|
+
* own Save uses, and the same shape nudge, so every open screen re-reads it.
|
|
980
|
+
*/
|
|
981
|
+
declare function saveTableDescription(client: Pick<RecordsClient, "tableRead" | "revisions" | "recordHeaders" | "recordUpdate" | "recordUpdateAddingChoices">, tableId: Uuid$1, text: string): Promise<{
|
|
982
|
+
ok: true;
|
|
983
|
+
} | {
|
|
984
|
+
ok: false;
|
|
985
|
+
says: string;
|
|
986
|
+
}>;
|
|
1177
987
|
|
|
1178
988
|
/**
|
|
1179
989
|
* MACHINE IDENTITY, BY SHAPE — never by a list of the sentences we happen to
|
|
@@ -1335,13 +1145,13 @@ declare function cardTitleField(fields: readonly Field[], titleKey: string | nul
|
|
|
1335
1145
|
/** What a person has chosen: the table, and optionally which of its columns to show. */
|
|
1336
1146
|
interface ReferenceChoice {
|
|
1337
1147
|
/** The Table whose records this column offers. `""` until one is picked. */
|
|
1338
|
-
targetTableId: Uuid
|
|
1148
|
+
targetTableId: Uuid | "";
|
|
1339
1149
|
/** Which of that Table's columns to show. `null` = the Table's own reference column. */
|
|
1340
1150
|
display: RelationDisplay | null;
|
|
1341
1151
|
}
|
|
1342
1152
|
interface ReferenceBuilderProps {
|
|
1343
1153
|
/** The Table the column being built lives on, so "this table" can be marked. */
|
|
1344
|
-
tableId: Uuid
|
|
1154
|
+
tableId: Uuid;
|
|
1345
1155
|
value: ReferenceChoice;
|
|
1346
1156
|
onChange: (next: ReferenceChoice) => void;
|
|
1347
1157
|
/**
|
|
@@ -1378,7 +1188,7 @@ interface PersonPickerProps {
|
|
|
1378
1188
|
}
|
|
1379
1189
|
/** A Person record in the kernel Table, as this picker needs to read it. */
|
|
1380
1190
|
interface PersonRecord {
|
|
1381
|
-
id: Uuid
|
|
1191
|
+
id: Uuid;
|
|
1382
1192
|
userId: string | null;
|
|
1383
1193
|
name: string;
|
|
1384
1194
|
}
|
|
@@ -1389,9 +1199,9 @@ declare function memberName(member: OrganizationMember): string;
|
|
|
1389
1199
|
* an agent filling a person field server-side needs exactly the same answer,
|
|
1390
1200
|
* and two implementations of "which record is this person" is two answers.
|
|
1391
1201
|
*/
|
|
1392
|
-
declare function personRecordForMember(client: RecordsClient, personTableId: Uuid
|
|
1202
|
+
declare function personRecordForMember(client: RecordsClient, personTableId: Uuid, people: PersonRecord[], member: OrganizationMember): Promise<{
|
|
1393
1203
|
ok: true;
|
|
1394
|
-
data: Uuid
|
|
1204
|
+
data: Uuid;
|
|
1395
1205
|
} | {
|
|
1396
1206
|
ok: false;
|
|
1397
1207
|
error: RecordsError;
|
|
@@ -1400,23 +1210,23 @@ declare function PersonPicker({ field, value, onChange, disabled, id, className,
|
|
|
1400
1210
|
|
|
1401
1211
|
interface RecordVersions {
|
|
1402
1212
|
/** The version the person saw this record at; waits for the read of freshly drawn rows. `null` = unread. */
|
|
1403
|
-
seen: (id: Uuid
|
|
1213
|
+
seen: (id: Uuid) => Promise<number | null>;
|
|
1404
1214
|
/** The same, for many records at once. */
|
|
1405
|
-
seenMany: (ids: readonly Uuid
|
|
1215
|
+
seenMany: (ids: readonly Uuid[]) => Promise<Map<Uuid, number | null>>;
|
|
1406
1216
|
/** A write this screen made moved the record on (a version only goes up). */
|
|
1407
|
-
wrote: (id: Uuid
|
|
1217
|
+
wrote: (id: Uuid, version: number) => void;
|
|
1408
1218
|
/**
|
|
1409
1219
|
* Read these records' versions again now: the person pressed Reload, or the store refused a write
|
|
1410
1220
|
* because somebody else won (`PT409`) — the rows are re-read too, so the next write is against what
|
|
1411
1221
|
* the person then sees. A change that moved only the version (who sees the row) never re-reads by
|
|
1412
1222
|
* content, so without this the row stayed refused until the screen was opened again (verifier V10).
|
|
1413
1223
|
*/
|
|
1414
|
-
refresh: (ids: readonly Uuid
|
|
1224
|
+
refresh: (ids: readonly Uuid[]) => void;
|
|
1415
1225
|
}
|
|
1416
1226
|
|
|
1417
1227
|
/** Which cell is open. A grid opens exactly one at a time, like every other grid. */
|
|
1418
1228
|
interface CellAddress {
|
|
1419
|
-
rowId: Uuid
|
|
1229
|
+
rowId: Uuid;
|
|
1420
1230
|
key: string;
|
|
1421
1231
|
}
|
|
1422
1232
|
/** What one cell is doing right now, so nothing about it is guessed by a caller. */
|
|
@@ -1427,6 +1237,14 @@ interface CellRefusal {
|
|
|
1427
1237
|
conflict: WriteConflict | null;
|
|
1428
1238
|
/** The value that was being written, so Retry can write it again. */
|
|
1429
1239
|
attempted: unknown;
|
|
1240
|
+
/**
|
|
1241
|
+
* THE WRITE NEVER REACHED THE STORE (offline, `unreachable`): nothing was refused. The typed value
|
|
1242
|
+
* stays in the cell, the cell says "Not saved", and it is sent again when the browser is back
|
|
1243
|
+
* online (`unsentWrites`). Try now / Discard meanwhile.
|
|
1244
|
+
*/
|
|
1245
|
+
unsent?: boolean | undefined;
|
|
1246
|
+
/** What the edit started from, so a resend is judged against the same base. */
|
|
1247
|
+
base?: unknown;
|
|
1430
1248
|
}
|
|
1431
1249
|
declare function fieldIsEditable(field: Field): boolean;
|
|
1432
1250
|
interface GridEditing {
|
|
@@ -1437,8 +1255,8 @@ interface GridEditing {
|
|
|
1437
1255
|
draft: unknown;
|
|
1438
1256
|
/** The open cell's editor reports every keystroke to the session. */
|
|
1439
1257
|
type: (value: unknown) => void;
|
|
1440
|
-
stateOf: (rowId: Uuid
|
|
1441
|
-
refusalOf: (rowId: Uuid
|
|
1258
|
+
stateOf: (rowId: Uuid, key: string) => CellState;
|
|
1259
|
+
refusalOf: (rowId: Uuid, key: string) => CellRefusal | null;
|
|
1442
1260
|
/**
|
|
1443
1261
|
* Open a cell's editor. `seed` is what the person TYPED to open it (type-to-edit: a letter, an
|
|
1444
1262
|
* IME composition, an Option/AltGr character): a column a person types into opens holding
|
|
@@ -1473,34 +1291,36 @@ interface GridEditing {
|
|
|
1473
1291
|
* versioned, optimistic write path every other cell uses — the refusal, the conflict and
|
|
1474
1292
|
* the "Try again" beside it are identical.
|
|
1475
1293
|
*/
|
|
1476
|
-
setCell: (rowId: Uuid
|
|
1294
|
+
setCell: (rowId: Uuid, key: string, value: unknown) => void;
|
|
1477
1295
|
/**
|
|
1478
1296
|
* A VERSION CONFLICT ONLY: write the attempted value again, on top of the
|
|
1479
1297
|
* version the store said won. Never offered for a refusal of the VALUE — the
|
|
1480
1298
|
* same value would be refused the same way (VERIFIER-15 H2).
|
|
1481
1299
|
*/
|
|
1482
|
-
retry: (rowId: Uuid
|
|
1300
|
+
retry: (rowId: Uuid, key: string) => void;
|
|
1483
1301
|
/** A VERSION CONFLICT ONLY: drop the edit and show what the other person wrote. */
|
|
1484
|
-
keepTheirs: (rowId: Uuid
|
|
1302
|
+
keepTheirs: (rowId: Uuid, key: string) => void;
|
|
1303
|
+
/** AN UNSENT WRITE ONLY: send it again now (it also goes by itself when the browser is back online). */
|
|
1304
|
+
tryNow: (rowId: Uuid, key: string) => void;
|
|
1485
1305
|
/**
|
|
1486
1306
|
* KEEP EDITING — the refused cell opens again HOLDING WHAT WAS TYPED, so the
|
|
1487
1307
|
* person corrects `-3` rather than typing it from nothing (lane
|
|
1488
1308
|
* RECORDS-UI-FIX, VERIFIER-15 H2).
|
|
1489
1309
|
*/
|
|
1490
|
-
keepEditing: (rowId: Uuid
|
|
1310
|
+
keepEditing: (rowId: Uuid, key: string) => void;
|
|
1491
1311
|
/** DISCARD — throw the refused value away; the cell shows what is stored. */
|
|
1492
|
-
discard: (rowId: Uuid
|
|
1312
|
+
discard: (rowId: Uuid, key: string) => void;
|
|
1493
1313
|
/**
|
|
1494
1314
|
* FORGET WHAT THIS SESSION DREW FOR THESE CELLS — after a change made OUTSIDE the editor (an
|
|
1495
1315
|
* undo, a bulk change) the store holds a new value and a new version, so the optimistic value
|
|
1496
1316
|
* and the version this session held for the row are both stale.
|
|
1497
1317
|
*/
|
|
1498
1318
|
forget: (cells: ReadonlyArray<{
|
|
1499
|
-
rowId: Uuid
|
|
1319
|
+
rowId: Uuid;
|
|
1500
1320
|
key: string;
|
|
1501
1321
|
}>) => void;
|
|
1502
1322
|
/** Soft delete, through the store's own door. Answers the store's refusal, or null. */
|
|
1503
|
-
remove: (rowId: Uuid
|
|
1323
|
+
remove: (rowId: Uuid) => Promise<RecordsError | null>;
|
|
1504
1324
|
/** Write an empty record and open its first editable cell. */
|
|
1505
1325
|
addRecord: () => Promise<RecordsError | null>;
|
|
1506
1326
|
/** The last refusal from a delete or an add, for the grid to print. */
|
|
@@ -1513,10 +1333,10 @@ interface GridEditing {
|
|
|
1513
1333
|
* grid hands it to the data table as `rowVersion`, so a keystroke, a save or a refusal redraws
|
|
1514
1334
|
* the ONE row it belongs to and no other.
|
|
1515
1335
|
*/
|
|
1516
|
-
rowSignature: (rowId: Uuid
|
|
1336
|
+
rowSignature: (rowId: Uuid) => readonly unknown[];
|
|
1517
1337
|
}
|
|
1518
1338
|
interface Options {
|
|
1519
|
-
tableId: Uuid
|
|
1339
|
+
tableId: Uuid;
|
|
1520
1340
|
fields: Field[];
|
|
1521
1341
|
rows: ReadRow[];
|
|
1522
1342
|
/** Re-read the page once the store has accepted something. */
|
|
@@ -1540,7 +1360,7 @@ interface Options {
|
|
|
1540
1360
|
* write to it. Unbound, every row follows the table, which is what the
|
|
1541
1361
|
* ordinary case is.
|
|
1542
1362
|
*/
|
|
1543
|
-
mayWriteRow?: ((rowId: Uuid
|
|
1363
|
+
mayWriteRow?: ((rowId: Uuid) => boolean) | undefined;
|
|
1544
1364
|
/**
|
|
1545
1365
|
* A CELL THE STORE ACCEPTED, with what it held before and what it holds now (merge tranche 6d):
|
|
1546
1366
|
* the merged grid's undo pushes one step per accepted cell. Unbound, nothing is told.
|
|
@@ -1552,7 +1372,7 @@ interface Options {
|
|
|
1552
1372
|
versions?: RecordVersions | undefined;
|
|
1553
1373
|
/** One cell the store took: its value before and after, and the record version that write made. */
|
|
1554
1374
|
onWritten?: ((write: {
|
|
1555
|
-
rowId: Uuid
|
|
1375
|
+
rowId: Uuid;
|
|
1556
1376
|
key: string;
|
|
1557
1377
|
before: unknown;
|
|
1558
1378
|
after: unknown;
|
|
@@ -1612,7 +1432,7 @@ declare function GridCell({ field, row, editing, canWrite, whyNot, format, onAsk
|
|
|
1612
1432
|
* looking at. Bound by the host; absent, no control is drawn at all, because
|
|
1613
1433
|
* a control that opens nothing is the thing this package exists to prevent.
|
|
1614
1434
|
*/
|
|
1615
|
-
onAskWhoChanged?: ((fieldKey: string, recordId: Uuid
|
|
1435
|
+
onAskWhoChanged?: ((fieldKey: string, recordId: Uuid) => void) | undefined;
|
|
1616
1436
|
}): react.JSX.Element;
|
|
1617
1437
|
|
|
1618
1438
|
/**
|
|
@@ -1644,35 +1464,279 @@ declare function RefusalLine({ error, className }: {
|
|
|
1644
1464
|
}): react.JSX.Element;
|
|
1645
1465
|
|
|
1646
1466
|
/**
|
|
1647
|
-
* A refusal in this package's own words.
|
|
1467
|
+
* A refusal in this package's own words.
|
|
1468
|
+
*
|
|
1469
|
+
* @param code what KIND of refusal — picks the notice's title and its fallback remedy.
|
|
1470
|
+
* @param sentence what happened, for a person.
|
|
1471
|
+
* @param remedy what to do now, when this call site knows better than the code's default.
|
|
1472
|
+
* @param diagnostic an engineer's note (a thrown message, a status) — rendered out of sight.
|
|
1473
|
+
*/
|
|
1474
|
+
declare function refusal(code: RecordsErrorCode, sentence: string, remedy?: string | null, diagnostic?: string | null): RecordsError;
|
|
1475
|
+
/**
|
|
1476
|
+
* A refusal made from something THROWN in the browser. The thrown text is an
|
|
1477
|
+
* engineer's (a parser's "Unexpected token } in JSON at position 14", a
|
|
1478
|
+
* library's stack) and goes out of sight; the person reads `sentence`.
|
|
1479
|
+
*/
|
|
1480
|
+
declare function refusalFromThrown(thrown: unknown, sentence: string, remedy?: string | null, code?: RecordsErrorCode): RecordsError;
|
|
1481
|
+
/**
|
|
1482
|
+
* The store's refusal when there is one, otherwise this package's own sentence —
|
|
1483
|
+
* for the call sites whose answer MAY carry an error (`res.error?.message ?? "…"`
|
|
1484
|
+
* was the old shape, and it printed the store's message raw).
|
|
1485
|
+
*/
|
|
1486
|
+
declare function refusalOr(error: RecordsError | null | undefined, code: RecordsErrorCode, sentence: string): RecordsError;
|
|
1487
|
+
/**
|
|
1488
|
+
* Whatever a host callback threw, as a refusal: the store's own `RecordsError`
|
|
1489
|
+
* when that is what arrived (it is drawn with its own words and remedy), and
|
|
1490
|
+
* otherwise `refusalFromThrown` — the thrown text out of sight, `sentence` in view.
|
|
1491
|
+
*/
|
|
1492
|
+
declare function asRefusal(thrown: unknown, sentence: string, remedy?: string | null, code?: RecordsErrorCode): RecordsError;
|
|
1493
|
+
|
|
1494
|
+
/**
|
|
1495
|
+
* HOW A TABLE LOOKS — colors, formats and the frozen column.
|
|
1496
|
+
*
|
|
1497
|
+
* THE SPLIT, AND WHY IT IS THIS ONE. A Field declares WHAT it holds: a
|
|
1498
|
+
* currency, a percent, a date, a person. A VIEW declares HOW that reads and
|
|
1499
|
+
* what it is worth looking at: two decimal places or none, tint the row when
|
|
1500
|
+
* Status is Blocked, keep Name in place while the rest scrolls. Airtable draws
|
|
1501
|
+
* the line in exactly this place, and it has to be here: two people read one
|
|
1502
|
+
* table two different ways, and neither reading is a fact about the records.
|
|
1503
|
+
*
|
|
1504
|
+
* So nothing in this module is a new column on a Field and nothing here needed
|
|
1505
|
+
* a migration. A presentation lives on the saved-view record (`views.ts`), which
|
|
1506
|
+
* is an ordinary record of an ordinary Table — which means an agent sets it
|
|
1507
|
+
* through the same `records` tool it uses for everything else, and it travels
|
|
1508
|
+
* with the table the way every other record does.
|
|
1509
|
+
*
|
|
1510
|
+
* A FIELD STILL GETS ITS MONEY RIGHT WITH NO CONFIGURATION. `formatForField`
|
|
1511
|
+
* reads the Field's OWN declaration — a `currency` parity type with unit `$`, a
|
|
1512
|
+
* `percent`, a `datetime` with `config.kind` — and returns the format that
|
|
1513
|
+
* follows from it. The view's `formats` map only OVERRIDES that. A table nobody
|
|
1514
|
+
* has ever styled still shows `$1,250.50` and `45%`.
|
|
1515
|
+
*/
|
|
1516
|
+
|
|
1517
|
+
/**
|
|
1518
|
+
* SECTIONS BY A FIELD — the view's own grouping.
|
|
1519
|
+
*
|
|
1520
|
+
* `field` is a Field KEY, exactly like `frozen` and the keys of `formats`,
|
|
1521
|
+
* because a view is written against the Table's declaration and never against
|
|
1522
|
+
* whatever id a screen happened to build its columns with.
|
|
1523
|
+
*
|
|
1524
|
+
* `aggregates` is keyed by Field key too, and `collapsed` holds the data
|
|
1525
|
+
* table's own group keys (`s:Blocked`, `n:3`, `empty`), which is what the
|
|
1526
|
+
* primitive emits and the only thing that survives a value rendering the same
|
|
1527
|
+
* text as another.
|
|
1528
|
+
*
|
|
1529
|
+
* NOTHING HERE IS EVER CALLED `valueOf`, `toString` or `hasOwnProperty`: every
|
|
1530
|
+
* object in JavaScript already has all three, so an optional field by one of
|
|
1531
|
+
* those names is NEVER absent and a `config.valueOf ? … : …` check silently
|
|
1532
|
+
* reads `Object.prototype`. It cost the primitive a whole grouping once.
|
|
1533
|
+
*/
|
|
1534
|
+
type GridGrouping = {
|
|
1535
|
+
/** The Field key whose value makes the sections. */
|
|
1536
|
+
field: string;
|
|
1537
|
+
/** Per-Field-key subtotal on every section header. */
|
|
1538
|
+
aggregates?: Record<string, GroupAggregateSpec>;
|
|
1539
|
+
/** Section order. The primitive's default is `value-asc`; blanks sort last. */
|
|
1540
|
+
order?: GroupOrder;
|
|
1541
|
+
/** The sections this view keeps shut, by the primitive's own group key. */
|
|
1542
|
+
collapsed?: string[];
|
|
1543
|
+
/** The grouped column drawn as a column too. Absent = it steps aside (the headers name its value). */
|
|
1544
|
+
showColumn?: boolean;
|
|
1545
|
+
/**
|
|
1546
|
+
* SUB-GROUPS (lane S1-PRIME VIEW-KEYS; ui-bench LISTS "sub-grouping"): up to two more levels
|
|
1547
|
+
* inside each section, by Field key. At most three levels in all — the store refuses a fourth
|
|
1548
|
+
* (`custom.view_declare`). A layout that draws one level ignores the rest; it never drops them,
|
|
1549
|
+
* because this list is parsed and written back whole with the rest of the look.
|
|
1550
|
+
*/
|
|
1551
|
+
then?: GridSubGroup[];
|
|
1552
|
+
/**
|
|
1553
|
+
* DRILL (lane DRILL-TABLE-PRIMITIVE): the Dimension pivoted across the top — a Field key, or
|
|
1554
|
+
* `<key>:<grain>` for a date cut into periods.
|
|
1555
|
+
*/
|
|
1556
|
+
across?: string;
|
|
1557
|
+
/** DRILL: the period `field` is cut into when it is a date (`month`); the store keeps `field` a Field key. */
|
|
1558
|
+
grain?: string;
|
|
1559
|
+
/** The Measures shown ("what to display"), by the store's own keys (`count`, `sum_quantity`). */
|
|
1560
|
+
show?: string[];
|
|
1561
|
+
/** The drill trail, in order: each crumb a Dimension reference and the value it narrowed to. */
|
|
1562
|
+
trail?: GridDrillStep[];
|
|
1563
|
+
};
|
|
1564
|
+
/** One crumb of a saved drill trail. `value: null` is "no value". */
|
|
1565
|
+
type GridDrillStep = {
|
|
1566
|
+
dim: string;
|
|
1567
|
+
value: string | null;
|
|
1568
|
+
};
|
|
1569
|
+
/** One sub-group level: a Field key and its section order. */
|
|
1570
|
+
type GridSubGroup = {
|
|
1571
|
+
field: string;
|
|
1572
|
+
order?: GroupOrder;
|
|
1573
|
+
grain?: string;
|
|
1574
|
+
};
|
|
1575
|
+
/** Everything a view says about how its table LOOKS. */
|
|
1576
|
+
type GridPresentation = {
|
|
1577
|
+
/** Color-by-a-column, rules and manual highlights. */
|
|
1578
|
+
style?: TableStyle;
|
|
1579
|
+
/** Per-column format overrides, by the Field's key. */
|
|
1580
|
+
formats?: Record<string, FieldFormatConfig>;
|
|
1581
|
+
/**
|
|
1582
|
+
* The columns that stay in place while the table scrolls sideways, by Field
|
|
1583
|
+
* key. Only the LEADING run of the view's column order can actually freeze —
|
|
1584
|
+
* the data table decides that, and declines rather than pinning a column at a
|
|
1585
|
+
* guessed offset.
|
|
1586
|
+
*/
|
|
1587
|
+
frozen?: string[];
|
|
1588
|
+
/** Collapsible sections by one Field, with subtotals on each header. */
|
|
1589
|
+
grouping?: GridGrouping;
|
|
1590
|
+
/**
|
|
1591
|
+
* The width a person dragged a column to, by Field key. SPARSE on purpose —
|
|
1592
|
+
* a view saved before widths existed carries none and still parses, and a
|
|
1593
|
+
* column nobody resized is left to the table's own measurement.
|
|
1594
|
+
*/
|
|
1595
|
+
widths?: Record<string, number>;
|
|
1596
|
+
/** The body row height this view remembers, in px. */
|
|
1597
|
+
rowHeight?: number;
|
|
1598
|
+
/**
|
|
1599
|
+
* Field keys hidden from this view — the SAME hidden-column list the grid's
|
|
1600
|
+
* own column picker holds, now given a place on the view so it survives a
|
|
1601
|
+
* reload and a layout switch reads the identical set gallery and grid agree
|
|
1602
|
+
* on, rather than a second "fields shown" list nobody kept in sync.
|
|
1603
|
+
*/
|
|
1604
|
+
hiddenFields?: string[];
|
|
1605
|
+
/**
|
|
1606
|
+
* THE FIELDS A CARD LEAVES OFF (board, list, gallery, calendar, timeline), by Field key — the
|
|
1607
|
+
* card's own choice, kept apart from `hiddenFields` so a board's "Card fields" never hides the
|
|
1608
|
+
* grid's columns when the view switches layout (v7 TABLE-EXPERIENCE, walk 2026-10-05). An empty
|
|
1609
|
+
* list is a choice (every field shown); absent means the card never chose.
|
|
1610
|
+
*/
|
|
1611
|
+
cardHidden?: string[];
|
|
1612
|
+
/**
|
|
1613
|
+
* THE ORDER A PERSON DRAGGED THE COLUMNS INTO, by Field key (merge tranche 6a). Sparse like
|
|
1614
|
+
* `widths`: a key it does not name keeps its Field's own place after the named ones, and a key
|
|
1615
|
+
* whose Field is gone is skipped — a column order can never hide or invent a column.
|
|
1616
|
+
*/
|
|
1617
|
+
columnOrder?: string[];
|
|
1618
|
+
/**
|
|
1619
|
+
* The gallery's card size, remembered the same way the grid remembers its
|
|
1620
|
+
* row height — a per-view look, not a global default.
|
|
1621
|
+
*/
|
|
1622
|
+
gallerySize?: "small" | "medium" | "large";
|
|
1623
|
+
/**
|
|
1624
|
+
* THIS VIEW'S OWN LAYOUT CHOICES, over the organization's `custom/grid_layout` knob (lane
|
|
1625
|
+
* DEFAULT-GRID-PARITY, TABLE-PARITY D1 D5 D6). Absent means "whatever the organization
|
|
1626
|
+
* says"; present is the view's word. `freezeFirst: false` is an explicit NO over an
|
|
1627
|
+
* organization that freezes the first column — an empty `frozen` cannot say that.
|
|
1628
|
+
*/
|
|
1629
|
+
wrap?: boolean;
|
|
1630
|
+
/** NOTION'S "WRAP COLUMN" (N5): the columns that wrap their text when the view as a whole does not. */
|
|
1631
|
+
wrapColumns?: string[];
|
|
1632
|
+
fit?: "auto" | "fit" | "scroll";
|
|
1633
|
+
freezeFirst?: boolean;
|
|
1634
|
+
/**
|
|
1635
|
+
* THE SUMMARY BAR (TABLE-PARITY F1): Field key → the store measure shown under that column
|
|
1636
|
+
* (`count`, `sum`, `avg`, `min`, `max`, `median`, `filled`, `empty`, `unique`), worked out
|
|
1637
|
+
* by `custom.record_aggregate` over the whole table.
|
|
1638
|
+
*/
|
|
1639
|
+
summaries?: Record<string, string>;
|
|
1640
|
+
/**
|
|
1641
|
+
* WHERE THE FOOTER SITS (lane TABLE-PAGE-CHROME, owner 2026-09-25) — the row count and the
|
|
1642
|
+
* pages: `sticky`, pinned to the bottom of the screen while the rows scroll (the older grid's
|
|
1643
|
+
* way, and the default when a view says nothing), or `inline`, right after the last row with
|
|
1644
|
+
* the page scrolling. Read by the Grid and a host's Sheet.
|
|
1645
|
+
*/
|
|
1646
|
+
footer?: FooterPlacement;
|
|
1647
|
+
};
|
|
1648
|
+
/** Where a grid's footer sits. */
|
|
1649
|
+
type FooterPlacement = "sticky" | "inline";
|
|
1650
|
+
/** What a view that says nothing gets — the older grid's pinned footer. */
|
|
1651
|
+
declare const DEFAULT_FOOTER: FooterPlacement;
|
|
1652
|
+
/** Where THIS view's footer sits, said or defaulted. */
|
|
1653
|
+
declare function footerOf(p: GridPresentation | null | undefined): FooterPlacement;
|
|
1654
|
+
declare const EMPTY_PRESENTATION: GridPresentation;
|
|
1655
|
+
/** A frozen column needs a known width, or the table declines to freeze at all. */
|
|
1656
|
+
declare const FROZEN_COLUMN_WIDTH = 200;
|
|
1657
|
+
/**
|
|
1658
|
+
* WHAT A ROW HEIGHT IS ALLOWED TO BE. Below the floor the text is clipped and
|
|
1659
|
+
* no editor fits; above the ceiling one record fills the screen. A view asking
|
|
1660
|
+
* for anything outside it is DROPPED rather than obeyed, because a saved look
|
|
1661
|
+
* must not be able to make a table unreadable — and the Fields' own heights
|
|
1662
|
+
* still draw, which is the tolerant half.
|
|
1663
|
+
*/
|
|
1664
|
+
declare const MIN_ROW_HEIGHT = 24;
|
|
1665
|
+
declare const MAX_ROW_HEIGHT = 96;
|
|
1666
|
+
/**
|
|
1667
|
+
* Read a presentation out of whatever the view record holds — an object, or the
|
|
1668
|
+
* JSON string a text field stores.
|
|
1648
1669
|
*
|
|
1649
|
-
*
|
|
1650
|
-
*
|
|
1651
|
-
*
|
|
1652
|
-
* @param diagnostic an engineer's note (a thrown message, a status) — rendered out of sight.
|
|
1670
|
+
* Tolerant in exactly the way `parseTableStyle` is: an unreadable half is
|
|
1671
|
+
* dropped and the rest still applies, because a table must keep drawing when
|
|
1672
|
+
* one piece of its styling goes out of date.
|
|
1653
1673
|
*/
|
|
1654
|
-
declare function
|
|
1674
|
+
declare function parseGridPresentation(raw: unknown): GridPresentation;
|
|
1675
|
+
/** True when nothing here would change how anything looks. */
|
|
1676
|
+
declare function presentationIsEmpty(p: GridPresentation): boolean;
|
|
1677
|
+
/** The string a view record stores. Empty string for "this view styles nothing". */
|
|
1678
|
+
declare function presentationDocument(p: GridPresentation): string;
|
|
1655
1679
|
/**
|
|
1656
|
-
*
|
|
1657
|
-
*
|
|
1658
|
-
*
|
|
1680
|
+
* The format a Field's OWN declaration implies, before any view says anything.
|
|
1681
|
+
*
|
|
1682
|
+
* Returns `undefined` for a Field whose value the record renderer already draws
|
|
1683
|
+
* better than a formatter could — a relation chip, a person, an attachment, a
|
|
1684
|
+
* choice — because handing those to a text formatter would REPLACE a working
|
|
1685
|
+
* control with a string.
|
|
1659
1686
|
*/
|
|
1660
|
-
declare function
|
|
1687
|
+
declare function formatForField(field: Field): FieldFormatConfig | undefined;
|
|
1688
|
+
declare function currencyCodeFor(unit: string | null | undefined): string;
|
|
1661
1689
|
/**
|
|
1662
|
-
* The
|
|
1663
|
-
*
|
|
1664
|
-
*
|
|
1690
|
+
* The color a value paints with when a view colors BY a column.
|
|
1691
|
+
*
|
|
1692
|
+
* NOTHING FAILS SILENTLY, so this never returns "no color" for a value that
|
|
1693
|
+
* exists. The store keeps a list column's choices as records of another Table,
|
|
1694
|
+
* and this grid has not read that Table's option colors, so the color is
|
|
1695
|
+
* derived from the value's own text: the same word always gets the same color,
|
|
1696
|
+
* different words get different ones, and `true` is green the way every
|
|
1697
|
+
* checklist reads. When those option colors do land, this is the ONE function
|
|
1698
|
+
* that changes and every screen follows.
|
|
1665
1699
|
*/
|
|
1666
|
-
declare
|
|
1700
|
+
declare const colorFromTheValue: ChoiceColorLookup;
|
|
1667
1701
|
/**
|
|
1668
|
-
*
|
|
1669
|
-
*
|
|
1670
|
-
*
|
|
1702
|
+
* G1's TABLE-LEVEL COLORS (`custom.table_decorations` / `client.tableDecorations`),
|
|
1703
|
+
* TRANSLATED INTO A `TableStyle` — the same document a saved view's own `presentation.style`
|
|
1704
|
+
* is, so one resolver (`resolveTableStyle`, below) can treat "the table's colors" and "this
|
|
1705
|
+
* view's colors" as two layers of the SAME thing instead of two unrelated systems.
|
|
1706
|
+
*
|
|
1707
|
+
* THE TRANSLATION IS NECESSARY AND IT IS THE ONLY ONE. G1 addresses a Field by its ID
|
|
1708
|
+
* (REC-17 — a column renamed keeps its color), because it is the STORE's own door; a
|
|
1709
|
+
* `TableStyle` addresses a Field by its KEY, because it reads straight off `row.document`,
|
|
1710
|
+
* which is keyed by Field key. A rule or a color-by whose Field has been deleted (its id no
|
|
1711
|
+
* longer resolves to a key) is dropped rather than crashing the whole style — a defect in
|
|
1712
|
+
* one rule costs that rule, never the read.
|
|
1671
1713
|
*/
|
|
1672
|
-
declare function
|
|
1714
|
+
declare function styleFromDecorations(decorations: TableDecorations | null | undefined, fields: readonly Field[]): TableStyle;
|
|
1715
|
+
/**
|
|
1716
|
+
* THE ONE PRESENTATION RESOLVER every colored surface in this package reads —
|
|
1717
|
+
* `Grid`, and (via `Card`) the kanban board, the calendar and the gallery.
|
|
1718
|
+
*
|
|
1719
|
+
* THE CLASS THIS CLOSES (lane UI-QUICK-1, TABLE-PARITY review, 2026-09-24). Threading
|
|
1720
|
+
* `view.presentation.style` into `Card` closed the instance the CALENDAR-GALLERY bench
|
|
1721
|
+
* found — a VIEW that had its own color-by looked right everywhere — but it left the
|
|
1722
|
+
* class open: a table whose colors are the ORGANIZATION's decorations (G1's
|
|
1723
|
+
* `custom.table_decorations` — "color rows by Account Type", "MAXED and NEAR rules" on
|
|
1724
|
+
* Arman's own Coding Accounts table) and whose views never set a `presentation.style` of
|
|
1725
|
+
* their own drew NOTHING, on the grid exactly as much as on every other layout, because
|
|
1726
|
+
* nothing in this package had ever read G1's door at all.
|
|
1727
|
+
*
|
|
1728
|
+
* TWO LAYERS, ONE DOCUMENT. The table's decorations are the base coat — what every view
|
|
1729
|
+
* of this table shows until a view says otherwise. A view's OWN `presentation.style` is
|
|
1730
|
+
* an override, piece by piece: a view that only ever set manual row highlights still
|
|
1731
|
+
* inherits the table's color-by and rules for everything it never touched, and a view
|
|
1732
|
+
* that fully redecorated (its own `colorBy` AND its own `rules`) is not haunted by a
|
|
1733
|
+
* table rule it meant to replace. Per-piece, never all-or-nothing, because a view is a
|
|
1734
|
+
* LOOK on top of the table, not a wholesale substitute for it.
|
|
1735
|
+
*/
|
|
1736
|
+
declare function resolveTableStyle(decorations: TableDecorations | null | undefined, fields: readonly Field[], viewStyle: TableStyle | undefined): TableStyle;
|
|
1673
1737
|
|
|
1674
|
-
/** Every surface a saved view is drawn by.
|
|
1675
|
-
type ViewKeyLayout = "grid" | "kanban" | "calendar" | "gallery" | "
|
|
1738
|
+
/** Every surface a saved view is drawn by. */
|
|
1739
|
+
type ViewKeyLayout = "grid" | "kanban" | "calendar" | "gallery" | "timeline" | "list";
|
|
1676
1740
|
/**
|
|
1677
1741
|
* 🚩 THE ONE SWITCH FOR THE TIMELINE'S STORE KEYS (lane VIEWS-AND-FIELDS, sublane TL).
|
|
1678
1742
|
*
|
|
@@ -1706,7 +1770,7 @@ interface ViewKeyDeclaration {
|
|
|
1706
1770
|
declare const VIEW_KEYS: readonly ViewKeyDeclaration[];
|
|
1707
1771
|
/**
|
|
1708
1772
|
* THE LAYOUTS THE STORE KEEPS ON A VIEW. `custom.view_keys()` judges a view's `layout` against its
|
|
1709
|
-
* own list (grid, kanban, calendar, gallery
|
|
1773
|
+
* own list (grid, kanban, calendar, gallery) and refuses any other word by name. A layout this
|
|
1710
1774
|
* package draws before the store keeps it — the timeline, 2026-10-02 — is never sent as a view's or a
|
|
1711
1775
|
* look's layout (`viewSettingsPatch`, `viewDocument`): it is drawn for this visit and says so. When the
|
|
1712
1776
|
* store's registry admits it, add it here and nothing else changes.
|
|
@@ -1789,7 +1853,7 @@ declare const LAYOUT_LABEL: Record<ViewLayout, string>;
|
|
|
1789
1853
|
* · gallery a FILE column for the card's picture. NOT blocking: the cards draw without one,
|
|
1790
1854
|
* so the offer sits above them instead of in place of them.
|
|
1791
1855
|
* · timeline a DATE column each bar starts on (the calendar's `dateField`). Blocking.
|
|
1792
|
-
* `PAGE_VIEWS`' two extra values (dashboards, archived)
|
|
1856
|
+
* `PAGE_VIEWS`' two extra values (dashboards, archived) read
|
|
1793
1857
|
* nothing a table can lack. This package ships no map layout; the day it does,
|
|
1794
1858
|
* `Record<ViewLayout, …>` below refuses to compile until the new layout names what it needs.
|
|
1795
1859
|
*/
|
|
@@ -1838,7 +1902,7 @@ type ViewOrder = "manual" | "sorted" | null;
|
|
|
1838
1902
|
interface SavedViewSpec {
|
|
1839
1903
|
name: string;
|
|
1840
1904
|
/** The Table this view looks at. */
|
|
1841
|
-
subject: Uuid
|
|
1905
|
+
subject: Uuid;
|
|
1842
1906
|
layout: ViewLayout;
|
|
1843
1907
|
/** Kanban: the Field whose value becomes a column. */
|
|
1844
1908
|
groupField?: string | null;
|
|
@@ -1876,7 +1940,7 @@ interface SavedViewSpec {
|
|
|
1876
1940
|
* The membership Rule. The STORE decides who is in this view; this is a
|
|
1877
1941
|
* reference to its Rule record, never a predicate this package evaluates.
|
|
1878
1942
|
*/
|
|
1879
|
-
ruleId?: Uuid
|
|
1943
|
+
ruleId?: Uuid | null;
|
|
1880
1944
|
/**
|
|
1881
1945
|
* THE FLAT FILTER a digest or a notify rule wrote the view with — the one shape
|
|
1882
1946
|
* `custom.record_filter_sql` compiles, by Field KEY. A view saved in the bar has
|
|
@@ -1913,59 +1977,12 @@ interface SavedViewSpec {
|
|
|
1913
1977
|
* pressed in both keeps the latest — how Airtable and Notion keep a view change.
|
|
1914
1978
|
*/
|
|
1915
1979
|
interface SavedView extends SavedViewSpec {
|
|
1916
|
-
id: Uuid
|
|
1980
|
+
id: Uuid;
|
|
1917
1981
|
/** Where the view came from when it was moved in (the mover, the S0 repair), else null. */
|
|
1918
1982
|
movedFrom: Record<string, unknown> | null;
|
|
1919
|
-
/**
|
|
1920
|
-
* THE WAY THIS TABLE IS MEANT TO BE LOOKED AT, when somebody decided one — a layout id the
|
|
1921
|
-
* host draws (`sheet`), read off the stored kind before `layout` folds it to the four the
|
|
1922
|
-
* package draws. Null when nobody designated one. See `designatedLayoutOf`.
|
|
1923
|
-
*/
|
|
1924
|
-
designatedLayout?: string | null;
|
|
1925
1983
|
}
|
|
1926
|
-
/**
|
|
1927
|
-
|
|
1928
|
-
*
|
|
1929
|
-
* "For something like my data tables, which are predetermined with a default view of 'Sheet'
|
|
1930
|
-
* I want to see … it just shows them the way it should in the default view. That's how you take
|
|
1931
|
-
* custom systems and fake like they're hard-coded builtin systems."
|
|
1932
|
-
*
|
|
1933
|
-
* A designation is a DELIBERATE write, never a click: a view whose stored kind is a layout the
|
|
1934
|
-
* HOST draws (`sheet` — a layout the store's view-keys registry declares, and one the layout
|
|
1935
|
-
* buttons never write onto a view). That is the ONE way a table is designated (lane
|
|
1936
|
-
* VIEW-KEYS-SHEET): the mover and the repair write `layout: "sheet"` on a copied older table's
|
|
1937
|
-
* default view; `moved_from` says only where a view came from and designates nothing. A package
|
|
1938
|
-
* kind (`grid`, `kanban`, …) is not a designation: picking Kanban writes `layout: "kanban"` onto
|
|
1939
|
-
* the view, and a click must never take the layout chooser away.
|
|
1940
|
-
*/
|
|
1941
|
-
declare function designatedLayoutOf(definition: Record<string, unknown> | null | undefined): string | null;
|
|
1942
|
-
/**
|
|
1943
|
-
* HOW THE TABLE OPENS, decided once from its default view and the layouts the host draws.
|
|
1944
|
-
*
|
|
1945
|
-
* · `designated` — the default view names a host layout this host registered: the page opens
|
|
1946
|
-
* IN it and offers no other layout by default (the others sit in the page's one menu);
|
|
1947
|
-
* · `chooser` — nothing designated (or the host does not draw what was designated): the
|
|
1948
|
-
* page opens on the view's own layout and shows the layout chooser.
|
|
1949
|
-
*
|
|
1950
|
-
* Only the DEFAULT view designates: a person who opens another saved view is choosing, and the
|
|
1951
|
-
* chooser is theirs.
|
|
1952
|
-
*/
|
|
1953
|
-
type TableOpening = {
|
|
1954
|
-
kind: "designated";
|
|
1955
|
-
hostLayout: string;
|
|
1956
|
-
} | {
|
|
1957
|
-
kind: "chooser";
|
|
1958
|
-
};
|
|
1959
|
-
declare function tableOpening(view: Pick<SavedView, "isDefault" | "designatedLayout"> | null | undefined, hostLayoutIds: readonly string[]): TableOpening;
|
|
1960
|
-
/**
|
|
1961
|
-
* THE TABLE'S DEFAULT VIEW WHEN MORE THAN ONE SAYS IT IS (lane DATA-V2-FACE-2).
|
|
1962
|
-
*
|
|
1963
|
-
* Two views can both claim the default: the mover's designated one (the older table's own, the
|
|
1964
|
-
* Sheet) and a page seed that a later move of the view bar's older store brings in beside it —
|
|
1965
|
-
* both named "All records", so the store's name order cannot tell them apart. A designation is a
|
|
1966
|
-
* deliberate write and a seed is not, so the designated default wins; then the first default.
|
|
1967
|
-
*/
|
|
1968
|
-
declare function defaultViewOf<V extends Pick<SavedView, "isDefault" | "designatedLayout">>(views: readonly V[]): V | undefined;
|
|
1984
|
+
/** THE TABLE'S DEFAULT VIEW: the first view that says it is. */
|
|
1985
|
+
declare function defaultViewOf<V extends Pick<SavedView, "isDefault">>(views: readonly V[]): V | undefined;
|
|
1969
1986
|
/**
|
|
1970
1987
|
* WHICH FIELD EACH LAYOUT CAN BE DRAWN FROM, decided from the FIELD'S OWN
|
|
1971
1988
|
* DECLARATION and never from the values it happens to hold.
|
|
@@ -2042,7 +2059,7 @@ declare function viewFromRow(row: SavedViewRow): SavedView;
|
|
|
2042
2059
|
* SAVE ONE NEW VIEW of a Table — the bar's "New view" and an agent's seed spec.
|
|
2043
2060
|
* One `view_declare` with no `view_id`; the answer is the new view's id.
|
|
2044
2061
|
*/
|
|
2045
|
-
declare function declareView(client: Pick<RecordsClient, "viewDeclare">, spec: SavedViewSpec): Promise<RecordsResult<Uuid
|
|
2062
|
+
declare function declareView(client: Pick<RecordsClient, "viewDeclare">, spec: SavedViewSpec): Promise<RecordsResult<Uuid>>;
|
|
2046
2063
|
/**
|
|
2047
2064
|
* WRITE A CHANGE ONTO A SAVED VIEW, AND KEEP IT.
|
|
2048
2065
|
*
|
|
@@ -2058,7 +2075,7 @@ declare function declareView(client: Pick<RecordsClient, "viewDeclare">, spec: S
|
|
|
2058
2075
|
* was removed, or belongs to a table this person cannot open — is handed back for
|
|
2059
2076
|
* the page to say through the one notice.
|
|
2060
2077
|
*/
|
|
2061
|
-
declare function saveViewPatch(client: Pick<RecordsClient, "viewDeclare">, tableId: Uuid
|
|
2078
|
+
declare function saveViewPatch(client: Pick<RecordsClient, "viewDeclare">, tableId: Uuid, viewId: Uuid, patch: Partial<SavedViewSpec>): Promise<RecordsResult<Uuid>>;
|
|
2062
2079
|
/**
|
|
2063
2080
|
* A PARTIAL change to a saved view, as the definition keys the door merges. Only
|
|
2064
2081
|
* the keys the caller actually changed are sent; a Field cleared (a board with no
|
|
@@ -2071,7 +2088,7 @@ interface ColumnSort {
|
|
|
2071
2088
|
field: string;
|
|
2072
2089
|
direction: "asc" | "desc";
|
|
2073
2090
|
}
|
|
2074
|
-
/** THE SORT CONTROL'S WORDS,
|
|
2091
|
+
/** THE SORT CONTROL'S WORDS, said once, so the grid and the board never read differently. */
|
|
2075
2092
|
declare const MANUAL_SORT: {
|
|
2076
2093
|
readonly label: "Manual";
|
|
2077
2094
|
readonly detail: "· set by hand";
|
|
@@ -2090,7 +2107,7 @@ declare const MANUAL_SORT: {
|
|
|
2090
2107
|
* above the table's own toolbar. It is now one compact control in the one toolbar row: a sort
|
|
2091
2108
|
* icon, the order in a word ("Manual", "Reset Date ↑"), a badge when a column sort is setting a
|
|
2092
2109
|
* hand-set order aside, and a popover that says the state in ONE line and offers the actions.
|
|
2093
|
-
* Airtable's sort button carries its state the same way.
|
|
2110
|
+
* Airtable's sort button carries its state the same way. Every layout draws it.
|
|
2094
2111
|
*/
|
|
2095
2112
|
interface SortStateAction {
|
|
2096
2113
|
key: string;
|
|
@@ -2115,7 +2132,7 @@ interface SortStateControlProps {
|
|
|
2115
2132
|
declare function SortStateControl({ label, line, attention, actions, mode }: SortStateControlProps): react.JSX.Element;
|
|
2116
2133
|
/** The sentence the popover says for a hand-ordered view, with or without a column sort over it. */
|
|
2117
2134
|
declare function handOrderLine(sortName: string | null, direction: "asc" | "desc" | null): string;
|
|
2118
|
-
/** The control's props for a hand-ordered view — the grid's
|
|
2135
|
+
/** The control's props for a hand-ordered view — the grid's words, once. */
|
|
2119
2136
|
declare function handOrderSortState(args: {
|
|
2120
2137
|
sortName: string | null;
|
|
2121
2138
|
direction: "asc" | "desc" | null;
|
|
@@ -2129,13 +2146,13 @@ declare function handOrderSortState(args: {
|
|
|
2129
2146
|
* key (`names.ts`) — and the cell is the value, rendered by its parity type and
|
|
2130
2147
|
* editable in place when an editing session is passed.
|
|
2131
2148
|
*/
|
|
2132
|
-
declare function columnForField(field: Field$1, editing?: GridEditing | null, mayWriteRow?: (rowId: Uuid) => boolean, whyNotRow?: (rowId: Uuid) => string, look?: {
|
|
2149
|
+
declare function columnForField(field: Field$1, editing?: GridEditing | null, mayWriteRow?: (rowId: Uuid$1) => boolean, whyNotRow?: (rowId: Uuid$1) => string, look?: {
|
|
2133
2150
|
format?: FieldFormatConfig;
|
|
2134
2151
|
frozen?: boolean;
|
|
2135
2152
|
rowLabel?: boolean;
|
|
2136
2153
|
},
|
|
2137
2154
|
/** "Who changed this?" from the cell's own menu. Absent, no control is drawn. */
|
|
2138
|
-
onAskWhoChanged?: ((fieldKey: string, recordId: Uuid) => void) | undefined,
|
|
2155
|
+
onAskWhoChanged?: ((fieldKey: string, recordId: Uuid$1) => void) | undefined,
|
|
2139
2156
|
/**
|
|
2140
2157
|
* PRODUCTS row 10 — the provenance of a cell a MODEL owns. `cellFor` answers the page's
|
|
2141
2158
|
* already-fetched badge data for one row; `onPin` is bound only where this person may
|
|
@@ -2143,8 +2160,8 @@ onAskWhoChanged?: ((fieldKey: string, recordId: Uuid) => void) | undefined,
|
|
|
2143
2160
|
* have. Absent entirely, no badge is drawn and the column looks exactly as it did.
|
|
2144
2161
|
*/
|
|
2145
2162
|
enrich?: {
|
|
2146
|
-
cellFor: (recordId: Uuid) => _ai_matrx_records.EnrichCell | undefined;
|
|
2147
|
-
onPin?: ((recordId: Uuid, fieldKey: string, pinned: boolean) => void | Promise<void>) | undefined;
|
|
2163
|
+
cellFor: (recordId: Uuid$1) => _ai_matrx_records.EnrichCell | undefined;
|
|
2164
|
+
onPin?: ((recordId: Uuid$1, fieldKey: string, pinned: boolean) => void | Promise<void>) | undefined;
|
|
2148
2165
|
}): MatrxColumnDef<ReadRow$1>;
|
|
2149
2166
|
|
|
2150
2167
|
declare const NO_COLUMNS_YET = "This table has no columns yet";
|
|
@@ -2157,7 +2174,7 @@ declare const NO_COLUMNS_YET = "This table has no columns yet";
|
|
|
2157
2174
|
*/
|
|
2158
2175
|
interface GridViewOrder {
|
|
2159
2176
|
/** The saved view's id; `null` for a view a host holds inline (it still carries its own `sorts`). */
|
|
2160
|
-
viewId: Uuid | null;
|
|
2177
|
+
viewId: Uuid$1 | null;
|
|
2161
2178
|
/** The view's own order word (`definition.order`). */
|
|
2162
2179
|
order: ViewOrder;
|
|
2163
2180
|
/** The view's own sort (`definition.sorts`) — where a sorted view OPENS, over the table's. */
|
|
@@ -2174,7 +2191,7 @@ interface GridViewOrder {
|
|
|
2174
2191
|
onUseSort?: ((sort: ColumnSort) => void) | undefined;
|
|
2175
2192
|
}
|
|
2176
2193
|
interface GridProps {
|
|
2177
|
-
tableId: Uuid;
|
|
2194
|
+
tableId: Uuid$1;
|
|
2178
2195
|
/** Rows per page. The table's own pagination handles the rest. */
|
|
2179
2196
|
pageSize?: number | undefined;
|
|
2180
2197
|
/**
|
|
@@ -2189,7 +2206,7 @@ interface GridProps {
|
|
|
2189
2206
|
* S2-PRIME: either shape — the flat map, or a view's own nested question (the Rule shape);
|
|
2190
2207
|
* the store compiles both into the one WHERE clause.
|
|
2191
2208
|
*/
|
|
2192
|
-
filter?: StoreFilter
|
|
2209
|
+
filter?: StoreFilter | undefined;
|
|
2193
2210
|
/**
|
|
2194
2211
|
* Clear the question `filter` carries (the view's own filter), for the "No rows match these
|
|
2195
2212
|
* filters" screen's Clear filters. Left out, that screen clears only the grid's own search and
|
|
@@ -2198,13 +2215,13 @@ interface GridProps {
|
|
|
2198
2215
|
*/
|
|
2199
2216
|
onClearFilter?: (() => void) | undefined;
|
|
2200
2217
|
/** Opened from a row's handle, Space or the row menu. A host that has a record page passes its own. */
|
|
2201
|
-
onOpenRecord?: ((recordId: Uuid) => void) | undefined;
|
|
2218
|
+
onOpenRecord?: ((recordId: Uuid$1) => void) | undefined;
|
|
2202
2219
|
/**
|
|
2203
2220
|
* THE RECORD THE HOST HAS OPEN BESIDE THE GRID, if any (merged grid). While one is open the panel
|
|
2204
2221
|
* FOLLOWS the cursor: arrowing to another row opens that row (Airtable's expanded record walks
|
|
2205
2222
|
* with the arrows), so the panel always shows the row the person is on.
|
|
2206
2223
|
*/
|
|
2207
|
-
openRecordId?: Uuid | null | undefined;
|
|
2224
|
+
openRecordId?: Uuid$1 | null | undefined;
|
|
2208
2225
|
/**
|
|
2209
2226
|
* CLOSE THE RECORD PANEL (grids review 3, lane H item 5): Escape on the grid, and Space on the row
|
|
2210
2227
|
* that is already open, put it away — Airtable's expanded record toggles the same way. Unbound,
|
|
@@ -2221,7 +2238,7 @@ interface GridProps {
|
|
|
2221
2238
|
* (`custom.field_history`), and the host decides where the answer appears —
|
|
2222
2239
|
* a side panel, a window, a route. Unbound, the control is ABSENT, not dead.
|
|
2223
2240
|
*/
|
|
2224
|
-
onAskWhoChanged?: ((fieldKey: string, recordId: Uuid) => void) | undefined;
|
|
2241
|
+
onAskWhoChanged?: ((fieldKey: string, recordId: Uuid$1) => void) | undefined;
|
|
2225
2242
|
/**
|
|
2226
2243
|
* The host's whole-record form. Offered BY NAME when the store refuses an
|
|
2227
2244
|
* empty record — a Table with a required Field cannot be added to one cell at
|
|
@@ -2314,7 +2331,7 @@ interface RecordsTableCardProps {
|
|
|
2314
2331
|
*/
|
|
2315
2332
|
source: {
|
|
2316
2333
|
kind: "table";
|
|
2317
|
-
id: Uuid
|
|
2334
|
+
id: Uuid;
|
|
2318
2335
|
} | {
|
|
2319
2336
|
kind: "entity";
|
|
2320
2337
|
token: string;
|
|
@@ -2331,7 +2348,7 @@ interface RecordsTableCardProps {
|
|
|
2331
2348
|
initialRows?: number;
|
|
2332
2349
|
headingLevel?: 2 | 3;
|
|
2333
2350
|
/** Opened from a row. The host's record page, when it has one. */
|
|
2334
|
-
onOpenRecord?: (recordId: Uuid
|
|
2351
|
+
onOpenRecord?: (recordId: Uuid) => void;
|
|
2335
2352
|
/** Cells editable in place (the Grid's own rule still applies per field and per right). */
|
|
2336
2353
|
editable?: boolean;
|
|
2337
2354
|
className?: string;
|
|
@@ -2340,7 +2357,7 @@ declare function RecordsTableCard(props: RecordsTableCardProps): react.JSX.Eleme
|
|
|
2340
2357
|
|
|
2341
2358
|
/** What a view asks of the store, and how it draws columns. */
|
|
2342
2359
|
interface ViewReading {
|
|
2343
|
-
filter?: StoreFilter | null | undefined;
|
|
2360
|
+
filter?: StoreFilter$1 | null | undefined;
|
|
2344
2361
|
sorts?: readonly ViewSort[] | undefined;
|
|
2345
2362
|
presentation?: GridPresentation | undefined;
|
|
2346
2363
|
/** A hand-ordered view with no sort is read by its own id (the store places its rows). */
|
|
@@ -2389,7 +2406,7 @@ declare function useRecordLabels(fields: readonly Field$1[] | undefined): LabelL
|
|
|
2389
2406
|
declare function useLabelWait(field: Field$1 | undefined): string | null;
|
|
2390
2407
|
|
|
2391
2408
|
interface ExportMenuProps {
|
|
2392
|
-
tableId: Uuid;
|
|
2409
|
+
tableId: Uuid$1;
|
|
2393
2410
|
/** The rows on screen. Absent means "this table's first page", read the same way. */
|
|
2394
2411
|
rows?: ReadRow$1[] | undefined;
|
|
2395
2412
|
/** What the file is called. The table's name by default. */
|
|
@@ -2446,7 +2463,7 @@ interface ImportSource {
|
|
|
2446
2463
|
text: string;
|
|
2447
2464
|
}
|
|
2448
2465
|
interface ImportWizardProps {
|
|
2449
|
-
tableId: Uuid;
|
|
2466
|
+
tableId: Uuid$1;
|
|
2450
2467
|
/** Rows to import instead of a file. When present the file control is not offered. */
|
|
2451
2468
|
source?: ImportSource | undefined;
|
|
2452
2469
|
/**
|
|
@@ -2477,7 +2494,7 @@ declare function ImportWizard({ tableId, source, onDone, onWrote, className }: I
|
|
|
2477
2494
|
/** The run a table's notice is about: the newest finished one that refused rows. */
|
|
2478
2495
|
declare function runToNotice(runs: ReadonlyArray<ImportRun>): ImportRun | null;
|
|
2479
2496
|
interface ImportNoticeProps {
|
|
2480
|
-
tableId: Uuid;
|
|
2497
|
+
tableId: Uuid$1;
|
|
2481
2498
|
/** Opens the import rail, where the run and its rows are listed. */
|
|
2482
2499
|
onOpenImport?: (() => void) | undefined;
|
|
2483
2500
|
/** Bumped by the host when an import just finished, so the notice re-reads. */
|
|
@@ -2554,9 +2571,9 @@ interface SaveToTableProps {
|
|
|
2554
2571
|
/** When the text holds several shapes, the one to open on (the one the person right-clicked). */
|
|
2555
2572
|
shapeIndex?: number | undefined;
|
|
2556
2573
|
/** Open a table (after it was made, or rows were added). Absent: no "Open" button is drawn. */
|
|
2557
|
-
onOpenTable?: ((tableId: Uuid) => void) | undefined;
|
|
2574
|
+
onOpenTable?: ((tableId: Uuid$1) => void) | undefined;
|
|
2558
2575
|
/** The rows landed — `new` when this screen made the table. */
|
|
2559
|
-
onSaved?: ((tableId: Uuid, how: "new" | "existing") => void) | undefined;
|
|
2576
|
+
onSaved?: ((tableId: Uuid$1, how: "new" | "existing") => void) | undefined;
|
|
2560
2577
|
/** The person is finished (the report's Done). */
|
|
2561
2578
|
onClose?: (() => void) | undefined;
|
|
2562
2579
|
className?: string | undefined;
|
|
@@ -2571,7 +2588,7 @@ interface CustomFieldsSectionProps {
|
|
|
2571
2588
|
/** The standard table's registered token (REC-33), e.g. `party`, `crm_deal`. */
|
|
2572
2589
|
entityToken: string;
|
|
2573
2590
|
/** The id of the row this page is showing. */
|
|
2574
|
-
recordId: Uuid;
|
|
2591
|
+
recordId: Uuid$1;
|
|
2575
2592
|
/** The heading. One row, no subtitle restating it. */
|
|
2576
2593
|
title?: string | undefined;
|
|
2577
2594
|
className?: string | undefined;
|
|
@@ -2608,7 +2625,7 @@ interface CustomFieldAddRequest {
|
|
|
2608
2625
|
}
|
|
2609
2626
|
type CustomFieldAddResult = {
|
|
2610
2627
|
ok: true;
|
|
2611
|
-
field_id: Uuid;
|
|
2628
|
+
field_id: Uuid$1;
|
|
2612
2629
|
label: string;
|
|
2613
2630
|
type: string;
|
|
2614
2631
|
} | {
|
|
@@ -2618,7 +2635,7 @@ type CustomFieldAddResult = {
|
|
|
2618
2635
|
/** What the section holds right now, in words an agent can act on. */
|
|
2619
2636
|
interface CustomFieldsAgentState {
|
|
2620
2637
|
entityToken: string;
|
|
2621
|
-
recordId: Uuid;
|
|
2638
|
+
recordId: Uuid$1;
|
|
2622
2639
|
/** The entity's own label ("Deal") once the rights read answered. */
|
|
2623
2640
|
entityLabel: string | null;
|
|
2624
2641
|
/** `null` while the rights read is in flight. */
|
|
@@ -2655,7 +2672,7 @@ type CustomFieldSetResult = {
|
|
|
2655
2672
|
};
|
|
2656
2673
|
interface CustomFieldsAgentDoor {
|
|
2657
2674
|
entityToken: string;
|
|
2658
|
-
recordId: Uuid;
|
|
2675
|
+
recordId: Uuid$1;
|
|
2659
2676
|
state: () => CustomFieldsAgentState;
|
|
2660
2677
|
/**
|
|
2661
2678
|
* Every problem with the request, all at once, or `[]`. Nothing is written.
|
|
@@ -2859,7 +2876,7 @@ interface FieldEditorCommon {
|
|
|
2859
2876
|
* custom-table doors.
|
|
2860
2877
|
*/
|
|
2861
2878
|
type FieldEditorProps = FieldEditorCommon & ({
|
|
2862
|
-
tableId: Uuid
|
|
2879
|
+
tableId: Uuid;
|
|
2863
2880
|
entityToken?: undefined;
|
|
2864
2881
|
/** The Field being edited. Absent means a new one. */
|
|
2865
2882
|
field?: Field | undefined;
|
|
@@ -2899,7 +2916,7 @@ declare const NO_RULES_YET = "Nothing has to be true to get here yet.";
|
|
|
2899
2916
|
declare const NEEDS_A_SENTENCE = "Write the sentence somebody reads when this stops them, the way you would say it out loud.";
|
|
2900
2917
|
declare const NOT_DRAWN_HERE = "This part of the rule is not something this builder can draw yet";
|
|
2901
2918
|
interface StageRulesSectionProps {
|
|
2902
|
-
tableId: Uuid;
|
|
2919
|
+
tableId: Uuid$1;
|
|
2903
2920
|
/** Which stage's rules to edit. Left out, the section opens on the first stage. */
|
|
2904
2921
|
stage?: string | undefined;
|
|
2905
2922
|
className?: string | undefined;
|
|
@@ -3023,7 +3040,7 @@ declare const TABLE_NAME_MAX = 120;
|
|
|
3023
3040
|
/** Why a typed table name cannot be kept, or null when it can. */
|
|
3024
3041
|
declare function tableNameProblem(typed: string): string | null;
|
|
3025
3042
|
declare function TableRenameDialog({ tableId, name, open, onOpenChange, onRenamed, }: {
|
|
3026
|
-
tableId: Uuid
|
|
3043
|
+
tableId: Uuid;
|
|
3027
3044
|
/** The table's name as it is kept now. */
|
|
3028
3045
|
name: string;
|
|
3029
3046
|
open: boolean;
|
|
@@ -3055,7 +3072,7 @@ interface FieldProposalRow {
|
|
|
3055
3072
|
proposed_by: string;
|
|
3056
3073
|
}
|
|
3057
3074
|
interface TableSettingsProps {
|
|
3058
|
-
tableId: Uuid;
|
|
3075
|
+
tableId: Uuid$1;
|
|
3059
3076
|
/**
|
|
3060
3077
|
* SCR-5. Pending field proposals. The door that lists them
|
|
3061
3078
|
* (`custom.field_propose`) does not exist yet — `@ai-matrx/records` answers
|
|
@@ -3079,20 +3096,24 @@ interface TableSettingsProps {
|
|
|
3079
3096
|
columns?: ColumnsLook | undefined;
|
|
3080
3097
|
className?: string | undefined;
|
|
3081
3098
|
}
|
|
3082
|
-
|
|
3099
|
+
/**
|
|
3100
|
+
* THE PANEL, AND WHAT AN AGENT MAY SEE AND STAGE IN IT. A host that binds `settingsAgent` is handed
|
|
3101
|
+
* the panel's agent (what it shows, three staging calls) and wraps the panel in its own surface.
|
|
3102
|
+
*/
|
|
3103
|
+
declare function TableSettings(props: TableSettingsProps): react.JSX.Element;
|
|
3083
3104
|
|
|
3084
3105
|
/** Whether a Table document marks the table as Foundation. Absent is no — the store's own rule. */
|
|
3085
3106
|
declare function isFoundationTable(table: Pick<Table, "foundation"> | {
|
|
3086
3107
|
foundation?: unknown;
|
|
3087
3108
|
} | null | undefined): boolean;
|
|
3088
3109
|
declare function TableFoundationSwitch({ tableId, table }: {
|
|
3089
|
-
tableId: Uuid
|
|
3110
|
+
tableId: Uuid;
|
|
3090
3111
|
table: Table;
|
|
3091
3112
|
}): react.JSX.Element;
|
|
3092
3113
|
|
|
3093
3114
|
interface PeekProps {
|
|
3094
|
-
tableId: Uuid;
|
|
3095
|
-
recordId: Uuid;
|
|
3115
|
+
tableId: Uuid$1;
|
|
3116
|
+
recordId: Uuid$1;
|
|
3096
3117
|
onClose?: (() => void) | undefined;
|
|
3097
3118
|
className?: string | undefined;
|
|
3098
3119
|
/**
|
|
@@ -3123,11 +3144,11 @@ declare function standardTokenOf(token: string): string;
|
|
|
3123
3144
|
interface StandardRecordFormProps {
|
|
3124
3145
|
/** The standard table, by registry token: `entity:party` (or the bare `party`). */
|
|
3125
3146
|
token: string;
|
|
3126
|
-
recordId: Uuid;
|
|
3147
|
+
recordId: Uuid$1;
|
|
3127
3148
|
/** The row's own columns, in the order shown. */
|
|
3128
3149
|
columns: readonly StandardColumn[];
|
|
3129
3150
|
/** Called after a value was saved, so the host re-reads what it shows elsewhere (a title). */
|
|
3130
|
-
onSaved?: ((recordId: Uuid) => void) | undefined;
|
|
3151
|
+
onSaved?: ((recordId: Uuid$1) => void) | undefined;
|
|
3131
3152
|
className?: string | undefined;
|
|
3132
3153
|
/** The custom-fields half: its heading and the host's doors (agent door, own-table offer, noun). */
|
|
3133
3154
|
custom?: Omit<CustomFieldsSectionProps, "entityToken" | "recordId" | "className"> | undefined;
|
|
@@ -3138,7 +3159,7 @@ declare function StandardRecordForm({ token, recordId, columns, onSaved, classNa
|
|
|
3138
3159
|
|
|
3139
3160
|
interface RecordFormProps {
|
|
3140
3161
|
/** A CUSTOM table's id. Give `token` instead for a row of a standard table. */
|
|
3141
|
-
tableId?: Uuid | undefined;
|
|
3162
|
+
tableId?: Uuid$1 | undefined;
|
|
3142
3163
|
/**
|
|
3143
3164
|
* STANDARD-TABLE MODE (FTS-2b wave 6): a registry token, `entity:party` (or the bare `party`).
|
|
3144
3165
|
* The form reads and writes that row through the store's standard-row doors, as the person —
|
|
@@ -3153,10 +3174,10 @@ interface RecordFormProps {
|
|
|
3153
3174
|
/** Standard mode: the host's own controls on this row, between the columns and the custom fields. */
|
|
3154
3175
|
children?: ReactNode;
|
|
3155
3176
|
/** Absent means "create". Present means "edit that record". */
|
|
3156
|
-
recordId?: Uuid | undefined;
|
|
3177
|
+
recordId?: Uuid$1 | undefined;
|
|
3157
3178
|
/** FLD-10: which Fields apply is the store's decision, and it takes the record type. */
|
|
3158
3179
|
recordType?: string | undefined;
|
|
3159
|
-
onSaved?: ((recordId: Uuid) => void) | undefined;
|
|
3180
|
+
onSaved?: ((recordId: Uuid$1) => void) | undefined;
|
|
3160
3181
|
onCancel?: (() => void) | undefined;
|
|
3161
3182
|
className?: string | undefined;
|
|
3162
3183
|
/**
|
|
@@ -3647,7 +3668,7 @@ declare function pickableTypeOf(field: Field): PickableFieldType | undefined;
|
|
|
3647
3668
|
declare function fieldTypeLabel(field: Field): string;
|
|
3648
3669
|
|
|
3649
3670
|
/** The one token form, written the way the store's own pattern reads it. */
|
|
3650
|
-
declare function fieldToken(fieldId: Uuid
|
|
3671
|
+
declare function fieldToken(fieldId: Uuid): string;
|
|
3651
3672
|
/** THE DECLARATIVE SPEC an agent writes. One template, whole, in one object. */
|
|
3652
3673
|
interface DocTemplateSpec {
|
|
3653
3674
|
name: string;
|
|
@@ -3786,7 +3807,7 @@ interface SystemFieldSpec {
|
|
|
3786
3807
|
* every organization's first load, which is the class this file just cost us.
|
|
3787
3808
|
*/
|
|
3788
3809
|
options?: string[];
|
|
3789
|
-
relationTarget?: Uuid
|
|
3810
|
+
relationTarget?: Uuid;
|
|
3790
3811
|
expr?: Record<string, unknown>;
|
|
3791
3812
|
}
|
|
3792
3813
|
interface SystemTableSpec {
|
|
@@ -3801,13 +3822,13 @@ interface SystemTableSpec {
|
|
|
3801
3822
|
/** Find this organization's copy of a package-owned Table, declaring it the first time. */
|
|
3802
3823
|
declare function ensureSystemTable(client: RecordsClient, spec: SystemTableSpec): Promise<{
|
|
3803
3824
|
ok: true;
|
|
3804
|
-
data: Uuid
|
|
3825
|
+
data: Uuid;
|
|
3805
3826
|
} | {
|
|
3806
3827
|
ok: false;
|
|
3807
3828
|
error: RecordsError;
|
|
3808
3829
|
}>;
|
|
3809
3830
|
interface UseSystemTableState {
|
|
3810
|
-
tableId: Uuid
|
|
3831
|
+
tableId: Uuid | null;
|
|
3811
3832
|
loading: boolean;
|
|
3812
3833
|
error: RecordsError | null;
|
|
3813
3834
|
}
|
|
@@ -3844,7 +3865,7 @@ declare function archiveConfirmSentence(what: string): string;
|
|
|
3844
3865
|
interface AnnounceTableArchived {
|
|
3845
3866
|
notify: RecordsUiHost["notify"];
|
|
3846
3867
|
client: Pick<RecordsClient, "tableRestoreWhole">;
|
|
3847
|
-
tableId: Uuid
|
|
3868
|
+
tableId: Uuid;
|
|
3848
3869
|
/** The table's name as the store gave it. */
|
|
3849
3870
|
name: string;
|
|
3850
3871
|
/** Called once the table is back, so the surface can show it again. */
|
|
@@ -3884,9 +3905,9 @@ declare function saveToViewPlan(view: SavedView, look: ViewLook): {
|
|
|
3884
3905
|
left: ViewLook | null;
|
|
3885
3906
|
};
|
|
3886
3907
|
/** The caller's own looks at every view of a table, by view id. */
|
|
3887
|
-
declare function readLooks(client: Pick<RecordsClient, "viewLookRead">, tableId: Uuid
|
|
3908
|
+
declare function readLooks(client: Pick<RecordsClient, "viewLookRead">, tableId: Uuid): Promise<RecordsResult<Record<string, ViewLook>>>;
|
|
3888
3909
|
/** Keep the whole look (null: "Reset to view"). The shared view is never written. */
|
|
3889
|
-
declare function keepLook(client: Pick<RecordsClient, "viewLookSet">, tableId: Uuid
|
|
3910
|
+
declare function keepLook(client: Pick<RecordsClient, "viewLookSet">, tableId: Uuid, viewId: Uuid, look: ViewLook | null): Promise<RecordsResult<Record<string, unknown> | null>>;
|
|
3890
3911
|
/** The words of the look bar. One sentence, then the doors. */
|
|
3891
3912
|
declare const LOOK_WORDS: {
|
|
3892
3913
|
/** The reason, for a tooltip or a screen reader — never a line on the page (interface-text). */
|
|
@@ -3921,9 +3942,9 @@ interface ViewSwitcherProps {
|
|
|
3921
3942
|
* and the screen says the choice is not being kept.
|
|
3922
3943
|
*/
|
|
3923
3944
|
onViewChange?: ((patch: Partial<SavedViewSpec>) => void) | undefined;
|
|
3924
|
-
onOpenRecord?: ((recordId: Uuid) => void) | undefined;
|
|
3945
|
+
onOpenRecord?: ((recordId: Uuid$1) => void) | undefined;
|
|
3925
3946
|
/** The record the host has open beside a grid, which the grid's panel then follows (`Grid.openRecordId`). */
|
|
3926
|
-
openRecordId?: Uuid | null | undefined;
|
|
3947
|
+
openRecordId?: Uuid$1 | null | undefined;
|
|
3927
3948
|
/** Put the record panel away (Escape, or Space on the open row): `Grid.onCloseRecord`. */
|
|
3928
3949
|
onCloseRecord?: (() => void) | undefined;
|
|
3929
3950
|
/**
|
|
@@ -3935,7 +3956,7 @@ interface ViewSwitcherProps {
|
|
|
3935
3956
|
/** The host's whole-record form, offered by the grid when an empty record is refused. */
|
|
3936
3957
|
onNewRecordForm?: (() => void) | undefined;
|
|
3937
3958
|
/** "Who changed this?" from a grid cell — the host opens that column's timeline. */
|
|
3938
|
-
onAskWhoChanged?: ((fieldKey: string, recordId: Uuid) => void) | undefined;
|
|
3959
|
+
onAskWhoChanged?: ((fieldKey: string, recordId: Uuid$1) => void) | undefined;
|
|
3939
3960
|
pageSize?: number | undefined;
|
|
3940
3961
|
/**
|
|
3941
3962
|
* THE TABLE'S OWN TITLE COLUMN (`title_field`, REC-2), from the table the host already holds.
|
|
@@ -3953,34 +3974,25 @@ interface ViewSwitcherProps {
|
|
|
3953
3974
|
* S2-PRIME: either shape — a flat map, or the view's own nested question (`where`, the
|
|
3954
3975
|
* store's Rule shape). The grid, the board's headings and the numbers all ask it.
|
|
3955
3976
|
*/
|
|
3956
|
-
filter?: StoreFilter | undefined;
|
|
3977
|
+
filter?: StoreFilter$1 | undefined;
|
|
3957
3978
|
/**
|
|
3958
3979
|
* Clear the question `filter` carries, for the "No rows match these filters" screen of every
|
|
3959
3980
|
* layout. Left out, that screen says the view's filter holds every row back without a button.
|
|
3960
3981
|
*/
|
|
3961
3982
|
onClearFilter?: (() => void) | undefined;
|
|
3962
|
-
/**
|
|
3963
|
-
* The HOST layout showing now (`RecordsUiHost.layouts`, by id), or null for the
|
|
3964
|
-
* package's own. Controlled by the page, because the address names it.
|
|
3965
|
-
*/
|
|
3966
|
-
hostLayout?: string | null | undefined;
|
|
3967
|
-
/** The person picked a host layout (its id), or went back to one of the four (null). */
|
|
3968
|
-
onHostLayoutChange?: ((id: string | null) => void) | undefined;
|
|
3969
3983
|
/**
|
|
3970
3984
|
* Whether this component draws its own row — the view's name and the layout buttons. `false`
|
|
3971
3985
|
* when the page that mounts it draws the layout choice itself (`TablePage` keeps one control
|
|
3972
3986
|
* cluster for the whole table, lane DATA-V2-FACE). Default `true`, for every other host.
|
|
3973
3987
|
*/
|
|
3974
3988
|
chooser?: boolean | undefined;
|
|
3975
|
-
/** Handed to a host layout's `render` — the page's own export. */
|
|
3976
|
-
openExport?: (() => void) | undefined;
|
|
3977
3989
|
/**
|
|
3978
3990
|
* THE SAVED VIEW'S OWN ID, when the view is a stored one (lane GRID-MANUAL). A hand-set order
|
|
3979
3991
|
* lives on the view's row, so the grid reads it (`custom.read_records_in_view_order`) and writes
|
|
3980
3992
|
* it (`custom.view_record_order_set`, Reorder → Save) through it. Left out — a literal spec —
|
|
3981
3993
|
* the view has no hand order and the grid offers no Reorder.
|
|
3982
3994
|
*/
|
|
3983
|
-
viewId?: Uuid | null | undefined;
|
|
3995
|
+
viewId?: Uuid$1 | null | undefined;
|
|
3984
3996
|
/**
|
|
3985
3997
|
* The rows were placed by hand: the store made this view manual and removed its sort. The host
|
|
3986
3998
|
* updates the view it holds (nothing is written — the store already did).
|
|
@@ -3989,7 +4001,7 @@ interface ViewSwitcherProps {
|
|
|
3989
4001
|
/**
|
|
3990
4002
|
* Where the grid's footer sits (lane TABLE-PAGE-CHROME) — `sticky`: the layout fills the height
|
|
3991
4003
|
* the page gives it and the footer stays on the bottom edge; `inline`: after the last row. Handed
|
|
3992
|
-
* to the Grid
|
|
4004
|
+
* to the Grid. Left out: natural height, as always.
|
|
3993
4005
|
*/
|
|
3994
4006
|
footer?: FooterPlacement | undefined;
|
|
3995
4007
|
/** The grid as an embedded table (`GridProps.embedded`): its page furniture off. */
|
|
@@ -4012,7 +4024,7 @@ interface ViewSwitcherProps {
|
|
|
4012
4024
|
className?: string | undefined;
|
|
4013
4025
|
}
|
|
4014
4026
|
/** The records this view holds: its Rule's members when it names one, the table otherwise. */
|
|
4015
|
-
declare function useViewRecords(view: SavedViewSpec, pageSize?: number, filter?: StoreFilter, viewId?: Uuid | null): {
|
|
4027
|
+
declare function useViewRecords(view: SavedViewSpec, pageSize?: number, filter?: StoreFilter$1, viewId?: Uuid$1 | null): {
|
|
4016
4028
|
rows: ReadRow$1[];
|
|
4017
4029
|
manual: boolean;
|
|
4018
4030
|
/** How many records the view holds, as the store counted them (null when it did not count). */
|
|
@@ -4038,12 +4050,12 @@ declare function useViewRecords(view: SavedViewSpec, pageSize?: number, filter?:
|
|
|
4038
4050
|
*/
|
|
4039
4051
|
membership: string;
|
|
4040
4052
|
};
|
|
4041
|
-
declare function ViewSwitcher({ view, onLayoutChange, onViewChange, onOpenRecord, openRecordId, onCloseRecord, onMoved, onNewRecordForm, onAskWhoChanged, pageSize: pageSizeAsked, titleField, filter, onClearFilter,
|
|
4053
|
+
declare function ViewSwitcher({ view, onLayoutChange, onViewChange, onOpenRecord, openRecordId, onCloseRecord, onMoved, onNewRecordForm, onAskWhoChanged, pageSize: pageSizeAsked, titleField, filter, onClearFilter, chooser, viewId, onOrderPlaced, footer, embedded, sortOverride, searchOverride, onSearchChange, searchBox, newRowLabel, className, }: ViewSwitcherProps): react.JSX.Element;
|
|
4042
4054
|
|
|
4043
4055
|
type CalendarMode = "month" | "week" | "day" | "list";
|
|
4044
4056
|
interface CalendarViewProps {
|
|
4045
4057
|
/** The table the records live in — the undo history's table, and where a new record is made. */
|
|
4046
|
-
tableId: Uuid;
|
|
4058
|
+
tableId: Uuid$1;
|
|
4047
4059
|
rows: readonly ReadRow$1[];
|
|
4048
4060
|
/** The column a record's day (and, when it carries one, its time) is read from and written to. */
|
|
4049
4061
|
dateField: Field$1;
|
|
@@ -4064,7 +4076,7 @@ interface CalendarViewProps {
|
|
|
4064
4076
|
endKept?: boolean | undefined;
|
|
4065
4077
|
/** The column that names each card (`cardTitleField`). */
|
|
4066
4078
|
titleField: Field$1 | undefined;
|
|
4067
|
-
onOpenRecord?: ((recordId: Uuid) => void) | undefined;
|
|
4079
|
+
onOpenRecord?: ((recordId: Uuid$1) => void) | undefined;
|
|
4068
4080
|
/** A move landed (or was undone, or refused): the host re-reads the rows it owns. */
|
|
4069
4081
|
onMoved?: (() => void) | undefined;
|
|
4070
4082
|
/** The person picked a Colour by column: the host keeps it on the view (`presentation.style.colorBy`). */
|
|
@@ -4115,7 +4127,7 @@ interface TimelineViewProps {
|
|
|
4115
4127
|
/** The fields each bar shows after its title (the view's Card fields, v7 item 4). */
|
|
4116
4128
|
cardFields?: readonly Field$1[] | undefined;
|
|
4117
4129
|
/** The table the records live in — the undo history's table. */
|
|
4118
|
-
tableId: Uuid;
|
|
4130
|
+
tableId: Uuid$1;
|
|
4119
4131
|
rows: readonly ReadRow$1[];
|
|
4120
4132
|
/** The table's columns: the pickers, the lanes and the colours read them. */
|
|
4121
4133
|
fields: readonly Field$1[];
|
|
@@ -4135,7 +4147,7 @@ interface TimelineViewProps {
|
|
|
4135
4147
|
onSettingsChange?: ((patch: Partial<TimelineSettings>) => void) | undefined;
|
|
4136
4148
|
/** False when the host cannot keep the layout or the End on the view: the toolbar says so. */
|
|
4137
4149
|
layoutKept?: boolean | undefined;
|
|
4138
|
-
onOpenRecord?: ((recordId: Uuid) => void) | undefined;
|
|
4150
|
+
onOpenRecord?: ((recordId: Uuid$1) => void) | undefined;
|
|
4139
4151
|
/** A move landed (or was undone): the host re-reads the rows it owns. */
|
|
4140
4152
|
onMoved?: (() => void) | undefined;
|
|
4141
4153
|
/** The view's membership sentence (`useViewRecords().membership`). */
|
|
@@ -4158,7 +4170,7 @@ declare function useRowColorBy(all: readonly Field$1[], colorKey: string | null,
|
|
|
4158
4170
|
|
|
4159
4171
|
/** One cell a change touched: its value before and after, by Field key. */
|
|
4160
4172
|
interface TouchedCell {
|
|
4161
|
-
rowId: Uuid
|
|
4173
|
+
rowId: Uuid;
|
|
4162
4174
|
key: string;
|
|
4163
4175
|
before: unknown;
|
|
4164
4176
|
after: unknown;
|
|
@@ -4176,9 +4188,9 @@ interface GridUndoStep {
|
|
|
4176
4188
|
label: string;
|
|
4177
4189
|
cells: TouchedCell[];
|
|
4178
4190
|
/** Records this change created — undo archives them. */
|
|
4179
|
-
created?: Uuid
|
|
4191
|
+
created?: Uuid[] | undefined;
|
|
4180
4192
|
/** Records this change archived — undo restores them. */
|
|
4181
|
-
archived?: Uuid
|
|
4193
|
+
archived?: Uuid[] | undefined;
|
|
4182
4194
|
/** The after-values are the store's own (a row action worked them out), so it cannot be redone. */
|
|
4183
4195
|
noRedo?: boolean | undefined;
|
|
4184
4196
|
/**
|
|
@@ -4187,7 +4199,7 @@ interface GridUndoStep {
|
|
|
4187
4199
|
* delete was no step at all, so Cmd-Z after it silently undid the OLDER cell edit beneath it.
|
|
4188
4200
|
*/
|
|
4189
4201
|
retiredField?: {
|
|
4190
|
-
fieldId: Uuid
|
|
4202
|
+
fieldId: Uuid;
|
|
4191
4203
|
} | undefined;
|
|
4192
4204
|
}
|
|
4193
4205
|
interface GridUndo {
|
|
@@ -4213,7 +4225,7 @@ interface GridUndo {
|
|
|
4213
4225
|
* Say something beside the last step without a step. `sticky` (a paste the store refused, a
|
|
4214
4226
|
* read-back that came up short) stays until dismissed; otherwise it leaves by itself.
|
|
4215
4227
|
*/
|
|
4216
|
-
say: (says: string, sticky?: boolean) => void;
|
|
4228
|
+
say: (says: string, sticky?: boolean, offerUndo?: boolean) => void;
|
|
4217
4229
|
}
|
|
4218
4230
|
|
|
4219
4231
|
/** What one write answered: done (with the version it made), or the store's refusal. */
|
|
@@ -4229,7 +4241,7 @@ type MoveWritten = {
|
|
|
4229
4241
|
* means the caller does not know it — the write is then NOT sent, because a write with no version
|
|
4230
4242
|
* is a write that can overwrite a colleague (said as a refusal, never silently).
|
|
4231
4243
|
*/
|
|
4232
|
-
declare function moveRecordValue(client: Pick<ReturnType<typeof useRecordsClient>, "recordUpdate" | "recordUpdateAddingChoices">, recordId: Uuid
|
|
4244
|
+
declare function moveRecordValue(client: Pick<ReturnType<typeof useRecordsClient>, "recordUpdate" | "recordUpdateAddingChoices">, recordId: Uuid, patch: Record<string, unknown>, expectedVersion: number | null): Promise<MoveWritten>;
|
|
4233
4245
|
interface RecordMoves {
|
|
4234
4246
|
/**
|
|
4235
4247
|
* Move one record: `patch` is the new values by Field key, `before` the values it held (read from
|
|
@@ -4237,20 +4249,20 @@ interface RecordMoves {
|
|
|
4237
4249
|
* Answers whether the store took it.
|
|
4238
4250
|
*/
|
|
4239
4251
|
move: (args: {
|
|
4240
|
-
recordId: Uuid
|
|
4252
|
+
recordId: Uuid;
|
|
4241
4253
|
patch: Record<string, unknown>;
|
|
4242
4254
|
before: Record<string, unknown>;
|
|
4243
4255
|
label: string;
|
|
4244
4256
|
}) => Promise<boolean>;
|
|
4245
4257
|
/** Make one record from a gesture (a click on a day, a drag across hours): ONE write, one undo step. */
|
|
4246
4258
|
create: (args: {
|
|
4247
|
-
tableId: Uuid
|
|
4259
|
+
tableId: Uuid;
|
|
4248
4260
|
data: Record<string, unknown>;
|
|
4249
4261
|
label: string;
|
|
4250
|
-
}) => Promise<Uuid
|
|
4262
|
+
}) => Promise<Uuid | null>;
|
|
4251
4263
|
/** The refusal the store gave the last move, and the record it is about — a badge on that card. */
|
|
4252
4264
|
refused: {
|
|
4253
|
-
recordId: Uuid
|
|
4265
|
+
recordId: Uuid;
|
|
4254
4266
|
error: RecordsError;
|
|
4255
4267
|
changedElsewhere: boolean;
|
|
4256
4268
|
unread?: boolean | undefined;
|
|
@@ -4265,7 +4277,7 @@ interface RecordMoves {
|
|
|
4265
4277
|
notice: ReactElement;
|
|
4266
4278
|
}
|
|
4267
4279
|
declare function useRecordMoves({ tableId, rows, onMoved, }: {
|
|
4268
|
-
tableId: Uuid
|
|
4280
|
+
tableId: Uuid;
|
|
4269
4281
|
/** The rows the layout drew — their versions are what a move is written against. */
|
|
4270
4282
|
rows: readonly ReadRow[];
|
|
4271
4283
|
onMoved?: (() => void) | undefined;
|
|
@@ -4278,7 +4290,7 @@ declare function mayNotRestoreLine(why: string): string;
|
|
|
4278
4290
|
/** What one row in the archive says, as one string — pulled out so the guard can read it. */
|
|
4279
4291
|
declare function archivedRowLine(row: ArchivedRow, titleKey?: string | null): string;
|
|
4280
4292
|
interface ArchivedViewProps {
|
|
4281
|
-
tableId: Uuid
|
|
4293
|
+
tableId: Uuid;
|
|
4282
4294
|
/** Rows per page. The store refuses above its own ceiling by name rather than quietly serving fewer. */
|
|
4283
4295
|
pageSize?: number | undefined;
|
|
4284
4296
|
/** Which lane the address or the host asked for. Absent, the organization's. */
|
|
@@ -4286,7 +4298,7 @@ interface ArchivedViewProps {
|
|
|
4286
4298
|
/** Called when the person switches lane, so the host can put it in the URL. */
|
|
4287
4299
|
onLaneChange?: ((lane: ArchiveLane) => void) | undefined;
|
|
4288
4300
|
/** Called after a record comes back, so the host re-reads the rows it owns. */
|
|
4289
|
-
onRestored?: ((recordId: Uuid
|
|
4301
|
+
onRestored?: ((recordId: Uuid) => void) | undefined;
|
|
4290
4302
|
className?: string | undefined;
|
|
4291
4303
|
}
|
|
4292
4304
|
declare function ArchivedView({ tableId, pageSize, lane: laneFromHost, onLaneChange, onRestored, className, }: ArchivedViewProps): react.JSX.Element;
|
|
@@ -4317,7 +4329,7 @@ interface ArchivedDisclosureProps {
|
|
|
4317
4329
|
declare function ArchivedDisclosure({ noun, count, defaultOpen, onOpenChange, children, className, }: ArchivedDisclosureProps): react.JSX.Element;
|
|
4318
4330
|
interface ArchivedPortalsProps {
|
|
4319
4331
|
/** Called after a portal comes back, so the rail re-reads the list it owns. */
|
|
4320
|
-
onRestored?: ((portalId: Uuid) => void) | undefined;
|
|
4332
|
+
onRestored?: ((portalId: Uuid$1) => void) | undefined;
|
|
4321
4333
|
/**
|
|
4322
4334
|
* Bumped by the surface above whenever IT changed something that lands here —
|
|
4323
4335
|
* archiving a portal from the live rail, most of all. Without it an archive
|
|
@@ -4342,9 +4354,9 @@ declare function ArchivedPortals({ onRestored, refreshToken, defaultOpen, classN
|
|
|
4342
4354
|
|
|
4343
4355
|
interface ViewBarProps {
|
|
4344
4356
|
/** The Table whose views these are. */
|
|
4345
|
-
tableId: Uuid;
|
|
4357
|
+
tableId: Uuid$1;
|
|
4346
4358
|
/** The view that is showing. Leave it out and the bar picks the default, then the first. */
|
|
4347
|
-
activeViewId?: Uuid | null | undefined;
|
|
4359
|
+
activeViewId?: Uuid$1 | null | undefined;
|
|
4348
4360
|
onActiveView?: ((view: SavedView) => void) | undefined;
|
|
4349
4361
|
/**
|
|
4350
4362
|
* COMPLETE DECLARATIVE SPECS an agent wrote. Any of these whose name this
|
|
@@ -4387,9 +4399,9 @@ interface ProposedChange {
|
|
|
4387
4399
|
* required field a caller cannot fill is a field that gets filled with
|
|
4388
4400
|
* something untrue.
|
|
4389
4401
|
*/
|
|
4390
|
-
table?: Uuid | undefined;
|
|
4402
|
+
table?: Uuid$1 | undefined;
|
|
4391
4403
|
/** The record it changes. Required for `update` and `remove`. */
|
|
4392
|
-
record?: Uuid | undefined;
|
|
4404
|
+
record?: Uuid$1 | undefined;
|
|
4393
4405
|
/** The document for `add`, or the patch for `update`. */
|
|
4394
4406
|
data?: Record<string, unknown> | undefined;
|
|
4395
4407
|
/**
|
|
@@ -4463,19 +4475,19 @@ interface ActionInboxProps {
|
|
|
4463
4475
|
* (lane S5-PRIME), so this narrows approvals, proposals and assignments alike;
|
|
4464
4476
|
* when the table has nothing, the inbox says how many wait elsewhere and offers them.
|
|
4465
4477
|
*/
|
|
4466
|
-
tableId?: Uuid | null | undefined;
|
|
4478
|
+
tableId?: Uuid$1 | null | undefined;
|
|
4467
4479
|
/** Show decided rows too, from the start. `h` (or the button) toggles it. */
|
|
4468
4480
|
includeSettled?: boolean | undefined;
|
|
4469
4481
|
/** How the rows start out grouped. Default: by kind. */
|
|
4470
4482
|
defaultGroupBy?: InboxGrouping | undefined;
|
|
4471
|
-
onOpenRecord?: ((recordId: Uuid, tableId: Uuid) => void) | undefined;
|
|
4483
|
+
onOpenRecord?: ((recordId: Uuid$1, tableId: Uuid$1) => void) | undefined;
|
|
4472
4484
|
className?: string | undefined;
|
|
4473
4485
|
}
|
|
4474
4486
|
declare function ActionInbox({ tableId, includeSettled, defaultGroupBy, onOpenRecord, className, }: ActionInboxProps): react.JSX.Element;
|
|
4475
4487
|
|
|
4476
4488
|
interface HistoryPanelProps {
|
|
4477
|
-
tableId: Uuid;
|
|
4478
|
-
recordId: Uuid;
|
|
4489
|
+
tableId: Uuid$1;
|
|
4490
|
+
recordId: Uuid$1;
|
|
4479
4491
|
/**
|
|
4480
4492
|
* "Who changed THIS column?" — the host opens that field's own timeline. Left
|
|
4481
4493
|
* out, the per-field control is absent rather than dead.
|
|
@@ -4487,9 +4499,9 @@ declare function HistoryPanel({ tableId, recordId, onAskAboutField, className }:
|
|
|
4487
4499
|
|
|
4488
4500
|
interface CommentThreadProps {
|
|
4489
4501
|
/** The Table the commented-on record belongs to — its Fields name an anchor. */
|
|
4490
|
-
tableId: Uuid;
|
|
4502
|
+
tableId: Uuid$1;
|
|
4491
4503
|
/** The record being discussed. */
|
|
4492
|
-
recordId: Uuid;
|
|
4504
|
+
recordId: Uuid$1;
|
|
4493
4505
|
/** Open on the thread about ONE column, and post there by default. */
|
|
4494
4506
|
fieldKey?: string | undefined;
|
|
4495
4507
|
className?: string | undefined;
|
|
@@ -4497,15 +4509,15 @@ interface CommentThreadProps {
|
|
|
4497
4509
|
declare function CommentThread({ tableId, recordId, fieldKey, className }: CommentThreadProps): react.JSX.Element;
|
|
4498
4510
|
|
|
4499
4511
|
interface FieldHistoryPanelProps {
|
|
4500
|
-
tableId: Uuid;
|
|
4512
|
+
tableId: Uuid$1;
|
|
4501
4513
|
/** The column being asked about, by its key. */
|
|
4502
4514
|
fieldKey: string;
|
|
4503
4515
|
/** Scoped to ONE record when present; the whole Table when absent. */
|
|
4504
|
-
recordId?: Uuid | undefined;
|
|
4516
|
+
recordId?: Uuid$1 | undefined;
|
|
4505
4517
|
/** The host's way back — a cell menu opens this, so it closes too. */
|
|
4506
4518
|
onClose?: (() => void) | undefined;
|
|
4507
4519
|
/** Open a record from one of its rows. Absent, the row is not a link. */
|
|
4508
|
-
onOpenRecord?: ((recordId: Uuid) => void) | undefined;
|
|
4520
|
+
onOpenRecord?: ((recordId: Uuid$1) => void) | undefined;
|
|
4509
4521
|
className?: string | undefined;
|
|
4510
4522
|
}
|
|
4511
4523
|
declare function FieldHistoryPanel({ tableId, fieldKey, recordId, onClose, onOpenRecord, className, }: FieldHistoryPanelProps): react.JSX.Element;
|
|
@@ -4530,12 +4542,68 @@ interface FormQuestionSpec {
|
|
|
4530
4542
|
* question: a person is never silently skipped past something.
|
|
4531
4543
|
*/
|
|
4532
4544
|
showIf?: RuleExpression | null;
|
|
4545
|
+
/**
|
|
4546
|
+
* LOGIC JUMPS (lane TYPEFORM-DUP). After this question, the FIRST jump whose `when` the store
|
|
4547
|
+
* answers true is taken — to a later question or to one of the form's endings. A jump with no
|
|
4548
|
+
* `when` is "always". Undecided falls through to the next question. The store judges the route
|
|
4549
|
+
* (`custom._form_route`); this package never does.
|
|
4550
|
+
*/
|
|
4551
|
+
jumps?: FormJump[] | null;
|
|
4552
|
+
/** SCORING: what each answer is worth (`{"Yes": 5}`); a list answer adds each of its parts. */
|
|
4553
|
+
points?: Record<string, number> | null;
|
|
4554
|
+
}
|
|
4555
|
+
/** One logic jump: when the Rule is true, go to a later question or to an ending. */
|
|
4556
|
+
interface FormJump {
|
|
4557
|
+
when?: RuleExpression | null;
|
|
4558
|
+
to: {
|
|
4559
|
+
question: string;
|
|
4560
|
+
} | {
|
|
4561
|
+
ending: string;
|
|
4562
|
+
};
|
|
4563
|
+
}
|
|
4564
|
+
/**
|
|
4565
|
+
* ONE ENDING (lane TYPEFORM-DUP). A form may have several; a jump picks one, or the first whose
|
|
4566
|
+
* condition holds (`when`, `scoreMin`, `scoreMax`), or else the first with no condition.
|
|
4567
|
+
*/
|
|
4568
|
+
interface FormEnding {
|
|
4569
|
+
/** A short name, lower-case letters, digits, - and _. Jumps point at it. */
|
|
4570
|
+
id: string;
|
|
4571
|
+
title?: string | null;
|
|
4572
|
+
body?: string | null;
|
|
4573
|
+
/** One of the organization's public pictures (the builder's side). */
|
|
4574
|
+
pictureFileId?: Uuid | null;
|
|
4575
|
+
/** The picture's public address (the store resolves it for the public page). */
|
|
4576
|
+
pictureUrl?: string | null;
|
|
4577
|
+
buttonLabel?: string | null;
|
|
4578
|
+
/** A secure page on the organization's own sites — the thank-you's own rule. */
|
|
4579
|
+
redirectUrl?: string | null;
|
|
4580
|
+
when?: RuleExpression | null;
|
|
4581
|
+
scoreMin?: number | null;
|
|
4582
|
+
scoreMax?: number | null;
|
|
4583
|
+
}
|
|
4584
|
+
/** THE WELCOME SCREEN, before question one: a title, a message, a picture and a Start button. */
|
|
4585
|
+
interface FormWelcome {
|
|
4586
|
+
title?: string | null;
|
|
4587
|
+
body?: string | null;
|
|
4588
|
+
pictureFileId?: Uuid | null;
|
|
4589
|
+
pictureUrl?: string | null;
|
|
4590
|
+
buttonLabel?: string | null;
|
|
4533
4591
|
}
|
|
4534
4592
|
/** The look. Tokens, so light and dark both come out right without a second theme. */
|
|
4535
4593
|
interface FormTheme {
|
|
4536
4594
|
/** A design-system accent class or a CSS color. Left out, the app's own accent. */
|
|
4537
4595
|
accent?: string | null;
|
|
4538
4596
|
align?: "left" | "center" | null;
|
|
4597
|
+
/** One of design-system `FORM_FONTS`. */
|
|
4598
|
+
font?: string | null;
|
|
4599
|
+
/** One of design-system `FORM_BUTTON_STYLES`. */
|
|
4600
|
+
button?: string | null;
|
|
4601
|
+
/** One of design-system `FORM_BACKGROUNDS`. */
|
|
4602
|
+
background?: string | null;
|
|
4603
|
+
/** The picture for the `picture` background: a public picture of the organization. */
|
|
4604
|
+
backgroundFileId?: Uuid | null;
|
|
4605
|
+
/** Its public address, as the store resolved it for the public page. */
|
|
4606
|
+
backgroundUrl?: string | null;
|
|
4539
4607
|
}
|
|
4540
4608
|
/**
|
|
4541
4609
|
* THE FORM'S OWN LOOK, in the portal's words (`custom._portal_style` resolves both): a colour of
|
|
@@ -4545,8 +4613,8 @@ interface FormTheme {
|
|
|
4545
4613
|
*/
|
|
4546
4614
|
interface FormLook {
|
|
4547
4615
|
accent?: PortalAccent | null;
|
|
4548
|
-
logoFileId?: Uuid
|
|
4549
|
-
coverFileId?: Uuid
|
|
4616
|
+
logoFileId?: Uuid | null;
|
|
4617
|
+
coverFileId?: Uuid | null;
|
|
4550
4618
|
}
|
|
4551
4619
|
/** The screen after sending: the form's words, and optionally where to go next. */
|
|
4552
4620
|
interface FormThankYou {
|
|
@@ -4559,7 +4627,7 @@ interface FormThankYou {
|
|
|
4559
4627
|
interface FormSpec {
|
|
4560
4628
|
name: string;
|
|
4561
4629
|
/** The Table a submission lands in. */
|
|
4562
|
-
subject: Uuid
|
|
4630
|
+
subject: Uuid;
|
|
4563
4631
|
intro?: string | null;
|
|
4564
4632
|
questions: FormQuestionSpec[];
|
|
4565
4633
|
flow?: FormFlow | null;
|
|
@@ -4576,6 +4644,15 @@ interface FormSpec {
|
|
|
4576
4644
|
*/
|
|
4577
4645
|
thankYou?: FormThankYou | null;
|
|
4578
4646
|
submitLabel?: string | null;
|
|
4647
|
+
/** A separate first screen with a Start button (lane TYPEFORM-DUP). */
|
|
4648
|
+
welcome?: FormWelcome | null;
|
|
4649
|
+
/** Several endings, each picked by the answers (lane TYPEFORM-DUP). */
|
|
4650
|
+
endings?: FormEnding[] | null;
|
|
4651
|
+
/**
|
|
4652
|
+
* HIDDEN FIELDS: names read from the link (`?utm_source=…&ref=…`), kept on the submission and
|
|
4653
|
+
* never shown. Not questions — a question with the same key is prefilled instead.
|
|
4654
|
+
*/
|
|
4655
|
+
hiddenFields?: string[] | null;
|
|
4579
4656
|
/**
|
|
4580
4657
|
* Is this form meant to be answerable by someone who is not signed in? The
|
|
4581
4658
|
* runner does NOT make that true by itself — it needs the anonymous write
|
|
@@ -4595,7 +4672,7 @@ interface FormSpec {
|
|
|
4595
4672
|
* read here and handed straight back by `formDeclareArgs`.
|
|
4596
4673
|
*/
|
|
4597
4674
|
interface SavedForm extends FormSpec {
|
|
4598
|
-
id: Uuid
|
|
4675
|
+
id: Uuid;
|
|
4599
4676
|
/** draft · open · closed · full — the store's own word, never derived on a screen. */
|
|
4600
4677
|
state: FormSummary["state"];
|
|
4601
4678
|
/** The form's readable name in the store. `form_declare` keeps it across saves. */
|
|
@@ -4603,9 +4680,9 @@ interface SavedForm extends FormSpec {
|
|
|
4603
4680
|
/** Stops taking answers at this many. Null is no ceiling. */
|
|
4604
4681
|
submissionCap: number | null;
|
|
4605
4682
|
/** The accept Rule: what counts as a complete answer. Null holds every answer for a person. */
|
|
4606
|
-
quarantineRuleId: Uuid
|
|
4683
|
+
quarantineRuleId: Uuid | null;
|
|
4607
4684
|
/** The subscription Rule that tells somebody an answer arrived. */
|
|
4608
|
-
notifyRuleId: Uuid
|
|
4685
|
+
notifyRuleId: Uuid | null;
|
|
4609
4686
|
}
|
|
4610
4687
|
/**
|
|
4611
4688
|
* The spec as `custom.anon_form.presentation` holds it.
|
|
@@ -4616,19 +4693,40 @@ interface SavedForm extends FormSpec {
|
|
|
4616
4693
|
* different lists.
|
|
4617
4694
|
*/
|
|
4618
4695
|
declare function formPresentation(spec: FormSpec): Record<string, unknown>;
|
|
4696
|
+
declare function themeFromDocument(raw: unknown): FormTheme | null;
|
|
4697
|
+
declare function welcomeFromDocument(raw: unknown): FormWelcome | null;
|
|
4698
|
+
declare function endingsFromDocument(raw: unknown): FormEnding[];
|
|
4699
|
+
/** The hidden fields' values out of a link's query, narrowed to the names the form declares. */
|
|
4700
|
+
declare function hiddenFromLink(hiddenFields: readonly string[] | null | undefined, params: Record<string, string | string[] | undefined>): Record<string, string>;
|
|
4701
|
+
/** Does this form route at all — conditions, jumps, endings or points the store must judge? */
|
|
4702
|
+
declare function formRoutes(form: Pick<FormSpec, "questions" | "endings">): boolean;
|
|
4703
|
+
/** HOW A FORM GOES INTO SOMEBODY ELSE'S PAGE. */
|
|
4704
|
+
declare const FORM_EMBEDS: readonly ["inline", "popup", "slider"];
|
|
4705
|
+
type FormEmbed = (typeof FORM_EMBEDS)[number];
|
|
4706
|
+
/**
|
|
4707
|
+
* THE SNIPPET THE OWNER COPIES (lane TYPEFORM-DUP). `inline` is a plain iframe of the public link
|
|
4708
|
+
* in embed mode; `popup` and `slider` are one button plus the platform's own embed script
|
|
4709
|
+
* (`<origin>/embed/form.js`), which opens the same iframe in a centred window or a side panel.
|
|
4710
|
+
* Nothing in either needs a cookie: the form keeps its place in its own storage and posts to its
|
|
4711
|
+
* own origin, so it keeps working with third-party cookies blocked.
|
|
4712
|
+
*/
|
|
4713
|
+
declare function formEmbedSnippet(kind: FormEmbed, formUrl: string, options?: {
|
|
4714
|
+
label?: string | null;
|
|
4715
|
+
height?: number | null;
|
|
4716
|
+
}): string;
|
|
4619
4717
|
/** `presentation.look` both directions. Nothing set is `null`, one spelling on both sides. */
|
|
4620
4718
|
declare function formLookDocument(look: FormLook | null): Record<string, unknown> | null;
|
|
4621
4719
|
declare function formLookFromDocument(raw: unknown): FormLook | null;
|
|
4622
4720
|
/** The exact arguments `custom.form_declare` is called with, for a new form or a re-statement. */
|
|
4623
4721
|
declare function formDeclareArgs(form: FormSpec | SavedForm): {
|
|
4624
|
-
table_id: Uuid
|
|
4722
|
+
table_id: Uuid;
|
|
4625
4723
|
title: string;
|
|
4626
4724
|
questions: FormQuestionSpec[];
|
|
4627
4725
|
presentation: Record<string, unknown>;
|
|
4628
4726
|
submission_cap: number | null;
|
|
4629
|
-
quarantine_rule_id: Uuid
|
|
4630
|
-
notify_rule_id: Uuid
|
|
4631
|
-
form_id: Uuid
|
|
4727
|
+
quarantine_rule_id: Uuid | null;
|
|
4728
|
+
notify_rule_id: Uuid | null;
|
|
4729
|
+
form_id: Uuid | null;
|
|
4632
4730
|
slug: string | null;
|
|
4633
4731
|
};
|
|
4634
4732
|
/** One row of `custom.forms` back into the spec a screen and an agent both read. */
|
|
@@ -4641,21 +4739,29 @@ declare function formFromSummary(summary: FormSummary): SavedForm;
|
|
|
4641
4739
|
* through export, History and the agent's context without a parallel table.
|
|
4642
4740
|
*/
|
|
4643
4741
|
declare function submissionStamp(args: {
|
|
4644
|
-
formId: Uuid
|
|
4742
|
+
formId: Uuid | null;
|
|
4645
4743
|
formName: string;
|
|
4646
4744
|
actor: string;
|
|
4647
4745
|
onBehalfOf?: string | null;
|
|
4648
4746
|
}): Record<string, unknown>;
|
|
4649
4747
|
|
|
4748
|
+
interface FormResultsPanelProps {
|
|
4749
|
+
form: SavedForm | (FormSpec & {
|
|
4750
|
+
id: Uuid$1;
|
|
4751
|
+
});
|
|
4752
|
+
className?: string | undefined;
|
|
4753
|
+
}
|
|
4754
|
+
declare function FormResultsPanel({ form, className }: FormResultsPanelProps): react.JSX.Element;
|
|
4755
|
+
|
|
4650
4756
|
interface PortalBuilderProps {
|
|
4651
4757
|
/**
|
|
4652
4758
|
* OPTIONAL. The Table whose rail this was opened from. It is pre-ticked as a
|
|
4653
4759
|
* Table to expose, because that is the thing the person was looking at.
|
|
4654
4760
|
*/
|
|
4655
|
-
tableId?: Uuid | null | undefined;
|
|
4761
|
+
tableId?: Uuid$1 | null | undefined;
|
|
4656
4762
|
/** Re-state an existing portal rather than making a second one. */
|
|
4657
|
-
portalId?: Uuid | null | undefined;
|
|
4658
|
-
onSaved?: ((portalId: Uuid) => void) | undefined;
|
|
4763
|
+
portalId?: Uuid$1 | null | undefined;
|
|
4764
|
+
onSaved?: ((portalId: Uuid$1) => void) | undefined;
|
|
4659
4765
|
onClose?: (() => void) | undefined;
|
|
4660
4766
|
className?: string | undefined;
|
|
4661
4767
|
}
|
|
@@ -4685,13 +4791,13 @@ interface PortalsPanelProps {
|
|
|
4685
4791
|
* Omit it and the rail is organization-wide again, which is right for a
|
|
4686
4792
|
* mount that is not standing on a table.
|
|
4687
4793
|
*/
|
|
4688
|
-
tableId?: Uuid | undefined;
|
|
4794
|
+
tableId?: Uuid$1 | undefined;
|
|
4689
4795
|
/**
|
|
4690
4796
|
* THE PORTAL A LINK NAMED (`?rail=portals&item=<portal>`, lane HUB-FIX). Its
|
|
4691
4797
|
* card opens on arrival and is scrolled to. A portal this table is not in is
|
|
4692
4798
|
* said out loud, never swapped for another portal.
|
|
4693
4799
|
*/
|
|
4694
|
-
activePortalId?: Uuid | null | undefined;
|
|
4800
|
+
activePortalId?: Uuid$1 | null | undefined;
|
|
4695
4801
|
className?: string | undefined;
|
|
4696
4802
|
}
|
|
4697
4803
|
/** What a door answered, for a view that never holds a client of its own. */
|
|
@@ -4726,11 +4832,11 @@ interface PortalCardViewProps {
|
|
|
4726
4832
|
/** Exactly what `custom.portal_card` answered. */
|
|
4727
4833
|
card: PortalCard;
|
|
4728
4834
|
/** The Table whose page this is on, if any — marked among the ones shown. */
|
|
4729
|
-
tableId?: Uuid | undefined;
|
|
4835
|
+
tableId?: Uuid$1 | undefined;
|
|
4730
4836
|
/** Take one person's way in away. Answers the door's own past-tense sentence. */
|
|
4731
4837
|
onRevoke: (person: PortalPrincipal) => Promise<PortalAnswer<string>>;
|
|
4732
4838
|
/** What this person sees on one Table — `custom.portal_preview`'s answer. */
|
|
4733
|
-
onPreview: (person: PortalPrincipal, tableId: Uuid) => Promise<PortalAnswer<PortalPreviewRow[]>>;
|
|
4839
|
+
onPreview: (person: PortalPrincipal, tableId: Uuid$1) => Promise<PortalAnswer<PortalPreviewRow[]>>;
|
|
4734
4840
|
/** The invite control, which needs a client of its own. Absent means none is offered. */
|
|
4735
4841
|
invite?: ReactNode;
|
|
4736
4842
|
/** S6 — the look-and-forms editor, which needs a client of its own. Absent means none is offered. */
|
|
@@ -4769,8 +4875,8 @@ interface PublicPicturePickerProps {
|
|
|
4769
4875
|
label: string;
|
|
4770
4876
|
/** The organization's public pictures, as the store listed them. */
|
|
4771
4877
|
pictures: readonly PublicPicture[];
|
|
4772
|
-
value: Uuid
|
|
4773
|
-
onChange: (fileId: Uuid
|
|
4878
|
+
value: Uuid | "" | null | undefined;
|
|
4879
|
+
onChange: (fileId: Uuid | "") => void;
|
|
4774
4880
|
/** The words on the empty choice ("Organization logo", "No cover"). */
|
|
4775
4881
|
noneLabel: string;
|
|
4776
4882
|
className?: string | undefined;
|
|
@@ -4812,13 +4918,13 @@ declare function FormLookFrame({ look, title, children, contained, className }:
|
|
|
4812
4918
|
|
|
4813
4919
|
interface DigestSchedulerProps {
|
|
4814
4920
|
/** The Table the digest is about. A saved view is a view OF something. */
|
|
4815
|
-
tableId: Uuid;
|
|
4921
|
+
tableId: Uuid$1;
|
|
4816
4922
|
/**
|
|
4817
4923
|
* The view to subscribe over, when the caller already has one — a dashboard
|
|
4818
4924
|
* passes the view its blocks are filtered by. Left out, the person picks one
|
|
4819
4925
|
* of this Table's saved views or this screen saves a new one for them.
|
|
4820
4926
|
*/
|
|
4821
|
-
savedViewId?: Uuid | null | undefined;
|
|
4927
|
+
savedViewId?: Uuid$1 | null | undefined;
|
|
4822
4928
|
/**
|
|
4823
4929
|
* What the person is looking at, in their words — a dashboard's name, a view's
|
|
4824
4930
|
* name. It becomes the digest's name and, when a view has to be saved, the
|
|
@@ -4848,14 +4954,14 @@ interface DigestSchedulerProps {
|
|
|
4848
4954
|
declare function DigestScheduler({ tableId, savedViewId, subjectName, filters, onScheduled, onClose, className, existing, }: DigestSchedulerProps): react.JSX.Element;
|
|
4849
4955
|
|
|
4850
4956
|
interface SubscriptionsPanelProps {
|
|
4851
|
-
tableId: Uuid;
|
|
4957
|
+
tableId: Uuid$1;
|
|
4852
4958
|
/**
|
|
4853
4959
|
* THE DIGEST A LINK NAMED (`?rail=notifications&item=<rule>`, lane HUB-FIX).
|
|
4854
4960
|
* The rule is marked and scrolled to. This rail lists the subscriptions of the
|
|
4855
4961
|
* person signed in, so a rule that is somebody else's is said out loud as
|
|
4856
4962
|
* exactly that — never replaced by one of theirs.
|
|
4857
4963
|
*/
|
|
4858
|
-
activeRuleId?: Uuid | null | undefined;
|
|
4964
|
+
activeRuleId?: Uuid$1 | null | undefined;
|
|
4859
4965
|
className?: string | undefined;
|
|
4860
4966
|
}
|
|
4861
4967
|
/** The sentence when a link named a digest that is not in this person's list for this table. */
|
|
@@ -4940,7 +5046,7 @@ declare function viewNeedFor(layout: ViewLayout): ViewNeed | null;
|
|
|
4940
5046
|
declare function columnDeclarationFor(need: ViewNeed, label: string, options: readonly string[], fields: readonly Pick<Field, "sort">[] | null | undefined): NewFieldDeclaration;
|
|
4941
5047
|
interface ViewNeedsProps {
|
|
4942
5048
|
layout: ViewLayout;
|
|
4943
|
-
tableId: Uuid
|
|
5049
|
+
tableId: Uuid;
|
|
4944
5050
|
/** The table's columns, as the layout already holds them. */
|
|
4945
5051
|
fields: readonly Field[];
|
|
4946
5052
|
/**
|
|
@@ -4954,7 +5060,7 @@ declare function ViewNeeds({ layout, tableId, fields, onMade, className }: ViewN
|
|
|
4954
5060
|
|
|
4955
5061
|
interface FormBuilderProps {
|
|
4956
5062
|
/** The Table this form collects into. A form is a view on a real Table. */
|
|
4957
|
-
tableId: Uuid;
|
|
5063
|
+
tableId: Uuid$1;
|
|
4958
5064
|
/**
|
|
4959
5065
|
* COMPLETE DECLARATIVE SPECS an agent wrote. Any of these whose name this
|
|
4960
5066
|
* table does not have yet is saved as a record the first time the builder
|
|
@@ -4962,7 +5068,7 @@ interface FormBuilderProps {
|
|
|
4962
5068
|
* overwrites what a person has since tweaked.
|
|
4963
5069
|
*/
|
|
4964
5070
|
seed?: FormSpec[] | undefined;
|
|
4965
|
-
activeFormId?: Uuid | null | undefined;
|
|
5071
|
+
activeFormId?: Uuid$1 | null | undefined;
|
|
4966
5072
|
onActiveForm?: ((form: SavedForm) => void) | undefined;
|
|
4967
5073
|
/**
|
|
4968
5074
|
* The person asked to BUILD a form on a table that has none: make it on open, instead of an
|
|
@@ -5004,7 +5110,7 @@ interface ChartSpec {
|
|
|
5004
5110
|
id?: string;
|
|
5005
5111
|
title: string;
|
|
5006
5112
|
/** The Table this block asks about. */
|
|
5007
|
-
subject: Uuid
|
|
5113
|
+
subject: Uuid;
|
|
5008
5114
|
kind: ChartKind;
|
|
5009
5115
|
/** Field keys whose values become the groups. */
|
|
5010
5116
|
groupBy?: string[];
|
|
@@ -5031,23 +5137,23 @@ interface ChartSpec {
|
|
|
5031
5137
|
}
|
|
5032
5138
|
/** A dashboard as `custom.dashboards` reports it, in the screen's own words. */
|
|
5033
5139
|
interface SavedDashboard {
|
|
5034
|
-
id: Uuid
|
|
5140
|
+
id: Uuid;
|
|
5035
5141
|
name: string;
|
|
5036
5142
|
/** The subject Table: the one a block that names no table of its own reads. */
|
|
5037
|
-
subject: Uuid
|
|
5143
|
+
subject: Uuid | null;
|
|
5038
5144
|
blocks: ChartSpec[];
|
|
5039
5145
|
presentation: Record<string, unknown>;
|
|
5040
5146
|
/** The store's own version. A save re-states the whole dashboard. */
|
|
5041
5147
|
version: number;
|
|
5042
5148
|
}
|
|
5043
5149
|
/** One saved block back into the shape a screen edits. */
|
|
5044
|
-
declare function specFromBlock(block: DashboardBlock, subject: Uuid
|
|
5150
|
+
declare function specFromBlock(block: DashboardBlock, subject: Uuid): ChartSpec;
|
|
5045
5151
|
/**
|
|
5046
5152
|
* One block back into the door's own argument. `custom.dashboard_declare` judges
|
|
5047
5153
|
* every block on the way IN — a block naming a Field this Table does not have is
|
|
5048
5154
|
* refused BY NAME — so a canvas cannot be saved broken.
|
|
5049
5155
|
*/
|
|
5050
|
-
declare function blockFromSpec(spec: ChartSpec, subject: Uuid
|
|
5156
|
+
declare function blockFromSpec(spec: ChartSpec, subject: Uuid): DashboardBlock;
|
|
5051
5157
|
/** One row of `custom.dashboards` into the shape a screen and an agent both read. */
|
|
5052
5158
|
declare function dashboardFromSummary(summary: DashboardSummary): SavedDashboard;
|
|
5053
5159
|
/**
|
|
@@ -5056,12 +5162,12 @@ declare function dashboardFromSummary(summary: DashboardSummary): SavedDashboard
|
|
|
5056
5162
|
* a save that dropped it would quietly lose the question the person asked the
|
|
5057
5163
|
* agent, which is what the canvas is FOR.
|
|
5058
5164
|
*/
|
|
5059
|
-
declare function dashboardDeclareArgs(board: SavedDashboard, subject: Uuid
|
|
5060
|
-
table_id: Uuid
|
|
5165
|
+
declare function dashboardDeclareArgs(board: SavedDashboard, subject: Uuid): {
|
|
5166
|
+
table_id: Uuid;
|
|
5061
5167
|
name: string;
|
|
5062
5168
|
blocks: DashboardBlock[];
|
|
5063
5169
|
presentation: Record<string, unknown>;
|
|
5064
|
-
dashboard_id: Uuid
|
|
5170
|
+
dashboard_id: Uuid | null;
|
|
5065
5171
|
};
|
|
5066
5172
|
/**
|
|
5067
5173
|
* The series palette. Six SEMANTIC tokens the design system already flips for
|
|
@@ -5135,18 +5241,18 @@ declare function ChartLegendContent({ payload, config, className, }: {
|
|
|
5135
5241
|
|
|
5136
5242
|
interface DocTemplateProps {
|
|
5137
5243
|
/** The Table these templates render. */
|
|
5138
|
-
tableId: Uuid;
|
|
5244
|
+
tableId: Uuid$1;
|
|
5139
5245
|
/** COMPLETE templates an agent wrote, in Field keys. Saved once, never overwritten. */
|
|
5140
5246
|
seed?: DocTemplateSpec[] | undefined;
|
|
5141
|
-
activeTemplateId?: Uuid | null | undefined;
|
|
5247
|
+
activeTemplateId?: Uuid$1 | null | undefined;
|
|
5142
5248
|
onActiveTemplate?: ((template: DocTemplateRow) => void) | undefined;
|
|
5143
5249
|
className?: string | undefined;
|
|
5144
5250
|
}
|
|
5145
5251
|
declare function DocTemplate({ tableId, seed, activeTemplateId, onActiveTemplate, className }: DocTemplateProps): react.JSX.Element;
|
|
5146
5252
|
|
|
5147
5253
|
interface DocRenderProps {
|
|
5148
|
-
templateId: Uuid;
|
|
5149
|
-
recordId: Uuid;
|
|
5254
|
+
templateId: Uuid$1;
|
|
5255
|
+
recordId: Uuid$1;
|
|
5150
5256
|
/** A name for the file when somebody takes the PDF. */
|
|
5151
5257
|
filename?: string | undefined;
|
|
5152
5258
|
onRendered?: ((render: DocRenderRow) => void) | undefined;
|
|
@@ -5155,8 +5261,8 @@ interface DocRenderProps {
|
|
|
5155
5261
|
declare function DocRender({ templateId, recordId, filename, onRendered, className }: DocRenderProps): react.JSX.Element;
|
|
5156
5262
|
|
|
5157
5263
|
interface SignBlockProps {
|
|
5158
|
-
tableId: Uuid;
|
|
5159
|
-
recordId: Uuid;
|
|
5264
|
+
tableId: Uuid$1;
|
|
5265
|
+
recordId: Uuid$1;
|
|
5160
5266
|
/** The frozen version being signed. Without one there is nothing to seal. */
|
|
5161
5267
|
render: DocRenderRow | null;
|
|
5162
5268
|
className?: string | undefined;
|
|
@@ -5166,7 +5272,7 @@ declare function SignBlock({ tableId, recordId, render, className }: SignBlockPr
|
|
|
5166
5272
|
/** THE DECLARATIVE SPEC an agent writes. One declaration and a person is told. */
|
|
5167
5273
|
interface NotifyRuleSpec {
|
|
5168
5274
|
name: string;
|
|
5169
|
-
savedViewId: Uuid;
|
|
5275
|
+
savedViewId: Uuid$1;
|
|
5170
5276
|
/** `instant` fires the moment a record enters the view; the rest are summaries. */
|
|
5171
5277
|
cadence?: string;
|
|
5172
5278
|
/** The summary's schedule — "monday 08:00". Meaningless for `instant`. */
|
|
@@ -5175,12 +5281,12 @@ interface NotifyRuleSpec {
|
|
|
5175
5281
|
/** The hours not to be told in. A send inside them is MOVED, never dropped. */
|
|
5176
5282
|
quietHours?: QuietHours | null;
|
|
5177
5283
|
/** Who is told. Left out, the person setting it up — "tell ME". */
|
|
5178
|
-
recipientUserId?: Uuid | null;
|
|
5284
|
+
recipientUserId?: Uuid$1 | null;
|
|
5179
5285
|
eventKey?: string;
|
|
5180
5286
|
}
|
|
5181
5287
|
interface NotifyRuleEditorProps {
|
|
5182
5288
|
/** The Table these subscriptions are about — the Rule's scope. */
|
|
5183
|
-
tableId: Uuid;
|
|
5289
|
+
tableId: Uuid$1;
|
|
5184
5290
|
/** COMPLETE declarative subscriptions an agent wrote. Saved once, never overwritten. */
|
|
5185
5291
|
seed?: NotifyRuleSpec[] | undefined;
|
|
5186
5292
|
/**
|
|
@@ -5188,9 +5294,9 @@ interface NotifyRuleEditorProps {
|
|
|
5188
5294
|
* Rule). Given with `onChoose`, each subscription offers to be the one, and a
|
|
5189
5295
|
* subscription made here becomes the one the moment the store has it.
|
|
5190
5296
|
*/
|
|
5191
|
-
chosenRuleId?: Uuid | null | undefined;
|
|
5297
|
+
chosenRuleId?: Uuid$1 | null | undefined;
|
|
5192
5298
|
/** CHOOSE MODE — called with the chosen subscription's Rule id, or null to choose none. */
|
|
5193
|
-
onChoose?: ((ruleId: Uuid | null) => void) | undefined;
|
|
5299
|
+
onChoose?: ((ruleId: Uuid$1 | null) => void) | undefined;
|
|
5194
5300
|
className?: string | undefined;
|
|
5195
5301
|
}
|
|
5196
5302
|
declare function NotifyRuleEditor({ tableId, seed, chosenRuleId, onChoose, className }: NotifyRuleEditorProps): react.JSX.Element;
|
|
@@ -5199,7 +5305,7 @@ interface ChartBlockProps {
|
|
|
5199
5305
|
/** One block out of the canvas's single run — answered, or refused. */
|
|
5200
5306
|
block: DashboardBlockResult;
|
|
5201
5307
|
/** The dashboard's subject Table, for a block that names none of its own. */
|
|
5202
|
-
subject: Uuid
|
|
5308
|
+
subject: Uuid;
|
|
5203
5309
|
/** The table this chart reads, named in its header on a dashboard across tables. */
|
|
5204
5310
|
tableName?: string | undefined;
|
|
5205
5311
|
className?: string | undefined;
|
|
@@ -5224,8 +5330,8 @@ declare function ChartBlock({ block, subject, tableName, className, centerValue,
|
|
|
5224
5330
|
|
|
5225
5331
|
interface DashboardCanvasProps {
|
|
5226
5332
|
/** The Table these blocks are about. */
|
|
5227
|
-
tableId: Uuid;
|
|
5228
|
-
activeDashboardId?: Uuid | null | undefined;
|
|
5333
|
+
tableId: Uuid$1;
|
|
5334
|
+
activeDashboardId?: Uuid$1 | null | undefined;
|
|
5229
5335
|
/** The one filter bar across the canvas. Merged UNDER each block's own filter. */
|
|
5230
5336
|
filter?: Record<string, AggregateFilter> | undefined;
|
|
5231
5337
|
/**
|
|
@@ -5234,7 +5340,7 @@ interface DashboardCanvasProps {
|
|
|
5234
5340
|
*/
|
|
5235
5341
|
createOnMount?: boolean | undefined;
|
|
5236
5342
|
/** Told the id of a dashboard this canvas made (the starter, or `createOnMount`'s). */
|
|
5237
|
-
onCreated?: ((dashboardId: Uuid) => void) | undefined;
|
|
5343
|
+
onCreated?: ((dashboardId: Uuid$1) => void) | undefined;
|
|
5238
5344
|
className?: string | undefined;
|
|
5239
5345
|
}
|
|
5240
5346
|
declare function DashboardCanvas({ tableId, activeDashboardId, filter, createOnMount, onCreated, className }: DashboardCanvasProps): react.JSX.Element;
|
|
@@ -5323,40 +5429,40 @@ declare function flatWhere(where: RuleExpression | null, fields: readonly Field[
|
|
|
5323
5429
|
* ASK THE STORE. `fields` are this table's Fields (the condition builder writes Fields by id, and a
|
|
5324
5430
|
* formula column cannot be asked "as of"). Every number in the answer is a door's.
|
|
5325
5431
|
*/
|
|
5326
|
-
declare function askQuestion(client: RecordsClient, tableId: Uuid
|
|
5432
|
+
declare function askQuestion(client: RecordsClient, tableId: Uuid, spec: QuestionSpec, fields: readonly Field[]): Promise<RecordsResult<QuestionAnswer>>;
|
|
5327
5433
|
/**
|
|
5328
5434
|
* THE COLUMNS THIS READER MAY NOT READ, asked of the store: one aggregate measuring how many
|
|
5329
5435
|
* records fill each column that carries a sensitivity, and every measure the store WITHHOLDS is a
|
|
5330
5436
|
* column never offered. Nothing is guessed from levels here; the store decides, as it does for the
|
|
5331
5437
|
* grid's cells.
|
|
5332
5438
|
*/
|
|
5333
|
-
declare function unreadableKeys(client: RecordsClient, tableId: Uuid
|
|
5439
|
+
declare function unreadableKeys(client: RecordsClient, tableId: Uuid, fields: readonly Field[]): Promise<Set<string>>;
|
|
5334
5440
|
/** The columns a measure other than count may read: numbers (formula arithmetic included); min/max also dates. */
|
|
5335
5441
|
declare function measurableFields(fields: readonly Field[], op: QuestionOp): Field[];
|
|
5336
5442
|
/** The saved-view surface a Question is kept under, beside the table's views (`custom/records`). */
|
|
5337
5443
|
declare const QUESTION_SURFACE = "custom/records/question";
|
|
5338
5444
|
interface SavedQuestion {
|
|
5339
|
-
id: Uuid
|
|
5445
|
+
id: Uuid;
|
|
5340
5446
|
name: string;
|
|
5341
5447
|
spec: QuestionSpec;
|
|
5342
5448
|
/** Shared with the organization (`internal`) or kept for its maker (`personal`). */
|
|
5343
5449
|
shared: boolean;
|
|
5344
5450
|
version: number;
|
|
5345
|
-
createdBy: Uuid
|
|
5451
|
+
createdBy: Uuid | null;
|
|
5346
5452
|
}
|
|
5347
5453
|
/** The table's Questions this person may read (the row's own access decides). */
|
|
5348
|
-
declare function questionsOf(client: RecordsClient, tableId: Uuid
|
|
5454
|
+
declare function questionsOf(client: RecordsClient, tableId: Uuid): Promise<RecordsResult<SavedQuestion[]>>;
|
|
5349
5455
|
/** Keep a Question (new when `id` is absent). `null` data = somebody changed it first. */
|
|
5350
5456
|
declare function questionSave(client: RecordsClient, args: {
|
|
5351
|
-
id?: Uuid
|
|
5352
|
-
tableId: Uuid
|
|
5457
|
+
id?: Uuid | null;
|
|
5458
|
+
tableId: Uuid;
|
|
5353
5459
|
name: string;
|
|
5354
5460
|
spec: QuestionSpec;
|
|
5355
5461
|
shared: boolean;
|
|
5356
5462
|
expectedVersion?: number;
|
|
5357
5463
|
}): Promise<RecordsResult<SavedQuestion | null>>;
|
|
5358
5464
|
/** Archive a Question (its maker, or an admin of it). */
|
|
5359
|
-
declare function questionArchive(client: RecordsClient, id: Uuid
|
|
5465
|
+
declare function questionArchive(client: RecordsClient, id: Uuid, version?: number): Promise<RecordsResult<boolean>>;
|
|
5360
5466
|
|
|
5361
5467
|
/** A related table's columns, keyed by the relation that reaches it. */
|
|
5362
5468
|
type Related = Record<string, {
|
|
@@ -5364,9 +5470,9 @@ type Related = Record<string, {
|
|
|
5364
5470
|
fields: Field[];
|
|
5365
5471
|
}>;
|
|
5366
5472
|
interface QuestionPanelProps {
|
|
5367
|
-
tableId: Uuid;
|
|
5473
|
+
tableId: Uuid$1;
|
|
5368
5474
|
/** A saved Question the address named (`?view=questions&item=<id>`). */
|
|
5369
|
-
activeQuestionId?: Uuid | null | undefined;
|
|
5475
|
+
activeQuestionId?: Uuid$1 | null | undefined;
|
|
5370
5476
|
/**
|
|
5371
5477
|
* A question asked elsewhere and not saved yet (the table's Ask box, "Open in Questions"):
|
|
5372
5478
|
* the builder opens holding it, as a new question. A new object each time it is handed over.
|
|
@@ -5377,7 +5483,7 @@ interface QuestionPanelProps {
|
|
|
5377
5483
|
declare function QuestionPanel({ tableId, activeQuestionId, draft, className }: QuestionPanelProps): react.JSX.Element;
|
|
5378
5484
|
/** The answer as Questions draws it — also the table's Ask box's answer (`TableAsk.tsx`): one drawing, one number. */
|
|
5379
5485
|
declare function QuestionAnswerView({ tableId, spec, answer, fields, related }: {
|
|
5380
|
-
tableId: Uuid;
|
|
5486
|
+
tableId: Uuid$1;
|
|
5381
5487
|
spec: QuestionSpec;
|
|
5382
5488
|
answer: QuestionAnswer;
|
|
5383
5489
|
fields: Field[];
|
|
@@ -5385,7 +5491,7 @@ declare function QuestionAnswerView({ tableId, spec, answer, fields, related }:
|
|
|
5385
5491
|
}): react.JSX.Element;
|
|
5386
5492
|
|
|
5387
5493
|
interface TableAskProps {
|
|
5388
|
-
tableId: Uuid;
|
|
5494
|
+
tableId: Uuid$1;
|
|
5389
5495
|
/** Open the answered question in the Question builder. Absent, the button is not drawn. */
|
|
5390
5496
|
onOpenInQuestions?: ((spec: QuestionSpec) => void) | undefined;
|
|
5391
5497
|
}
|
|
@@ -5411,13 +5517,13 @@ declare function questionFromWords(text: string, fields: readonly Field[], choic
|
|
|
5411
5517
|
|
|
5412
5518
|
interface PageScreenProps {
|
|
5413
5519
|
/** The page to open. */
|
|
5414
|
-
pageId?: Uuid | null | undefined;
|
|
5520
|
+
pageId?: Uuid$1 | null | undefined;
|
|
5415
5521
|
/** Make a new page on this Table instead (its starter: a list and a record panel), then open it. */
|
|
5416
|
-
newOnTable?: Uuid | null | undefined;
|
|
5522
|
+
newOnTable?: Uuid$1 | null | undefined;
|
|
5417
5523
|
/** The signed-in person: "Assigned to me" is her own Person record. */
|
|
5418
5524
|
viewerUserId?: string | null | undefined;
|
|
5419
5525
|
/** Told the id of the page `newOnTable` made. */
|
|
5420
|
-
onCreated?: ((pageId: Uuid) => void) | undefined;
|
|
5526
|
+
onCreated?: ((pageId: Uuid$1) => void) | undefined;
|
|
5421
5527
|
/** The page was archived: the host leaves it. */
|
|
5422
5528
|
onArchived?: (() => void) | undefined;
|
|
5423
5529
|
/** Open in edit mode (a page just made). */
|
|
@@ -5445,9 +5551,9 @@ interface PageBlockBase {
|
|
|
5445
5551
|
}
|
|
5446
5552
|
interface ListPageBlock extends PageBlockBase {
|
|
5447
5553
|
kind: "list";
|
|
5448
|
-
table_id: Uuid
|
|
5554
|
+
table_id: Uuid;
|
|
5449
5555
|
/** A saved view of the table: its filter and sort shape the list. */
|
|
5450
|
-
view_id?: Uuid
|
|
5556
|
+
view_id?: Uuid | null;
|
|
5451
5557
|
/** The block's own question, the store's flat filter (field key → value). */
|
|
5452
5558
|
filter?: RecordFilter;
|
|
5453
5559
|
/** The columns shown, by field key; left out, the first few the table declares. */
|
|
@@ -5467,18 +5573,18 @@ interface ButtonPageBlock extends PageBlockBase {
|
|
|
5467
5573
|
kind: "button";
|
|
5468
5574
|
/** The list block whose selected row the action runs on. */
|
|
5469
5575
|
source: string;
|
|
5470
|
-
table_id: Uuid
|
|
5576
|
+
table_id: Uuid;
|
|
5471
5577
|
/** An existing row action of that table (`custom.row_actions`). */
|
|
5472
|
-
action_id: Uuid
|
|
5578
|
+
action_id: Uuid;
|
|
5473
5579
|
}
|
|
5474
5580
|
interface FormPageBlock extends PageBlockBase {
|
|
5475
5581
|
kind: "form";
|
|
5476
|
-
table_id: Uuid
|
|
5477
|
-
form_id: Uuid
|
|
5582
|
+
table_id: Uuid;
|
|
5583
|
+
form_id: Uuid;
|
|
5478
5584
|
}
|
|
5479
5585
|
interface FilterPageBlock extends PageBlockBase {
|
|
5480
5586
|
kind: "filter";
|
|
5481
|
-
table_id: Uuid
|
|
5587
|
+
table_id: Uuid;
|
|
5482
5588
|
/** A choice (or yes/no) column of that table. */
|
|
5483
5589
|
field: string;
|
|
5484
5590
|
/** The list blocks it narrows. Empty = every list on the page over the same table. */
|
|
@@ -5524,7 +5630,7 @@ declare function pagePresentation(presentation: Record<string, unknown> | null |
|
|
|
5524
5630
|
* THE STARTER PAGE on one table, the way Airtable's record-review layout starts: the table's records
|
|
5525
5631
|
* on the left, the chosen one on the right. One press makes a page that already works.
|
|
5526
5632
|
*/
|
|
5527
|
-
declare function starterPageBlocks(tableId: Uuid
|
|
5633
|
+
declare function starterPageBlocks(tableId: Uuid): PageBlock[];
|
|
5528
5634
|
/** The list blocks a filter block narrows: those it names, or every list over its table. */
|
|
5529
5635
|
declare function filterTargets(filter: FilterPageBlock, blocks: readonly PageBlock[]): string[];
|
|
5530
5636
|
/**
|
|
@@ -5534,20 +5640,20 @@ declare function filterTargets(filter: FilterPageBlock, blocks: readonly PageBlo
|
|
|
5534
5640
|
* value wins). The view asks a Rule: the extras join it under `and`, by field id, which is the only
|
|
5535
5641
|
* way the Rule shape names a column (REC-17). An extra whose key has no id is left out and named.
|
|
5536
5642
|
*/
|
|
5537
|
-
declare function combineFilter(base: StoreFilter | null | undefined, extra: RecordFilter, fieldIdOf: (key: string) => string | undefined): {
|
|
5538
|
-
filter: StoreFilter | null;
|
|
5643
|
+
declare function combineFilter(base: StoreFilter$1 | null | undefined, extra: RecordFilter, fieldIdOf: (key: string) => string | undefined): {
|
|
5644
|
+
filter: StoreFilter$1 | null;
|
|
5539
5645
|
dropped: string[];
|
|
5540
5646
|
};
|
|
5541
5647
|
|
|
5542
5648
|
interface FormsPanelProps {
|
|
5543
|
-
tableId: Uuid;
|
|
5649
|
+
tableId: Uuid$1;
|
|
5544
5650
|
/**
|
|
5545
5651
|
* THE FORM A LINK NAMED (`?rail=forms&item=<form>`, lane HUB-FIX). The rail
|
|
5546
5652
|
* opens ON it: marked and scrolled to, and — for somebody who may build — its
|
|
5547
5653
|
* builder open on that form. An id this table has no form by is said out
|
|
5548
5654
|
* loud, never swapped for the first form in the list.
|
|
5549
5655
|
*/
|
|
5550
|
-
activeFormId?: Uuid | null | undefined;
|
|
5656
|
+
activeFormId?: Uuid$1 | null | undefined;
|
|
5551
5657
|
className?: string | undefined;
|
|
5552
5658
|
}
|
|
5553
5659
|
/** The sentence when a link named a form this table does not have. */
|
|
@@ -5567,6 +5673,10 @@ type FormAsked = {
|
|
|
5567
5673
|
asked: boolean;
|
|
5568
5674
|
said?: string | null;
|
|
5569
5675
|
}>;
|
|
5676
|
+
/** TYPEFORM-DUP: the ending the store's route reached (null: the thank-you screen). */
|
|
5677
|
+
ending?: string | null | undefined;
|
|
5678
|
+
/** TYPEFORM-DUP: the score so far (null: the form carries no points). */
|
|
5679
|
+
score?: number | null | undefined;
|
|
5570
5680
|
} | {
|
|
5571
5681
|
ok: false;
|
|
5572
5682
|
message: string;
|
|
@@ -5576,7 +5686,7 @@ type FormAsked = {
|
|
|
5576
5686
|
type FormSubmitOutcome = {
|
|
5577
5687
|
ok: true;
|
|
5578
5688
|
message?: string | null;
|
|
5579
|
-
recordId?: Uuid | null;
|
|
5689
|
+
recordId?: Uuid$1 | null;
|
|
5580
5690
|
} | {
|
|
5581
5691
|
ok: false;
|
|
5582
5692
|
message: string;
|
|
@@ -5625,8 +5735,12 @@ interface FormRunnerProps {
|
|
|
5625
5735
|
resumed?: boolean | undefined;
|
|
5626
5736
|
/** Preview mode answers the questions but writes nothing, and says so. */
|
|
5627
5737
|
preview?: boolean | undefined;
|
|
5628
|
-
onSubmitted?: ((recordId: Uuid | null) => void) | undefined;
|
|
5738
|
+
onSubmitted?: ((recordId: Uuid$1 | null) => void) | undefined;
|
|
5629
5739
|
className?: string | undefined;
|
|
5740
|
+
/** TYPEFORM-DUP: called once, at the person's first answer — the host counts a start. */
|
|
5741
|
+
onStart?: (() => void) | undefined;
|
|
5742
|
+
/** TYPEFORM-DUP: called as each question is put in front of the person — the host counts drop-off. */
|
|
5743
|
+
onQuestionShown?: ((fieldKey: string) => void) | undefined;
|
|
5630
5744
|
}
|
|
5631
5745
|
/**
|
|
5632
5746
|
* THE ONE ENTRY POINT. It picks the arm and nothing else: a caller that brought
|
|
@@ -5637,11 +5751,11 @@ declare function FormRunner(props: FormRunnerProps): react.JSX.Element;
|
|
|
5637
5751
|
|
|
5638
5752
|
interface ChecklistRunnerProps {
|
|
5639
5753
|
/** The Table runs are ABOUT. On a record page, the record's own table. */
|
|
5640
|
-
tableId?: Uuid | null | undefined;
|
|
5754
|
+
tableId?: Uuid$1 | null | undefined;
|
|
5641
5755
|
/** Runs about THIS record — a new hire, a matter, a job. */
|
|
5642
|
-
recordId?: Uuid | null | undefined;
|
|
5756
|
+
recordId?: Uuid$1 | null | undefined;
|
|
5643
5757
|
/** One run, named outright. Overrides the two above. */
|
|
5644
|
-
runId?: Uuid | null | undefined;
|
|
5758
|
+
runId?: Uuid$1 | null | undefined;
|
|
5645
5759
|
/** Show runs that have been closed too. The default is what is still open. */
|
|
5646
5760
|
includeClosed?: boolean | undefined;
|
|
5647
5761
|
/** Offer the templates that could be started here. On by default with a record. */
|
|
@@ -5675,7 +5789,7 @@ declare function StepRow({ step, busy, onComplete, onAssign, className, }: {
|
|
|
5675
5789
|
*/
|
|
5676
5790
|
declare function useMyChecklistSteps(limit?: number): {
|
|
5677
5791
|
steps: Array<ChecklistRunStep & {
|
|
5678
|
-
run_id: Uuid;
|
|
5792
|
+
run_id: Uuid$1;
|
|
5679
5793
|
run_name: string;
|
|
5680
5794
|
}>;
|
|
5681
5795
|
loading: boolean;
|
|
@@ -5694,12 +5808,12 @@ declare function MyChecklistSteps({ className, onlyIds, onSteps, actions, }: {
|
|
|
5694
5808
|
/** Every step id this group holds, so the inbox can draw each step once — here, where it is finished. */
|
|
5695
5809
|
onSteps?: ((ids: string[]) => void) | undefined;
|
|
5696
5810
|
/** The inbox's own controls for a step (snooze, done), drawn beside it. */
|
|
5697
|
-
actions?: ((stepId: Uuid) => ReactNode) | undefined;
|
|
5811
|
+
actions?: ((stepId: Uuid$1) => ReactNode) | undefined;
|
|
5698
5812
|
}): react.JSX.Element | null;
|
|
5699
5813
|
interface ChecklistsPanelProps {
|
|
5700
|
-
tableId: Uuid;
|
|
5814
|
+
tableId: Uuid$1;
|
|
5701
5815
|
/** Open the record a run is about. */
|
|
5702
|
-
onOpenRecord?: ((recordId: Uuid) => void) | undefined;
|
|
5816
|
+
onOpenRecord?: ((recordId: Uuid$1) => void) | undefined;
|
|
5703
5817
|
className?: string | undefined;
|
|
5704
5818
|
}
|
|
5705
5819
|
/**
|
|
@@ -5718,15 +5832,15 @@ declare function ChecklistsPanel({ tableId, onOpenRecord, className }: Checklist
|
|
|
5718
5832
|
* validator here: a rule written twice is a rule that will disagree with itself.
|
|
5719
5833
|
*/
|
|
5720
5834
|
declare function ChecklistTemplateEditor({ aboutTableId, templateId, onDone, onSaved, className, }: {
|
|
5721
|
-
aboutTableId: Uuid;
|
|
5722
|
-
templateId?: Uuid | null | undefined;
|
|
5835
|
+
aboutTableId: Uuid$1;
|
|
5836
|
+
templateId?: Uuid$1 | null | undefined;
|
|
5723
5837
|
/** Cancel; and, when the host passes no `onSaved`, a finished Save. */
|
|
5724
5838
|
onDone?: (() => void) | undefined;
|
|
5725
5839
|
/**
|
|
5726
5840
|
* A Save landed: the checklist's id. Passed, the editor STAYS open and says it is saved (the
|
|
5727
5841
|
* host decides where to go); every later Save re-states that same checklist.
|
|
5728
5842
|
*/
|
|
5729
|
-
onSaved?: ((templateId: Uuid) => void) | undefined;
|
|
5843
|
+
onSaved?: ((templateId: Uuid$1) => void) | undefined;
|
|
5730
5844
|
className?: string | undefined;
|
|
5731
5845
|
}): react.JSX.Element;
|
|
5732
5846
|
|
|
@@ -5748,9 +5862,9 @@ declare function whyNotAskable(fields: readonly Field[], hidden?: readonly strin
|
|
|
5748
5862
|
declare const STORE_ANSWERS_THESE: readonly ["slot", "status", "booked_with"];
|
|
5749
5863
|
interface BookingBuilderProps {
|
|
5750
5864
|
/** The Table the appointments land in. An appointment is an ordinary record in it. */
|
|
5751
|
-
tableId: Uuid;
|
|
5865
|
+
tableId: Uuid$1;
|
|
5752
5866
|
/** Re-state an existing page rather than making a second one over the same Table. */
|
|
5753
|
-
bookingId?: Uuid | null | undefined;
|
|
5867
|
+
bookingId?: Uuid$1 | null | undefined;
|
|
5754
5868
|
/** Called after a save, so the list this opened from re-reads the store. */
|
|
5755
5869
|
onSaved?: ((page: {
|
|
5756
5870
|
form_id: string;
|
|
@@ -5773,13 +5887,13 @@ interface BookingSlotsProps {
|
|
|
5773
5887
|
* booking page in this organization, which is the same door asked the wider
|
|
5774
5888
|
* question, never a second list.
|
|
5775
5889
|
*/
|
|
5776
|
-
tableId?: Uuid | null | undefined;
|
|
5890
|
+
tableId?: Uuid$1 | null | undefined;
|
|
5777
5891
|
/**
|
|
5778
5892
|
* THE BOOKING PAGE A LINK NAMED (`?rail=bookings&item=<page>`, lane HUB-FIX,
|
|
5779
5893
|
* VERIFIER-16 M4). It is marked and scrolled to. A page this rail does not
|
|
5780
5894
|
* list is said out loud, never swapped for another.
|
|
5781
5895
|
*/
|
|
5782
|
-
activeBookingId?: Uuid | null | undefined;
|
|
5896
|
+
activeBookingId?: Uuid$1 | null | undefined;
|
|
5783
5897
|
className?: string | undefined;
|
|
5784
5898
|
}
|
|
5785
5899
|
/** The sentence when a link named a booking page this rail does not list. */
|
|
@@ -5811,9 +5925,9 @@ interface CaptureSheetProps {
|
|
|
5811
5925
|
* Without one this stays the ad-hoc capture below, which guesses which Field a
|
|
5812
5926
|
* reading goes in — right for a quick one-off, wrong for a crew.
|
|
5813
5927
|
*/
|
|
5814
|
-
sheetId?: Uuid | undefined;
|
|
5928
|
+
sheetId?: Uuid$1 | undefined;
|
|
5815
5929
|
/** The Table a capture becomes a record in. Not needed when `sheetId` is given. */
|
|
5816
|
-
tableId: Uuid;
|
|
5930
|
+
tableId: Uuid$1;
|
|
5817
5931
|
/** Which Field a reading's number goes in. Defaults to the first range Field. */
|
|
5818
5932
|
readingField?: string | undefined;
|
|
5819
5933
|
/** Which Field the note goes in. Defaults to the Table's title field. */
|
|
@@ -5825,7 +5939,7 @@ interface CaptureSheetProps {
|
|
|
5825
5939
|
declare function CaptureSheet({ sheetId, tableId, readingField, noteField, attachmentField, className, }: CaptureSheetProps): react.JSX.Element;
|
|
5826
5940
|
|
|
5827
5941
|
interface CaptureRunProps {
|
|
5828
|
-
sheetId: Uuid
|
|
5942
|
+
sheetId: Uuid;
|
|
5829
5943
|
/**
|
|
5830
5944
|
* The sheet, already loaded — by a server render, or from the phone's own copy. Given
|
|
5831
5945
|
* one, this component makes NO network call before the first question is on screen.
|
|
@@ -5839,7 +5953,7 @@ declare function CaptureRun({ sheetId, face: given, className }: CaptureRunProps
|
|
|
5839
5953
|
|
|
5840
5954
|
interface PortalShellProps {
|
|
5841
5955
|
/** The Table the outsider's records belong to. */
|
|
5842
|
-
tableId: Uuid;
|
|
5956
|
+
tableId: Uuid$1;
|
|
5843
5957
|
/** OPTIONAL. A form the outsider may send — their one way to put something in. */
|
|
5844
5958
|
form?: FormSpec | undefined;
|
|
5845
5959
|
/** What the resources are called in `iam`'s own vocabulary. Default `record`. */
|
|
@@ -5857,12 +5971,12 @@ declare function PublicViewPage({ slug, className }: PublicViewPageProps): react
|
|
|
5857
5971
|
|
|
5858
5972
|
interface EmbedFrameProps {
|
|
5859
5973
|
/** The Table whose rights decide whether an embed may be issued at all. */
|
|
5860
|
-
tableId: Uuid;
|
|
5974
|
+
tableId: Uuid$1;
|
|
5861
5975
|
/** A write embed names the form it writes into. */
|
|
5862
|
-
formId?: Uuid | null | undefined;
|
|
5976
|
+
formId?: Uuid$1 | null | undefined;
|
|
5863
5977
|
/** A read embed names the saved view or the record it shows. */
|
|
5864
|
-
savedViewId?: Uuid | null | undefined;
|
|
5865
|
-
recordId?: Uuid | null | undefined;
|
|
5978
|
+
savedViewId?: Uuid$1 | null | undefined;
|
|
5979
|
+
recordId?: Uuid$1 | null | undefined;
|
|
5866
5980
|
/** Where the embedded page is served from — the `src` of the iframe. */
|
|
5867
5981
|
embedUrl: string;
|
|
5868
5982
|
className?: string | undefined;
|
|
@@ -5916,7 +6030,7 @@ interface RecordsMountProps {
|
|
|
5916
6030
|
children: ReactNode;
|
|
5917
6031
|
}
|
|
5918
6032
|
declare function RecordsMount({ config, host, letTheStoreDecideRights, children, }: RecordsMountProps): react.JSX.Element;
|
|
5919
|
-
declare function personActor(userId: Uuid
|
|
6033
|
+
declare function personActor(userId: Uuid | null | undefined): RecordsActor;
|
|
5920
6034
|
declare function recordsDataSource(client: object, fallbackSchema?: string): RecordsDataSource;
|
|
5921
6035
|
|
|
5922
6036
|
type TableLane = "mine" | "organization" | "system" | "community" | "app";
|
|
@@ -5985,7 +6099,7 @@ interface TablesHomeProps {
|
|
|
5985
6099
|
* unchanged; a host that ignores it lands on the records, which is what it
|
|
5986
6100
|
* did before, rather than on a screen it does not know how to address.
|
|
5987
6101
|
*/
|
|
5988
|
-
onOpenTable?: ((tableId: Uuid
|
|
6102
|
+
onOpenTable?: ((tableId: Uuid, dashboardId?: Uuid) => void) | undefined;
|
|
5989
6103
|
/**
|
|
5990
6104
|
* THE ORGANIZATION EVERY ROW HERE LIVES IN, BY NAME (lane SC-1-TAILS; access-is-personal: a
|
|
5991
6105
|
* list filtered by one organization says which). Each row carries a quiet "Lives in <name>"
|
|
@@ -6023,7 +6137,7 @@ interface TablesHomeProps {
|
|
|
6023
6137
|
declare function TablesHome({ onOpenTable, organizationName, makingOnly, askedBy, templatesHref, className }: TablesHomeProps): react.JSX.Element;
|
|
6024
6138
|
|
|
6025
6139
|
interface WhereItLivesProps {
|
|
6026
|
-
tableId: Uuid
|
|
6140
|
+
tableId: Uuid;
|
|
6027
6141
|
/**
|
|
6028
6142
|
* The name the screen already holds (a list whose rows all live in one organization), shown
|
|
6029
6143
|
* until the store answers — and, on a row, instead of asking at all until the chip is pressed:
|
|
@@ -6032,7 +6146,7 @@ interface WhereItLivesProps {
|
|
|
6032
6146
|
knownOrganizationName?: string | null | undefined;
|
|
6033
6147
|
/** After a move lands: the host re-reads (the list, its rows, the page). */
|
|
6034
6148
|
onMoved?: ((to: {
|
|
6035
|
-
id: Uuid
|
|
6149
|
+
id: Uuid;
|
|
6036
6150
|
name: string;
|
|
6037
6151
|
}) => void) | undefined;
|
|
6038
6152
|
/**
|
|
@@ -6076,7 +6190,7 @@ declare function sameViewAddress(a: ViewAddressState | null | undefined, b: View
|
|
|
6076
6190
|
|
|
6077
6191
|
type Rail = "none" | "settings" | "inbox" | "import" | "field" | "record" | "new-record" | "forms" | "bookings" | "checklists" | "notifications" | "portals" | "who-changed" | "export";
|
|
6078
6192
|
interface TablePageProps$1 {
|
|
6079
|
-
tableId: Uuid
|
|
6193
|
+
tableId: Uuid;
|
|
6080
6194
|
/**
|
|
6081
6195
|
* `embedded` — a table inside a page, like Notion's inline database (CHAIR-GRID-LINKS 06): the
|
|
6082
6196
|
* same page with its furniture off. No title row (the host draws it), no Layout chooser, and the
|
|
@@ -6126,7 +6240,7 @@ interface TablePageProps$1 {
|
|
|
6126
6240
|
* canvas on that dashboard; absent, the page opens on the records exactly as
|
|
6127
6241
|
* it always has.
|
|
6128
6242
|
*/
|
|
6129
|
-
activeDashboardId?: Uuid
|
|
6243
|
+
activeDashboardId?: Uuid | null | undefined;
|
|
6130
6244
|
/**
|
|
6131
6245
|
* THE RECORD A LINK NAMED, OPENED ON ARRIVAL.
|
|
6132
6246
|
*
|
|
@@ -6139,7 +6253,7 @@ interface TablePageProps$1 {
|
|
|
6139
6253
|
*
|
|
6140
6254
|
* Absent, nothing changes: the page opens exactly as it did.
|
|
6141
6255
|
*/
|
|
6142
|
-
activeRecordId?: Uuid
|
|
6256
|
+
activeRecordId?: Uuid | null | undefined;
|
|
6143
6257
|
/**
|
|
6144
6258
|
* WHICH VIEW THE ADDRESS NAMES — `grid`, `kanban`, `calendar`, `gallery` or
|
|
6145
6259
|
* `dashboards`, exactly as the host read it out of `?view=`.
|
|
@@ -6160,10 +6274,7 @@ interface TablePageProps$1 {
|
|
|
6160
6274
|
* Half a deep link is a link that works when you arrive and lies when you
|
|
6161
6275
|
* copy it out of the address bar afterwards.
|
|
6162
6276
|
*/
|
|
6163
|
-
/**
|
|
6164
|
-
* Called with the view the person moved to — one of `PAGE_VIEWS`, or the id of a
|
|
6165
|
-
* layout the HOST draws (`RecordsUiHost.layouts`), which the address carries too.
|
|
6166
|
-
*/
|
|
6277
|
+
/** Called with the view the person moved to: one of `PAGE_VIEWS`, which the address carries too. */
|
|
6167
6278
|
onViewChanged?: ((view: PageView | string) => void) | undefined;
|
|
6168
6279
|
/**
|
|
6169
6280
|
* WHICH FIELD THE ADDRESS WANTS THE BOARD'S COLUMNS TO BE, for this visit.
|
|
@@ -6228,7 +6339,7 @@ interface TablePageProps$1 {
|
|
|
6228
6339
|
* opened, the rule marked and scrolled to. An id the rail does not hold is
|
|
6229
6340
|
* said out loud by the rail, never replaced by its first row.
|
|
6230
6341
|
*/
|
|
6231
|
-
activeItemId?: Uuid
|
|
6342
|
+
activeItemId?: Uuid | null | undefined;
|
|
6232
6343
|
/**
|
|
6233
6344
|
* THE PAGE'S HEADER, handed the table's own page-level controls (lane TABLE-PAGE-CHROME, owner
|
|
6234
6345
|
* 2026-09-25: "align with the app's top-tier pages"). Called with `actions` — Share and the
|
|
@@ -6261,7 +6372,7 @@ interface TablePageProps$1 {
|
|
|
6261
6372
|
*/
|
|
6262
6373
|
onShownViewChange?: ((shown: ShownViewReport) => void) | undefined;
|
|
6263
6374
|
/**
|
|
6264
|
-
* THE VIEW IN THE ADDRESS BAR (FTS-5 item 2
|
|
6375
|
+
* THE VIEW IN THE ADDRESS BAR (FTS-5 item 2). What the address
|
|
6265
6376
|
* said about the person's look on arrival — sort, column filters, search, hidden columns, page
|
|
6266
6377
|
* (`viewAddressFromParams`). Read once, on arrival. Absent: the page opens as it always did.
|
|
6267
6378
|
*/
|
|
@@ -6292,7 +6403,7 @@ interface ShownViewReport {
|
|
|
6292
6403
|
/** The saved view under the look; null while the views are read or when there are none. */
|
|
6293
6404
|
viewId: string | null;
|
|
6294
6405
|
viewName: string | null;
|
|
6295
|
-
/** "records" layouts (grid, kanban, calendar, gallery
|
|
6406
|
+
/** "records" layouts (grid, kanban, calendar, gallery), or the main view. */
|
|
6296
6407
|
showing: string;
|
|
6297
6408
|
groupField: string | null;
|
|
6298
6409
|
dateField: string | null;
|
|
@@ -6421,9 +6532,9 @@ declare function surfaceChosen(current: Surface, asking: SurfacePress): boolean;
|
|
|
6421
6532
|
* WHAT THE PAGE OPENS SHOWING — one pure function, so the dead link can be shown failing.
|
|
6422
6533
|
* See `TablePageProps.activeRecordId` for the defect it closes.
|
|
6423
6534
|
*/
|
|
6424
|
-
declare function openingRail(activeRecordId: Uuid
|
|
6535
|
+
declare function openingRail(activeRecordId: Uuid | null | undefined, activeRail?: string | null | undefined): {
|
|
6425
6536
|
rail: "record" | "none" | Exclude<LinkRail, "share">;
|
|
6426
|
-
record: Uuid
|
|
6537
|
+
record: Uuid | null;
|
|
6427
6538
|
};
|
|
6428
6539
|
/** The rails a link may open, plus `share`, which opens the share dialog over the page. */
|
|
6429
6540
|
type LinkRail = "forms" | "bookings" | "checklists" | "notifications" | "portals" | "settings" | "import" | "inbox" | "export" | "field" | "share";
|
|
@@ -6449,7 +6560,7 @@ declare const SHARE_NOT_YOURS_LINE: string;
|
|
|
6449
6560
|
* A `?dashboard=<id>` with no `?view=` still opens the canvas, because that
|
|
6450
6561
|
* link predates this one and must keep working.
|
|
6451
6562
|
*/
|
|
6452
|
-
declare function openingView(activeView: string | null | undefined, activeDashboardId: Uuid
|
|
6563
|
+
declare function openingView(activeView: string | null | undefined, activeDashboardId: Uuid | null | undefined): {
|
|
6453
6564
|
main: MainView;
|
|
6454
6565
|
layout: ViewLayout | null;
|
|
6455
6566
|
unknown: string | null;
|
|
@@ -6589,7 +6700,7 @@ declare function EntityTablePage(props: EntityTablePageProps): react.JSX.Element
|
|
|
6589
6700
|
|
|
6590
6701
|
type TablePageSource = {
|
|
6591
6702
|
kind: "table";
|
|
6592
|
-
id: Uuid
|
|
6703
|
+
id: Uuid;
|
|
6593
6704
|
} | {
|
|
6594
6705
|
kind: "entity";
|
|
6595
6706
|
token: string;
|
|
@@ -6620,7 +6731,7 @@ declare function InTableToolbar({ children }: {
|
|
|
6620
6731
|
}): react.JSX.Element | null;
|
|
6621
6732
|
|
|
6622
6733
|
/** What the roster can tell us about a user id. `null` when it cannot. */
|
|
6623
|
-
type ResolveName = (userId: Uuid
|
|
6734
|
+
type ResolveName = (userId: Uuid) => string | null;
|
|
6624
6735
|
/** The honest stand-in when nobody and nothing can put a name to the author. */
|
|
6625
6736
|
declare const SOMEBODY = "somebody in this organization";
|
|
6626
6737
|
/** The platform's own word for itself. Never "null", never "system_user". */
|
|
@@ -6654,18 +6765,18 @@ interface WhoChanged {
|
|
|
6654
6765
|
* asking its question, exactly as before, and nothing throws.
|
|
6655
6766
|
*/
|
|
6656
6767
|
declare function WhoChangedSource({ tableId, labelOf, children, }: {
|
|
6657
|
-
tableId: Uuid
|
|
6768
|
+
tableId: Uuid;
|
|
6658
6769
|
/** The Field's own label, so the sentence reads "Primary diagnosis" and not `primary_diagnosis`. */
|
|
6659
6770
|
labelOf: (fieldKey: string) => string;
|
|
6660
6771
|
children: ReactNode;
|
|
6661
6772
|
}): react.JSX.Element;
|
|
6662
6773
|
/** What this cell can say about who last changed it. */
|
|
6663
|
-
declare function useWhoChanged(fieldKey: string, recordId: Uuid
|
|
6774
|
+
declare function useWhoChanged(fieldKey: string, recordId: Uuid): WhoChanged;
|
|
6664
6775
|
|
|
6665
6776
|
interface ShareControlProps {
|
|
6666
6777
|
kind: ShareSubject["kind"];
|
|
6667
|
-
organizationId: Uuid
|
|
6668
|
-
subjectId: Uuid
|
|
6778
|
+
organizationId: Uuid;
|
|
6779
|
+
subjectId: Uuid;
|
|
6669
6780
|
/** What to call it in the dialog's title. */
|
|
6670
6781
|
name?: string | undefined;
|
|
6671
6782
|
/**
|
|
@@ -6785,7 +6896,7 @@ declare function WithheldValue({ field, notice }: {
|
|
|
6785
6896
|
}): react.JSX.Element;
|
|
6786
6897
|
|
|
6787
6898
|
interface PipelineBoardProps {
|
|
6788
|
-
tableId: Uuid;
|
|
6899
|
+
tableId: Uuid$1;
|
|
6789
6900
|
/** The rows the view holds — the SAME rows every other layout of this view draws. */
|
|
6790
6901
|
rows: ReadRow$1[];
|
|
6791
6902
|
/**
|
|
@@ -6800,9 +6911,9 @@ interface PipelineBoardProps {
|
|
|
6800
6911
|
* headings are counted by the store with THE SAME question (`pipelineBoard({filter})`), so a
|
|
6801
6912
|
* column never says 16 over the 4 cards a view put in it.
|
|
6802
6913
|
*/
|
|
6803
|
-
filter?: StoreFilter | null | undefined;
|
|
6914
|
+
filter?: StoreFilter$1 | null | undefined;
|
|
6804
6915
|
onMeasureChange?: ((key: string | null) => void) | undefined;
|
|
6805
|
-
onOpenRecord?: ((recordId: Uuid) => void) | undefined;
|
|
6916
|
+
onOpenRecord?: ((recordId: Uuid$1) => void) | undefined;
|
|
6806
6917
|
/** Called after a move lands, so the host re-reads the rows it owns. */
|
|
6807
6918
|
onMoved?: (() => void) | undefined;
|
|
6808
6919
|
/** A card's menu copied or archived a record: the host re-reads the rows it owns. */
|
|
@@ -6853,7 +6964,7 @@ declare function useDrillAnswers(args: {
|
|
|
6853
6964
|
question: MatrxDrillQuestion;
|
|
6854
6965
|
where: Record<string, unknown>;
|
|
6855
6966
|
/** A custom Table's nested (Rule) question, when its view asks one. */
|
|
6856
|
-
rule?: StoreFilter
|
|
6967
|
+
rule?: StoreFilter | undefined;
|
|
6857
6968
|
/** The time Dimension a window (and a comparison) runs along. */
|
|
6858
6969
|
windowKey?: string | undefined;
|
|
6859
6970
|
version?: unknown;
|
|
@@ -6875,7 +6986,7 @@ declare function useDrill(args: {
|
|
|
6875
6986
|
onQuestionChange: (next: MatrxDrillQuestion) => void;
|
|
6876
6987
|
/** The host's own flat filter, before the trail. */
|
|
6877
6988
|
filter?: RecordFilter | undefined;
|
|
6878
|
-
rule?: StoreFilter
|
|
6989
|
+
rule?: StoreFilter | undefined;
|
|
6879
6990
|
version?: unknown;
|
|
6880
6991
|
rowNoun?: string;
|
|
6881
6992
|
rootLabel?: string;
|
|
@@ -6896,8 +7007,8 @@ declare function ObjectActionGlyph({ name, ...props }: {
|
|
|
6896
7007
|
|
|
6897
7008
|
/** What the list needs to know about the record. */
|
|
6898
7009
|
interface RecordActionSubject {
|
|
6899
|
-
id: Uuid
|
|
6900
|
-
tableId: Uuid
|
|
7010
|
+
id: Uuid;
|
|
7011
|
+
tableId: Uuid;
|
|
6901
7012
|
/** The record's name as every card reads it (`recordNameIn` / `cardWords`). */
|
|
6902
7013
|
name: string;
|
|
6903
7014
|
}
|
|
@@ -6942,9 +7053,9 @@ declare function recordLink(tableId: string, recordId: string, origin?: string):
|
|
|
6942
7053
|
declare function recordActions(input: RecordActionsInput): ObjectAction[];
|
|
6943
7054
|
|
|
6944
7055
|
interface RecordActionHostArgs {
|
|
6945
|
-
tableId: Uuid;
|
|
7056
|
+
tableId: Uuid$1;
|
|
6946
7057
|
row: ReadRow$1;
|
|
6947
|
-
onOpenRecord?: ((recordId: Uuid) => void) | undefined;
|
|
7058
|
+
onOpenRecord?: ((recordId: Uuid$1) => void) | undefined;
|
|
6948
7059
|
/** Re-read the surface after a copy or an archive. */
|
|
6949
7060
|
onChanged?: (() => void) | undefined;
|
|
6950
7061
|
/** Open the merge dialog for this record (`MergeRecordDialog`). Absent: Merge says why. */
|
|
@@ -6974,8 +7085,8 @@ interface ViewActionHost {
|
|
|
6974
7085
|
declare function viewActions(whyNot: string | null, host: ViewActionHost): ObjectAction[];
|
|
6975
7086
|
|
|
6976
7087
|
interface RecordPanelProps {
|
|
6977
|
-
tableId: Uuid;
|
|
6978
|
-
recordId: Uuid;
|
|
7088
|
+
tableId: Uuid$1;
|
|
7089
|
+
recordId: Uuid$1;
|
|
6979
7090
|
/** Put the record away (the rail's close). Absent on a page of its own. */
|
|
6980
7091
|
onClose?: (() => void) | undefined;
|
|
6981
7092
|
/**
|
|
@@ -6999,8 +7110,8 @@ declare const BODY_COLUMN_NAME = "Notes";
|
|
|
6999
7110
|
/** How long a pause in typing is before the body is written. */
|
|
7000
7111
|
declare const BODY_SAVE_PAUSE_MS = 900;
|
|
7001
7112
|
declare function RecordBody({ tableId, recordId, className }: {
|
|
7002
|
-
tableId: Uuid;
|
|
7003
|
-
recordId: Uuid;
|
|
7113
|
+
tableId: Uuid$1;
|
|
7114
|
+
recordId: Uuid$1;
|
|
7004
7115
|
className?: string | undefined;
|
|
7005
7116
|
}): react.JSX.Element;
|
|
7006
7117
|
|
|
@@ -7073,7 +7184,7 @@ declare function copyNameFor(name: string): string;
|
|
|
7073
7184
|
/** One line of progress, in a person's words. */
|
|
7074
7185
|
declare function duplicateProgressWords(p: TableDuplicateProgress): string;
|
|
7075
7186
|
interface TableDuplicateDialogProps {
|
|
7076
|
-
tableId: Uuid
|
|
7187
|
+
tableId: Uuid;
|
|
7077
7188
|
name: string;
|
|
7078
7189
|
open: boolean;
|
|
7079
7190
|
onOpenChange: (open: boolean) => void;
|
|
@@ -7083,7 +7194,7 @@ interface TableDuplicateDialogProps {
|
|
|
7083
7194
|
declare function TableDuplicateDialog({ tableId, name, open, onOpenChange, onDuplicated }: TableDuplicateDialogProps): react.JSX.Element;
|
|
7084
7195
|
|
|
7085
7196
|
/** The two references a table gives, in the words a person reads. Pure. */
|
|
7086
|
-
declare function tableReferenceChoices(tableId: Uuid
|
|
7197
|
+
declare function tableReferenceChoices(tableId: Uuid, name: string): Array<{
|
|
7087
7198
|
id: string;
|
|
7088
7199
|
label: string;
|
|
7089
7200
|
reference: ContentTransferReference;
|
|
@@ -7094,29 +7205,13 @@ declare function TableReferenceDialog({ table, open, onOpenChange, }: {
|
|
|
7094
7205
|
onOpenChange: (open: boolean) => void;
|
|
7095
7206
|
}): react.JSX.Element;
|
|
7096
7207
|
|
|
7097
|
-
/** The columns a record may be named by, in the table's order. Pure. */
|
|
7098
|
-
declare function rowLabelChoices(fields: readonly Field$1[]): Array<{
|
|
7099
|
-
value: string;
|
|
7100
|
-
label: string;
|
|
7101
|
-
}>;
|
|
7102
|
-
/** The patch that keeps a description: the table's other metadata is carried, never dropped. Pure. */
|
|
7103
|
-
declare function descriptionPatch(table: Pick<Table$1, "metadata">, text: string): {
|
|
7104
|
-
metadata: Record<string, unknown>;
|
|
7105
|
-
};
|
|
7106
|
-
declare function TableDetails({ tableId, table, fields, onSaved, }: {
|
|
7107
|
-
tableId: Uuid;
|
|
7108
|
-
table: Table$1;
|
|
7109
|
-
fields: readonly Field$1[];
|
|
7110
|
-
onSaved?: (() => void) | undefined;
|
|
7111
|
-
}): react.JSX.Element;
|
|
7112
|
-
|
|
7113
7208
|
/** What a "the app's code depends on this table" refusal names, or null for any other refusal. */
|
|
7114
7209
|
declare function codeDependsRefusal(error: RecordsError | null | undefined): {
|
|
7115
7210
|
slug: string;
|
|
7116
7211
|
declaredIn: string | null;
|
|
7117
7212
|
} | null;
|
|
7118
7213
|
interface ArchiveDeliberatelyDialogProps {
|
|
7119
|
-
tableId: Uuid
|
|
7214
|
+
tableId: Uuid;
|
|
7120
7215
|
name: string;
|
|
7121
7216
|
slug: string;
|
|
7122
7217
|
declaredIn: string | null;
|
|
@@ -7201,4 +7296,4 @@ declare function RecordsSkeleton({ layout, embedded, rows, className }: RecordsS
|
|
|
7201
7296
|
*/
|
|
7202
7297
|
declare function TablePageSkeleton({ layout: layoutAsked, embedded, rows, tableId, className, }: RecordsSkeletonProps): react.JSX.Element;
|
|
7203
7298
|
|
|
7204
|
-
export { ABSENCE_WORD_LABEL, ABSENCE_WORD_VALUES, ACTION_KINDS, ARCHIVED_NEVER_DESTROYED, ARCHIVE_MEANS, ASK_EXAMPLE, type AbsenceWord, AccentSwatches, type AccentSwatchesProps, ActionInbox, type ActionInboxProps, type ActionKind, type AgentBuildAsk, type AnnounceTableArchived, type AppletPageBlock, ArchiveDeliberatelyDialog, type ArchiveDeliberatelyDialogProps, ArchivedDisclosure, type ArchivedDisclosureProps, ArchivedPortals, type ArchivedPortalsProps, ArchivedView, type ArchivedViewProps, type AskRead, BODY_COLUMN_NAME, BODY_SAVE_PAUSE_MS, BOOKING_NOT_HERE_LINE, BOOKING_PAGE_STATE_LABEL, BOOKING_PAGE_STATE_VALUES, BookingBuilder, type BookingBuilderProps, type BookingPageState, BookingSlots, type BookingSlotsProps, BuildOrAsk, type BuildOrAskProps, type BuildableKind, type ButtonPageBlock, CAPTURE_MODES, CHART_KINDS, CHART_KIND_LABEL, CHART_NEEDS, CHECKLIST_REQUIREMENT_KINDS, CHECKLIST_REQUIREMENT_LABEL, CONDITION_OPS, CONTEXT_POLICY_LABEL, ADDABLE_TYPES as CUSTOM_FIELD_ADDABLE_TYPES, type CalendarMode, CalendarView, type CalendarViewProps, type CaptureMode, type CaptureQueuePort, CaptureRun, type CaptureRunProps, CaptureSheet, type CaptureSheetProps, type CellAddress, type CellRefusal, type CellState, ChartBlock, type ChartBlockProps, type ChartConfig, ChartFrame, type ChartKind, ChartLegendContent, type ChartPageBlock, type ChartSpec, ChartTooltipContent, ChecklistRunner, type ChecklistRunnerProps, ChecklistTemplateEditor, ChecklistsPanel, type ChecklistsPanelProps, type ChoiceAddition, type ChoiceAsk, ChoiceAskButtons, ChoiceListEditor, type ChoiceListRow, type CombinedRows, CommentThread, type CommentThreadProps, type ConditionField, ConditionGroup, type ConditionGroupProps, ConditionRow, type ConditionRowProps, type CustomFieldAddRequest, type CustomFieldAddResult, type CustomFieldSetResult, type CustomFieldValuesRequest, type CustomFieldsAgentDoor, type CustomFieldsAgentState, CustomFieldsSection, type CustomFieldsSectionProps, DEFAULT_FOOTER, DEFAULT_VIEW_NAME, DUE_STATE_LABEL, DashboardCanvas, type DashboardCanvasProps, DigestScheduler, type DigestSchedulerProps, DocRender, type DocRenderProps, DocTemplate, type DocTemplateProps, type DocTemplateSpec, EMPTY_PRESENTATION, ENGINEER_TEXT, ENTITY_REFERENCE_KINDS_MISSING, type EditorKind, EmbedFrame, type EmbedFrameProps, type EnrichAsk, EnrichBadge, type EnrichBadgeProps, type EnrichOutcome, EnrichPanel, type EnrichPanelProps, EntityBoard, type EntityBoardProps, EntityChartBlock, type EntityChartBlockProps, type EntityColumn, EntityDataScope, EntityGrid, type EntityLayout, EntityReferenceKindPicker, type EntityReferenceKindPickerProps, type EntityRow, type EntitySource, type EntityTable, EntityTablePage, type EntityTablePageProps, ExportMenu, type ExportMenuProps, FIELD_RULE_KIND_LABEL, FIELD_RULE_KIND_VALUES, FIELD_SENSITIVITY_LABEL, FIELD_TYPE_CATALOGUE, FIELD_TYPE_CHOICES, FIELD_TYPE_GROUPS, FOOTER_WORDS, FORMULA_OP_JOINS, FORMULA_OP_LABEL, FORMULA_OP_VALUES, FORM_FLOWS, FORM_NOT_HERE_LINE, FROZEN_COLUMN_WIDTH, FieldControl, FieldEditor, type FieldEditorControlProps, type FieldEditorProps, FieldHistoryPanel, type FieldHistoryPanelProps, FieldLabel, type FieldProposalRow, type FieldRuleKindValue, type FieldTypeChoice, FilePicker, type FilePickerProps, type FilterPageBlock, type FooterPlacement, type FormAsked, FormBuilder, type FormBuilderProps, type FormFlow, type FormLook, FormLookFrame, type FormLookFrameProps, FormLookLogo, type FormLookView, type FormPageBlock, type FormQuestionSpec, FormRunner, type FormRunnerProps, type FormSpec, type FormSubmitOutcome, type FormTheme, FormsPanel, type FormsPanelProps, type FormulaOp, Grid, GridCell, type GridContextRecord, type GridContextSnapshot, type GridEditing, type GridGrouping, type GridPresentation, type GridProps, GuessedFieldType, type HeadingPageBlock, HistoryPanel, type HistoryPanelProps, type HostLayout, INBOX_GROUPINGS, INBOX_VIEWS, IN_MEMORY_QUEUE_REASON, ImportNotice, type ImportNoticeProps, type ImportSource, ImportWizard, type ImportWizardProps, InTableToolbar, type InboxGroup, type InboxGrouping, LANE_EMPTY, LANE_TITLE, LAYOUT_FIELD_KIND, LAYOUT_LABEL, LOOK_WORDS, type LabelLookup, type LinkRail, type ListPageBlock, MACHINE_IDENTITY, MANUAL_SORT, MAX_ROW_HEIGHT, MIN_ROW_HEIGHT, MOST_NEW_COLUMNS, type MainView, type MoveWritten, MyChecklistSteps, NEEDS_A_SENTENCE, NEW_COLUMN_TYPES, NOT_DRAWN_HERE, NO_AGENT_PORT, NO_CHAT_REASON, NO_COLUMNS_YET, NO_ENRICH_REASON, NO_MEMBERS_REASON, NO_OPEN_RECORDS_REASON, NO_REASK_REASON, NO_RIGHTS, NO_RULES_YET, NO_SAVED_VIEWS_REASON, NO_SHARE_REASON, NO_UPLOAD_REASON, type NewColumn, type NewColumnType, NotifyRuleEditor, type NotifyRuleEditorProps, type NotifyRuleSpec, ObjectAction, ObjectActionContextMenuItems, ObjectActionGlyph, ObjectActionIcon, ObjectActionMenuItems, type ObjectActionMenuItemsProps, type OpenRecordsAsk, type OrganizationMember, PAGE_BLOCK_KINDS, PAGE_BLOCK_LABEL, PAGE_KIND, PAGE_VIEWS, PAGE_VIEW_LABEL, PARITY_LABEL, PARITY_MADE_OF, PORTAL_NOT_HERE_LINE, PROPOSED_CHANGE_ACT_LABEL, PROPOSED_CHANGE_ACT_VALUES, type PageBlock, type PageBlockKind, PageScreen, type PageScreenProps, type PageView, Peek, type PeekProps, type PendingCapture, PersonPicker, type PersonPickerProps, PickOrAdd, type PickOrAddItem, type PickOrAddProps, type PickableFieldType, type PickerTable, PipelineBoard, type PipelineBoardProps, type PlainFieldType, type PlainRefusal, type PortalAnswer, PortalBuilder, type PortalBuilderProps, PortalCardView, type PortalCardViewProps, PortalLookEditor, type PortalLookEditorProps, PortalShell, type PortalShellProps, PortalsPanel, type PortalsPanelProps, type ProposalOutcome, ProposalRow, type ProposalRowProps, type ProposedChange, type ProposedChangeAct, ProvenanceBadge, PublicPicturePicker, type PublicPicturePickerProps, PublicViewPage, type PublicViewPageProps, QUESTION_OPS, QUESTION_SURFACE, type QuestionAnswer, QuestionAnswerView, type QuestionGroup, type QuestionMeasure, type QuestionOp, QuestionPanel, type QuestionPanelProps, type QuestionRow, type QuestionShow, type QuestionSpec, RECORDS_GRID_ROW_PX, RECORDS_SKELETON_LAYOUTS, ROLLUP_AGG_LABEL, ROLLUP_AGG_VALUES, RULE_NOT_HERE_LINE, type ReaskContext, type ReasonGroup, type RecordActionHost, RecordActionMenu, type RecordActionMenuProps, type RecordActionSubject, type RecordActionsInput, RecordBody, RecordChat, type RecordChatContext, type RecordChatEntry, type RecordChatProps, type RecordChatWithheld, RecordChip, RecordForm, type RecordFormProps, RecordLabelProvider, type RecordMoves, type RecordPageBlock, RecordPanel, type RecordPanelProps, RecordValue, RecordsMount, type RecordsMountProps, RecordsSkeleton, type RecordsSkeletonLayout, type RecordsSkeletonProps, RecordsTableCard, type RecordsTableCardProps, type RecordsUiHost, RecordsUiProvider, ReferenceBuilder, type ReferenceBuilderProps, type ReferenceChoice, RefusalLine, RefusalNotice, type RefusedRow, type RelationFieldType, RelationPicker, type RelationPickerProps, type RenderTextSlot, type ResolveName, type RichTextEditProps, type RollupAgg, SAVED_VIEWS_UNAVAILABLE, SAVE_TO_TABLE_TYPES, SAY_WHAT_YOU_ARE_WAITING_FOR_AFTER_MS, SECTIONS_UNKNOWN, SERIES_COLORS, SHARE_NOT_YOURS_LINE, SIGNED_WORD, SOMEBODY, STAGE_RULE_ON_FAIL_LABEL, STORE_ANSWERS_THESE, STORE_DECIDES_REASON, STORE_KEEPS_TIMELINE, STORE_KEPT_LAYOUTS, SUBSCRIPTION_CADENCES, SUBSCRIPTION_CADENCE_LABEL, SUBSCRIPTION_CHANNEL_LABEL, SUBSCRIPTION_CHANNEL_VALUES, SaveToTable, type SaveToTableProps, type SaveToTableSource, type SavedDashboard, type SavedForm, type SavedQuestion, type SavedView, type SavedViewSpec, ShareControl, type ShareControlProps, type ShareSubject, ShowListsToggle, type ShownViewReport, SignBlock, type SignBlockProps, SignaturePad, SignatureValue, type SnoozeChoice, type SortStateAction, SortStateControl, type SortStateControlProps, StageRulesSection, type StageRulesSectionProps, type StandardColumn, StandardRecordForm, type StandardRecordFormProps, StepRow, type SubscriptionChannel, SubscriptionsPanel, type SubscriptionsPanelProps, type Surface, type SurfacePress, type SystemFieldSpec, type SystemTableSpec, TABLE_LANES, TABLE_NAME_MAX, TABLE_NOT_REACHABLE, TABLE_TOOLBAR_ROW_CLASS, THE_SYSTEM, TIMELINE_ZOOMS, TableActionHost, TableAsk, type TableAskProps, TableDetails, TableDuplicateDialog, type TableDuplicateDialogProps, TableFoundationSwitch, type TableLane, type TableOpening, TablePage, type TablePageActionHost, type TablePageHeaderChrome, type TablePageProps, TablePageSkeleton, type TablePageSource, type TablePickerEntries, type TablePickerEntry, TableReferenceDialog, TableRenameDialog, TableRestoreRefused, type TableRights, TableSettings, type TableSettingsProps, TableShape, TableToolbarSlotContext, TablesHome, type TablesHomeProps, TemplatePreview, type TemplatePreviewProps, type TextPageBlock, type ThroughCondition, type TimelineSettings, TimelineView, type TimelineViewProps, type TimelineZoom, type TitleRepeats, type TrackedVersion, UNREAD_RECORD_LABEL, type UseSystemTableState, VIEW_ADDRESS_KEYS, VIEW_KEYS, VIEW_LAYOUTS, VIEW_NEEDS, VIEW_NOT_SAVED_YET, VISIBILITY_LANES, VISIBILITY_LANE_TITLE, type ViewAddressSort, type ViewAddressState, ViewBar, type ViewBarProps, type ViewKeyDeclaration, type ViewKeyLayout, type ViewKeyWriter, type ViewLayout, type ViewLook, type ViewNeed, type ViewNeedKind, ViewNeeds, type ViewNeedsProps, type ViewSettings, type ViewSettingsPatch, type ViewSort, type ViewSortKey, ViewSwitcher, type ViewSwitcherProps, type VisibilityLane, WITHHELD_RECORD_LABEL, WITHHELD_WORD, WORK_APPROVAL_STATES, WORK_APPROVAL_STATE_LABEL, WORK_DUE_STATES, WORK_INBOX_KINDS, WORK_INBOX_KIND_GROUP_LABEL, WORK_INBOX_KIND_LABEL, WhatYouMayDo, WhereItLives, type WhereItLivesProps, type WhoChanged, WhoChangedSource, WithheldValue, actorBadge, actorWords, addDays, announceTableArchived, applyLook, archiveConfirmSentence, archivedRowLine, asRefusal, askExampleFor, askQuestion, askableFields, blockFromSpec, bodyFieldOf, bodyForReading, bodyFromKeys, calendarDayLabel, calendarDayOf, cameFromLine, cardTitleField, cardWords, carriesTimeOfDay, cellState, choiceAddition, choiceAskSentence, choiceListPatch, choiceNudgeOf, choiceRowsFrom, chooseSurface, codeDependsRefusal, colorFromTheValue, columnDeclarationFor, columnForField, columnFromName, columnNamesFrom, columnsFrom, combineFilter, combineRows, conditionInWords, conditionIsDrawable, conditionIsSimple, conditionValue, controlFor, copyNameFor, currencyCodeFor, customFieldRequestProblems, dashboardDeclareArgs, dashboardFromSummary, dateFormatFor, dateText, dayAt, dayKeyOf, daysBetween, declareView, defaultViewOf, descriptionPatch, designatedLayoutOf, drawnBelowOnPage, drawnSignatureOf, drillDimensionsOf, drillMeasuresOf, drillPathsOf, drillWhere, duplicateProgressWords, editorKindFor, ensureSystemTable, entityCellValue, entityChoiceColumns, entityNameColumn, entityReferenceSpec, entityShownColumns, entityTableColumns, entityTitleColumn, entityValueText, envelopeFor, fieldIsEditable, fieldName, fieldToken, fieldTypeChoice, fieldTypeLabel, fieldsForNewColumns, filterTargets, flatWhere, footerOf, formDeclareArgs, formFromSummary, formLookDocument, formLookFromDocument, formLookView, formPresentation, formatForField, freeColumnName, freshFormName, gridContextKey, gridContextSnapshot, groupInbox, groupLabel, groupReasons, groupableFields, handOrderLine, handOrderSortState, hasTimePart, hintForAPerson, hintIsMachineIdentity, idsOf, isChoiceAddition, isDateField, isEngineerText, isFoundationTable, isId, isKeptTable, isMachineIdentity, isPage, isParityFieldType, isPlainFieldType, isRelationFieldType, isSignatureField, isValueSet, isViewAddressEmpty, keepLook, keptByTheApp, keyFor, kindsWithNoChoice, laneFor, lastChangeSentence, lookDiffers, lookDocument, lookFromDocument, lookPart, looksLikeId, machineIdentityIn, mayNotRestoreLine, measurableFields, memberName, moveRecordValue, newQuestion, nextInWords, nextSummaryAt, notAChoiceSentence, onlyCandidate, openingRail, openingView, packOverlaps, pageBlocksOf, pagePresentation, pageViewFromParam, parityTypesWithNoExplanation, parseGridPresentation, personActor, personRecordForMember, pickableTypeOf, pointsAtRecords, presentationDocument, presentationIsEmpty, previewLine, previewWords, publiclyAnswerable, questionArchive, questionFromDefinition, questionFromWords, questionSave, questionsOf, railFromParam, readLooks, recordActions, recordLink, recordName, recordNameIn, recordsDataSource, refusal, refusalForAPerson, refusalFromThrown, refusalLineForAPerson, refusalOr, refusedFileName, refusedRowsCsv, renderValue, rescheduledValue, resolveTableStyle, revokeConsequence, rowLabelChoices, rowName, rowNameIn, runToNotice, sameRecordLikely, sameViewAddress, saveToViewPlan, saveViewPatch, scalarText, seedIsSatisfied, shapesOfSource, shareUnavailableReason, signatureFileIn, signatureFileOf, signatureWords, singularNoun, skeletonLayoutFor, snoozeChoices, specFromBlock, standardTokenOf, starterPageBlocks, storeDecidesRights, storeKeepsLayout, storePublishesKind, styleFromDecorations, submissionStamp, surfaceChosen, tableName, tableNameProblem, tableOpening, tablePickerEntries, tableReferenceChoices, tableRightsAt, titleRepeats, unknownRailLine, unknownViewLine, unreadableKeys, useCanShare, useChoiceNudge, useDrill, useDrillAnswers, useDrillDefinition, useEmbedHandshake, useEnrichCells, useEntityTable, useGridEditing, useLabelWait, useMeasuredWidth, useMyChecklistSteps, usePickerTables, useRecordActionHost, useRecordLabels, useRecordMoves, useRecordRights, useRecordsUi, useRowColorBy, useRowRights, useSystemTable, useTableRights, useTableToolbarSlot, useTemplatePreview, useViewRecords, useWhoChanged, viewActions, viewAddressFromParams, viewAddressToParams, viewDocument, viewFromRow, viewKeysFor, viewNeedFor, viewPatchDocument, viewSettings, viewSettingsFor, viewSettingsPatch, visibilityLaneFor, whatIsMissing, whatIsMissingForEntityReference, whatTheChoiceListIsMissing, whenWords, whyNotAskable, withheldNoticeOf, withheldSentence, withoutAddition, wordsList };
|
|
7299
|
+
export { ABSENCE_WORD_LABEL, ABSENCE_WORD_VALUES, ACTION_KINDS, ARCHIVED_NEVER_DESTROYED, ARCHIVE_MEANS, ASK_EXAMPLE, type AbsenceWord, AccentSwatches, type AccentSwatchesProps, ActionInbox, type ActionInboxProps, type ActionKind, type AgentBuildAsk, type AnnounceTableArchived, type AppletPageBlock, ArchiveDeliberatelyDialog, type ArchiveDeliberatelyDialogProps, ArchivedDisclosure, type ArchivedDisclosureProps, ArchivedPortals, type ArchivedPortalsProps, ArchivedView, type ArchivedViewProps, type AskRead, BODY_COLUMN_NAME, BODY_SAVE_PAUSE_MS, BOOKING_NOT_HERE_LINE, BOOKING_PAGE_STATE_LABEL, BOOKING_PAGE_STATE_VALUES, BookingBuilder, type BookingBuilderProps, type BookingPageState, BookingSlots, type BookingSlotsProps, BuildOrAsk, type BuildOrAskProps, type BuildableKind, type ButtonPageBlock, CAPTURE_MODES, CHART_KINDS, CHART_KIND_LABEL, CHART_NEEDS, CHECKLIST_REQUIREMENT_KINDS, CHECKLIST_REQUIREMENT_LABEL, CONDITION_OPS, CONTEXT_POLICY_LABEL, ADDABLE_TYPES as CUSTOM_FIELD_ADDABLE_TYPES, type CalendarMode, CalendarView, type CalendarViewProps, type CaptureMode, type CaptureQueuePort, CaptureRun, type CaptureRunProps, CaptureSheet, type CaptureSheetProps, type CellAddress, type CellRefusal, type CellState, ChartBlock, type ChartBlockProps, type ChartConfig, ChartFrame, type ChartKind, ChartLegendContent, type ChartPageBlock, type ChartSpec, ChartTooltipContent, ChecklistRunner, type ChecklistRunnerProps, ChecklistTemplateEditor, ChecklistsPanel, type ChecklistsPanelProps, type ChoiceAddition, type ChoiceAsk, ChoiceAskButtons, ChoiceListEditor, type ChoiceListRow, type CombinedRows, CommentThread, type CommentThreadProps, type ConditionField, ConditionGroup, type ConditionGroupProps, ConditionRow, type ConditionRowProps, type CustomFieldAddRequest, type CustomFieldAddResult, type CustomFieldSetResult, type CustomFieldValuesRequest, type CustomFieldsAgentDoor, type CustomFieldsAgentState, CustomFieldsSection, type CustomFieldsSectionProps, DEFAULT_FOOTER, DEFAULT_VIEW_NAME, DUE_STATE_LABEL, DashboardCanvas, type DashboardCanvasProps, DigestScheduler, type DigestSchedulerProps, DocRender, type DocRenderProps, DocTemplate, type DocTemplateProps, type DocTemplateSpec, EMPTY_PRESENTATION, ENGINEER_TEXT, ENTITY_REFERENCE_KINDS_MISSING, type EditorKind, EmbedFrame, type EmbedFrameProps, type EnrichAsk, EnrichBadge, type EnrichBadgeProps, type EnrichOutcome, EnrichPanel, type EnrichPanelProps, EntityBoard, type EntityBoardProps, EntityChartBlock, type EntityChartBlockProps, type EntityColumn, EntityDataScope, EntityGrid, type EntityLayout, EntityReferenceKindPicker, type EntityReferenceKindPickerProps, type EntityRow, type EntitySource, type EntityTable, EntityTablePage, type EntityTablePageProps, ExportMenu, type ExportMenuProps, FIELD_RULE_KIND_LABEL, FIELD_RULE_KIND_VALUES, FIELD_SENSITIVITY_LABEL, FIELD_TYPE_CATALOGUE, FIELD_TYPE_CHOICES, FIELD_TYPE_GROUPS, FOOTER_WORDS, FORMULA_FUNCTIONS, FORMULA_OP_JOINS, FORMULA_OP_LABEL, FORMULA_OP_VALUES, FORM_EMBEDS, FORM_FLOWS, FORM_NOT_HERE_LINE, FROZEN_COLUMN_WIDTH, FieldControl, FieldEditor, type FieldEditorControlProps, type FieldEditorProps, FieldHistoryPanel, type FieldHistoryPanelProps, FieldLabel, type FieldProposalRow, type FieldRuleKindValue, type FieldTypeChoice, FilePicker, type FilePickerProps, type FilterPageBlock, type FooterPlacement, type FormAsked, FormBuilder, type FormBuilderProps, type FormEmbed, type FormEnding, type FormFlow, type FormJump, type FormLook, FormLookFrame, type FormLookFrameProps, FormLookLogo, type FormLookView, type FormPageBlock, type FormQuestionSpec, FormResultsPanel, type FormResultsPanelProps, FormRunner, type FormRunnerProps, type FormSpec, type FormSubmitOutcome, type FormTheme, type FormWelcome, FormsPanel, type FormsPanelProps, type FormulaHelpAsk, type FormulaOp, Grid, GridCell, type GridContextRecord, type GridContextSnapshot, type GridEditing, type GridGrouping, type GridPresentation, type GridProps, GuessedFieldType, type HeadingPageBlock, HistoryPanel, type HistoryPanelProps, INBOX_GROUPINGS, INBOX_VIEWS, IN_MEMORY_QUEUE_REASON, ImportNotice, type ImportNoticeProps, type ImportSource, ImportWizard, type ImportWizardProps, InTableToolbar, type InboxGroup, type InboxGrouping, LANE_EMPTY, LANE_TITLE, LAYOUT_FIELD_KIND, LAYOUT_LABEL, LOOK_WORDS, type LabelLookup, type LinkRail, type ListPageBlock, MACHINE_IDENTITY, MANUAL_SORT, MAX_ROW_HEIGHT, MIN_ROW_HEIGHT, MOST_NEW_COLUMNS, type MainView, type MoveWritten, MyChecklistSteps, NEEDS_A_SENTENCE, NEW_COLUMN_TYPES, NOT_DRAWN_HERE, NO_AGENT_PORT, NO_CHAT_REASON, NO_COLUMNS_YET, NO_ENRICH_REASON, NO_MEMBERS_REASON, NO_OPEN_RECORDS_REASON, NO_REASK_REASON, NO_RIGHTS, NO_RULES_YET, NO_SAVED_VIEWS_REASON, NO_SHARE_REASON, NO_UPLOAD_REASON, type NewColumn, type NewColumnType, NotifyRuleEditor, type NotifyRuleEditorProps, type NotifyRuleSpec, ObjectAction, ObjectActionContextMenuItems, ObjectActionGlyph, ObjectActionIcon, ObjectActionMenuItems, type ObjectActionMenuItemsProps, type OpenRecordsAsk, type OrganizationMember, PAGE_BLOCK_KINDS, PAGE_BLOCK_LABEL, PAGE_KIND, PAGE_VIEWS, PAGE_VIEW_LABEL, PARITY_LABEL, PARITY_MADE_OF, PORTAL_NOT_HERE_LINE, PROPOSED_CHANGE_ACT_LABEL, PROPOSED_CHANGE_ACT_VALUES, type PageBlock, type PageBlockKind, PageScreen, type PageScreenProps, type PageView, Peek, type PeekProps, type PendingCapture, PersonPicker, type PersonPickerProps, PickOrAdd, type PickOrAddItem, type PickOrAddProps, type PickableFieldType, type PickerTable, PipelineBoard, type PipelineBoardProps, type PlainFieldType, type PlainRefusal, type PortalAnswer, PortalBuilder, type PortalBuilderProps, PortalCardView, type PortalCardViewProps, PortalLookEditor, type PortalLookEditorProps, PortalShell, type PortalShellProps, PortalsPanel, type PortalsPanelProps, type ProposalOutcome, ProposalRow, type ProposalRowProps, type ProposedChange, type ProposedChangeAct, ProvenanceBadge, PublicPicturePicker, type PublicPicturePickerProps, PublicViewPage, type PublicViewPageProps, QUESTION_OPS, QUESTION_SURFACE, type QuestionAnswer, QuestionAnswerView, type QuestionGroup, type QuestionMeasure, type QuestionOp, QuestionPanel, type QuestionPanelProps, type QuestionRow, type QuestionShow, type QuestionSpec, RECORDS_GRID_ROW_PX, RECORDS_SKELETON_LAYOUTS, ROLLUP_AGG_LABEL, ROLLUP_AGG_VALUES, RULE_NOT_HERE_LINE, type ReaskContext, type ReasonGroup, type RecordActionHost, RecordActionMenu, type RecordActionMenuProps, type RecordActionSubject, type RecordActionsInput, RecordBody, RecordChat, type RecordChatContext, type RecordChatEntry, type RecordChatProps, type RecordChatWithheld, RecordChip, RecordForm, type RecordFormProps, RecordLabelProvider, type RecordMoves, type RecordPageBlock, RecordPanel, type RecordPanelProps, RecordValue, RecordsMount, type RecordsMountProps, RecordsSkeleton, type RecordsSkeletonLayout, type RecordsSkeletonProps, RecordsTableCard, type RecordsTableCardProps, type RecordsUiHost, RecordsUiProvider, ReferenceBuilder, type ReferenceBuilderProps, type ReferenceChoice, RefusalLine, RefusalNotice, type RefusedRow, type RelationFieldType, RelationPicker, type RelationPickerProps, type RenderTextSlot, type ResolveName, type RichTextEditProps, type RollupAgg, SAVED_VIEWS_UNAVAILABLE, SAVE_TO_TABLE_TYPES, SAY_WHAT_YOU_ARE_WAITING_FOR_AFTER_MS, SECTIONS_UNKNOWN, SERIES_COLORS, SHARE_NOT_YOURS_LINE, SIGNED_WORD, SOMEBODY, STAGE_RULE_ON_FAIL_LABEL, STORE_ANSWERS_THESE, STORE_DECIDES_REASON, STORE_KEEPS_TIMELINE, STORE_KEPT_LAYOUTS, SUBSCRIPTION_CADENCES, SUBSCRIPTION_CADENCE_LABEL, SUBSCRIPTION_CHANNEL_LABEL, SUBSCRIPTION_CHANNEL_VALUES, SaveToTable, type SaveToTableProps, type SaveToTableSource, type SavedDashboard, type SavedForm, type SavedQuestion, type SavedView, type SavedViewSpec, ShareControl, type ShareControlProps, type ShareSubject, ShowListsToggle, type ShownViewReport, SignBlock, type SignBlockProps, SignaturePad, SignatureValue, type SnoozeChoice, type SortStateAction, SortStateControl, type SortStateControlProps, StageRulesSection, type StageRulesSectionProps, type StandardColumn, StandardRecordForm, type StandardRecordFormProps, StepRow, type SubscriptionChannel, SubscriptionsPanel, type SubscriptionsPanelProps, type Surface, type SurfacePress, type SystemFieldSpec, type SystemTableSpec, TABLE_LANES, TABLE_NAME_MAX, TABLE_NOT_REACHABLE, TABLE_TOOLBAR_ROW_CLASS, THE_SYSTEM, TIMELINE_ZOOMS, TableActionHost, TableAsk, type TableAskProps, TableDetails, TableDuplicateDialog, type TableDuplicateDialogProps, TableFoundationSwitch, type TableLane, TablePage, type TablePageActionHost, type TablePageHeaderChrome, type TablePageProps, TablePageSkeleton, type TablePageSource, type TablePickerEntries, type TablePickerEntry, TableReferenceDialog, TableRenameDialog, TableRestoreRefused, type TableRights, TableSettings, type TableSettingsAgent, type TableSettingsProps, type TableSettingsSnapshot, TableShape, TableToolbarSlotContext, TablesHome, type TablesHomeProps, TemplatePreview, type TemplatePreviewProps, type TextPageBlock, type ThroughCondition, type TimelineSettings, TimelineView, type TimelineViewProps, type TimelineZoom, type TitleRepeats, type TrackedVersion, UNREAD_RECORD_LABEL, type UseSystemTableState, VIEW_ADDRESS_KEYS, VIEW_KEYS, VIEW_LAYOUTS, VIEW_NEEDS, VIEW_NOT_SAVED_YET, VISIBILITY_LANES, VISIBILITY_LANE_TITLE, type ViewAddressSort, type ViewAddressState, ViewBar, type ViewBarProps, type ViewKeyDeclaration, type ViewKeyLayout, type ViewKeyWriter, type ViewLayout, type ViewLook, type ViewNeed, type ViewNeedKind, ViewNeeds, type ViewNeedsProps, type ViewSettings, type ViewSettingsPatch, type ViewSort, type ViewSortKey, ViewSwitcher, type ViewSwitcherProps, type VisibilityLane, WITHHELD_RECORD_LABEL, WITHHELD_WORD, WORK_APPROVAL_STATES, WORK_APPROVAL_STATE_LABEL, WORK_DUE_STATES, WORK_INBOX_KINDS, WORK_INBOX_KIND_GROUP_LABEL, WORK_INBOX_KIND_LABEL, WhatYouMayDo, WhereItLives, type WhereItLivesProps, type WhoChanged, WhoChangedSource, WithheldValue, actionForAgent, actorBadge, actorWords, addDays, announceTableArchived, applyLook, archiveConfirmSentence, archivedRowLine, asRefusal, askExampleFor, askQuestion, askableFields, blockFromSpec, bodyFieldOf, bodyForReading, bodyFromKeys, calendarDayLabel, calendarDayOf, cameFromLine, cardTitleField, cardWords, carriesTimeOfDay, cellState, choiceAddition, choiceAskSentence, choiceListPatch, choiceNudgeOf, choiceRowsFrom, chooseSurface, codeDependsRefusal, colorFromTheValue, columnDeclarationFor, columnForField, columnFromName, columnNamesFrom, columnsFrom, combineFilter, combineRows, conditionInWords, conditionIsDrawable, conditionIsSimple, conditionValue, controlFor, copyNameFor, currencyCodeFor, customFieldRequestProblems, dashboardDeclareArgs, dashboardFromSummary, dateFormatFor, dateText, dayAt, dayKeyOf, daysBetween, declareView, defaultViewOf, descriptionPatch, drawnBelowOnPage, drawnSignatureOf, drillDimensionsOf, drillMeasuresOf, drillPathsOf, drillWhere, duplicateProgressWords, editorKindFor, endingsFromDocument, ensureSystemTable, entityCellValue, entityChoiceColumns, entityNameColumn, entityReferenceSpec, entityShownColumns, entityTableColumns, entityTitleColumn, entityValueText, envelopeFor, fieldIsEditable, fieldName, fieldToken, fieldTypeChoice, fieldTypeLabel, fieldsForNewColumns, filterTargets, flatWhere, footerOf, formDeclareArgs, formEmbedSnippet, formFromSummary, formLookDocument, formLookFromDocument, formLookView, formPresentation, formRoutes, formatForField, freeColumnName, freshFormName, gridContextKey, gridContextSnapshot, groupInbox, groupLabel, groupReasons, groupableFields, handOrderLine, handOrderSortState, hasTimePart, hiddenFromLink, hintForAPerson, hintIsMachineIdentity, idsOf, isChoiceAddition, isDateField, isEngineerText, isFoundationTable, isId, isKeptTable, isMachineIdentity, isPage, isParityFieldType, isPlainFieldType, isRelationFieldType, isSignatureField, isValueSet, isViewAddressEmpty, keepLook, keptByTheApp, keyFor, kindsWithNoChoice, laneFor, lastChangeSentence, lookDiffers, lookDocument, lookFromDocument, lookPart, looksLikeId, machineIdentityIn, mayNotRestoreLine, measurableFields, memberName, moveRecordValue, newQuestion, nextInWords, nextSummaryAt, notAChoiceSentence, onlyCandidate, openingRail, openingView, packOverlaps, pageBlocksOf, pagePresentation, pageViewFromParam, parityTypesWithNoExplanation, parseGridPresentation, personActor, personRecordForMember, pickableTypeOf, pointsAtRecords, presentationDocument, presentationIsEmpty, previewLine, previewWords, publiclyAnswerable, questionArchive, questionFromDefinition, questionFromWords, questionSave, questionsOf, railFromParam, readLooks, recordActions, recordLink, recordName, recordNameIn, recordsDataSource, refusal, refusalForAPerson, refusalFromThrown, refusalLineForAPerson, refusalOr, refusedFileName, refusedRowsCsv, renderValue, rescheduledValue, resolveTableStyle, revokeConsequence, rowActionFromAgent, rowLabelChoices, rowName, rowNameIn, runToNotice, sameRecordLikely, sameViewAddress, saveTableDescription, saveToViewPlan, saveViewPatch, scalarText, seedIsSatisfied, shapesOfSource, shareUnavailableReason, signatureFileIn, signatureFileOf, signatureWords, singularNoun, skeletonLayoutFor, snoozeChoices, specFromBlock, standardTokenOf, starterPageBlocks, stepFromAgent, storeDecidesRights, storeKeepsLayout, storePublishesKind, styleFromDecorations, submissionStamp, surfaceChosen, tableName, tableNameProblem, tablePickerEntries, tableReferenceChoices, tableRightsAt, themeFromDocument, titleRepeats, unknownRailLine, unknownViewLine, unreadableKeys, useCanShare, useChoiceNudge, useDrill, useDrillAnswers, useDrillDefinition, useEmbedHandshake, useEnrichCells, useEntityTable, useGridEditing, useLabelWait, useMeasuredWidth, useMyChecklistSteps, usePickerTables, useRecordActionHost, useRecordLabels, useRecordMoves, useRecordRights, useRecordsUi, useRowColorBy, useRowRights, useSystemTable, useTableRights, useTableToolbarSlot, useTemplatePreview, useViewRecords, useWhoChanged, viewActions, viewAddressFromParams, viewAddressToParams, viewDocument, viewFromRow, viewKeysFor, viewNeedFor, viewPatchDocument, viewSettings, viewSettingsFor, viewSettingsPatch, visibilityLaneFor, welcomeFromDocument, whatIsMissing, whatIsMissingForEntityReference, whatTheChoiceListIsMissing, whenWords, whyNotAskable, withheldNoticeOf, withheldSentence, withoutAddition, wordsList };
|