@jobber/components 4.27.0 → 4.28.0

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,22 +52,37 @@ 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 => {
61
- return (React__default["default"].createElement("tr", { key: row.id, onClick: handleRowClick(row), className: bodyRowClasses }, row.getVisibleCells().map(cell => {
62
- return (React__default["default"].createElement("td", { key: cell.id, style: {
63
- width: cell.column.getSize(),
64
- minWidth: cell.column.columnDef.minSize,
65
- maxWidth: cell.column.columnDef.maxSize,
66
- } }, reactTable.flexRender(cell.column.columnDef.cell, cell.getContext())));
67
- })));
68
- }))) : (React__default["default"].createElement("div", { className: classnames__default["default"](styles$3.emptyState) }, emptyState));
69
+ if (loading) {
70
+ return React__default["default"].createElement(BodyLoading, { table: table });
71
+ }
72
+ return (React__default["default"].createElement(React__default["default"].Fragment, null,
73
+ "table.getRowModel().rows.length ? (",
74
+ React__default["default"].createElement("tbody", null, table.getRowModel().rows.map(row => {
75
+ return (React__default["default"].createElement("tr", { key: row.id, onClick: handleRowClick(row), className: bodyRowClasses }, row.getVisibleCells().map(cell => {
76
+ return (React__default["default"].createElement("td", { key: cell.id, style: {
77
+ width: cell.column.getSize(),
78
+ minWidth: cell.column.columnDef.minSize,
79
+ maxWidth: cell.column.columnDef.maxSize,
80
+ } }, reactTable.flexRender(cell.column.columnDef.cell, cell.getContext())));
81
+ })));
82
+ })),
83
+ ") : (",
84
+ React__default["default"].createElement("div", { className: classnames__default["default"](styles$3.emptyState) }, emptyState),
85
+ ")"));
69
86
  }
70
87
 
71
88
  function createTableSettings(data, columns, options) {
@@ -126,15 +143,14 @@ var styles$2 = {"pagination":"zn0VRVhObt0-","paginationInfo":"_1d4uh90gfSI-","pa
126
143
  styleInject_es.styleInject(css_248z$2);
127
144
 
128
145
  const defaultItemsPerPageOptions = ["10", "20", "30", "40", "50"];
129
- function Pagination({ table, itemsPerPage, totalItems, }) {
146
+ function Pagination({ table, itemsPerPage, totalItems, loading, }) {
130
147
  const { pageIndex, pageSize } = table.getState().pagination;
131
148
  const totalRows = totalItems;
132
149
  const firstPosition = pageIndex * pageSize + 1;
133
150
  const secondPosition = Math.min(totalRows, pageSize * (pageIndex + 1));
134
151
  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
152
  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 },
153
+ 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
154
  React__default["default"].createElement("div", { className: styles$2.paginationInfo }, `Showing ${firstPosition}-${secondPosition} of ${totalRows} items`),
139
155
  React__default["default"].createElement("div", { className: styles$2.paginationNav },
140
156
  React__default["default"].createElement("div", { className: styles$2.paginationSelect },
@@ -233,7 +249,7 @@ function Header({ table, stickyHeader, sorting, onRowClick, }) {
233
249
  }))))));
234
250
  }
235
251
 
236
- function DataTable({ data, columns, pagination, sorting, height, stickyHeader, pinFirstColumn, onRowClick, emptyState, }) {
252
+ function DataTable({ data, columns, pagination, sorting, height, stickyHeader, pinFirstColumn, onRowClick, emptyState, loading = false, }) {
237
253
  const [ref, { exactWidth }] = jobberHooks.useResizeObserver();
238
254
  const tableSettings = createTableSettings(data, columns, {
239
255
  pagination,
@@ -247,7 +263,7 @@ function DataTable({ data, columns, pagination, sorting, height, stickyHeader, p
247
263
  React__default["default"].createElement("div", { className: styles$3.tableContainer, style: { height }, ref: ref },
248
264
  React__default["default"].createElement("table", { className: tableClasses },
249
265
  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 }),
266
+ React__default["default"].createElement(Body, { table: table, onRowClick: onRowClick, emptyState: emptyState, loading: loading }),
251
267
  table.getRowModel().rows.length &&
252
268
  exactWidth &&
253
269
  exactWidth > jobberHooks.Breakpoints.small ? (React__default["default"].createElement(Footer, { table: table, viewType: "desktop" })) : null)),
@@ -256,7 +272,7 @@ function DataTable({ data, columns, pagination, sorting, height, stickyHeader, p
256
272
  exactWidth <= jobberHooks.Breakpoints.small ? (React__default["default"].createElement(Footer, { table: table })) : null,
257
273
  pagination && (React__default["default"].createElement(Pagination, { table: table, itemsPerPage: pagination.itemsPerPage, totalItems: pagination.manualPagination
258
274
  ? pagination.totalItems
259
- : table.getCoreRowModel().rows.length }))));
275
+ : table.getCoreRowModel().rows.length, loading: loading }))));
260
276
  }
261
277
 
262
278
  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.0",
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": "d1f65a97649c0cebfb21f03d195d7f94d0afe46f"
88
88
  }