playbook_ui 13.17.0 → 13.18.0.pre.alpha.PBNTR191AdvancedTableFinalFixes2159

Sign up to get free protection for your applications and to get access to all the features.
Files changed (54) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/_reset.scss +2 -2
  3. data/app/pb_kits/playbook/pb_advanced_table/Components/CustomCell.tsx +5 -3
  4. data/app/pb_kits/playbook/pb_advanced_table/Components/SubRowHeaderRow.tsx +4 -3
  5. data/app/pb_kits/playbook/pb_advanced_table/Components/TableHeaderCell.tsx +18 -13
  6. data/app/pb_kits/playbook/pb_advanced_table/SubKits/TableBody.tsx +26 -4
  7. data/app/pb_kits/playbook/pb_advanced_table/SubKits/TableHeader.tsx +18 -4
  8. data/app/pb_kits/playbook/pb_advanced_table/Utilities/ExpansionControlHelpers.tsx +3 -4
  9. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.tsx +15 -7
  10. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.test.jsx +328 -3
  11. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_collapsible_trail.jsx +52 -0
  12. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_collapsible_trail.md +1 -0
  13. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_default.md +7 -2
  14. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_expanded_control.jsx +59 -0
  15. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_expanded_control.md +18 -0
  16. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_loading.jsx +60 -0
  17. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_loading.md +3 -0
  18. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_sort.jsx +1 -6
  19. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_sort.md +5 -0
  20. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_sort_control.jsx +63 -0
  21. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_sort_control.md +3 -0
  22. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_subrow_headers.jsx +57 -0
  23. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_subrow_headers.md +3 -0
  24. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_options.jsx +61 -0
  25. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_options.md +3 -0
  26. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props.jsx +55 -0
  27. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props.md +1 -0
  28. data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +10 -4
  29. data/app/pb_kits/playbook/pb_advanced_table/docs/index.js +7 -0
  30. data/app/pb_kits/playbook/pb_advanced_table/scss_partials/_loading.scss +4 -3
  31. data/app/pb_kits/playbook/pb_collapsible/_collapsible.scss +2 -2
  32. data/app/pb_kits/playbook/pb_date_picker/sass_partials/_flatpickr_styles.scss +1 -1
  33. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_validation.html.erb +5 -7
  34. data/app/pb_kits/playbook/pb_popover/_popover.tsx +12 -14
  35. data/app/pb_kits/playbook/pb_popover/docs/_popover_actionable_content.html.erb +30 -0
  36. data/app/pb_kits/playbook/pb_popover/docs/_popover_actionable_content.jsx +57 -0
  37. data/app/pb_kits/playbook/pb_popover/docs/example.yml +2 -1
  38. data/app/pb_kits/playbook/pb_popover/docs/index.js +1 -0
  39. data/app/pb_kits/playbook/pb_popover/popover.test.js +29 -31
  40. data/app/pb_kits/playbook/pb_table/_table.tsx +3 -0
  41. data/app/pb_kits/playbook/pb_table/docs/_table_striped.html.erb +48 -0
  42. data/app/pb_kits/playbook/pb_table/docs/_table_striped.jsx +58 -0
  43. data/app/pb_kits/playbook/pb_table/docs/_table_striped.md +1 -0
  44. data/app/pb_kits/playbook/pb_table/docs/example.yml +2 -0
  45. data/app/pb_kits/playbook/pb_table/docs/index.js +1 -0
  46. data/app/pb_kits/playbook/pb_table/styles/_all.scss +1 -0
  47. data/app/pb_kits/playbook/pb_table/styles/_striped.scss +19 -0
  48. data/app/pb_kits/playbook/pb_table/table.rb +7 -1
  49. data/app/pb_kits/playbook/pb_table/table.test.js +5 -0
  50. data/dist/menu.yml +102 -3
  51. data/dist/playbook-rails.js +7 -7
  52. data/dist/reset.css +1 -2
  53. data/lib/playbook/version.rb +2 -2
  54. metadata +28 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 8c288d80cbfc92741e976eda7ca6fd7e4ecbf256b5f5ad9e4e8a23f2b4ddb6ae
4
- data.tar.gz: 675612e33fd9e560aa274763e5de44bfea34fd1af570d03b951a803994fbd4dd
3
+ metadata.gz: ed6b5c8bc5abff794a42552366bce14785ce52a52f77e4897a96c59279b6bab0
4
+ data.tar.gz: 0b1feee9f1e0abafb95db62e695a1c4df57a95f82e0acdf0e079a9febf22f52c
5
5
  SHA512:
6
- metadata.gz: 3d14807433425abbbd0fdf53733c4e2addc7ebb6506d35a89ea7b06f06746c39e815d7e3100a57e54cf4fea14cfb8779693b0140da9d4b4f31eb5867a752b467
7
- data.tar.gz: 916468edea21563fb47710ec9a691e16a0ba1852fc4b4f97637884d560a5ae0b7b55a6a434bfd73fec6d756e68b5af89a5b4b49f2b97f4f19d3b38fa4463df0e
6
+ metadata.gz: 73a5a055067a0942784bb05576cf3cfc1002be59a2a06a061ea130da7f2eb561d86f61db61704874231d209ad32ead88ae47775058d43e2a7aba2bf4f73942ac
7
+ data.tar.gz: 2bff7638226878a69f3c8b7d3eed25c0a794be24894f82164983b8829d46c9cf874ec880f18e396052b615cc58d824420058fff6a698d23848b43bec7e674481
@@ -1,5 +1,5 @@
1
- @import "./tokens/typography";
2
- @import "./tokens/colors";
1
+ @import "tokens/typography";
2
+ @import "tokens/colors";
3
3
 
4
4
  * {
5
5
  box-sizing: border-box;
@@ -23,20 +23,22 @@ export const CustomCell = ({
23
23
  value,
24
24
  }: CustomCellProps & GlobalProps) => {
25
25
  const { setExpanded, expanded } = useContext(AdvancedTableContext);
26
- const RowWithoutChildren = row.originalSubRows === undefined;
27
26
 
28
27
  const handleOnExpand = (row: Row<DataType>) => {
29
28
  onRowToggleClick && onRowToggleClick(row);
30
29
  setExpanded({ ...expanded, [row.id]: !row.getIsExpanded() });
31
30
  };
32
31
 
32
+ const RowHasChildren = row.original.children ? true : false
33
+
34
+
33
35
  return (
34
36
  <div style={{ paddingLeft: `${row.depth * 1.25}em` }}>
35
37
  <Flex alignItems="center"
36
38
  columnGap="xs"
37
39
  orientation="row"
38
40
  >
39
- {!RowWithoutChildren ? (
41
+ {RowHasChildren ? (
40
42
  <button
41
43
  className="gray-icon expand-toggle-icon"
42
44
  onClick={() => handleOnExpand(row)}
@@ -53,7 +55,7 @@ export const CustomCell = ({
53
55
  )}
54
56
  </button>
55
57
  ) : null}
56
- <FlexItem paddingLeft={!RowWithoutChildren ? "none" : "xs"}>
58
+ <FlexItem paddingLeft={RowHasChildren? "none" : "xs"}>
57
59
  {row.depth === 0 ? getValue() : value}
58
60
  </FlexItem>
59
61
  </Flex>
@@ -12,7 +12,7 @@ import { GlobalProps } from "../../utilities/globalProps"
12
12
 
13
13
  interface SubRowHeaderRowProps {
14
14
  collapsibleTrail?: boolean
15
- enableToggleExpansion?: "all" | "header"
15
+ enableToggleExpansion?: "all" | "header" | "none"
16
16
  onClick: (row: Row<DataType>) => void
17
17
  row: Row<DataType>
18
18
  subRowHeaders?: string[]
@@ -28,6 +28,7 @@ export const SubRowHeaderRow = ({
28
28
  table,
29
29
  }: SubRowHeaderRowProps & GlobalProps) => {
30
30
  const numberOfColumns = table.getAllFlatColumns().length
31
+ const canExpand = row.depth < subRowHeaders.length
31
32
 
32
33
  return (
33
34
  <tr className="custom-row bg-silver">
@@ -42,13 +43,13 @@ export const SubRowHeaderRow = ({
42
43
  <Flex align="center"
43
44
  columnGap="xs"
44
45
  >
45
- {enableToggleExpansion === "all" && row.getCanExpand() ? (
46
+ {enableToggleExpansion === "all" && canExpand ? (
46
47
  <ToggleIconButton onClick={onClick}
47
48
  row={row}
48
49
  />
49
50
  ) : null}
50
51
  <Caption
51
- marginLeft={row.getCanExpand() ? "none" : "xs"}
52
+ marginLeft={canExpand ? "none" : "xs"}
52
53
  text={subRowHeaders[row.depth - 1]}
53
54
  />
54
55
  </Flex>
@@ -12,11 +12,10 @@ import { GlobalProps } from "../../utilities/globalProps"
12
12
 
13
13
  type TableHeaderCellProps = {
14
14
  enableSorting?: boolean
15
- enableToggleExpansion?: "all" | "header"
15
+ enableToggleExpansion?: "all" | "header" | "none"
16
16
  handleExpandOrCollapse?: () => void
17
17
  header?: Header<DataType, unknown>
18
18
  headerChildren?: React.ReactNode | React.ReactNode[]
19
- headerId?: string
20
19
  loading?: boolean
21
20
  sortIcon?: string | string[]
22
21
  } & GlobalProps
@@ -27,7 +26,6 @@ export const TableHeaderCell = ({
27
26
  handleExpandOrCollapse,
28
27
  header,
29
28
  headerChildren,
30
- headerId,
31
29
  loading,
32
30
  sortIcon,
33
31
  }: TableHeaderCellProps) => {
@@ -50,10 +48,22 @@ const cellClassName = classnames("table-header-cells",
50
48
  );
51
49
 
52
50
  const cellId = `${loading ?
53
- `loading-${header.id}${headerId ? `-${headerId}` : ""}`
54
- : `${header.id}${headerId ? `-${headerId}` : ""}`
51
+ `loading-${header.id}`
52
+ : `${header.id}`
55
53
  }`;
56
54
 
55
+ const isToggleExpansionEnabledLoading =
56
+ header.index === 0 &&
57
+ loading &&
58
+ (enableToggleExpansion === "all" || "header") &&
59
+ enableToggleExpansion !== "none";
60
+
61
+ const isToggleExpansionEnabled =
62
+ header.index === 0 &&
63
+ !loading &&
64
+ (enableToggleExpansion === "all" || "header") &&
65
+ enableToggleExpansion !== "none";
66
+
57
67
  return (
58
68
  <th
59
69
  align="right"
@@ -72,17 +82,12 @@ const cellId = `${loading ?
72
82
  <Flex
73
83
  alignItems="center"
74
84
  justify={header.index === 0 && enableSorting ? "between" : header.index === 0 && !enableSorting ? "start" : "end"}
75
- paddingLeft={loading ? "sm" : "none"}
76
85
  >
77
- {header.index === 0 &&
78
- !loading &&
79
- (enableToggleExpansion === "all" || "header") && (
86
+ {isToggleExpansionEnabled && (
80
87
  <ToggleIconButton onClick={handleExpandOrCollapse} />
81
88
  )}
82
89
 
83
- {header.index === 0 &&
84
- loading &&
85
- (enableToggleExpansion === "all" || "header") && (
90
+ {isToggleExpansionEnabledLoading &&(
86
91
  <div className="loading-toggle-icon header-toggle-icon" />
87
92
  )}
88
93
 
@@ -114,7 +119,7 @@ const cellId = `${loading ?
114
119
  header.column.getCanSort() &&
115
120
  enableSorting &&
116
121
  (loading ? (
117
- <div className="loading-toggle-icon header-sort-icon" />
122
+ <div className="loading-toggle-icon" />
118
123
  ) : (
119
124
  <SortIconButton header={header}
120
125
  sortIcon={sortIcon}
@@ -1,4 +1,7 @@
1
1
  import React, { useContext } from "react"
2
+ import classnames from "classnames";
3
+ import { buildCss } from "../../utilities/props";
4
+ import { globalProps } from "../../utilities/globalProps";
2
5
  import LoadingInline from "../../pb_loading_inline/_loading_inline"
3
6
  import { flexRender, Row } from "@tanstack/react-table"
4
7
 
@@ -10,28 +13,45 @@ import { isChrome } from "../Utilities/BrowserCheck"
10
13
  import { DataType } from "../Utilities/types"
11
14
 
12
15
  type TableBodyProps = {
16
+ className?: string;
13
17
  collapsibleTrail?: boolean
18
+ id?: string;
14
19
  subRowHeaders?: string[]
15
20
  }
16
21
 
17
22
  export const TableBody = ({
23
+ className,
18
24
  collapsibleTrail = true,
25
+ id,
19
26
  subRowHeaders,
27
+ ...props
20
28
  }: TableBodyProps) => {
29
+
21
30
  const {
31
+ columnDefinitions,
22
32
  enableToggleExpansion,
23
33
  handleExpandOrCollapse,
24
34
  loading,
25
35
  table,
26
36
  } = useContext(AdvancedTableContext)
37
+
38
+ const classes = classnames(
39
+ buildCss("pb_advanced_table_body"),
40
+ globalProps(props),
41
+ className
42
+ );
43
+
27
44
  return (
28
45
  <>
29
- <tbody>
46
+ <tbody className={classes}
47
+ id={id}
48
+ >
30
49
  {table.getRowModel().rows.map((row: Row<DataType>) => {
31
50
  const isExpandable = row.getIsExpanded()
32
51
  const isFirstChildofSubrow = row.depth > 0 && row.index === 0
33
- const rowHasNoChildren = !row.original.children?.length
52
+ const rowHasNoChildren = row.original.children && !row.original.children.length ? true : false
34
53
  const numberOfColumns = table.getAllFlatColumns().length
54
+ const isDataLoading = isExpandable && rowHasNoChildren && (row.depth < columnDefinitions[0].cellAccessors?.length)
35
55
 
36
56
  return (
37
57
  <React.Fragment key={`${row.index}-${row.id}-${row.depth}-row`}>
@@ -79,9 +99,11 @@ export const TableBody = ({
79
99
  </tr>
80
100
 
81
101
  {/* Display LoadingInline if Row Data is querying and there are no children already */}
82
- {isExpandable && rowHasNoChildren && row.depth === 0 ? (
102
+ {isDataLoading ? (
83
103
  <tr key={`${row.id}-row`}>
84
- <td colSpan={numberOfColumns}>
104
+ <td colSpan={numberOfColumns}
105
+ style={{ paddingLeft: `${row.depth === 0 ? 0.5 : (row.depth * 2)}em` }}
106
+ >
85
107
  <LoadingInline />
86
108
  </td>
87
109
  </tr>
@@ -1,4 +1,7 @@
1
1
  import React, { useContext } from "react"
2
+ import classnames from "classnames";
3
+ import { buildCss } from "../../utilities/props";
4
+ import { globalProps } from "../../utilities/globalProps";
2
5
  import { HeaderGroup } from "@tanstack/react-table"
3
6
  import AdvancedTableContext from "../Context/AdvancedTableContext"
4
7
  import { TableHeaderCell } from "../Components/TableHeaderCell"
@@ -6,16 +9,19 @@ import { DataType } from "../Utilities/types"
6
9
 
7
10
  type TableHeaderProps = {
8
11
  children?: React.ReactNode | React.ReactNode[]
12
+ className?: string
9
13
  enableSorting?: boolean
10
- headerId?: string
14
+ id?: string;
11
15
  sortIcon?: string | string[]
12
16
  }
13
17
 
14
18
  export const TableHeader = ({
15
19
  children,
20
+ className,
16
21
  enableSorting = false,
17
- headerId,
22
+ id,
18
23
  sortIcon = ["arrow-up-short-wide", "arrow-down-short-wide"],
24
+ ...props
19
25
  }: TableHeaderProps) => {
20
26
  const {
21
27
  enableToggleExpansion,
@@ -24,9 +30,18 @@ export const TableHeader = ({
24
30
  table,
25
31
  } = useContext(AdvancedTableContext)
26
32
 
33
+ const classes = classnames(
34
+ buildCss("pb_advanced_table_header"),
35
+ globalProps(props),
36
+ className
37
+ );
38
+
39
+
27
40
  return (
28
41
  <>
29
- <thead>
42
+ <thead className={classes}
43
+ id={id}
44
+ >
30
45
  {/* Get the header groups (only one in this example) */}
31
46
  {table.getHeaderGroups().map((headerGroup: HeaderGroup<DataType>) => (
32
47
  <tr key={`${headerGroup.id}-headerGroup`}>
@@ -37,7 +52,6 @@ export const TableHeader = ({
37
52
  handleExpandOrCollapse={handleExpandOrCollapse}
38
53
  header={header}
39
54
  headerChildren={children}
40
- headerId={headerId}
41
55
  key={`${header.id}-header`}
42
56
  loading={loading}
43
57
  sortIcon={sortIcon}
@@ -24,10 +24,9 @@ export const updateExpandAndCollapseState = (
24
24
  // Update isExpansionConsistent variable
25
25
  for (const row of rows) {
26
26
  if (
27
- row.getCanExpand() &&
28
- (targetParent === undefined
27
+ targetParent === undefined
29
28
  ? row.depth === 0
30
- : targetParent === row.parentId)
29
+ : targetParent === row.parentId
31
30
  ) {
32
31
  areRowsExpanded.add(row.getIsExpanded())
33
32
  if (areRowsExpanded.size > 1) {
@@ -48,7 +47,7 @@ export const updateExpandAndCollapseState = (
48
47
  })
49
48
  } else {
50
49
  for (const row of rows) {
51
- if (row.getCanExpand() && targetParent === row.parentId) {
50
+ if (targetParent === row.parentId) {
52
51
  updateExpandedRows[row.id] = !isExpansionConsistent
53
52
  ? true
54
53
  : !row.getIsExpanded()
@@ -1,6 +1,6 @@
1
1
  import React, { useState, useEffect, useCallback } from "react";
2
2
  import classnames from "classnames";
3
- import { buildAriaProps, buildCss, buildDataProps } from "../utilities/props";
3
+ import { buildAriaProps, buildCss, buildDataProps, buildHtmlProps } from "../utilities/props";
4
4
  import { globalProps, GlobalProps } from "../utilities/globalProps";
5
5
  import Table from "../pb_table/_table";
6
6
  import {
@@ -28,8 +28,9 @@ type AdvancedTableProps = {
28
28
  className?: string;
29
29
  columnDefinitions: DataType[];
30
30
  data?: { [key: string]: string };
31
- enableToggleExpansion?: "all" | "header";
31
+ enableToggleExpansion?: "all" | "header" | "none";
32
32
  expandedControl?: DataType;
33
+ htmlOptions?: {[key: string]: string | number | boolean | (() => void)},
33
34
  id?: string;
34
35
  initialLoadingRowsCount?: number;
35
36
  loading?: boolean | string;
@@ -51,6 +52,7 @@ const AdvancedTable = (props: AdvancedTableProps) => {
51
52
  data = {},
52
53
  enableToggleExpansion = "header",
53
54
  expandedControl,
55
+ htmlOptions = {},
54
56
  id,
55
57
  initialLoadingRowsCount = 10,
56
58
  loading,
@@ -104,7 +106,9 @@ const AdvancedTable = (props: AdvancedTableProps) => {
104
106
  const depthAccessor = cellAccessors[row.depth - 1]; // Adjust index for depth
105
107
  const accessorValue = rowData[depthAccessor];
106
108
  return accessorValue ? (
107
- <CustomCell row={row}
109
+ <CustomCell
110
+ onRowToggleClick={onRowToggleClick}
111
+ row={row}
108
112
  value={accessorValue}
109
113
  />
110
114
  ) : (
@@ -162,6 +166,7 @@ const AdvancedTable = (props: AdvancedTableProps) => {
162
166
  getExpandedRowModel: getExpandedRowModel(),
163
167
  getSortedRowModel: getSortedRowModel(),
164
168
  enableSortingRemoval: false,
169
+ sortDescFirst: true,
165
170
  ...expandAndSortState(),
166
171
  ...tableOptions,
167
172
  });
@@ -194,6 +199,7 @@ const AdvancedTable = (props: AdvancedTableProps) => {
194
199
 
195
200
  const ariaProps = buildAriaProps(aria);
196
201
  const dataProps = buildDataProps(data);
202
+ const htmlProps = buildHtmlProps(htmlOptions);
197
203
  const classes = classnames(
198
204
  buildCss("pb_advanced_table"),
199
205
  globalProps(props),
@@ -203,19 +209,21 @@ const AdvancedTable = (props: AdvancedTableProps) => {
203
209
  return (
204
210
  <div {...ariaProps}
205
211
  {...dataProps}
212
+ {...htmlProps}
206
213
  className={classes}
207
214
  id={id}
208
215
  >
209
216
  <AdvancedTableContext.Provider
210
217
  value={{
211
- table,
218
+ columnDefinitions,
219
+ enableToggleExpansion,
220
+ expanded,
212
221
  handleExpandOrCollapse,
213
222
  loading,
214
- enableToggleExpansion,
215
- toggleExpansionIcon,
216
223
  setExpanded,
217
- expanded,
218
224
  sortControl,
225
+ table,
226
+ toggleExpansionIcon,
219
227
  }}
220
228
  >
221
229
  <Table