@kanunilabs/datagrid-react 1.8.12 → 1.8.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.cts CHANGED
@@ -2507,11 +2507,13 @@ interface GridSurfaceProviderProps {
2507
2507
  theme?: GridThemeName;
2508
2508
  density?: GridDensity;
2509
2509
  palette?: GridPaletteName;
2510
+ /** Dark tokens for the popups too (`LookupBox` `dark`, B.9.13). */
2511
+ dark?: boolean;
2510
2512
  /** Where popups are drawn (the grid's `portalContainer`). Default <body>. */
2511
2513
  portalContainer?: PortalContainer;
2512
2514
  children: ReactNode;
2513
2515
  }
2514
- declare function GridSurfaceProvider({ theme, density, palette, portalContainer, children, }: GridSurfaceProviderProps): react.JSX.Element;
2516
+ declare function GridSurfaceProvider({ theme, density, palette, dark, portalContainer, children, }: GridSurfaceProviderProps): react.JSX.Element;
2515
2517
  /**
2516
2518
  * The element a popup is portalled into, read when the popup opens: <body>,
2517
2519
  * or the host inside the grid's `portalContainer` (core `portalTarget`).
@@ -2989,6 +2991,13 @@ interface GridLookupEditorProps {
2989
2991
  * field would open its list at once.
2990
2992
  */
2991
2993
  openOnEdit?: boolean;
2994
+ /**
2995
+ * Focusing or clicking the box opens the list. Default false (Tekax B.9.3):
2996
+ * the list opens on typing, ▾, F4, Alt+Down, Space (`editKeys.space`) or,
2997
+ * with `openOnEdit`, when the editor starts — so a Tab into a form field or
2998
+ * an editor opened with Enter shows the value, not a list over the rows.
2999
+ */
3000
+ openOnFocus?: boolean;
2992
3001
  /**
2993
3002
  * The editor was opened by TYPING and `value` is that one character: the
2994
3003
  * box starts with it as the typed text (list filtered by it, caret after
@@ -3014,6 +3023,42 @@ interface GridLookupEditorProps {
3014
3023
  listColumns?: readonly LookupListColumn[];
3015
3024
  /** A ▾ button that opens and closes the list (`lookup.dropButton`, B.4.2). */
3016
3025
  dropButton?: boolean;
3026
+ /**
3027
+ * What the box shows and completes against (`lookup.display`, B.9.1):
3028
+ * `'code'`, `'name'` or `'both'`. Default: `'code'` for a `linked` list, the
3029
+ * label otherwise.
3030
+ */
3031
+ display?: 'code' | 'name' | 'both';
3032
+ /**
3033
+ * Does the pointer over an item move the highlight (what Enter, Tab and
3034
+ * leaving write)? Default true. False (B.9.6, `LookupBox`'s default): the
3035
+ * pointer only marks the item it is over; the keyboard's highlight stays.
3036
+ */
3037
+ hoverHighlights?: boolean;
3038
+ /** `lookup.openHighlight`: `'current'` opens on the current item, or the first (Tekax, 2026-11-12). */
3039
+ openHighlight?: 'none' | 'current';
3040
+ /** Text emptied and left: the value becomes null (B.9.7, `LookupBox`). Default false. */
3041
+ clearable?: boolean;
3042
+ /**
3043
+ * The list is on its way (B.9.8): typing is not refused, Enter picks
3044
+ * nothing, the list says so; once it arrives the text is checked against it
3045
+ * (cut back to what still matches) and completed.
3046
+ */
3047
+ loading?: boolean;
3048
+ /** Keys the box does not use (Insert, Ctrl+Delete, F-keys) go on to the page (B.9.9, `LookupBox`). */
3049
+ passKeys?: boolean;
3050
+ /** The "…" button is a Tab stop; Enter, Space, F4 and Alt+Down on it open the picker (B.9.14). */
3051
+ pickerTabStop?: boolean;
3052
+ /** `'picker-first'`: [box][…][▾] (B.9.14). Default [box][▾][…]. */
3053
+ buttonOrder?: 'drop-first' | 'picker-first';
3054
+ /** The buttons' accessible names (B.9.14): default "Choose from the full list" and the field's name. */
3055
+ pickerLabel?: string;
3056
+ dropLabel?: string;
3057
+ /** On the BOX (B.9.11): its id (for `<label for>`), form name, required, described-by. */
3058
+ inputId?: string;
3059
+ name?: string;
3060
+ required?: boolean;
3061
+ describedBy?: string;
3017
3062
  /**
3018
3063
  * Complete typed text to the one item left / an exact label on leaving.
3019
3064
  * Default true. False: the "pick from the list" rule (K-3, see the top).
@@ -3073,6 +3118,12 @@ interface GridLookupEditorProps {
3073
3118
  * focus going to the app's dialog neither commits the cell nor sends the row.
3074
3119
  */
3075
3120
  suspendBlurCommit?: (on: boolean, restoreTo?: () => HTMLElement | null) => void;
3121
+ /**
3122
+ * The grid's `setEditFlusher` (B.12.5 / B.9.19): the editor registers its
3123
+ * leaving rule, so a commit the editor did not start (`stopEditing()`,
3124
+ * `ctx.commit()`, a press elsewhere) writes what Tab would.
3125
+ */
3126
+ registerFlush?: (flush: (() => boolean) | null) => void;
3076
3127
  }
3077
3128
  /**
3078
3129
  * The same match, as items. Kept for callers and tests that want the simple
@@ -3080,16 +3131,11 @@ interface GridLookupEditorProps {
3080
3131
  */
3081
3132
  declare function matchOptions(options: readonly LookupItem[], query: string, mode: LookupMatchMode): readonly LookupItem[];
3082
3133
  /** The editor's settings that come straight from a column's `lookup`. */
3083
- type LookupEditorSettings = Pick<GridLookupEditorProps, 'matchMode' | 'codeMatchMode' | 'linked' | 'allowCustom' | 'autoCompleteSingle' | 'onNoMatch' | 'matchFold' | 'openOnEdit' | 'restrictInput' | 'typeAhead' | 'listResizable' | 'listColumns' | 'dropButton'>;
3134
+ type LookupEditorSettings = Pick<GridLookupEditorProps, 'matchMode' | 'codeMatchMode' | 'linked' | 'allowCustom' | 'autoCompleteSingle' | 'onNoMatch' | 'matchFold' | 'openOnEdit' | 'restrictInput' | 'typeAhead' | 'listResizable' | 'listColumns' | 'dropButton' | 'display' | 'hoverHighlights' | 'openHighlight'>;
3084
3135
  /** `lookup` → the editor's props, one reading for the cell, row and form editors. */
3085
3136
  declare function lookupEditorSettings(lookup: ColumnLookup<never> | undefined): LookupEditorSettings;
3086
- /**
3087
- * What one pick writes to the row (P-5.2 / P-5.3): the column's own value,
3088
- * `linkedColumns`' code / name / id, then `map`. Null when the column has
3089
- * neither — a plain pick, one cell, as before.
3090
- */
3091
3137
  declare function lookupPickValues(lookup: ColumnLookup<never> | undefined, columnId: string, item: LookupItem): Record<string, unknown> | null;
3092
- declare function GridLookupEditor({ options, value, matchMode, codeMatchMode, matchFold, linked, allowCustom, openOnEdit, seeded, restrictInput, typeAhead, listResizable, listColumns, dropButton, autoCompleteSingle, onNoMatch, onPick, invalid, disabled, autoFocus, testId, columnId, ariaLabel, onChange, onCommit, commitOnPick, onCancel, onTab, onBlurCommit, onPickerOpen, suspendBlurCommit, }: GridLookupEditorProps): react.JSX.Element;
3138
+ declare function GridLookupEditor({ options, value, matchMode, codeMatchMode, matchFold, linked, allowCustom, openOnEdit, seeded, restrictInput, typeAhead, listResizable, listColumns, dropButton, openOnFocus, display, hoverHighlights, openHighlight, clearable, loading, passKeys, pickerTabStop, buttonOrder, pickerLabel, dropLabel, inputId, name, required, describedBy, autoCompleteSingle, onNoMatch, onPick, invalid, disabled, autoFocus, testId, columnId, ariaLabel, onChange, onCommit, commitOnPick, onCancel, onTab, onBlurCommit, onPickerOpen, suspendBlurCommit, registerFlush, }: GridLookupEditorProps): react.JSX.Element;
3093
3139
 
3094
3140
  interface GridCellEditorProps {
3095
3141
  value: unknown;
@@ -3097,6 +3143,8 @@ interface GridCellEditorProps {
3097
3143
  multipleLookup?: ColumnLookup<never>;
3098
3144
  /** `lookup.onPickerOpen`, bound to this cell (Tekax B.4.1). */
3099
3145
  onPickerOpen?: GridLookupEditorProps['onPickerOpen'];
3146
+ /** The engine's `setEditFlusher` (B.12.5): lookup and date editors register their leaving rule. */
3147
+ registerFlush?: (flush: (() => boolean) | null) => void;
3100
3148
  /** The grid's `suspendBlurCommit`, held while that picker is open. */
3101
3149
  suspendBlurCommit?: GridLookupEditorProps['suspendBlurCommit'];
3102
3150
  dataType: GridDataType | undefined;
@@ -3153,7 +3201,7 @@ interface GridCellEditorProps {
3153
3201
  onTab: (direction: 1 | -1) => void;
3154
3202
  onCancel: () => void;
3155
3203
  }
3156
- declare function GridCellEditor({ value, dataType, error, seeded, seedText, options, allowCustom, matchMode, lookupSettings, onPick, multipleLookup, onPickerOpen, suspendBlurCommit, ariaLabel, dateFormat, numberFormat, numberLocale, onChange, onCommit, onTab, onCancel, }: GridCellEditorProps): react.JSX.Element;
3204
+ declare function GridCellEditor({ value, dataType, error, seeded, seedText, options, allowCustom, matchMode, lookupSettings, onPick, multipleLookup, onPickerOpen, suspendBlurCommit, registerFlush, ariaLabel, dateFormat, numberFormat, numberLocale, onChange, onCommit, onTab, onCancel, }: GridCellEditorProps): react.JSX.Element;
3157
3205
 
3158
3206
  interface GridDateEditorProps {
3159
3207
  value: unknown;
@@ -3184,13 +3232,15 @@ interface GridDateEditorProps {
3184
3232
  * only settles the typed text, as before.
3185
3233
  */
3186
3234
  onBlurCommit?: () => void;
3235
+ /** The grid's `setEditFlusher` (B.12.5): a commit from elsewhere writes the typed (or cleared) day first. */
3236
+ registerFlush?: (flush: (() => boolean) | null) => void;
3187
3237
  /**
3188
3238
  * Digits the box starts with — the editor was opened by typing one on the
3189
3239
  * cell (P-3.6). The caret goes after them instead of selecting.
3190
3240
  */
3191
3241
  seedDigits?: string;
3192
3242
  }
3193
- declare function GridDateEditor({ value, format, invalid, disabled, autoFocus, testId, columnId, ariaLabel, onChange, onCommit, onCancel, onTab, onBlurCommit, seedDigits, }: GridDateEditorProps): react.JSX.Element;
3243
+ declare function GridDateEditor({ value, format, invalid, disabled, autoFocus, testId, columnId, ariaLabel, onChange, onCommit, onCancel, onTab, onBlurCommit, registerFlush, seedDigits, }: GridDateEditorProps): react.JSX.Element;
3194
3244
 
3195
3245
  interface GridDialogProps {
3196
3246
  open: boolean;
package/dist/index.d.ts CHANGED
@@ -2507,11 +2507,13 @@ interface GridSurfaceProviderProps {
2507
2507
  theme?: GridThemeName;
2508
2508
  density?: GridDensity;
2509
2509
  palette?: GridPaletteName;
2510
+ /** Dark tokens for the popups too (`LookupBox` `dark`, B.9.13). */
2511
+ dark?: boolean;
2510
2512
  /** Where popups are drawn (the grid's `portalContainer`). Default <body>. */
2511
2513
  portalContainer?: PortalContainer;
2512
2514
  children: ReactNode;
2513
2515
  }
2514
- declare function GridSurfaceProvider({ theme, density, palette, portalContainer, children, }: GridSurfaceProviderProps): react.JSX.Element;
2516
+ declare function GridSurfaceProvider({ theme, density, palette, dark, portalContainer, children, }: GridSurfaceProviderProps): react.JSX.Element;
2515
2517
  /**
2516
2518
  * The element a popup is portalled into, read when the popup opens: <body>,
2517
2519
  * or the host inside the grid's `portalContainer` (core `portalTarget`).
@@ -2989,6 +2991,13 @@ interface GridLookupEditorProps {
2989
2991
  * field would open its list at once.
2990
2992
  */
2991
2993
  openOnEdit?: boolean;
2994
+ /**
2995
+ * Focusing or clicking the box opens the list. Default false (Tekax B.9.3):
2996
+ * the list opens on typing, ▾, F4, Alt+Down, Space (`editKeys.space`) or,
2997
+ * with `openOnEdit`, when the editor starts — so a Tab into a form field or
2998
+ * an editor opened with Enter shows the value, not a list over the rows.
2999
+ */
3000
+ openOnFocus?: boolean;
2992
3001
  /**
2993
3002
  * The editor was opened by TYPING and `value` is that one character: the
2994
3003
  * box starts with it as the typed text (list filtered by it, caret after
@@ -3014,6 +3023,42 @@ interface GridLookupEditorProps {
3014
3023
  listColumns?: readonly LookupListColumn[];
3015
3024
  /** A ▾ button that opens and closes the list (`lookup.dropButton`, B.4.2). */
3016
3025
  dropButton?: boolean;
3026
+ /**
3027
+ * What the box shows and completes against (`lookup.display`, B.9.1):
3028
+ * `'code'`, `'name'` or `'both'`. Default: `'code'` for a `linked` list, the
3029
+ * label otherwise.
3030
+ */
3031
+ display?: 'code' | 'name' | 'both';
3032
+ /**
3033
+ * Does the pointer over an item move the highlight (what Enter, Tab and
3034
+ * leaving write)? Default true. False (B.9.6, `LookupBox`'s default): the
3035
+ * pointer only marks the item it is over; the keyboard's highlight stays.
3036
+ */
3037
+ hoverHighlights?: boolean;
3038
+ /** `lookup.openHighlight`: `'current'` opens on the current item, or the first (Tekax, 2026-11-12). */
3039
+ openHighlight?: 'none' | 'current';
3040
+ /** Text emptied and left: the value becomes null (B.9.7, `LookupBox`). Default false. */
3041
+ clearable?: boolean;
3042
+ /**
3043
+ * The list is on its way (B.9.8): typing is not refused, Enter picks
3044
+ * nothing, the list says so; once it arrives the text is checked against it
3045
+ * (cut back to what still matches) and completed.
3046
+ */
3047
+ loading?: boolean;
3048
+ /** Keys the box does not use (Insert, Ctrl+Delete, F-keys) go on to the page (B.9.9, `LookupBox`). */
3049
+ passKeys?: boolean;
3050
+ /** The "…" button is a Tab stop; Enter, Space, F4 and Alt+Down on it open the picker (B.9.14). */
3051
+ pickerTabStop?: boolean;
3052
+ /** `'picker-first'`: [box][…][▾] (B.9.14). Default [box][▾][…]. */
3053
+ buttonOrder?: 'drop-first' | 'picker-first';
3054
+ /** The buttons' accessible names (B.9.14): default "Choose from the full list" and the field's name. */
3055
+ pickerLabel?: string;
3056
+ dropLabel?: string;
3057
+ /** On the BOX (B.9.11): its id (for `<label for>`), form name, required, described-by. */
3058
+ inputId?: string;
3059
+ name?: string;
3060
+ required?: boolean;
3061
+ describedBy?: string;
3017
3062
  /**
3018
3063
  * Complete typed text to the one item left / an exact label on leaving.
3019
3064
  * Default true. False: the "pick from the list" rule (K-3, see the top).
@@ -3073,6 +3118,12 @@ interface GridLookupEditorProps {
3073
3118
  * focus going to the app's dialog neither commits the cell nor sends the row.
3074
3119
  */
3075
3120
  suspendBlurCommit?: (on: boolean, restoreTo?: () => HTMLElement | null) => void;
3121
+ /**
3122
+ * The grid's `setEditFlusher` (B.12.5 / B.9.19): the editor registers its
3123
+ * leaving rule, so a commit the editor did not start (`stopEditing()`,
3124
+ * `ctx.commit()`, a press elsewhere) writes what Tab would.
3125
+ */
3126
+ registerFlush?: (flush: (() => boolean) | null) => void;
3076
3127
  }
3077
3128
  /**
3078
3129
  * The same match, as items. Kept for callers and tests that want the simple
@@ -3080,16 +3131,11 @@ interface GridLookupEditorProps {
3080
3131
  */
3081
3132
  declare function matchOptions(options: readonly LookupItem[], query: string, mode: LookupMatchMode): readonly LookupItem[];
3082
3133
  /** The editor's settings that come straight from a column's `lookup`. */
3083
- type LookupEditorSettings = Pick<GridLookupEditorProps, 'matchMode' | 'codeMatchMode' | 'linked' | 'allowCustom' | 'autoCompleteSingle' | 'onNoMatch' | 'matchFold' | 'openOnEdit' | 'restrictInput' | 'typeAhead' | 'listResizable' | 'listColumns' | 'dropButton'>;
3134
+ type LookupEditorSettings = Pick<GridLookupEditorProps, 'matchMode' | 'codeMatchMode' | 'linked' | 'allowCustom' | 'autoCompleteSingle' | 'onNoMatch' | 'matchFold' | 'openOnEdit' | 'restrictInput' | 'typeAhead' | 'listResizable' | 'listColumns' | 'dropButton' | 'display' | 'hoverHighlights' | 'openHighlight'>;
3084
3135
  /** `lookup` → the editor's props, one reading for the cell, row and form editors. */
3085
3136
  declare function lookupEditorSettings(lookup: ColumnLookup<never> | undefined): LookupEditorSettings;
3086
- /**
3087
- * What one pick writes to the row (P-5.2 / P-5.3): the column's own value,
3088
- * `linkedColumns`' code / name / id, then `map`. Null when the column has
3089
- * neither — a plain pick, one cell, as before.
3090
- */
3091
3137
  declare function lookupPickValues(lookup: ColumnLookup<never> | undefined, columnId: string, item: LookupItem): Record<string, unknown> | null;
3092
- declare function GridLookupEditor({ options, value, matchMode, codeMatchMode, matchFold, linked, allowCustom, openOnEdit, seeded, restrictInput, typeAhead, listResizable, listColumns, dropButton, autoCompleteSingle, onNoMatch, onPick, invalid, disabled, autoFocus, testId, columnId, ariaLabel, onChange, onCommit, commitOnPick, onCancel, onTab, onBlurCommit, onPickerOpen, suspendBlurCommit, }: GridLookupEditorProps): react.JSX.Element;
3138
+ declare function GridLookupEditor({ options, value, matchMode, codeMatchMode, matchFold, linked, allowCustom, openOnEdit, seeded, restrictInput, typeAhead, listResizable, listColumns, dropButton, openOnFocus, display, hoverHighlights, openHighlight, clearable, loading, passKeys, pickerTabStop, buttonOrder, pickerLabel, dropLabel, inputId, name, required, describedBy, autoCompleteSingle, onNoMatch, onPick, invalid, disabled, autoFocus, testId, columnId, ariaLabel, onChange, onCommit, commitOnPick, onCancel, onTab, onBlurCommit, onPickerOpen, suspendBlurCommit, registerFlush, }: GridLookupEditorProps): react.JSX.Element;
3093
3139
 
3094
3140
  interface GridCellEditorProps {
3095
3141
  value: unknown;
@@ -3097,6 +3143,8 @@ interface GridCellEditorProps {
3097
3143
  multipleLookup?: ColumnLookup<never>;
3098
3144
  /** `lookup.onPickerOpen`, bound to this cell (Tekax B.4.1). */
3099
3145
  onPickerOpen?: GridLookupEditorProps['onPickerOpen'];
3146
+ /** The engine's `setEditFlusher` (B.12.5): lookup and date editors register their leaving rule. */
3147
+ registerFlush?: (flush: (() => boolean) | null) => void;
3100
3148
  /** The grid's `suspendBlurCommit`, held while that picker is open. */
3101
3149
  suspendBlurCommit?: GridLookupEditorProps['suspendBlurCommit'];
3102
3150
  dataType: GridDataType | undefined;
@@ -3153,7 +3201,7 @@ interface GridCellEditorProps {
3153
3201
  onTab: (direction: 1 | -1) => void;
3154
3202
  onCancel: () => void;
3155
3203
  }
3156
- declare function GridCellEditor({ value, dataType, error, seeded, seedText, options, allowCustom, matchMode, lookupSettings, onPick, multipleLookup, onPickerOpen, suspendBlurCommit, ariaLabel, dateFormat, numberFormat, numberLocale, onChange, onCommit, onTab, onCancel, }: GridCellEditorProps): react.JSX.Element;
3204
+ declare function GridCellEditor({ value, dataType, error, seeded, seedText, options, allowCustom, matchMode, lookupSettings, onPick, multipleLookup, onPickerOpen, suspendBlurCommit, registerFlush, ariaLabel, dateFormat, numberFormat, numberLocale, onChange, onCommit, onTab, onCancel, }: GridCellEditorProps): react.JSX.Element;
3157
3205
 
3158
3206
  interface GridDateEditorProps {
3159
3207
  value: unknown;
@@ -3184,13 +3232,15 @@ interface GridDateEditorProps {
3184
3232
  * only settles the typed text, as before.
3185
3233
  */
3186
3234
  onBlurCommit?: () => void;
3235
+ /** The grid's `setEditFlusher` (B.12.5): a commit from elsewhere writes the typed (or cleared) day first. */
3236
+ registerFlush?: (flush: (() => boolean) | null) => void;
3187
3237
  /**
3188
3238
  * Digits the box starts with — the editor was opened by typing one on the
3189
3239
  * cell (P-3.6). The caret goes after them instead of selecting.
3190
3240
  */
3191
3241
  seedDigits?: string;
3192
3242
  }
3193
- declare function GridDateEditor({ value, format, invalid, disabled, autoFocus, testId, columnId, ariaLabel, onChange, onCommit, onCancel, onTab, onBlurCommit, seedDigits, }: GridDateEditorProps): react.JSX.Element;
3243
+ declare function GridDateEditor({ value, format, invalid, disabled, autoFocus, testId, columnId, ariaLabel, onChange, onCommit, onCancel, onTab, onBlurCommit, registerFlush, seedDigits, }: GridDateEditorProps): react.JSX.Element;
3194
3244
 
3195
3245
  interface GridDialogProps {
3196
3246
  open: boolean;