@ai-matrx/records-ui 0.84.8 → 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 +343 -23
- package/dist/index.cjs +8507 -4372
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +447 -175
- package/dist/index.d.ts +447 -175
- package/dist/index.js +8561 -4356
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
package/dist/index.d.ts
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,
|
|
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';
|
|
@@ -246,7 +247,13 @@ interface HostLayout {
|
|
|
246
247
|
/** Draw it for this table, with the question the address asked when there is one. */
|
|
247
248
|
render: (args: {
|
|
248
249
|
tableId: Uuid$1;
|
|
249
|
-
filter?:
|
|
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;
|
|
250
257
|
}) => ReactNode;
|
|
251
258
|
}
|
|
252
259
|
interface RecordsUiHost {
|
|
@@ -359,6 +366,25 @@ interface RecordsUiHost {
|
|
|
359
366
|
recordId: Uuid$1;
|
|
360
367
|
title: string;
|
|
361
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;
|
|
362
388
|
/**
|
|
363
389
|
* OPTIONAL. THE SERVER'S `records` TOOL (SCR-27).
|
|
364
390
|
*
|
|
@@ -1031,6 +1057,18 @@ type GridGrouping = {
|
|
|
1031
1057
|
order?: GroupOrder;
|
|
1032
1058
|
/** The sections this view keeps shut, by the primitive's own group key. */
|
|
1033
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;
|
|
1034
1072
|
};
|
|
1035
1073
|
/** Everything a view says about how its table LOOKS. */
|
|
1036
1074
|
type GridPresentation = {
|
|
@@ -1055,6 +1093,33 @@ type GridPresentation = {
|
|
|
1055
1093
|
widths?: Record<string, number>;
|
|
1056
1094
|
/** The body row height this view remembers, in px. */
|
|
1057
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>;
|
|
1058
1123
|
};
|
|
1059
1124
|
declare const EMPTY_PRESENTATION: GridPresentation;
|
|
1060
1125
|
/** A frozen column needs a known width, or the table declines to freeze at all. */
|
|
@@ -1122,8 +1187,11 @@ interface GridProps {
|
|
|
1122
1187
|
* own query. Never filter `rows` here: this grid only ever holds one page,
|
|
1123
1188
|
* so filtering in the browser would drop every matching record on page two
|
|
1124
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.
|
|
1125
1193
|
*/
|
|
1126
|
-
filter?:
|
|
1194
|
+
filter?: StoreFilter$1 | undefined;
|
|
1127
1195
|
/** Opened when a row is clicked. A host that has a record page passes its own. */
|
|
1128
1196
|
onOpenRecord?: ((recordId: Uuid) => void) | undefined;
|
|
1129
1197
|
/** SCR-2. Called when an admin clicks the "+" at the end of the headers. */
|
|
@@ -1200,6 +1268,36 @@ enrich?: {
|
|
|
1200
1268
|
onPin?: ((recordId: Uuid, fieldKey: string, pinned: boolean) => void | Promise<void>) | undefined;
|
|
1201
1269
|
}): MatrxColumnDef<ReadRow$1>;
|
|
1202
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
|
+
|
|
1203
1301
|
interface ExportMenuProps {
|
|
1204
1302
|
tableId: Uuid;
|
|
1205
1303
|
/** The rows on screen. Absent means "this table's first page", read the same way. */
|
|
@@ -1314,7 +1412,18 @@ type RelationFieldType = "relation";
|
|
|
1314
1412
|
* `FIELD_TYPE_CHOICES`'s coverage and as a red `kindsWithNoChoice()` below — never as a
|
|
1315
1413
|
* silence.
|
|
1316
1414
|
*/
|
|
1317
|
-
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";
|
|
1318
1427
|
interface FieldTypeChoice {
|
|
1319
1428
|
id: PickableFieldType;
|
|
1320
1429
|
/** The word on the menu. */
|
|
@@ -1412,6 +1521,8 @@ declare function whatIsMissing(state: {
|
|
|
1412
1521
|
formulaFields: string[];
|
|
1413
1522
|
/** Only a link asks for one, so a caller about any other kind leaves it out. */
|
|
1414
1523
|
relationTarget?: string;
|
|
1524
|
+
/** Only an entity-reference column asks for these (SC-R). */
|
|
1525
|
+
allowedTypes?: readonly string[];
|
|
1415
1526
|
}): string | null;
|
|
1416
1527
|
|
|
1417
1528
|
declare const NO_RULES_YET = "Nothing has to be true to get here yet.";
|
|
@@ -1499,29 +1610,37 @@ declare function ConditionRow({ lead, expr, fields, onChange, emptyLabel, classN
|
|
|
1499
1610
|
* CAN THE BUILDER DRAW THIS CONDITION? — the question every caller asks before it renders,
|
|
1500
1611
|
* and the reason a rule somebody cannot see is never silently saved over.
|
|
1501
1612
|
*
|
|
1502
|
-
* Drawable means: nothing; one clause; or
|
|
1503
|
-
*
|
|
1504
|
-
*
|
|
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.
|
|
1505
1616
|
*/
|
|
1506
1617
|
declare function conditionIsDrawable(expr: RuleExpression | Record<string, unknown> | null | undefined, depth?: number): boolean;
|
|
1507
1618
|
interface ConditionGroupProps {
|
|
1508
|
-
/** The words before the condition: "When", "Ask only when". */
|
|
1619
|
+
/** The words before the condition: "When", "Ask only when", "Show jobs where". */
|
|
1509
1620
|
lead: string;
|
|
1510
1621
|
expr: RuleExpression | Record<string, unknown> | null | undefined;
|
|
1511
1622
|
fields: ConditionField[];
|
|
1512
1623
|
onChange: (next: RuleExpression | null) => void;
|
|
1513
1624
|
/** What the empty option says: "always", "every card". */
|
|
1514
1625
|
emptyLabel?: string;
|
|
1515
|
-
/**
|
|
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
|
+
*/
|
|
1516
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;
|
|
1517
1635
|
className?: string | undefined;
|
|
1518
1636
|
}
|
|
1519
1637
|
/**
|
|
1520
1638
|
* THE ONE CONDITION BUILDER. One clause reads exactly as it always has — a single row, no
|
|
1521
|
-
* joiner, no chrome — and the joiner appears
|
|
1522
|
-
*
|
|
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.
|
|
1523
1642
|
*/
|
|
1524
|
-
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;
|
|
1525
1644
|
|
|
1526
1645
|
interface FieldProposalRow {
|
|
1527
1646
|
id: string;
|
|
@@ -1594,6 +1713,40 @@ interface RelationPickerProps {
|
|
|
1594
1713
|
}
|
|
1595
1714
|
declare function RelationPicker({ field, value, onChange, disabled, id, className, allowCreate }: RelationPickerProps): react.JSX.Element;
|
|
1596
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
|
+
|
|
1597
1750
|
interface FieldEditorControlProps {
|
|
1598
1751
|
field: Field;
|
|
1599
1752
|
value: unknown;
|
|
@@ -1615,36 +1768,6 @@ declare function RecordChip({ title, onRemove, className, }: {
|
|
|
1615
1768
|
className?: string | undefined;
|
|
1616
1769
|
}): react.JSX.Element;
|
|
1617
1770
|
|
|
1618
|
-
/** Answers "what is the record with this id called", for one Field's values. */
|
|
1619
|
-
type LabelLookup = (field: Field$1, id: string) => string | null;
|
|
1620
|
-
/**
|
|
1621
|
-
* HOW LONG A CELL MAY SAY "Loading…" BEFORE IT HAS TO SAY WHAT IT IS WAITING
|
|
1622
|
-
* FOR. One second is the span at which a person stops reading a word as "this
|
|
1623
|
-
* is about to happen" and starts reading it as "this is stuck" — the same line
|
|
1624
|
-
* Nielsen's response-time work draws and the one Linear and Stripe design to.
|
|
1625
|
-
*/
|
|
1626
|
-
declare const SAY_WHAT_YOU_ARE_WAITING_FOR_AFTER_MS = 1000;
|
|
1627
|
-
/** Which ids a Field's stored value refers to. */
|
|
1628
|
-
declare function idsOf(value: unknown): string[];
|
|
1629
|
-
declare function isId(value: unknown): boolean;
|
|
1630
|
-
/** True when this Field's values are ids of other records rather than values. */
|
|
1631
|
-
declare function pointsAtRecords(field: Field$1): boolean;
|
|
1632
|
-
declare function RecordLabelProvider({ children }: {
|
|
1633
|
-
children: ReactNode;
|
|
1634
|
-
}): react.JSX.Element;
|
|
1635
|
-
/**
|
|
1636
|
-
* The hook a surface uses: it declares the Fields it is about to draw, and gets
|
|
1637
|
-
* back the lookup. Declaring is what makes one request per Field instead of one
|
|
1638
|
-
* per cell, and it is why a grid of 200 rows asks the store twice.
|
|
1639
|
-
*/
|
|
1640
|
-
declare function useRecordLabels(fields: readonly Field$1[] | undefined): LabelLookup;
|
|
1641
|
-
/**
|
|
1642
|
-
* WHAT THIS COLUMN IS STILL WAITING FOR, or null while "Loading…" is still an
|
|
1643
|
-
* honest word. A cell draws this INSTEAD of "Loading…" once the resolver has
|
|
1644
|
-
* been looking for a second — see `SAY_WHAT_YOU_ARE_WAITING_FOR_AFTER_MS`.
|
|
1645
|
-
*/
|
|
1646
|
-
declare function useLabelWait(field: Field$1 | undefined): string | null;
|
|
1647
|
-
|
|
1648
1771
|
/** The envelope for one key, when the document carries one. */
|
|
1649
1772
|
declare function envelopeFor(document: RecordDocument | undefined, key: string): ValueEnvelope | undefined;
|
|
1650
1773
|
declare function renderValue(field: Field, value: unknown, document?: RecordDocument, labels?: LabelLookup, stillWaitingFor?: string | null): react.JSX.Element;
|
|
@@ -1870,6 +1993,14 @@ interface SavedViewSpec {
|
|
|
1870
1993
|
* reading is a fact about the records.
|
|
1871
1994
|
*/
|
|
1872
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[];
|
|
1873
2004
|
/** Calendar: the Field that places a record in the month. */
|
|
1874
2005
|
dateField?: string | null;
|
|
1875
2006
|
/** Gallery: the Field shown large on the card. */
|
|
@@ -1880,6 +2011,22 @@ interface SavedViewSpec {
|
|
|
1880
2011
|
* reference to its Rule record, never a predicate this package evaluates.
|
|
1881
2012
|
*/
|
|
1882
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;
|
|
1883
2030
|
isDefault?: boolean;
|
|
1884
2031
|
/**
|
|
1885
2032
|
* HOW THIS VIEW LOOKS — its colors, its per-column formats and its frozen
|
|
@@ -1892,19 +2039,24 @@ interface SavedViewSpec {
|
|
|
1892
2039
|
*/
|
|
1893
2040
|
presentation?: GridPresentation;
|
|
1894
2041
|
}
|
|
1895
|
-
/**
|
|
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
|
+
*/
|
|
1896
2049
|
interface SavedView extends SavedViewSpec {
|
|
1897
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;
|
|
1898
2053
|
/**
|
|
1899
|
-
*
|
|
1900
|
-
*
|
|
1901
|
-
*
|
|
1902
|
-
* 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`.
|
|
1903
2057
|
*/
|
|
1904
|
-
|
|
2058
|
+
designatedLayout?: string | null;
|
|
1905
2059
|
}
|
|
1906
|
-
/** The package-owned Table every saved view is a record of. */
|
|
1907
|
-
declare const VIEW_TABLE: SystemTableSpec;
|
|
1908
2060
|
/**
|
|
1909
2061
|
* WHICH FIELD EACH LAYOUT CAN BE DRAWN FROM, decided from the FIELD'S OWN
|
|
1910
2062
|
* DECLARATION and never from the values it happens to hold.
|
|
@@ -1968,33 +2120,106 @@ declare function pageViewFromParam(raw: string | null | undefined): PageView | n
|
|
|
1968
2120
|
declare function unknownViewLine(raw: string): string;
|
|
1969
2121
|
/** The one sentence a layout says when the table holds no Field it could use. */
|
|
1970
2122
|
declare const LAYOUT_NO_FIELD: Record<ViewLayout, string>;
|
|
1971
|
-
/**
|
|
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
|
+
*/
|
|
1972
2128
|
declare function viewDocument(spec: SavedViewSpec): Record<string, unknown>;
|
|
1973
|
-
/** One stored record back into the spec a screen and an agent both read. */
|
|
1974
|
-
declare function viewFromRecord(row: ReadRow): SavedView;
|
|
1975
2129
|
/**
|
|
1976
|
-
*
|
|
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.
|
|
1977
2141
|
*
|
|
1978
|
-
*
|
|
1979
|
-
*
|
|
1980
|
-
*
|
|
1981
|
-
*
|
|
1982
|
-
*
|
|
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).
|
|
1983
2147
|
*
|
|
1984
|
-
*
|
|
1985
|
-
*
|
|
1986
|
-
*
|
|
1987
|
-
*
|
|
1988
|
-
* 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.
|
|
1989
2153
|
*/
|
|
1990
|
-
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>>;
|
|
1991
2155
|
/**
|
|
1992
|
-
* A PARTIAL change to a saved view, as the
|
|
1993
|
-
* the caller actually changed are
|
|
1994
|
-
*
|
|
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.
|
|
1995
2159
|
*/
|
|
1996
2160
|
declare function viewPatchDocument(patch: Partial<SavedViewSpec>): Record<string, unknown>;
|
|
1997
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
|
+
|
|
1998
2223
|
interface ViewSwitcherProps {
|
|
1999
2224
|
/**
|
|
2000
2225
|
* THE DECLARATIVE SPEC — an agent writes the whole thing, a person tweaks it.
|
|
@@ -2029,8 +2254,11 @@ interface ViewSwitcherProps {
|
|
|
2029
2254
|
* object the chart counted with. It narrows the grid AND the board through
|
|
2030
2255
|
* the store, so switching layout after a drill-through keeps the same rows
|
|
2031
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.
|
|
2032
2260
|
*/
|
|
2033
|
-
filter?:
|
|
2261
|
+
filter?: StoreFilter | undefined;
|
|
2034
2262
|
/**
|
|
2035
2263
|
* The HOST layout showing now (`RecordsUiHost.layouts`, by id), or null for the
|
|
2036
2264
|
* package's own. Controlled by the page, because the address names it.
|
|
@@ -2038,10 +2266,18 @@ interface ViewSwitcherProps {
|
|
|
2038
2266
|
hostLayout?: string | null | undefined;
|
|
2039
2267
|
/** The person picked a host layout (its id), or went back to one of the four (null). */
|
|
2040
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.
|
|
2273
|
+
*/
|
|
2274
|
+
chooser?: boolean | undefined;
|
|
2275
|
+
/** Handed to a host layout's `render` — the page's own export. */
|
|
2276
|
+
openExport?: (() => void) | undefined;
|
|
2041
2277
|
className?: string | undefined;
|
|
2042
2278
|
}
|
|
2043
2279
|
/** The records this view holds: its Rule's members when it names one, the table otherwise. */
|
|
2044
|
-
declare function useViewRecords(view: SavedViewSpec, pageSize?: number, filter?:
|
|
2280
|
+
declare function useViewRecords(view: SavedViewSpec, pageSize?: number, filter?: StoreFilter): {
|
|
2045
2281
|
rows: ReadRow$1[];
|
|
2046
2282
|
loading: boolean;
|
|
2047
2283
|
error: RecordsError | null;
|
|
@@ -2059,7 +2295,7 @@ declare function useViewRecords(view: SavedViewSpec, pageSize?: number, filter?:
|
|
|
2059
2295
|
*/
|
|
2060
2296
|
membership: string;
|
|
2061
2297
|
};
|
|
2062
|
-
declare function ViewSwitcher({ view, onLayoutChange, onViewChange, onOpenRecord, onMoved, onNewRecordForm, onAskWhoChanged, pageSize, filter, hostLayout, onHostLayoutChange, 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;
|
|
2063
2299
|
|
|
2064
2300
|
/** What the screen says above the list, so nobody has to be told twice that nothing was destroyed. */
|
|
2065
2301
|
declare const ARCHIVE_MEANS = "Archiving never destroys anything. A record you remove from the grid waits here until somebody brings it back.";
|
|
@@ -2142,15 +2378,28 @@ interface ViewBarProps {
|
|
|
2142
2378
|
* The person tweaks them afterwards like any other view.
|
|
2143
2379
|
*/
|
|
2144
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;
|
|
2145
2389
|
className?: string | undefined;
|
|
2146
2390
|
}
|
|
2147
2391
|
/**
|
|
2148
|
-
* What the bar says when
|
|
2149
|
-
*
|
|
2150
|
-
*
|
|
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.
|
|
2151
2395
|
*/
|
|
2152
2396
|
declare const SAVED_VIEWS_UNAVAILABLE: string;
|
|
2153
|
-
|
|
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;
|
|
2154
2403
|
|
|
2155
2404
|
/** One proposed change, in the proposer's words plus the exact act it asks for. */
|
|
2156
2405
|
interface ProposedChange {
|
|
@@ -2285,6 +2534,13 @@ interface FormTheme {
|
|
|
2285
2534
|
accent?: string | null;
|
|
2286
2535
|
align?: "left" | "center" | null;
|
|
2287
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
|
+
}
|
|
2288
2544
|
/** THE COMPLETE DECLARATIVE SPEC. One `record_write` and the form exists. */
|
|
2289
2545
|
interface FormSpec {
|
|
2290
2546
|
name: string;
|
|
@@ -2294,10 +2550,15 @@ interface FormSpec {
|
|
|
2294
2550
|
questions: FormQuestionSpec[];
|
|
2295
2551
|
flow?: FormFlow | null;
|
|
2296
2552
|
theme?: FormTheme | null;
|
|
2297
|
-
|
|
2298
|
-
|
|
2299
|
-
|
|
2300
|
-
|
|
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;
|
|
2301
2562
|
submitLabel?: string | null;
|
|
2302
2563
|
/**
|
|
2303
2564
|
* Is this form meant to be answerable by someone who is not signed in? The
|
|
@@ -2453,6 +2714,8 @@ interface PortalCardViewProps {
|
|
|
2453
2714
|
onPreview: (person: PortalPrincipal, tableId: Uuid) => Promise<PortalAnswer<PortalPreviewRow[]>>;
|
|
2454
2715
|
/** The invite control, which needs a client of its own. Absent means none is offered. */
|
|
2455
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;
|
|
2456
2719
|
/**
|
|
2457
2720
|
* Where this app is served from, so a person's own invitation link can be copied whole.
|
|
2458
2721
|
* Omit it and the view falls back to the browser's origin, which keeps this component
|
|
@@ -2461,7 +2724,16 @@ interface PortalCardViewProps {
|
|
|
2461
2724
|
origin?: string | undefined;
|
|
2462
2725
|
className?: string | undefined;
|
|
2463
2726
|
}
|
|
2464
|
-
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;
|
|
2465
2737
|
|
|
2466
2738
|
interface DigestSchedulerProps {
|
|
2467
2739
|
/** The Table the digest is about. A saved view is a view OF something. */
|
|
@@ -2622,6 +2894,10 @@ interface ChartSpec {
|
|
|
2622
2894
|
stateKey?: string;
|
|
2623
2895
|
/** `stuck` only: how long a record may sit on the same value. */
|
|
2624
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;
|
|
2625
2901
|
}
|
|
2626
2902
|
/** A dashboard as `custom.dashboards` reports it, in the screen's own words. */
|
|
2627
2903
|
interface SavedDashboard {
|
|
@@ -2794,9 +3070,17 @@ interface NotifyRuleEditorProps {
|
|
|
2794
3070
|
tableId: Uuid;
|
|
2795
3071
|
/** COMPLETE declarative subscriptions an agent wrote. Saved once, never overwritten. */
|
|
2796
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;
|
|
2797
3081
|
className?: string | undefined;
|
|
2798
3082
|
}
|
|
2799
|
-
declare function NotifyRuleEditor({ tableId, seed, className }: NotifyRuleEditorProps): react.JSX.Element;
|
|
3083
|
+
declare function NotifyRuleEditor({ tableId, seed, chosenRuleId, onChoose, className }: NotifyRuleEditorProps): react.JSX.Element;
|
|
2800
3084
|
|
|
2801
3085
|
interface ChartBlockProps {
|
|
2802
3086
|
/** One block out of the canvas's single run — answered, or refused. */
|
|
@@ -2832,6 +3116,24 @@ interface FormsPanelProps {
|
|
|
2832
3116
|
declare const FORM_NOT_HERE_LINE: string;
|
|
2833
3117
|
declare function FormsPanel({ tableId, activeFormId, className }: FormsPanelProps): react.JSX.Element;
|
|
2834
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
|
+
};
|
|
2835
3137
|
/** What the public arm's `onSubmit` answers. A refusal carries the door's words. */
|
|
2836
3138
|
type FormSubmitOutcome = {
|
|
2837
3139
|
ok: true;
|
|
@@ -2858,11 +3160,31 @@ interface FormRunnerProps {
|
|
|
2858
3160
|
fields?: readonly Field[] | undefined;
|
|
2859
3161
|
/** PUBLIC ARM — where an answer goes. Server action or route handler. */
|
|
2860
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;
|
|
2861
3169
|
/**
|
|
2862
3170
|
* PUBLIC ARM — the name of a decoy input. A person never fills it; a script
|
|
2863
3171
|
* fills everything. The door decides what a filled one means, not this screen.
|
|
2864
3172
|
*/
|
|
2865
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;
|
|
2866
3188
|
/** Preview mode answers the questions but writes nothing, and says so. */
|
|
2867
3189
|
preview?: boolean | undefined;
|
|
2868
3190
|
onSubmitted?: ((recordId: Uuid | null) => void) | undefined;
|
|
@@ -3233,11 +3555,37 @@ interface TablesHomeProps {
|
|
|
3233
3555
|
* did before, rather than on a screen it does not know how to address.
|
|
3234
3556
|
*/
|
|
3235
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;
|
|
3236
3566
|
className?: string | undefined;
|
|
3237
3567
|
}
|
|
3238
|
-
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;
|
|
3239
3587
|
|
|
3240
|
-
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";
|
|
3241
3589
|
interface TablePageProps {
|
|
3242
3590
|
tableId: Uuid$1;
|
|
3243
3591
|
/** Rows per page for every layout. */
|
|
@@ -3568,95 +3916,6 @@ declare function WhoChangedSource({ tableId, labelOf, children, }: {
|
|
|
3568
3916
|
/** What this cell can say about who last changed it. */
|
|
3569
3917
|
declare function useWhoChanged(fieldKey: string, recordId: Uuid$1): WhoChanged;
|
|
3570
3918
|
|
|
3571
|
-
/** One Field a person asked for, in the words a person uses (FLD-1 / FLD-11). */
|
|
3572
|
-
interface NewFieldSpec {
|
|
3573
|
-
key: string;
|
|
3574
|
-
label: string;
|
|
3575
|
-
/**
|
|
3576
|
-
* The word for what this column holds. One of the thirteen parity types, one
|
|
3577
|
-
* of the five behaviours, or a plain synonym (`text`, `long_text`, `number`)
|
|
3578
|
-
* — `custom._field_document_for` resolves all three and refuses a word that
|
|
3579
|
-
* means nothing, by name, with the list.
|
|
3580
|
-
*/
|
|
3581
|
-
type: FieldTypeWord;
|
|
3582
|
-
sort?: number;
|
|
3583
|
-
required?: boolean;
|
|
3584
|
-
multi?: boolean;
|
|
3585
|
-
config?: Record<string, unknown>;
|
|
3586
|
-
/** A choice list's choices, as words. The store keeps them as a Table (FLD-5). */
|
|
3587
|
-
options?: string[];
|
|
3588
|
-
/** A column that points at another Table of this organization (FLD-11 / REL-8). */
|
|
3589
|
-
relationTarget?: Uuid$1;
|
|
3590
|
-
/** A currency column's symbol; a date column's day-or-day-and-time. */
|
|
3591
|
-
unit?: string;
|
|
3592
|
-
kind?: "date" | "datetime";
|
|
3593
|
-
}
|
|
3594
|
-
interface NewTableSpec {
|
|
3595
|
-
name: string;
|
|
3596
|
-
/** The token the Table is addressed by. Derived from the name when absent. */
|
|
3597
|
-
slug?: string;
|
|
3598
|
-
labelSingular?: string;
|
|
3599
|
-
labelPlural?: string;
|
|
3600
|
-
/** The Field whose value is the record's title (REC-2). Defaults to the first Field. */
|
|
3601
|
-
titleField?: string;
|
|
3602
|
-
fields?: NewFieldSpec[];
|
|
3603
|
-
}
|
|
3604
|
-
type DeclareResult =
|
|
3605
|
-
/**
|
|
3606
|
-
* The Table's id — and its HOME's, because REC-14 gives the Table exactly one
|
|
3607
|
-
* and the caller that made it is the only one that can tidy it up again. A
|
|
3608
|
-
* caller reading `data` alone is unaffected.
|
|
3609
|
-
*/
|
|
3610
|
-
{
|
|
3611
|
-
ok: true;
|
|
3612
|
-
data: Uuid$1;
|
|
3613
|
-
homeId: Uuid$1;
|
|
3614
|
-
} | {
|
|
3615
|
-
ok: false;
|
|
3616
|
-
error: RecordsError;
|
|
3617
|
-
};
|
|
3618
|
-
/** `My Sales Pipeline` → `my_sales_pipeline`. A token, never a sentence. */
|
|
3619
|
-
declare function tokenFor(name: string): string;
|
|
3620
|
-
/** The one Field a Table cannot be declared without: something to call a record. */
|
|
3621
|
-
/**
|
|
3622
|
-
* WHY THE FIRST FIELD IS NOT REQUIRED.
|
|
3623
|
-
*
|
|
3624
|
-
* It was, and the cost showed up the moment the grid could add a row: "New
|
|
3625
|
-
* record" writes an empty record and puts you in the first cell, and the store
|
|
3626
|
-
* correctly refused every one of them — `REC-51: Title is required` — so the
|
|
3627
|
-
* one gesture that makes a grid feel like a grid never worked on a table a
|
|
3628
|
-
* person had just made. A title is what makes a record a CHIP (REC-2), which is
|
|
3629
|
-
* a fact about how it is shown, not a promise it can never be written without;
|
|
3630
|
-
* an organization that wants it demanded says so in the field editor, and the
|
|
3631
|
-
* store then enforces it for everyone.
|
|
3632
|
-
*/
|
|
3633
|
-
declare const DEFAULT_FIELDS: NewFieldSpec[];
|
|
3634
|
-
/**
|
|
3635
|
-
* One column, in the shape `custom.field_declare` takes — and EVERYTHING a
|
|
3636
|
-
* person said about it. The keys after the type are not decoration: without
|
|
3637
|
-
* `options` the door refuses a choice list outright ("A list of choices needs
|
|
3638
|
-
* its choices"), without `unit` a money column is dollars whatever the person
|
|
3639
|
-
* picked, and without `relation_target` a column that points at another of this
|
|
3640
|
-
* organization's own tables cannot be declared at all.
|
|
3641
|
-
*/
|
|
3642
|
-
declare function fieldDeclarationFor(field: NewFieldSpec): NewFieldDeclaration;
|
|
3643
|
-
declare function declareTable(client: RecordsClient, spec: NewTableSpec): Promise<DeclareResult>;
|
|
3644
|
-
/**
|
|
3645
|
-
* Columns for an existing Table, through the door that declares one. Used by
|
|
3646
|
-
* the create path and by import.
|
|
3647
|
-
*
|
|
3648
|
-
* A column the store refused STOPS the sequence and hands back the store's own
|
|
3649
|
-
* sentence: a Table that quietly lost a column is the silent failure this
|
|
3650
|
-
* package exists to prevent.
|
|
3651
|
-
*/
|
|
3652
|
-
declare function addFields(client: RecordsClient, tableId: Uuid$1, fields: NewFieldSpec[]): Promise<{
|
|
3653
|
-
ok: true;
|
|
3654
|
-
data: Uuid$1;
|
|
3655
|
-
} | {
|
|
3656
|
-
ok: false;
|
|
3657
|
-
error: RecordsError;
|
|
3658
|
-
}>;
|
|
3659
|
-
|
|
3660
3919
|
interface ShareControlProps {
|
|
3661
3920
|
kind: ShareSubject["kind"];
|
|
3662
3921
|
organizationId: Uuid$1;
|
|
@@ -3693,12 +3952,25 @@ interface PipelineBoardProps {
|
|
|
3693
3952
|
rows: ReadRow$1[];
|
|
3694
3953
|
/** A number column to total under each heading. The person picks it; nothing is guessed. */
|
|
3695
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;
|
|
3696
3961
|
onMeasureChange?: ((key: string | null) => void) | undefined;
|
|
3697
3962
|
onOpenRecord?: ((recordId: Uuid) => void) | undefined;
|
|
3698
3963
|
/** Called after a move lands, so the host re-reads the rows it owns. */
|
|
3699
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;
|
|
3700
3972
|
className?: string | undefined;
|
|
3701
3973
|
}
|
|
3702
|
-
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;
|
|
3703
3975
|
|
|
3704
|
-
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 };
|