@dhtmlx/grid 9.3.10 → 9.3.11

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.
@@ -29,6 +29,7 @@ export interface IComboboxConfig {
29
29
  [className: string]: (event: Event, id: Id) => void | boolean;
30
30
  };
31
31
  };
32
+ ariaLabel?: string;
32
33
  /** @deprecated See a documentation: https://docs.dhtmlx.com/ */
33
34
  cellHeight?: number;
34
35
  /** @deprecated See a documentation: https://docs.dhtmlx.com/ */
@@ -24,6 +24,7 @@ export declare class Grid extends View implements IGrid {
24
24
  protected _scroll: IScrollState;
25
25
  protected _events: IEventSystem<GridSystemEvents, ISystemEventHandlersMap>;
26
26
  protected _htmlEvents: any;
27
+ protected _tooltipFocusHandler: (e: Event) => void;
27
28
  protected _sortingStates: ISortingStates;
28
29
  protected _activeFilters: object;
29
30
  protected _dropManager: any;
@@ -36,6 +37,7 @@ export declare class Grid extends View implements IGrid {
36
37
  protected _colWidths: PrefixSums;
37
38
  protected _rowHeightsRebuild: boolean;
38
39
  private _observedEl;
40
+ private _liveRegion;
39
41
  private _filterData;
40
42
  private _hiddenFilters;
41
43
  private _commonSummary;
@@ -68,6 +70,17 @@ export declare class Grid extends View implements IGrid {
68
70
  editEnd(withoutSave?: boolean): void;
69
71
  getHeaderFilter(colId: Id): IHeaderFilter;
70
72
  getSummary(colId?: Id): ISummaryList;
73
+ /**
74
+ * Sends a message to the grid's polite live region, so a screen reader
75
+ * announces a status change that happened without moving focus.
76
+ */
77
+ announce(message: string): void;
78
+ /**
79
+ * The live region is kept as a sibling of the widget root, outside the
80
+ * `role="grid"` element: a `role="status"` node is not an allowed child of
81
+ * a grid, and the node must survive redraws, so it is not part of the vdom.
82
+ */
83
+ protected _getLiveRegion(): HTMLElement | null;
71
84
  /** @deprecated See a documentation: https://docs.dhtmlx.com/suite/migration/ */
72
85
  getSortingState(): {
73
86
  dir?: TSortDir;
@@ -27,6 +27,7 @@ export declare class ProGrid implements IProGrid {
27
27
  history: IHistory;
28
28
  constructor(container: HTMLElement | string | null, config?: IProGridConfig);
29
29
  paint(): void;
30
+ announce(message: string): void;
30
31
  destructor(): void;
31
32
  expand(rowId: Id): void;
32
33
  collapse(rowId: Id): void;
@@ -1,6 +1,7 @@
1
1
  import { ICell, ICol, IGrid, IRow, ISpan } from "./../types";
2
2
  import { Id } from "../../../ts-common/types";
3
3
  export declare function getWidth(columns: ICol[], colspan: number, index: number): number;
4
+ export declare function getSourceCellIndex(currentIdx: number, minIdx: number, count: number): number;
4
5
  export declare function getSpanHeight(rows: IRow[], span: ISpan): number;
5
6
  export declare function getReducedColspan(columns: ICol[], colId: Id, colspan: number): number;
6
7
  export declare function getReducedRowspan(initialRows: IRow[], currRows: IRow[], rowIndex: number, span: ISpan): number;
@@ -0,0 +1,10 @@
1
+ export interface ILocaleParams {
2
+ [key: string]: string | number;
3
+ }
4
+ /**
5
+ * Returns a localized string by its key, substituting `{name}` placeholders.
6
+ *
7
+ * The locale object is read on every call, so `dhx.i18n.setLocale("grid", ...)`
8
+ * is picked up without rebuilding anything.
9
+ */
10
+ export declare function getLocaleString(key: string, params?: ILocaleParams): string;
@@ -3,5 +3,31 @@ declare const locale: {
3
3
  groupText: string;
4
4
  dropAreaTitle: string;
5
5
  dropAreaPlaceholder: string;
6
+ aria_sortedAscending: string;
7
+ aria_sortedDescending: string;
8
+ aria_filterApplied: string;
9
+ aria_filterCleared: string;
10
+ aria_rowsLoaded: string;
11
+ aria_valueOutOfRange: string;
12
+ aria_valueBelowMin: string;
13
+ aria_valueAboveMax: string;
14
+ aria_valueClamped: string;
15
+ aria_filter: string;
16
+ aria_filterByDate: string;
17
+ aria_sortBy: string;
18
+ aria_expandGroup: string;
19
+ aria_collapseGroup: string;
20
+ aria_expandRow: string;
21
+ aria_collapseRow: string;
22
+ aria_editContent: string;
23
+ aria_subRow: string;
24
+ aria_enterGrid: string;
25
+ aria_exitGrid: string;
26
+ aria_dragPanel: string;
27
+ aria_panelHeader: string;
28
+ aria_panelFooter: string;
29
+ aria_panelContent: string;
30
+ aria_draggableRows: string;
31
+ aria_rowId: string;
6
32
  };
7
33
  export default locale;
@@ -119,6 +119,5 @@ export declare class BlockSelection implements IBlockSelection {
119
119
  private _removeHandlers;
120
120
  private _getPageCoords;
121
121
  private _cellHandler;
122
- private _getSourceCellIndex;
123
122
  private _paint;
124
123
  }
@@ -30,6 +30,7 @@ export interface IGrid {
30
30
  keyManager: IKeyManager;
31
31
  export: any;
32
32
  paint(): void;
33
+ announce(message: string): void;
33
34
  destructor(): void;
34
35
  setColumns(col: ICol[]): void;
35
36
  addRowCss(rowId: Id, css: string): void;
@@ -209,6 +210,7 @@ export interface IRendererConfig extends Required<IProGridConfig> {
209
210
  selection: any;
210
211
  dropManager: any;
211
212
  blockSelection: any;
213
+ range?: IRange;
212
214
  sort: ISortingStates;
213
215
  filterLocation?: string;
214
216
  content?: IContentList;
@@ -219,6 +221,7 @@ export interface IRendererConfig extends Required<IProGridConfig> {
219
221
  };
220
222
  $renderFrom?: RenderFrom;
221
223
  $isDragging?: boolean;
224
+ $rowIndexShift?: number;
222
225
  _events?: IEventSystem<GridSystemEvents>;
223
226
  }
224
227
  export declare enum GridEvents {
@@ -364,7 +367,8 @@ export declare enum GridSystemEvents {
364
367
  headerCellTouchMove = "headerCellTouchMove",
365
368
  headerCellTouchEnd = "headerCellTouchEnd",
366
369
  groupPanelItemTouchMove = "groupPanelItemTouchMove",
367
- groupPanelItemItemTouchEnd = "groupPanelItemItemTouchEnd"
370
+ groupPanelItemItemTouchEnd = "groupPanelItemItemTouchEnd",
371
+ announce = "announce"
368
372
  }
369
373
  export interface ISystemEventHandlersMap {
370
374
  [key: string]: (...args: any[]) => any;
@@ -374,6 +378,7 @@ export interface ISystemEventHandlersMap {
374
378
  [GridSystemEvents.headerCellTouchEnd]: (cell: IHeader, col: ICol, event: TouchEvent) => void;
375
379
  [GridSystemEvents.groupPanelItemTouchMove]: (id: string, event: TouchEvent) => void;
376
380
  [GridSystemEvents.groupPanelItemItemTouchEnd]: (id: string, event: TouchEvent) => void;
381
+ [GridSystemEvents.announce]: (message: string) => void;
377
382
  }
378
383
  export interface ICol {
379
384
  id: Id;
@@ -1,5 +1,6 @@
1
1
  import { GridEvents, GridSystemEvents, ICoords, IGridConfig, IRendererConfig, ISpan, Split } from "../types";
2
2
  import { IDataCollection } from "../../../ts-data";
3
+ import { Id } from "../../../ts-common/types";
3
4
  type mouseEvents = GridEvents.cellClick | GridEvents.cellMouseOver | GridEvents.cellMouseDown | GridEvents.cellDblClick | GridEvents.cellRightClick;
4
5
  type touchEvents = GridSystemEvents.cellTouchEnd | GridSystemEvents.cellTouchMove;
5
6
  declare function handleMouse(rowStart: number, colStart: number, conf: IRendererConfig, type: mouseEvents & touchEvents, e: any): void;
@@ -20,8 +21,8 @@ export declare function normalizeSpan(span: ISpan, config: IGridConfig, data: ID
20
21
  $renderFrom: any[];
21
22
  $rowsVisibility: number[];
22
23
  $colsVisibility: number[];
23
- row: import("../../../ts-common/types").Id;
24
- column: import("../../../ts-common/types").Id;
24
+ row: Id;
25
+ column: Id;
25
26
  rowspan?: number;
26
27
  colspan?: number;
27
28
  text?: string | ((args: import("../types").ISummaryList) => string);
@@ -5,4 +5,11 @@ export declare function calcScrollBarWidth(config: IGridConfig | IRendererConfig
5
5
  height: number;
6
6
  }): IScrollBarWidth;
7
7
  export declare function getCurrFixedCols(config: IGridConfig, split: Split.left | Split.right): import("../types").ICol[];
8
+ /**
9
+ * Number of header rows. `aria-rowindex` is a position within the whole grid,
10
+ * so header rows occupy the first indices and body rows are offset by this.
11
+ */
12
+ export declare function getHeaderRowCount(config: IGridConfig | IRendererConfig): number;
13
+ /** Number of footer rows; they are the last rows of the grid for `aria-rowcount`. */
14
+ export declare function getFooterRowCount(config: IGridConfig | IRendererConfig): number;
8
15
  export declare function getNormalizeDateObject(item: string | Date, dateFormat: string): Date | null;
@@ -15,6 +15,9 @@ export declare class InputEditor implements IEditor {
15
15
  endEdit(withoutSave?: boolean): void;
16
16
  toHTML(value?: string | number): any;
17
17
  protected _initHandlers(): void;
18
+ private _setValidity;
19
+ private _isValueInvalid;
20
+ private _getRangeMessage;
18
21
  private _isValidWord;
19
22
  private _isCorrectRange;
20
23
  private _applyValuePattern;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dhtmlx/grid",
3
- "version": "9.3.10",
3
+ "version": "9.3.11",
4
4
  "description": "DHTMLX Grid - JavaScript data grid library. GPL v2 edition for GPL-compatible open-source projects; commercial licenses are available for proprietary and production use.",
5
5
  "keywords": ["dhtmlx","grid","datagrid","table","treegrid","data-table","javascript","typescript"],
6
6
  "homepage":"https://docs.dhtmlx.com/suite/grid/",
package/whatsnew.txt CHANGED
@@ -1,3 +1,31 @@
1
+ # Version 9.3.11 (September 14, 2026)
2
+
3
+ ### Updates
4
+
5
+ - Modal focus trapping and management:
6
+ - Implemented focus trapping for all modal windows, message dialogs, and popups compliant with **WCAG 2.4.3**.
7
+ - Opening a modal dialog moves keyboard focus to the first actionable element and keeps it within the dialog boundaries until the dialog closes.
8
+ - Closing a dialog restores focus to the previously active cell or trigger element.
9
+
10
+ - Assistive technology support for block selection:
11
+ - The Grid exposes the block selection state to screen readers (**WCAG 1.3.1**, **WCAG 4.1.2**).
12
+ - Selected cell boundaries and multi-cell ranges reflect their `aria-selected` status in the accessibility tree, providing real-time feedback during keyboard and pointer selection.
13
+
14
+ - Localization for ARIA labels:
15
+ - Moved all hardcoded English accessible names and labels into the locale system.
16
+ - Screen reader announcements, button descriptions, and status labels that developers can translate via the standard localization configuration.
17
+
18
+ - Target size improvements for interactive controls:
19
+ - Enlarged hit areas for small interactive elements, including column resize handles and removal/action icons.
20
+ - Reduced accidental or missed clicks on touch-screen devices, accommodating users with motor precision needs.
21
+
22
+ ### Fixes
23
+
24
+ - Fixed a console error that occurred when starting block selection in numeric columns or number-formatted cell ranges
25
+ - Fixed broken `aria-labelledby` relationships in sub-rows, eliminating orphaned ID references
26
+ - Corrected invalid ARIA attributes and roles, and fixed the `aria-rowindex` and `aria-rowcount` calculations so that they reflect the overall grid structure, including header rows
27
+ - Fixed an issue where inline cell editors lost or failed to expose their accessible names on the first paint and on subsequent data updates
28
+
1
29
  # Version 9.3.10 (August 19, 2026)
2
30
 
3
31
  ### Fixes