@jobber/components 4.27.0 → 4.28.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.
@@ -3,8 +3,8 @@ import { ReactNode } from "react";
3
3
  interface BodyProps<T> {
4
4
  table: Table<T>;
5
5
  onRowClick?: (row: Row<T>) => void;
6
- height?: number;
7
6
  emptyState?: ReactNode | ReactNode[];
7
+ loading: boolean;
8
8
  }
9
- export declare function Body<T extends object>({ table, onRowClick, emptyState, }: BodyProps<T>): JSX.Element;
9
+ export declare function Body<T extends object>({ table, onRowClick, emptyState, loading, }: BodyProps<T>): JSX.Element;
10
10
  export {};
@@ -0,0 +1,7 @@
1
+ /// <reference types="react" />
2
+ import { Table } from "@tanstack/react-table";
3
+ interface BodyLoadingProps<T> {
4
+ table: Table<T>;
5
+ }
6
+ export declare function BodyLoading<T extends object>({ table }: BodyLoadingProps<T>): JSX.Element;
7
+ export {};
@@ -49,5 +49,9 @@ export interface DataTableProps<T> {
49
49
  * The elements to display when the data table is empty
50
50
  */
51
51
  emptyState?: ReactNode | ReactNode[];
52
+ /**
53
+ * When true, shows the loading state of the DataTable
54
+ */
55
+ loading?: boolean;
52
56
  }
53
- export declare function DataTable<T extends object>({ data, columns, pagination, sorting, height, stickyHeader, pinFirstColumn, onRowClick, emptyState, }: DataTableProps<T>): JSX.Element;
57
+ export declare function DataTable<T extends object>({ data, columns, pagination, sorting, height, stickyHeader, pinFirstColumn, onRowClick, emptyState, loading, }: DataTableProps<T>): JSX.Element;
@@ -4,6 +4,7 @@ interface PaginationProps<T> {
4
4
  table: Table<T>;
5
5
  itemsPerPage?: number[];
6
6
  totalItems: number;
7
+ loading: boolean;
7
8
  }
8
- export declare function Pagination<T extends object>({ table, itemsPerPage, totalItems, }: PaginationProps<T>): JSX.Element;
9
+ export declare function Pagination<T extends object>({ table, itemsPerPage, totalItems, loading, }: PaginationProps<T>): JSX.Element;
9
10
  export {};
@@ -7,10 +7,12 @@ var classnames = require('classnames');
7
7
  var React = require('react');
8
8
  var jobberHooks = require('@jobber/hooks/useResizeObserver');
9
9
  var styleInject_es = require('../style-inject.es-9d2f5f4e.js');
10
+ var Glimmer = require('../Glimmer-cfa92a88.js');
10
11
  var tslib_es6 = require('../tslib.es6-5b8768b7.js');
11
12
  var Option = require('../Option-63267b27.js');
12
13
  var Button = require('../Button-7698424c.js');
13
14
  var Text = require('../Text-e7ed0974.js');
15
+ require('../Content-2ca1ffe1.js');
14
16
  require('../FormField-0f880b07.js');
15
17
  require('uuid');
16
18
  require('react-hook-form');
@@ -50,14 +52,24 @@ var css_248z$3 = ".m5A5oeRFaMs- {\n position: relative;\n border: calc(16px /
50
52
  var styles$3 = {"dataTableContainer":"m5A5oeRFaMs-","tableContainer":"cY-5BrIIUg8-","table":"y8xnHe7fwrI-","pinFirstColumn":"t8QYvdtkQXQ-","stickyHeader":"Y21JuHX6fhk-","pinFirstHeaderSortable":"PJEX8dlqCMA-","sortableColumn":"_9ps4aWGs8W0-","clickableRow":"_59XEEB8l5pI-","emptyState":"a2BGGBkY5J8-"};
51
53
  styleInject_es.styleInject(css_248z$3);
52
54
 
53
- function Body({ table, onRowClick, emptyState, }) {
55
+ function BodyLoading({ table }) {
56
+ const loaderRows = table.getState().pagination.pageSize;
57
+ const loaderColumns = table.getAllColumns().length;
58
+ return (React__default["default"].createElement("tbody", null, Array.from(Array(loaderRows).keys()).map(row => (React__default["default"].createElement("tr", { key: row }, Array.from(Array(loaderColumns).keys()).map(arr => (React__default["default"].createElement("td", { key: arr },
59
+ React__default["default"].createElement(Glimmer.Glimmer, null)))))))));
60
+ }
61
+
62
+ function Body({ table, onRowClick, emptyState, loading, }) {
54
63
  const bodyRowClasses = classnames__default["default"]({ [styles$3.clickableRow]: !!onRowClick });
55
64
  const handleRowClick = React.useCallback((row) => () => {
56
65
  if (onRowClick == undefined)
57
66
  return;
58
67
  onRowClick(row);
59
68
  }, [onRowClick]);
60
- return table.getRowModel().rows.length ? (React__default["default"].createElement("tbody", null, table.getRowModel().rows.map(row => {
69
+ if (loading) {
70
+ return React__default["default"].createElement(BodyLoading, { table: table });
71
+ }
72
+ return (React__default["default"].createElement(React__default["default"].Fragment, null, table.getRowModel().rows.length ? (React__default["default"].createElement("tbody", null, table.getRowModel().rows.map(row => {
61
73
  return (React__default["default"].createElement("tr", { key: row.id, onClick: handleRowClick(row), className: bodyRowClasses }, row.getVisibleCells().map(cell => {
62
74
  return (React__default["default"].createElement("td", { key: cell.id, style: {
63
75
  width: cell.column.getSize(),
@@ -65,7 +77,7 @@ function Body({ table, onRowClick, emptyState, }) {
65
77
  maxWidth: cell.column.columnDef.maxSize,
66
78
  } }, reactTable.flexRender(cell.column.columnDef.cell, cell.getContext())));
67
79
  })));
68
- }))) : (React__default["default"].createElement("div", { className: classnames__default["default"](styles$3.emptyState) }, emptyState));
80
+ }))) : (React__default["default"].createElement("div", { className: classnames__default["default"](styles$3.emptyState) }, emptyState))));
69
81
  }
70
82
 
71
83
  function createTableSettings(data, columns, options) {
@@ -126,15 +138,14 @@ var styles$2 = {"pagination":"zn0VRVhObt0-","paginationInfo":"_1d4uh90gfSI-","pa
126
138
  styleInject_es.styleInject(css_248z$2);
127
139
 
128
140
  const defaultItemsPerPageOptions = ["10", "20", "30", "40", "50"];
129
- function Pagination({ table, itemsPerPage, totalItems, }) {
141
+ function Pagination({ table, itemsPerPage, totalItems, loading, }) {
130
142
  const { pageIndex, pageSize } = table.getState().pagination;
131
143
  const totalRows = totalItems;
132
144
  const firstPosition = pageIndex * pageSize + 1;
133
145
  const secondPosition = Math.min(totalRows, pageSize * (pageIndex + 1));
134
146
  const itemsPerPageOptions = React.useMemo(() => { var _a; return (_a = itemsPerPage === null || itemsPerPage === void 0 ? void 0 : itemsPerPage.map(item => String(item))) !== null && _a !== void 0 ? _a : defaultItemsPerPageOptions; }, [itemsPerPage]);
135
147
  return secondPosition <= 0 ? (React__default["default"].createElement("div", { className: styles$2.pagination },
136
- React__default["default"].createElement("div", { className: styles$2.paginationInfo },
137
- React__default["default"].createElement(Text.Text, null, "No items")))) : (React__default["default"].createElement("div", { className: styles$2.pagination },
148
+ React__default["default"].createElement("div", { className: styles$2.paginationInfo }, !loading ? React__default["default"].createElement(Text.Text, null, "No items") : React__default["default"].createElement(Glimmer.Glimmer, { width: 200 })))) : (React__default["default"].createElement("div", { className: styles$2.pagination },
138
149
  React__default["default"].createElement("div", { className: styles$2.paginationInfo }, `Showing ${firstPosition}-${secondPosition} of ${totalRows} items`),
139
150
  React__default["default"].createElement("div", { className: styles$2.paginationNav },
140
151
  React__default["default"].createElement("div", { className: styles$2.paginationSelect },
@@ -233,7 +244,7 @@ function Header({ table, stickyHeader, sorting, onRowClick, }) {
233
244
  }))))));
234
245
  }
235
246
 
236
- function DataTable({ data, columns, pagination, sorting, height, stickyHeader, pinFirstColumn, onRowClick, emptyState, }) {
247
+ function DataTable({ data, columns, pagination, sorting, height, stickyHeader, pinFirstColumn, onRowClick, emptyState, loading = false, }) {
237
248
  const [ref, { exactWidth }] = jobberHooks.useResizeObserver();
238
249
  const tableSettings = createTableSettings(data, columns, {
239
250
  pagination,
@@ -247,7 +258,7 @@ function DataTable({ data, columns, pagination, sorting, height, stickyHeader, p
247
258
  React__default["default"].createElement("div", { className: styles$3.tableContainer, style: { height }, ref: ref },
248
259
  React__default["default"].createElement("table", { className: tableClasses },
249
260
  React__default["default"].createElement(Header, { table: table, sorting: sorting, onRowClick: onRowClick, stickyHeader: stickyHeader }),
250
- React__default["default"].createElement(Body, { table: table, onRowClick: onRowClick, height: height ? height * 0.7 : undefined, emptyState: emptyState }),
261
+ React__default["default"].createElement(Body, { table: table, onRowClick: onRowClick, emptyState: emptyState, loading: loading }),
251
262
  table.getRowModel().rows.length &&
252
263
  exactWidth &&
253
264
  exactWidth > jobberHooks.Breakpoints.small ? (React__default["default"].createElement(Footer, { table: table, viewType: "desktop" })) : null)),
@@ -256,7 +267,7 @@ function DataTable({ data, columns, pagination, sorting, height, stickyHeader, p
256
267
  exactWidth <= jobberHooks.Breakpoints.small ? (React__default["default"].createElement(Footer, { table: table })) : null,
257
268
  pagination && (React__default["default"].createElement(Pagination, { table: table, itemsPerPage: pagination.itemsPerPage, totalItems: pagination.manualPagination
258
269
  ? pagination.totalItems
259
- : table.getCoreRowModel().rows.length }))));
270
+ : table.getCoreRowModel().rows.length, loading: loading }))));
260
271
  }
261
272
 
262
273
  const mockContainerWidth = (exactWidth) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jobber/components",
3
- "version": "4.27.0",
3
+ "version": "4.28.1",
4
4
  "license": "MIT",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -84,5 +84,5 @@
84
84
  "> 1%",
85
85
  "IE 10"
86
86
  ],
87
- "gitHead": "8ae1169e35b132825ecad1640d58a511375d481c"
87
+ "gitHead": "cd6117790dbde6fa5ed9882a5e3eb0a82c235f7f"
88
88
  }