playbook_ui 14.22.0.pre.rc.0 → 14.22.0.pre.rc.2

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 (44) 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/Utilities/ColumnStylingHelper.ts +15 -0
  6. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +17 -0
  7. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.test.jsx +61 -1
  8. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_beta_sort.html.erb +1 -1
  9. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_beta_subrow_headers.html.erb +1 -1
  10. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_border_color_rails.html.erb +1 -1
  11. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling.jsx +51 -0
  12. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling.md +7 -0
  13. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_column_headers.jsx +77 -0
  14. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_column_headers.md +1 -0
  15. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_column_headers_rails.html.erb +63 -0
  16. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_column_headers_rails.md +1 -0
  17. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_rails.html.erb +38 -0
  18. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_rails.md +7 -0
  19. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_loading.html.erb +1 -1
  20. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_actions.jsx +2 -2
  21. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_actions_rails.html.erb +3 -2
  22. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props_sticky_header.html.erb +1 -1
  23. data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +4 -0
  24. data/app/pb_kits/playbook/pb_advanced_table/docs/index.js +2 -0
  25. data/app/pb_kits/playbook/pb_advanced_table/index.js +21 -0
  26. data/app/pb_kits/playbook/pb_advanced_table/table_header.html.erb +1 -1
  27. data/app/pb_kits/playbook/pb_advanced_table/table_header.rb +5 -0
  28. data/app/pb_kits/playbook/pb_advanced_table/table_row.html.erb +2 -2
  29. data/app/pb_kits/playbook/pb_advanced_table/table_row.rb +33 -0
  30. data/app/pb_kits/playbook/pb_dropdown/_dropdown.tsx +3 -12
  31. data/app/pb_kits/playbook/pb_dropdown/docs/example.yml +0 -2
  32. data/app/pb_kits/playbook/pb_dropdown/docs/index.js +1 -2
  33. data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownOption.tsx +10 -14
  34. data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownTrigger.tsx +15 -26
  35. data/dist/chunks/_weekday_stacked-JnoR3mIy.js +45 -0
  36. data/dist/chunks/vendor.js +1 -1
  37. data/dist/playbook-doc.js +1 -1
  38. data/dist/playbook-rails.js +1 -1
  39. data/dist/playbook.css +1 -1
  40. data/lib/playbook/version.rb +2 -2
  41. metadata +12 -5
  42. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_close_on_select.jsx +0 -42
  43. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_close_on_select.md +0 -1
  44. data/dist/chunks/_weekday_stacked-B_jpa2Rz.js +0 -45
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3237dbe64cf5d35651426b51605fc0a29d2774ace25902df2d835d3ba397cf45
4
- data.tar.gz: 17dffcc35b1c8dc359a5f2e8496122e888f0981a8694642cf4b6f9b80db47095
3
+ metadata.gz: 60de2699b3213e11373d3894f23082a1bd0f1975413dd47e56a9ac1a05cc5fe0
4
+ data.tar.gz: 2e486251afd8b0ea3866755887d78e31a7cc6a96d28e78f76a1ebcce67072e6c
5
5
  SHA512:
6
- metadata.gz: 5a17f0e817d78b24d5ba66cc346f107818a57cc657134501c1062adaee813936d1a22f86dbd6ba7fc57aeb72a6bd41a3d44b11a42e4df5e3aa996c4a557e594b
7
- data.tar.gz: fd82408a056f7a0fdcfeff8c9d909f07eee2a76ad9a0ecb4de81ac333eee51a5d29262f7a331737390b29c497c85dcb303b96119eeeda81e6c406910d77b66a7
6
+ metadata.gz: f924a62c189edfd0462efa80f3f3c6960044b67194ff47212a261deea88e5dc81939cee8d816436bff37b322e4fd41ca0baf4f7aa768d61c71fa7d8c3c6f8652
7
+ data.tar.gz: 1498242e9f85a89aadc89e1a1f78528b4a2638e7544ad1907910e1b301dbc61f23e95041a2a961d47660277efc9ea08aacee30af13e1a811f872b45c812c9f80
@@ -47,7 +47,7 @@ export const CustomCell = ({
47
47
  <Flex
48
48
  alignItems="center"
49
49
  columnGap="xs"
50
- justify={"start"}
50
+ justify="start"
51
51
  orientation="row"
52
52
  >
53
53
  {
@@ -4,6 +4,7 @@ import { flexRender, Row, Cell } from "@tanstack/react-table"
4
4
 
5
5
  import { GenericObject } from "../../types"
6
6
  import { isChrome } from "../Utilities/BrowserCheck"
7
+ import { findColumnDefByAccessor } from "../Utilities/ColumnStylingHelper"
7
8
 
8
9
  import LoadingInline from "../../pb_loading_inline/_loading_inline"
9
10
  import Checkbox from "../../pb_checkbox/_checkbox"
@@ -25,13 +26,15 @@ const TableCellRenderer = ({
25
26
  collapsibleTrail = true,
26
27
  loading = false,
27
28
  stickyLeftColumn,
28
- columnPinning
29
+ columnPinning,
30
+ columnDefinitions,
29
31
  }: {
30
32
  row: Row<GenericObject>
31
33
  collapsibleTrail?: boolean
32
34
  loading?: boolean | string
33
35
  stickyLeftColumn?: string[]
34
36
  columnPinning: { left: string[] }
37
+ columnDefinitions?: {[key:string]:any}[]
35
38
  }) => {
36
39
  return (
37
40
  <>
@@ -49,10 +52,14 @@ const TableCellRenderer = ({
49
52
  })();
50
53
 
51
54
  const { column } = cell;
52
-
55
+
56
+ // Find the “owning” colDefinition by accessor. Needed for multi column logic
57
+ const colDef = findColumnDefByAccessor(columnDefinitions ?? [], column.id)
58
+ const cellAlignment = colDef?.columnStyling?.cellAlignment ?? "right"
59
+
53
60
  return (
54
61
  <td
55
- align="right"
62
+ align={cellAlignment}
56
63
  className={classnames(
57
64
  `${cell.id}-cell position_relative`,
58
65
  isChrome() ? "chrome-styles" : "",
@@ -117,7 +124,6 @@ export const RegularTableView = ({
117
124
 
118
125
  const columnPinning = table.getState().columnPinning || { left: [] };
119
126
  const columnDefinitions = table.options.meta?.columnDefinitions || [];
120
-
121
127
  // Row pinning
122
128
  function PinnedRow({ row }: { row: Row<any> }) {
123
129
  return (
@@ -137,6 +143,7 @@ export const RegularTableView = ({
137
143
  >
138
144
  <TableCellRenderer
139
145
  collapsibleTrail={collapsibleTrail}
146
+ columnDefinitions={columnDefinitions}
140
147
  columnPinning={columnPinning}
141
148
  loading={loading}
142
149
  row={row}
@@ -197,6 +204,7 @@ export const RegularTableView = ({
197
204
  )}
198
205
  <TableCellRenderer
199
206
  collapsibleTrail={collapsibleTrail}
207
+ columnDefinitions={columnDefinitions}
200
208
  columnPinning={columnPinning}
201
209
  loading={loading}
202
210
  row={row}
@@ -15,6 +15,7 @@ import Icon from "../../pb_icon/_icon"
15
15
  import { SortIconButton } from "./SortIconButton"
16
16
  import { ToggleIconButton } from "./ToggleIconButton"
17
17
  import { displayIcon } from "../Utilities/IconHelpers"
18
+ import { findColumnDefByAccessor } from "../Utilities/ColumnStylingHelper"
18
19
  import { updateExpandAndCollapseState } from "../Utilities/ExpansionControlHelpers"
19
20
 
20
21
  import { isChrome } from "../Utilities/BrowserCheck"
@@ -45,6 +46,7 @@ export const TableHeaderCell = ({
45
46
  table
46
47
  }: TableHeaderCellProps) => {
47
48
  const {
49
+ columnDefinitions,
48
50
  expanded,
49
51
  setExpanded,
50
52
  expandByDepth,
@@ -72,6 +74,18 @@ export const TableHeaderCell = ({
72
74
  header?.column.getToggleSortingHandler()(event)
73
75
  }
74
76
  }
77
+ const alignmentMap: Record<string, "start" | "center" | "end"> = {
78
+ left: "start",
79
+ center: "center",
80
+ right: "end",
81
+ };
82
+
83
+ // Look up the “owning” columnDefinition by accessor. Needed for multi column logic
84
+ const colDef = header
85
+ ? findColumnDefByAccessor(columnDefinitions, header.column.id)
86
+ : undefined
87
+
88
+ const headerAlignment = colDef?.columnStyling?.headerAlignment ?? colDef?.columnStyling?.headerAligment
75
89
 
76
90
  const isLeafColumn =
77
91
  header?.column.getLeafColumns().length === 1 &&
@@ -126,9 +140,15 @@ const isToggleExpansionEnabled =
126
140
  (enableToggleExpansion === "all" || "header") &&
127
141
  enableToggleExpansion !== "none"
128
142
 
129
- let justifyHeader:justifyTypes;
143
+ let justifyHeader: justifyTypes;
130
144
 
131
- if (header?.index === 0 && hasAnySubRows || (header?.index === 0 && inlineRowLoading) || (header?.index === 0 && isToggleExpansionEnabled)) {
145
+ if (headerAlignment && alignmentMap[headerAlignment]) {
146
+ justifyHeader = alignmentMap[headerAlignment];
147
+ } else if (
148
+ (header?.index === 0 && hasAnySubRows) ||
149
+ (header?.index === 0 && inlineRowLoading) ||
150
+ (header?.index === 0 && isToggleExpansionEnabled)
151
+ ) {
132
152
  justifyHeader = enableSorting ? "between" : "start";
133
153
  } else {
134
154
  justifyHeader = isLeafColumn ? "end" : "center";
@@ -165,7 +185,7 @@ const isToggleExpansionEnabled =
165
185
 
166
186
  return (
167
187
  <th
168
- align="right"
188
+ align={headerAlignment ? headerAlignment : "right"}
169
189
  className={cellClassName}
170
190
  colSpan={header?.colSpan}
171
191
  id={cellId}
@@ -253,8 +273,8 @@ const isToggleExpansionEnabled =
253
273
  tabIndex: 0,
254
274
  },
255
275
  })}
256
- justify={header?.index === 0 && enableSorting ? "between" : "none"}
257
- paddingLeft={enableSorting ? "xxs" : "xs"}
276
+ justify={header?.index === 0 && enableSorting ? "between" : headerAlignment ? alignmentMap[headerAlignment] : "none"}
277
+ paddingLeft={header?.index === 0 ? enableSorting ? "xxs" : "xs" : "none"}
258
278
  >
259
279
  <div>
260
280
  {flexRender(header?.column.columnDef.header, header?.getContext())}
@@ -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
+ };
@@ -621,6 +621,23 @@
621
621
  box-shadow: 0 4px 10px 0 rgba($shadow, 0.16) !important;
622
622
  }
623
623
 
624
+ // For Rails, we can't target the &:last-child since collapsed rows are display: none;
625
+ // With JS, we add a .last-visible-row class and add rounded corners to bottom row
626
+ .last-visible-row {
627
+ td, .pb_table_td {
628
+ border-width: 0 0 1px 0;
629
+
630
+ &:first-child {
631
+ border-radius: 0 0 0 4px;
632
+ border-width: 0 0 1px 1px;
633
+ }
634
+ &:last-child {
635
+ border-radius: 0 0 4px 0;
636
+ border-width: 0 1px 1px 0;
637
+ }
638
+ }
639
+ }
640
+
624
641
  &.dark {
625
642
  // Override default border color for dark mode
626
643
  --column-border-color: #{$border_dark};
@@ -572,4 +572,64 @@ 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
+ });
@@ -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.
@@ -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,5 @@ 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
@@ -34,3 +34,5 @@ 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'
@@ -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() {