playbook_ui 13.15.0 → 13.16.0.pre.alpha.PBNTR177NewAdvancedTableKit2023

Sign up to get free protection for your applications and to get access to all the features.
Files changed (113) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/_playbook.scss +14 -12
  3. data/app/pb_kits/playbook/index.js +2 -1
  4. data/app/pb_kits/playbook/pb_advanced_table/Components/CollapsibleTrail.tsx +30 -0
  5. data/app/pb_kits/playbook/pb_advanced_table/Components/CustomCell.tsx +59 -0
  6. data/app/pb_kits/playbook/pb_advanced_table/Components/LoadingCell.tsx +5 -0
  7. data/app/pb_kits/playbook/pb_advanced_table/Components/SortIconButton.tsx +30 -0
  8. data/app/pb_kits/playbook/pb_advanced_table/Components/SubRowHeaderRow.tsx +61 -0
  9. data/app/pb_kits/playbook/pb_advanced_table/Components/TableHeaderCell.tsx +128 -0
  10. data/app/pb_kits/playbook/pb_advanced_table/Components/ToggleIconButton.tsx +28 -0
  11. data/app/pb_kits/playbook/pb_advanced_table/Context/AdvancedTableContext.tsx +5 -0
  12. data/app/pb_kits/playbook/pb_advanced_table/README.md +133 -0
  13. data/app/pb_kits/playbook/pb_advanced_table/SubKits/TableBody.tsx +95 -0
  14. data/app/pb_kits/playbook/pb_advanced_table/SubKits/TableHeader.tsx +51 -0
  15. data/app/pb_kits/playbook/pb_advanced_table/Utilities/BrowserCheck.tsx +5 -0
  16. data/app/pb_kits/playbook/pb_advanced_table/Utilities/ExpansionControlHelpers.tsx +63 -0
  17. data/app/pb_kits/playbook/pb_advanced_table/Utilities/IconHelpers.tsx +8 -0
  18. data/app/pb_kits/playbook/pb_advanced_table/Utilities/types.ts +8 -0
  19. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +98 -0
  20. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.tsx +245 -0
  21. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.test.jsx +56 -0
  22. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_default.jsx +49 -0
  23. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_default.md +13 -0
  24. data/app/pb_kits/playbook/pb_advanced_table/docs/_description.md +1 -0
  25. data/app/pb_kits/playbook/pb_advanced_table/docs/_mock_data.js +278 -0
  26. data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +5 -0
  27. data/app/pb_kits/playbook/pb_advanced_table/docs/index.js +1 -0
  28. data/app/pb_kits/playbook/pb_advanced_table/scss_partials/_loading.scss +71 -0
  29. data/app/pb_kits/playbook/pb_advanced_table/scss_partials/_pseudo_states.scss +12 -0
  30. data/app/pb_kits/playbook/pb_collapsible/docs/_collapsible_colors_swift.md +27 -0
  31. data/app/pb_kits/playbook/pb_collapsible/docs/_collapsible_default_swift.md +22 -0
  32. data/app/pb_kits/playbook/pb_collapsible/docs/_collapsible_props_table.md +8 -0
  33. data/app/pb_kits/playbook/pb_collapsible/docs/_collapsible_sizes_swift.md +26 -0
  34. data/app/pb_kits/playbook/pb_collapsible/docs/example.yml +6 -0
  35. data/app/pb_kits/playbook/pb_dashboard/pbChartsDarkTheme.ts +4 -2
  36. data/app/pb_kits/playbook/pb_dashboard/pbChartsLightTheme.ts +5 -3
  37. data/app/pb_kits/playbook/pb_date_picker/date_picker_helper.ts +40 -33
  38. data/app/pb_kits/playbook/pb_date_picker/plugins/quickPick.tsx +4 -4
  39. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/_fixed_confirmation_toast.tsx +44 -30
  40. data/app/pb_kits/playbook/pb_flex/_flex.tsx +5 -5
  41. data/app/pb_kits/playbook/pb_form_group/_form_group.tsx +3 -2
  42. data/app/pb_kits/playbook/pb_form_pill/_form_pill.tsx +7 -4
  43. data/app/pb_kits/playbook/pb_gauge/_gauge.tsx +10 -10
  44. data/app/pb_kits/playbook/pb_home_address_street/_home_address_street.tsx +10 -9
  45. data/app/pb_kits/playbook/pb_icon_stat_value/_icon_stat_value.tsx +3 -2
  46. data/app/pb_kits/playbook/pb_icon_value/_icon_value.tsx +3 -2
  47. data/app/pb_kits/playbook/pb_label_value/_label_value.tsx +1 -1
  48. data/app/pb_kits/playbook/pb_layout/_layout.tsx +2 -1
  49. data/app/pb_kits/playbook/pb_layout/layout.test.js +8 -4
  50. data/app/pb_kits/playbook/pb_legend/_legend.tsx +6 -6
  51. data/app/pb_kits/playbook/pb_lightbox/Carousel/Slides.tsx +4 -4
  52. data/app/pb_kits/playbook/pb_lightbox/Carousel/Thumbnail.tsx +1 -1
  53. data/app/pb_kits/playbook/pb_lightbox/Carousel/index.tsx +3 -3
  54. data/app/pb_kits/playbook/pb_lightbox/Header/_lightbox_header.tsx +30 -22
  55. data/app/pb_kits/playbook/pb_lightbox/_lightbox.tsx +5 -5
  56. data/app/pb_kits/playbook/pb_line_graph/_line_graph.tsx +4 -4
  57. data/app/pb_kits/playbook/pb_list/_list.tsx +15 -15
  58. data/app/pb_kits/playbook/pb_list/_list_item.tsx +1 -1
  59. data/app/pb_kits/playbook/pb_loading_inline/_loading_inline.tsx +9 -9
  60. data/app/pb_kits/playbook/pb_map/_map.tsx +8 -8
  61. data/app/pb_kits/playbook/pb_map/_map_controls.tsx +15 -7
  62. data/app/pb_kits/playbook/pb_map/_map_custom_button.tsx +4 -2
  63. data/app/pb_kits/playbook/pb_message/_message.tsx +1 -1
  64. data/app/pb_kits/playbook/pb_message/_message_mention.tsx +6 -6
  65. data/app/pb_kits/playbook/pb_multi_level_select/_multi_level_select.tsx +46 -42
  66. data/app/pb_kits/playbook/pb_multiple_users_stacked/_multiple_users_stacked.tsx +20 -20
  67. data/app/pb_kits/playbook/pb_nav/_item.tsx +56 -47
  68. data/app/pb_kits/playbook/pb_nav/_nav.tsx +15 -15
  69. data/app/pb_kits/playbook/pb_nav/docs/_nav_horizontal_bold_swift.md +17 -0
  70. data/app/pb_kits/playbook/pb_nav/docs/_nav_horizontal_default_swift.md +17 -0
  71. data/app/pb_kits/playbook/pb_nav/docs/_nav_horizontal_subtle_no_highlight_swift.md +18 -0
  72. data/app/pb_kits/playbook/pb_nav/docs/_nav_horizontal_subtle_swift.md +18 -0
  73. data/app/pb_kits/playbook/pb_nav/docs/_nav_props_swift.md +11 -0
  74. data/app/pb_kits/playbook/pb_nav/docs/_nav_vertical_bold_swift.md +18 -0
  75. data/app/pb_kits/playbook/pb_nav/docs/_nav_vertical_default_swift.md +18 -0
  76. data/app/pb_kits/playbook/pb_nav/docs/_nav_vertical_subtle_no_highlight_swift.md +19 -0
  77. data/app/pb_kits/playbook/pb_nav/docs/_nav_vertical_subtle_swift.md +17 -0
  78. data/app/pb_kits/playbook/pb_nav/docs/example.yml +17 -0
  79. data/app/pb_kits/playbook/pb_passphrase/_passphrase.tsx +51 -50
  80. data/app/pb_kits/playbook/pb_person_contact/_person_contact.tsx +20 -19
  81. data/app/pb_kits/playbook/pb_phone_number_input/_phone_number_input.tsx +4 -3
  82. data/app/pb_kits/playbook/pb_popover/_popover.tsx +6 -4
  83. data/app/pb_kits/playbook/pb_progress_pills/_progress_pills.tsx +20 -20
  84. data/app/pb_kits/playbook/pb_progress_simple/_progress_simple.tsx +4 -4
  85. data/app/pb_kits/playbook/pb_rich_text_editor/TipTap/EditorButton.tsx +19 -17
  86. data/app/pb_kits/playbook/pb_rich_text_editor/TipTap/EditorTypes.ts +1 -1
  87. data/app/pb_kits/playbook/pb_rich_text_editor/TipTap/MoreExtensionsDropdown.tsx +23 -21
  88. data/app/pb_kits/playbook/pb_rich_text_editor/TipTap/Toolbar.tsx +18 -10
  89. data/app/pb_kits/playbook/pb_rich_text_editor/TipTap/ToolbarDropdown.tsx +46 -23
  90. data/app/pb_kits/playbook/pb_rich_text_editor/TipTap/ToolbarHistory.tsx +8 -8
  91. data/app/pb_kits/playbook/pb_rich_text_editor/TipTap/ToolbarNodes.tsx +7 -7
  92. data/app/pb_kits/playbook/pb_rich_text_editor/_rich_text_editor.tsx +17 -15
  93. data/app/pb_kits/playbook/pb_section_separator/_section_separator.tsx +9 -7
  94. data/app/pb_kits/playbook/pb_select/_select.scss +13 -4
  95. data/app/pb_kits/playbook/pb_select/_select.tsx +7 -4
  96. data/app/pb_kits/playbook/pb_select/docs/_select_inline_show_arrow.html.erb +24 -0
  97. data/app/pb_kits/playbook/pb_select/docs/_select_inline_show_arrow.jsx +38 -0
  98. data/app/pb_kits/playbook/pb_select/docs/example.yml +2 -0
  99. data/app/pb_kits/playbook/pb_select/docs/index.js +1 -0
  100. data/app/pb_kits/playbook/pb_select/select.rb +6 -1
  101. data/app/pb_kits/playbook/pb_selectable_card_icon/_selectable_card_icon.tsx +25 -24
  102. data/app/pb_kits/playbook/pb_selectable_icon/_selectable_icon.tsx +27 -26
  103. data/app/pb_kits/playbook/pb_selectable_list/_selectable_list.tsx +2 -1
  104. data/app/pb_kits/playbook/pb_source/_source.tsx +15 -15
  105. data/app/pb_kits/playbook/pb_table/_table.tsx +29 -29
  106. data/app/pb_kits/playbook/pb_typeahead/_typeahead.scss +1 -1
  107. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_highlight.jsx +4 -2
  108. data/app/pb_kits/playbook/playbook-doc.js +2 -0
  109. data/app/pb_kits/playbook/utilities/globalProps.ts +1 -1
  110. data/dist/menu.yml +4 -1
  111. data/dist/playbook-rails.js +14 -6
  112. data/lib/playbook/version.rb +2 -2
  113. metadata +48 -7
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fd6f86769005f1cf4bd5400be7f925bf38d3e16560fbec5da24158c969873663
4
- data.tar.gz: 5c879bd8ecc90a4e2d02adbab1d208f81098708f949e60ece5c95eb2875bd81e
3
+ metadata.gz: 7de4a52108e01951e999ec72a392167e7ca613eedc6b2460454cea0fb265fcf8
4
+ data.tar.gz: 33e05379b7d7004b6943995d1710a1b91a844942710e2c8ca62dbc6e6bbbda0c
5
5
  SHA512:
6
- metadata.gz: 3d4bfff63b93a145834de3cfe80f3ecfa04f3d29ef10e7194fe2ad9149111a61efaeb70557b289db0fe499b1297e150ef0008af6f712289f45a84eaa83eab120
7
- data.tar.gz: 94718a4b5a91761a32365bcb149b47c4e2aaea0a58fbc9860773117069875627018e92ea69626de9556d064fa50fde854107eee264e86bbede4d5bf0e14054da
6
+ metadata.gz: 4e8d2d44b46b465a9d3cf4e954d0621abfc2da9cef8b9004f1d5e7e535f37bc57b8f4d54c46e26a2a4a79721c7e36e991ba9902170740b6ffe76f27a6becf207
7
+ data.tar.gz: 9e2878d9346444289f740ae5f3804c871e02d7c49f6283351768e68ffbfd0f19d6215eba7ee897cdb947ca332a2d802cd40ce8d5f118ff07b176707c0a1c9add
@@ -1,16 +1,17 @@
1
+
2
+
3
+ @import 'pb_advanced_table/advanced_table';
4
+ @import 'pb_avatar/avatar';
5
+ @import 'pb_avatar_action_button/avatar_action_button';
1
6
  @import 'pb_background/background';
7
+ @import 'pb_badge/badge';
8
+ @import 'pb_bar_graph/bar_graph';
2
9
  @import 'pb_body/body';
3
10
  @import 'pb_bread_crumbs/bread_crumbs';
4
11
  @import 'pb_button/button';
5
12
  @import 'pb_button_toolbar/button_toolbar';
6
13
  @import 'pb_caption/caption';
7
14
  @import 'pb_card/card';
8
- @import 'pb_detail/detail';
9
- @import 'pb_title/title';
10
- @import 'pb_avatar/avatar';
11
- @import 'pb_avatar_action_button/avatar_action_button';
12
- @import 'pb_badge/badge';
13
- @import 'pb_bar_graph/bar_graph';
14
15
  @import 'pb_checkbox/checkbox';
15
16
  @import 'pb_circle_chart/circle_chart';
16
17
  @import 'pb_circle_icon_button/circle_icon_button';
@@ -20,21 +21,22 @@
20
21
  @import 'pb_dashboard_value/dashboard_value';
21
22
  @import 'pb_date/date';
22
23
  @import 'pb_date_picker/date_picker';
23
- @import 'pb_date_time/date_time';
24
24
  @import 'pb_date_range_inline/date_range_inline';
25
25
  @import 'pb_date_range_stacked/date_range_stacked';
26
26
  @import 'pb_date_stacked/date_stacked';
27
+ @import 'pb_date_time/date_time';
27
28
  @import 'pb_date_time_stacked/date_time_stacked';
28
29
  @import 'pb_date_year_stacked/date_year_stacked';
30
+ @import 'pb_detail/detail';
29
31
  @import 'pb_dialog/dialog';
30
32
  @import 'pb_distribution_bar/distribution_bar';
31
33
  @import 'pb_file_upload/file_upload';
32
34
  @import 'pb_filter/filter';
33
35
  @import 'pb_fixed_confirmation_toast/fixed_confirmation_toast';
36
+ @import 'pb_flex/flex';
34
37
  @import 'pb_form/form';
35
38
  @import 'pb_form_group/form_group';
36
39
  @import 'pb_form_pill/form_pill';
37
- @import 'pb_flex/flex';
38
40
  @import 'pb_gauge/gauge';
39
41
  @import 'pb_hashtag/hashtag';
40
42
  @import 'pb_highlight/highlight';
@@ -55,6 +57,7 @@
55
57
  @import 'pb_map/map';
56
58
  @import 'pb_map/pb_map_button_mixin';
57
59
  @import 'pb_message/message';
60
+ @import 'pb_multi_level_select/multi_level_select';
58
61
  @import 'pb_multiple_users/multiple_users';
59
62
  @import 'pb_multiple_users_stacked/multiple_users_stacked';
60
63
  @import 'pb_nav/nav';
@@ -85,9 +88,11 @@
85
88
  @import 'pb_text_input/text_input';
86
89
  @import 'pb_textarea/textarea';
87
90
  @import 'pb_time/time';
88
- @import 'pb_timeline/timeline';
89
91
  @import 'pb_time_range_inline/time_range_inline';
92
+ @import 'pb_time_stacked/time_stacked';
93
+ @import 'pb_timeline/timeline';
90
94
  @import 'pb_timestamp/timestamp';
95
+ @import 'pb_title/title';
91
96
  @import 'pb_title_count/title_count';
92
97
  @import 'pb_title_detail/title_detail';
93
98
  @import 'pb_toggle/toggle';
@@ -96,7 +101,6 @@
96
101
  @import 'pb_typeahead/typeahead';
97
102
  @import 'pb_user/user';
98
103
  @import 'pb_user_badge/user_badge';
99
- @import 'pb_time_stacked/time_stacked';
100
104
  @import 'pb_walkthrough/walkthrough';
101
105
  @import 'pb_weekday_stacked/weekday_stacked';
102
106
  @import './utilities/mixins';
@@ -115,5 +119,3 @@
115
119
  @import './utilities/text_align';
116
120
  @import './utilities/overflow';
117
121
  @import './utilities/truncate';
118
-
119
- @import 'pb_multi_level_select/multi_level_select';
@@ -4,6 +4,7 @@ import 'lazysizes/plugins/attrchange/ls.attrchange'
4
4
  import 'lazysizes'
5
5
 
6
6
  // vvv React Component JSX Imports from the React Kits vvv
7
+ export { default as AdvancedTable} from './pb_advanced_table/_advanced_table'
7
8
  export { default as Avatar } from './pb_avatar/_avatar'
8
9
  export { default as AvatarActionButton } from './pb_avatar_action_button/_avatar_action_button'
9
10
  export { default as Background } from './pb_background/_background'
@@ -59,8 +60,8 @@ export { default as LineGraph } from './pb_line_graph/_line_graph'
59
60
  export { default as List } from './pb_list/_list'
60
61
  export { default as ListItem } from './pb_list/_list_item'
61
62
  export { default as LoadingInline } from './pb_loading_inline/_loading_inline'
62
- export { default as Map} from './pb_map/_map'
63
63
  export { default as MapCustomButton } from './pb_map/_map_custom_button'
64
+ export { default as Map} from './pb_map/_map'
64
65
  export { default as Message } from './pb_message/_message'
65
66
  export { default as MultiLevelSelect} from './pb_multi_level_select/_multi_level_select'
66
67
  export { default as MultipleUsers } from './pb_multiple_users/_multiple_users'
@@ -0,0 +1,30 @@
1
+ import React from "react"
2
+
3
+ //CollapsibleTrail component
4
+ const CollapsibleTrail = ({ leftOffset }: { leftOffset: number }) => {
5
+ const style: { [key: string]: string | number } = {
6
+ position: "absolute",
7
+ left: `${leftOffset}rem`,
8
+ top: 0,
9
+ bottom: 0,
10
+ width: "2px",
11
+ backgroundColor: "#E4E8F0",
12
+ }
13
+
14
+ return <div style={style} />
15
+ }
16
+
17
+ // Updated function to render multiple trails depending on depth
18
+ export const renderCollapsibleTrail = (currentDepth: number) => {
19
+ const lines = []
20
+ for (let i = 1; i <= currentDepth; i++) {
21
+ // Calculate leftOffset with additional 0.4rem for each depth level above 1
22
+ const additionalOffset = i > 1 ? (i - 1) * 0.4 : 0
23
+ const leftOffset = i * 1.6 + additionalOffset
24
+ lines.push(<CollapsibleTrail key={i}
25
+ leftOffset={leftOffset}
26
+ />
27
+ )
28
+ }
29
+ return lines
30
+ }
@@ -0,0 +1,59 @@
1
+ import React, { useContext } from "react";
2
+
3
+ import Flex from "../../pb_flex/_flex";
4
+ import FlexItem from "../../pb_flex/_flex_item";
5
+ import Icon from "../../pb_icon/_icon";
6
+ import { GlobalProps } from "../../utilities/globalProps";
7
+
8
+ import { Getter, Row } from "@tanstack/react-table";
9
+ import { DataType } from "../Utilities/types";
10
+ import AdvancedTableContext from "../Context/AdvancedTableContext";
11
+
12
+ interface CustomCellProps {
13
+ getValue?: Getter<string>;
14
+ onRowToggleClick?: (arg: Row<DataType>) => void;
15
+ row: Row<DataType>;
16
+ value?: string;
17
+ }
18
+
19
+ export const CustomCell = ({
20
+ getValue,
21
+ onRowToggleClick,
22
+ row,
23
+ value,
24
+ }: CustomCellProps & GlobalProps) => {
25
+ const { setExpanded, expanded } = useContext(AdvancedTableContext);
26
+ const RowWithoutChildren = row.originalSubRows === undefined;
27
+
28
+ const handleOnExpand = (row: Row<DataType>) => {
29
+ onRowToggleClick && onRowToggleClick(row);
30
+ setExpanded({ ...expanded, [row.id]: !row.getIsExpanded() });
31
+ };
32
+
33
+ return (
34
+ <div style={{ paddingLeft: `${row.depth * 2}rem` }}>
35
+ <Flex alignItems="center"
36
+ columnGap="xs"
37
+ orientation="row"
38
+ >
39
+ {!RowWithoutChildren ? (
40
+ <button
41
+ className="gray-icon expand-toggle-icon"
42
+ onClick={() => handleOnExpand(row)}
43
+ >
44
+ {row.getIsExpanded() ? (
45
+ <Icon icon="circle-play"
46
+ rotation={90}
47
+ />
48
+ ) : (
49
+ <Icon icon="circle-play" />
50
+ )}
51
+ </button>
52
+ ) : null}
53
+ <FlexItem paddingLeft={!RowWithoutChildren ? "none" : "xs"}>
54
+ {row.depth === 0 ? getValue() : value}
55
+ </FlexItem>
56
+ </Flex>
57
+ </div>
58
+ );
59
+ };
@@ -0,0 +1,5 @@
1
+ import React from "react"
2
+
3
+ export const LoadingCell = () => {
4
+ return <div className="loading-cell" />
5
+ }
@@ -0,0 +1,30 @@
1
+ import React from "react"
2
+ import Icon from "../../pb_icon/_icon"
3
+ import { Header } from "@tanstack/react-table"
4
+ import { DataType } from "../Utilities/types"
5
+ import { displayIcon } from "../Utilities/IconHelpers"
6
+
7
+ type SortIconButtonProps = {
8
+ header: Header<DataType, unknown>
9
+ sortIcon?: string | string[]
10
+ }
11
+ export const SortIconButton = ({ header, sortIcon }: SortIconButtonProps) => {
12
+
13
+ return (
14
+ <>
15
+ {header.column.getIsSorted() === "desc" ? (
16
+ <div className="year-sort-icon"
17
+ key={displayIcon(sortIcon)[0]}
18
+ >
19
+ <Icon icon={displayIcon(sortIcon)[0]} />
20
+ </div>
21
+ ) : (
22
+ <div className="year-sort-icon"
23
+ key={displayIcon(sortIcon)[1]}
24
+ >
25
+ <Icon icon={displayIcon(sortIcon)[1]} />
26
+ </div>
27
+ )}
28
+ </>
29
+ )
30
+ }
@@ -0,0 +1,61 @@
1
+ import React from "react"
2
+ import Flex from "../../pb_flex/_flex"
3
+ import Caption from "../../pb_caption/_caption"
4
+ import { Row, Table } from "@tanstack/react-table"
5
+
6
+ import { ToggleIconButton } from "./ToggleIconButton"
7
+ import { renderCollapsibleTrail } from "./CollapsibleTrail"
8
+
9
+ import { isChrome } from "../Utilities/BrowserCheck"
10
+ import { DataType } from "../Utilities/types"
11
+ import { GlobalProps } from "../../utilities/globalProps"
12
+
13
+ interface SubRowHeaderRowProps {
14
+ collapsibleTrail?: boolean
15
+ enableToggleExpansion?: "all" | "header"
16
+ onClick: (row: Row<DataType>) => void
17
+ row: Row<DataType>
18
+ subRowHeaders?: string[]
19
+ table: Table<DataType>
20
+ }
21
+
22
+ export const SubRowHeaderRow = ({
23
+ collapsibleTrail,
24
+ enableToggleExpansion,
25
+ onClick,
26
+ row,
27
+ subRowHeaders,
28
+ table,
29
+ }: SubRowHeaderRowProps & GlobalProps) => {
30
+ const numberOfColumns = table.getAllFlatColumns().length
31
+
32
+ return (
33
+ <tr className="custom-row bg-silver">
34
+ <td
35
+ className={`custom-row-first-column ${
36
+ isChrome() ? "chrome-styles" : ""
37
+ }`}
38
+ colSpan={1}
39
+ >
40
+ {collapsibleTrail && row.depth > 0 && renderCollapsibleTrail(row.depth)}
41
+ <div style={{ paddingLeft: `${row.depth * 2}rem` }}>
42
+ <Flex align="center"
43
+ columnGap="xs"
44
+ >
45
+ {enableToggleExpansion === "all" && row.getCanExpand() ? (
46
+ <ToggleIconButton onClick={onClick}
47
+ row={row}
48
+ />
49
+ ) : null}
50
+ <Caption
51
+ marginLeft={row.getCanExpand() ? "none" : "xs"}
52
+ text={subRowHeaders[row.depth - 1]}
53
+ />
54
+ </Flex>
55
+ </div>
56
+ </td>
57
+
58
+ <td colSpan={numberOfColumns - 1} />
59
+ </tr>
60
+ )
61
+ }
@@ -0,0 +1,128 @@
1
+ import React, { useContext } from "react"
2
+ import classnames from "classnames";
3
+ import Flex from "../../pb_flex/_flex"
4
+ import { flexRender, Header } from "@tanstack/react-table"
5
+
6
+ import { SortIconButton } from "./SortIconButton"
7
+ import { ToggleIconButton } from "./ToggleIconButton"
8
+ import { isChrome } from "../Utilities/BrowserCheck"
9
+ import { DataType } from "../Utilities/types"
10
+ import AdvancedTableContext from "../Context/AdvancedTableContext"
11
+ import { GlobalProps } from "../../utilities/globalProps"
12
+
13
+ type TableHeaderCellProps = {
14
+ enableSorting?: boolean
15
+ enableToggleExpansion?: "all" | "header"
16
+ handleExpandOrCollapse?: () => void
17
+ header?: Header<DataType, unknown>
18
+ headerChildren?: React.ReactNode | React.ReactNode[]
19
+ headerId?: string
20
+ loading?: boolean
21
+ sortIcon?: string | string[]
22
+ } & GlobalProps
23
+
24
+ export const TableHeaderCell = ({
25
+ enableSorting,
26
+ enableToggleExpansion,
27
+ handleExpandOrCollapse,
28
+ header,
29
+ headerChildren,
30
+ headerId,
31
+ loading,
32
+ sortIcon,
33
+ }: TableHeaderCellProps) => {
34
+ const { sortControl } = useContext(AdvancedTableContext)
35
+
36
+ const toggleSortButton = (event: React.SyntheticEvent) => {
37
+ if (sortControl) {
38
+ const sortIsDesc = header.column.getIsSorted() === "desc"
39
+ sortIsDesc
40
+ ? sortControl.onChange({ desc: true })
41
+ : sortControl.onChange({ desc: false })
42
+ } else {
43
+ header.column.getToggleSortingHandler()(event)
44
+ }
45
+ }
46
+
47
+ const cellClassName = classnames("table-header-cells",
48
+ `${isChrome() ? "chrome-styles" : ""}`,
49
+ `${enableSorting ? "table-header-cells-active" : ""}`
50
+ );
51
+
52
+ const cellId = `${loading ?
53
+ `loading-${header.id}${headerId ? `-${headerId}` : ""}`
54
+ : `${header.id}${headerId ? `-${headerId}` : ""}`
55
+ }`;
56
+
57
+ return (
58
+ <th
59
+ align="right"
60
+ className={cellClassName}
61
+ id={cellId}
62
+ key={`${header.id}-header`}
63
+ >
64
+ {header.isPlaceholder ? null : headerChildren && header.index === 0 ? (
65
+ <Flex alignItems="center">
66
+ {headerChildren}
67
+ <div>
68
+ {flexRender(header.column.columnDef.header, header.getContext())}
69
+ </div>
70
+ </Flex>
71
+ ) : (
72
+ <Flex
73
+ alignItems="center"
74
+ justify={header.index === 0 && enableSorting ? "between" : header.index === 0 && !enableSorting ? "start" : "end"}
75
+ paddingLeft={loading ? "sm" : "none"}
76
+ >
77
+ {header.index === 0 &&
78
+ !loading &&
79
+ (enableToggleExpansion === "all" || "header") && (
80
+ <ToggleIconButton onClick={handleExpandOrCollapse} />
81
+ )}
82
+
83
+ {header.index === 0 &&
84
+ loading &&
85
+ (enableToggleExpansion === "all" || "header") && (
86
+ <div className="loading-toggle-icon header-toggle-icon" />
87
+ )}
88
+
89
+ <Flex
90
+ className={`${header.index === 0 &&
91
+ enableSorting &&
92
+ "header-sort-button pb_th_link"}`}
93
+ cursor={header.index === 0 && enableSorting ? "pointer" : "default"}
94
+ {...(header.index === 0 &&
95
+ enableSorting && {
96
+ htmlOptions: {
97
+ onClick: (event: React.MouseEvent) => toggleSortButton(event),
98
+ onKeyDown: (event: React.KeyboardEvent) => {
99
+ if (event.key === "Enter") {
100
+ toggleSortButton(event)
101
+ }
102
+ },
103
+ tabIndex: 0,
104
+ },
105
+ })}
106
+ justify={header.index === 0 && enableSorting ? "between" : "none"}
107
+ paddingLeft={enableSorting ? "xxs" : "xs"}
108
+ >
109
+ <div>
110
+ {flexRender(header.column.columnDef.header, header.getContext())}
111
+ </div>
112
+
113
+ {header.index === 0 &&
114
+ header.column.getCanSort() &&
115
+ enableSorting &&
116
+ (loading ? (
117
+ <div className="loading-toggle-icon header-sort-icon" />
118
+ ) : (
119
+ <SortIconButton header={header}
120
+ sortIcon={sortIcon}
121
+ />
122
+ ))}
123
+ </Flex>
124
+ </Flex>
125
+ )}
126
+ </th>
127
+ )
128
+ }
@@ -0,0 +1,28 @@
1
+ import React, { useContext } from "react"
2
+ import Icon from "../../pb_icon/_icon"
3
+ import { Row } from "@tanstack/react-table"
4
+ import AdvancedTableContext from "../Context/AdvancedTableContext"
5
+ import { DataType } from "../Utilities/types"
6
+ import { displayIcon } from "../Utilities/IconHelpers"
7
+
8
+ interface ToggleIconButtonProps {
9
+ onClick: (row: Row<DataType>) => void
10
+ row?: Row<DataType>
11
+ }
12
+
13
+ export const ToggleIconButton = ({ row, onClick }: ToggleIconButtonProps) => {
14
+ const { toggleExpansionIcon } = useContext(AdvancedTableContext)
15
+ return (
16
+ <button
17
+ className="gray-icon time-period-toggle-icon"
18
+ key={displayIcon(toggleExpansionIcon)[0]}
19
+ onClick={() => onClick(row)}
20
+ >
21
+ <Icon
22
+ cursor="pointer"
23
+ fixedWidth
24
+ icon={displayIcon(toggleExpansionIcon)[0]}
25
+ />
26
+ </button>
27
+ )
28
+ }
@@ -0,0 +1,5 @@
1
+ import { createContext } from "react"
2
+
3
+ const AdvancedTableContext = createContext<any>({})
4
+
5
+ export default AdvancedTableContext
@@ -0,0 +1,133 @@
1
+ # Advanced Table Kit Data Structure
2
+
3
+ The AdvancedTable Kit's `tableData` prop consumes the data that will render the table and as such has a specific structure. It must be an array of objects, where the key/value pairs will become the values rendered within each column. If children are present, they must also take the form of an array of objects. The kit will automatically render `children` as subRows.
4
+
5
+ Here is the data structure being used within the kits doc examples:
6
+
7
+ ```
8
+ MOCK_DATA = [
9
+ {
10
+ year: "2021",
11
+ quarter: null,
12
+ month: null,
13
+ day: null,
14
+ newEnrollments: "20",
15
+ scheduledMeetings: "10",
16
+ attendanceRate: "51%",
17
+ completedClasses: "3",
18
+ classCompletionRate: "33%",
19
+ graduatedStudents: "19",
20
+ children: [
21
+ {
22
+ year: "2021",
23
+ quarter: "Q1",
24
+ month: null,
25
+ day: null,
26
+ newEnrollments: "2",
27
+ scheduledMeetings: "35",
28
+ attendanceRate: "32%",
29
+ completedClasses: "15",
30
+ classCompletionRate: "52%",
31
+ graduatedStudents: "36",
32
+ children: [
33
+ {
34
+ year: "2021",
35
+ quarter: "Q1",
36
+ month: "January",
37
+ day: null,
38
+ newEnrollments: "16",
39
+ scheduledMeetings: "20",
40
+ attendanceRate: "11%",
41
+ completedClasses: "13",
42
+ classCompletionRate: "47%",
43
+ graduatedStudents: "28",
44
+ children: [
45
+ {
46
+ year: "2021",
47
+ quarter: "Q1",
48
+ month: "January",
49
+ day: "10",
50
+ newEnrollments: "34",
51
+ scheduledMeetings: "28",
52
+ attendanceRate: "97%",
53
+ completedClasses: "20",
54
+ classCompletionRate: "15%",
55
+ graduatedStudents: "17",
56
+ },
57
+ {
58
+ year: "2021",
59
+ quarter: "Q1",
60
+ month: "January",
61
+ day: "20",
62
+ newEnrollments: "43",
63
+ scheduledMeetings: "23",
64
+ attendanceRate: "66%",
65
+ completedClasses: "26",
66
+ classCompletionRate: "47%",
67
+ graduatedStudents: "9",
68
+ },
69
+ ],
70
+ },
71
+ {
72
+ year: "2021",
73
+ quarter: "Q1",
74
+ month: "February",
75
+ day: null,
76
+ newEnrollments: "20",
77
+ scheduledMeetings: "41",
78
+ attendanceRate: "95%",
79
+ completedClasses: "26",
80
+ classCompletionRate: "83%",
81
+ graduatedStudents: "43",
82
+ children: [
83
+ {
84
+ year: "2011",
85
+ quarter: "Q1",
86
+ month: "February",
87
+ day: "15",
88
+ newEnrollments: "19",
89
+ scheduledMeetings: "35",
90
+ attendanceRate: "69%",
91
+ completedClasses: "8",
92
+ classCompletionRate: "75%",
93
+ graduatedStudents: "23",
94
+ },
95
+ ],
96
+ },
97
+ ],
98
+ },
99
+ ],
100
+ },
101
+ {
102
+ year: "2022",
103
+ quarter: null,
104
+ month: null,
105
+ day: null,
106
+ newEnrollments: "25",
107
+ scheduledMeetings: "17",
108
+ attendanceRate: "75%",
109
+ completedClasses: "5",
110
+ classCompletionRate: "45%",
111
+ graduatedStudents: "32",
112
+ children: [
113
+ //similar to chldren above
114
+ ]
115
+ },
116
+ {
117
+ year: "2023",
118
+ quarter: null,
119
+ month: null,
120
+ day: null,
121
+ newEnrollments: "10",
122
+ scheduledMeetings: "15",
123
+ attendanceRate: "65%",
124
+ completedClasses: "4",
125
+ classCompletionRate: "49%",
126
+ graduatedStudents: "29",
127
+ children: [
128
+ //similar to children above
129
+ ],
130
+ },
131
+ ];
132
+
133
+ ```