@salt-ds/data-grid 1.0.3 → 1.0.4-alpha.1

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.
Files changed (103) hide show
  1. package/dist-cjs/packages/grid/src/BaseCell.css.js +1 -1
  2. package/dist-cjs/packages/grid/src/BaseCell.js +35 -3
  3. package/dist-cjs/packages/grid/src/BaseCell.js.map +1 -1
  4. package/dist-cjs/packages/grid/src/ColumnSortContext.js +20 -0
  5. package/dist-cjs/packages/grid/src/ColumnSortContext.js.map +1 -0
  6. package/dist-cjs/packages/grid/src/Grid.js +211 -128
  7. package/dist-cjs/packages/grid/src/Grid.js.map +1 -1
  8. package/dist-cjs/packages/grid/src/GridColumn.js +1 -1
  9. package/dist-cjs/packages/grid/src/GridColumn.js.map +1 -1
  10. package/dist-cjs/packages/grid/src/HeaderCell.css.js +1 -1
  11. package/dist-cjs/packages/grid/src/HeaderCell.js +66 -2
  12. package/dist-cjs/packages/grid/src/HeaderCell.js.map +1 -1
  13. package/dist-cjs/packages/grid/src/NumericColumn.js +12 -0
  14. package/dist-cjs/packages/grid/src/NumericColumn.js.map +1 -1
  15. package/dist-cjs/packages/grid/src/RowSelectionCheckboxCellValue.js +2 -2
  16. package/dist-cjs/packages/grid/src/RowSelectionCheckboxCellValue.js.map +1 -1
  17. package/dist-cjs/packages/grid/src/RowSelectionCheckboxColumn.js +14 -7
  18. package/dist-cjs/packages/grid/src/RowSelectionCheckboxColumn.js.map +1 -1
  19. package/dist-cjs/packages/grid/src/RowSelectionCheckboxHeaderCellValue.js +2 -2
  20. package/dist-cjs/packages/grid/src/RowSelectionCheckboxHeaderCellValue.js.map +1 -1
  21. package/dist-cjs/packages/grid/src/RowSelectionRadioCellValue.js +2 -2
  22. package/dist-cjs/packages/grid/src/RowSelectionRadioCellValue.js.map +1 -1
  23. package/dist-cjs/packages/grid/src/RowSelectionRadioColumn.js +11 -7
  24. package/dist-cjs/packages/grid/src/RowSelectionRadioColumn.js.map +1 -1
  25. package/dist-cjs/packages/grid/src/RowSelectionRadioHeaderCell.js +2 -2
  26. package/dist-cjs/packages/grid/src/RowSelectionRadioHeaderCell.js.map +1 -1
  27. package/dist-cjs/packages/grid/src/RowValidationStatus.js +13 -0
  28. package/dist-cjs/packages/grid/src/RowValidationStatus.js.map +1 -0
  29. package/dist-cjs/packages/grid/src/TextCellEditor.js +12 -0
  30. package/dist-cjs/packages/grid/src/TextCellEditor.js.map +1 -1
  31. package/dist-cjs/packages/grid/src/index.js +1 -0
  32. package/dist-cjs/packages/grid/src/index.js.map +1 -1
  33. package/dist-cjs/packages/grid/src/internal/Cell.css.js +1 -1
  34. package/dist-cjs/packages/grid/src/internal/CellStatusIcons.js +46 -0
  35. package/dist-cjs/packages/grid/src/internal/CellStatusIcons.js.map +1 -0
  36. package/dist-cjs/packages/grid/src/internal/LeftPart.js +4 -2
  37. package/dist-cjs/packages/grid/src/internal/LeftPart.js.map +1 -1
  38. package/dist-cjs/packages/grid/src/internal/MiddlePart.js +4 -2
  39. package/dist-cjs/packages/grid/src/internal/MiddlePart.js.map +1 -1
  40. package/dist-cjs/packages/grid/src/internal/RightPart.js +4 -2
  41. package/dist-cjs/packages/grid/src/internal/RightPart.js.map +1 -1
  42. package/dist-cjs/packages/grid/src/internal/TableBody.js +11 -4
  43. package/dist-cjs/packages/grid/src/internal/TableBody.js.map +1 -1
  44. package/dist-cjs/packages/grid/src/internal/TableRow.css.js +1 -1
  45. package/dist-cjs/packages/grid/src/internal/TableRow.js +33 -12
  46. package/dist-cjs/packages/grid/src/internal/TableRow.js.map +1 -1
  47. package/dist-es/packages/grid/src/BaseCell.css.js +1 -1
  48. package/dist-es/packages/grid/src/BaseCell.js +35 -3
  49. package/dist-es/packages/grid/src/BaseCell.js.map +1 -1
  50. package/dist-es/packages/grid/src/ColumnSortContext.js +15 -0
  51. package/dist-es/packages/grid/src/ColumnSortContext.js.map +1 -0
  52. package/dist-es/packages/grid/src/Grid.js +211 -129
  53. package/dist-es/packages/grid/src/Grid.js.map +1 -1
  54. package/dist-es/packages/grid/src/GridColumn.js +1 -1
  55. package/dist-es/packages/grid/src/GridColumn.js.map +1 -1
  56. package/dist-es/packages/grid/src/HeaderCell.css.js +1 -1
  57. package/dist-es/packages/grid/src/HeaderCell.js +66 -2
  58. package/dist-es/packages/grid/src/HeaderCell.js.map +1 -1
  59. package/dist-es/packages/grid/src/NumericColumn.js +12 -0
  60. package/dist-es/packages/grid/src/NumericColumn.js.map +1 -1
  61. package/dist-es/packages/grid/src/RowSelectionCheckboxCellValue.js +2 -2
  62. package/dist-es/packages/grid/src/RowSelectionCheckboxCellValue.js.map +1 -1
  63. package/dist-es/packages/grid/src/RowSelectionCheckboxColumn.js +14 -7
  64. package/dist-es/packages/grid/src/RowSelectionCheckboxColumn.js.map +1 -1
  65. package/dist-es/packages/grid/src/RowSelectionCheckboxHeaderCellValue.js +2 -2
  66. package/dist-es/packages/grid/src/RowSelectionCheckboxHeaderCellValue.js.map +1 -1
  67. package/dist-es/packages/grid/src/RowSelectionRadioCellValue.js +1 -1
  68. package/dist-es/packages/grid/src/RowSelectionRadioCellValue.js.map +1 -1
  69. package/dist-es/packages/grid/src/RowSelectionRadioColumn.js +11 -7
  70. package/dist-es/packages/grid/src/RowSelectionRadioColumn.js.map +1 -1
  71. package/dist-es/packages/grid/src/RowSelectionRadioHeaderCell.js +1 -1
  72. package/dist-es/packages/grid/src/RowSelectionRadioHeaderCell.js.map +1 -1
  73. package/dist-es/packages/grid/src/RowValidationStatus.js +9 -0
  74. package/dist-es/packages/grid/src/RowValidationStatus.js.map +1 -0
  75. package/dist-es/packages/grid/src/TextCellEditor.js +12 -0
  76. package/dist-es/packages/grid/src/TextCellEditor.js.map +1 -1
  77. package/dist-es/packages/grid/src/index.js +1 -1
  78. package/dist-es/packages/grid/src/internal/Cell.css.js +1 -1
  79. package/dist-es/packages/grid/src/internal/CellStatusIcons.js +40 -0
  80. package/dist-es/packages/grid/src/internal/CellStatusIcons.js.map +1 -0
  81. package/dist-es/packages/grid/src/internal/LeftPart.js +4 -2
  82. package/dist-es/packages/grid/src/internal/LeftPart.js.map +1 -1
  83. package/dist-es/packages/grid/src/internal/MiddlePart.js +4 -2
  84. package/dist-es/packages/grid/src/internal/MiddlePart.js.map +1 -1
  85. package/dist-es/packages/grid/src/internal/RightPart.js +4 -2
  86. package/dist-es/packages/grid/src/internal/RightPart.js.map +1 -1
  87. package/dist-es/packages/grid/src/internal/TableBody.js +11 -4
  88. package/dist-es/packages/grid/src/internal/TableBody.js.map +1 -1
  89. package/dist-es/packages/grid/src/internal/TableRow.css.js +1 -1
  90. package/dist-es/packages/grid/src/internal/TableRow.js +33 -12
  91. package/dist-es/packages/grid/src/internal/TableRow.js.map +1 -1
  92. package/dist-es/packages/grid/src/internal/gridHooks.js +1 -1
  93. package/dist-types/ColumnSortContext.d.ts +12 -0
  94. package/dist-types/Grid.d.ts +7 -1
  95. package/dist-types/GridColumn.d.ts +54 -2
  96. package/dist-types/RowValidationStatus.d.ts +7 -0
  97. package/dist-types/internal/CellStatusIcons.d.ts +4 -0
  98. package/dist-types/internal/LeftPart.d.ts +2 -0
  99. package/dist-types/internal/MiddlePart.d.ts +2 -0
  100. package/dist-types/internal/RightPart.d.ts +2 -0
  101. package/dist-types/internal/TableBody.d.ts +2 -0
  102. package/dist-types/internal/TableRow.d.ts +2 -1
  103. package/package.json +6 -4
@@ -1 +1 @@
1
- {"version":3,"file":"TableRow.js","sources":["../src/internal/TableRow.tsx"],"sourcesContent":["import {\n Children,\n cloneElement,\n isValidElement,\n MouseEventHandler,\n} from \"react\";\nimport \"./TableRow.css\";\nimport { BaseCell } from \"../BaseCell\";\nimport { makePrefixer } from \"@salt-ds/core\";\nimport { clsx } from \"clsx\";\nimport { GridColumnModel, GridRowModel } from \"../Grid\";\nimport { FakeCell } from \"./FakeCell\";\nimport { DefaultCellValue } from \"./DefaultCellValue\";\nimport { useGridContext } from \"../GridContext\";\n\nconst withBaseName = makePrefixer(\"saltGridTableRow\");\n\nexport interface TableRowProps<T> {\n row: GridRowModel<T>;\n isSelected?: boolean; // Render selected background and the bottom border. Top border is rendered by the previous row (it gets isFollowedBySelected = true)\n isFollowedBySelected?: boolean; // Next row is selected. Render the bottom border.\n isHoverOver?: boolean;\n zebra?: boolean;\n columns: GridColumnModel<T>[];\n cursorColIdx?: number;\n onMouseEnter?: MouseEventHandler<HTMLTableRowElement>;\n onMouseLeave?: MouseEventHandler<HTMLTableRowElement>;\n gap?: number;\n editorColIdx?: number;\n isCellSelected?: (rowIdx: number, colIdx: number) => boolean;\n headerIsFocusable?: boolean;\n}\n\nexport function TableRow<T>(props: TableRowProps<T>) {\n const {\n row,\n isSelected,\n isFollowedBySelected,\n zebra,\n isHoverOver,\n columns,\n onMouseEnter,\n onMouseLeave,\n cursorColIdx,\n gap,\n editorColIdx,\n isCellSelected,\n headerIsFocusable,\n } = props;\n\n const grid = useGridContext();\n\n if (!row.key) {\n throw new Error(`Invalid row`);\n }\n\n const ariaRowIndex = headerIsFocusable ? row.index + 2 : row.index + 1;\n\n return (\n <tr\n aria-rowindex={ariaRowIndex}\n aria-selected={isSelected ? true : undefined}\n className={clsx(withBaseName(), {\n [withBaseName(\"zebra\")]: zebra,\n [withBaseName(\"hover\")]: isHoverOver,\n [withBaseName(\"selected\")]: isSelected,\n [withBaseName(\"followedBySelected\")]:\n isFollowedBySelected && !isSelected,\n [withBaseName(\"first\")]: row.index === 0,\n })}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n data-row-index={row.index}\n data-row-key={row.key}\n role=\"row\"\n >\n {columns.map((column, i) => {\n const colKey = column.info.props.id;\n const editorInfo = grid.getEditor(column.info.props.id);\n const isEditable = !!editorInfo;\n\n if (editorColIdx === column.index) {\n if (isEditable) {\n if (isValidElement(editorInfo.children)) {\n const editorElement = Children.only(editorInfo.children);\n return cloneElement(editorElement, {\n key: colKey,\n row,\n column,\n } as any);\n }\n }\n }\n\n const Cell = column.info.props.cellComponent || BaseCell;\n const CellValue =\n column.info.props.cellValueComponent || DefaultCellValue;\n const value =\n column.info.props.getValue && row.data\n ? column.info.props.getValue(row.data)\n : null;\n const isFocused = cursorColIdx === column.index;\n const isSelected =\n isCellSelected && isCellSelected(row.index, column.index);\n\n return (\n <Cell\n key={colKey}\n row={row}\n column={column}\n isFocused={isFocused}\n isSelected={isSelected}\n isEditable={isEditable}\n >\n <CellValue\n column={column}\n row={row}\n value={value}\n isFocused={isFocused}\n />\n </Cell>\n );\n })}\n {gap !== undefined && gap > 0 ? <FakeCell row={row} /> : null}\n </tr>\n );\n}\n"],"names":["isSelected"],"mappings":"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"}
1
+ {"version":3,"file":"TableRow.js","sources":["../src/internal/TableRow.tsx"],"sourcesContent":["import {\n Children,\n cloneElement,\n isValidElement,\n MouseEventHandler,\n} from \"react\";\nimport \"./TableRow.css\";\nimport { BaseCell } from \"../BaseCell\";\nimport { makePrefixer } from \"@salt-ds/core\";\nimport { clsx } from \"clsx\";\nimport { GridColumnModel, GridRowModel } from \"../Grid\";\nimport { FakeCell } from \"./FakeCell\";\nimport { DefaultCellValue } from \"./DefaultCellValue\";\nimport { useGridContext } from \"../GridContext\";\nimport { CellValidationState } from \"../GridColumn\";\nimport { RowValidationStatusContext } from \"../RowValidationStatus\";\n\nconst withBaseName = makePrefixer(\"saltGridTableRow\");\n\nexport interface TableRowProps<T> {\n row: GridRowModel<T>;\n isSelected?: boolean;\n isHoverOver?: boolean;\n zebra?: boolean;\n columns: GridColumnModel<T>[];\n cursorColIdx?: number;\n onMouseEnter?: MouseEventHandler<HTMLTableRowElement>;\n onMouseLeave?: MouseEventHandler<HTMLTableRowElement>;\n gap?: number;\n editorColIdx?: number;\n isCellSelected?: (rowIdx: number, colIdx: number) => boolean;\n headerIsFocusable?: boolean;\n validationStatus?: CellValidationState;\n}\n\nexport function TableRow<T>(props: TableRowProps<T>) {\n const {\n row,\n isSelected,\n zebra,\n isHoverOver,\n columns,\n onMouseEnter,\n onMouseLeave,\n cursorColIdx,\n gap,\n editorColIdx,\n isCellSelected,\n headerIsFocusable,\n validationStatus: rowValidationStatus,\n } = props;\n\n const grid = useGridContext();\n\n if (!row.key) {\n throw new Error(`Invalid row`);\n }\n\n const ariaRowIndex = headerIsFocusable ? row.index + 2 : row.index + 1;\n\n return (\n <tr\n aria-rowindex={ariaRowIndex}\n aria-selected={isSelected ? true : undefined}\n className={clsx(withBaseName(), {\n [withBaseName(\"zebra\")]: zebra,\n [withBaseName(\"hover\")]: isHoverOver,\n [withBaseName(\"selected\")]: isSelected,\n [withBaseName(\"first\")]: row.index === 0,\n [withBaseName(`validationStatus-${rowValidationStatus}`)]:\n rowValidationStatus,\n })}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n data-row-index={row.index}\n data-row-key={row.key}\n role=\"row\"\n >\n {columns.map((column, i) => {\n const colKey = column.info.props.id;\n const editorInfo = grid.getEditor(column.info.props.id);\n const isEditable = !!editorInfo;\n\n if (editorColIdx === column.index) {\n if (isEditable) {\n if (isValidElement(editorInfo.children)) {\n const editorElement = Children.only(editorInfo.children);\n return cloneElement(editorElement, {\n key: colKey,\n row,\n column,\n } as any);\n }\n }\n }\n\n const Cell = column.info.props.cellComponent || BaseCell;\n const CellValue =\n column.info.props.cellValueComponent || DefaultCellValue;\n const value =\n column.info.props.getValue && row.data\n ? column.info.props.getValue(row.data)\n : null;\n const isFocused = cursorColIdx === column.index;\n const isSelected =\n isCellSelected && isCellSelected(row.index, column.index);\n const validationFnArg = {\n row,\n column,\n isFocused,\n value,\n };\n const validationStatus =\n column.info.props.getValidationStatus?.(validationFnArg);\n const validationMessage =\n validationStatus &&\n column.info.props.getValidationMessage?.(validationFnArg);\n\n return (\n <RowValidationStatusContext.Provider\n value={{ status: rowValidationStatus }}\n >\n <Cell\n key={colKey}\n row={row}\n column={column}\n isFocused={isFocused}\n isSelected={isSelected}\n isEditable={isEditable}\n validationStatus={validationStatus}\n validationMessage={validationMessage}\n validationType={column.info.props.validationType}\n value={value}\n align={column.info.props.align}\n >\n <CellValue\n column={column}\n row={row}\n value={value}\n isFocused={isFocused}\n validationStatus={validationStatus}\n validationMessage={validationMessage}\n validationType={column.info.props.validationType}\n />\n </Cell>\n </RowValidationStatusContext.Provider>\n );\n })}\n {gap !== undefined && gap > 0 ? <FakeCell row={row} /> : null}\n </tr>\n );\n}\n"],"names":["isSelected"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { useRef, useState, useMemo, useCallback, useEffect, Children, isValidElement } from 'react';
1
+ import { useMemo, useCallback, useRef, useState, useEffect, Children, isValidElement } from 'react';
2
2
  import { NumberRange } from '../NumberRange.js';
3
3
  import { getAttribute, makeMapAdder, makeMapDeleter, getCellPosition } from './utils.js';
4
4
  import { useControlled } from '@salt-ds/core';
@@ -0,0 +1,12 @@
1
+ import React from "react";
2
+ import { SortOrder } from "./Grid";
3
+ import { GridColumnProps } from "./GridColumn";
4
+ export interface ColumnSortContext {
5
+ sortByColumnId?: GridColumnProps["id"];
6
+ setSortByColumnId: (c: React.SetStateAction<GridColumnProps["id"]>) => void;
7
+ sortOrder: SortOrder;
8
+ setSortOrder: (o: SortOrder) => void;
9
+ onClickSortColumn: (colHeaderId: GridColumnProps["id"]) => void;
10
+ }
11
+ export declare const ColumnSortContext: React.Context<ColumnSortContext | undefined>;
12
+ export declare const useColumnSortContext: () => ColumnSortContext;
@@ -1,5 +1,5 @@
1
1
  import { CSSProperties, ReactNode } from "react";
2
- import { GridColumnInfo } from "./GridColumn";
2
+ import { CellValidationState, GridColumnInfo } from "./GridColumn";
3
3
  import "./Grid.css";
4
4
  import { ColumnGroupProps } from "./ColumnGroup";
5
5
  export declare type ColumnSeparatorType = "regular" | "none" | "groupEdge" | "pinned";
@@ -7,6 +7,11 @@ export declare type ColumnGroupRowSeparatorType = "first" | "regular" | "last";
7
7
  export declare type ColumnGroupColumnSeparatorType = "regular" | "none" | "pinned";
8
8
  export declare type GridRowSelectionMode = "single" | "multi" | "none";
9
9
  export declare type GridCellSelectionMode = "range" | "none";
10
+ export declare enum SortOrder {
11
+ ASC = "asc",
12
+ DESC = "desc",
13
+ NONE = "none"
14
+ }
10
15
  export declare type RowKeyGetter<T> = (row: T, index: number) => string;
11
16
  export declare type GridColumnMoveHandler = (columnId: string, fromIndex: number, toIndex: number) => void;
12
17
  export interface GridProps<T = any> {
@@ -77,6 +82,7 @@ export interface GridProps<T = any> {
77
82
  * If `true`, keyboard navigation is enabled for the header.
78
83
  * */
79
84
  headerIsFocusable?: boolean;
85
+ getRowValidationStatus?: (row: GridRowModel<T>) => CellValidationState | undefined;
80
86
  }
81
87
  export interface GridRowModel<T> {
82
88
  key: string;
@@ -1,7 +1,9 @@
1
1
  import { ComponentType, CSSProperties, KeyboardEvent, ReactNode } from "react";
2
- import { GridColumnModel, GridRowModel } from "./Grid";
2
+ import { GridColumnModel, GridRowModel, SortOrder } from "./Grid";
3
3
  export declare type GridColumnPin = "left" | "right" | null;
4
- export interface GridCellProps<T> {
4
+ export declare type CellValidationState = "error" | "warning" | "success";
5
+ declare type CellValidationType = "strong" | "light";
6
+ export interface GridCellProps<T, U = any> {
5
7
  row: GridRowModel<T>;
6
8
  column: GridColumnModel<T>;
7
9
  className?: string;
@@ -10,12 +12,20 @@ export interface GridCellProps<T> {
10
12
  isSelected?: boolean;
11
13
  isEditable?: boolean;
12
14
  children?: ReactNode;
15
+ align?: GridColumnProps["align"];
16
+ value?: U;
17
+ validationStatus?: CellValidationState;
18
+ validationMessage?: string;
19
+ validationType?: CellValidationType;
13
20
  }
14
21
  export interface GridCellValueProps<T, U = any> {
15
22
  row: GridRowModel<T>;
16
23
  column: GridColumnModel<T>;
17
24
  isFocused?: boolean;
18
25
  value?: U;
26
+ validationStatus?: CellValidationState;
27
+ validationMessage?: string;
28
+ validationType?: CellValidationType;
19
29
  }
20
30
  export interface HeaderCellProps<T> {
21
31
  column: GridColumnModel<T>;
@@ -35,6 +45,26 @@ export interface GridColumnProps<T = any> {
35
45
  * Unique identifier of the column.
36
46
  * */
37
47
  id: string;
48
+ /**
49
+ * Enables sorting (by sort order: `asc | desc | none`) for the column.
50
+ * To enable column header's keyboard navigation on sort,
51
+ * users need to set `headerIsFocusable` prop to `true` in Grid component.
52
+ * To customise how GridColumn data sorts, use also `customSort` or `onSortOrderChanged`.
53
+ * */
54
+ sortable?: boolean;
55
+ /**
56
+ * Custom sorting function. Use for client side sorting.
57
+ * */
58
+ customSort?: (args: {
59
+ rowData: T[];
60
+ sortOrder: SortOrder;
61
+ }) => T[];
62
+ /**
63
+ * Exposes GridColumn sort order. Use for server side sorting.
64
+ * */
65
+ onSortOrderChange?: (args: {
66
+ sortOrder: SortOrder;
67
+ }) => void;
38
68
  /**
39
69
  * Name is displayed on the column header by default.
40
70
  * */
@@ -77,6 +107,23 @@ export interface GridColumnProps<T = any> {
77
107
  * for the given row data item.
78
108
  * */
79
109
  getValue?: (rowData: T) => any;
110
+ /**
111
+ * Cell validation status getter. Should return one of the known validation status names: "none" | "error" | "warning"
112
+ * If you require a custom validation status, you can achieve that by providing a custom cell component.
113
+ * */
114
+ getValidationStatus?: (value: GridCellValueProps<T>) => CellValidationState | undefined;
115
+ /**
116
+ * Cell validation status message getter. Should return a string description of the validation state that can be used for the screen reader.
117
+ * This prop is optional but if you don't provide a function a default message will be used.
118
+ * */
119
+ getValidationMessage?: (value: GridCellValueProps<T>) => string | undefined;
120
+ /**
121
+ * Cell validation type. Determines the visual style of the validation. The available values are "strong" and "light". Strong will display the icon
122
+ * along side the background and border. Light will only affect border and background. Use light if you are validation the whole row, and optionally
123
+ * strong on one of the columns, and strong if you are validating user input on a particular cell.
124
+ * The default value is "light".
125
+ * */
126
+ validationType?: GridCellProps<T>["validationType"];
80
127
  /**
81
128
  * CSS class to be applied to the column header.
82
129
  * Useful for minor customizations
@@ -104,6 +151,10 @@ export interface GridColumnProps<T = any> {
104
151
  * Children is optional, and accepts non-rendered elements i.e. `CellEditor`
105
152
  */
106
153
  children?: ReactNode;
154
+ /**
155
+ * aria-label is optional, and accepts any string value
156
+ */
157
+ "aria-label"?: string;
107
158
  }
108
159
  export interface GridColumnInfo<T> {
109
160
  width: number;
@@ -111,3 +162,4 @@ export interface GridColumnInfo<T> {
111
162
  props: GridColumnProps<T>;
112
163
  }
113
164
  export declare const GridColumn: <T = any>(props: GridColumnProps<T>) => JSX.Element;
165
+ export {};
@@ -0,0 +1,7 @@
1
+ /// <reference types="react" />
2
+ import { CellValidationState, GridColumnProps } from "./GridColumn";
3
+ export declare const RowValidationStatusContext: import("react").Context<{
4
+ status?: CellValidationState | undefined;
5
+ }>;
6
+ export declare type RowValidationStatusColumnProps<T> = Omit<GridColumnProps<T>, "width" | "name">;
7
+ export declare function RowValidationStatusColumn<T>(props: RowValidationStatusColumnProps<T>): JSX.Element;
@@ -0,0 +1,4 @@
1
+ /// <reference types="react" />
2
+ export declare const CellWarningIcon: JSX.Element;
3
+ export declare const CellErrorIcon: JSX.Element;
4
+ export declare const CellSuccessIcon: JSX.Element;
@@ -1,6 +1,7 @@
1
1
  import { RefObject } from "react";
2
2
  import "./LeftPart.css";
3
3
  import { GridColumnModel, GridRowModel } from "../Grid";
4
+ import { CellValidationState } from "../GridColumn";
4
5
  export interface LeftPartProps<T> {
5
6
  leftRef: RefObject<HTMLDivElement>;
6
7
  onWheel: EventListener;
@@ -10,5 +11,6 @@ export interface LeftPartProps<T> {
10
11
  hoverOverRowKey?: string;
11
12
  setHoverOverRowKey: (key: string | undefined) => void;
12
13
  zebra?: boolean;
14
+ getRowValidationStatus?: (row: GridRowModel<T>) => CellValidationState | undefined;
13
15
  }
14
16
  export declare function LeftPart<T>(props: LeftPartProps<T>): JSX.Element | null;
@@ -1,6 +1,7 @@
1
1
  import { RefObject } from "react";
2
2
  import "./MiddlePart.css";
3
3
  import { GridColumnModel, GridRowModel } from "../Grid";
4
+ import { CellValidationState } from "../GridColumn";
4
5
  export interface MiddlePartProps<T> {
5
6
  middleRef: RefObject<HTMLDivElement>;
6
7
  onWheel: EventListener;
@@ -10,5 +11,6 @@ export interface MiddlePartProps<T> {
10
11
  setHoverOverRowKey: (key: string | undefined) => void;
11
12
  midGap: number;
12
13
  zebra?: boolean;
14
+ getRowValidationStatus?: (row: GridRowModel<T>) => CellValidationState | undefined;
13
15
  }
14
16
  export declare function MiddlePart<T>(props: MiddlePartProps<T>): JSX.Element;
@@ -1,6 +1,7 @@
1
1
  import { RefObject } from "react";
2
2
  import "./RightPart.css";
3
3
  import { GridColumnModel, GridRowModel } from "../Grid";
4
+ import { CellValidationState } from "../GridColumn";
4
5
  export interface RightPartProps<T> {
5
6
  rightRef: RefObject<HTMLDivElement>;
6
7
  onWheel: EventListener;
@@ -10,5 +11,6 @@ export interface RightPartProps<T> {
10
11
  hoverOverRowKey?: string;
11
12
  setHoverOverRowKey: (key: string | undefined) => void;
12
13
  zebra?: boolean;
14
+ getRowValidationStatus?: (row: GridRowModel<T>) => CellValidationState | undefined;
13
15
  }
14
16
  export declare function RightPart<T>(props: RightPartProps<T>): JSX.Element | null;
@@ -1,5 +1,6 @@
1
1
  /// <reference types="react" />
2
2
  import { GridColumnModel, GridRowModel } from "../Grid";
3
+ import { CellValidationState } from "../GridColumn";
3
4
  export interface TableBodyProps<T> {
4
5
  columns: GridColumnModel<T>[];
5
6
  rows: GridRowModel<T>[];
@@ -7,5 +8,6 @@ export interface TableBodyProps<T> {
7
8
  setHoverRowKey: (key: string | undefined) => void;
8
9
  gap?: number;
9
10
  zebra?: boolean;
11
+ getRowValidationStatus?: (row: GridRowModel<T>) => CellValidationState | undefined;
10
12
  }
11
13
  export declare function TableBody<T>(props: TableBodyProps<T>): JSX.Element;
@@ -1,10 +1,10 @@
1
1
  import { MouseEventHandler } from "react";
2
2
  import "./TableRow.css";
3
3
  import { GridColumnModel, GridRowModel } from "../Grid";
4
+ import { CellValidationState } from "../GridColumn";
4
5
  export interface TableRowProps<T> {
5
6
  row: GridRowModel<T>;
6
7
  isSelected?: boolean;
7
- isFollowedBySelected?: boolean;
8
8
  isHoverOver?: boolean;
9
9
  zebra?: boolean;
10
10
  columns: GridColumnModel<T>[];
@@ -15,5 +15,6 @@ export interface TableRowProps<T> {
15
15
  editorColIdx?: number;
16
16
  isCellSelected?: (rowIdx: number, colIdx: number) => boolean;
17
17
  headerIsFocusable?: boolean;
18
+ validationStatus?: CellValidationState;
18
19
  }
19
20
  export declare function TableRow<T>(props: TableRowProps<T>): JSX.Element;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@salt-ds/data-grid",
3
- "version": "1.0.3",
3
+ "version": "1.0.4-alpha.1",
4
4
  "license": "Apache-2.0",
5
5
  "main": "dist-cjs/packages/grid/src/index.js",
6
6
  "sideEffects": [
@@ -18,14 +18,16 @@
18
18
  }
19
19
  },
20
20
  "publishConfig": {
21
- "directory": "../../dist/salt-ds-data-grid"
21
+ "directory": "../../dist/salt-ds-data-grid",
22
+ "tag": "next"
22
23
  },
23
24
  "module": "dist-es/packages/grid/src/index.js",
24
25
  "typings": "dist-types/index.d.ts",
25
26
  "dependencies": {
26
27
  "clsx": "^1.2.1",
27
- "@salt-ds/core": "1.4.0",
28
- "@salt-ds/lab": "1.0.0-alpha.4"
28
+ "@salt-ds/core": "1.6.0",
29
+ "@salt-ds/icons": "1.3.0",
30
+ "@salt-ds/lab": "1.0.0-alpha.6"
29
31
  },
30
32
  "files": [
31
33
  "dist-cjs",