playbook_ui 14.21.2.pre.alpha.PLAY2020sidebarfilterPOC8265 → 14.21.2.pre.alpha.PLAY2179playbookiconsupdate8389

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 (57) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/pb_advanced_table/Components/CustomCell.tsx +5 -2
  3. data/app/pb_kits/playbook/pb_advanced_table/Components/RegularTableView.tsx +20 -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/Hooks/useTableState.ts +5 -2
  9. data/app/pb_kits/playbook/pb_advanced_table/SubKits/TableBody.tsx +3 -0
  10. data/app/pb_kits/playbook/pb_advanced_table/SubKits/TableHeader.tsx +91 -40
  11. data/app/pb_kits/playbook/pb_advanced_table/Utilities/CellRendererUtils.tsx +4 -1
  12. data/app/pb_kits/playbook/pb_advanced_table/Utilities/ColumnStylingHelper.ts +15 -0
  13. data/app/pb_kits/playbook/pb_advanced_table/Utilities/TableContainerStyles.ts +3 -2
  14. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +49 -4
  15. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.tsx +36 -18
  16. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.test.jsx +105 -2
  17. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_beta_sort.html.erb +1 -1
  18. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_beta_subrow_headers.html.erb +1 -1
  19. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_border_color_rails.html.erb +1 -1
  20. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling.jsx +51 -0
  21. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling.md +7 -0
  22. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_column_headers.jsx +77 -0
  23. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_column_headers.md +1 -0
  24. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_column_headers_rails.html.erb +63 -0
  25. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_column_headers_rails.md +1 -0
  26. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_rails.html.erb +38 -0
  27. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_rails.md +7 -0
  28. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_infinite_scroll.md +3 -0
  29. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_loading.html.erb +1 -1
  30. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_row_styling.jsx +64 -0
  31. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_row_styling.md +7 -0
  32. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_actions.jsx +2 -2
  33. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_actions_rails.html.erb +3 -2
  34. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props_sticky_header.html.erb +1 -1
  35. data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +6 -0
  36. data/app/pb_kits/playbook/pb_advanced_table/docs/index.js +4 -0
  37. data/app/pb_kits/playbook/pb_advanced_table/index.js +21 -0
  38. data/app/pb_kits/playbook/pb_advanced_table/table_header.html.erb +1 -1
  39. data/app/pb_kits/playbook/pb_advanced_table/table_header.rb +5 -0
  40. data/app/pb_kits/playbook/pb_advanced_table/table_row.html.erb +2 -2
  41. data/app/pb_kits/playbook/pb_advanced_table/table_row.rb +33 -0
  42. data/dist/chunks/_typeahead-BXD634Vm.js +22 -0
  43. data/dist/chunks/_weekday_stacked--dPf0i--.js +45 -0
  44. data/dist/chunks/lazysizes-B7xYodB-.js +1 -0
  45. data/dist/chunks/lib-9VvC3Rp0.js +29 -0
  46. data/dist/chunks/{pb_form_validation-DSkdRDMf.js → pb_form_validation-CbyL4Bqa.js} +1 -1
  47. data/dist/chunks/vendor.js +1 -1
  48. data/dist/playbook-doc.js +3 -3
  49. data/dist/playbook-rails-react-bindings.js +1 -1
  50. data/dist/playbook-rails.js +1 -1
  51. data/dist/playbook.css +1 -1
  52. data/lib/playbook/version.rb +1 -1
  53. metadata +19 -7
  54. data/dist/chunks/_typeahead-CoOpeYom.js +0 -22
  55. data/dist/chunks/_weekday_stacked-BitxTXxk.js +0 -45
  56. data/dist/chunks/lazysizes-DHz07jlL.js +0 -1
  57. data/dist/chunks/lib-D7Va7yqa.js +0 -29
@@ -17,7 +17,8 @@ export const createCellFunction = (
17
17
  customRenderer?: (row: Row<GenericObject>, value: any) => JSX.Element,
18
18
  isFirstColumn?: boolean,
19
19
  onRowToggleClick?: (row: Row<GenericObject>) => void,
20
- selectableRows?: boolean
20
+ selectableRows?: boolean,
21
+ rowStyling?: GenericObject
21
22
  ) => {
22
23
  // Add display name to the returned function
23
24
  const cellRenderer = ({
@@ -28,6 +29,7 @@ export const createCellFunction = (
28
29
  getValue: Getter<string>
29
30
  }) => {
30
31
  const rowData = row.original;
32
+ const customStyle = rowStyling?.length > 0 && rowStyling?.find((s:GenericObject) => s?.rowId === row.id);
31
33
 
32
34
  if (isFirstColumn) {
33
35
  switch (row.depth) {
@@ -35,6 +37,7 @@ export const createCellFunction = (
35
37
  return (
36
38
  <CustomCell
37
39
  customRenderer={customRenderer}
40
+ customStyle={customStyle}
38
41
  getValue={getValue}
39
42
  onRowToggleClick={onRowToggleClick}
40
43
  row={row}
@@ -0,0 +1,15 @@
1
+ export const findColumnDefByAccessor = (
2
+ defs: any[],
3
+ targetAccessor: string
4
+ ): any | undefined => {
5
+ for (const def of defs) {
6
+ if (def.accessor === targetAccessor) {
7
+ return def;
8
+ }
9
+ if (Array.isArray(def.columns) && def.columns.length) {
10
+ const found = findColumnDefByAccessor(def.columns, targetAccessor);
11
+ if (found) return found;
12
+ }
13
+ }
14
+ return undefined;
15
+ };
@@ -57,7 +57,6 @@ export const getVirtualizedContainerStyles = (maxHeight?: string): React.CSSProp
57
57
  position: 'absolute',
58
58
  top: 0,
59
59
  left: 0,
60
- width: '100%',
61
60
  height: '40px', // Match standard table row height
62
61
  transform: `translateY(${startPosition}px)`,
63
62
  tableLayout: 'fixed',
@@ -67,12 +66,14 @@ export const getVirtualizedContainerStyles = (maxHeight?: string): React.CSSProp
67
66
  /**
68
67
  * Get height estimates for different row types
69
68
  */
70
- export const getRowHeightEstimate = (rowType: 'header' | 'row' | 'loading') => {
69
+ export const getRowHeightEstimate = (rowType: 'header' | 'row' | 'loading' | 'footer') => {
71
70
  switch (rowType) {
72
71
  case 'header':
73
72
  return 40; // Header height
74
73
  case 'loading':
75
74
  return 30; // Loading indicator height
75
+ case 'footer':
76
+ return 40
76
77
  case 'row':
77
78
  default:
78
79
  return 40; // Standard row height - match this to your design system
@@ -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};
@@ -57,6 +57,7 @@ type AdvancedTableProps = {
57
57
  onChange?: (value: RowPinningState) => void;
58
58
  };
59
59
  responsive?: "scroll" | "none",
60
+ rowStyling?: GenericObject[],
60
61
  scrollBarNone?: boolean,
61
62
  selectableRows?: boolean,
62
63
  showActionsBar?: boolean,
@@ -98,6 +99,7 @@ const AdvancedTable = (props: AdvancedTableProps) => {
98
99
  paginationProps,
99
100
  pinnedRows,
100
101
  responsive = "scroll",
102
+ rowStyling,
101
103
  scrollBarNone= false,
102
104
  showActionsBar = true,
103
105
  selectableRows,
@@ -144,6 +146,7 @@ const AdvancedTable = (props: AdvancedTableProps) => {
144
146
  onRowSelectionChange,
145
147
  columnVisibilityControl,
146
148
  pinnedRows,
149
+ rowStyling
147
150
  });
148
151
 
149
152
  // Initialize table actions
@@ -266,6 +269,29 @@ const AdvancedTable = (props: AdvancedTableProps) => {
266
269
  // Visibility flag for action bar
267
270
  const isActionBarVisible = (selectableRows && showActionsBar && selectedRowsLength > 0) || columnVisibilityControl;
268
271
 
272
+ // The actual Main <Table /> element
273
+ const tableElement = (
274
+ <Table
275
+ className={`${loading ? "content-loading" : ""}`}
276
+ dark={dark}
277
+ dataTable
278
+ numberSpacing="tabular"
279
+ responsive="none"
280
+ {...tableProps}
281
+ >
282
+ {children ? (
283
+ children
284
+ ) : (
285
+ <>
286
+ <TableHeader />
287
+ <TableBody
288
+ isFetching={isFetching}
289
+ />
290
+ </>
291
+ )}
292
+ </Table>
293
+ )
294
+
269
295
  return (
270
296
  <>
271
297
  {/* Top Pagination */}
@@ -313,6 +339,7 @@ const AdvancedTable = (props: AdvancedTableProps) => {
313
339
  onExpandByDepthClick={onExpandByDepthClick}
314
340
  pinnedRows={pinnedRows}
315
341
  responsive={responsive}
342
+ rowStyling={rowStyling}
316
343
  selectableRows={selectableRows}
317
344
  setExpanded={setExpanded}
318
345
  showActionsBar={showActionsBar}
@@ -322,6 +349,7 @@ const AdvancedTable = (props: AdvancedTableProps) => {
322
349
  table={table}
323
350
  tableContainerRef={tableWrapperRef}
324
351
  toggleExpansionIcon={toggleExpansionIcon}
352
+ totalAvailableCount={fullData.length}
325
353
  virtualizedRows={virtualizedRows}
326
354
  >
327
355
  <React.Fragment>
@@ -333,24 +361,14 @@ const AdvancedTable = (props: AdvancedTableProps) => {
333
361
  type={columnVisibilityControl ? "column-visibility" : "row-selection"}
334
362
  />
335
363
 
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>
364
+ {/* Virtualized wrapper div only if virtualizedRows is true */}
365
+ {virtualizedRows ? (
366
+ <div style={{ overflow: 'auto', width: '100%' }}>
367
+ {tableElement}
368
+ </div>
369
+ ) : (
370
+ tableElement
371
+ )}
354
372
  </React.Fragment>
355
373
  </AdvancedTableProvider>
356
374
 
@@ -1,7 +1,7 @@
1
1
  import React, {useState} from "react"
2
2
  import { render, screen, waitFor } from "../utilities/test-utils"
3
3
 
4
- import { AdvancedTable, Pill } from "playbook-ui"
4
+ import { AdvancedTable, Pill, colors } from "playbook-ui"
5
5
 
6
6
  global.ResizeObserver = class {
7
7
  observe() {}
@@ -572,4 +572,107 @@ 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
+ })
655
+
656
+ test("rowStyling prop works as expected", () => {
657
+ const rowStyling = [
658
+ {
659
+ rowId: "1",
660
+ backgroundColor: colors.white,
661
+ fontColor: colors.black
662
+ },
663
+ ];
664
+
665
+ render(
666
+ <AdvancedTable
667
+ columnDefinitions={columnDefinitions}
668
+ data={{ testid: testId }}
669
+ rowStyling={rowStyling}
670
+ tableData={MOCK_DATA_WITH_ID}
671
+ />
672
+ )
673
+
674
+ const kit = screen.getByTestId(testId)
675
+ const tableBody = kit.querySelector('tbody')
676
+ const row1 = tableBody.querySelector('tr:nth-child(1)')
677
+ expect(row1).toHaveStyle({backgroundColor: colors.white, color: colors.black})
678
+ })
@@ -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 }) %>