@ai-matrx/records-ui 0.84.7 → 0.85.4
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 +358 -15
- package/dist/index.cjs +8550 -4375
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +484 -177
- package/dist/index.d.ts +484 -177
- package/dist/index.js +8606 -4361
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.d.cts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import * as react from 'react';
|
|
2
2
|
import { ReactNode, ComponentType, RefObject } from 'react';
|
|
3
3
|
import * as _ai_matrx_records from '@ai-matrx/records';
|
|
4
|
-
import { PermissionLevel, Table, RecordScopeContext, EnrichCell, RecordsError, Uuid as Uuid$1, AggregateFilter, Field, RecordDocument, ReadRow, RelationDisplay, WriteConflict, RecordsErrorCode, DeclarableFieldKind, ParityFieldType, NewFieldDeclaration, RuleExpression, ValueEnvelope, ChecklistRequirementKind, ContextPolicy, WorkDueState, FieldSensitivity, StageRuleOnFail, SubscriptionCadence, WorkInboxKind, FieldKind, RecordsResult,
|
|
5
|
-
import { Uuid,
|
|
4
|
+
import { PermissionLevel, Table, RecordScopeContext, EnrichCell, RecordsError, Uuid as Uuid$1, StoreFilter, AggregateFilter, Field, RecordDocument, ReadRow, RelationDisplay, WriteConflict, RecordsErrorCode, DeclarableFieldKind, ParityFieldType, NewFieldDeclaration, RuleExpression, ValueEnvelope, ChecklistRequirementKind, ContextPolicy, WorkDueState, FieldSensitivity, StageRuleOnFail, SubscriptionCadence, WorkInboxKind, FieldKind, RecordFilter, RecordsResult, SavedViewRow, ArchiveLane, ArchivedRow, FormSummary, PortalCard, PortalPrincipal, PortalPreviewRow, MySubscription, DashboardBlockKind, AggregateBucket, AggregateMeasure, AggregateCompare, DashboardTarget, DashboardBlock, DashboardSummary, DocTemplateRow, DocRenderRow, QuietHours, DashboardBlockResult, ChecklistRunStep, BookingSummary, CaptureSheetFace, CaptureField, AnonTokenBinding, RecordsConfig, RecordsActor, RecordsDataSource, HistoryActor, FieldHistoryEntry } from '@ai-matrx/records';
|
|
5
|
+
import { Uuid, StoreFilter as StoreFilter$1, Field as Field$1, ReadRow as ReadRow$1 } from '@ai-matrx/records/react';
|
|
6
6
|
import { RecordsClient } from '@ai-matrx/records/core';
|
|
7
|
+
export { DEFAULT_FIELDS, DeclareResult, NewFieldSpec, NewTableSpec, addFields, declareTable, fieldDeclarationFor, tokenFor } from '@ai-matrx/records/core';
|
|
7
8
|
import { FieldFormatConfig } from '@ai-matrx/design-system/field-formats';
|
|
8
9
|
import { MatrxColumnDef } from '@ai-matrx/design-system/data-table/types';
|
|
9
10
|
import { TableStyle, GroupAggregateSpec, GroupOrder, ChoiceColorLookup } from '@ai-matrx/design-system/data-table';
|
|
@@ -227,7 +228,37 @@ declare const NO_RIGHTS: TableRights;
|
|
|
227
228
|
* ladder cannot produce (write without read, share without edit).
|
|
228
229
|
*/
|
|
229
230
|
declare function tableRightsAt(level: PermissionLevel | null): TableRights;
|
|
231
|
+
/**
|
|
232
|
+
* A LAYOUT THE HOST DRAWS, beside the package's own four (Grid, Kanban, Calendar,
|
|
233
|
+
* Gallery) in the SAME layout row of every table page. The host owns what it
|
|
234
|
+
* draws; the package owns where it sits, its button, and its address (`?view=<id>`).
|
|
235
|
+
*
|
|
236
|
+
* WHY A PORT: an app with a richer surface for one kind of looking at a table —
|
|
237
|
+
* AI Matrx's spreadsheet-feel Sheet, the older /data grid ported onto the record
|
|
238
|
+
* store — must be a layout of the one table page, never a second page for the
|
|
239
|
+
* same table. It is page-level, not saved onto the view record: the store's
|
|
240
|
+
* layout words are the four the package draws.
|
|
241
|
+
*/
|
|
242
|
+
interface HostLayout {
|
|
243
|
+
/** The address word (`?view=sheet`). Lowercase; must not be one of the package's own. */
|
|
244
|
+
id: string;
|
|
245
|
+
/** The button's words. */
|
|
246
|
+
label: string;
|
|
247
|
+
/** Draw it for this table, with the question the address asked when there is one. */
|
|
248
|
+
render: (args: {
|
|
249
|
+
tableId: Uuid$1;
|
|
250
|
+
filter?: StoreFilter | undefined;
|
|
251
|
+
/**
|
|
252
|
+
* Opens the page's own export (CSV, XLSX, copy and transform) — the one export a table has,
|
|
253
|
+
* so a host layout's "Export this table…" never needs a second one or a hunt for a button.
|
|
254
|
+
* Absent on a page that draws no export.
|
|
255
|
+
*/
|
|
256
|
+
openExport?: (() => void) | undefined;
|
|
257
|
+
}) => ReactNode;
|
|
258
|
+
}
|
|
230
259
|
interface RecordsUiHost {
|
|
260
|
+
/** Layouts the host draws beside the package's own. See `HostLayout`. */
|
|
261
|
+
layouts?: HostLayout[];
|
|
231
262
|
/** Answer the rights question for one table. Synchronous: a screen renders now. */
|
|
232
263
|
rights?: (table: Table) => TableRights;
|
|
233
264
|
/** Where a record's own page lives, when the host has one. A peek is used when it does not. */
|
|
@@ -335,6 +366,25 @@ interface RecordsUiHost {
|
|
|
335
366
|
recordId: Uuid$1;
|
|
336
367
|
title: string;
|
|
337
368
|
}) => void;
|
|
369
|
+
/**
|
|
370
|
+
* OPTIONAL. A TABLE'S AGENT BUTTON, PRESSED (TABLE-PARITY M3, lane DEFAULT-GRID-PARITY).
|
|
371
|
+
*
|
|
372
|
+
* A row action of kind `agent` ("Ask Dr. Whitfield") hands the row to an agent with the
|
|
373
|
+
* action's own `prompt`. Only the host can start that conversation — this package ships no
|
|
374
|
+
* chat — so the grid hands the row, the action's name and its prompt here, and the host
|
|
375
|
+
* opens its one chat surface bound to the record with that prompt as the opening ask. It is
|
|
376
|
+
* a separate port from `talkToRecord` because that one carries no prompt: a host that bound
|
|
377
|
+
* only `talkToRecord` would open an empty chat and silently drop what the button was for.
|
|
378
|
+
*
|
|
379
|
+
* ABSENT, NEVER DEAD: unbound, agent buttons are not drawn.
|
|
380
|
+
*/
|
|
381
|
+
runAgentAction?: (target: {
|
|
382
|
+
tableId: Uuid$1;
|
|
383
|
+
recordId: Uuid$1;
|
|
384
|
+
title: string;
|
|
385
|
+
action: string;
|
|
386
|
+
prompt: string;
|
|
387
|
+
}) => void;
|
|
338
388
|
/**
|
|
339
389
|
* OPTIONAL. THE SERVER'S `records` TOOL (SCR-27).
|
|
340
390
|
*
|
|
@@ -1007,6 +1057,18 @@ type GridGrouping = {
|
|
|
1007
1057
|
order?: GroupOrder;
|
|
1008
1058
|
/** The sections this view keeps shut, by the primitive's own group key. */
|
|
1009
1059
|
collapsed?: string[];
|
|
1060
|
+
/**
|
|
1061
|
+
* SUB-GROUPS (lane S1-PRIME VIEW-KEYS; ui-bench LISTS "sub-grouping"): up to two more levels
|
|
1062
|
+
* inside each section, by Field key. At most three levels in all — the store refuses a fourth
|
|
1063
|
+
* (`custom.view_declare`). A layout that draws one level ignores the rest; it never drops them,
|
|
1064
|
+
* because this list is parsed and written back whole with the rest of the look.
|
|
1065
|
+
*/
|
|
1066
|
+
then?: GridSubGroup[];
|
|
1067
|
+
};
|
|
1068
|
+
/** One sub-group level: a Field key and its section order. */
|
|
1069
|
+
type GridSubGroup = {
|
|
1070
|
+
field: string;
|
|
1071
|
+
order?: GroupOrder;
|
|
1010
1072
|
};
|
|
1011
1073
|
/** Everything a view says about how its table LOOKS. */
|
|
1012
1074
|
type GridPresentation = {
|
|
@@ -1031,6 +1093,33 @@ type GridPresentation = {
|
|
|
1031
1093
|
widths?: Record<string, number>;
|
|
1032
1094
|
/** The body row height this view remembers, in px. */
|
|
1033
1095
|
rowHeight?: number;
|
|
1096
|
+
/**
|
|
1097
|
+
* Field keys hidden from this view — the SAME hidden-column list the grid's
|
|
1098
|
+
* own column picker holds, now given a place on the view so it survives a
|
|
1099
|
+
* reload and a layout switch reads the identical set gallery and grid agree
|
|
1100
|
+
* on, rather than a second "fields shown" list nobody kept in sync.
|
|
1101
|
+
*/
|
|
1102
|
+
hiddenFields?: string[];
|
|
1103
|
+
/**
|
|
1104
|
+
* The gallery's card size, remembered the same way the grid remembers its
|
|
1105
|
+
* row height — a per-view look, not a global default.
|
|
1106
|
+
*/
|
|
1107
|
+
gallerySize?: "small" | "medium" | "large";
|
|
1108
|
+
/**
|
|
1109
|
+
* THIS VIEW'S OWN LAYOUT CHOICES, over the organization's `custom/grid_layout` knob (lane
|
|
1110
|
+
* DEFAULT-GRID-PARITY, TABLE-PARITY D1 D5 D6). Absent means "whatever the organization
|
|
1111
|
+
* says"; present is the view's word. `freezeFirst: false` is an explicit NO over an
|
|
1112
|
+
* organization that freezes the first column — an empty `frozen` cannot say that.
|
|
1113
|
+
*/
|
|
1114
|
+
wrap?: boolean;
|
|
1115
|
+
fit?: "auto" | "fit" | "scroll";
|
|
1116
|
+
freezeFirst?: boolean;
|
|
1117
|
+
/**
|
|
1118
|
+
* THE SUMMARY BAR (TABLE-PARITY F1): Field key → the store measure shown under that column
|
|
1119
|
+
* (`count`, `sum`, `avg`, `min`, `max`, `median`, `filled`, `empty`, `unique`), worked out
|
|
1120
|
+
* by `custom.record_aggregate` over the whole table.
|
|
1121
|
+
*/
|
|
1122
|
+
summaries?: Record<string, string>;
|
|
1034
1123
|
};
|
|
1035
1124
|
declare const EMPTY_PRESENTATION: GridPresentation;
|
|
1036
1125
|
/** A frozen column needs a known width, or the table declines to freeze at all. */
|
|
@@ -1098,8 +1187,11 @@ interface GridProps {
|
|
|
1098
1187
|
* own query. Never filter `rows` here: this grid only ever holds one page,
|
|
1099
1188
|
* so filtering in the browser would drop every matching record on page two
|
|
1100
1189
|
* and call the result the answer.
|
|
1190
|
+
*
|
|
1191
|
+
* S2-PRIME: either shape — the flat map, or a view's own nested question (the Rule shape);
|
|
1192
|
+
* the store compiles both into the one WHERE clause.
|
|
1101
1193
|
*/
|
|
1102
|
-
filter?:
|
|
1194
|
+
filter?: StoreFilter$1 | undefined;
|
|
1103
1195
|
/** Opened when a row is clicked. A host that has a record page passes its own. */
|
|
1104
1196
|
onOpenRecord?: ((recordId: Uuid) => void) | undefined;
|
|
1105
1197
|
/** SCR-2. Called when an admin clicks the "+" at the end of the headers. */
|
|
@@ -1176,6 +1268,36 @@ enrich?: {
|
|
|
1176
1268
|
onPin?: ((recordId: Uuid, fieldKey: string, pinned: boolean) => void | Promise<void>) | undefined;
|
|
1177
1269
|
}): MatrxColumnDef<ReadRow$1>;
|
|
1178
1270
|
|
|
1271
|
+
/** Answers "what is the record with this id called", for one Field's values. */
|
|
1272
|
+
type LabelLookup = (field: Field$1, id: string) => string | null;
|
|
1273
|
+
/**
|
|
1274
|
+
* HOW LONG A CELL MAY SAY "Loading…" BEFORE IT HAS TO SAY WHAT IT IS WAITING
|
|
1275
|
+
* FOR. One second is the span at which a person stops reading a word as "this
|
|
1276
|
+
* is about to happen" and starts reading it as "this is stuck" — the same line
|
|
1277
|
+
* Nielsen's response-time work draws and the one Linear and Stripe design to.
|
|
1278
|
+
*/
|
|
1279
|
+
declare const SAY_WHAT_YOU_ARE_WAITING_FOR_AFTER_MS = 1000;
|
|
1280
|
+
/** Which ids a Field's stored value refers to. */
|
|
1281
|
+
declare function idsOf(value: unknown): string[];
|
|
1282
|
+
declare function isId(value: unknown): boolean;
|
|
1283
|
+
/** True when this Field's values are ids of other records rather than values. */
|
|
1284
|
+
declare function pointsAtRecords(field: Field$1): boolean;
|
|
1285
|
+
declare function RecordLabelProvider({ children }: {
|
|
1286
|
+
children: ReactNode;
|
|
1287
|
+
}): react.JSX.Element;
|
|
1288
|
+
/**
|
|
1289
|
+
* The hook a surface uses: it declares the Fields it is about to draw, and gets
|
|
1290
|
+
* back the lookup. Declaring is what makes one request per Field instead of one
|
|
1291
|
+
* per cell, and it is why a grid of 200 rows asks the store twice.
|
|
1292
|
+
*/
|
|
1293
|
+
declare function useRecordLabels(fields: readonly Field$1[] | undefined): LabelLookup;
|
|
1294
|
+
/**
|
|
1295
|
+
* WHAT THIS COLUMN IS STILL WAITING FOR, or null while "Loading…" is still an
|
|
1296
|
+
* honest word. A cell draws this INSTEAD of "Loading…" once the resolver has
|
|
1297
|
+
* been looking for a second — see `SAY_WHAT_YOU_ARE_WAITING_FOR_AFTER_MS`.
|
|
1298
|
+
*/
|
|
1299
|
+
declare function useLabelWait(field: Field$1 | undefined): string | null;
|
|
1300
|
+
|
|
1179
1301
|
interface ExportMenuProps {
|
|
1180
1302
|
tableId: Uuid;
|
|
1181
1303
|
/** The rows on screen. Absent means "this table's first page", read the same way. */
|
|
@@ -1290,7 +1412,18 @@ type RelationFieldType = "relation";
|
|
|
1290
1412
|
* `FIELD_TYPE_CHOICES`'s coverage and as a red `kindsWithNoChoice()` below — never as a
|
|
1291
1413
|
* silence.
|
|
1292
1414
|
*/
|
|
1293
|
-
type PickableFieldType = DeclarableFieldKind;
|
|
1415
|
+
type PickableFieldType = DeclarableFieldKind | SystemFieldKind | "entity_reference";
|
|
1416
|
+
/**
|
|
1417
|
+
* THE STORE'S OWN STAMPS AS COLUMNS (GRID-PRIMITIVES G5; TABLE-PARITY H2 H3, lane
|
|
1418
|
+
* DEFAULT-GRID-PARITY). `custom.field_declare` takes these three WORDS and makes each a formula
|
|
1419
|
+
* Field whose expression is the system node (`fx.autonumber`, `fx.created_time`,
|
|
1420
|
+
* `fx.modified_time`, `config.system` naming which), so nobody types into them and every reader
|
|
1421
|
+
* that serves a worked-out value serves them. `custom.field_kinds()` does not publish them,
|
|
1422
|
+
* because each is a formula, not a behaviour of its own. So they are named here, sent as their
|
|
1423
|
+
* word through the `{ type }` arm, and a new autonumber column numbers the records already in
|
|
1424
|
+
* the table through `custom.autonumber_backfill`.
|
|
1425
|
+
*/
|
|
1426
|
+
type SystemFieldKind = "autonumber" | "created_time" | "modified_time";
|
|
1294
1427
|
interface FieldTypeChoice {
|
|
1295
1428
|
id: PickableFieldType;
|
|
1296
1429
|
/** The word on the menu. */
|
|
@@ -1388,6 +1521,8 @@ declare function whatIsMissing(state: {
|
|
|
1388
1521
|
formulaFields: string[];
|
|
1389
1522
|
/** Only a link asks for one, so a caller about any other kind leaves it out. */
|
|
1390
1523
|
relationTarget?: string;
|
|
1524
|
+
/** Only an entity-reference column asks for these (SC-R). */
|
|
1525
|
+
allowedTypes?: readonly string[];
|
|
1391
1526
|
}): string | null;
|
|
1392
1527
|
|
|
1393
1528
|
declare const NO_RULES_YET = "Nothing has to be true to get here yet.";
|
|
@@ -1475,29 +1610,37 @@ declare function ConditionRow({ lead, expr, fields, onChange, emptyLabel, classN
|
|
|
1475
1610
|
* CAN THE BUILDER DRAW THIS CONDITION? — the question every caller asks before it renders,
|
|
1476
1611
|
* and the reason a rule somebody cannot see is never silently saved over.
|
|
1477
1612
|
*
|
|
1478
|
-
* Drawable means: nothing; one clause; or
|
|
1479
|
-
*
|
|
1480
|
-
*
|
|
1613
|
+
* Drawable means: nothing; one clause; or a group of drawable members, to any depth. `depth`
|
|
1614
|
+
* still limits it for a caller that wants a shallower builder (0 = one level of clauses and no
|
|
1615
|
+
* nested group). `conditionIsSimple` is still the leaf test and still exported.
|
|
1481
1616
|
*/
|
|
1482
1617
|
declare function conditionIsDrawable(expr: RuleExpression | Record<string, unknown> | null | undefined, depth?: number): boolean;
|
|
1483
1618
|
interface ConditionGroupProps {
|
|
1484
|
-
/** The words before the condition: "When", "Ask only when". */
|
|
1619
|
+
/** The words before the condition: "When", "Ask only when", "Show jobs where". */
|
|
1485
1620
|
lead: string;
|
|
1486
1621
|
expr: RuleExpression | Record<string, unknown> | null | undefined;
|
|
1487
1622
|
fields: ConditionField[];
|
|
1488
1623
|
onChange: (next: RuleExpression | null) => void;
|
|
1489
1624
|
/** What the empty option says: "always", "every card". */
|
|
1490
1625
|
emptyLabel?: string;
|
|
1491
|
-
/**
|
|
1626
|
+
/**
|
|
1627
|
+
* false draws one level of clauses and no "Add a group". Left out, groups nest as deep as a
|
|
1628
|
+
* person builds them — the depth the store compiles.
|
|
1629
|
+
*/
|
|
1492
1630
|
allowNesting?: boolean;
|
|
1631
|
+
/** How deep this group sits (0 = the whole condition). Set by the builder itself. */
|
|
1632
|
+
depth?: number;
|
|
1633
|
+
/** A nested group can take itself away; the outermost one cannot. */
|
|
1634
|
+
onRemove?: (() => void) | undefined;
|
|
1493
1635
|
className?: string | undefined;
|
|
1494
1636
|
}
|
|
1495
1637
|
/**
|
|
1496
1638
|
* THE ONE CONDITION BUILDER. One clause reads exactly as it always has — a single row, no
|
|
1497
|
-
* joiner, no chrome — and the joiner appears
|
|
1498
|
-
*
|
|
1639
|
+
* joiner, no chrome — and the joiner appears once there is something to join, so a person
|
|
1640
|
+
* writing one condition never meets a control for a problem they do not have. A nested group
|
|
1641
|
+
* always shows its joiner: it is a box with its own and / or, and that is the whole point of it.
|
|
1499
1642
|
*/
|
|
1500
|
-
declare function ConditionGroup({ lead, expr, fields, onChange, emptyLabel, allowNesting, className, }: ConditionGroupProps): react.JSX.Element;
|
|
1643
|
+
declare function ConditionGroup({ lead, expr, fields, onChange, emptyLabel, allowNesting, depth, onRemove, className, }: ConditionGroupProps): react.JSX.Element;
|
|
1501
1644
|
|
|
1502
1645
|
interface FieldProposalRow {
|
|
1503
1646
|
id: string;
|
|
@@ -1570,6 +1713,40 @@ interface RelationPickerProps {
|
|
|
1570
1713
|
}
|
|
1571
1714
|
declare function RelationPicker({ field, value, onChange, disabled, id, className, allowCreate }: RelationPickerProps): react.JSX.Element;
|
|
1572
1715
|
|
|
1716
|
+
/** What the panel says while the chosen list is empty. */
|
|
1717
|
+
declare const ENTITY_REFERENCE_KINDS_MISSING = "Choose at least one kind of thing this column points at.";
|
|
1718
|
+
/**
|
|
1719
|
+
* The declaration an entity-reference column is sent as — the words `custom.field_declare`
|
|
1720
|
+
* reads (`type: "entity_reference"`, `allowed_types`, `multi`). One place builds it, so the field
|
|
1721
|
+
* editor, a table template and an agent never disagree on the shape.
|
|
1722
|
+
*/
|
|
1723
|
+
declare function entityReferenceSpec(input: {
|
|
1724
|
+
label: string;
|
|
1725
|
+
allowedTypes: readonly string[];
|
|
1726
|
+
multi?: boolean;
|
|
1727
|
+
required?: boolean;
|
|
1728
|
+
}): {
|
|
1729
|
+
label: string;
|
|
1730
|
+
type: "entity_reference";
|
|
1731
|
+
allowed_types: string[];
|
|
1732
|
+
multi: boolean;
|
|
1733
|
+
required: boolean;
|
|
1734
|
+
};
|
|
1735
|
+
/** The sentence the panel shows before it lets a person save, or `null` when nothing is missing. */
|
|
1736
|
+
declare function whatIsMissingForEntityReference(allowedTypes: readonly string[]): string | null;
|
|
1737
|
+
interface EntityReferenceKindPickerProps {
|
|
1738
|
+
/** The chosen entity tokens (`config.allowed_types`). */
|
|
1739
|
+
value: readonly string[];
|
|
1740
|
+
onChange: (next: string[]) => void;
|
|
1741
|
+
/**
|
|
1742
|
+
* An existing column: the store keeps its kinds and this panel sends no change to them,
|
|
1743
|
+
* so the list is shown read-only rather than as a control that silently does nothing.
|
|
1744
|
+
*/
|
|
1745
|
+
locked?: boolean;
|
|
1746
|
+
className?: string;
|
|
1747
|
+
}
|
|
1748
|
+
declare function EntityReferenceKindPicker({ value, onChange, locked, className }: EntityReferenceKindPickerProps): react.JSX.Element;
|
|
1749
|
+
|
|
1573
1750
|
interface FieldEditorControlProps {
|
|
1574
1751
|
field: Field;
|
|
1575
1752
|
value: unknown;
|
|
@@ -1591,36 +1768,6 @@ declare function RecordChip({ title, onRemove, className, }: {
|
|
|
1591
1768
|
className?: string | undefined;
|
|
1592
1769
|
}): react.JSX.Element;
|
|
1593
1770
|
|
|
1594
|
-
/** Answers "what is the record with this id called", for one Field's values. */
|
|
1595
|
-
type LabelLookup = (field: Field$1, id: string) => string | null;
|
|
1596
|
-
/**
|
|
1597
|
-
* HOW LONG A CELL MAY SAY "Loading…" BEFORE IT HAS TO SAY WHAT IT IS WAITING
|
|
1598
|
-
* FOR. One second is the span at which a person stops reading a word as "this
|
|
1599
|
-
* is about to happen" and starts reading it as "this is stuck" — the same line
|
|
1600
|
-
* Nielsen's response-time work draws and the one Linear and Stripe design to.
|
|
1601
|
-
*/
|
|
1602
|
-
declare const SAY_WHAT_YOU_ARE_WAITING_FOR_AFTER_MS = 1000;
|
|
1603
|
-
/** Which ids a Field's stored value refers to. */
|
|
1604
|
-
declare function idsOf(value: unknown): string[];
|
|
1605
|
-
declare function isId(value: unknown): boolean;
|
|
1606
|
-
/** True when this Field's values are ids of other records rather than values. */
|
|
1607
|
-
declare function pointsAtRecords(field: Field$1): boolean;
|
|
1608
|
-
declare function RecordLabelProvider({ children }: {
|
|
1609
|
-
children: ReactNode;
|
|
1610
|
-
}): react.JSX.Element;
|
|
1611
|
-
/**
|
|
1612
|
-
* The hook a surface uses: it declares the Fields it is about to draw, and gets
|
|
1613
|
-
* back the lookup. Declaring is what makes one request per Field instead of one
|
|
1614
|
-
* per cell, and it is why a grid of 200 rows asks the store twice.
|
|
1615
|
-
*/
|
|
1616
|
-
declare function useRecordLabels(fields: readonly Field$1[] | undefined): LabelLookup;
|
|
1617
|
-
/**
|
|
1618
|
-
* WHAT THIS COLUMN IS STILL WAITING FOR, or null while "Loading…" is still an
|
|
1619
|
-
* honest word. A cell draws this INSTEAD of "Loading…" once the resolver has
|
|
1620
|
-
* been looking for a second — see `SAY_WHAT_YOU_ARE_WAITING_FOR_AFTER_MS`.
|
|
1621
|
-
*/
|
|
1622
|
-
declare function useLabelWait(field: Field$1 | undefined): string | null;
|
|
1623
|
-
|
|
1624
1771
|
/** The envelope for one key, when the document carries one. */
|
|
1625
1772
|
declare function envelopeFor(document: RecordDocument | undefined, key: string): ValueEnvelope | undefined;
|
|
1626
1773
|
declare function renderValue(field: Field, value: unknown, document?: RecordDocument, labels?: LabelLookup, stillWaitingFor?: string | null): react.JSX.Element;
|
|
@@ -1846,6 +1993,14 @@ interface SavedViewSpec {
|
|
|
1846
1993
|
* reading is a fact about the records.
|
|
1847
1994
|
*/
|
|
1848
1995
|
measure?: string | null;
|
|
1996
|
+
/**
|
|
1997
|
+
* Kanban: the Field whose values cut the board into SWIMLANES across the columns — a
|
|
1998
|
+
* dispatcher's board by Status, one lane per Technician (S1-PRIME VIEW-KEYS). Never the
|
|
1999
|
+
* column Field itself; the store refuses that.
|
|
2000
|
+
*/
|
|
2001
|
+
swimlaneField?: string | null;
|
|
2002
|
+
/** Kanban: the columns this view keeps shut to a strip, by the column's stored value. */
|
|
2003
|
+
collapsedColumns?: string[];
|
|
1849
2004
|
/** Calendar: the Field that places a record in the month. */
|
|
1850
2005
|
dateField?: string | null;
|
|
1851
2006
|
/** Gallery: the Field shown large on the card. */
|
|
@@ -1856,6 +2011,22 @@ interface SavedViewSpec {
|
|
|
1856
2011
|
* reference to its Rule record, never a predicate this package evaluates.
|
|
1857
2012
|
*/
|
|
1858
2013
|
ruleId?: Uuid$1 | null;
|
|
2014
|
+
/**
|
|
2015
|
+
* THE FLAT FILTER a digest or a notify rule wrote the view with — the one shape
|
|
2016
|
+
* `custom.record_filter_sql` compiles, by Field KEY. A view saved in the bar has
|
|
2017
|
+
* none; a view saved by `DigestScheduler` ("where Status is Open") does, and the
|
|
2018
|
+
* grid and the board show exactly the records it names.
|
|
2019
|
+
*/
|
|
2020
|
+
filters?: RecordFilter;
|
|
2021
|
+
/**
|
|
2022
|
+
* S2-PRIME — THE VIEW'S OWN QUESTION, as the condition builder writes it: the store's Rule
|
|
2023
|
+
* shape `{op, args}`, ALL / ANY / NOT groups nested to any depth, Fields by id. Kept in the
|
|
2024
|
+
* definition as `where` and asked of the store unchanged — the grid's list door, the board's
|
|
2025
|
+
* headings and the dashboard's numbers compile it into the one WHERE clause
|
|
2026
|
+
* (`custom.record_filter_sql`). Never stored under `filters`: that key is the flat map the
|
|
2027
|
+
* digests and the notifier read, and they would refuse it by name.
|
|
2028
|
+
*/
|
|
2029
|
+
where?: RuleExpression | null;
|
|
1859
2030
|
isDefault?: boolean;
|
|
1860
2031
|
/**
|
|
1861
2032
|
* HOW THIS VIEW LOOKS — its colors, its per-column formats and its frozen
|
|
@@ -1868,19 +2039,24 @@ interface SavedViewSpec {
|
|
|
1868
2039
|
*/
|
|
1869
2040
|
presentation?: GridPresentation;
|
|
1870
2041
|
}
|
|
1871
|
-
/**
|
|
2042
|
+
/**
|
|
2043
|
+
* A saved view as it comes back out of the store, with its row's own id.
|
|
2044
|
+
*
|
|
2045
|
+
* It carries no version: `custom.view_declare` MERGES one key at a time, so two
|
|
2046
|
+
* tabs pressing two different controls on one view both stand, and one control
|
|
2047
|
+
* pressed in both keeps the latest — how Airtable and Notion keep a view change.
|
|
2048
|
+
*/
|
|
1872
2049
|
interface SavedView extends SavedViewSpec {
|
|
1873
2050
|
id: Uuid$1;
|
|
2051
|
+
/** Where the view came from when it was moved in (the mover, the S0 repair), else null. */
|
|
2052
|
+
movedFrom: Record<string, unknown> | null;
|
|
1874
2053
|
/**
|
|
1875
|
-
*
|
|
1876
|
-
*
|
|
1877
|
-
*
|
|
1878
|
-
* ordinary last-writer-wins write, exactly as the store defines it.
|
|
2054
|
+
* THE WAY THIS TABLE IS MEANT TO BE LOOKED AT, when somebody decided one — a layout id the
|
|
2055
|
+
* host draws (`sheet`), read off the stored kind before `layout` folds it to the four the
|
|
2056
|
+
* package draws. Null when nobody designated one. See `designatedLayoutOf`.
|
|
1879
2057
|
*/
|
|
1880
|
-
|
|
2058
|
+
designatedLayout?: string | null;
|
|
1881
2059
|
}
|
|
1882
|
-
/** The package-owned Table every saved view is a record of. */
|
|
1883
|
-
declare const VIEW_TABLE: SystemTableSpec;
|
|
1884
2060
|
/**
|
|
1885
2061
|
* WHICH FIELD EACH LAYOUT CAN BE DRAWN FROM, decided from the FIELD'S OWN
|
|
1886
2062
|
* DECLARATION and never from the values it happens to hold.
|
|
@@ -1944,33 +2120,106 @@ declare function pageViewFromParam(raw: string | null | undefined): PageView | n
|
|
|
1944
2120
|
declare function unknownViewLine(raw: string): string;
|
|
1945
2121
|
/** The one sentence a layout says when the table holds no Field it could use. */
|
|
1946
2122
|
declare const LAYOUT_NO_FIELD: Record<ViewLayout, string>;
|
|
1947
|
-
/**
|
|
2123
|
+
/**
|
|
2124
|
+
* THE SPEC AS THE ONE DEFINITION `platform.saved_view` HOLDS — the keys
|
|
2125
|
+
* `custom.view_declare` documents, by Field KEY. `subject` is not in it: the door
|
|
2126
|
+
* takes the Table as its own argument and writes `table_id` itself.
|
|
2127
|
+
*/
|
|
1948
2128
|
declare function viewDocument(spec: SavedViewSpec): Record<string, unknown>;
|
|
1949
|
-
/** One stored record back into the spec a screen and an agent both read. */
|
|
1950
|
-
declare function viewFromRecord(row: ReadRow): SavedView;
|
|
1951
2129
|
/**
|
|
1952
|
-
*
|
|
2130
|
+
* One row of `custom.views` back into the spec a screen and an agent both read — THROUGH THE ONE
|
|
2131
|
+
* ACCESSOR (`viewSettings`, viewKeys.ts), so every layout sees every declared key the same way.
|
|
2132
|
+
*/
|
|
2133
|
+
declare function viewFromRow(row: SavedViewRow): SavedView;
|
|
2134
|
+
/**
|
|
2135
|
+
* SAVE ONE NEW VIEW of a Table — the bar's "New view" and an agent's seed spec.
|
|
2136
|
+
* One `view_declare` with no `view_id`; the answer is the new view's id.
|
|
2137
|
+
*/
|
|
2138
|
+
declare function declareView(client: Pick<RecordsClient, "viewDeclare">, spec: SavedViewSpec): Promise<RecordsResult<Uuid$1>>;
|
|
2139
|
+
/**
|
|
2140
|
+
* WRITE A CHANGE ONTO A SAVED VIEW, AND KEEP IT.
|
|
1953
2141
|
*
|
|
1954
|
-
*
|
|
1955
|
-
*
|
|
1956
|
-
*
|
|
1957
|
-
*
|
|
1958
|
-
*
|
|
2142
|
+
* `custom.view_declare` with the view's id MERGES: only the keys in `patch` are
|
|
2143
|
+
* written, a key cleared to null is removed, and everything the patch did not
|
|
2144
|
+
* name — the grid's own choices, a hand-set order, where the view was moved from,
|
|
2145
|
+
* a colour set in another tab — stays exactly as it was (S0, 2026-09-23: the door
|
|
2146
|
+
* used to rebuild the whole definition from what one press sent).
|
|
1959
2147
|
*
|
|
1960
|
-
*
|
|
1961
|
-
*
|
|
1962
|
-
*
|
|
1963
|
-
*
|
|
1964
|
-
* page to say through the one notice.
|
|
2148
|
+
* There is no version to be stale against (VERIFIER-15 M4 is closed by the shape,
|
|
2149
|
+
* not by a retry): a saved view is a person's own arrangement of a table, and
|
|
2150
|
+
* their latest press on a control is the one that stands. A refusal — the view
|
|
2151
|
+
* was removed, or belongs to a table this person cannot open — is handed back for
|
|
2152
|
+
* the page to say through the one notice.
|
|
1965
2153
|
*/
|
|
1966
|
-
declare function saveViewPatch(client: Pick<RecordsClient, "
|
|
2154
|
+
declare function saveViewPatch(client: Pick<RecordsClient, "viewDeclare">, tableId: Uuid$1, viewId: Uuid$1, patch: Partial<SavedViewSpec>): Promise<RecordsResult<Uuid$1>>;
|
|
1967
2155
|
/**
|
|
1968
|
-
* A PARTIAL change to a saved view, as the
|
|
1969
|
-
* the caller actually changed are
|
|
1970
|
-
*
|
|
2156
|
+
* A PARTIAL change to a saved view, as the definition keys the door merges. Only
|
|
2157
|
+
* the keys the caller actually changed are sent; a Field cleared (a board with no
|
|
2158
|
+
* "Group by") is sent as `null`, which the door removes.
|
|
1971
2159
|
*/
|
|
1972
2160
|
declare function viewPatchDocument(patch: Partial<SavedViewSpec>): Record<string, unknown>;
|
|
1973
2161
|
|
|
2162
|
+
/** Every surface a saved view is drawn by. `sheet` is the spreadsheet surface (G-lanes). */
|
|
2163
|
+
type ViewKeyLayout = "grid" | "kanban" | "calendar" | "gallery" | "sheet";
|
|
2164
|
+
/** Who may write a key: anyone who may save the view, an input the door rewrites, or the server only. */
|
|
2165
|
+
type ViewKeyWriter = "caller" | "input" | "server";
|
|
2166
|
+
interface ViewKeyDeclaration {
|
|
2167
|
+
/** Where it lives in `platform.saved_view.definition` (dotted under `presentation`). */
|
|
2168
|
+
path: string;
|
|
2169
|
+
/** What the store's guard checks (`custom._view_key_value`). */
|
|
2170
|
+
shape: string;
|
|
2171
|
+
/** The layouts that read it. */
|
|
2172
|
+
layouts: readonly ViewKeyLayout[];
|
|
2173
|
+
writer: ViewKeyWriter;
|
|
2174
|
+
}
|
|
2175
|
+
/**
|
|
2176
|
+
* THE REGISTRY, as `custom.view_keys()` declares it (uichamp_s1_a_view_keeps_every_setting_it_is_given.sql).
|
|
2177
|
+
* Order and content are compared with the store by the live walk.
|
|
2178
|
+
*/
|
|
2179
|
+
declare const VIEW_KEYS: readonly ViewKeyDeclaration[];
|
|
2180
|
+
/** The keys one layout reads, by path. */
|
|
2181
|
+
declare function viewKeysFor(layout: ViewKeyLayout): string[];
|
|
2182
|
+
/** One sort clause: a Field key and a direction. */
|
|
2183
|
+
interface ViewSortKey {
|
|
2184
|
+
field: string;
|
|
2185
|
+
direction: "asc" | "desc";
|
|
2186
|
+
}
|
|
2187
|
+
/**
|
|
2188
|
+
* EVERY DECLARED KEY OF A VIEW, TYPED. Absent keys are `null` / empty, never guessed.
|
|
2189
|
+
* `presentation` is the parsed look (colour field, pinned fields, row height, grouping with its
|
|
2190
|
+
* sub-groups and shut sections, hidden fields, gallery size, summaries).
|
|
2191
|
+
*/
|
|
2192
|
+
interface ViewSettings {
|
|
2193
|
+
layout: "grid" | "kanban" | "calendar" | "gallery";
|
|
2194
|
+
filters: RecordFilter | null;
|
|
2195
|
+
where: RuleExpression | null;
|
|
2196
|
+
groupField: string | null;
|
|
2197
|
+
swimlaneField: string | null;
|
|
2198
|
+
collapsedColumns: string[];
|
|
2199
|
+
measure: string | null;
|
|
2200
|
+
dateField: string | null;
|
|
2201
|
+
imageField: string | null;
|
|
2202
|
+
sorts: ViewSortKey[];
|
|
2203
|
+
ruleId: string | null;
|
|
2204
|
+
isDefault: boolean;
|
|
2205
|
+
presentation: GridPresentation;
|
|
2206
|
+
movedFrom: Record<string, unknown> | null;
|
|
2207
|
+
}
|
|
2208
|
+
/** THE READER. A stored `definition` (and the row's flat `filters`) in, every declared key out. */
|
|
2209
|
+
declare function viewSettings(definition: Record<string, unknown> | null | undefined, rowFilters?: RecordFilter | null): ViewSettings;
|
|
2210
|
+
/** The settings as the spec names them — what `viewSettingsPatch` takes. */
|
|
2211
|
+
type ViewSettingsPatch = Partial<Omit<ViewSettings, "movedFrom">>;
|
|
2212
|
+
/**
|
|
2213
|
+
* THE KEYS ONE LAYOUT READS, and nothing else. A layout that does not use a key never sees it:
|
|
2214
|
+
* a calendar is not told the board's swimlanes, a board is not told the grid's pinned fields.
|
|
2215
|
+
*/
|
|
2216
|
+
declare function viewSettingsFor(settings: ViewSettings, layout: ViewKeyLayout): Partial<ViewSettings>;
|
|
2217
|
+
/**
|
|
2218
|
+
* THE WRITER'S SHAPE. Only the keys a press changed; a cleared Field is `null` (the door removes
|
|
2219
|
+
* it); lists are sent whole. `presentation` is sent whole because the door judges it as one key.
|
|
2220
|
+
*/
|
|
2221
|
+
declare function viewSettingsPatch(patch: ViewSettingsPatch): Record<string, unknown>;
|
|
2222
|
+
|
|
1974
2223
|
interface ViewSwitcherProps {
|
|
1975
2224
|
/**
|
|
1976
2225
|
* THE DECLARATIVE SPEC — an agent writes the whole thing, a person tweaks it.
|
|
@@ -2005,12 +2254,30 @@ interface ViewSwitcherProps {
|
|
|
2005
2254
|
* object the chart counted with. It narrows the grid AND the board through
|
|
2006
2255
|
* the store, so switching layout after a drill-through keeps the same rows
|
|
2007
2256
|
* instead of quietly widening back to the whole table.
|
|
2257
|
+
*
|
|
2258
|
+
* S2-PRIME: either shape — a flat map, or the view's own nested question (`where`, the
|
|
2259
|
+
* store's Rule shape). The grid, the board's headings and the numbers all ask it.
|
|
2260
|
+
*/
|
|
2261
|
+
filter?: StoreFilter | undefined;
|
|
2262
|
+
/**
|
|
2263
|
+
* The HOST layout showing now (`RecordsUiHost.layouts`, by id), or null for the
|
|
2264
|
+
* package's own. Controlled by the page, because the address names it.
|
|
2265
|
+
*/
|
|
2266
|
+
hostLayout?: string | null | undefined;
|
|
2267
|
+
/** The person picked a host layout (its id), or went back to one of the four (null). */
|
|
2268
|
+
onHostLayoutChange?: ((id: string | null) => void) | undefined;
|
|
2269
|
+
/**
|
|
2270
|
+
* Whether this component draws its own row — the view's name and the layout buttons. `false`
|
|
2271
|
+
* when the page that mounts it draws the layout choice itself (`TablePage` keeps one control
|
|
2272
|
+
* cluster for the whole table, lane DATA-V2-FACE). Default `true`, for every other host.
|
|
2008
2273
|
*/
|
|
2009
|
-
|
|
2274
|
+
chooser?: boolean | undefined;
|
|
2275
|
+
/** Handed to a host layout's `render` — the page's own export. */
|
|
2276
|
+
openExport?: (() => void) | undefined;
|
|
2010
2277
|
className?: string | undefined;
|
|
2011
2278
|
}
|
|
2012
2279
|
/** The records this view holds: its Rule's members when it names one, the table otherwise. */
|
|
2013
|
-
declare function useViewRecords(view: SavedViewSpec, pageSize?: number, filter?:
|
|
2280
|
+
declare function useViewRecords(view: SavedViewSpec, pageSize?: number, filter?: StoreFilter): {
|
|
2014
2281
|
rows: ReadRow$1[];
|
|
2015
2282
|
loading: boolean;
|
|
2016
2283
|
error: RecordsError | null;
|
|
@@ -2028,7 +2295,7 @@ declare function useViewRecords(view: SavedViewSpec, pageSize?: number, filter?:
|
|
|
2028
2295
|
*/
|
|
2029
2296
|
membership: string;
|
|
2030
2297
|
};
|
|
2031
|
-
declare function ViewSwitcher({ view, onLayoutChange, onViewChange, onOpenRecord, onMoved, onNewRecordForm, onAskWhoChanged, pageSize, filter, className, }: ViewSwitcherProps): react.JSX.Element;
|
|
2298
|
+
declare function ViewSwitcher({ view, onLayoutChange, onViewChange, onOpenRecord, onMoved, onNewRecordForm, onAskWhoChanged, pageSize, filter, hostLayout, onHostLayoutChange, chooser, openExport, className, }: ViewSwitcherProps): react.JSX.Element;
|
|
2032
2299
|
|
|
2033
2300
|
/** What the screen says above the list, so nobody has to be told twice that nothing was destroyed. */
|
|
2034
2301
|
declare const ARCHIVE_MEANS = "Archiving never destroys anything. A record you remove from the grid waits here until somebody brings it back.";
|
|
@@ -2111,15 +2378,28 @@ interface ViewBarProps {
|
|
|
2111
2378
|
* The person tweaks them afterwards like any other view.
|
|
2112
2379
|
*/
|
|
2113
2380
|
seed?: SavedViewSpec[] | undefined;
|
|
2381
|
+
/**
|
|
2382
|
+
* Draw nothing while the table has at most one saved view (lane DATA-V2-FACE). One view is not
|
|
2383
|
+
* a choice, and a row of one tab is chrome over the table; the page offers "Saved views" in its
|
|
2384
|
+
* menu instead. Two or more views are a real choice and the bar draws.
|
|
2385
|
+
*/
|
|
2386
|
+
quietWhenAlone?: boolean | undefined;
|
|
2387
|
+
/** Every time the list is read: the views, or null when they could not be read. */
|
|
2388
|
+
onViews?: ((views: SavedView[] | null) => void) | undefined;
|
|
2114
2389
|
className?: string | undefined;
|
|
2115
2390
|
}
|
|
2116
2391
|
/**
|
|
2117
|
-
* What the bar says when
|
|
2118
|
-
*
|
|
2119
|
-
*
|
|
2392
|
+
* What the bar says when the saved views cannot be read. It names the ONE thing that is
|
|
2393
|
+
* missing (the remembered layouts) and nothing else, because everything else on the page
|
|
2394
|
+
* still works and a longer sentence would suggest otherwise.
|
|
2120
2395
|
*/
|
|
2121
2396
|
declare const SAVED_VIEWS_UNAVAILABLE: string;
|
|
2122
|
-
|
|
2397
|
+
/**
|
|
2398
|
+
* WHETHER A SEED IS ALREADY THERE. A view by the seed's name always satisfies it; a DEFAULT seed
|
|
2399
|
+
* is also satisfied by any view the table already marks as its default, whatever it is called.
|
|
2400
|
+
*/
|
|
2401
|
+
declare function seedIsSatisfied(seed: SavedViewSpec, views: readonly SavedView[]): boolean;
|
|
2402
|
+
declare function ViewBar({ tableId, activeViewId, onActiveView, seed, quietWhenAlone, onViews, className }: ViewBarProps): react.JSX.Element | null;
|
|
2123
2403
|
|
|
2124
2404
|
/** One proposed change, in the proposer's words plus the exact act it asks for. */
|
|
2125
2405
|
interface ProposedChange {
|
|
@@ -2254,6 +2534,13 @@ interface FormTheme {
|
|
|
2254
2534
|
accent?: string | null;
|
|
2255
2535
|
align?: "left" | "center" | null;
|
|
2256
2536
|
}
|
|
2537
|
+
/** The screen after sending: the form's words, and optionally where to go next. */
|
|
2538
|
+
interface FormThankYou {
|
|
2539
|
+
title?: string | null;
|
|
2540
|
+
body?: string | null;
|
|
2541
|
+
/** A secure page on one of the organization's own sites. The store judges it. */
|
|
2542
|
+
redirectUrl?: string | null;
|
|
2543
|
+
}
|
|
2257
2544
|
/** THE COMPLETE DECLARATIVE SPEC. One `record_write` and the form exists. */
|
|
2258
2545
|
interface FormSpec {
|
|
2259
2546
|
name: string;
|
|
@@ -2263,10 +2550,15 @@ interface FormSpec {
|
|
|
2263
2550
|
questions: FormQuestionSpec[];
|
|
2264
2551
|
flow?: FormFlow | null;
|
|
2265
2552
|
theme?: FormTheme | null;
|
|
2266
|
-
|
|
2267
|
-
|
|
2268
|
-
|
|
2269
|
-
|
|
2553
|
+
/**
|
|
2554
|
+
* WHAT THE PERSON SEES AFTER SENDING. `title` and `body` are the form's own
|
|
2555
|
+
* words for the next step ("You are all set" / "Next, book your first visit").
|
|
2556
|
+
* `redirectUrl` optionally sends them on to a page instead — and only ever to
|
|
2557
|
+
* one of the organization's own sites: `custom.form_declare` refuses anything
|
|
2558
|
+
* else by name, and `custom.form_public` stops handing it out the moment its
|
|
2559
|
+
* site leaves the organization's list (lane S7-PRIME).
|
|
2560
|
+
*/
|
|
2561
|
+
thankYou?: FormThankYou | null;
|
|
2270
2562
|
submitLabel?: string | null;
|
|
2271
2563
|
/**
|
|
2272
2564
|
* Is this form meant to be answerable by someone who is not signed in? The
|
|
@@ -2422,6 +2714,8 @@ interface PortalCardViewProps {
|
|
|
2422
2714
|
onPreview: (person: PortalPrincipal, tableId: Uuid) => Promise<PortalAnswer<PortalPreviewRow[]>>;
|
|
2423
2715
|
/** The invite control, which needs a client of its own. Absent means none is offered. */
|
|
2424
2716
|
invite?: ReactNode;
|
|
2717
|
+
/** S6 — the look-and-forms editor, which needs a client of its own. Absent means none is offered. */
|
|
2718
|
+
look?: ReactNode;
|
|
2425
2719
|
/**
|
|
2426
2720
|
* Where this app is served from, so a person's own invitation link can be copied whole.
|
|
2427
2721
|
* Omit it and the view falls back to the browser's origin, which keeps this component
|
|
@@ -2430,7 +2724,16 @@ interface PortalCardViewProps {
|
|
|
2430
2724
|
origin?: string | undefined;
|
|
2431
2725
|
className?: string | undefined;
|
|
2432
2726
|
}
|
|
2433
|
-
declare function PortalCardView({ card, tableId, onRevoke, onPreview, invite, origin, className, }: PortalCardViewProps): react.JSX.Element;
|
|
2727
|
+
declare function PortalCardView({ card, tableId, onRevoke, onPreview, invite, look, origin, className, }: PortalCardViewProps): react.JSX.Element;
|
|
2728
|
+
|
|
2729
|
+
interface PortalLookEditorProps {
|
|
2730
|
+
/** Exactly what `custom.portal_card` answered. */
|
|
2731
|
+
card: PortalCard;
|
|
2732
|
+
/** Called after the store took the new look; the host re-reads the card. */
|
|
2733
|
+
onSaved: () => void;
|
|
2734
|
+
className?: string | undefined;
|
|
2735
|
+
}
|
|
2736
|
+
declare function PortalLookEditor({ card, onSaved, className }: PortalLookEditorProps): react.JSX.Element;
|
|
2434
2737
|
|
|
2435
2738
|
interface DigestSchedulerProps {
|
|
2436
2739
|
/** The Table the digest is about. A saved view is a view OF something. */
|
|
@@ -2456,7 +2759,7 @@ interface DigestSchedulerProps {
|
|
|
2456
2759
|
* shape: an unknown here is a subscription that silently notifies about the
|
|
2457
2760
|
* wrong records.
|
|
2458
2761
|
*/
|
|
2459
|
-
filters?: RecordFilter
|
|
2762
|
+
filters?: RecordFilter | null | undefined;
|
|
2460
2763
|
onScheduled?: (() => void) | undefined;
|
|
2461
2764
|
onClose?: (() => void) | undefined;
|
|
2462
2765
|
className?: string | undefined;
|
|
@@ -2591,6 +2894,10 @@ interface ChartSpec {
|
|
|
2591
2894
|
stateKey?: string;
|
|
2592
2895
|
/** `stuck` only: how long a record may sit on the same value. */
|
|
2593
2896
|
days?: number;
|
|
2897
|
+
/** S3 — the comparison this block makes, as the store stores it. */
|
|
2898
|
+
compare?: AggregateCompare | null;
|
|
2899
|
+
/** S3 — the number this block aims for. */
|
|
2900
|
+
target?: DashboardTarget | null;
|
|
2594
2901
|
}
|
|
2595
2902
|
/** A dashboard as `custom.dashboards` reports it, in the screen's own words. */
|
|
2596
2903
|
interface SavedDashboard {
|
|
@@ -2763,9 +3070,17 @@ interface NotifyRuleEditorProps {
|
|
|
2763
3070
|
tableId: Uuid;
|
|
2764
3071
|
/** COMPLETE declarative subscriptions an agent wrote. Saved once, never overwritten. */
|
|
2765
3072
|
seed?: NotifyRuleSpec[] | undefined;
|
|
3073
|
+
/**
|
|
3074
|
+
* CHOOSE MODE — the subscription something else points at (a form's notify
|
|
3075
|
+
* Rule). Given with `onChoose`, each subscription offers to be the one, and a
|
|
3076
|
+
* subscription made here becomes the one the moment the store has it.
|
|
3077
|
+
*/
|
|
3078
|
+
chosenRuleId?: Uuid | null | undefined;
|
|
3079
|
+
/** CHOOSE MODE — called with the chosen subscription's Rule id, or null to choose none. */
|
|
3080
|
+
onChoose?: ((ruleId: Uuid | null) => void) | undefined;
|
|
2766
3081
|
className?: string | undefined;
|
|
2767
3082
|
}
|
|
2768
|
-
declare function NotifyRuleEditor({ tableId, seed, className }: NotifyRuleEditorProps): react.JSX.Element;
|
|
3083
|
+
declare function NotifyRuleEditor({ tableId, seed, chosenRuleId, onChoose, className }: NotifyRuleEditorProps): react.JSX.Element;
|
|
2769
3084
|
|
|
2770
3085
|
interface ChartBlockProps {
|
|
2771
3086
|
/** One block out of the canvas's single run — answered, or refused. */
|
|
@@ -2801,6 +3116,24 @@ interface FormsPanelProps {
|
|
|
2801
3116
|
declare const FORM_NOT_HERE_LINE: string;
|
|
2802
3117
|
declare function FormsPanel({ tableId, activeFormId, className }: FormsPanelProps): react.JSX.Element;
|
|
2803
3118
|
|
|
3119
|
+
/**
|
|
3120
|
+
* What the public arm's `whichAsked` answers: for each question, whether the
|
|
3121
|
+
* STORE says it is asked given the answers so far. `said` is the store's own
|
|
3122
|
+
* sentence when it could not work a condition out — that question is asked, and
|
|
3123
|
+
* the sentence is shown, never a silent hide.
|
|
3124
|
+
*/
|
|
3125
|
+
type FormAsked = {
|
|
3126
|
+
ok: true;
|
|
3127
|
+
asks: ReadonlyArray<{
|
|
3128
|
+
field: string;
|
|
3129
|
+
asked: boolean;
|
|
3130
|
+
said?: string | null;
|
|
3131
|
+
}>;
|
|
3132
|
+
} | {
|
|
3133
|
+
ok: false;
|
|
3134
|
+
message: string;
|
|
3135
|
+
error?: RecordsError | undefined;
|
|
3136
|
+
};
|
|
2804
3137
|
/** What the public arm's `onSubmit` answers. A refusal carries the door's words. */
|
|
2805
3138
|
type FormSubmitOutcome = {
|
|
2806
3139
|
ok: true;
|
|
@@ -2827,11 +3160,31 @@ interface FormRunnerProps {
|
|
|
2827
3160
|
fields?: readonly Field[] | undefined;
|
|
2828
3161
|
/** PUBLIC ARM — where an answer goes. Server action or route handler. */
|
|
2829
3162
|
onSubmit?: ((values: Record<string, unknown>) => Promise<FormSubmitOutcome>) | undefined;
|
|
3163
|
+
/**
|
|
3164
|
+
* PUBLIC ARM — which questions are asked next, answered by the STORE on the
|
|
3165
|
+
* server (`custom.form_public_asks`). Asked again as answers change. Left out
|
|
3166
|
+
* on a form with conditions, every question is shown and the form says why.
|
|
3167
|
+
*/
|
|
3168
|
+
whichAsked?: ((values: Record<string, unknown>) => Promise<FormAsked>) | undefined;
|
|
2830
3169
|
/**
|
|
2831
3170
|
* PUBLIC ARM — the name of a decoy input. A person never fills it; a script
|
|
2832
3171
|
* fills everything. The door decides what a filled one means, not this screen.
|
|
2833
3172
|
*/
|
|
2834
3173
|
honeypotKey?: string | null | undefined;
|
|
3174
|
+
/**
|
|
3175
|
+
* Answers the form starts with — a prefilled link, or a saved place being
|
|
3176
|
+
* resumed. They are ordinary answers: shown in their questions, changeable,
|
|
3177
|
+
* and handed to `whichAsked` like any typed answer, so branching follows.
|
|
3178
|
+
*/
|
|
3179
|
+
initialAnswers?: Readonly<Record<string, unknown>> | undefined;
|
|
3180
|
+
/** Every change to the answers, after the first paint. The host keeps the place. */
|
|
3181
|
+
onAnswersChange?: ((answers: Record<string, unknown>) => void) | undefined;
|
|
3182
|
+
/**
|
|
3183
|
+
* `initialAnswers` is a saved place the person is coming back to, so the form
|
|
3184
|
+
* opens on the first question still waiting for an answer. Without it a
|
|
3185
|
+
* prefilled form opens on question one, showing the prefilled answer in place.
|
|
3186
|
+
*/
|
|
3187
|
+
resumed?: boolean | undefined;
|
|
2835
3188
|
/** Preview mode answers the questions but writes nothing, and says so. */
|
|
2836
3189
|
preview?: boolean | undefined;
|
|
2837
3190
|
onSubmitted?: ((recordId: Uuid | null) => void) | undefined;
|
|
@@ -3202,11 +3555,37 @@ interface TablesHomeProps {
|
|
|
3202
3555
|
* did before, rather than on a screen it does not know how to address.
|
|
3203
3556
|
*/
|
|
3204
3557
|
onOpenTable?: ((tableId: Uuid$1, dashboardId?: Uuid$1) => void) | undefined;
|
|
3558
|
+
/**
|
|
3559
|
+
* THE ORGANIZATION EVERY ROW HERE LIVES IN, BY NAME (lane SC-1-TAILS; access-is-personal: a
|
|
3560
|
+
* list filtered by one organization says which). Each row carries a quiet "Lives in <name>"
|
|
3561
|
+
* chip that, pressed, asks the store where that table lives and — for its owner — where else
|
|
3562
|
+
* it can go. Absent: the list asks the store once, for its first table. When the store cannot
|
|
3563
|
+
* name it, the chips are absent rather than a row of "unknown".
|
|
3564
|
+
*/
|
|
3565
|
+
organizationName?: string | null | undefined;
|
|
3205
3566
|
className?: string | undefined;
|
|
3206
3567
|
}
|
|
3207
|
-
declare function TablesHome({ onOpenTable, className }: TablesHomeProps): react.JSX.Element;
|
|
3568
|
+
declare function TablesHome({ onOpenTable, organizationName, className }: TablesHomeProps): react.JSX.Element;
|
|
3569
|
+
|
|
3570
|
+
interface WhereItLivesProps {
|
|
3571
|
+
tableId: Uuid$1;
|
|
3572
|
+
/**
|
|
3573
|
+
* The name the screen already holds (a list whose rows all live in one organization), shown
|
|
3574
|
+
* until the store answers — and, on a row, instead of asking at all until the chip is pressed:
|
|
3575
|
+
* forty rows are not forty reads.
|
|
3576
|
+
*/
|
|
3577
|
+
knownOrganizationName?: string | null | undefined;
|
|
3578
|
+
/** After a move lands: the host re-reads (the list, its rows, the page). */
|
|
3579
|
+
onMoved?: ((to: {
|
|
3580
|
+
id: Uuid$1;
|
|
3581
|
+
name: string;
|
|
3582
|
+
}) => void) | undefined;
|
|
3583
|
+
/** `row` is quieter, for a list; `header` for an object page. */
|
|
3584
|
+
variant?: "header" | "row" | undefined;
|
|
3585
|
+
}
|
|
3586
|
+
declare function WhereItLives({ tableId, knownOrganizationName, onMoved, variant }: WhereItLivesProps): react.JSX.Element;
|
|
3208
3587
|
|
|
3209
|
-
type Rail = "none" | "settings" | "inbox" | "import" | "field" | "record" | "new-record" | "forms" | "bookings" | "checklists" | "notifications" | "portals" | "who-changed";
|
|
3588
|
+
type Rail = "none" | "settings" | "inbox" | "import" | "field" | "record" | "new-record" | "forms" | "bookings" | "checklists" | "notifications" | "portals" | "who-changed" | "export";
|
|
3210
3589
|
interface TablePageProps {
|
|
3211
3590
|
tableId: Uuid$1;
|
|
3212
3591
|
/** Rows per page for every layout. */
|
|
@@ -3271,7 +3650,11 @@ interface TablePageProps {
|
|
|
3271
3650
|
* Half a deep link is a link that works when you arrive and lies when you
|
|
3272
3651
|
* copy it out of the address bar afterwards.
|
|
3273
3652
|
*/
|
|
3274
|
-
|
|
3653
|
+
/**
|
|
3654
|
+
* Called with the view the person moved to — one of `PAGE_VIEWS`, or the id of a
|
|
3655
|
+
* layout the HOST draws (`RecordsUiHost.layouts`), which the address carries too.
|
|
3656
|
+
*/
|
|
3657
|
+
onViewChanged?: ((view: PageView | string) => void) | undefined;
|
|
3275
3658
|
/**
|
|
3276
3659
|
* WHICH FIELD THE ADDRESS WANTS THE BOARD'S COLUMNS TO BE, for this visit.
|
|
3277
3660
|
*
|
|
@@ -3310,7 +3693,7 @@ interface TablePageProps {
|
|
|
3310
3693
|
* It is a QUESTION for this visit, exactly like `activeView` and
|
|
3311
3694
|
* `activeGroupField`, and is never written onto the saved view.
|
|
3312
3695
|
*/
|
|
3313
|
-
filter?: RecordFilter
|
|
3696
|
+
filter?: RecordFilter | null | undefined;
|
|
3314
3697
|
/**
|
|
3315
3698
|
* WHICH RAIL THE ADDRESS OPENS — `forms`, `bookings`, `checklists`,
|
|
3316
3699
|
* `notifications` (also `digests`), `portals`, `settings`, `import`, `inbox`
|
|
@@ -3533,95 +3916,6 @@ declare function WhoChangedSource({ tableId, labelOf, children, }: {
|
|
|
3533
3916
|
/** What this cell can say about who last changed it. */
|
|
3534
3917
|
declare function useWhoChanged(fieldKey: string, recordId: Uuid$1): WhoChanged;
|
|
3535
3918
|
|
|
3536
|
-
/** One Field a person asked for, in the words a person uses (FLD-1 / FLD-11). */
|
|
3537
|
-
interface NewFieldSpec {
|
|
3538
|
-
key: string;
|
|
3539
|
-
label: string;
|
|
3540
|
-
/**
|
|
3541
|
-
* The word for what this column holds. One of the thirteen parity types, one
|
|
3542
|
-
* of the five behaviours, or a plain synonym (`text`, `long_text`, `number`)
|
|
3543
|
-
* — `custom._field_document_for` resolves all three and refuses a word that
|
|
3544
|
-
* means nothing, by name, with the list.
|
|
3545
|
-
*/
|
|
3546
|
-
type: FieldTypeWord;
|
|
3547
|
-
sort?: number;
|
|
3548
|
-
required?: boolean;
|
|
3549
|
-
multi?: boolean;
|
|
3550
|
-
config?: Record<string, unknown>;
|
|
3551
|
-
/** A choice list's choices, as words. The store keeps them as a Table (FLD-5). */
|
|
3552
|
-
options?: string[];
|
|
3553
|
-
/** A column that points at another Table of this organization (FLD-11 / REL-8). */
|
|
3554
|
-
relationTarget?: Uuid$1;
|
|
3555
|
-
/** A currency column's symbol; a date column's day-or-day-and-time. */
|
|
3556
|
-
unit?: string;
|
|
3557
|
-
kind?: "date" | "datetime";
|
|
3558
|
-
}
|
|
3559
|
-
interface NewTableSpec {
|
|
3560
|
-
name: string;
|
|
3561
|
-
/** The token the Table is addressed by. Derived from the name when absent. */
|
|
3562
|
-
slug?: string;
|
|
3563
|
-
labelSingular?: string;
|
|
3564
|
-
labelPlural?: string;
|
|
3565
|
-
/** The Field whose value is the record's title (REC-2). Defaults to the first Field. */
|
|
3566
|
-
titleField?: string;
|
|
3567
|
-
fields?: NewFieldSpec[];
|
|
3568
|
-
}
|
|
3569
|
-
type DeclareResult =
|
|
3570
|
-
/**
|
|
3571
|
-
* The Table's id — and its HOME's, because REC-14 gives the Table exactly one
|
|
3572
|
-
* and the caller that made it is the only one that can tidy it up again. A
|
|
3573
|
-
* caller reading `data` alone is unaffected.
|
|
3574
|
-
*/
|
|
3575
|
-
{
|
|
3576
|
-
ok: true;
|
|
3577
|
-
data: Uuid$1;
|
|
3578
|
-
homeId: Uuid$1;
|
|
3579
|
-
} | {
|
|
3580
|
-
ok: false;
|
|
3581
|
-
error: RecordsError;
|
|
3582
|
-
};
|
|
3583
|
-
/** `My Sales Pipeline` → `my_sales_pipeline`. A token, never a sentence. */
|
|
3584
|
-
declare function tokenFor(name: string): string;
|
|
3585
|
-
/** The one Field a Table cannot be declared without: something to call a record. */
|
|
3586
|
-
/**
|
|
3587
|
-
* WHY THE FIRST FIELD IS NOT REQUIRED.
|
|
3588
|
-
*
|
|
3589
|
-
* It was, and the cost showed up the moment the grid could add a row: "New
|
|
3590
|
-
* record" writes an empty record and puts you in the first cell, and the store
|
|
3591
|
-
* correctly refused every one of them — `REC-51: Title is required` — so the
|
|
3592
|
-
* one gesture that makes a grid feel like a grid never worked on a table a
|
|
3593
|
-
* person had just made. A title is what makes a record a CHIP (REC-2), which is
|
|
3594
|
-
* a fact about how it is shown, not a promise it can never be written without;
|
|
3595
|
-
* an organization that wants it demanded says so in the field editor, and the
|
|
3596
|
-
* store then enforces it for everyone.
|
|
3597
|
-
*/
|
|
3598
|
-
declare const DEFAULT_FIELDS: NewFieldSpec[];
|
|
3599
|
-
/**
|
|
3600
|
-
* One column, in the shape `custom.field_declare` takes — and EVERYTHING a
|
|
3601
|
-
* person said about it. The keys after the type are not decoration: without
|
|
3602
|
-
* `options` the door refuses a choice list outright ("A list of choices needs
|
|
3603
|
-
* its choices"), without `unit` a money column is dollars whatever the person
|
|
3604
|
-
* picked, and without `relation_target` a column that points at another of this
|
|
3605
|
-
* organization's own tables cannot be declared at all.
|
|
3606
|
-
*/
|
|
3607
|
-
declare function fieldDeclarationFor(field: NewFieldSpec): NewFieldDeclaration;
|
|
3608
|
-
declare function declareTable(client: RecordsClient, spec: NewTableSpec): Promise<DeclareResult>;
|
|
3609
|
-
/**
|
|
3610
|
-
* Columns for an existing Table, through the door that declares one. Used by
|
|
3611
|
-
* the create path and by import.
|
|
3612
|
-
*
|
|
3613
|
-
* A column the store refused STOPS the sequence and hands back the store's own
|
|
3614
|
-
* sentence: a Table that quietly lost a column is the silent failure this
|
|
3615
|
-
* package exists to prevent.
|
|
3616
|
-
*/
|
|
3617
|
-
declare function addFields(client: RecordsClient, tableId: Uuid$1, fields: NewFieldSpec[]): Promise<{
|
|
3618
|
-
ok: true;
|
|
3619
|
-
data: Uuid$1;
|
|
3620
|
-
} | {
|
|
3621
|
-
ok: false;
|
|
3622
|
-
error: RecordsError;
|
|
3623
|
-
}>;
|
|
3624
|
-
|
|
3625
3919
|
interface ShareControlProps {
|
|
3626
3920
|
kind: ShareSubject["kind"];
|
|
3627
3921
|
organizationId: Uuid$1;
|
|
@@ -3658,12 +3952,25 @@ interface PipelineBoardProps {
|
|
|
3658
3952
|
rows: ReadRow$1[];
|
|
3659
3953
|
/** A number column to total under each heading. The person picks it; nothing is guessed. */
|
|
3660
3954
|
measure?: string | null;
|
|
3955
|
+
/**
|
|
3956
|
+
* S2-PRIME — the question the cards under this board were read with, either shape. The
|
|
3957
|
+
* headings are counted by the store with THE SAME question (`pipelineBoard({filter})`), so a
|
|
3958
|
+
* column never says 16 over the 4 cards a view put in it.
|
|
3959
|
+
*/
|
|
3960
|
+
filter?: StoreFilter | null | undefined;
|
|
3661
3961
|
onMeasureChange?: ((key: string | null) => void) | undefined;
|
|
3662
3962
|
onOpenRecord?: ((recordId: Uuid) => void) | undefined;
|
|
3663
3963
|
/** Called after a move lands, so the host re-reads the rows it owns. */
|
|
3664
3964
|
onMoved?: (() => void) | undefined;
|
|
3965
|
+
/**
|
|
3966
|
+
* THE COLORS THE REST OF THE VIEW PAINTS WITH (lane UI-QUICK-1) — `resolveTableStyle`'s answer,
|
|
3967
|
+
* the table's G1 decorations under the view's own look. `ViewSwitcher`'s board passes the one it
|
|
3968
|
+
* already resolved; left out, the board resolves the table's own decorations itself, so a host
|
|
3969
|
+
* that mounts the board alone still tints its cards exactly as the grid tints the rows.
|
|
3970
|
+
*/
|
|
3971
|
+
style?: TableStyle | undefined;
|
|
3665
3972
|
className?: string | undefined;
|
|
3666
3973
|
}
|
|
3667
|
-
declare function PipelineBoard({ tableId, rows, measure, onMeasureChange, onOpenRecord, onMoved, className, }: PipelineBoardProps): react.JSX.Element;
|
|
3974
|
+
declare function PipelineBoard({ tableId, rows, measure, filter, onMeasureChange, onOpenRecord, onMoved, style, className, }: PipelineBoardProps): react.JSX.Element;
|
|
3668
3975
|
|
|
3669
|
-
export { ABSENCE_WORD_LABEL, ABSENCE_WORD_VALUES, ACTION_KINDS, ARCHIVED_NEVER_DESTROYED, ARCHIVE_MEANS, type AbsenceWord, ActionInbox, type ActionInboxProps, type ActionKind, type AgentBuildAsk, ArchivedDisclosure, type ArchivedDisclosureProps, ArchivedPortals, type ArchivedPortalsProps, ArchivedView, type ArchivedViewProps, 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, CAPTURE_MODES, CHART_KINDS, CHART_KIND_LABEL, CHART_NEEDS, CHECKLIST_REQUIREMENT_KINDS, CHECKLIST_REQUIREMENT_LABEL, CONDITION_OPS, CONTEXT_POLICY_LABEL, type Capability, 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 ChartSpec, ChartTooltipContent, ChecklistRunner, type ChecklistRunnerProps, ChecklistTemplateEditor, ChecklistsPanel, type ChecklistsPanelProps, CommentThread, type CommentThreadProps, type ConditionField, ConditionGroup, type ConditionGroupProps, ConditionRow, type ConditionRowProps, CustomFieldsSection, type CustomFieldsSectionProps,
|
|
3976
|
+
export { ABSENCE_WORD_LABEL, ABSENCE_WORD_VALUES, ACTION_KINDS, ARCHIVED_NEVER_DESTROYED, ARCHIVE_MEANS, type AbsenceWord, ActionInbox, type ActionInboxProps, type ActionKind, type AgentBuildAsk, ArchivedDisclosure, type ArchivedDisclosureProps, ArchivedPortals, type ArchivedPortalsProps, ArchivedView, type ArchivedViewProps, 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, CAPTURE_MODES, CHART_KINDS, CHART_KIND_LABEL, CHART_NEEDS, CHECKLIST_REQUIREMENT_KINDS, CHECKLIST_REQUIREMENT_LABEL, CONDITION_OPS, CONTEXT_POLICY_LABEL, type Capability, 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 ChartSpec, ChartTooltipContent, ChecklistRunner, type ChecklistRunnerProps, ChecklistTemplateEditor, ChecklistsPanel, type ChecklistsPanelProps, CommentThread, type CommentThreadProps, type ConditionField, ConditionGroup, type ConditionGroupProps, ConditionRow, type ConditionRowProps, CustomFieldsSection, type CustomFieldsSectionProps, 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, EntityReferenceKindPicker, type EntityReferenceKindPickerProps, ExportMenu, type ExportMenuProps, FIELD_RULE_KIND_LABEL, FIELD_RULE_KIND_VALUES, FIELD_SENSITIVITY_LABEL, FIELD_TYPE_CHOICES, FIELD_TYPE_GROUPS, 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 FormAsked, FormBuilder, type FormBuilderProps, type FormFlow, type FormQuestionSpec, FormRunner, type FormRunnerProps, type FormSpec, type FormSubmitOutcome, type FormTheme, FormsPanel, type FormsPanelProps, type FormulaOp, Grid, GridCell, type GridEditing, type GridGrouping, type GridPresentation, type GridProps, HistoryPanel, type HistoryPanelProps, type HostLayout, IN_MEMORY_QUEUE_REASON, ImportWizard, type ImportWizardProps, KERNEL_REASON, LANE_EMPTY, LANE_TITLE, LAYOUT_FIELD_KIND, LAYOUT_LABEL, LAYOUT_NEEDS, LAYOUT_NO_FIELD, LEVEL_WORD, type LabelLookup, type LinkRail, MACHINE_IDENTITY, MAX_ROW_HEIGHT, MIN_ROW_HEIGHT, type MainView, MyChecklistSteps, NEEDS_A_SENTENCE, NOT_ANSWERED_YET, NOT_DRAWN_HERE, NO_AGENT_PORT, NO_CHAT_REASON, NO_COLUMNS_WHY, 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, NotifyRuleEditor, type NotifyRuleEditorProps, type NotifyRuleSpec, type OpenRecordsAsk, type OrganizationMember, PAGE_VIEWS, PAGE_VIEW_LABEL, PARITY_LABEL, PARITY_MADE_OF, PORTAL_NOT_HERE_LINE, PROPOSED_CHANGE_ACT_LABEL, PROPOSED_CHANGE_ACT_VALUES, type PageView, Peek, type PeekProps, type PendingCapture, PersonPicker, type PersonPickerProps, type PickableFieldType, 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, PublicViewPage, type PublicViewPageProps, ROLLUP_AGG_LABEL, ROLLUP_AGG_VALUES, RULE_NOT_HERE_LINE, type ReaskContext, RecordChat, type RecordChatContext, type RecordChatEntry, type RecordChatProps, type RecordChatWithheld, RecordChip, RecordForm, type RecordFormProps, RecordLabelProvider, RecordValue, RecordsMount, type RecordsMountProps, type RecordsUiHost, RecordsUiProvider, ReferenceBuilder, type ReferenceBuilderProps, type ReferenceChoice, RefusalLine, RefusalNotice, type RelationFieldType, RelationPicker, type RelationPickerProps, type ResolveName, type RollupAgg, SAVED_VIEWS_UNAVAILABLE, SAY_WHAT_YOU_ARE_WAITING_FOR_AFTER_MS, SECTIONS_UNKNOWN, SERIES_COLORS, SHARE_NOT_YOURS_LINE, SOMEBODY, STAGE_RULE_ON_FAIL_LABEL, STORE_ANSWERS_THESE, STORE_DECIDES_REASON, SUBSCRIPTION_CADENCES, SUBSCRIPTION_CADENCE_LABEL, SUBSCRIPTION_CHANNEL_LABEL, SUBSCRIPTION_CHANNEL_VALUES, type SavedDashboard, type SavedForm, type SavedView, type SavedViewSpec, ShareControl, type ShareControlProps, type ShareSubject, SignBlock, type SignBlockProps, StageRulesSection, type StageRulesSectionProps, StepRow, type SubscriptionChannel, SubscriptionsPanel, type SubscriptionsPanelProps, type Surface, type SurfacePress, type SystemFieldSpec, type SystemTableSpec, TABLE_LANES, TABLE_NOT_REACHABLE, THE_SYSTEM, type TableLane, TablePage, type TablePageProps, type TableRights, TableSettings, type TableSettingsProps, TablesHome, type TablesHomeProps, type TrackedVersion, type UseSystemTableState, VIEW_KEYS, VIEW_LAYOUTS, VIEW_NOT_SAVED_YET, VISIBILITY_LANES, VISIBILITY_LANE_TITLE, ViewBar, type ViewBarProps, type ViewKeyDeclaration, type ViewKeyLayout, type ViewKeyWriter, type ViewLayout, type ViewSettings, type ViewSettingsPatch, type ViewSort, type ViewSortKey, ViewSwitcher, type ViewSwitcherProps, type VisibilityLane, WITHHELD_RECORD_LABEL, WORK_DUE_STATES, WORK_INBOX_KINDS, WORK_INBOX_KIND_LABEL, type WhatYouMayDo, WhereItLives, type WhereItLivesProps, type WhoChanged, WhoChangedSource, actorBadge, actorWords, archivedRowLine, asRefusal, askableFields, blockFromSpec, bodyForReading, bodyFromKeys, cameFromLine, cellState, chooseSurface, colorFromTheValue, columnForField, conditionInWords, conditionIsDrawable, conditionIsSimple, conditionValue, controlFor, currencyCodeFor, dashboardDeclareArgs, dashboardFromSummary, declareView, editorKindFor, ensureSystemTable, entityReferenceSpec, envelopeFor, fieldIsEditable, fieldName, fieldToken, fieldTypeChoice, fieldTypeLabel, formDeclareArgs, formFromSummary, formPresentation, formatForField, groupLabel, hintForAPerson, hintIsMachineIdentity, humanize, idsOf, isEngineerText, isId, isMachineIdentity, isParityFieldType, isPlainFieldType, isRelationFieldType, isSignatureField, keptByTheApp, keyFor, kindsWithNoChoice, laneFor, lastChangeSentence, looksLikeId, machineIdentityIn, mayNotRestoreLine, memberName, nextInWords, nextSummaryAt, openingRail, openingView, pageViewFromParam, parityTypesWithNoExplanation, parseGridPresentation, personActor, personRecordForMember, pointsAtRecords, presentationDocument, presentationIsEmpty, previewLine, previewWords, publiclyAnswerable, railFromParam, recordName, recordNameIn, recordsDataSource, refusal, refusalForAPerson, refusalFromThrown, refusalLineForAPerson, refusalOr, renderValue, revokeConsequence, rowName, rowNameIn, saveViewPatch, scalarText, seedIsSatisfied, shareUnavailableReason, specFromBlock, storeDecidesRights, submissionStamp, surfaceChosen, tableName, tableRightsAt, unknownRailLine, unknownViewLine, useCanShare, useEmbedHandshake, useEnrichCells, useGridEditing, useLabelWait, useMeasuredWidth, useMyChecklistSteps, useRecordLabels, useRecordRights, useRecordsUi, useRowRights, useSystemTable, useTableRights, useViewRecords, useWhoChanged, viewDocument, viewFromRow, viewKeysFor, viewPatchDocument, viewSettings, viewSettingsFor, viewSettingsPatch, visibilityLaneFor, whatIsMissing, whatIsMissingForEntityReference, whatYouMayDo, whatYouMayDoWithTable, whenWords, whyNotAskable };
|