@salt-ds/data-grid 1.0.4-alpha.0 → 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 (79) 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 +208 -126
  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/RowSelectionCheckboxColumn.js +14 -7
  14. package/dist-cjs/packages/grid/src/RowSelectionCheckboxColumn.js.map +1 -1
  15. package/dist-cjs/packages/grid/src/RowSelectionRadioColumn.js +11 -7
  16. package/dist-cjs/packages/grid/src/RowSelectionRadioColumn.js.map +1 -1
  17. package/dist-cjs/packages/grid/src/RowValidationStatus.js +13 -0
  18. package/dist-cjs/packages/grid/src/RowValidationStatus.js.map +1 -0
  19. package/dist-cjs/packages/grid/src/index.js +1 -0
  20. package/dist-cjs/packages/grid/src/index.js.map +1 -1
  21. package/dist-cjs/packages/grid/src/internal/Cell.css.js +1 -1
  22. package/dist-cjs/packages/grid/src/internal/CellStatusIcons.js +46 -0
  23. package/dist-cjs/packages/grid/src/internal/CellStatusIcons.js.map +1 -0
  24. package/dist-cjs/packages/grid/src/internal/LeftPart.js +4 -2
  25. package/dist-cjs/packages/grid/src/internal/LeftPart.js.map +1 -1
  26. package/dist-cjs/packages/grid/src/internal/MiddlePart.js +4 -2
  27. package/dist-cjs/packages/grid/src/internal/MiddlePart.js.map +1 -1
  28. package/dist-cjs/packages/grid/src/internal/RightPart.js +4 -2
  29. package/dist-cjs/packages/grid/src/internal/RightPart.js.map +1 -1
  30. package/dist-cjs/packages/grid/src/internal/TableBody.js +11 -4
  31. package/dist-cjs/packages/grid/src/internal/TableBody.js.map +1 -1
  32. package/dist-cjs/packages/grid/src/internal/TableRow.css.js +1 -1
  33. package/dist-cjs/packages/grid/src/internal/TableRow.js +33 -12
  34. package/dist-cjs/packages/grid/src/internal/TableRow.js.map +1 -1
  35. package/dist-es/packages/grid/src/BaseCell.css.js +1 -1
  36. package/dist-es/packages/grid/src/BaseCell.js +35 -3
  37. package/dist-es/packages/grid/src/BaseCell.js.map +1 -1
  38. package/dist-es/packages/grid/src/ColumnSortContext.js +15 -0
  39. package/dist-es/packages/grid/src/ColumnSortContext.js.map +1 -0
  40. package/dist-es/packages/grid/src/Grid.js +208 -127
  41. package/dist-es/packages/grid/src/Grid.js.map +1 -1
  42. package/dist-es/packages/grid/src/GridColumn.js +1 -1
  43. package/dist-es/packages/grid/src/GridColumn.js.map +1 -1
  44. package/dist-es/packages/grid/src/HeaderCell.css.js +1 -1
  45. package/dist-es/packages/grid/src/HeaderCell.js +66 -2
  46. package/dist-es/packages/grid/src/HeaderCell.js.map +1 -1
  47. package/dist-es/packages/grid/src/RowSelectionCheckboxColumn.js +14 -7
  48. package/dist-es/packages/grid/src/RowSelectionCheckboxColumn.js.map +1 -1
  49. package/dist-es/packages/grid/src/RowSelectionRadioColumn.js +11 -7
  50. package/dist-es/packages/grid/src/RowSelectionRadioColumn.js.map +1 -1
  51. package/dist-es/packages/grid/src/RowValidationStatus.js +9 -0
  52. package/dist-es/packages/grid/src/RowValidationStatus.js.map +1 -0
  53. package/dist-es/packages/grid/src/index.js +1 -1
  54. package/dist-es/packages/grid/src/internal/Cell.css.js +1 -1
  55. package/dist-es/packages/grid/src/internal/CellStatusIcons.js +40 -0
  56. package/dist-es/packages/grid/src/internal/CellStatusIcons.js.map +1 -0
  57. package/dist-es/packages/grid/src/internal/LeftPart.js +4 -2
  58. package/dist-es/packages/grid/src/internal/LeftPart.js.map +1 -1
  59. package/dist-es/packages/grid/src/internal/MiddlePart.js +4 -2
  60. package/dist-es/packages/grid/src/internal/MiddlePart.js.map +1 -1
  61. package/dist-es/packages/grid/src/internal/RightPart.js +4 -2
  62. package/dist-es/packages/grid/src/internal/RightPart.js.map +1 -1
  63. package/dist-es/packages/grid/src/internal/TableBody.js +11 -4
  64. package/dist-es/packages/grid/src/internal/TableBody.js.map +1 -1
  65. package/dist-es/packages/grid/src/internal/TableRow.css.js +1 -1
  66. package/dist-es/packages/grid/src/internal/TableRow.js +33 -12
  67. package/dist-es/packages/grid/src/internal/TableRow.js.map +1 -1
  68. package/dist-es/packages/grid/src/internal/gridHooks.js +1 -1
  69. package/dist-types/ColumnSortContext.d.ts +12 -0
  70. package/dist-types/Grid.d.ts +7 -1
  71. package/dist-types/GridColumn.d.ts +54 -2
  72. package/dist-types/RowValidationStatus.d.ts +7 -0
  73. package/dist-types/internal/CellStatusIcons.d.ts +4 -0
  74. package/dist-types/internal/LeftPart.d.ts +2 -0
  75. package/dist-types/internal/MiddlePart.d.ts +2 -0
  76. package/dist-types/internal/RightPart.d.ts +2 -0
  77. package/dist-types/internal/TableBody.d.ts +2 -0
  78. package/dist-types/internal/TableRow.d.ts +2 -1
  79. package/package.json +4 -3
@@ -2,7 +2,7 @@
2
2
 
3
3
  var styleInject_es = require('../../../node_modules/style-inject/dist/style-inject.es.js');
4
4
 
5
- var css_248z = ".saltGridBaseCell-valueContainer {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n box-sizing: border-box;\n overflow: hidden;\n text-overflow: ellipsis;\n line-height: calc(var(--grid-row-height) - 2px);\n border-style: solid;\n border-width: 1px;\n border-color: transparent;\n --grid-cell-padding: 0 calc(var(--grid-padding) - 1px);\n}\n\n.saltGridCell-editable .saltGridBaseCell-valueContainer {\n border-style: solid;\n border-width: 1px;\n border-color: var(--grid-editableCell-borderColor);\n}\n\n.saltGridCell-editable:hover .saltGridBaseCell-valueContainer {\n border-color: var(--grid-editableCell-borderColor-hover);\n}\n\n.saltGridCell-editable:focus .saltGridBaseCell-valueContainer {\n border-color: transparent;\n}\n";
5
+ var css_248z = ".saltGridBaseCell-valueContainer {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n box-sizing: border-box;\n overflow: hidden;\n text-overflow: ellipsis;\n line-height: calc(var(--grid-row-height) - 2px);\n border-style: solid;\n border-width: 1px;\n border-color: transparent;\n --grid-cell-padding: 0 calc(var(--grid-padding) - 1px);\n}\n\n.saltGridCell-editable .saltGridBaseCell-valueContainer {\n border-style: solid;\n border-width: 1px;\n border-color: var(--grid-editableCell-borderColor);\n}\n\n.saltGridCell-editable:hover .saltGridBaseCell-valueContainer {\n border-color: var(--grid-editableCell-borderColor-hover);\n}\n\n.saltGridCell-editable:focus .saltGridBaseCell-valueContainer {\n border-color: transparent;\n}\n\n.saltGridBaseCell-status-error {\n --status-border-color: var(--salt-status-error-borderColor);\n --status-background-color: var(--salt-status-error-background-emphasize);\n}\n\n.saltGridBaseCell-status-warning {\n --status-border-color: var(--salt-status-warning-borderColor);\n --status-background-color: var(--salt-status-warning-background-emphasize);\n}\n\n.saltGridBaseCell-status-success {\n --status-border-color: var(--salt-status-success-borderColor);\n --status-background-color: var(--salt-status-success-background-emphasize);\n}\n\n.saltGridCell-editable .saltGridBaseCell-valueContainer {\n border-color: var(--status-border-color);\n}\n\n.saltGridBaseCell-hasValidation:focus .saltGridCursor {\n border-color: var(--status-border-color);\n}\n\n.saltGridBaseCell-hasValidation:focus .saltGridCornerTag-focusOnly {\n border-left-color: var(--status-border-color);\n}\n\n.saltGridBaseCell-valueContainer {\n background-color: var(--status-background-color);\n}\n\n.salt-density-high {\n --grid-statusIndicator-size: 5px;\n}\n\n.salt-density-medium {\n --grid-statusIndicator-size: 6px;\n}\n\n.salt-density-low {\n --grid-statusIndicator-size: 7px;\n}\n\n.salt-density-touch {\n --grid-statusIndicator-size: 9px;\n}\n\n.saltGridBaseCell-statusContainer {\n font-size: var(--saltGrid-statusIndicator-size, var(--grid-statusIndicator-size));\n position: absolute;\n bottom: 3px;\n right: 3px;\n}\n\n.saltGridBaseCell-statusContainer svg {\n display: block;\n fill: var(--status-border-color);\n}\n\n.saltGridBaseCell-statusContainer.saltGridBaseCell-statusContainer-align-right {\n right: auto;\n left: 3px;\n}\n";
6
6
  styleInject_es(css_248z);
7
7
 
8
8
  module.exports = css_248z;
@@ -27,11 +27,17 @@ require('./internal/TopRightPart.js');
27
27
  require('./internal/FakeCell.css.js');
28
28
  require('./internal/DefaultCellValue.js');
29
29
  var CornerTag = require('./CornerTag.js');
30
+ var CellStatusIcons = require('./internal/CellStatusIcons.js');
30
31
 
31
32
  const withBaseName = core.makePrefixer("saltGridBaseCell");
32
33
  function getCellId(rowKey, column) {
33
34
  return `R${rowKey}C${column.info.props.id}`;
34
35
  }
36
+ const icons = {
37
+ warning: CellStatusIcons.CellWarningIcon,
38
+ error: CellStatusIcons.CellErrorIcon,
39
+ success: CellStatusIcons.CellSuccessIcon
40
+ };
35
41
  function BaseCell(props) {
36
42
  const {
37
43
  column,
@@ -41,12 +47,20 @@ function BaseCell(props) {
41
47
  isFocused,
42
48
  isSelected,
43
49
  isEditable,
44
- children
50
+ children,
51
+ validationStatus,
52
+ validationMessage,
53
+ validationType = "light",
54
+ align
45
55
  } = props;
46
56
  const { ref, isFocusableContent, onFocus } = gridHooks.useFocusableContent();
57
+ const cellId = getCellId(row.key, column);
58
+ const hasValidation = !!validationStatus;
59
+ const hasValidationMessage = !!validationMessage || hasValidation;
60
+ const validationMessageId = `${cellId}-statusMessage`;
47
61
  return /* @__PURE__ */ jsxRuntime.jsxs(Cell.Cell, {
48
62
  ref,
49
- id: getCellId(row.key, column),
63
+ id: cellId,
50
64
  "data-row-index": row.index,
51
65
  "data-column-index": column.index,
52
66
  "data-testid": isFocused ? "grid-cell-focused" : void 0,
@@ -55,15 +69,33 @@ function BaseCell(props) {
55
69
  separator: column.separator,
56
70
  isSelected,
57
71
  isEditable,
58
- className,
72
+ className: clsx.clsx(className, {
73
+ [withBaseName("hasValidation")]: hasValidation,
74
+ [withBaseName(`status-${validationStatus}`)]: validationStatus
75
+ }),
59
76
  style,
60
77
  tabIndex: isFocused && !isFocusableContent ? 0 : -1,
61
78
  onFocus,
79
+ "aria-invalid": validationStatus === "error" || void 0,
80
+ "aria-describedby": hasValidationMessage ? validationMessageId : void 0,
62
81
  children: [
82
+ hasValidationMessage ? /* @__PURE__ */ jsxRuntime.jsx("div", {
83
+ id: validationMessageId,
84
+ className: "salt-visuallyHidden",
85
+ "aria-hidden": true,
86
+ role: "status",
87
+ children: validationMessage ? validationMessage : `Cell validation state is ${validationStatus}`
88
+ }) : null,
63
89
  /* @__PURE__ */ jsxRuntime.jsx("div", {
64
90
  className: clsx.clsx(withBaseName("valueContainer")),
65
91
  children
66
92
  }),
93
+ hasValidation && validationType === "strong" ? /* @__PURE__ */ jsxRuntime.jsx("div", {
94
+ className: clsx.clsx(withBaseName("statusContainer"), {
95
+ [withBaseName(`statusContainer-align-${align}`)]: align
96
+ }),
97
+ children: icons[validationStatus]
98
+ }) : null,
67
99
  isFocused && isEditable && /* @__PURE__ */ jsxRuntime.jsx(CornerTag.CornerTag, {
68
100
  focusOnly: true
69
101
  }),
@@ -1 +1 @@
1
- {"version":3,"file":"BaseCell.js","sources":["../src/BaseCell.tsx"],"sourcesContent":["import { clsx } from \"clsx\";\nimport \"./BaseCell.css\";\nimport { makePrefixer } from \"@salt-ds/core\";\nimport { GridCellProps } from \"./GridColumn\";\nimport { GridColumnModel } from \"./Grid\";\nimport { Cell, Cursor, useFocusableContent } from \"./internal\";\nimport { CornerTag } from \"./CornerTag\";\n\nconst withBaseName = makePrefixer(\"saltGridBaseCell\");\n\nexport function getCellId<T>(rowKey: string, column: GridColumnModel<T>) {\n return `R${rowKey}C${column.info.props.id}`;\n}\n\n// Default component for grid cells. Provides selection, on-hover highlighting,\n// cursor etc.\nexport function BaseCell<T>(props: GridCellProps<T>) {\n const {\n column,\n className,\n row,\n style,\n isFocused,\n isSelected,\n isEditable,\n children,\n } = props;\n\n const { ref, isFocusableContent, onFocus } =\n useFocusableContent<HTMLTableCellElement>();\n\n return (\n <Cell\n ref={ref}\n id={getCellId(row.key, column)}\n data-row-index={row.index}\n data-column-index={column.index}\n data-testid={isFocused ? \"grid-cell-focused\" : undefined}\n // aria-colindex uses one-based array indexing\n aria-colindex={column.index + 1}\n role=\"gridcell\"\n separator={column.separator}\n isSelected={isSelected}\n isEditable={isEditable}\n className={className}\n style={style}\n tabIndex={isFocused && !isFocusableContent ? 0 : -1}\n onFocus={onFocus}\n >\n <div className={clsx(withBaseName(\"valueContainer\"))}>{children}</div>\n {isFocused && isEditable && <CornerTag focusOnly={true} />}\n {isFocused && !isFocusableContent && <Cursor />}\n </Cell>\n );\n}\n"],"names":["makePrefixer","useFocusableContent","jsxs","Cell","jsx","clsx","CornerTag","Cursor"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,MAAM,YAAA,GAAeA,kBAAa,kBAAkB,CAAA,CAAA;AAEpC,SAAA,SAAA,CAAa,QAAgB,MAA4B,EAAA;AACvE,EAAA,OAAO,CAAI,CAAA,EAAA,MAAA,CAAA,CAAA,EAAU,MAAO,CAAA,IAAA,CAAK,KAAM,CAAA,EAAA,CAAA,CAAA,CAAA;AACzC,CAAA;AAIO,SAAS,SAAY,KAAyB,EAAA;AACnD,EAAM,MAAA;AAAA,IACJ,MAAA;AAAA,IACA,SAAA;AAAA,IACA,GAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA;AAAA,GACE,GAAA,KAAA,CAAA;AAEJ,EAAA,MAAM,EAAE,GAAA,EAAK,kBAAoB,EAAA,OAAA,KAC/BC,6BAA0C,EAAA,CAAA;AAE5C,EAAA,uBACGC,eAAA,CAAAC,SAAA,EAAA;AAAA,IACC,GAAA;AAAA,IACA,EAAI,EAAA,SAAA,CAAU,GAAI,CAAA,GAAA,EAAK,MAAM,CAAA;AAAA,IAC7B,kBAAgB,GAAI,CAAA,KAAA;AAAA,IACpB,qBAAmB,MAAO,CAAA,KAAA;AAAA,IAC1B,aAAA,EAAa,YAAY,mBAAsB,GAAA,KAAA,CAAA;AAAA,IAE/C,eAAA,EAAe,OAAO,KAAQ,GAAA,CAAA;AAAA,IAC9B,IAAK,EAAA,UAAA;AAAA,IACL,WAAW,MAAO,CAAA,SAAA;AAAA,IAClB,UAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,QAAU,EAAA,SAAA,IAAa,CAAC,kBAAA,GAAqB,CAAI,GAAA,CAAA,CAAA;AAAA,IACjD,OAAA;AAAA,IAEA,QAAA,EAAA;AAAA,sBAACC,cAAA,CAAA,KAAA,EAAA;AAAA,QAAI,SAAW,EAAAC,SAAA,CAAK,YAAa,CAAA,gBAAgB,CAAC,CAAA;AAAA,QAAI,QAAA;AAAA,OAAS,CAAA;AAAA,MAC/D,SAAA,IAAa,8BAAeD,cAAA,CAAAE,mBAAA,EAAA;AAAA,QAAU,SAAW,EAAA,IAAA;AAAA,OAAM,CAAA;AAAA,MACvD,SAAa,IAAA,CAAC,kBAAsB,oBAAAF,cAAA,CAACG,aAAO,EAAA,EAAA,CAAA;AAAA,KAAA;AAAA,GAC/C,CAAA,CAAA;AAEJ;;;;;"}
1
+ {"version":3,"file":"BaseCell.js","sources":["../src/BaseCell.tsx"],"sourcesContent":["import { clsx } from \"clsx\";\nimport \"./BaseCell.css\";\nimport { makePrefixer } from \"@salt-ds/core\";\nimport { GridCellProps } from \"./GridColumn\";\nimport { GridColumnModel } from \"./Grid\";\nimport { Cell, Cursor, useFocusableContent } from \"./internal\";\nimport { CornerTag } from \"./CornerTag\";\nimport {\n CellErrorIcon,\n CellSuccessIcon,\n CellWarningIcon,\n} from \"./internal/CellStatusIcons\";\n\nconst withBaseName = makePrefixer(\"saltGridBaseCell\");\n\nexport function getCellId<T>(rowKey: string, column: GridColumnModel<T>) {\n return `R${rowKey}C${column.info.props.id}`;\n}\n\nconst icons = {\n warning: CellWarningIcon,\n error: CellErrorIcon,\n success: CellSuccessIcon,\n};\n\n// Default component for grid cells. Provides selection, on-hover highlighting,\n// cursor etc.\nexport function BaseCell<T>(props: GridCellProps<T>) {\n const {\n column,\n className,\n row,\n style,\n isFocused,\n isSelected,\n isEditable,\n children,\n validationStatus,\n validationMessage,\n validationType = \"light\",\n align,\n } = props;\n\n const { ref, isFocusableContent, onFocus } =\n useFocusableContent<HTMLTableCellElement>();\n const cellId = getCellId(row.key, column);\n const hasValidation = !!validationStatus;\n const hasValidationMessage = !!validationMessage || hasValidation;\n const validationMessageId = `${cellId}-statusMessage`;\n return (\n <Cell\n ref={ref}\n id={cellId}\n data-row-index={row.index}\n data-column-index={column.index}\n data-testid={isFocused ? \"grid-cell-focused\" : undefined}\n // aria-colindex uses one-based array indexing\n aria-colindex={column.index + 1}\n role=\"gridcell\"\n separator={column.separator}\n isSelected={isSelected}\n isEditable={isEditable}\n className={clsx(className, {\n [withBaseName(\"hasValidation\")]: hasValidation,\n [withBaseName(`status-${validationStatus as string}`)]:\n validationStatus,\n })}\n style={style}\n tabIndex={isFocused && !isFocusableContent ? 0 : -1}\n onFocus={onFocus}\n aria-invalid={validationStatus === \"error\" || undefined}\n aria-describedby={hasValidationMessage ? validationMessageId : undefined}\n >\n {hasValidationMessage ? (\n <div\n id={validationMessageId}\n className=\"salt-visuallyHidden\"\n aria-hidden\n role=\"status\"\n >\n {validationMessage\n ? validationMessage\n : `Cell validation state is ${validationStatus as string}`}\n </div>\n ) : null}\n <div className={clsx(withBaseName(\"valueContainer\"))}>{children}</div>\n {hasValidation && validationType === \"strong\" ? (\n <div\n className={clsx(withBaseName(\"statusContainer\"), {\n [withBaseName(`statusContainer-align-${align as string}`)]: align,\n })}\n >\n {icons[validationStatus]}\n </div>\n ) : null}\n {isFocused && isEditable && <CornerTag focusOnly={true} />}\n {isFocused && !isFocusableContent && <Cursor />}\n </Cell>\n );\n}\n"],"names":["makePrefixer","CellWarningIcon","CellErrorIcon","CellSuccessIcon","useFocusableContent","jsxs","Cell","clsx","jsx","CornerTag","Cursor"],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var react = require('react');
6
+
7
+ const ColumnSortContext = react.createContext(
8
+ void 0
9
+ );
10
+ const useColumnSortContext = () => {
11
+ const c = react.useContext(ColumnSortContext);
12
+ if (!c) {
13
+ throw new Error(`useColumnSortContext invoked outside of a Grid`);
14
+ }
15
+ return c;
16
+ };
17
+
18
+ exports.ColumnSortContext = ColumnSortContext;
19
+ exports.useColumnSortContext = useColumnSortContext;
20
+ //# sourceMappingURL=ColumnSortContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ColumnSortContext.js","sources":["../src/ColumnSortContext.ts"],"sourcesContent":["import React, { createContext, useContext } from \"react\";\nimport { SortOrder } from \"./Grid\";\nimport { GridColumnProps } from \"./GridColumn\";\n\nexport interface ColumnSortContext {\n sortByColumnId?: GridColumnProps[\"id\"];\n setSortByColumnId: (c: React.SetStateAction<GridColumnProps[\"id\"]>) => void;\n sortOrder: SortOrder;\n setSortOrder: (o: SortOrder) => void;\n onClickSortColumn: (colHeaderId: GridColumnProps[\"id\"]) => void;\n}\n\nexport const ColumnSortContext = createContext<ColumnSortContext | undefined>(\n undefined\n);\n\nexport const useColumnSortContext = () => {\n const c = useContext(ColumnSortContext);\n if (!c) {\n throw new Error(`useColumnSortContext invoked outside of a Grid`);\n }\n return c;\n};\n"],"names":["createContext","useContext"],"mappings":";;;;;;AAYO,MAAM,iBAAoB,GAAAA,mBAAA;AAAA,EAC/B,KAAA,CAAA;AACF,EAAA;AAEO,MAAM,uBAAuB,MAAM;AACxC,EAAM,MAAA,CAAA,GAAIC,iBAAW,iBAAiB,CAAA,CAAA;AACtC,EAAA,IAAI,CAAC,CAAG,EAAA;AACN,IAAM,MAAA,IAAI,MAAM,CAAgD,8CAAA,CAAA,CAAA,CAAA;AAAA,GAClE;AACA,EAAO,OAAA,CAAA,CAAA;AACT;;;;;"}
@@ -34,12 +34,20 @@ var ColumnDragContext = require('./ColumnDragContext.js');
34
34
  var ColumnGhost = require('./internal/ColumnGhost.js');
35
35
  var ColumnDropTarget = require('./internal/ColumnDropTarget.js');
36
36
  var ColumnDataContext = require('./ColumnDataContext.js');
37
+ var ColumnSortContext = require('./ColumnSortContext.js');
37
38
 
38
39
  const withBaseName = core.makePrefixer("saltGrid");
40
+ var SortOrder = /* @__PURE__ */ ((SortOrder2) => {
41
+ SortOrder2["ASC"] = "asc";
42
+ SortOrder2["DESC"] = "desc";
43
+ SortOrder2["NONE"] = "none";
44
+ return SortOrder2;
45
+ })(SortOrder || {});
39
46
  function defaultRowKeyGetter(row, index) {
40
47
  return `${index}`;
41
48
  }
42
49
  const Grid = function Grid2(props) {
50
+ var _a, _b, _c;
43
51
  const {
44
52
  rowData,
45
53
  zebra,
@@ -59,7 +67,8 @@ const Grid = function Grid2(props) {
59
67
  onColumnMoved,
60
68
  cellSelectionMode = "none",
61
69
  onVisibleRowRangeChange,
62
- headerIsFocusable
70
+ headerIsFocusable,
71
+ getRowValidationStatus
63
72
  } = props;
64
73
  const rootRef = react.useRef(null);
65
74
  const scrollableRef = react.useRef(null);
@@ -87,6 +96,8 @@ const Grid = function Grid2(props) {
87
96
  const [focusedPart, setFocusedPart] = react.useState(
88
97
  headerIsFocusable ? "header" : "body"
89
98
  );
99
+ const [sortByColumnId, setSortByColumnId] = react.useState("");
100
+ const [sortOrder, setSortOrder] = react.useState("none" /* NONE */);
90
101
  const [editMode, setEditMode] = react.useState(false);
91
102
  const [initialText, setInitialText] = react.useState(void 0);
92
103
  const resizeClient = react.useCallback(
@@ -131,8 +142,8 @@ const Grid = function Grid2(props) {
131
142
  );
132
143
  const midGrpByColId = react.useMemo(() => {
133
144
  const m = /* @__PURE__ */ new Map();
134
- for (let g of midGroups) {
135
- for (let c of g.childrenIds) {
145
+ for (const g of midGroups) {
146
+ for (const c of g.childrenIds) {
136
147
  m.set(c, g);
137
148
  }
138
149
  }
@@ -246,6 +257,70 @@ const Grid = function Grid2(props) {
246
257
  }),
247
258
  [getColById]
248
259
  );
260
+ const isSortMode = sortByColumnId && sortOrder !== "none" /* NONE */;
261
+ const onSortOrderChange = (_a = getColById(sortByColumnId)) == null ? void 0 : _a.info.props.onSortOrderChange;
262
+ const valueGetter = ((_b = getColById(sortByColumnId)) == null ? void 0 : _b.info.props.getValue) || ((r) => {
263
+ return r[sortByColumnId];
264
+ });
265
+ const customSortingFn = (_c = getColById(sortByColumnId)) == null ? void 0 : _c.info.props.customSort;
266
+ const sortedRowData = react.useMemo(() => {
267
+ if (!isSortMode || onSortOrderChange)
268
+ return rowData;
269
+ if (customSortingFn) {
270
+ return customSortingFn({ rowData, sortOrder });
271
+ }
272
+ const sortedData = [...rowData].sort(
273
+ (a, b) => valueGetter(a) < valueGetter(b) ? -1 : 1
274
+ );
275
+ if (sortOrder === "desc" /* DESC */) {
276
+ return sortedData.reverse();
277
+ }
278
+ return sortedData;
279
+ }, [
280
+ onSortOrderChange,
281
+ valueGetter,
282
+ customSortingFn,
283
+ isSortMode,
284
+ rowData,
285
+ sortByColumnId,
286
+ sortOrder
287
+ ]);
288
+ const onClickSortColumn = react.useCallback(
289
+ (colHeaderId) => {
290
+ if (sortByColumnId === colHeaderId) {
291
+ switch (sortOrder) {
292
+ case "asc" /* ASC */:
293
+ setSortOrder("desc" /* DESC */);
294
+ break;
295
+ case "desc" /* DESC */:
296
+ setSortOrder("none" /* NONE */);
297
+ break;
298
+ default:
299
+ setSortOrder("asc" /* ASC */);
300
+ }
301
+ } else {
302
+ setSortByColumnId(colHeaderId);
303
+ setSortOrder("asc" /* ASC */);
304
+ }
305
+ },
306
+ [sortByColumnId, sortOrder]
307
+ );
308
+ const columnSortContext = react.useMemo(
309
+ () => ({
310
+ sortByColumnId,
311
+ setSortByColumnId,
312
+ sortOrder,
313
+ setSortOrder,
314
+ onClickSortColumn
315
+ }),
316
+ [
317
+ sortByColumnId,
318
+ setSortByColumnId,
319
+ sortOrder,
320
+ setSortOrder,
321
+ onClickSortColumn
322
+ ]
323
+ );
249
324
  const scroll = react.useCallback(
250
325
  (left, top, source) => {
251
326
  setScrollSource(source || "user");
@@ -269,9 +344,9 @@ const Grid = function Grid2(props) {
269
344
  );
270
345
  const focusCellElement = (part, rowIdx, colIdx) => {
271
346
  setTimeout(() => {
272
- var _a;
347
+ var _a2;
273
348
  const selector = part === "body" ? `td[data-row-index="${rowIdx}"][data-column-index="${colIdx}"]` : `th[data-column-index="${colIdx}"]`;
274
- const nodeToFocus = (_a = rootRef.current) == null ? void 0 : _a.querySelector(selector);
349
+ const nodeToFocus = (_a2 = rootRef.current) == null ? void 0 : _a2.querySelector(selector);
275
350
  if (nodeToFocus) {
276
351
  nodeToFocus.focus({ preventScroll: true });
277
352
  } else {
@@ -309,7 +384,7 @@ const Grid = function Grid2(props) {
309
384
  `onChange is not specified for editable column "${c.info.props.id}".`
310
385
  );
311
386
  } else {
312
- handler(rowData[cursorRowIdx], cursorRowIdx, value);
387
+ handler(sortedRowData[cursorRowIdx], cursorRowIdx, value);
313
388
  }
314
389
  setEditMode(false);
315
390
  focusCellElement(focusedPart, cursorRowIdx, cursorColIdx);
@@ -333,7 +408,7 @@ const Grid = function Grid2(props) {
333
408
  onMouseDown: onRowSelectionMouseDown
334
409
  } = gridHooks.useRowSelection(
335
410
  rowKeyGetter,
336
- rowData,
411
+ sortedRowData,
337
412
  defaultSelectedRowIdxs,
338
413
  selectedRowIdxs,
339
414
  rowSelectionMode,
@@ -351,10 +426,10 @@ const Grid = function Grid2(props) {
351
426
  setFocusedPart(part);
352
427
  colIdx = utils.clamp(colIdx, 0, cols.length - 1);
353
428
  if (part === "body") {
354
- if (rowData.length < 1 || cols.length < 1) {
429
+ if (sortedRowData.length < 1 || cols.length < 1) {
355
430
  return;
356
431
  }
357
- rowIdx = utils.clamp(rowIdx, 0, rowData.length - 1);
432
+ rowIdx = utils.clamp(rowIdx, 0, sortedRowData.length - 1);
358
433
  } else if (part === "header") {
359
434
  rowIdx = 0;
360
435
  }
@@ -369,7 +444,7 @@ const Grid = function Grid2(props) {
369
444
  [
370
445
  setCursorRowIdx,
371
446
  setCursorColIdx,
372
- rowData,
447
+ sortedRowData,
373
448
  rowKeyGetter,
374
449
  cols,
375
450
  rootRef.current,
@@ -380,7 +455,7 @@ const Grid = function Grid2(props) {
380
455
  headerIsFocusable
381
456
  ]
382
457
  );
383
- const rows = gridHooks.useRowModels(rowKeyGetter, rowData, visRowRng);
458
+ const rows = gridHooks.useRowModels(rowKeyGetter, sortedRowData, visRowRng);
384
459
  const isLeftRaised = scrollLeft > 0;
385
460
  const isRightRaised = scrollLeft + clientMidWidth < midWidth;
386
461
  const isHeaderRaised = scrollTop > 0;
@@ -547,7 +622,7 @@ const Grid = function Grid2(props) {
547
622
  if (cursorColIdx != void 0) {
548
623
  rangeSelection.selectRange({
549
624
  start: { rowIdx: 0, colIdx: cursorColIdx },
550
- end: { rowIdx: rowData.length, colIdx: cursorColIdx }
625
+ end: { rowIdx: sortedRowData.length, colIdx: cursorColIdx }
551
626
  });
552
627
  }
553
628
  } else {
@@ -568,7 +643,7 @@ const Grid = function Grid2(props) {
568
643
  if (event.ctrlKey || event.metaKey) {
569
644
  rangeSelection.selectRange({
570
645
  start: { rowIdx: 0, colIdx: 0 },
571
- end: { rowIdx: rowData.length, colIdx: cols.length }
646
+ end: { rowIdx: sortedRowData.length, colIdx: cols.length }
572
647
  });
573
648
  selectAll();
574
649
  return true;
@@ -589,7 +664,7 @@ const Grid = function Grid2(props) {
589
664
  selectAll,
590
665
  cursorColIdx,
591
666
  cursorRowIdx,
592
- rowData.length,
667
+ sortedRowData.length,
593
668
  cols.length,
594
669
  focusedPart
595
670
  ]
@@ -604,7 +679,7 @@ const Grid = function Grid2(props) {
604
679
  const [minCol, maxCol] = [start.colIdx, end.colIdx].sort(c);
605
680
  const text = [];
606
681
  for (let r = minRow; r <= maxRow; ++r) {
607
- const row = rowData[r];
682
+ const row = sortedRowData[r];
608
683
  const rowText = [];
609
684
  for (let c2 = minCol; c2 <= maxCol; ++c2) {
610
685
  const col = cols[c2];
@@ -680,7 +755,7 @@ const Grid = function Grid2(props) {
680
755
  if (!event.ctrlKey) {
681
756
  moveCursor(focusedPart, cursorRowIdx, cols.length - 1);
682
757
  } else {
683
- moveCursor(focusedPart, rowData.length - 1, cols.length - 1);
758
+ moveCursor(focusedPart, sortedRowData.length - 1, cols.length - 1);
684
759
  }
685
760
  break;
686
761
  case "Tab":
@@ -689,7 +764,7 @@ const Grid = function Grid2(props) {
689
764
  if (cursorColIdx < cols.length - 1) {
690
765
  moveCursor(focusedPart, cursorRowIdx, cursorColIdx + 1);
691
766
  } else {
692
- if (cursorRowIdx < rowData.length - 1) {
767
+ if (cursorRowIdx < sortedRowData.length - 1) {
693
768
  moveCursor(focusedPart, cursorRowIdx + 1, 0);
694
769
  }
695
770
  }
@@ -729,7 +804,7 @@ const Grid = function Grid2(props) {
729
804
  cursorRowIdx,
730
805
  cursorRowIdx,
731
806
  cols.length,
732
- rowData.length,
807
+ sortedRowData.length,
733
808
  headerIsFocusable,
734
809
  pageSize
735
810
  ]
@@ -814,115 +889,121 @@ const Grid = function Grid2(props) {
814
889
  value: sizingContext,
815
890
  children: /* @__PURE__ */ jsxRuntime.jsx(EditorContext.EditorContext.Provider, {
816
891
  value: editorContext,
817
- children: /* @__PURE__ */ jsxRuntime.jsxs(ColumnDataContext.ColumnDataContext.Provider, {
892
+ children: /* @__PURE__ */ jsxRuntime.jsx(ColumnDataContext.ColumnDataContext.Provider, {
818
893
  value: columnDataContext,
819
- children: [
820
- props.children,
821
- /* @__PURE__ */ jsxRuntime.jsxs("div", {
822
- className: clsx.clsx(
823
- withBaseName(),
824
- {
825
- [withBaseName("zebra")]: zebra,
826
- [withBaseName("columnSeparators")]: columnSeparators,
827
- [withBaseName("pinnedSeparators")]: pinnedSeparators,
828
- [withBaseName("primaryBackground")]: variant === "primary",
829
- [withBaseName("secondaryBackground")]: variant === "secondary"
830
- },
831
- className
832
- ),
833
- style: rootStyle,
834
- ref: rootRef,
835
- onKeyDown,
836
- onKeyUp,
837
- onMouseDown,
838
- onFocus,
839
- onBlur,
840
- "data-name": "grid-root",
841
- role: "grid",
842
- "aria-colcount": cols.length,
843
- "aria-rowcount": rowCount + headRowCount,
844
- "aria-multiselectable": rowSelectionMode === "multi",
845
- children: [
846
- /* @__PURE__ */ jsxRuntime.jsx(CellMeasure.CellMeasure, {
847
- setRowHeight
848
- }),
849
- /* @__PURE__ */ jsxRuntime.jsx(Scrollable.Scrollable, {
850
- resizeClient,
851
- scrollLeft,
852
- scrollTop,
853
- scrollSource,
854
- scroll,
855
- scrollerRef: scrollableRef,
856
- topRef,
857
- rightRef,
858
- bottomRef,
859
- leftRef,
860
- middleRef
861
- }),
862
- !hideHeader && leftCols.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(TopLeftPart.TopLeftPart, {
863
- onWheel,
864
- columns: leftCols,
865
- columnGroups: leftGroups,
866
- rightShadow: isLeftRaised,
867
- bottomShadow: isHeaderRaised
868
- }),
869
- !hideHeader && /* @__PURE__ */ jsxRuntime.jsx(TopPart.TopPart, {
870
- columns: headVisibleColumns,
871
- columnGroups: visColGrps,
872
- topRef,
873
- onWheel,
874
- midGap,
875
- bottomShadow: isHeaderRaised
876
- }),
877
- !hideHeader && rightCols.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(TopRightPart.TopRightPart, {
878
- onWheel,
879
- columns: rightCols,
880
- columnGroups: rightGroups,
881
- leftShadow: isRightRaised,
882
- bottomShadow: isHeaderRaised
883
- }),
884
- leftCols.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(LeftPart.LeftPart, {
885
- leftRef,
886
- onWheel,
887
- columns: leftCols,
888
- rows,
889
- rightShadow: isLeftRaised,
890
- hoverOverRowKey: hoverRowKey,
891
- setHoverOverRowKey: setHoverRowKey,
892
- zebra
893
- }),
894
- /* @__PURE__ */ jsxRuntime.jsx(MiddlePart.MiddlePart, {
895
- middleRef,
896
- onWheel,
897
- columns: bodyVisibleColumns,
898
- rows,
899
- hoverOverRowKey: hoverRowKey,
900
- setHoverOverRowKey: setHoverRowKey,
901
- midGap,
902
- zebra
903
- }),
904
- rightCols.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(RightPart.RightPart, {
905
- rightRef,
906
- onWheel,
907
- columns: rightCols,
908
- rows,
909
- leftShadow: isRightRaised,
910
- hoverOverRowKey: hoverRowKey,
911
- setHoverOverRowKey: setHoverRowKey,
912
- zebra
913
- }),
914
- /* @__PURE__ */ jsxRuntime.jsx(ColumnDropTarget.ColumnDropTarget, {
915
- x: activeTarget == null ? void 0 : activeTarget.x
916
- }),
917
- /* @__PURE__ */ jsxRuntime.jsx(ColumnGhost.ColumnGhost, {
918
- columns: cols,
919
- rows,
920
- dragState,
921
- zebra
922
- })
923
- ]
924
- })
925
- ]
894
+ children: /* @__PURE__ */ jsxRuntime.jsxs(ColumnSortContext.ColumnSortContext.Provider, {
895
+ value: columnSortContext,
896
+ children: [
897
+ props.children,
898
+ /* @__PURE__ */ jsxRuntime.jsxs("div", {
899
+ className: clsx.clsx(
900
+ withBaseName(),
901
+ {
902
+ [withBaseName("zebra")]: zebra,
903
+ [withBaseName("columnSeparators")]: columnSeparators,
904
+ [withBaseName("pinnedSeparators")]: pinnedSeparators,
905
+ [withBaseName("primaryBackground")]: variant === "primary",
906
+ [withBaseName("secondaryBackground")]: variant === "secondary"
907
+ },
908
+ className
909
+ ),
910
+ style: rootStyle,
911
+ ref: rootRef,
912
+ onKeyDown,
913
+ onKeyUp,
914
+ onMouseDown,
915
+ onFocus,
916
+ onBlur,
917
+ "data-name": "grid-root",
918
+ role: "grid",
919
+ "aria-colcount": cols.length,
920
+ "aria-rowcount": rowCount + headRowCount,
921
+ "aria-multiselectable": rowSelectionMode === "multi",
922
+ children: [
923
+ /* @__PURE__ */ jsxRuntime.jsx(CellMeasure.CellMeasure, {
924
+ setRowHeight
925
+ }),
926
+ /* @__PURE__ */ jsxRuntime.jsx(Scrollable.Scrollable, {
927
+ resizeClient,
928
+ scrollLeft,
929
+ scrollTop,
930
+ scrollSource,
931
+ scroll,
932
+ scrollerRef: scrollableRef,
933
+ topRef,
934
+ rightRef,
935
+ bottomRef,
936
+ leftRef,
937
+ middleRef
938
+ }),
939
+ !hideHeader && leftCols.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(TopLeftPart.TopLeftPart, {
940
+ onWheel,
941
+ columns: leftCols,
942
+ columnGroups: leftGroups,
943
+ rightShadow: isLeftRaised,
944
+ bottomShadow: isHeaderRaised
945
+ }),
946
+ !hideHeader && /* @__PURE__ */ jsxRuntime.jsx(TopPart.TopPart, {
947
+ columns: headVisibleColumns,
948
+ columnGroups: visColGrps,
949
+ topRef,
950
+ onWheel,
951
+ midGap,
952
+ bottomShadow: isHeaderRaised
953
+ }),
954
+ !hideHeader && rightCols.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(TopRightPart.TopRightPart, {
955
+ onWheel,
956
+ columns: rightCols,
957
+ columnGroups: rightGroups,
958
+ leftShadow: isRightRaised,
959
+ bottomShadow: isHeaderRaised
960
+ }),
961
+ leftCols.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(LeftPart.LeftPart, {
962
+ leftRef,
963
+ onWheel,
964
+ columns: leftCols,
965
+ rows,
966
+ rightShadow: isLeftRaised,
967
+ hoverOverRowKey: hoverRowKey,
968
+ setHoverOverRowKey: setHoverRowKey,
969
+ zebra,
970
+ getRowValidationStatus
971
+ }),
972
+ /* @__PURE__ */ jsxRuntime.jsx(MiddlePart.MiddlePart, {
973
+ middleRef,
974
+ onWheel,
975
+ columns: bodyVisibleColumns,
976
+ rows,
977
+ hoverOverRowKey: hoverRowKey,
978
+ setHoverOverRowKey: setHoverRowKey,
979
+ midGap,
980
+ zebra,
981
+ getRowValidationStatus
982
+ }),
983
+ rightCols.length > 0 && /* @__PURE__ */ jsxRuntime.jsx(RightPart.RightPart, {
984
+ rightRef,
985
+ onWheel,
986
+ columns: rightCols,
987
+ rows,
988
+ leftShadow: isRightRaised,
989
+ hoverOverRowKey: hoverRowKey,
990
+ setHoverOverRowKey: setHoverRowKey,
991
+ zebra,
992
+ getRowValidationStatus
993
+ }),
994
+ /* @__PURE__ */ jsxRuntime.jsx(ColumnDropTarget.ColumnDropTarget, {
995
+ x: activeTarget == null ? void 0 : activeTarget.x
996
+ }),
997
+ /* @__PURE__ */ jsxRuntime.jsx(ColumnGhost.ColumnGhost, {
998
+ columns: cols,
999
+ rows,
1000
+ dragState,
1001
+ zebra
1002
+ })
1003
+ ]
1004
+ })
1005
+ ]
1006
+ })
926
1007
  })
927
1008
  })
928
1009
  })
@@ -934,4 +1015,5 @@ const Grid = function Grid2(props) {
934
1015
  };
935
1016
 
936
1017
  exports.Grid = Grid;
1018
+ exports.SortOrder = SortOrder;
937
1019
  //# sourceMappingURL=Grid.js.map