playbook_ui 14.22.0.pre.rc.1 → 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.
- checksums.yaml +4 -4
- data/app/pb_kits/playbook/pb_advanced_table/Components/CustomCell.tsx +1 -1
- data/app/pb_kits/playbook/pb_advanced_table/Components/RegularTableView.tsx +12 -4
- data/app/pb_kits/playbook/pb_advanced_table/Components/TableHeaderCell.tsx +25 -5
- data/app/pb_kits/playbook/pb_advanced_table/Utilities/ColumnStylingHelper.ts +15 -0
- data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +17 -0
- data/app/pb_kits/playbook/pb_advanced_table/advanced_table.test.jsx +61 -1
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_beta_sort.html.erb +1 -1
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_beta_subrow_headers.html.erb +1 -1
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_border_color_rails.html.erb +1 -1
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling.jsx +51 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling.md +7 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_column_headers.jsx +77 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_column_headers.md +1 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_column_headers_rails.html.erb +63 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_column_headers_rails.md +1 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_rails.html.erb +38 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_rails.md +7 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_loading.html.erb +1 -1
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_actions.jsx +2 -2
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_actions_rails.html.erb +3 -2
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props_sticky_header.html.erb +1 -1
- data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +4 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/index.js +2 -0
- data/app/pb_kits/playbook/pb_advanced_table/index.js +21 -0
- data/app/pb_kits/playbook/pb_advanced_table/table_header.html.erb +1 -1
- data/app/pb_kits/playbook/pb_advanced_table/table_header.rb +5 -0
- data/app/pb_kits/playbook/pb_advanced_table/table_row.html.erb +2 -2
- data/app/pb_kits/playbook/pb_advanced_table/table_row.rb +33 -0
- data/dist/chunks/_weekday_stacked-JnoR3mIy.js +45 -0
- data/dist/chunks/lazysizes-B7xYodB-.js +1 -0
- data/dist/chunks/vendor.js +1 -1
- data/dist/playbook-doc.js +1 -1
- data/dist/playbook-rails.js +1 -1
- data/dist/playbook.css +1 -1
- data/lib/playbook/version.rb +1 -1
- metadata +13 -4
- data/dist/chunks/_weekday_stacked-CB0ZsFbo.js +0 -45
- data/dist/chunks/lazysizes-DHz07jlL.js +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 60de2699b3213e11373d3894f23082a1bd0f1975413dd47e56a9ac1a05cc5fe0
|
4
|
+
data.tar.gz: 2e486251afd8b0ea3866755887d78e31a7cc6a96d28e78f76a1ebcce67072e6c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f924a62c189edfd0462efa80f3f3c6960044b67194ff47212a261deea88e5dc81939cee8d816436bff37b322e4fd41ca0baf4f7aa768d61c71fa7d8c3c6f8652
|
7
|
+
data.tar.gz: 1498242e9f85a89aadc89e1a1f78528b4a2638e7544ad1907910e1b301dbc61f23e95041a2a961d47660277efc9ea08aacee30af13e1a811f872b45c812c9f80
|
@@ -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=
|
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 (
|
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 %>
|
data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_beta_subrow_headers.html.erb
CHANGED
@@ -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 %>
|
data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_border_color_rails.html.erb
CHANGED
@@ -55,4 +55,4 @@
|
|
55
55
|
},
|
56
56
|
] %>
|
57
57
|
|
58
|
-
<%= pb_rails("advanced_table", props: { id: "
|
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.
|
data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_column_headers.jsx
ADDED
@@ -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
|
data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_column_headers.md
ADDED
@@ -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.
|
data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_rails.html.erb
ADDED
@@ -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: "
|
33
|
+
<%= pb_rails("advanced_table", props: { id: "loading_table", table_data: @table_data, column_definitions: column_definitions, loading: true }) %>
|
data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_actions.jsx
CHANGED
@@ -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" :
|
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" :
|
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(
|
93
|
+
alert('Row ids ' + selectedRowsString + ' will be exported!');
|
93
94
|
} else if (actionType === 'delete') {
|
94
|
-
alert(
|
95
|
+
alert('Row ids ' + selectedRowsString + ' will be deleted!');
|
95
96
|
}
|
96
97
|
}
|
97
98
|
};
|
data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_table_props_sticky_header.html.erb
CHANGED
@@ -30,4 +30,4 @@
|
|
30
30
|
}
|
31
31
|
] %>
|
32
32
|
|
33
|
-
<%= pb_rails("advanced_table", props: { id: "
|
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() {
|