playbook_ui 14.21.2.pre.alpha.PLAY2020sidebarfilterPOC8265 → 14.21.2.pre.alpha.PLAY2241tablestickycolumnsdatanotids8357

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.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/pb_advanced_table/Components/CustomCell.tsx +1 -1
  3. data/app/pb_kits/playbook/pb_advanced_table/Components/RegularTableView.tsx +12 -4
  4. data/app/pb_kits/playbook/pb_advanced_table/Components/TableHeaderCell.tsx +25 -5
  5. data/app/pb_kits/playbook/pb_advanced_table/Components/VirtualizedTableView.tsx +36 -16
  6. data/app/pb_kits/playbook/pb_advanced_table/Context/AdvancedTableContext.tsx +18 -5
  7. data/app/pb_kits/playbook/pb_advanced_table/Hooks/useTableActions.ts +37 -17
  8. data/app/pb_kits/playbook/pb_advanced_table/SubKits/TableBody.tsx +3 -0
  9. data/app/pb_kits/playbook/pb_advanced_table/SubKits/TableHeader.tsx +91 -40
  10. data/app/pb_kits/playbook/pb_advanced_table/Utilities/ColumnStylingHelper.ts +15 -0
  11. data/app/pb_kits/playbook/pb_advanced_table/Utilities/TableContainerStyles.ts +3 -2
  12. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +49 -4
  13. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.tsx +32 -18
  14. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.test.jsx +80 -1
  15. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_beta_sort.html.erb +1 -1
  16. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_beta_subrow_headers.html.erb +1 -1
  17. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_border_color_rails.html.erb +1 -1
  18. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling.jsx +51 -0
  19. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling.md +7 -0
  20. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_column_headers.jsx +77 -0
  21. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_column_headers.md +1 -0
  22. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_column_headers_rails.html.erb +63 -0
  23. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_column_headers_rails.md +1 -0
  24. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_rails.html.erb +38 -0
  25. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_rails.md +7 -0
  26. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_infinite_scroll.md +3 -0
  27. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_loading.html.erb +1 -1
  28. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_actions.jsx +2 -2
  29. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_actions_rails.html.erb +3 -2
  30. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props_sticky_header.html.erb +1 -1
  31. data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +5 -0
  32. data/app/pb_kits/playbook/pb_advanced_table/docs/index.js +3 -0
  33. data/app/pb_kits/playbook/pb_advanced_table/index.js +21 -0
  34. data/app/pb_kits/playbook/pb_advanced_table/table_header.html.erb +1 -1
  35. data/app/pb_kits/playbook/pb_advanced_table/table_header.rb +5 -0
  36. data/app/pb_kits/playbook/pb_advanced_table/table_row.html.erb +2 -2
  37. data/app/pb_kits/playbook/pb_advanced_table/table_row.rb +33 -0
  38. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_columns.html.erb +8 -8
  39. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_columns_rails.md +1 -1
  40. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_left_columns.html.erb +12 -12
  41. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_left_columns_rails.md +2 -2
  42. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_right_columns.html.erb +12 -12
  43. data/app/pb_kits/playbook/pb_table/docs/_table_sticky_right_columns_rails.md +2 -2
  44. data/app/pb_kits/playbook/pb_table/index.ts +4 -4
  45. data/dist/chunks/{_typeahead-CoOpeYom.js → _typeahead-BmfmVMFP.js} +3 -3
  46. data/dist/chunks/_weekday_stacked-DAC7yY_H.js +45 -0
  47. data/dist/chunks/lazysizes-B7xYodB-.js +1 -0
  48. data/dist/chunks/{lib-D7Va7yqa.js → lib-C2o6nu8G.js} +1 -1
  49. data/dist/chunks/{pb_form_validation-DSkdRDMf.js → pb_form_validation-EyK6DbAT.js} +1 -1
  50. data/dist/chunks/vendor.js +1 -1
  51. data/dist/playbook-doc.js +1 -1
  52. data/dist/playbook-rails-react-bindings.js +1 -1
  53. data/dist/playbook-rails.js +1 -1
  54. data/dist/playbook.css +1 -1
  55. data/lib/playbook/version.rb +1 -1
  56. metadata +17 -7
  57. data/dist/chunks/_weekday_stacked-BitxTXxk.js +0 -45
  58. data/dist/chunks/lazysizes-DHz07jlL.js +0 -1
@@ -63,11 +63,30 @@
63
63
  width: 100%;
64
64
  }
65
65
 
66
- // Virtualized table styles
66
+ // Virtualized Table and Rows for Infinite Scroll
67
+ scrollbar-gutter: stable right-edges;
68
+ .virtualized-header-row-header {
69
+ width: 100% !important;
70
+ .table-header-cells:first-child {
71
+ min-width: 180px;
72
+ }
73
+ }
74
+
75
+ .virtualized-footer {
76
+ width: 100% !important;
77
+ td {
78
+ border-bottom-left-radius: 4px !important;
79
+ border-bottom-right-radius: 4px !important;
80
+ display: flex;
81
+ justify-content: center;
82
+ align-items: center;
83
+ }
84
+ }
85
+
67
86
  .virtualized-table-row {
68
87
  display: table !important;
69
88
  table-layout: fixed !important;
70
- width: 100% !important;
89
+ box-sizing: border-box !important;
71
90
 
72
91
  td {
73
92
  display: table-cell !important;
@@ -104,7 +123,7 @@
104
123
 
105
124
  -ms-overflow-style: none !important;
106
125
  scrollbar-width: none !important;
107
- }
126
+ }
108
127
 
109
128
 
110
129
  .row-selection-actions-card {
@@ -193,7 +212,6 @@
193
212
 
194
213
  // Fix virtualized row borders
195
214
  tr.virtualized-table-row {
196
- border-bottom: 1px solid $border_light;
197
215
 
198
216
  &.bg-silver {
199
217
  td:first-child {
@@ -606,6 +624,16 @@
606
624
  td.sticky-left {
607
625
  border-right: 1px solid $border_light !important;
608
626
  }
627
+ // Virtualized Table in Responsive Styles
628
+ .virtualized-header,
629
+ .virtualized-header-row-header,
630
+ .virtualized-table-row,
631
+ .virtualized-footer {
632
+ border-right: 1px solid $border_light !important;
633
+ .table-header-cells:first-child {
634
+ box-shadow: 0 0 10px 0 rgba($shadow, 0.16) !important;
635
+ }
636
+ }
609
637
  }
610
638
  }
611
639
  }
@@ -621,6 +649,23 @@
621
649
  box-shadow: 0 4px 10px 0 rgba($shadow, 0.16) !important;
622
650
  }
623
651
 
652
+ // For Rails, we can't target the &:last-child since collapsed rows are display: none;
653
+ // With JS, we add a .last-visible-row class and add rounded corners to bottom row
654
+ .last-visible-row {
655
+ td, .pb_table_td {
656
+ border-width: 0 0 1px 0;
657
+
658
+ &:first-child {
659
+ border-radius: 0 0 0 4px;
660
+ border-width: 0 0 1px 1px;
661
+ }
662
+ &:last-child {
663
+ border-radius: 0 0 4px 0;
664
+ border-width: 0 1px 1px 0;
665
+ }
666
+ }
667
+ }
668
+
624
669
  &.dark {
625
670
  // Override default border color for dark mode
626
671
  --column-border-color: #{$border_dark};
@@ -266,6 +266,29 @@ const AdvancedTable = (props: AdvancedTableProps) => {
266
266
  // Visibility flag for action bar
267
267
  const isActionBarVisible = (selectableRows && showActionsBar && selectedRowsLength > 0) || columnVisibilityControl;
268
268
 
269
+ // The actual Main <Table /> element
270
+ const tableElement = (
271
+ <Table
272
+ className={`${loading ? "content-loading" : ""}`}
273
+ dark={dark}
274
+ dataTable
275
+ numberSpacing="tabular"
276
+ responsive="none"
277
+ {...tableProps}
278
+ >
279
+ {children ? (
280
+ children
281
+ ) : (
282
+ <>
283
+ <TableHeader />
284
+ <TableBody
285
+ isFetching={isFetching}
286
+ />
287
+ </>
288
+ )}
289
+ </Table>
290
+ )
291
+
269
292
  return (
270
293
  <>
271
294
  {/* Top Pagination */}
@@ -322,6 +345,7 @@ const AdvancedTable = (props: AdvancedTableProps) => {
322
345
  table={table}
323
346
  tableContainerRef={tableWrapperRef}
324
347
  toggleExpansionIcon={toggleExpansionIcon}
348
+ totalAvailableCount={fullData.length}
325
349
  virtualizedRows={virtualizedRows}
326
350
  >
327
351
  <React.Fragment>
@@ -333,24 +357,14 @@ const AdvancedTable = (props: AdvancedTableProps) => {
333
357
  type={columnVisibilityControl ? "column-visibility" : "row-selection"}
334
358
  />
335
359
 
336
- {/* Main Table */}
337
- <Table
338
- className={`${loading ? "content-loading" : ""}`}
339
- dark={dark}
340
- dataTable
341
- numberSpacing="tabular"
342
- responsive="none"
343
- {...tableProps}
344
- >
345
- {children ? (
346
- children
347
- ) : (
348
- <>
349
- <TableHeader />
350
- <TableBody />
351
- </>
352
- )}
353
- </Table>
360
+ {/* Virtualized wrapper div only if virtualizedRows is true */}
361
+ {virtualizedRows ? (
362
+ <div style={{ overflow: 'auto', width: '100%' }}>
363
+ {tableElement}
364
+ </div>
365
+ ) : (
366
+ tableElement
367
+ )}
354
368
  </React.Fragment>
355
369
  </AdvancedTableProvider>
356
370
 
@@ -572,4 +572,83 @@ test("pinnedRows prop renders pinned rows at top", () => {
572
572
  const firstPinnedRow = pinnedRows[0]
573
573
  expect(firstPinnedRow).toHaveStyle("position: sticky")
574
574
  expect(firstPinnedRow).toHaveStyle("background-color: white")
575
- })
575
+ })
576
+
577
+ test("columnStyling.headerAlignment aligns header as expected", () => {
578
+ const styledColumnDefs = [
579
+ {
580
+ accessor: "year",
581
+ label: "Year",
582
+ cellAccessors: ["quarter", "month", "day"],
583
+ },
584
+ {
585
+ accessor: "newEnrollments",
586
+ label: "New Enrollments",
587
+ columnStyling: { headerAlignment: "left" },
588
+ },
589
+ {
590
+ accessor: "scheduledMeetings",
591
+ label: "Scheduled Meetings",
592
+ },
593
+ ];
594
+
595
+ render(
596
+ <AdvancedTable
597
+ columnDefinitions={styledColumnDefs}
598
+ data={{ testid: testId }}
599
+ tableData={MOCK_DATA}
600
+ />
601
+ );
602
+
603
+ const headerCell = screen.getByText("New Enrollments").closest("th");
604
+ expect(headerCell).toHaveAttribute("align", "left");
605
+ });
606
+
607
+ test("columnStyling.cellAlignment sets each <td> align attribute as expected", () => {
608
+ const styledColumnDefs = [
609
+ {
610
+ accessor: "year",
611
+ label: "Year",
612
+ cellAccessors: ["quarter", "month", "day"],
613
+ },
614
+ {
615
+ accessor: "newEnrollments",
616
+ label: "New Enrollments",
617
+ columnStyling: { cellAlignment: "left" },
618
+ },
619
+ {
620
+ accessor: "scheduledMeetings",
621
+ label: "Scheduled Meetings",
622
+ },
623
+ ];
624
+
625
+ render(
626
+ <AdvancedTable
627
+ columnDefinitions={styledColumnDefs}
628
+ data={{ testid: testId }}
629
+ tableData={MOCK_DATA}
630
+ />
631
+ );
632
+
633
+ const firstEnrollmentCell = screen.getAllByText("20")[0].closest("td");
634
+ expect(firstEnrollmentCell).toHaveAttribute("align", "left");
635
+ });
636
+
637
+ test("renders virtualized table rows and header", () => {
638
+ render(
639
+ <AdvancedTable
640
+ columnDefinitions={columnDefinitions}
641
+ data={{ testid: testId }}
642
+ tableData={MOCK_DATA_WITH_ID}
643
+ virtualizedRows
644
+ />
645
+ )
646
+
647
+ const kit = screen.getByTestId(testId)
648
+
649
+ const virtualizedHeader = kit.querySelector('.virtualized-header-row-header')
650
+ expect(virtualizedHeader).toBeInTheDocument()
651
+
652
+ const virtualizedRows = kit.querySelectorAll('.virtualized-table-row')
653
+ expect(virtualizedRows.length).toBeLessThan(MOCK_DATA_WITH_ID.length)
654
+ })
@@ -51,7 +51,7 @@
51
51
  ]
52
52
  %>
53
53
 
54
- <%= pb_rails("advanced_table", props: { table_data: @table_data, column_definitions: column_definitions }) do %>
54
+ <%= pb_rails("advanced_table", props: { table_data: @table_data, column_definitions: column_definitions, id: "beta_sort" }) do %>
55
55
  <%= pb_rails("advanced_table/table_header", props: { column_definitions: column_definitions }) %>
56
56
  <%= pb_rails("advanced_table/table_body", props: { id: "beta_sort", table_data: @table_data, column_definitions: column_definitions, enable_toggle_expansion: "all" }) %>
57
57
  <% end %>
@@ -34,7 +34,7 @@
34
34
  subrow_headers = ["Quarter", "Month", "Day"]
35
35
  %>
36
36
 
37
- <%= pb_rails("advanced_table", props: { table_data: @table_data, column_definitions: column_definitions }) do %>
37
+ <%= pb_rails("advanced_table", props: { table_data: @table_data, column_definitions: column_definitions, id: "test_table" }) do %>
38
38
  <%= pb_rails("advanced_table/table_header", props: { column_definitions: column_definitions }) %>
39
39
  <%= pb_rails("advanced_table/table_body", props: { id: "test_table", table_data: @table_data, column_definitions: column_definitions, subrow_headers: subrow_headers, enable_toggle_expansion: "all" }) %>
40
40
  <% end %>
@@ -55,4 +55,4 @@
55
55
  },
56
56
  ] %>
57
57
 
58
- <%= pb_rails("advanced_table", props: { id: "beta_table_with_muilti_headers", table_data: @table_data, column_definitions: column_definitions, column_group_border_color: "text_lt_default", table_props: { vertical_border: true } }) %>
58
+ <%= pb_rails("advanced_table", props: { id: "beta_table_with_color_headers", table_data: @table_data, column_definitions: column_definitions, column_group_border_color: "text_lt_default", table_props: { vertical_border: true } }) %>
@@ -0,0 +1,51 @@
1
+ import React from "react"
2
+ import AdvancedTable from '../../pb_advanced_table/_advanced_table'
3
+ import MOCK_DATA from "./advanced_table_mock_data.json"
4
+
5
+ const AdvancedTableColumnStyling = (props) => {
6
+ const columnDefinitions = [
7
+ {
8
+ accessor: "year",
9
+ label: "Year",
10
+ cellAccessors: ["quarter", "month", "day"],
11
+ },
12
+ {
13
+ accessor: "newEnrollments",
14
+ label: "New Enrollments",
15
+ columnStyling:{headerAlignment: "left", cellAlignment: "left"},
16
+ },
17
+ {
18
+ accessor: "scheduledMeetings",
19
+ label: "Scheduled Meetings",
20
+ columnStyling:{headerAlignment: "center", cellAlignment: "center"},
21
+ },
22
+ {
23
+ accessor: "attendanceRate",
24
+ label: "Attendance Rate",
25
+ },
26
+ {
27
+ accessor: "completedClasses",
28
+ label: "Completed Classes",
29
+ },
30
+ {
31
+ accessor: "classCompletionRate",
32
+ label: "Class Completion Rate",
33
+ },
34
+ {
35
+ accessor: "graduatedStudents",
36
+ label: "Graduated Students",
37
+ },
38
+ ]
39
+
40
+ return (
41
+ <div>
42
+ <AdvancedTable
43
+ columnDefinitions={columnDefinitions}
44
+ tableData={MOCK_DATA}
45
+ {...props}
46
+ />
47
+ </div>
48
+ )
49
+ }
50
+
51
+ export default AdvancedTableColumnStyling
@@ -0,0 +1,7 @@
1
+ The `columnStyling` prop is an optional item that can be used within `columnDefinitions` as shown in the code snippet below. It is an object that has 2 optional key/value pairs:
2
+
3
+ 1) `headerAlignment`: This will allow you to control alignment of header content which is set to right aligned by default. you can set this to `left`, `right` or `center`.
4
+
5
+ 2) `cellAlignment`: This will allow you to control alignment of content within all cells in the given column. This is set to right aligned by default. you can set this to `left`, `right` or `center`.
6
+
7
+ `columnStyling` can be used within the columnDefinition of all the columns or some of them, as shown. Each column has its own individual control in this way.
@@ -0,0 +1,77 @@
1
+ import React from "react";
2
+ import AdvancedTable from '../../pb_advanced_table/_advanced_table';
3
+ import MOCK_DATA from "./advanced_table_mock_data.json";
4
+
5
+ const AdvancedTableColumnStylingColumnHeaders = (props) => {
6
+ const columnDefinitions = [
7
+ {
8
+ accessor: "year",
9
+ label: "Year",
10
+ cellAccessors: ["quarter", "month", "day"],
11
+ },
12
+ {
13
+ label: "Enrollment Data",
14
+ columns: [
15
+ {
16
+ label: "Enrollment Stats",
17
+ columns: [
18
+ {
19
+ accessor: "newEnrollments",
20
+ label: "New Enrollments",
21
+ columnStyling:{headerAlignment: "left", cellAlignment: "left"},
22
+
23
+ },
24
+ {
25
+ accessor: "scheduledMeetings",
26
+ label: "Scheduled Meetings",
27
+ },
28
+ ],
29
+ },
30
+ ],
31
+ },
32
+ {
33
+ label: "Performance Data",
34
+ columns: [
35
+ {
36
+ label: "Completion Metrics",
37
+ columns: [
38
+ {
39
+ accessor: "completedClasses",
40
+ label: "Completed Classes",
41
+ columnStyling:{headerAlignment: "center", cellAlignment: "center"},
42
+ },
43
+ {
44
+ accessor: "classCompletionRate",
45
+ label: "Class Completion Rate",
46
+ },
47
+ ],
48
+ },
49
+ {
50
+ label: "Attendance",
51
+ columns: [
52
+ {
53
+ accessor: "attendanceRate",
54
+ label: "Attendance Rate",
55
+ },
56
+ {
57
+ accessor: "scheduledMeetings",
58
+ label: "Scheduled Meetings",
59
+ },
60
+ ],
61
+ },
62
+ ],
63
+ },
64
+ ];
65
+
66
+ return (
67
+ <>
68
+ <AdvancedTable
69
+ columnDefinitions={columnDefinitions}
70
+ tableData={MOCK_DATA}
71
+ {...props}
72
+ />
73
+ </>
74
+ );
75
+ };
76
+
77
+ export default AdvancedTableColumnStylingColumnHeaders
@@ -0,0 +1 @@
1
+ `columnStyling` can also be used with the multi column logic. When used in this way, `columnStyling` must be used within the leaf column's columnDefinition as shown.
@@ -0,0 +1,63 @@
1
+ <% column_definitions = [
2
+ {
3
+ accessor: "year",
4
+ label: "Year",
5
+ cellAccessors: ["quarter", "month", "day"],
6
+ },
7
+ {
8
+ label: "Enrollment Data",
9
+ columns: [
10
+ {
11
+ label: "Enrollment Stats",
12
+ columns: [
13
+ {
14
+ accessor: "newEnrollments",
15
+ label: "New Enrollments",
16
+ column_styling:{header_alignment:"left", cell_alignment:"left"}
17
+ },
18
+ {
19
+ accessor: "scheduledMeetings",
20
+ label: "Scheduled Meetings",
21
+ },
22
+ ],
23
+ },
24
+ ],
25
+ },
26
+ {
27
+ label: "Performance Data",
28
+ columns: [
29
+ {
30
+ label: "Completion Metrics",
31
+ columns: [
32
+ {
33
+ accessor: "completedClasses",
34
+ label: "Completed Classes",
35
+ column_styling:{header_alignment:"center", cell_alignment:"center"}
36
+ },
37
+ {
38
+ accessor: "classCompletionRate",
39
+ label: "Class Completion Rate",
40
+ },
41
+ ],
42
+ },
43
+ {
44
+ label: "Attendance",
45
+ columns: [
46
+ {
47
+ accessor: "attendanceRate",
48
+ label: "Attendance Rate",
49
+ },
50
+ {
51
+ accessor: "scheduledMeetings",
52
+ label: "Scheduled Meetings",
53
+ },
54
+ ],
55
+ },
56
+ ],
57
+ },
58
+ ] %>
59
+
60
+ <%= pb_rails("advanced_table", props: { id: "column-styling-multi", table_data: @table_data, column_definitions: column_definitions }) do %>
61
+ <%= pb_rails("advanced_table/table_header", props: { column_definitions: column_definitions }) %>
62
+ <%= pb_rails("advanced_table/table_body", props: { table_data: @table_data, column_definitions: column_definitions }) %>
63
+ <% end %>
@@ -0,0 +1 @@
1
+ `column_styling` can also be used with the multi column logic. When used in this way, `column_styling` must be used within the leaf column's column_definition as shown.
@@ -0,0 +1,38 @@
1
+ <% column_definitions = [
2
+ {
3
+ accessor: "year",
4
+ label: "Year",
5
+ cellAccessors: ["quarter", "month", "day"],
6
+ },
7
+ {
8
+ accessor: "newEnrollments",
9
+ label: "New Enrollments",
10
+ column_styling:{header_alignment:"left", cell_alignment:"left"}
11
+ },
12
+ {
13
+ accessor: "scheduledMeetings",
14
+ label: "Scheduled Meetings",
15
+ column_styling:{header_alignment:"center", cell_alignment:"center"}
16
+ },
17
+ {
18
+ accessor: "attendanceRate",
19
+ label: "Attendance Rate",
20
+ },
21
+ {
22
+ accessor: "completedClasses",
23
+ label: "Completed Classes",
24
+ },
25
+ {
26
+ accessor: "classCompletionRate",
27
+ label: "Class Completion Rate",
28
+ },
29
+ {
30
+ accessor: "graduatedStudents",
31
+ label: "Graduated Students",
32
+ }
33
+ ] %>
34
+
35
+ <%= pb_rails("advanced_table", props: { id: "column-styling", table_data: @table_data, column_definitions: column_definitions }) do %>
36
+ <%= pb_rails("advanced_table/table_header", props: { column_definitions: column_definitions }) %>
37
+ <%= pb_rails("advanced_table/table_body", props: { table_data: @table_data, column_definitions: column_definitions }) %>
38
+ <% end %>
@@ -0,0 +1,7 @@
1
+ The `column_styling` prop is an optional item that can be used within `column_definitions` as shown in the code snippet below. It is an object that has 2 optional key/value pairs:
2
+
3
+ 1) `header_alignment`: This will allow you to control alignment of header content which is set to right aligned by default. you can set this to `left`, `right` or `center`.
4
+
5
+ 2) `cell_alignment`: This will allow you to control alignment of content within all cells in the given column. This is set to right aligned by default. you can set this to `left`, `right` or `center`.
6
+
7
+ `column_styling` can be used within the column_definition of all the columns or some of them, as shown. Each column has its own individual control in this way.
@@ -0,0 +1,3 @@
1
+ The `virtualizedRows` boolean prop enables the rendering of a virtualized table using [Tanstack's Virtualizer Library](https://tanstack.com/virtual/v3/docs/api/virtualizer) with infinite scroll capabilities for large data sets.
2
+
3
+ **Note:** Not all Advanced Table props work perfectly with the Virtualized Table - for complex table configurations with many added features or controls consider using the [Pagination](https://playbook.powerapp.cloud/kits/advanced_table/react#pagination) version instead. Additionally, it is a known issue that due to the use of absolute positioning for the virtualized header, it does not render in Safari.
@@ -30,4 +30,4 @@
30
30
  }
31
31
  ] %>
32
32
 
33
- <%= pb_rails("advanced_table", props: { id: "beta_table", table_data: @table_data, column_definitions: column_definitions, loading: true }) %>
33
+ <%= pb_rails("advanced_table", props: { id: "loading_table", table_data: @table_data, column_definitions: column_definitions, loading: true }) %>
@@ -47,14 +47,14 @@ const CustomActions = () => {
47
47
  <CircleIconButton
48
48
  icon="file-csv"
49
49
  onClick={() =>
50
- alert(rowIds.length === 0 ? "No Selection Made" : `Row ids ${rowIds.join(", ")} will be exported!`)
50
+ alert(rowIds.length === 0 ? "No Selection Made" : 'Row ids ' + rowIds.join(", ") + 'will be exported!')
51
51
  }
52
52
  variant="link"
53
53
  />
54
54
  <CircleIconButton
55
55
  icon="trash-alt"
56
56
  onClick={() =>
57
- alert(rowIds.length === 0 ? "No Selection Made" : `Row ids ${rowIds.join(", ")} will be deleted!`)
57
+ alert(rowIds.length === 0 ? "No Selection Made" : 'Row ids ' + rowIds.join(", ") + 'will be deleted!')
58
58
  }
59
59
  variant="link"
60
60
  />
@@ -88,10 +88,11 @@ actions = [
88
88
  if (!selectedRowIds || selectedRowIds.length === 0) {
89
89
  alert('No Selection Made');
90
90
  } else {
91
+ const selectedRowsString = selectedRowIds.join(', ');
91
92
  if (actionType === 'export') {
92
- alert(`Row ids ${selectedRowIds.join(', ')} will be exported!`);
93
+ alert('Row ids ' + selectedRowsString + ' will be exported!');
93
94
  } else if (actionType === 'delete') {
94
- alert(`Row ids ${selectedRowIds.join(', ')} will be deleted!`);
95
+ alert('Row ids ' + selectedRowsString + ' will be deleted!');
95
96
  }
96
97
  }
97
98
  };
@@ -30,4 +30,4 @@
30
30
  }
31
31
  ] %>
32
32
 
33
- <%= pb_rails("advanced_table", props: { id: "table_props_table", table_data: @table_data, column_definitions: column_definitions, max_height: "xs", table_props: { sticky: true }}) %>
33
+ <%= pb_rails("advanced_table", props: { id: "table_props_sticky_table", table_data: @table_data, column_definitions: column_definitions, max_height: "xs", table_props: { sticky: true }}) %>
@@ -19,6 +19,8 @@ examples:
19
19
  - advanced_table_selectable_rows_actions_rails: Selectable Rows (With Actions)
20
20
  - advanced_table_selectable_rows_header_rails: Selectable Rows (No Actions Bar)
21
21
  - advanced_table_scrollbar_none: Advanced Table Scrollbar None
22
+ # - advanced_table_column_styling_rails: Column Styling
23
+ # - advanced_table_column_styling_column_headers_rails: Column Styling with Multiple Headers
22
24
 
23
25
  react:
24
26
  - advanced_table_default: Default (Required Props)
@@ -57,3 +59,6 @@ examples:
57
59
  - advanced_table_column_visibility_multi: Column Visibility Control with Multi-Header Columns
58
60
  - advanced_table_pinned_rows: Pinned Rows
59
61
  - advanced_table_scrollbar_none: Advanced Table Scrollbar None
62
+ - advanced_table_column_styling: Column Styling
63
+ - advanced_table_column_styling_column_headers: Column Styling with Multiple Headers
64
+ - advanced_table_infinite_scroll: Infinite Scroll
@@ -34,3 +34,6 @@ export { default as AdvancedTableColumnVisibilityMulti } from './_advanced_table
34
34
  export { default as AdvancedTableColumnVisibilityWithState } from './_advanced_table_column_visibility_with_state.jsx'
35
35
  export { default as AdvancedTablePinnedRows } from './_advanced_table_pinned_rows.jsx'
36
36
  export { default as AdvancedTableScrollbarNone} from './_advanced_table_scrollbar_none.jsx'
37
+ export { default as AdvancedTableColumnStyling } from './_advanced_table_column_styling.jsx'
38
+ export { default as AdvancedTableColumnStylingColumnHeaders } from './_advanced_table_column_styling_column_headers.jsx'
39
+ export { default as AdvancedTableInfiniteScroll} from './_advanced_table_infinite_scroll.jsx'
@@ -266,6 +266,25 @@ export default class PbAdvancedTable extends PbEnhancedElement {
266
266
  this.updateTableSelectedRowsAttribute();
267
267
  });
268
268
  }
269
+ this.addBorderRadiusOnLastVisibleRow()
270
+ }
271
+
272
+ addBorderRadiusOnLastVisibleRow() {
273
+ const parentElement = this.element.closest('.pb_advanced_table');
274
+
275
+ const table = document.getElementById(parentElement.id);
276
+
277
+ if (table) {
278
+ const visibleRows = table.querySelectorAll('tr.is-visible, tr:not(.toggle-content)');
279
+
280
+ visibleRows.forEach(row => row.classList.remove('last-visible-row'));
281
+
282
+ const lastVisibleRow = visibleRows[visibleRows.length - 1];
283
+
284
+ if (lastVisibleRow) {
285
+ lastVisibleRow.classList.add('last-visible-row');
286
+ }
287
+ }
269
288
  }
270
289
 
271
290
 
@@ -367,6 +386,8 @@ export default class PbAdvancedTable extends PbEnhancedElement {
367
386
  row.classList.toggle("bg-silver", !isVisible);
368
387
  row.classList.toggle("bg-white", isVisible);
369
388
  }
389
+
390
+ this.addBorderRadiusOnLastVisibleRow();
370
391
  }
371
392
 
372
393
  displayDownArrow() {
@@ -7,7 +7,7 @@
7
7
  <% header_row.each_with_index do |cell, cell_index| %>
8
8
  <% header_id = cell[:accessor].present? ? cell[:accessor] : "header_#{row_index}_#{cell_index}" %>
9
9
  <%= pb_rails("table/table_header", props: { id: header_id, colspan: cell[:colspan], classname: [object.th_classname(is_first_column: cell_index.zero?), ('last-header-cell' if cell[:is_last_in_group] && cell_index != 0)].compact.join(' '), sort_menu: cell[:accessor] ? cell[:sort_menu] : nil }) do %>
10
- <%= pb_rails("flex", props: { align: "center", justify: cell_index.zero? ? "start" : row_index === header_rows.size - 1 ? "end" : "center", text_align: "end" }) do %>
10
+ <%= pb_rails("flex", props: { align: "center", justify: cell_index.zero? ? "start" : row_index === header_rows.size - 1 ? "end" : "center", text_align: (cell[:header_alignment] || "end") }) do %>
11
11
  <% if cell_index.zero? && row_index === header_rows.size - 1 %>
12
12
  <% if object.selectable_rows && object.enable_toggle_expansion != "none" %>
13
13
  <%= pb_rails("flex/flex_item", props: { padding_right: "xs" }) do %>