@ai-matrx/records-ui 0.85.18 → 0.88.0
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 +135 -3
- package/dist/index.cjs +9646 -8156
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +374 -239
- package/dist/index.d.ts +374 -239
- package/dist/index.js +9623 -8109
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.d.cts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
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, StoreFilter, AggregateFilter,
|
|
5
|
-
import { Uuid,
|
|
4
|
+
import { PermissionLevel, Table, RecordScopeContext, EnrichCell, RecordsError, Field, TableDecorations, Uuid as Uuid$1, StoreFilter, AggregateFilter, RecordDocument, ReadRow, RelationDisplay, WriteConflict, RecordsErrorCode, RecordFilter, RuleExpression, RecordsResult, SavedViewRow, DeclarableFieldKind, ParityFieldType, NewFieldDeclaration, HiddenFieldNotice, ValueEnvelope, ChecklistRequirementKind, ContextPolicy, WorkDueState, FieldSensitivity, StageRuleOnFail, SubscriptionCadence, WorkApprovalState, WorkInboxKind, FieldKind, ArchiveLane, ArchivedRow, WorkInboxView, WorkInboxItem, 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, Field as Field$1, ReadRow as ReadRow$1, StoreFilter as StoreFilter$1 } from '@ai-matrx/records/react';
|
|
6
|
+
import { TableStyle, GroupAggregateSpec, GroupOrder, ChoiceColorLookup } from '@ai-matrx/design-system/data-table';
|
|
7
|
+
import { FieldFormatConfig } from '@ai-matrx/design-system/field-formats';
|
|
6
8
|
import { RecordsClient } from '@ai-matrx/records/core';
|
|
7
9
|
export { DEFAULT_FIELDS, DeclareResult, NewFieldSpec, NewTableSpec, addFields, declareTable, fieldDeclarationFor, tokenFor } from '@ai-matrx/records/core';
|
|
8
|
-
import { FieldFormatConfig } from '@ai-matrx/design-system/field-formats';
|
|
9
10
|
import { MatrxColumnDef } from '@ai-matrx/design-system/data-table/types';
|
|
10
|
-
import { TableStyle, GroupAggregateSpec, GroupOrder, ChoiceColorLookup } from '@ai-matrx/design-system/data-table';
|
|
11
11
|
|
|
12
12
|
/** The six things a person does to a record or a table, as the screens offer them. */
|
|
13
13
|
type Capability = "read" | "comment" | "write" | "remove" | "share" | "structure";
|
|
@@ -197,6 +197,222 @@ interface EnrichPanelProps {
|
|
|
197
197
|
*/
|
|
198
198
|
declare function EnrichPanel({ tableId, fieldId, className }: EnrichPanelProps): react.JSX.Element;
|
|
199
199
|
|
|
200
|
+
/**
|
|
201
|
+
* HOW A TABLE LOOKS — colors, formats and the frozen column.
|
|
202
|
+
*
|
|
203
|
+
* THE SPLIT, AND WHY IT IS THIS ONE. A Field declares WHAT it holds: a
|
|
204
|
+
* currency, a percent, a date, a person. A VIEW declares HOW that reads and
|
|
205
|
+
* what it is worth looking at: two decimal places or none, tint the row when
|
|
206
|
+
* Status is Blocked, keep Name in place while the rest scrolls. Airtable draws
|
|
207
|
+
* the line in exactly this place, and it has to be here: two people read one
|
|
208
|
+
* table two different ways, and neither reading is a fact about the records.
|
|
209
|
+
*
|
|
210
|
+
* So nothing in this module is a new column on a Field and nothing here needed
|
|
211
|
+
* a migration. A presentation lives on the saved-view record (`views.ts`), which
|
|
212
|
+
* is an ordinary record of an ordinary Table — which means an agent sets it
|
|
213
|
+
* through the same `records` tool it uses for everything else, and it travels
|
|
214
|
+
* with the table the way every other record does.
|
|
215
|
+
*
|
|
216
|
+
* A FIELD STILL GETS ITS MONEY RIGHT WITH NO CONFIGURATION. `formatForField`
|
|
217
|
+
* reads the Field's OWN declaration — a `currency` parity type with unit `$`, a
|
|
218
|
+
* `percent`, a `datetime` with `config.kind` — and returns the format that
|
|
219
|
+
* follows from it. The view's `formats` map only OVERRIDES that. A table nobody
|
|
220
|
+
* has ever styled still shows `$1,250.50` and `45%`.
|
|
221
|
+
*/
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* SECTIONS BY A FIELD — the view's own grouping.
|
|
225
|
+
*
|
|
226
|
+
* `field` is a Field KEY, exactly like `frozen` and the keys of `formats`,
|
|
227
|
+
* because a view is written against the Table's declaration and never against
|
|
228
|
+
* whatever id a screen happened to build its columns with.
|
|
229
|
+
*
|
|
230
|
+
* `aggregates` is keyed by Field key too, and `collapsed` holds the data
|
|
231
|
+
* table's own group keys (`s:Blocked`, `n:3`, `empty`), which is what the
|
|
232
|
+
* primitive emits and the only thing that survives a value rendering the same
|
|
233
|
+
* text as another.
|
|
234
|
+
*
|
|
235
|
+
* NOTHING HERE IS EVER CALLED `valueOf`, `toString` or `hasOwnProperty`: every
|
|
236
|
+
* object in JavaScript already has all three, so an optional field by one of
|
|
237
|
+
* those names is NEVER absent and a `config.valueOf ? … : …` check silently
|
|
238
|
+
* reads `Object.prototype`. It cost the primitive a whole grouping once.
|
|
239
|
+
*/
|
|
240
|
+
type GridGrouping = {
|
|
241
|
+
/** The Field key whose value makes the sections. */
|
|
242
|
+
field: string;
|
|
243
|
+
/** Per-Field-key subtotal on every section header. */
|
|
244
|
+
aggregates?: Record<string, GroupAggregateSpec>;
|
|
245
|
+
/** Section order. The primitive's default is `value-asc`; blanks sort last. */
|
|
246
|
+
order?: GroupOrder;
|
|
247
|
+
/** The sections this view keeps shut, by the primitive's own group key. */
|
|
248
|
+
collapsed?: string[];
|
|
249
|
+
/**
|
|
250
|
+
* SUB-GROUPS (lane S1-PRIME VIEW-KEYS; ui-bench LISTS "sub-grouping"): up to two more levels
|
|
251
|
+
* inside each section, by Field key. At most three levels in all — the store refuses a fourth
|
|
252
|
+
* (`custom.view_declare`). A layout that draws one level ignores the rest; it never drops them,
|
|
253
|
+
* because this list is parsed and written back whole with the rest of the look.
|
|
254
|
+
*/
|
|
255
|
+
then?: GridSubGroup[];
|
|
256
|
+
};
|
|
257
|
+
/** One sub-group level: a Field key and its section order. */
|
|
258
|
+
type GridSubGroup = {
|
|
259
|
+
field: string;
|
|
260
|
+
order?: GroupOrder;
|
|
261
|
+
};
|
|
262
|
+
/** Everything a view says about how its table LOOKS. */
|
|
263
|
+
type GridPresentation = {
|
|
264
|
+
/** Color-by-a-column, rules and manual highlights. */
|
|
265
|
+
style?: TableStyle;
|
|
266
|
+
/** Per-column format overrides, by the Field's key. */
|
|
267
|
+
formats?: Record<string, FieldFormatConfig>;
|
|
268
|
+
/**
|
|
269
|
+
* The columns that stay in place while the table scrolls sideways, by Field
|
|
270
|
+
* key. Only the LEADING run of the view's column order can actually freeze —
|
|
271
|
+
* the data table decides that, and declines rather than pinning a column at a
|
|
272
|
+
* guessed offset.
|
|
273
|
+
*/
|
|
274
|
+
frozen?: string[];
|
|
275
|
+
/** Collapsible sections by one Field, with subtotals on each header. */
|
|
276
|
+
grouping?: GridGrouping;
|
|
277
|
+
/**
|
|
278
|
+
* The width a person dragged a column to, by Field key. SPARSE on purpose —
|
|
279
|
+
* a view saved before widths existed carries none and still parses, and a
|
|
280
|
+
* column nobody resized is left to the table's own measurement.
|
|
281
|
+
*/
|
|
282
|
+
widths?: Record<string, number>;
|
|
283
|
+
/** The body row height this view remembers, in px. */
|
|
284
|
+
rowHeight?: number;
|
|
285
|
+
/**
|
|
286
|
+
* Field keys hidden from this view — the SAME hidden-column list the grid's
|
|
287
|
+
* own column picker holds, now given a place on the view so it survives a
|
|
288
|
+
* reload and a layout switch reads the identical set gallery and grid agree
|
|
289
|
+
* on, rather than a second "fields shown" list nobody kept in sync.
|
|
290
|
+
*/
|
|
291
|
+
hiddenFields?: string[];
|
|
292
|
+
/**
|
|
293
|
+
* THE ORDER A PERSON DRAGGED THE COLUMNS INTO, by Field key (merge tranche 6a). Sparse like
|
|
294
|
+
* `widths`: a key it does not name keeps its Field's own place after the named ones, and a key
|
|
295
|
+
* whose Field is gone is skipped — a column order can never hide or invent a column.
|
|
296
|
+
*/
|
|
297
|
+
columnOrder?: string[];
|
|
298
|
+
/**
|
|
299
|
+
* The gallery's card size, remembered the same way the grid remembers its
|
|
300
|
+
* row height — a per-view look, not a global default.
|
|
301
|
+
*/
|
|
302
|
+
gallerySize?: "small" | "medium" | "large";
|
|
303
|
+
/**
|
|
304
|
+
* THIS VIEW'S OWN LAYOUT CHOICES, over the organization's `custom/grid_layout` knob (lane
|
|
305
|
+
* DEFAULT-GRID-PARITY, TABLE-PARITY D1 D5 D6). Absent means "whatever the organization
|
|
306
|
+
* says"; present is the view's word. `freezeFirst: false` is an explicit NO over an
|
|
307
|
+
* organization that freezes the first column — an empty `frozen` cannot say that.
|
|
308
|
+
*/
|
|
309
|
+
wrap?: boolean;
|
|
310
|
+
fit?: "auto" | "fit" | "scroll";
|
|
311
|
+
freezeFirst?: boolean;
|
|
312
|
+
/**
|
|
313
|
+
* THE SUMMARY BAR (TABLE-PARITY F1): Field key → the store measure shown under that column
|
|
314
|
+
* (`count`, `sum`, `avg`, `min`, `max`, `median`, `filled`, `empty`, `unique`), worked out
|
|
315
|
+
* by `custom.record_aggregate` over the whole table.
|
|
316
|
+
*/
|
|
317
|
+
summaries?: Record<string, string>;
|
|
318
|
+
/**
|
|
319
|
+
* WHERE THE FOOTER SITS (lane TABLE-PAGE-CHROME, owner 2026-09-25) — the row count and the
|
|
320
|
+
* pages: `sticky`, pinned to the bottom of the screen while the rows scroll (the older grid's
|
|
321
|
+
* way, and the default when a view says nothing), or `inline`, right after the last row with
|
|
322
|
+
* the page scrolling. Read by the Grid and a host's Sheet.
|
|
323
|
+
*/
|
|
324
|
+
footer?: FooterPlacement;
|
|
325
|
+
};
|
|
326
|
+
/** Where a grid's footer sits. */
|
|
327
|
+
type FooterPlacement = "sticky" | "inline";
|
|
328
|
+
/** What a view that says nothing gets — the older grid's pinned footer. */
|
|
329
|
+
declare const DEFAULT_FOOTER: FooterPlacement;
|
|
330
|
+
/** Where THIS view's footer sits, said or defaulted. */
|
|
331
|
+
declare function footerOf(p: GridPresentation | null | undefined): FooterPlacement;
|
|
332
|
+
declare const EMPTY_PRESENTATION: GridPresentation;
|
|
333
|
+
/** A frozen column needs a known width, or the table declines to freeze at all. */
|
|
334
|
+
declare const FROZEN_COLUMN_WIDTH = 200;
|
|
335
|
+
/**
|
|
336
|
+
* WHAT A ROW HEIGHT IS ALLOWED TO BE. Below the floor the text is clipped and
|
|
337
|
+
* no editor fits; above the ceiling one record fills the screen. A view asking
|
|
338
|
+
* for anything outside it is DROPPED rather than obeyed, because a saved look
|
|
339
|
+
* must not be able to make a table unreadable — and the Fields' own heights
|
|
340
|
+
* still draw, which is the tolerant half.
|
|
341
|
+
*/
|
|
342
|
+
declare const MIN_ROW_HEIGHT = 24;
|
|
343
|
+
declare const MAX_ROW_HEIGHT = 96;
|
|
344
|
+
/**
|
|
345
|
+
* Read a presentation out of whatever the view record holds — an object, or the
|
|
346
|
+
* JSON string a text field stores.
|
|
347
|
+
*
|
|
348
|
+
* Tolerant in exactly the way `parseTableStyle` is: an unreadable half is
|
|
349
|
+
* dropped and the rest still applies, because a table must keep drawing when
|
|
350
|
+
* one piece of its styling goes out of date.
|
|
351
|
+
*/
|
|
352
|
+
declare function parseGridPresentation(raw: unknown): GridPresentation;
|
|
353
|
+
/** True when nothing here would change how anything looks. */
|
|
354
|
+
declare function presentationIsEmpty(p: GridPresentation): boolean;
|
|
355
|
+
/** The string a view record stores. Empty string for "this view styles nothing". */
|
|
356
|
+
declare function presentationDocument(p: GridPresentation): string;
|
|
357
|
+
/**
|
|
358
|
+
* The format a Field's OWN declaration implies, before any view says anything.
|
|
359
|
+
*
|
|
360
|
+
* Returns `undefined` for a Field whose value the record renderer already draws
|
|
361
|
+
* better than a formatter could — a relation chip, a person, an attachment, a
|
|
362
|
+
* choice — because handing those to a text formatter would REPLACE a working
|
|
363
|
+
* control with a string.
|
|
364
|
+
*/
|
|
365
|
+
declare function formatForField(field: Field): FieldFormatConfig | undefined;
|
|
366
|
+
declare function currencyCodeFor(unit: string | null | undefined): string;
|
|
367
|
+
/**
|
|
368
|
+
* The color a value paints with when a view colors BY a column.
|
|
369
|
+
*
|
|
370
|
+
* NOTHING FAILS SILENTLY, so this never returns "no color" for a value that
|
|
371
|
+
* exists. The store keeps a list column's choices as records of another Table,
|
|
372
|
+
* and this grid has not read that Table's option colors, so the color is
|
|
373
|
+
* derived from the value's own text: the same word always gets the same color,
|
|
374
|
+
* different words get different ones, and `true` is green the way every
|
|
375
|
+
* checklist reads. When those option colors do land, this is the ONE function
|
|
376
|
+
* that changes and every screen follows.
|
|
377
|
+
*/
|
|
378
|
+
declare const colorFromTheValue: ChoiceColorLookup;
|
|
379
|
+
/**
|
|
380
|
+
* G1's TABLE-LEVEL COLORS (`custom.table_decorations` / `client.tableDecorations`),
|
|
381
|
+
* TRANSLATED INTO A `TableStyle` — the same document a saved view's own `presentation.style`
|
|
382
|
+
* is, so one resolver (`resolveTableStyle`, below) can treat "the table's colors" and "this
|
|
383
|
+
* view's colors" as two layers of the SAME thing instead of two unrelated systems.
|
|
384
|
+
*
|
|
385
|
+
* THE TRANSLATION IS NECESSARY AND IT IS THE ONLY ONE. G1 addresses a Field by its ID
|
|
386
|
+
* (REC-17 — a column renamed keeps its color), because it is the STORE's own door; a
|
|
387
|
+
* `TableStyle` addresses a Field by its KEY, because it reads straight off `row.document`,
|
|
388
|
+
* which is keyed by Field key. A rule or a color-by whose Field has been deleted (its id no
|
|
389
|
+
* longer resolves to a key) is dropped rather than crashing the whole style — a defect in
|
|
390
|
+
* one rule costs that rule, never the read.
|
|
391
|
+
*/
|
|
392
|
+
declare function styleFromDecorations(decorations: TableDecorations | null | undefined, fields: readonly Field[]): TableStyle;
|
|
393
|
+
/**
|
|
394
|
+
* THE ONE PRESENTATION RESOLVER every colored surface in this package reads —
|
|
395
|
+
* `Grid`, and (via `Card`) the kanban board, the calendar and the gallery.
|
|
396
|
+
*
|
|
397
|
+
* THE CLASS THIS CLOSES (lane UI-QUICK-1, TABLE-PARITY review, 2026-09-24). Threading
|
|
398
|
+
* `view.presentation.style` into `Card` closed the instance the CALENDAR-GALLERY bench
|
|
399
|
+
* found — a VIEW that had its own color-by looked right everywhere — but it left the
|
|
400
|
+
* class open: a table whose colors are the ORGANIZATION's decorations (G1's
|
|
401
|
+
* `custom.table_decorations` — "color rows by Account Type", "MAXED and NEAR rules" on
|
|
402
|
+
* Arman's own Coding Accounts table) and whose views never set a `presentation.style` of
|
|
403
|
+
* their own drew NOTHING, on the grid exactly as much as on every other layout, because
|
|
404
|
+
* nothing in this package had ever read G1's door at all.
|
|
405
|
+
*
|
|
406
|
+
* TWO LAYERS, ONE DOCUMENT. The table's decorations are the base coat — what every view
|
|
407
|
+
* of this table shows until a view says otherwise. A view's OWN `presentation.style` is
|
|
408
|
+
* an override, piece by piece: a view that only ever set manual row highlights still
|
|
409
|
+
* inherits the table's color-by and rules for everything it never touched, and a view
|
|
410
|
+
* that fully redecorated (its own `colorBy` AND its own `rules`) is not haunted by a
|
|
411
|
+
* table rule it meant to replace. Per-piece, never all-or-nothing, because a view is a
|
|
412
|
+
* LOOK on top of the table, not a wholesale substitute for it.
|
|
413
|
+
*/
|
|
414
|
+
declare function resolveTableStyle(decorations: TableDecorations | null | undefined, fields: readonly Field[], viewStyle: TableStyle | undefined): TableStyle;
|
|
415
|
+
|
|
200
416
|
/**
|
|
201
417
|
* What a person may do to one table. The four words and the ladder are the
|
|
202
418
|
* store's (`rights.ts`), not ours.
|
|
@@ -254,11 +470,30 @@ interface HostLayout {
|
|
|
254
470
|
* Absent on a page that draws no export.
|
|
255
471
|
*/
|
|
256
472
|
openExport?: (() => void) | undefined;
|
|
473
|
+
/**
|
|
474
|
+
* Where the view's footer sits (lane TABLE-PAGE-CHROME): `sticky` — fill the height given and
|
|
475
|
+
* keep the counts and pages on the bottom edge; `inline` — after the last row.
|
|
476
|
+
*/
|
|
477
|
+
footer?: FooterPlacement | undefined;
|
|
478
|
+
/**
|
|
479
|
+
* THE PAGE'S ONE TOOLBAR ROW (lane TABLE-PAGE-CHROME). A host layout with controls of its own
|
|
480
|
+
* (search, columns, sort) draws them INTO this element — never a second bar under the page's.
|
|
481
|
+
* `null`: the row is mounting (draw nothing yet). Absent: no page row, draw in place.
|
|
482
|
+
*/
|
|
483
|
+
toolbarSlot?: HTMLElement | null | undefined;
|
|
257
484
|
}) => ReactNode;
|
|
258
485
|
}
|
|
259
486
|
/** The authored-text slots `renderText` is asked to draw. */
|
|
260
487
|
type RenderTextSlot = "form-intro" | "form-help" | "form-thank-you";
|
|
261
488
|
interface RecordsUiHost {
|
|
489
|
+
/**
|
|
490
|
+
* TEMPORARY (one-grid merge, steps 5-8). Which table grid draws: `classic` — the default Grid
|
|
491
|
+
* as it shipped in 0.86; `merged` — the same grid with the older /data grid's control layer on
|
|
492
|
+
* it (the column header menu, the right-click Cell / Row / Column / Table sections, column
|
|
493
|
+
* settings, column order and hidden columns kept on the view). Left out: `classic`. Removed at
|
|
494
|
+
* merge step 9, when `merged` is the only grid.
|
|
495
|
+
*/
|
|
496
|
+
grid?: "classic" | "merged";
|
|
262
497
|
/** Layouts the host draws beside the package's own. See `HostLayout`. */
|
|
263
498
|
layouts?: HostLayout[];
|
|
264
499
|
/** Answer the rights question for one table. Synchronous: a screen renders now. */
|
|
@@ -885,10 +1120,6 @@ interface CellRefusal {
|
|
|
885
1120
|
/** The value that was being written, so Retry can write it again. */
|
|
886
1121
|
attempted: unknown;
|
|
887
1122
|
}
|
|
888
|
-
/**
|
|
889
|
-
* FLD-9. A computed Field is not editable and never will be — the store works
|
|
890
|
-
* it out. Saying so here, once, keeps every caller from re-deciding it.
|
|
891
|
-
*/
|
|
892
1123
|
declare function fieldIsEditable(field: Field): boolean;
|
|
893
1124
|
interface GridEditing {
|
|
894
1125
|
/** The value to DRAW for one cell — the optimistic one when there is one. */
|
|
@@ -900,7 +1131,12 @@ interface GridEditing {
|
|
|
900
1131
|
type: (value: unknown) => void;
|
|
901
1132
|
stateOf: (rowId: Uuid$1, key: string) => CellState;
|
|
902
1133
|
refusalOf: (rowId: Uuid$1, key: string) => CellRefusal | null;
|
|
903
|
-
|
|
1134
|
+
/**
|
|
1135
|
+
* Open a cell's editor. `seed` is what the person TYPED to open it (type-to-edit: a letter, an
|
|
1136
|
+
* IME composition, an Option/AltGr character): a column a person types into opens holding
|
|
1137
|
+
* exactly that, replacing the value, as every spreadsheet does; a picker column opens as usual.
|
|
1138
|
+
*/
|
|
1139
|
+
begin: (address: CellAddress, seed?: string | null) => void;
|
|
904
1140
|
cancel: () => void;
|
|
905
1141
|
/**
|
|
906
1142
|
* Commit the open cell — whatever is in `draft`. `move` opens the
|
|
@@ -1063,203 +1299,6 @@ declare function refusalOr(error: RecordsError | null | undefined, code: Records
|
|
|
1063
1299
|
*/
|
|
1064
1300
|
declare function asRefusal(thrown: unknown, sentence: string, remedy?: string | null, code?: RecordsErrorCode): RecordsError;
|
|
1065
1301
|
|
|
1066
|
-
/**
|
|
1067
|
-
* HOW A TABLE LOOKS — colors, formats and the frozen column.
|
|
1068
|
-
*
|
|
1069
|
-
* THE SPLIT, AND WHY IT IS THIS ONE. A Field declares WHAT it holds: a
|
|
1070
|
-
* currency, a percent, a date, a person. A VIEW declares HOW that reads and
|
|
1071
|
-
* what it is worth looking at: two decimal places or none, tint the row when
|
|
1072
|
-
* Status is Blocked, keep Name in place while the rest scrolls. Airtable draws
|
|
1073
|
-
* the line in exactly this place, and it has to be here: two people read one
|
|
1074
|
-
* table two different ways, and neither reading is a fact about the records.
|
|
1075
|
-
*
|
|
1076
|
-
* So nothing in this module is a new column on a Field and nothing here needed
|
|
1077
|
-
* a migration. A presentation lives on the saved-view record (`views.ts`), which
|
|
1078
|
-
* is an ordinary record of an ordinary Table — which means an agent sets it
|
|
1079
|
-
* through the same `records` tool it uses for everything else, and it travels
|
|
1080
|
-
* with the table the way every other record does.
|
|
1081
|
-
*
|
|
1082
|
-
* A FIELD STILL GETS ITS MONEY RIGHT WITH NO CONFIGURATION. `formatForField`
|
|
1083
|
-
* reads the Field's OWN declaration — a `currency` parity type with unit `$`, a
|
|
1084
|
-
* `percent`, a `datetime` with `config.kind` — and returns the format that
|
|
1085
|
-
* follows from it. The view's `formats` map only OVERRIDES that. A table nobody
|
|
1086
|
-
* has ever styled still shows `$1,250.50` and `45%`.
|
|
1087
|
-
*/
|
|
1088
|
-
|
|
1089
|
-
/**
|
|
1090
|
-
* SECTIONS BY A FIELD — the view's own grouping.
|
|
1091
|
-
*
|
|
1092
|
-
* `field` is a Field KEY, exactly like `frozen` and the keys of `formats`,
|
|
1093
|
-
* because a view is written against the Table's declaration and never against
|
|
1094
|
-
* whatever id a screen happened to build its columns with.
|
|
1095
|
-
*
|
|
1096
|
-
* `aggregates` is keyed by Field key too, and `collapsed` holds the data
|
|
1097
|
-
* table's own group keys (`s:Blocked`, `n:3`, `empty`), which is what the
|
|
1098
|
-
* primitive emits and the only thing that survives a value rendering the same
|
|
1099
|
-
* text as another.
|
|
1100
|
-
*
|
|
1101
|
-
* NOTHING HERE IS EVER CALLED `valueOf`, `toString` or `hasOwnProperty`: every
|
|
1102
|
-
* object in JavaScript already has all three, so an optional field by one of
|
|
1103
|
-
* those names is NEVER absent and a `config.valueOf ? … : …` check silently
|
|
1104
|
-
* reads `Object.prototype`. It cost the primitive a whole grouping once.
|
|
1105
|
-
*/
|
|
1106
|
-
type GridGrouping = {
|
|
1107
|
-
/** The Field key whose value makes the sections. */
|
|
1108
|
-
field: string;
|
|
1109
|
-
/** Per-Field-key subtotal on every section header. */
|
|
1110
|
-
aggregates?: Record<string, GroupAggregateSpec>;
|
|
1111
|
-
/** Section order. The primitive's default is `value-asc`; blanks sort last. */
|
|
1112
|
-
order?: GroupOrder;
|
|
1113
|
-
/** The sections this view keeps shut, by the primitive's own group key. */
|
|
1114
|
-
collapsed?: string[];
|
|
1115
|
-
/**
|
|
1116
|
-
* SUB-GROUPS (lane S1-PRIME VIEW-KEYS; ui-bench LISTS "sub-grouping"): up to two more levels
|
|
1117
|
-
* inside each section, by Field key. At most three levels in all — the store refuses a fourth
|
|
1118
|
-
* (`custom.view_declare`). A layout that draws one level ignores the rest; it never drops them,
|
|
1119
|
-
* because this list is parsed and written back whole with the rest of the look.
|
|
1120
|
-
*/
|
|
1121
|
-
then?: GridSubGroup[];
|
|
1122
|
-
};
|
|
1123
|
-
/** One sub-group level: a Field key and its section order. */
|
|
1124
|
-
type GridSubGroup = {
|
|
1125
|
-
field: string;
|
|
1126
|
-
order?: GroupOrder;
|
|
1127
|
-
};
|
|
1128
|
-
/** Everything a view says about how its table LOOKS. */
|
|
1129
|
-
type GridPresentation = {
|
|
1130
|
-
/** Color-by-a-column, rules and manual highlights. */
|
|
1131
|
-
style?: TableStyle;
|
|
1132
|
-
/** Per-column format overrides, by the Field's key. */
|
|
1133
|
-
formats?: Record<string, FieldFormatConfig>;
|
|
1134
|
-
/**
|
|
1135
|
-
* The columns that stay in place while the table scrolls sideways, by Field
|
|
1136
|
-
* key. Only the LEADING run of the view's column order can actually freeze —
|
|
1137
|
-
* the data table decides that, and declines rather than pinning a column at a
|
|
1138
|
-
* guessed offset.
|
|
1139
|
-
*/
|
|
1140
|
-
frozen?: string[];
|
|
1141
|
-
/** Collapsible sections by one Field, with subtotals on each header. */
|
|
1142
|
-
grouping?: GridGrouping;
|
|
1143
|
-
/**
|
|
1144
|
-
* The width a person dragged a column to, by Field key. SPARSE on purpose —
|
|
1145
|
-
* a view saved before widths existed carries none and still parses, and a
|
|
1146
|
-
* column nobody resized is left to the table's own measurement.
|
|
1147
|
-
*/
|
|
1148
|
-
widths?: Record<string, number>;
|
|
1149
|
-
/** The body row height this view remembers, in px. */
|
|
1150
|
-
rowHeight?: number;
|
|
1151
|
-
/**
|
|
1152
|
-
* Field keys hidden from this view — the SAME hidden-column list the grid's
|
|
1153
|
-
* own column picker holds, now given a place on the view so it survives a
|
|
1154
|
-
* reload and a layout switch reads the identical set gallery and grid agree
|
|
1155
|
-
* on, rather than a second "fields shown" list nobody kept in sync.
|
|
1156
|
-
*/
|
|
1157
|
-
hiddenFields?: string[];
|
|
1158
|
-
/**
|
|
1159
|
-
* The gallery's card size, remembered the same way the grid remembers its
|
|
1160
|
-
* row height — a per-view look, not a global default.
|
|
1161
|
-
*/
|
|
1162
|
-
gallerySize?: "small" | "medium" | "large";
|
|
1163
|
-
/**
|
|
1164
|
-
* THIS VIEW'S OWN LAYOUT CHOICES, over the organization's `custom/grid_layout` knob (lane
|
|
1165
|
-
* DEFAULT-GRID-PARITY, TABLE-PARITY D1 D5 D6). Absent means "whatever the organization
|
|
1166
|
-
* says"; present is the view's word. `freezeFirst: false` is an explicit NO over an
|
|
1167
|
-
* organization that freezes the first column — an empty `frozen` cannot say that.
|
|
1168
|
-
*/
|
|
1169
|
-
wrap?: boolean;
|
|
1170
|
-
fit?: "auto" | "fit" | "scroll";
|
|
1171
|
-
freezeFirst?: boolean;
|
|
1172
|
-
/**
|
|
1173
|
-
* THE SUMMARY BAR (TABLE-PARITY F1): Field key → the store measure shown under that column
|
|
1174
|
-
* (`count`, `sum`, `avg`, `min`, `max`, `median`, `filled`, `empty`, `unique`), worked out
|
|
1175
|
-
* by `custom.record_aggregate` over the whole table.
|
|
1176
|
-
*/
|
|
1177
|
-
summaries?: Record<string, string>;
|
|
1178
|
-
};
|
|
1179
|
-
declare const EMPTY_PRESENTATION: GridPresentation;
|
|
1180
|
-
/** A frozen column needs a known width, or the table declines to freeze at all. */
|
|
1181
|
-
declare const FROZEN_COLUMN_WIDTH = 200;
|
|
1182
|
-
/**
|
|
1183
|
-
* WHAT A ROW HEIGHT IS ALLOWED TO BE. Below the floor the text is clipped and
|
|
1184
|
-
* no editor fits; above the ceiling one record fills the screen. A view asking
|
|
1185
|
-
* for anything outside it is DROPPED rather than obeyed, because a saved look
|
|
1186
|
-
* must not be able to make a table unreadable — and the Fields' own heights
|
|
1187
|
-
* still draw, which is the tolerant half.
|
|
1188
|
-
*/
|
|
1189
|
-
declare const MIN_ROW_HEIGHT = 24;
|
|
1190
|
-
declare const MAX_ROW_HEIGHT = 96;
|
|
1191
|
-
/**
|
|
1192
|
-
* Read a presentation out of whatever the view record holds — an object, or the
|
|
1193
|
-
* JSON string a text field stores.
|
|
1194
|
-
*
|
|
1195
|
-
* Tolerant in exactly the way `parseTableStyle` is: an unreadable half is
|
|
1196
|
-
* dropped and the rest still applies, because a table must keep drawing when
|
|
1197
|
-
* one piece of its styling goes out of date.
|
|
1198
|
-
*/
|
|
1199
|
-
declare function parseGridPresentation(raw: unknown): GridPresentation;
|
|
1200
|
-
/** True when nothing here would change how anything looks. */
|
|
1201
|
-
declare function presentationIsEmpty(p: GridPresentation): boolean;
|
|
1202
|
-
/** The string a view record stores. Empty string for "this view styles nothing". */
|
|
1203
|
-
declare function presentationDocument(p: GridPresentation): string;
|
|
1204
|
-
/**
|
|
1205
|
-
* The format a Field's OWN declaration implies, before any view says anything.
|
|
1206
|
-
*
|
|
1207
|
-
* Returns `undefined` for a Field whose value the record renderer already draws
|
|
1208
|
-
* better than a formatter could — a relation chip, a person, an attachment, a
|
|
1209
|
-
* choice — because handing those to a text formatter would REPLACE a working
|
|
1210
|
-
* control with a string.
|
|
1211
|
-
*/
|
|
1212
|
-
declare function formatForField(field: Field): FieldFormatConfig | undefined;
|
|
1213
|
-
declare function currencyCodeFor(unit: string | null | undefined): string;
|
|
1214
|
-
/**
|
|
1215
|
-
* The color a value paints with when a view colors BY a column.
|
|
1216
|
-
*
|
|
1217
|
-
* NOTHING FAILS SILENTLY, so this never returns "no color" for a value that
|
|
1218
|
-
* exists. The store keeps a list column's choices as records of another Table,
|
|
1219
|
-
* and this grid has not read that Table's option colors, so the color is
|
|
1220
|
-
* derived from the value's own text: the same word always gets the same color,
|
|
1221
|
-
* different words get different ones, and `true` is green the way every
|
|
1222
|
-
* checklist reads. When those option colors do land, this is the ONE function
|
|
1223
|
-
* that changes and every screen follows.
|
|
1224
|
-
*/
|
|
1225
|
-
declare const colorFromTheValue: ChoiceColorLookup;
|
|
1226
|
-
/**
|
|
1227
|
-
* G1's TABLE-LEVEL COLORS (`custom.table_decorations` / `client.tableDecorations`),
|
|
1228
|
-
* TRANSLATED INTO A `TableStyle` — the same document a saved view's own `presentation.style`
|
|
1229
|
-
* is, so one resolver (`resolveTableStyle`, below) can treat "the table's colors" and "this
|
|
1230
|
-
* view's colors" as two layers of the SAME thing instead of two unrelated systems.
|
|
1231
|
-
*
|
|
1232
|
-
* THE TRANSLATION IS NECESSARY AND IT IS THE ONLY ONE. G1 addresses a Field by its ID
|
|
1233
|
-
* (REC-17 — a column renamed keeps its color), because it is the STORE's own door; a
|
|
1234
|
-
* `TableStyle` addresses a Field by its KEY, because it reads straight off `row.document`,
|
|
1235
|
-
* which is keyed by Field key. A rule or a color-by whose Field has been deleted (its id no
|
|
1236
|
-
* longer resolves to a key) is dropped rather than crashing the whole style — a defect in
|
|
1237
|
-
* one rule costs that rule, never the read.
|
|
1238
|
-
*/
|
|
1239
|
-
declare function styleFromDecorations(decorations: TableDecorations | null | undefined, fields: readonly Field[]): TableStyle;
|
|
1240
|
-
/**
|
|
1241
|
-
* THE ONE PRESENTATION RESOLVER every colored surface in this package reads —
|
|
1242
|
-
* `Grid`, and (via `Card`) the kanban board, the calendar and the gallery.
|
|
1243
|
-
*
|
|
1244
|
-
* THE CLASS THIS CLOSES (lane UI-QUICK-1, TABLE-PARITY review, 2026-09-24). Threading
|
|
1245
|
-
* `view.presentation.style` into `Card` closed the instance the CALENDAR-GALLERY bench
|
|
1246
|
-
* found — a VIEW that had its own color-by looked right everywhere — but it left the
|
|
1247
|
-
* class open: a table whose colors are the ORGANIZATION's decorations (G1's
|
|
1248
|
-
* `custom.table_decorations` — "color rows by Account Type", "MAXED and NEAR rules" on
|
|
1249
|
-
* Arman's own Coding Accounts table) and whose views never set a `presentation.style` of
|
|
1250
|
-
* their own drew NOTHING, on the grid exactly as much as on every other layout, because
|
|
1251
|
-
* nothing in this package had ever read G1's door at all.
|
|
1252
|
-
*
|
|
1253
|
-
* TWO LAYERS, ONE DOCUMENT. The table's decorations are the base coat — what every view
|
|
1254
|
-
* of this table shows until a view says otherwise. A view's OWN `presentation.style` is
|
|
1255
|
-
* an override, piece by piece: a view that only ever set manual row highlights still
|
|
1256
|
-
* inherits the table's color-by and rules for everything it never touched, and a view
|
|
1257
|
-
* that fully redecorated (its own `colorBy` AND its own `rules`) is not haunted by a
|
|
1258
|
-
* table rule it meant to replace. Per-piece, never all-or-nothing, because a view is a
|
|
1259
|
-
* LOOK on top of the table, not a wholesale substitute for it.
|
|
1260
|
-
*/
|
|
1261
|
-
declare function resolveTableStyle(decorations: TableDecorations | null | undefined, fields: readonly Field[], viewStyle: TableStyle | undefined): TableStyle;
|
|
1262
|
-
|
|
1263
1302
|
/** The four ways one saved view can be looked at (SCR-6). */
|
|
1264
1303
|
declare const VIEW_LAYOUTS: readonly ["grid", "kanban", "calendar", "gallery"];
|
|
1265
1304
|
type ViewLayout = (typeof VIEW_LAYOUTS)[number];
|
|
@@ -1515,6 +1554,80 @@ interface ColumnSort {
|
|
|
1515
1554
|
field: string;
|
|
1516
1555
|
direction: "asc" | "desc";
|
|
1517
1556
|
}
|
|
1557
|
+
/** THE SORT CONTROL'S WORDS, the Sheet's, so the grid and the Sheet never read differently. */
|
|
1558
|
+
declare const MANUAL_SORT: {
|
|
1559
|
+
readonly label: "Manual";
|
|
1560
|
+
readonly detail: "· set by hand";
|
|
1561
|
+
readonly title: "The rows are in an order someone set by hand. Sorting by a column sets it aside; saving that sort replaces it.";
|
|
1562
|
+
readonly setAside: "· hand-set order set aside";
|
|
1563
|
+
readonly back: "Back to manual";
|
|
1564
|
+
readonly backTitle: "Go back to the order set by hand";
|
|
1565
|
+
readonly instead: "Use this sort instead";
|
|
1566
|
+
readonly insteadTitle: "Keep this sort as the view's order. It replaces the hand-set order.";
|
|
1567
|
+
readonly replacedToast: "This sort replaced the hand-set order. Reorder puts the rows in an order by hand again.";
|
|
1568
|
+
};
|
|
1569
|
+
/**
|
|
1570
|
+
* THE SORT, AS TOOLBAR STATE (lane TABLE-PAGE-CHROME, owner 2026-09-25: "replace with canonical
|
|
1571
|
+
* toolbar icons and compact controls"). The view's order used to be a full-width sentence row —
|
|
1572
|
+
* "Sorted by Reset Date ↑ · hand-set order set aside Back to manual Use this sort instead" —
|
|
1573
|
+
* above the table's own toolbar. It is now one compact control in the one toolbar row: a sort
|
|
1574
|
+
* icon, the order in a word ("Manual", "Reset Date ↑"), a badge when a column sort is setting a
|
|
1575
|
+
* hand-set order aside, and a popover that says the state in ONE line and offers the actions.
|
|
1576
|
+
* Airtable's sort button carries its state the same way. The grid and the Sheet both draw it.
|
|
1577
|
+
*/
|
|
1578
|
+
interface SortStateAction {
|
|
1579
|
+
key: string;
|
|
1580
|
+
label: string;
|
|
1581
|
+
title?: string | undefined;
|
|
1582
|
+
onPress: () => void;
|
|
1583
|
+
/** The one action that keeps what the person is looking at. */
|
|
1584
|
+
primary?: boolean | undefined;
|
|
1585
|
+
disabled?: boolean | undefined;
|
|
1586
|
+
}
|
|
1587
|
+
interface SortStateControlProps {
|
|
1588
|
+
/** The order in a word or two: "Manual", "Reset Date ↑". */
|
|
1589
|
+
label: string;
|
|
1590
|
+
/** The state in one line, said in the popover. */
|
|
1591
|
+
line: string;
|
|
1592
|
+
/** A column sort is setting a hand-set order aside: the badge shows. */
|
|
1593
|
+
attention?: boolean | undefined;
|
|
1594
|
+
actions?: readonly SortStateAction[] | undefined;
|
|
1595
|
+
/** `manual` / `column` / `saved` — for tests and the walk. */
|
|
1596
|
+
mode: string;
|
|
1597
|
+
}
|
|
1598
|
+
declare function SortStateControl({ label, line, attention, actions, mode }: SortStateControlProps): react.JSX.Element;
|
|
1599
|
+
/** The sentence the popover says for a hand-ordered view, with or without a column sort over it. */
|
|
1600
|
+
declare function handOrderLine(sortName: string | null, direction: "asc" | "desc" | null): string;
|
|
1601
|
+
/** The control's props for a hand-ordered view — the grid's and the Sheet's words, once. */
|
|
1602
|
+
declare function handOrderSortState(args: {
|
|
1603
|
+
sortName: string | null;
|
|
1604
|
+
direction: "asc" | "desc" | null;
|
|
1605
|
+
onBack: () => void;
|
|
1606
|
+
onUseSort?: (() => void) | undefined;
|
|
1607
|
+
saving?: boolean | undefined;
|
|
1608
|
+
}): SortStateControlProps;
|
|
1609
|
+
|
|
1610
|
+
/**
|
|
1611
|
+
* One Field becomes one column. The header is the Field's own NAME — never its
|
|
1612
|
+
* key (`names.ts`) — and the cell is the value, rendered by its parity type and
|
|
1613
|
+
* editable in place when an editing session is passed.
|
|
1614
|
+
*/
|
|
1615
|
+
declare function columnForField(field: Field$1, editing?: GridEditing | null, mayWriteRow?: (rowId: Uuid) => boolean, whyNotRow?: (rowId: Uuid) => string, look?: {
|
|
1616
|
+
format?: FieldFormatConfig;
|
|
1617
|
+
frozen?: boolean;
|
|
1618
|
+
},
|
|
1619
|
+
/** "Who changed this?" from the cell's own menu. Absent, no control is drawn. */
|
|
1620
|
+
onAskWhoChanged?: ((fieldKey: string, recordId: Uuid) => void) | undefined,
|
|
1621
|
+
/**
|
|
1622
|
+
* PRODUCTS row 10 — the provenance of a cell a MODEL owns. `cellFor` answers the page's
|
|
1623
|
+
* already-fetched badge data for one row; `onPin` is bound only where this person may
|
|
1624
|
+
* change the record, so a viewer reads every badge and is offered no control they do not
|
|
1625
|
+
* have. Absent entirely, no badge is drawn and the column looks exactly as it did.
|
|
1626
|
+
*/
|
|
1627
|
+
enrich?: {
|
|
1628
|
+
cellFor: (recordId: Uuid) => _ai_matrx_records.EnrichCell | undefined;
|
|
1629
|
+
onPin?: ((recordId: Uuid, fieldKey: string, pinned: boolean) => void | Promise<void>) | undefined;
|
|
1630
|
+
}): MatrxColumnDef<ReadRow$1>;
|
|
1518
1631
|
|
|
1519
1632
|
/**
|
|
1520
1633
|
* WHAT A TABLE WITH NO COLUMNS SAYS. Named here because the gate asserts on it:
|
|
@@ -1616,30 +1729,16 @@ interface GridProps {
|
|
|
1616
1729
|
onPresentationChange?: ((next: GridPresentation) => void) | undefined;
|
|
1617
1730
|
/** The open view's order — its hand-set order or its sort (`GridViewOrder`). */
|
|
1618
1731
|
viewOrder?: GridViewOrder | undefined;
|
|
1732
|
+
/**
|
|
1733
|
+
* WHERE THE FOOTER SITS (lane TABLE-PAGE-CHROME): `sticky` — the grid fills the height its page
|
|
1734
|
+
* gives it and the rows scroll inside, so the counts and the pages stay on the bottom edge (the
|
|
1735
|
+
* older grid's way); `inline` — the grid is as tall as its rows and the footer follows the last
|
|
1736
|
+
* one. Left out: the grid is as tall as its rows, as it always was outside a table page.
|
|
1737
|
+
*/
|
|
1738
|
+
footer?: FooterPlacement | undefined;
|
|
1619
1739
|
className?: string | undefined;
|
|
1620
1740
|
}
|
|
1621
|
-
declare function Grid({ tableId, pageSize, filter, onOpenRecord, onAddField, onNewRecordForm, toolbarActions, editable, presentation, onPresentationChange, viewOrder, className, onAskWhoChanged, }: GridProps): react.JSX.Element;
|
|
1622
|
-
/**
|
|
1623
|
-
* One Field becomes one column. The header is the Field's own NAME — never its
|
|
1624
|
-
* key (`names.ts`) — and the cell is the value, rendered by its parity type and
|
|
1625
|
-
* editable in place when an editing session is passed.
|
|
1626
|
-
*/
|
|
1627
|
-
declare function columnForField(field: Field$1, editing?: GridEditing | null, mayWriteRow?: (rowId: Uuid) => boolean, whyNotRow?: (rowId: Uuid) => string, look?: {
|
|
1628
|
-
format?: FieldFormatConfig;
|
|
1629
|
-
frozen?: boolean;
|
|
1630
|
-
},
|
|
1631
|
-
/** "Who changed this?" from the cell's own menu. Absent, no control is drawn. */
|
|
1632
|
-
onAskWhoChanged?: ((fieldKey: string, recordId: Uuid) => void) | undefined,
|
|
1633
|
-
/**
|
|
1634
|
-
* PRODUCTS row 10 — the provenance of a cell a MODEL owns. `cellFor` answers the page's
|
|
1635
|
-
* already-fetched badge data for one row; `onPin` is bound only where this person may
|
|
1636
|
-
* change the record, so a viewer reads every badge and is offered no control they do not
|
|
1637
|
-
* have. Absent entirely, no badge is drawn and the column looks exactly as it did.
|
|
1638
|
-
*/
|
|
1639
|
-
enrich?: {
|
|
1640
|
-
cellFor: (recordId: Uuid) => _ai_matrx_records.EnrichCell | undefined;
|
|
1641
|
-
onPin?: ((recordId: Uuid, fieldKey: string, pinned: boolean) => void | Promise<void>) | undefined;
|
|
1642
|
-
}): MatrxColumnDef<ReadRow$1>;
|
|
1741
|
+
declare function Grid({ tableId, pageSize, filter, onOpenRecord, onAddField, onNewRecordForm, toolbarActions, editable, presentation, onPresentationChange, viewOrder, footer, className, onAskWhoChanged, }: GridProps): react.JSX.Element;
|
|
1643
1742
|
|
|
1644
1743
|
/** Answers "what is the record with this id called", for one Field's values. */
|
|
1645
1744
|
type LabelLookup = (field: Field$1, id: string) => string | null;
|
|
@@ -2453,6 +2552,8 @@ declare const LOOK_WORDS: {
|
|
|
2453
2552
|
readonly saveToView: "Save to view";
|
|
2454
2553
|
readonly saveAsNew: "Save as new view";
|
|
2455
2554
|
readonly reset: "Reset to view";
|
|
2555
|
+
/** The one button your look's doors fold into when the toolbar row has no room for three. */
|
|
2556
|
+
readonly folded: "Your look";
|
|
2456
2557
|
readonly newName: "Name for the new view";
|
|
2457
2558
|
};
|
|
2458
2559
|
|
|
@@ -2529,6 +2630,12 @@ interface ViewSwitcherProps {
|
|
|
2529
2630
|
* updates the view it holds (nothing is written — the store already did).
|
|
2530
2631
|
*/
|
|
2531
2632
|
onOrderPlaced?: (() => void) | undefined;
|
|
2633
|
+
/**
|
|
2634
|
+
* Where the grid's footer sits (lane TABLE-PAGE-CHROME) — `sticky`: the layout fills the height
|
|
2635
|
+
* the page gives it and the footer stays on the bottom edge; `inline`: after the last row. Handed
|
|
2636
|
+
* to the Grid and to a host layout (the Sheet). Left out: natural height, as always.
|
|
2637
|
+
*/
|
|
2638
|
+
footer?: FooterPlacement | undefined;
|
|
2532
2639
|
className?: string | undefined;
|
|
2533
2640
|
}
|
|
2534
2641
|
/** The records this view holds: its Rule's members when it names one, the table otherwise. */
|
|
@@ -2551,7 +2658,7 @@ declare function useViewRecords(view: SavedViewSpec, pageSize?: number, filter?:
|
|
|
2551
2658
|
*/
|
|
2552
2659
|
membership: string;
|
|
2553
2660
|
};
|
|
2554
|
-
declare function ViewSwitcher({ view, onLayoutChange, onViewChange, onOpenRecord, onMoved, onNewRecordForm, onAskWhoChanged, pageSize, titleField, filter, hostLayout, onHostLayoutChange, chooser, openExport, viewId, onOrderPlaced, className, }: ViewSwitcherProps): react.JSX.Element;
|
|
2661
|
+
declare function ViewSwitcher({ view, onLayoutChange, onViewChange, onOpenRecord, onMoved, onNewRecordForm, onAskWhoChanged, pageSize, titleField, filter, hostLayout, onHostLayoutChange, chooser, openExport, viewId, onOrderPlaced, footer, className, }: ViewSwitcherProps): react.JSX.Element;
|
|
2555
2662
|
|
|
2556
2663
|
/** What the screen says above the list, so nobody has to be told twice that nothing was destroyed. */
|
|
2557
2664
|
declare const ARCHIVE_MEANS = "Archiving never destroys anything. A record you remove from the grid waits here until somebody brings it back.";
|
|
@@ -2635,11 +2742,10 @@ interface ViewBarProps {
|
|
|
2635
2742
|
*/
|
|
2636
2743
|
seed?: SavedViewSpec[] | undefined;
|
|
2637
2744
|
/**
|
|
2638
|
-
*
|
|
2639
|
-
*
|
|
2640
|
-
* menu instead. Two or more views are a real choice and the bar draws.
|
|
2745
|
+
* THE VIEW'S OWN SETTINGS, drawn at the foot of the picker (lane TABLE-PAGE-CHROME): where the
|
|
2746
|
+
* footer sits, and whatever else belongs to the view rather than to one column.
|
|
2641
2747
|
*/
|
|
2642
|
-
|
|
2748
|
+
settings?: ReactNode | undefined;
|
|
2643
2749
|
/** Every time the list is read: the views, or null when they could not be read. */
|
|
2644
2750
|
onViews?: ((views: SavedView[] | null) => void) | undefined;
|
|
2645
2751
|
className?: string | undefined;
|
|
@@ -2655,7 +2761,7 @@ declare const SAVED_VIEWS_UNAVAILABLE: string;
|
|
|
2655
2761
|
* is also satisfied by any view the table already marks as its default, whatever it is called.
|
|
2656
2762
|
*/
|
|
2657
2763
|
declare function seedIsSatisfied(seed: SavedViewSpec, views: readonly SavedView[]): boolean;
|
|
2658
|
-
declare function ViewBar({ tableId, activeViewId, onActiveView, seed,
|
|
2764
|
+
declare function ViewBar({ tableId, activeViewId, onActiveView, seed, settings, onViews, className }: ViewBarProps): react.JSX.Element;
|
|
2659
2765
|
|
|
2660
2766
|
/** One proposed change, in the proposer's words plus the exact act it asks for. */
|
|
2661
2767
|
interface ProposedChange {
|
|
@@ -4021,10 +4127,14 @@ interface TablePageProps {
|
|
|
4021
4127
|
*/
|
|
4022
4128
|
activeItemId?: Uuid$1 | null | undefined;
|
|
4023
4129
|
/**
|
|
4024
|
-
*
|
|
4025
|
-
*
|
|
4130
|
+
* THE PAGE'S HEADER, handed the table's own page-level controls (lane TABLE-PAGE-CHROME, owner
|
|
4131
|
+
* 2026-09-25: "align with the app's top-tier pages"). Called with `actions` — Share and the
|
|
4132
|
+
* table's one menu — so a host draws them in ITS page header (the app's back button and title
|
|
4133
|
+
* switcher beside them) and the table page draws no row of its own for them. Left out, the
|
|
4134
|
+
* actions sit at the end of the table's one toolbar row. Never a second toolbar: the host gets
|
|
4135
|
+
* the page's actions, not a slot for its own.
|
|
4026
4136
|
*/
|
|
4027
|
-
|
|
4137
|
+
header?: ((chrome: TablePageHeaderChrome) => ReactNode) | undefined;
|
|
4028
4138
|
/**
|
|
4029
4139
|
* What the HOST adds to the table's one menu — a capability the package cannot know about (the
|
|
4030
4140
|
* app's "When a row changes, run an agent…"). Drawn after the package's own entries.
|
|
@@ -4043,6 +4153,13 @@ interface TablePageProps {
|
|
|
4043
4153
|
onShownViewChange?: ((shown: ShownViewReport) => void) | undefined;
|
|
4044
4154
|
className?: string | undefined;
|
|
4045
4155
|
}
|
|
4156
|
+
/** What `TablePage.header` is handed. */
|
|
4157
|
+
interface TablePageHeaderChrome {
|
|
4158
|
+
/** Share and the table's one menu, for the host's header. Null while the table is not open. */
|
|
4159
|
+
actions: ReactNode;
|
|
4160
|
+
/** The table's name once it is read; null before. */
|
|
4161
|
+
tableName: string | null;
|
|
4162
|
+
}
|
|
4046
4163
|
/** The view as the page draws it right now (`TablePage.onShownViewChange`). */
|
|
4047
4164
|
interface ShownViewReport {
|
|
4048
4165
|
/** The saved view under the look; null while the views are read or when there are none. */
|
|
@@ -4095,6 +4212,12 @@ declare const TABLE_NOT_REACHABLE: string;
|
|
|
4095
4212
|
* second kind of view that every feature after it has to know about.
|
|
4096
4213
|
*/
|
|
4097
4214
|
declare const DEFAULT_VIEW_NAME = "All records";
|
|
4215
|
+
/** The view setting that says where the grid's footer sits (lane TABLE-PAGE-CHROME). */
|
|
4216
|
+
declare const FOOTER_WORDS: {
|
|
4217
|
+
readonly label: "Footer";
|
|
4218
|
+
readonly sticky: "Pinned to the bottom";
|
|
4219
|
+
readonly inline: "After the last row";
|
|
4220
|
+
};
|
|
4098
4221
|
/**
|
|
4099
4222
|
* What the page says while it is running on the unsaved default. It is a
|
|
4100
4223
|
* STAND-IN and it announces itself, with the one thing a person can do about
|
|
@@ -4219,7 +4342,19 @@ interface MenuEntryDef {
|
|
|
4219
4342
|
shown: (rights: ReturnType<typeof useTableRights>) => boolean;
|
|
4220
4343
|
}
|
|
4221
4344
|
declare const TABLE_MENU: readonly MenuEntryDef[];
|
|
4222
|
-
declare function TablePage({ tableId, pageSize, seedViews, onLeave, leaveLabel, activeDashboardId, activeRecordId, activeView, onViewChanged, activeGroupField, cameFrom, filter, activeRail, activeItemId,
|
|
4345
|
+
declare function TablePage({ tableId, pageSize, seedViews, onLeave, leaveLabel, activeDashboardId, activeRecordId, activeView, onViewChanged, activeGroupField, cameFrom, filter, activeRail, activeItemId, header, menuExtras, onShownViewChange, className, }: TablePageProps): react.JSX.Element;
|
|
4346
|
+
|
|
4347
|
+
/**
|
|
4348
|
+
* The page's toolbar slot: an element (controls go there), `null` (the row is mounting — draw
|
|
4349
|
+
* nothing yet, never a flash of a second row), or `undefined` (no page row: draw in place).
|
|
4350
|
+
*/
|
|
4351
|
+
declare const TableToolbarSlotContext: react.Context<HTMLElement | null | undefined>;
|
|
4352
|
+
/** The slot a layout's controls belong in, as `TableToolbarSlotContext` says. */
|
|
4353
|
+
declare function useTableToolbarSlot(): HTMLElement | null | undefined;
|
|
4354
|
+
/** A layout's own controls, placed in the page's one toolbar row when there is one. */
|
|
4355
|
+
declare function InTableToolbar({ children }: {
|
|
4356
|
+
children: ReactNode;
|
|
4357
|
+
}): react.JSX.Element | null;
|
|
4223
4358
|
|
|
4224
4359
|
/** What the roster can tell us about a user id. `null` when it cannot. */
|
|
4225
4360
|
type ResolveName = (userId: Uuid$1) => string | null;
|
|
@@ -4414,4 +4549,4 @@ interface PipelineBoardProps {
|
|
|
4414
4549
|
}
|
|
4415
4550
|
declare function PipelineBoard({ tableId, rows, titleKey, measure, filter, onMeasureChange, onOpenRecord, onMoved, style, dateFields, className, }: PipelineBoardProps): react.JSX.Element;
|
|
4416
4551
|
|
|
4417
|
-
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, INBOX_GROUPINGS, INBOX_VIEWS, IN_MEMORY_QUEUE_REASON, ImportWizard, type ImportWizardProps, type InboxGroup, type InboxGrouping, KERNEL_REASON, LANE_EMPTY, LANE_TITLE, LAYOUT_FIELD_KIND, LAYOUT_LABEL, LAYOUT_NEEDS, LAYOUT_NO_FIELD, LEVEL_WORD, LOOK_WORDS, 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 RenderTextSlot, 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, type ShownViewReport, SignBlock, type SignBlockProps, type SnoozeChoice, StageRulesSection, type StageRulesSectionProps, StepRow, type SubscriptionChannel, SubscriptionsPanel, type SubscriptionsPanelProps, type Surface, type SurfacePress, type SystemFieldSpec, type SystemTableSpec, TABLE_LANES, TABLE_MENU, TABLE_NOT_REACHABLE, THE_SYSTEM, type TableLane, type TableOpening, 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 ViewLook, type ViewSettings, type ViewSettingsPatch, type ViewSort, type ViewSortKey, ViewSwitcher, type ViewSwitcherProps, type VisibilityLane, WITHHELD_RECORD_LABEL, WITHHELD_WORD, WORK_APPROVAL_STATES, WORK_APPROVAL_STATE_LABEL, WORK_DUE_STATES, WORK_INBOX_KINDS, WORK_INBOX_KIND_GROUP_LABEL, WORK_INBOX_KIND_LABEL, type WhatYouMayDo, WhereItLives, type WhereItLivesProps, type WhoChanged, WhoChangedSource, WithheldValue, actorBadge, actorWords, applyLook, archivedRowLine, asRefusal, askableFields, blockFromSpec, bodyForReading, bodyFromKeys, calendarDayLabel, calendarDayOf, cameFromLine, cardTitleField, cardWords, carriesTimeOfDay, cellState, chooseSurface, colorFromTheValue, columnForField, conditionInWords, conditionIsDrawable, conditionIsSimple, conditionValue, controlFor, currencyCodeFor, dashboardDeclareArgs, dashboardFromSummary, dateFormatFor, dateText, declareView, defaultViewOf, designatedLayoutOf, editorKindFor, ensureSystemTable, entityReferenceSpec, envelopeFor, fieldIsEditable, fieldName, fieldToken, fieldTypeChoice, fieldTypeLabel, formDeclareArgs, formFromSummary, formPresentation, formatForField, groupInbox, groupLabel, hasTimePart, hintForAPerson, hintIsMachineIdentity, humanize, idsOf, isDateField, isEngineerText, isId, isMachineIdentity, isParityFieldType, isPlainFieldType, isRelationFieldType, isSignatureField, keepLook, keptByTheApp, keyFor, kindsWithNoChoice, laneFor, lastChangeSentence, lookDiffers, lookDocument, lookFromDocument, lookPart, looksLikeId, machineIdentityIn, mayNotRestoreLine, memberName, nextInWords, nextSummaryAt, openingRail, openingView, pageViewFromParam, parityTypesWithNoExplanation, parseGridPresentation, personActor, personRecordForMember, pointsAtRecords, presentationDocument, presentationIsEmpty, previewLine, previewWords, publiclyAnswerable, railFromParam, readLooks, recordName, recordNameIn, recordsDataSource, refusal, refusalForAPerson, refusalFromThrown, refusalLineForAPerson, refusalOr, renderValue, resolveTableStyle, revokeConsequence, rowName, rowNameIn, saveToViewPlan, saveViewPatch, scalarText, seedIsSatisfied, shareUnavailableReason, snoozeChoices, specFromBlock, storeDecidesRights, styleFromDecorations, submissionStamp, surfaceChosen, tableName, tableOpening, 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, withheldNoticeOf, withheldSentence };
|
|
4552
|
+
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_FOOTER, DEFAULT_VIEW_NAME, DUE_STATE_LABEL, DashboardCanvas, type DashboardCanvasProps, DigestScheduler, type DigestSchedulerProps, DocRender, type DocRenderProps, DocTemplate, type DocTemplateProps, type DocTemplateSpec, EMPTY_PRESENTATION, ENGINEER_TEXT, ENTITY_REFERENCE_KINDS_MISSING, type EditorKind, EmbedFrame, type EmbedFrameProps, type EnrichAsk, EnrichBadge, type EnrichBadgeProps, type EnrichOutcome, EnrichPanel, type EnrichPanelProps, EntityReferenceKindPicker, type EntityReferenceKindPickerProps, ExportMenu, type ExportMenuProps, FIELD_RULE_KIND_LABEL, FIELD_RULE_KIND_VALUES, FIELD_SENSITIVITY_LABEL, FIELD_TYPE_CHOICES, FIELD_TYPE_GROUPS, FOOTER_WORDS, FORMULA_OP_JOINS, FORMULA_OP_LABEL, FORMULA_OP_VALUES, FORM_FLOWS, FORM_NOT_HERE_LINE, FROZEN_COLUMN_WIDTH, FieldControl, FieldEditor, type FieldEditorControlProps, type FieldEditorProps, FieldHistoryPanel, type FieldHistoryPanelProps, FieldLabel, type FieldProposalRow, type FieldRuleKindValue, type FieldTypeChoice, FilePicker, type FilePickerProps, type FooterPlacement, 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, INBOX_GROUPINGS, INBOX_VIEWS, IN_MEMORY_QUEUE_REASON, ImportWizard, type ImportWizardProps, InTableToolbar, type InboxGroup, type InboxGrouping, KERNEL_REASON, LANE_EMPTY, LANE_TITLE, LAYOUT_FIELD_KIND, LAYOUT_LABEL, LAYOUT_NEEDS, LAYOUT_NO_FIELD, LEVEL_WORD, LOOK_WORDS, type LabelLookup, type LinkRail, MACHINE_IDENTITY, MANUAL_SORT, 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 RenderTextSlot, 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, type ShownViewReport, SignBlock, type SignBlockProps, type SnoozeChoice, type SortStateAction, SortStateControl, type SortStateControlProps, StageRulesSection, type StageRulesSectionProps, StepRow, type SubscriptionChannel, SubscriptionsPanel, type SubscriptionsPanelProps, type Surface, type SurfacePress, type SystemFieldSpec, type SystemTableSpec, TABLE_LANES, TABLE_MENU, TABLE_NOT_REACHABLE, THE_SYSTEM, type TableLane, type TableOpening, TablePage, type TablePageHeaderChrome, type TablePageProps, type TableRights, TableSettings, type TableSettingsProps, TableToolbarSlotContext, 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 ViewLook, type ViewSettings, type ViewSettingsPatch, type ViewSort, type ViewSortKey, ViewSwitcher, type ViewSwitcherProps, type VisibilityLane, WITHHELD_RECORD_LABEL, WITHHELD_WORD, WORK_APPROVAL_STATES, WORK_APPROVAL_STATE_LABEL, WORK_DUE_STATES, WORK_INBOX_KINDS, WORK_INBOX_KIND_GROUP_LABEL, WORK_INBOX_KIND_LABEL, type WhatYouMayDo, WhereItLives, type WhereItLivesProps, type WhoChanged, WhoChangedSource, WithheldValue, actorBadge, actorWords, applyLook, archivedRowLine, asRefusal, askableFields, blockFromSpec, bodyForReading, bodyFromKeys, calendarDayLabel, calendarDayOf, cameFromLine, cardTitleField, cardWords, carriesTimeOfDay, cellState, chooseSurface, colorFromTheValue, columnForField, conditionInWords, conditionIsDrawable, conditionIsSimple, conditionValue, controlFor, currencyCodeFor, dashboardDeclareArgs, dashboardFromSummary, dateFormatFor, dateText, declareView, defaultViewOf, designatedLayoutOf, editorKindFor, ensureSystemTable, entityReferenceSpec, envelopeFor, fieldIsEditable, fieldName, fieldToken, fieldTypeChoice, fieldTypeLabel, footerOf, formDeclareArgs, formFromSummary, formPresentation, formatForField, groupInbox, groupLabel, handOrderLine, handOrderSortState, hasTimePart, hintForAPerson, hintIsMachineIdentity, humanize, idsOf, isDateField, isEngineerText, isId, isMachineIdentity, isParityFieldType, isPlainFieldType, isRelationFieldType, isSignatureField, keepLook, keptByTheApp, keyFor, kindsWithNoChoice, laneFor, lastChangeSentence, lookDiffers, lookDocument, lookFromDocument, lookPart, looksLikeId, machineIdentityIn, mayNotRestoreLine, memberName, nextInWords, nextSummaryAt, openingRail, openingView, pageViewFromParam, parityTypesWithNoExplanation, parseGridPresentation, personActor, personRecordForMember, pointsAtRecords, presentationDocument, presentationIsEmpty, previewLine, previewWords, publiclyAnswerable, railFromParam, readLooks, recordName, recordNameIn, recordsDataSource, refusal, refusalForAPerson, refusalFromThrown, refusalLineForAPerson, refusalOr, renderValue, resolveTableStyle, revokeConsequence, rowName, rowNameIn, saveToViewPlan, saveViewPatch, scalarText, seedIsSatisfied, shareUnavailableReason, snoozeChoices, specFromBlock, storeDecidesRights, styleFromDecorations, submissionStamp, surfaceChosen, tableName, tableOpening, tableRightsAt, unknownRailLine, unknownViewLine, useCanShare, useEmbedHandshake, useEnrichCells, useGridEditing, useLabelWait, useMeasuredWidth, useMyChecklistSteps, useRecordLabels, useRecordRights, useRecordsUi, useRowRights, useSystemTable, useTableRights, useTableToolbarSlot, useViewRecords, useWhoChanged, viewDocument, viewFromRow, viewKeysFor, viewPatchDocument, viewSettings, viewSettingsFor, viewSettingsPatch, visibilityLaneFor, whatIsMissing, whatIsMissingForEntityReference, whatYouMayDo, whatYouMayDoWithTable, whenWords, whyNotAskable, withheldNoticeOf, withheldSentence };
|