@jobber/components 4.26.7 → 4.26.9-JOB-75261.9

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.
@@ -1,7 +1,28 @@
1
1
  import { ReactElement, ReactNode } from "react";
2
2
  export type DataListItemType<T extends DataListObject[]> = Record<keyof T[number], ReactElement>;
3
- export type DataListItemTypeFromHeader<T extends DataListHeader<T>> = Record<keyof T, ReactElement>;
4
- export type DataListObject = Record<string, ReactNode | Date>;
3
+ export type DataListItemTypeFromHeader<TData extends DataListObject, THeader extends DataListHeader<TData>> = Record<keyof THeader, ReactElement>;
4
+ export interface DataListObject {
5
+ /**
6
+ * The ID of the data.
7
+ *
8
+ * This is used as a key when looping through the data to prevent accidental
9
+ * rerender when the order of data changes.
10
+ */
11
+ readonly id: string | number;
12
+ /**
13
+ * Styles the string as an emphasized text that differs from other keys.
14
+ */
15
+ readonly label?: string | ReactElement;
16
+ /**
17
+ * Creates a styled list of tags that overflows and is truncated with a +N.
18
+ */
19
+ readonly tags?: string[];
20
+ /**
21
+ * Support any key. The keys in this object are used as way to determine the
22
+ * keys you can use on the DataList header, layout, etc.
23
+ */
24
+ readonly [key: string]: ReactNode | Date;
25
+ }
5
26
  export type DataListHeader<T extends DataListObject> = {
6
27
  readonly [K in keyof T]?: string;
7
28
  };
@@ -9,18 +30,20 @@ export interface DataListProps<T extends DataListObject> {
9
30
  readonly data: T[];
10
31
  readonly headers: DataListHeader<T>;
11
32
  /**
12
- * Tell the DataList if the data loading
33
+ * Shows the loading state of the DataList.
34
+ *
13
35
  * @default false
14
36
  */
15
37
  readonly loading?: boolean;
16
38
  /**
17
39
  * Temporary prop for setting default state for if filters are applied
40
+ *
18
41
  * @default false
19
42
  */
20
43
  readonly filterApplied?: boolean;
21
44
  readonly children: ReactElement | ReactElement[];
22
45
  /**
23
- * The title of the DataList
46
+ * The title of the DataList.
24
47
  */
25
48
  readonly title?: string;
26
49
  /**
@@ -12,7 +12,7 @@ export declare function generateListItemElements<T extends DataListObject>(data:
12
12
  /**
13
13
  * Generate the header elements with the default styling
14
14
  */
15
- export declare function generateHeaderElements<T extends DataListObject>(headers: DataListHeader<T>): DataListItemTypeFromHeader<DataListHeader<T>> | undefined;
15
+ export declare function generateHeaderElements<T extends DataListObject>(headers: DataListHeader<T>): DataListItemTypeFromHeader<T, DataListHeader<T>> | undefined;
16
16
  interface UseDataListEmptyStateProps {
17
17
  readonly children?: ReactElement | ReactElement[];
18
18
  readonly isFilterApplied: boolean;
@@ -5,6 +5,7 @@ interface BodyProps<T> {
5
5
  onRowClick?: (row: Row<T>) => void;
6
6
  height?: number;
7
7
  emptyState?: ReactNode | ReactNode[];
8
+ loading: boolean;
8
9
  }
9
- export declare function Body<T extends object>({ table, onRowClick, emptyState, }: BodyProps<T>): JSX.Element;
10
+ export declare function Body<T extends object>({ table, onRowClick, emptyState, loading, }: BodyProps<T>): JSX.Element;
10
11
  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-a14ad7fd.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-a6590328.js');
14
16
  require('../FormField-0f880b07.js');
15
17
  require('uuid');
16
18
  require('react-hook-form');
@@ -50,14 +52,16 @@ 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 Body({ table, onRowClick, emptyState, loading, }) {
54
56
  const bodyRowClasses = classnames__default["default"]({ [styles$3.clickableRow]: !!onRowClick });
55
57
  const handleRowClick = React.useCallback((row) => () => {
56
58
  if (onRowClick == undefined)
57
59
  return;
58
60
  onRowClick(row);
59
61
  }, [onRowClick]);
60
- return table.getRowModel().rows.length ? (React__default["default"].createElement("tbody", null, table.getRowModel().rows.map(row => {
62
+ const loaderRows = table.getState().pagination.pageSize;
63
+ const loaderColumns = table.getAllColumns().length;
64
+ return (React__default["default"].createElement(React__default["default"].Fragment, null, !loading ? (table.getRowModel().rows.length ? (React__default["default"].createElement("tbody", null, table.getRowModel().rows.map(row => {
61
65
  return (React__default["default"].createElement("tr", { key: row.id, onClick: handleRowClick(row), className: bodyRowClasses }, row.getVisibleCells().map(cell => {
62
66
  return (React__default["default"].createElement("td", { key: cell.id, style: {
63
67
  width: cell.column.getSize(),
@@ -65,7 +69,13 @@ function Body({ table, onRowClick, emptyState, }) {
65
69
  maxWidth: cell.column.columnDef.maxSize,
66
70
  } }, reactTable.flexRender(cell.column.columnDef.cell, cell.getContext())));
67
71
  })));
68
- }))) : (React__default["default"].createElement("div", { className: classnames__default["default"](styles$3.emptyState) }, emptyState));
72
+ }))) : (React__default["default"].createElement("div", { className: classnames__default["default"](styles$3.emptyState) },
73
+ emptyState,
74
+ " ",
75
+ React__default["default"].createElement("div", null,
76
+ "is it loading? ",
77
+ loading)))) : (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 },
78
+ React__default["default"].createElement(Glimmer.Glimmer, null)))))))))));
69
79
  }
70
80
 
71
81
  function createTableSettings(data, columns, options) {
@@ -126,15 +136,14 @@ var styles$2 = {"pagination":"zn0VRVhObt0-","paginationInfo":"_1d4uh90gfSI-","pa
126
136
  styleInject_es.styleInject(css_248z$2);
127
137
 
128
138
  const defaultItemsPerPageOptions = ["10", "20", "30", "40", "50"];
129
- function Pagination({ table, itemsPerPage, totalItems, }) {
139
+ function Pagination({ table, itemsPerPage, totalItems, loading, }) {
130
140
  const { pageIndex, pageSize } = table.getState().pagination;
131
141
  const totalRows = totalItems;
132
142
  const firstPosition = pageIndex * pageSize + 1;
133
143
  const secondPosition = Math.min(totalRows, pageSize * (pageIndex + 1));
134
144
  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
145
  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 },
146
+ 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
147
  React__default["default"].createElement("div", { className: styles$2.paginationInfo }, `Showing ${firstPosition}-${secondPosition} of ${totalRows} items`),
139
148
  React__default["default"].createElement("div", { className: styles$2.paginationNav },
140
149
  React__default["default"].createElement("div", { className: styles$2.paginationSelect },
@@ -233,7 +242,7 @@ function Header({ table, stickyHeader, sorting, onRowClick, }) {
233
242
  }))))));
234
243
  }
235
244
 
236
- function DataTable({ data, columns, pagination, sorting, height, stickyHeader, pinFirstColumn, onRowClick, emptyState, }) {
245
+ function DataTable({ data, columns, pagination, sorting, height, stickyHeader, pinFirstColumn, onRowClick, emptyState, loading = false, }) {
237
246
  const [ref, { exactWidth }] = jobberHooks.useResizeObserver();
238
247
  const tableSettings = createTableSettings(data, columns, {
239
248
  pagination,
@@ -247,7 +256,7 @@ function DataTable({ data, columns, pagination, sorting, height, stickyHeader, p
247
256
  React__default["default"].createElement("div", { className: styles$3.tableContainer, style: { height }, ref: ref },
248
257
  React__default["default"].createElement("table", { className: tableClasses },
249
258
  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 }),
259
+ React__default["default"].createElement(Body, { table: table, onRowClick: onRowClick, height: height ? height * 0.7 : undefined, emptyState: emptyState, loading: loading }),
251
260
  table.getRowModel().rows.length &&
252
261
  exactWidth &&
253
262
  exactWidth > jobberHooks.Breakpoints.small ? (React__default["default"].createElement(Footer, { table: table, viewType: "desktop" })) : null)),
@@ -256,7 +265,7 @@ function DataTable({ data, columns, pagination, sorting, height, stickyHeader, p
256
265
  exactWidth <= jobberHooks.Breakpoints.small ? (React__default["default"].createElement(Footer, { table: table })) : null,
257
266
  pagination && (React__default["default"].createElement(Pagination, { table: table, itemsPerPage: pagination.itemsPerPage, totalItems: pagination.manualPagination
258
267
  ? pagination.totalItems
259
- : table.getCoreRowModel().rows.length }))));
268
+ : table.getCoreRowModel().rows.length, loading: loading }))));
260
269
  }
261
270
 
262
271
  const mockContainerWidth = (exactWidth) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jobber/components",
3
- "version": "4.26.7",
3
+ "version": "4.26.9-JOB-75261.9+e2544f82",
4
4
  "license": "MIT",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -20,7 +20,7 @@
20
20
  ],
21
21
  "dependencies": {
22
22
  "@jobber/design": "^0.44.4",
23
- "@jobber/formatters": "*",
23
+ "@jobber/formatters": "^0.2.2",
24
24
  "@jobber/hooks": "^2.1.5",
25
25
  "@popperjs/core": "^2.0.6",
26
26
  "@std-proposal/temporal": "0.0.1",
@@ -84,5 +84,5 @@
84
84
  "> 1%",
85
85
  "IE 10"
86
86
  ],
87
- "gitHead": "c6b61f85327bcde7c60767afaf3dbfc6dc3b9f0e"
87
+ "gitHead": "e2544f821998f10cae184786edce75cad1b74c28"
88
88
  }