@algolia/satellite 1.0.0-beta.120 → 1.0.0-beta.124

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 (108) hide show
  1. package/cjs/AutoComplete/AutoComplete.d.ts +4 -0
  2. package/cjs/AutoComplete/AutoComplete.js +10 -5
  3. package/cjs/AutoComplete/types.d.ts +5 -0
  4. package/cjs/Button/styles.d.ts +1 -1
  5. package/cjs/Checkbox/Checkbox.js +1 -0
  6. package/cjs/DatePicker/DatePicker.tailwind.js +7 -2
  7. package/cjs/Dropdown/DropdownButton.d.ts +1 -1
  8. package/cjs/Pagination/DotPagination/DotPagination.d.ts +2 -1
  9. package/cjs/Pagination/DotPagination/DotPagination.js +4 -2
  10. package/cjs/Pagination/Pagination/Pagination.js +3 -0
  11. package/cjs/ProgressSpinner/ProgressSpinner.js +1 -1
  12. package/cjs/Tables/DataTable/DataTable.d.ts +41 -0
  13. package/cjs/Tables/DataTable/DataTable.js +281 -0
  14. package/cjs/Tables/DataTable/DataTable.tailwind.d.ts +5 -0
  15. package/cjs/Tables/DataTable/DataTable.tailwind.js +23 -0
  16. package/cjs/Tables/DataTable/components/Body.d.ts +14 -0
  17. package/cjs/Tables/DataTable/components/Body.js +125 -0
  18. package/cjs/Tables/DataTable/components/Footer.d.ts +8 -0
  19. package/cjs/Tables/DataTable/components/Footer.js +81 -0
  20. package/cjs/Tables/DataTable/components/Header.d.ts +10 -0
  21. package/cjs/Tables/DataTable/components/Header.js +44 -0
  22. package/cjs/Tables/DataTable/components/HeaderCell.d.ts +11 -0
  23. package/cjs/Tables/DataTable/components/HeaderCell.js +61 -0
  24. package/cjs/Tables/DataTable/components/Loader.d.ts +6 -0
  25. package/cjs/Tables/DataTable/components/Loader.js +63 -0
  26. package/cjs/Tables/DataTable/components/index.d.ts +5 -0
  27. package/cjs/Tables/DataTable/components/index.js +70 -0
  28. package/cjs/Tables/DataTable/index.d.ts +3 -0
  29. package/cjs/Tables/DataTable/index.js +46 -0
  30. package/cjs/Tables/DataTable/types.d.ts +49 -0
  31. package/cjs/Tables/DataTable/types.js +5 -0
  32. package/cjs/Tables/DataTable/utils.d.ts +4 -0
  33. package/cjs/Tables/DataTable/utils.js +32 -0
  34. package/cjs/{Table → Tables/Table}/Table.d.ts +1 -1
  35. package/cjs/{Table → Tables/Table}/Table.js +8 -6
  36. package/cjs/Tables/Table/Table.tailwind.d.ts +5 -0
  37. package/cjs/{Table → Tables/Table}/Table.tailwind.js +6 -20
  38. package/cjs/Tables/Table/components/Footer.d.ts +8 -0
  39. package/cjs/Tables/Table/components/Footer.js +35 -0
  40. package/cjs/Tables/Table/index.d.ts +2 -0
  41. package/cjs/{Table → Tables/Table}/index.js +7 -5
  42. package/cjs/Tables/index.d.ts +3 -0
  43. package/cjs/Tables/index.js +46 -0
  44. package/cjs/index.d.ts +1 -1
  45. package/cjs/index.js +4 -4
  46. package/cjs/styles/tailwind.config.js +1 -1
  47. package/cjs/utils/index.d.ts +1 -0
  48. package/cjs/utils/index.js +9 -1
  49. package/cjs/utils/toSentenceCase.d.ts +3 -0
  50. package/cjs/utils/toSentenceCase.js +21 -0
  51. package/esm/AutoComplete/AutoComplete.d.ts +4 -0
  52. package/esm/AutoComplete/AutoComplete.js +10 -5
  53. package/esm/AutoComplete/types.d.ts +5 -0
  54. package/esm/Button/styles.d.ts +1 -1
  55. package/esm/Checkbox/Checkbox.js +1 -0
  56. package/esm/DatePicker/DatePicker.tailwind.js +7 -2
  57. package/esm/Dropdown/DropdownButton.d.ts +1 -1
  58. package/esm/Pagination/DotPagination/DotPagination.d.ts +2 -1
  59. package/esm/Pagination/DotPagination/DotPagination.js +4 -2
  60. package/esm/Pagination/Pagination/Pagination.js +3 -0
  61. package/esm/ProgressSpinner/ProgressSpinner.js +1 -1
  62. package/esm/Tables/DataTable/DataTable.d.ts +41 -0
  63. package/esm/Tables/DataTable/DataTable.js +249 -0
  64. package/esm/Tables/DataTable/DataTable.tailwind.d.ts +5 -0
  65. package/esm/Tables/DataTable/DataTable.tailwind.js +21 -0
  66. package/esm/Tables/DataTable/components/Body.d.ts +14 -0
  67. package/esm/Tables/DataTable/components/Body.js +106 -0
  68. package/esm/Tables/DataTable/components/Footer.d.ts +8 -0
  69. package/esm/Tables/DataTable/components/Footer.js +60 -0
  70. package/esm/Tables/DataTable/components/Header.d.ts +10 -0
  71. package/esm/Tables/DataTable/components/Header.js +29 -0
  72. package/esm/Tables/DataTable/components/HeaderCell.d.ts +11 -0
  73. package/esm/Tables/DataTable/components/HeaderCell.js +42 -0
  74. package/esm/Tables/DataTable/components/Loader.d.ts +6 -0
  75. package/esm/Tables/DataTable/components/Loader.js +40 -0
  76. package/esm/Tables/DataTable/components/index.d.ts +5 -0
  77. package/esm/Tables/DataTable/components/index.js +5 -0
  78. package/esm/Tables/DataTable/index.d.ts +3 -0
  79. package/esm/Tables/DataTable/index.js +3 -0
  80. package/esm/Tables/DataTable/types.d.ts +49 -0
  81. package/esm/Tables/DataTable/types.js +1 -0
  82. package/esm/Tables/DataTable/utils.d.ts +4 -0
  83. package/esm/Tables/DataTable/utils.js +14 -0
  84. package/esm/{Table → Tables/Table}/Table.d.ts +1 -1
  85. package/esm/{Table → Tables/Table}/Table.js +7 -6
  86. package/esm/Tables/Table/Table.tailwind.d.ts +5 -0
  87. package/esm/{Table → Tables/Table}/Table.tailwind.js +6 -20
  88. package/esm/Tables/Table/components/Footer.d.ts +8 -0
  89. package/esm/Tables/Table/components/Footer.js +20 -0
  90. package/esm/Tables/Table/index.d.ts +2 -0
  91. package/esm/Tables/Table/index.js +2 -0
  92. package/esm/Tables/index.d.ts +3 -0
  93. package/esm/Tables/index.js +3 -0
  94. package/esm/index.d.ts +1 -1
  95. package/esm/index.js +1 -1
  96. package/esm/styles/tailwind.config.js +1 -1
  97. package/esm/utils/index.d.ts +1 -0
  98. package/esm/utils/index.js +2 -1
  99. package/esm/utils/toSentenceCase.d.ts +3 -0
  100. package/esm/utils/toSentenceCase.js +9 -0
  101. package/package.json +1 -1
  102. package/satellite.css +18 -18
  103. package/satellite.min.css +1 -1
  104. package/cjs/Table/Table.tailwind.d.ts +0 -5
  105. package/cjs/Table/index.d.ts +0 -3
  106. package/esm/Table/Table.tailwind.d.ts +0 -5
  107. package/esm/Table/index.d.ts +0 -3
  108. package/esm/Table/index.js +0 -3
@@ -13,6 +13,10 @@ interface State {
13
13
  *
14
14
  * Use this component when the user needs to search through a long list of results.
15
15
  *
16
+ * ## Menu Size Variations
17
+ * - **Medium (default)**: the standard dropdown menu height for most use cases
18
+ * - **Large**: when numerous results should be displayed in the dropdown to ease selection
19
+ *
16
20
  * ## Best practices
17
21
  *
18
22
  * - Provide an empty state if there is no result
@@ -65,7 +65,7 @@ var _DefaultOptionItem = _interopRequireDefault(require("./components/DefaultOpt
65
65
 
66
66
  var _AutoCompleteEmptyState = _interopRequireDefault(require("./components/AutoCompleteEmptyState"));
67
67
 
68
- var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8, _templateObject9, _templateObject10, _templateObject11, _templateObject12, _templateObject13, _templateObject14, _templateObject15;
68
+ var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8, _templateObject9, _templateObject10, _templateObject11, _templateObject12, _templateObject13, _templateObject14, _templateObject15, _templateObject16;
69
69
 
70
70
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
71
71
 
@@ -155,6 +155,10 @@ var defaultEmptyState = /*#__PURE__*/_react["default"].createElement(_AutoComple
155
155
  *
156
156
  * Use this component when the user needs to search through a long list of results.
157
157
  *
158
+ * ## Menu Size Variations
159
+ * - **Medium (default)**: the standard dropdown menu height for most use cases
160
+ * - **Large**: when numerous results should be displayed in the dropdown to ease selection
161
+ *
158
162
  * ## Best practices
159
163
  *
160
164
  * - Provide an empty state if there is no result
@@ -448,6 +452,7 @@ var AutoComplete = /*#__PURE__*/function (_Component) {
448
452
  isOpen = autocompleteHelpers.isOpen;
449
453
  var _this$props4 = _this.props,
450
454
  menuClassName = _this$props4.menuClassName,
455
+ menuSize = _this$props4.menuSize,
451
456
  _this$props4$emptySta = _this$props4.emptyState,
452
457
  emptyState = _this$props4$emptySta === void 0 ? AutoComplete.defaultProps.emptyState : _this$props4$emptySta,
453
458
  menuFooter = _this$props4.menuFooter,
@@ -496,26 +501,26 @@ var AutoComplete = /*#__PURE__*/function (_Component) {
496
501
  }, results.length === 0 ? /*#__PURE__*/_react["default"].createElement("div", (0, _extends2["default"])({}, getMenuProps(), {
497
502
  className: (0, _satellitePrefixer["default"])(_templateObject11 || (_templateObject11 = (0, _taggedTemplateLiteral2["default"])(["min-h-10"])))
498
503
  }), emptyState) : /*#__PURE__*/_react["default"].createElement(_ScrollIndicator["default"], {
499
- className: (0, _satellitePrefixer["default"])(_templateObject12 || (_templateObject12 = (0, _taggedTemplateLiteral2["default"])(["max-h-64"])))
504
+ className: menuSize === "large" ? (0, _satellitePrefixer["default"])(_templateObject12 || (_templateObject12 = (0, _taggedTemplateLiteral2["default"])(["max-h-96"]))) : (0, _satellitePrefixer["default"])(_templateObject13 || (_templateObject13 = (0, _taggedTemplateLiteral2["default"])(["max-h-64"])))
500
505
  }, /*#__PURE__*/_react["default"].createElement("ul", getMenuProps(), results.slice(0, showAllResults ? Number.MAX_SAFE_INTEGER : maxResults).map(function (result, index) {
501
506
  return /*#__PURE__*/_react["default"].createElement("li", (0, _extends2["default"])({
502
507
  key: result.value
503
508
  }, getItemProps({
504
509
  item: result,
505
510
  disabled: result.disabled,
506
- className: (0, _satellitePrefixer["default"])(_templateObject13 || (_templateObject13 = (0, _taggedTemplateLiteral2["default"])(["\n autocomplete-result\n flex items-center min-h-10 px-4 cursor-pointer\n ", "\n ", "\n "])), index === highlightedIndex && "bg-grey-100", result.disabled && "cursor-not-allowed")
511
+ className: (0, _satellitePrefixer["default"])(_templateObject14 || (_templateObject14 = (0, _taggedTemplateLiteral2["default"])(["\n autocomplete-result\n flex items-center min-h-10 px-4 cursor-pointer\n ", "\n ", "\n "])), index === highlightedIndex && "bg-grey-100", result.disabled && "cursor-not-allowed")
507
512
  })), /*#__PURE__*/_react["default"].createElement(OptionItem, (0, _extends2["default"])({}, optionItemProps, {
508
513
  highlighted: index === highlightedIndex,
509
514
  option: result
510
515
  })));
511
516
  }), extraResults > 0 && !showAllResults && /*#__PURE__*/_react["default"].createElement("li", {
512
- className: (0, _satellitePrefixer["default"])(_templateObject14 || (_templateObject14 = (0, _taggedTemplateLiteral2["default"])(["p-2 text-right"])))
517
+ className: (0, _satellitePrefixer["default"])(_templateObject15 || (_templateObject15 = (0, _taggedTemplateLiteral2["default"])(["p-2 text-right"])))
513
518
  }, /*#__PURE__*/_react["default"].createElement(_Button["default"], {
514
519
  variant: "subtle",
515
520
  size: "small",
516
521
  onMouseDown: _this.handleShowAllResults
517
522
  }, "Show ", (0, _pluralize["default"])(extraResults, "result"), " more")))), menuFooter && /*#__PURE__*/_react["default"].createElement("footer", {
518
- className: (0, _satellitePrefixer["default"])(_templateObject15 || (_templateObject15 = (0, _taggedTemplateLiteral2["default"])(["flex items-center justify-center min-h-12 p-4 bg-grey-100 border-t border-grey-200 text-grey-600"])))
523
+ className: (0, _satellitePrefixer["default"])(_templateObject16 || (_templateObject16 = (0, _taggedTemplateLiteral2["default"])(["flex items-center justify-center min-h-12 p-4 bg-grey-100 border-t border-grey-200 text-grey-600"])))
519
524
  }, menuFooter)));
520
525
  });
521
526
  });
@@ -31,6 +31,11 @@ export interface AutoCompleteBaseProps {
31
31
  /** Keep the input on a single line */
32
32
  noWrap?: boolean;
33
33
  endItem?: React.ReactNode;
34
+ /**
35
+ * `medium` will display about 5 results in the dropdown; use `large` variant to display more
36
+ * @default "medium"
37
+ */
38
+ menuSize?: "medium" | "large";
34
39
  }
35
40
  export interface AutoCompleteSingleProps extends AutoCompleteBaseProps {
36
41
  multiple?: false;
@@ -2,4 +2,4 @@ import { ButtonBaseProps, ButtonSize, ButtonVariant } from "./types";
2
2
  export declare const BUTTON_SIZE_CLASSNAMES: Record<ButtonSize, string>;
3
3
  export declare const BUTTON_LOADER_ICON_SIZES: Record<ButtonSize, number>;
4
4
  export declare const BUTTON_VARIANT_CLASSNAMES: Record<ButtonVariant, string>;
5
- export declare const getIconColorClassName: ({ disabled, variant }: ButtonBaseProps) => string;
5
+ export declare const getIconColorClassName: ({ disabled, variant }: Pick<ButtonBaseProps, "disabled" | "variant">) => string;
@@ -99,6 +99,7 @@ var Checkbox = /*#__PURE__*/(0, _react.forwardRef)(function (_ref, ref) {
99
99
  }, /*#__PURE__*/_react["default"].createElement(CheckboxIcon, {
100
100
  className: (0, _satellitePrefixer["default"])(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["checkbox-icon"])))
101
101
  }), /*#__PURE__*/_react["default"].createElement("input", (0, _extends2["default"])({}, checkboxProps, {
102
+ "aria-checked": indeterminate ? "mixed" : isChecked,
102
103
  id: id,
103
104
  className: (0, _satellitePrefixer["default"])(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["\n opacity-0 absolute inset-0 cursor-pointer\n ", "\n "])), disabled && "cursor-not-allowed"),
104
105
  type: "checkbox",
@@ -32,6 +32,10 @@ var datePickerPlugin = function datePickerPlugin(_ref) {
32
32
  textAlign: "center"
33
33
  }
34
34
  }, (0, _defineProperty2["default"])(_addComponents, prefix(".date-picker, .date-range-picker"), {
35
+ "& .DayPicker-Months": {
36
+ // Hack to align dates on the same grid
37
+ alignItems: "start"
38
+ },
35
39
  "& .DayPicker-Day": (_DayPickerDay = {
36
40
  borderRadius: defaultRadius
37
41
  }, (0, _defineProperty2["default"])(_DayPickerDay, "&--today".concat(not("outside")), {
@@ -46,8 +50,9 @@ var datePickerPlugin = function datePickerPlugin(_ref) {
46
50
  borderRadius: 9999,
47
51
  width: 32,
48
52
  height: 32,
49
- left: 2,
50
- top: 4,
53
+ left: "50%",
54
+ top: "50%",
55
+ transform: "translate(-50%, -50%)",
51
56
  zIndex: -1
52
57
  }
53
58
  }), (0, _defineProperty2["default"])(_DayPickerDay, "&--selected".concat(not("outside")), {
@@ -1,7 +1,7 @@
1
1
  import React, { FunctionComponent } from "react";
2
2
  import { ButtonProps } from "../Button";
3
3
  import { RenderTargetParams } from "./Dropdown";
4
- export interface DropdownButtonProps extends Omit<ButtonProps<"button">, "title"> {
4
+ export interface DropdownButtonProps extends Omit<ButtonProps<"button">, "title" | "endIcon"> {
5
5
  /** Title displayed in the `Dropdown` */
6
6
  title: React.ReactNode;
7
7
  renderFooter?: (args: RenderTargetParams) => React.ReactNode;
@@ -4,6 +4,7 @@ export declare type DotPaginationProps = {
4
4
  currentPage: number;
5
5
  onChange: (page: number) => void;
6
6
  nbPages: number;
7
+ size?: "small" | "medium";
7
8
  };
8
- export declare const DotPagination: ({ currentPage, onChange, nbPages }: DotPaginationProps) => JSX.Element;
9
+ export declare const DotPagination: ({ currentPage, onChange, nbPages, size }: DotPaginationProps) => JSX.Element;
9
10
  export default DotPagination;
@@ -18,7 +18,9 @@ var _templateObject, _templateObject2;
18
18
  var DotPagination = function DotPagination(_ref) {
19
19
  var currentPage = _ref.currentPage,
20
20
  onChange = _ref.onChange,
21
- nbPages = _ref.nbPages;
21
+ nbPages = _ref.nbPages,
22
+ _ref$size = _ref.size,
23
+ size = _ref$size === void 0 ? "medium" : _ref$size;
22
24
  return /*#__PURE__*/_react["default"].createElement("ul", {
23
25
  className: (0, _satellitePrefixer["default"])(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["flex"])))
24
26
  }, new Array(nbPages).fill(undefined).map(function (_, idx) {
@@ -27,7 +29,7 @@ var DotPagination = function DotPagination(_ref) {
27
29
  key: idx
28
30
  }, /*#__PURE__*/_react["default"].createElement("button", {
29
31
  "aria-label": "Go to page ".concat(pageIdx),
30
- className: (0, _satellitePrefixer["default"])(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n h-3 w-3 rounded-full mx-1\n ", "\n "])), currentPage === pageIdx ? "bg-accent-600" : "bg-grey-200"),
32
+ className: (0, _satellitePrefixer["default"])(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["\n rounded-full mx-1\n ", "\n ", "\n "])), currentPage === pageIdx ? "bg-accent-600" : "bg-grey-200", size === "medium" ? "h-3 w-3" : "h-2 w-2"),
31
33
  onClick: function onClick() {
32
34
  return onChange(pageIdx);
33
35
  }
@@ -43,6 +43,7 @@ var Group = function Group(_ref) {
43
43
  onChange = _ref.onChange;
44
44
  return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, group.map(function (index) {
45
45
  return /*#__PURE__*/_react["default"].createElement(_Button["default"], {
46
+ "aria-label": "Go to page ".concat(index),
46
47
  key: index,
47
48
  variant: index === currentPage ? "primary" : "neutral",
48
49
  onClick: function onClick() {
@@ -83,6 +84,7 @@ var Pagination = function Pagination(_ref2) {
83
84
  return /*#__PURE__*/_react["default"].createElement(_Button.ButtonGroup, {
84
85
  as: "nav"
85
86
  }, /*#__PURE__*/_react["default"].createElement(_Button["default"], {
87
+ "aria-label": "Go to previous page",
86
88
  disabled: currentPage === 1,
87
89
  onClick: function onClick() {
88
90
  return onChange(currentPage - 1);
@@ -102,6 +104,7 @@ var Pagination = function Pagination(_ref2) {
102
104
  onChange: onChange,
103
105
  group: groups[2]
104
106
  }), /*#__PURE__*/_react["default"].createElement(_Button["default"], {
107
+ "aria-label": "Go to next page",
105
108
  disabled: currentPage === nbPages,
106
109
  onClick: function onClick() {
107
110
  return onChange(currentPage + 1);
@@ -42,7 +42,7 @@ var ProgressSpinner = function ProgressSpinner(_ref) {
42
42
  viewBox: "".concat(size / 2, " ").concat(size / 2, " ").concat(size, " ").concat(size),
43
43
  width: size,
44
44
  height: size
45
- }), /*#__PURE__*/_react["default"].createElement("circle", {
45
+ }), /*#__PURE__*/_react["default"].createElement("title", null, "Loading spinner"), /*#__PURE__*/_react["default"].createElement("circle", {
46
46
  cx: size,
47
47
  cy: size,
48
48
  r: (size - thickness) / 2,
@@ -0,0 +1,41 @@
1
+ import React from "react";
2
+ import type { ColumnDefinition, Row, Status, SelectMode, PaginationConfiguration, Sorting, DataConfiguration, GetItemId } from "./types";
3
+ declare type CanSelectItem<Item> = (item: Item, idx: number) => boolean;
4
+ export interface DataTableProps<Item> {
5
+ data: Item[];
6
+ itemId?: GetItemId<Item>;
7
+ pagination?: PaginationConfiguration;
8
+ sorting?: Sorting[];
9
+ onChange?(dataConfiguration: DataConfiguration): void;
10
+ status?: Status;
11
+ noDataContent?: React.ReactNode;
12
+ errorContent?: React.ReactNode;
13
+ columns: ColumnDefinition<Item>[];
14
+ selectMode?: SelectMode;
15
+ selection?: string[];
16
+ onSelectionChange?(rowId: string[]): void;
17
+ canSelectItem?: CanSelectItem<Item>;
18
+ canHoverRow?(row: Row<Item>): boolean;
19
+ onRowHoveredChanged?(row: Row<Item> | null): void;
20
+ }
21
+ /**
22
+ * Tables are used to structure content in a grid to make it easier to see relationships and to facilitate understanding.
23
+ *
24
+ * #### Do
25
+ *
26
+ * - Organize columns and rows based on the needs of your users. To help people read the table, order the columns by importance from left to right, with the key pieces of content opening the row
27
+ * - Include units of measurement symbols in the header so you don't need to repeat them throughout the columns
28
+ * - Indicate sorting capabilities of a column with a chevron in the cell header
29
+ * - Start by columns with highest value to the user, and continue with less important ones
30
+ *
31
+ * #### Do not
32
+ *
33
+ * - Center align text in cells
34
+ *
35
+ * ## Best practices
36
+ *
37
+ * - If a cell is empty or unavailable, keep the cell empty to reduce noise and help with legibility.
38
+ * - Truncate long text to make it fit into a cell. However, choose column width wisely based on expected values, and adjust the table accordingly
39
+ */
40
+ export declare const DataTable: <Item extends {}>({ data, itemId, columns, onChange, status, noDataContent, errorContent, sorting, pagination, selectMode, selection, onSelectionChange, canSelectItem, canHoverRow, onRowHoveredChanged, }: DataTableProps<Item>) => JSX.Element;
41
+ export default DataTable;
@@ -0,0 +1,281 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _typeof = require("@babel/runtime/helpers/typeof");
6
+
7
+ Object.defineProperty(exports, "__esModule", {
8
+ value: true
9
+ });
10
+ exports["default"] = exports.DataTable = void 0;
11
+
12
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
13
+
14
+ var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
15
+
16
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
17
+
18
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
19
+
20
+ var _react = _interopRequireWildcard(require("react"));
21
+
22
+ var _compact = _interopRequireDefault(require("lodash/compact"));
23
+
24
+ var _get = _interopRequireDefault(require("lodash/get"));
25
+
26
+ var _satellitePrefixer = _interopRequireDefault(require("../../styles/helpers/satellitePrefixer"));
27
+
28
+ var _Checkbox = _interopRequireDefault(require("../../Checkbox"));
29
+
30
+ var _RadioGroup = require("../../RadioGroup");
31
+
32
+ var _utils = require("../../utils");
33
+
34
+ var _Table = _interopRequireDefault(require("../Table"));
35
+
36
+ var _Header = _interopRequireDefault(require("./components/Header"));
37
+
38
+ var _Footer = _interopRequireDefault(require("./components/Footer"));
39
+
40
+ var _Body = _interopRequireDefault(require("./components/Body"));
41
+
42
+ var _Loader = _interopRequireDefault(require("./components/Loader"));
43
+
44
+ var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8, _templateObject9, _templateObject10, _templateObject11;
45
+
46
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
47
+
48
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
49
+
50
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
51
+
52
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
53
+
54
+ var DEFAULT_GET_ITEM_ID = function DEFAULT_GET_ITEM_ID(_, idx) {
55
+ return String(idx);
56
+ };
57
+ /**
58
+ * Tables are used to structure content in a grid to make it easier to see relationships and to facilitate understanding.
59
+ *
60
+ * #### Do
61
+ *
62
+ * - Organize columns and rows based on the needs of your users. To help people read the table, order the columns by importance from left to right, with the key pieces of content opening the row
63
+ * - Include units of measurement symbols in the header so you don't need to repeat them throughout the columns
64
+ * - Indicate sorting capabilities of a column with a chevron in the cell header
65
+ * - Start by columns with highest value to the user, and continue with less important ones
66
+ *
67
+ * #### Do not
68
+ *
69
+ * - Center align text in cells
70
+ *
71
+ * ## Best practices
72
+ *
73
+ * - If a cell is empty or unavailable, keep the cell empty to reduce noise and help with legibility.
74
+ * - Truncate long text to make it fit into a cell. However, choose column width wisely based on expected values, and adjust the table accordingly
75
+ */
76
+
77
+
78
+ var DataTable = function DataTable(_ref) {
79
+ var data = _ref.data,
80
+ itemId = _ref.itemId,
81
+ columns = _ref.columns,
82
+ onChange = _ref.onChange,
83
+ _ref$status = _ref.status,
84
+ status = _ref$status === void 0 ? "success" : _ref$status,
85
+ noDataContent = _ref.noDataContent,
86
+ errorContent = _ref.errorContent,
87
+ _ref$sorting = _ref.sorting,
88
+ sorting = _ref$sorting === void 0 ? [] : _ref$sorting,
89
+ _ref$pagination = _ref.pagination,
90
+ pagination = _ref$pagination === void 0 ? false : _ref$pagination,
91
+ _ref$selectMode = _ref.selectMode,
92
+ selectMode = _ref$selectMode === void 0 ? "none" : _ref$selectMode,
93
+ selection = _ref.selection,
94
+ onSelectionChange = _ref.onSelectionChange,
95
+ canSelectItem = _ref.canSelectItem,
96
+ canHoverRow = _ref.canHoverRow,
97
+ onRowHoveredChanged = _ref.onRowHoveredChanged;
98
+
99
+ if (process.env.NODE_ENV !== "production") {
100
+ var _selection$length;
101
+
102
+ if (itemId === undefined && (sorting.length > 0 || selectMode !== null)) {
103
+ console.warn("You did not provide a custom `itemId` function, but you have defined `sorting` and/or `selectMode`. This can lead to unexpected results.");
104
+ }
105
+
106
+ if (selectMode === "single" && ((_selection$length = selection === null || selection === void 0 ? void 0 : selection.length) !== null && _selection$length !== void 0 ? _selection$length : 0) > 1) {
107
+ console.warn("You can only have one selected item at a time in single `selectMode`.");
108
+ }
109
+
110
+ if (pagination && data.length > pagination.itemsPerPage) {
111
+ console.warn("`pagination.itemsPerPage` (".concat(pagination.itemsPerPage, ") doesn't match `data.length` (").concat(data.length, ")."));
112
+ }
113
+ }
114
+
115
+ var _useState = (0, _react.useState)(),
116
+ _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
117
+ hoveredRowId = _useState2[0],
118
+ setHoveredRowId = _useState2[1];
119
+
120
+ (0, _react.useEffect)(function () {
121
+ // Reset hovered row when data changes to avoid inconsistent state
122
+ setHoveredRowId(undefined);
123
+ }, [data]);
124
+ var computedColumns = (0, _compact["default"])([selectMode === "single" && {
125
+ id: "_internal_singleSelect",
126
+ accessor: "_internal_singleSelect",
127
+ Header: function Header() {
128
+ return null;
129
+ },
130
+ Cell: function Cell(_ref2) {
131
+ var row = _ref2.row;
132
+ return /*#__PURE__*/_react["default"].createElement("div", {
133
+ className: (0, _satellitePrefixer["default"])(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2["default"])(["flex"])))
134
+ }, /*#__PURE__*/_react["default"].createElement(_RadioGroup.RadioButton, {
135
+ defaultChecked: row.selected,
136
+ disabled: !row.selectable,
137
+ className: (0, _satellitePrefixer["default"])(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2["default"])(["", ""])), row.hovered || row.selected ? "opacity-100" : "opacity-0 select-none")
138
+ }));
139
+ },
140
+ className: (0, _satellitePrefixer["default"])(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2["default"])(["w-3"])))
141
+ }, selectMode === "multi" && {
142
+ id: "_internal_multiSelect",
143
+ accessor: "_internal_multiSelect",
144
+ Header: function Header() {
145
+ var unselectableRows = rows.filter(function (row) {
146
+ return !row.selectable && row.selected;
147
+ }).map(function (r) {
148
+ return r.id;
149
+ });
150
+ var selectableRows = rows.filter(function (row) {
151
+ return row.selectable;
152
+ }).map(function (r) {
153
+ return r.id;
154
+ });
155
+ var selectionLength = (selection !== null && selection !== void 0 ? selection : []).length;
156
+ var dataLength = pagination ? pagination.itemsPerPage : data.length;
157
+ var isChecked = selectionLength === dataLength;
158
+ var isIndeterminate = selectionLength > 0 && selectionLength !== dataLength;
159
+ return /*#__PURE__*/_react["default"].createElement(_Checkbox["default"], {
160
+ "aria-label": "Select all" // Small hack to position the checkbox in the center of the header
161
+ ,
162
+ className: (0, _satellitePrefixer["default"])(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2["default"])(["absolute mb-2.5"]))),
163
+ checked: isChecked,
164
+ indeterminate: isIndeterminate,
165
+ onClick: function onClick() {
166
+ return isChecked ? onSelectionChange === null || onSelectionChange === void 0 ? void 0 : onSelectionChange(unselectableRows) : isIndeterminate ? onSelectionChange === null || onSelectionChange === void 0 ? void 0 : onSelectionChange(selectionLength === selectableRows.length + unselectableRows.length ? unselectableRows : [].concat((0, _toConsumableArray2["default"])(unselectableRows), (0, _toConsumableArray2["default"])(selectableRows))) : onSelectionChange === null || onSelectionChange === void 0 ? void 0 : onSelectionChange([].concat((0, _toConsumableArray2["default"])(unselectableRows), (0, _toConsumableArray2["default"])(selectableRows)));
167
+ }
168
+ });
169
+ },
170
+ Cell: function Cell(_ref3) {
171
+ var row = _ref3.row;
172
+ return /*#__PURE__*/_react["default"].createElement("div", {
173
+ className: (0, _satellitePrefixer["default"])(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2["default"])(["flex"])))
174
+ }, /*#__PURE__*/_react["default"].createElement(_Checkbox["default"], {
175
+ checked: row.selected,
176
+ disabled: !row.selectable,
177
+ className: (0, _satellitePrefixer["default"])(_templateObject6 || (_templateObject6 = (0, _taggedTemplateLiteral2["default"])(["", ""])), row.hovered || row.selected ? "opacity-100" : "opacity-0 select-none")
178
+ }));
179
+ },
180
+ className: (0, _satellitePrefixer["default"])(_templateObject7 || (_templateObject7 = (0, _taggedTemplateLiteral2["default"])(["w-3"])))
181
+ }].concat((0, _toConsumableArray2["default"])(columns.map(function (c) {
182
+ var _c$Header;
183
+
184
+ return typeof c === "string" ? {
185
+ id: c,
186
+ accessor: c,
187
+ Header: function Header() {
188
+ return /*#__PURE__*/_react["default"].createElement("span", null, (0, _utils.toSentenceCase)(c));
189
+ }
190
+ } : _objectSpread(_objectSpread({}, c), {}, {
191
+ Header: (_c$Header = c.Header) !== null && _c$Header !== void 0 ? _c$Header : function () {
192
+ return /*#__PURE__*/_react["default"].createElement("span", null, (0, _utils.toSentenceCase)(c.id));
193
+ }
194
+ });
195
+ }))));
196
+ var getItemIdInternal = itemId || DEFAULT_GET_ITEM_ID;
197
+ var rows = data.map(function (item, index) {
198
+ var _ref4;
199
+
200
+ var id = typeof getItemIdInternal === "string" ? String((0, _get["default"])(item, getItemIdInternal, DEFAULT_GET_ITEM_ID(item, index))) : getItemIdInternal(item, index);
201
+ var hovered = hoveredRowId === id;
202
+ var sanitizedSelection = (_ref4 = selectMode === "single" ? selection === null || selection === void 0 ? void 0 : selection.slice(0, 1) : selectMode === "none" ? [] : selection) !== null && _ref4 !== void 0 ? _ref4 : [];
203
+ var selected = sanitizedSelection.includes(id);
204
+ var selectable = selectMode !== "none" && (!canSelectItem || canSelectItem(item, index));
205
+ return {
206
+ item: item,
207
+ id: id,
208
+ hovered: hovered,
209
+ selected: selected,
210
+ selectable: selectable
211
+ };
212
+ });
213
+ var internalSorting = computedColumns.map(function (c) {
214
+ var _sorting$find$, _sorting$find;
215
+
216
+ return [c.id, c.sort ? (_sorting$find$ = (_sorting$find = sorting.find(function (_ref5) {
217
+ var _ref6 = (0, _slicedToArray2["default"])(_ref5, 1),
218
+ columnId = _ref6[0];
219
+
220
+ return columnId === c.id;
221
+ })) === null || _sorting$find === void 0 ? void 0 : _sorting$find[1]) !== null && _sorting$find$ !== void 0 ? _sorting$find$ : "desc" : "none"];
222
+ });
223
+
224
+ var onRowHoverChange = function onRowHoverChange(row) {
225
+ setHoveredRowId(row === null || row === void 0 ? void 0 : row.id);
226
+ onRowHoveredChanged === null || onRowHoveredChanged === void 0 ? void 0 : onRowHoveredChanged(row);
227
+ };
228
+
229
+ var handleToggleSort = function handleToggleSort(columnId, direction) {
230
+ var newSorting = internalSorting.map(function (_ref7) {
231
+ var _ref8 = (0, _slicedToArray2["default"])(_ref7, 2),
232
+ colId = _ref8[0],
233
+ d = _ref8[1];
234
+
235
+ return columnId === colId ? [columnId, direction] : [colId, d];
236
+ });
237
+ onChange === null || onChange === void 0 ? void 0 : onChange({
238
+ pagination: pagination,
239
+ sorting: newSorting
240
+ });
241
+ };
242
+
243
+ var handlePaginationChange = function handlePaginationChange(dataConfiguration) {
244
+ return onChange === null || onChange === void 0 ? void 0 : onChange(dataConfiguration);
245
+ };
246
+
247
+ return /*#__PURE__*/_react["default"].createElement("div", {
248
+ className: (0, _satellitePrefixer["default"])(_templateObject8 || (_templateObject8 = (0, _taggedTemplateLiteral2["default"])(["relative"])))
249
+ }, status === "loading" && /*#__PURE__*/_react["default"].createElement("div", {
250
+ className: (0, _satellitePrefixer["default"])(_templateObject9 || (_templateObject9 = (0, _taggedTemplateLiteral2["default"])(["absolute bg-white z-10 bg-opacity-50 w-full h-full flex items-center justify-center"])))
251
+ }, /*#__PURE__*/_react["default"].createElement(_Loader["default"], {
252
+ className: (0, _satellitePrefixer["default"])(_templateObject10 || (_templateObject10 = (0, _taggedTemplateLiteral2["default"])(["-mt-12"])))
253
+ })), /*#__PURE__*/_react["default"].createElement(_Table["default"], {
254
+ className: (0, _satellitePrefixer["default"])(_templateObject11 || (_templateObject11 = (0, _taggedTemplateLiteral2["default"])(["datatable ", " ", ""])), status === "loading" && "pointer-events-none select-none", status === "loading" && data.length === 0 && "h-48"),
255
+ highlight: false,
256
+ footer: pagination !== false && /*#__PURE__*/_react["default"].createElement(_Footer["default"], {
257
+ pagination: pagination,
258
+ onChange: handlePaginationChange
259
+ })
260
+ }, /*#__PURE__*/_react["default"].createElement(_Header["default"], {
261
+ disabled: status !== "success" || rows.length === 0,
262
+ columns: computedColumns,
263
+ onToggleSort: handleToggleSort,
264
+ sorting: internalSorting
265
+ }), /*#__PURE__*/_react["default"].createElement(_Body["default"], {
266
+ rows: rows,
267
+ columns: computedColumns,
268
+ status: status,
269
+ noDataContent: noDataContent,
270
+ errorContent: errorContent,
271
+ selectMode: selectMode,
272
+ selection: selection,
273
+ canHoverRow: canHoverRow,
274
+ onRowHoverChange: onRowHoverChange,
275
+ onSelectionChange: onSelectionChange
276
+ })));
277
+ };
278
+
279
+ exports.DataTable = DataTable;
280
+ var _default = DataTable;
281
+ exports["default"] = _default;
@@ -0,0 +1,5 @@
1
+ export = datatablePlugin;
2
+ /**
3
+ * @type {import('../../tailwind-types').TailwindPlugin}
4
+ */
5
+ declare const datatablePlugin: import('../../tailwind-types').TailwindPlugin;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+
3
+ // purgecss whitelist: th, td, tr
4
+
5
+ /**
6
+ * @type {import('../../tailwind-types').TailwindPlugin}
7
+ */
8
+ var datatablePlugin = function datatablePlugin(_ref) {
9
+ var addComponents = _ref.addComponents,
10
+ theme = _ref.theme;
11
+ addComponents({
12
+ ".datatable": {
13
+ "tr.row-disabled td": {
14
+ cursor: "not-allowed"
15
+ },
16
+ "tr:not(.row-disabled):hover td": {
17
+ backgroundColor: theme("colors.grey.50")
18
+ }
19
+ }
20
+ });
21
+ };
22
+
23
+ module.exports = datatablePlugin;
@@ -0,0 +1,14 @@
1
+ import React from "react";
2
+ import type { DataTableProps } from "../DataTable";
3
+ import type { Row, AdvancedColumnDefinition, Status, SelectMode } from "../types";
4
+ export interface BodyProps<Item> extends Pick<DataTableProps<Item>, "selection" | "onSelectionChange" | "canHoverRow"> {
5
+ rows: Row<Item>[];
6
+ status?: Status;
7
+ noDataContent?: React.ReactNode;
8
+ errorContent?: React.ReactNode;
9
+ columns: AdvancedColumnDefinition<Item>[];
10
+ onRowHoverChange(row: Row<Item> | null): void;
11
+ selectMode: SelectMode;
12
+ }
13
+ export declare const Body: <Item extends {}>({ rows, columns, status, noDataContent, errorContent, selectMode, selection, onSelectionChange, onRowHoverChange, canHoverRow, }: BodyProps<Item>) => JSX.Element;
14
+ export default Body;