playbook_ui 13.34.1.pre.alpha.powerfontsexternal3403 → 14.0.0.pre.alpha.PLAY14113475
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/TableHeaderCell.tsx +5 -2
- data/app/pb_kits/playbook/pb_advanced_table/SubKits/TableBody.tsx +24 -20
- data/app/pb_kits/playbook/pb_advanced_table/SubKits/TableHeader.tsx +17 -12
- data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +86 -1
- data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.tsx +5 -1
- data/app/pb_kits/playbook/pb_advanced_table/advanced_table.test.jsx +30 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_responsive.jsx +67 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_responsive.md +1 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +1 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/index.js +2 -1
- data/app/pb_kits/playbook/pb_avatar/_avatar.scss +0 -30
- data/app/pb_kits/playbook/pb_avatar/_avatar.tsx +19 -1
- data/app/pb_kits/playbook/pb_avatar/avatar.rb +44 -1
- data/app/pb_kits/playbook/pb_avatar/avatar.test.js +17 -0
- data/app/pb_kits/playbook/pb_badge/_badge.scss +6 -0
- data/app/pb_kits/playbook/pb_badge/_badge.tsx +4 -2
- data/app/pb_kits/playbook/pb_badge/badge.rb +1 -1
- data/app/pb_kits/playbook/pb_badge/badge.test.js +17 -11
- data/app/pb_kits/playbook/pb_badge/docs/_badge_notification.html.erb +13 -0
- data/app/pb_kits/playbook/pb_badge/docs/_badge_notification.jsx +31 -12
- data/app/pb_kits/playbook/pb_date_picker/docs/_description.md +3 -1
- data/app/pb_kits/playbook/pb_fixed_confirmation_toast/_fixed_confirmation_toast.scss +1 -1
- data/app/pb_kits/playbook/pb_form/docs/_form_form_with.html.erb +1 -0
- data/app/pb_kits/playbook/pb_icon/_icon.tsx +3 -0
- data/app/pb_kits/playbook/pb_icon/icon.rb +2 -0
- data/app/pb_kits/playbook/pb_icon_circle/_icon_circle.tsx +2 -1
- data/app/pb_kits/playbook/pb_icon_circle/icon_circle.rb +2 -2
- data/app/pb_kits/playbook/pb_icon_stat_value/_icon_stat_value.scss +0 -11
- data/app/pb_kits/playbook/pb_icon_stat_value/_icon_stat_value.tsx +3 -2
- data/app/pb_kits/playbook/pb_icon_stat_value/docs/_icon_stat_value_color.html.erb +1 -0
- data/app/pb_kits/playbook/pb_icon_stat_value/icon_stat_value.rb +2 -2
- data/app/pb_kits/playbook/pb_icon_stat_value/icon_stat_value.test.js +5 -4
- data/app/pb_kits/playbook/pb_nav/_horizontal_nav.scss +1 -1
- data/app/pb_kits/playbook/pb_online_status/_online_status.scss +52 -5
- data/app/pb_kits/playbook/pb_online_status/_online_status.tsx +6 -1
- data/app/pb_kits/playbook/pb_online_status/docs/_online_status_no_border.html.erb +1 -0
- data/app/pb_kits/playbook/pb_online_status/docs/_online_status_no_border.jsx +14 -0
- data/app/pb_kits/playbook/pb_online_status/docs/_online_status_size.html.erb +3 -0
- data/app/pb_kits/playbook/pb_online_status/docs/_online_status_size.jsx +25 -0
- data/app/pb_kits/playbook/pb_online_status/docs/example.yml +6 -2
- data/app/pb_kits/playbook/pb_online_status/docs/index.js +2 -0
- data/app/pb_kits/playbook/pb_online_status/online_status.rb +11 -1
- data/app/pb_kits/playbook/pb_online_status/online_status.test.js +31 -0
- data/app/pb_kits/playbook/pb_overlay/docs/_overlay_toggle.html.erb +61 -0
- data/app/pb_kits/playbook/pb_overlay/docs/_overlay_toggle.jsx +70 -0
- data/app/pb_kits/playbook/pb_overlay/docs/_overlay_toggle.md +1 -0
- data/app/pb_kits/playbook/pb_overlay/docs/example.yml +4 -2
- data/app/pb_kits/playbook/pb_overlay/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_star_rating/_star_rating.scss +83 -6
- data/app/pb_kits/playbook/pb_star_rating/docs/example.yml +3 -1
- data/app/pb_kits/playbook/pb_star_rating/index.js +73 -4
- data/app/pb_kits/playbook/pb_star_rating/star_rating.html.erb +1 -1
- data/app/pb_kits/playbook/pb_star_rating/star_rating.rb +2 -2
- data/app/pb_kits/playbook/pb_star_rating/stars/utils.tsx +5 -1
- data/app/pb_kits/playbook/pb_star_rating/subcomponents/_star_rating_interactive.tsx +50 -21
- data/app/pb_kits/playbook/pb_table/_table.tsx +1 -1
- data/app/pb_kits/playbook/pb_table/index.ts +4 -4
- data/app/pb_kits/playbook/pb_table/subcomponents/_table_body.tsx +1 -1
- data/app/pb_kits/playbook/pb_table/subcomponents/_table_cell.tsx +1 -1
- data/app/pb_kits/playbook/pb_table/subcomponents/_table_head.tsx +1 -1
- data/app/pb_kits/playbook/pb_table/subcomponents/_table_header.tsx +1 -1
- data/app/pb_kits/playbook/pb_table/subcomponents/_table_row.tsx +1 -1
- data/app/pb_kits/playbook/pb_table/table.test.js +2 -0
- data/app/pb_kits/playbook/pb_text_input/_text_input.tsx +1 -1
- data/app/pb_kits/playbook/pb_text_input/docs/_text_input_default.jsx +1 -1
- data/app/pb_kits/playbook/pb_textarea/_textarea.tsx +45 -27
- data/app/pb_kits/playbook/pb_textarea/index.ts +3 -3
- data/app/pb_kits/playbook/pb_time/_time.tsx +3 -3
- data/app/pb_kits/playbook/pb_time_range_inline/_time_range_inline.tsx +1 -1
- data/app/pb_kits/playbook/pb_timeline/_item.tsx +1 -1
- data/app/pb_kits/playbook/pb_timeline/_timeline.tsx +1 -1
- data/app/pb_kits/playbook/pb_title_detail/_title_detail.tsx +10 -10
- data/app/pb_kits/playbook/pb_toggle/_toggle.tsx +1 -1
- data/app/pb_kits/playbook/pb_tooltip/_tooltip.tsx +2 -2
- data/app/pb_kits/playbook/pb_treemap_chart/_treemap_chart.tsx +1 -2
- data/app/pb_kits/playbook/pb_treemap_chart/treemapChart.test.js +2 -0
- data/app/pb_kits/playbook/pb_typeahead/_typeahead.tsx +2 -2
- data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_multi_kit.html.erb +1 -1
- data/app/pb_kits/playbook/pb_typeahead/typeahead.rb +1 -0
- data/app/pb_kits/playbook/pb_user/_user.tsx +1 -1
- data/app/pb_kits/playbook/pb_user_badge/_user_badge.tsx +6 -6
- data/app/pb_kits/playbook/pb_user_badge/badges/million-dollar.tsx +236 -235
- data/app/pb_kits/playbook/pb_user_badge/badges/veteran.tsx +1 -1
- data/app/pb_kits/playbook/pb_walkthrough/_walkthrough.tsx +68 -63
- data/app/pb_kits/playbook/pb_weekday_stacked/_weekday_stacked.tsx +1 -1
- data/app/pb_kits/playbook/utilities/_positioning.scss +26 -15
- data/dist/chunks/{_typeahead-COUJ88EA.js → _typeahead-eBLGedV-.js} +2 -2
- data/dist/chunks/{_weekday_stacked-BZu4elIU.js → _weekday_stacked-Bw_5qEUW.js} +2 -2
- data/dist/chunks/lazysizes-B7xYodB-.js +1 -0
- data/dist/chunks/{lib-Bf_E03gc.js → lib-BE0Z3F7x.js} +1 -1
- data/dist/chunks/{pb_form_validation-D0dhqeN2.js → pb_form_validation-TzZQ0Flx.js} +1 -1
- data/dist/chunks/vendor.js +1 -1
- data/dist/playbook-doc.js +1 -1
- data/dist/playbook-rails-react-bindings.js +1 -1
- data/dist/playbook-rails.js +1 -1
- data/dist/playbook.css +1 -1
- data/lib/playbook/version.rb +2 -2
- metadata +17 -8
- data/app/pb_kits/playbook/pb_online_status/_online_status_mixins.scss +0 -32
- 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: 256935cc0094e0047461f73eb8aa9a359414951eade45a2a3c82507ba9430d19
|
4
|
+
data.tar.gz: 7d173634a0c2134da2756f3c16435c48662570980fa226a0bbe8bb256950620e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6861772c1549b55563f7d3c79026f56cb930297ef756e02a5b9adc7df3300b31dc8286df6188b800023c23870eb90a62e4b7fc14f0fcfecdc1aa3769deb77a2f
|
7
|
+
data.tar.gz: 5b80990b1a26b4aa82392837d1c1a8c54304f3371e527beb8e7786ce54bb1620dab12804798855b9d43e4958f7586c10fd5e338d8f2b2adbccb26fe1d691c376
|
@@ -21,6 +21,7 @@ type TableHeaderCellProps = {
|
|
21
21
|
handleExpandOrCollapse?: () => void
|
22
22
|
header?: Header<GenericObject, unknown>
|
23
23
|
headerChildren?: React.ReactNode | React.ReactNode[]
|
24
|
+
isPinnedLeft?: boolean
|
24
25
|
loading?: boolean
|
25
26
|
sortIcon?: string | string[]
|
26
27
|
} & GlobalProps
|
@@ -31,10 +32,11 @@ export const TableHeaderCell = ({
|
|
31
32
|
handleExpandOrCollapse,
|
32
33
|
header,
|
33
34
|
headerChildren,
|
35
|
+
isPinnedLeft = false,
|
34
36
|
loading,
|
35
37
|
sortIcon,
|
36
38
|
}: TableHeaderCellProps) => {
|
37
|
-
const { sortControl } = useContext(AdvancedTableContext)
|
39
|
+
const { sortControl, responsive } = useContext(AdvancedTableContext)
|
38
40
|
|
39
41
|
const toggleSortButton = (event: React.SyntheticEvent) => {
|
40
42
|
if (sortControl) {
|
@@ -49,7 +51,8 @@ export const TableHeaderCell = ({
|
|
49
51
|
|
50
52
|
const cellClassName = classnames("table-header-cells",
|
51
53
|
`${isChrome() ? "chrome-styles" : ""}`,
|
52
|
-
`${enableSorting ? "table-header-cells-active" : ""}
|
54
|
+
`${enableSorting ? "table-header-cells-active" : ""}`,
|
55
|
+
{ 'pinned-left': responsive === "scroll" && isPinnedLeft },
|
53
56
|
)
|
54
57
|
|
55
58
|
const cellId = `${loading ?
|
@@ -37,17 +37,22 @@ export const TableBody = ({
|
|
37
37
|
columnDefinitions,
|
38
38
|
enableToggleExpansion,
|
39
39
|
handleExpandOrCollapse,
|
40
|
+
isPinnedLeft = false,
|
40
41
|
inlineRowLoading,
|
41
42
|
loading,
|
43
|
+
responsive,
|
42
44
|
table,
|
43
45
|
} = useContext(AdvancedTableContext)
|
44
46
|
|
45
47
|
const classes = classnames(
|
46
48
|
buildCss("pb_advanced_table_body"),
|
49
|
+
{ 'pinned-left': responsive === "scroll" && isPinnedLeft },
|
47
50
|
globalProps(props),
|
48
51
|
className
|
49
52
|
)
|
50
53
|
|
54
|
+
const columnPinning = table.getState().columnPinning;
|
55
|
+
|
51
56
|
return (
|
52
57
|
<>
|
53
58
|
<tbody className={classes}
|
@@ -73,38 +78,37 @@ export const TableBody = ({
|
|
73
78
|
table={table}
|
74
79
|
/>
|
75
80
|
)}
|
81
|
+
<tr
|
82
|
+
className={`${rowBackground ? "bg-silver" : "bg-white"} ${
|
83
|
+
row.depth > 0 ? `depth-sub-row-${row.depth}` : ""
|
84
|
+
}`}
|
85
|
+
id={`${row.index}-${row.id}-${row.depth}-row`}
|
86
|
+
>
|
87
|
+
{row.getVisibleCells().map((cell, i) => {
|
88
|
+
const isPinnedLeft = columnPinning.left.includes(cell.column.id)
|
76
89
|
|
77
|
-
|
78
|
-
className={`${rowBackground ? "bg-silver" : "bg-white"} ${
|
79
|
-
row.depth > 0 ? `depth-sub-row-${row.depth}` : ""
|
80
|
-
}`}
|
81
|
-
id={`${row.index}-${row.id}-${row.depth}-row`}
|
82
|
-
>
|
83
|
-
{row.getVisibleCells().map((cell, i) => (
|
90
|
+
return (
|
84
91
|
<td
|
85
92
|
align="right"
|
86
|
-
className={
|
87
|
-
|
88
|
-
|
93
|
+
className={classnames(
|
94
|
+
`${cell.id}-cell position_relative`,
|
95
|
+
isChrome() ? "chrome-styles" : "",
|
96
|
+
isPinnedLeft && 'pinned-left'
|
97
|
+
)}
|
89
98
|
key={`${cell.id}-data`}
|
90
99
|
>
|
91
|
-
{collapsibleTrail &&
|
92
|
-
i === 0 &&
|
93
|
-
row.depth > 0 &&
|
94
|
-
renderCollapsibleTrail(row.depth)}
|
100
|
+
{collapsibleTrail && i === 0 && row.depth > 0 && renderCollapsibleTrail(row.depth)}
|
95
101
|
<span id={`${cell.id}-span`}>
|
96
102
|
{loading ? (
|
97
103
|
<LoadingCell />
|
98
104
|
) : (
|
99
|
-
flexRender(
|
100
|
-
cell.column.columnDef.cell,
|
101
|
-
cell.getContext()
|
102
|
-
)
|
105
|
+
flexRender(cell.column.columnDef.cell, cell.getContext())
|
103
106
|
)}
|
104
107
|
</span>
|
105
108
|
</td>
|
106
|
-
)
|
107
|
-
|
109
|
+
)
|
110
|
+
})}
|
111
|
+
</tr>
|
108
112
|
|
109
113
|
{/* Display LoadingInline if Row Data is querying and there are no children already */}
|
110
114
|
{isDataLoading ? (
|
@@ -42,6 +42,7 @@ export const TableHeader = ({
|
|
42
42
|
className
|
43
43
|
)
|
44
44
|
|
45
|
+
const columnPinning = table.getState().columnPinning;
|
45
46
|
|
46
47
|
return (
|
47
48
|
<>
|
@@ -51,18 +52,22 @@ export const TableHeader = ({
|
|
51
52
|
{/* Get the header groups (only one in this example) */}
|
52
53
|
{table.getHeaderGroups().map((headerGroup: HeaderGroup<GenericObject>) => (
|
53
54
|
<tr key={`${headerGroup.id}-headerGroup`}>
|
54
|
-
{headerGroup.headers.map(header =>
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
55
|
+
{headerGroup.headers.map(header => {
|
56
|
+
const isPinnedLeft = columnPinning.left.includes(header.id)
|
57
|
+
return (
|
58
|
+
<TableHeaderCell
|
59
|
+
enableSorting={enableSorting}
|
60
|
+
enableToggleExpansion={enableToggleExpansion}
|
61
|
+
handleExpandOrCollapse={handleExpandOrCollapse}
|
62
|
+
header={header}
|
63
|
+
headerChildren={children}
|
64
|
+
isPinnedLeft={isPinnedLeft}
|
65
|
+
key={`${header.id}-header`}
|
66
|
+
loading={loading}
|
67
|
+
sortIcon={sortIcon}
|
68
|
+
/>
|
69
|
+
)
|
70
|
+
})}
|
66
71
|
</tr>
|
67
72
|
))}
|
68
73
|
</thead>
|
@@ -5,9 +5,11 @@
|
|
5
5
|
@import "./scss_partials/loading";
|
6
6
|
@import "./scss_partials/pseudo_states";
|
7
7
|
@import "./scss_partials/chrome_styles";
|
8
|
+
@import "../tokens/screen_sizes";
|
9
|
+
@import "../tokens/shadows";
|
8
10
|
|
9
11
|
.pb_advanced_table {
|
10
|
-
$border-color: 1px solid $border_light
|
12
|
+
$border-color: 1px solid $border_light;
|
11
13
|
|
12
14
|
[id$="-span"] {
|
13
15
|
word-wrap: normal;
|
@@ -108,6 +110,51 @@
|
|
108
110
|
height: auto;
|
109
111
|
}
|
110
112
|
|
113
|
+
// Responsive Styles
|
114
|
+
@media only screen and (max-width: $screen-xl-min) {
|
115
|
+
&[class*="table-responsive-scroll"] {
|
116
|
+
border-radius: 4px;
|
117
|
+
box-shadow: 1px 0 0 0px $border_light,
|
118
|
+
-1px 0 0 0px $border_light;
|
119
|
+
display: block;
|
120
|
+
overflow-x: auto;
|
121
|
+
width: 100%;
|
122
|
+
[class^=pb_table].table-sm.table-card thead tr th:first-child,
|
123
|
+
[class^=pb_table].table-sm:not(.no-hover).table-card tbody tr td:first-child {
|
124
|
+
border-left-width: 0px;
|
125
|
+
}
|
126
|
+
[class^=pb_table].table-sm.table-card thead tr th:last-child,
|
127
|
+
[class^=pb_table].table-sm:not(.no-hover).table-card tbody tr td:last-child {
|
128
|
+
border-right-width: 0px;
|
129
|
+
}
|
130
|
+
[class^=pb_table].table-sm.table-card tbody tr:last-child td:first-child,
|
131
|
+
[class^=pb_table].table-sm.table-card tbody tr:last-child td:last-child {
|
132
|
+
border-radius: 0 0 0 0;
|
133
|
+
}
|
134
|
+
.table-header-cells:first-child,
|
135
|
+
td:first-child,
|
136
|
+
.pb_table_td:first-child,
|
137
|
+
[class*="pinned-left"] {
|
138
|
+
background-color: $white;
|
139
|
+
box-shadow: $shadow_deep !important;
|
140
|
+
position: sticky !important;
|
141
|
+
left: 0;
|
142
|
+
z-index: 2;
|
143
|
+
}
|
144
|
+
.bg-silver td:first-child {
|
145
|
+
background-color: lighten($silver, $opacity_7);
|
146
|
+
}
|
147
|
+
.bg-white td:first-child {
|
148
|
+
background-color: $white;
|
149
|
+
}
|
150
|
+
}
|
151
|
+
}
|
152
|
+
@media only screen and (min-width: $screen-xl-min) {
|
153
|
+
&[class*="table-responsive-scroll"] {
|
154
|
+
overflow-x: visible;
|
155
|
+
}
|
156
|
+
}
|
157
|
+
|
111
158
|
&.dark {
|
112
159
|
.bg-white {
|
113
160
|
background: $bg_dark_card;
|
@@ -151,5 +198,43 @@
|
|
151
198
|
) !important;
|
152
199
|
}
|
153
200
|
}
|
201
|
+
// Dark Mode Responsive Styles
|
202
|
+
@media only screen and (max-width: $screen-xl-min) {
|
203
|
+
&[class*="table-responsive-scroll"] {
|
204
|
+
border-radius: 4px;
|
205
|
+
box-shadow: 1px 0 0 0px $border_dark,
|
206
|
+
-1px 0 0 0px $border_dark;
|
207
|
+
display: block;
|
208
|
+
overflow-x: scroll;
|
209
|
+
width: 100%;
|
210
|
+
[class^=pb_table].table-sm.table-card thead tr th:first-child,
|
211
|
+
[class^=pb_table].table-sm:not(.no-hover).table-card tbody tr td:first-child {
|
212
|
+
border-left-width: 0px;
|
213
|
+
}
|
214
|
+
[class^=pb_table].table-sm.table-card thead tr th:last-child,
|
215
|
+
[class^=pb_table].table-sm:not(.no-hover).table-card tbody tr td:last-child {
|
216
|
+
border-right-width: 0px;
|
217
|
+
}
|
218
|
+
[class^=pb_table].table-sm.table-card tbody tr:last-child td:first-child,
|
219
|
+
[class^=pb_table].table-sm.table-card tbody tr:last-child td:last-child {
|
220
|
+
border-radius: 0 0 0 0;
|
221
|
+
}
|
222
|
+
.table-header-cells:first-child,
|
223
|
+
td:first-child,
|
224
|
+
.pb_table_td:first-child,
|
225
|
+
[class*="pinned-left"] {
|
226
|
+
background: $bg_dark_card;
|
227
|
+
border-right: $border_dark;
|
228
|
+
box-shadow: $shadow_deep !important;
|
229
|
+
position: sticky !important;
|
230
|
+
}
|
231
|
+
.bg-silver td:first-child {
|
232
|
+
background-color: $bg_dark;
|
233
|
+
}
|
234
|
+
.bg-white td:first-child {
|
235
|
+
background-color: $bg_dark_card;
|
236
|
+
}
|
237
|
+
}
|
238
|
+
}
|
154
239
|
}
|
155
240
|
}
|
@@ -42,6 +42,7 @@ type AdvancedTableProps = {
|
|
42
42
|
loading?: boolean | string
|
43
43
|
onRowToggleClick?: (arg: Row<GenericObject>) => void
|
44
44
|
onToggleExpansionClick?: (arg: Row<GenericObject>) => void
|
45
|
+
responsive?: "scroll" | "none",
|
45
46
|
sortControl?: GenericObject
|
46
47
|
tableData: GenericObject[]
|
47
48
|
tableOptions?: GenericObject
|
@@ -66,6 +67,7 @@ const AdvancedTable = (props: AdvancedTableProps) => {
|
|
66
67
|
loading,
|
67
68
|
onRowToggleClick,
|
68
69
|
onToggleExpansionClick,
|
70
|
+
responsive = "scroll",
|
69
71
|
sortControl,
|
70
72
|
tableData,
|
71
73
|
tableOptions,
|
@@ -132,7 +134,7 @@ const AdvancedTable = (props: AdvancedTableProps) => {
|
|
132
134
|
//Create column array in format needed by Tanstack
|
133
135
|
const columns =
|
134
136
|
columnDefinitions &&
|
135
|
-
|
137
|
+
columnDefinitions.map((column) => {
|
136
138
|
// Define the base column structure
|
137
139
|
const columnStructure = {
|
138
140
|
...columnHelper.accessor(column.accessor, {
|
@@ -209,6 +211,7 @@ const AdvancedTable = (props: AdvancedTableProps) => {
|
|
209
211
|
const htmlProps = buildHtmlProps(htmlOptions)
|
210
212
|
const classes = classnames(
|
211
213
|
buildCss("pb_advanced_table"),
|
214
|
+
`table-responsive-${responsive}`,
|
212
215
|
globalProps(props),
|
213
216
|
className
|
214
217
|
)
|
@@ -229,6 +232,7 @@ const AdvancedTable = (props: AdvancedTableProps) => {
|
|
229
232
|
handleExpandOrCollapse,
|
230
233
|
inlineRowLoading,
|
231
234
|
loading,
|
235
|
+
responsive,
|
232
236
|
setExpanded,
|
233
237
|
sortControl,
|
234
238
|
table,
|
@@ -432,4 +432,34 @@ test("inlineRowLoading prop renders inline loading if true", () => {
|
|
432
432
|
rowButton.click()
|
433
433
|
const inlineLoading = kit.querySelector(".fa-spinner")
|
434
434
|
expect(inlineLoading).toBeInTheDocument()
|
435
|
+
})
|
436
|
+
|
437
|
+
test("responsive prop functions as expected", () => {
|
438
|
+
render(
|
439
|
+
<AdvancedTable
|
440
|
+
columnDefinitions={columnDefinitions}
|
441
|
+
data={{ testid: testId }}
|
442
|
+
responsive="scroll"
|
443
|
+
tableData={MOCK_DATA}
|
444
|
+
tableProps={tableProps}
|
445
|
+
/>
|
446
|
+
)
|
447
|
+
|
448
|
+
const kit = screen.getByTestId(testId)
|
449
|
+
expect(kit).toHaveClass("pb_advanced_table table-responsive-scroll")
|
450
|
+
})
|
451
|
+
|
452
|
+
test("responsive none prop functions as expected", () => {
|
453
|
+
render(
|
454
|
+
<AdvancedTable
|
455
|
+
columnDefinitions={columnDefinitions}
|
456
|
+
data={{ testid: testId }}
|
457
|
+
responsive="none"
|
458
|
+
tableData={MOCK_DATA}
|
459
|
+
tableProps={tableProps}
|
460
|
+
/>
|
461
|
+
)
|
462
|
+
|
463
|
+
const kit = screen.getByTestId(testId)
|
464
|
+
expect(kit).toHaveClass("pb_advanced_table table-responsive-none")
|
435
465
|
})
|
@@ -0,0 +1,67 @@
|
|
1
|
+
import React from "react"
|
2
|
+
import { AdvancedTable } from "playbook-ui"
|
3
|
+
import Title from '../../pb_title/_title'
|
4
|
+
import MOCK_DATA from "./advanced_table_mock_data.json"
|
5
|
+
|
6
|
+
const AdvancedTableResponsive = (props) => {
|
7
|
+
const columnDefinitions = [
|
8
|
+
{
|
9
|
+
accessor: "year",
|
10
|
+
label: "Year",
|
11
|
+
cellAccessors: ["quarter", "month", "day"],
|
12
|
+
},
|
13
|
+
{
|
14
|
+
accessor: "newEnrollments",
|
15
|
+
label: "New Enrollments",
|
16
|
+
},
|
17
|
+
{
|
18
|
+
accessor: "scheduledMeetings",
|
19
|
+
label: "Scheduled Meetings",
|
20
|
+
},
|
21
|
+
{
|
22
|
+
accessor: "attendanceRate",
|
23
|
+
label: "Attendance Rate",
|
24
|
+
},
|
25
|
+
{
|
26
|
+
accessor: "completedClasses",
|
27
|
+
label: "Completed Classes",
|
28
|
+
},
|
29
|
+
{
|
30
|
+
accessor: "classCompletionRate",
|
31
|
+
label: "Class Completion Rate",
|
32
|
+
},
|
33
|
+
{
|
34
|
+
accessor: "graduatedStudents",
|
35
|
+
label: "Graduated Students",
|
36
|
+
},
|
37
|
+
]
|
38
|
+
|
39
|
+
return (
|
40
|
+
<div>
|
41
|
+
<Title
|
42
|
+
size={4}
|
43
|
+
text="Not Responsive"
|
44
|
+
{...props}
|
45
|
+
/>
|
46
|
+
<AdvancedTable
|
47
|
+
columnDefinitions={columnDefinitions}
|
48
|
+
responsive="none"
|
49
|
+
tableData={MOCK_DATA}
|
50
|
+
{...props}
|
51
|
+
/>
|
52
|
+
<Title
|
53
|
+
paddingTop="sm"
|
54
|
+
size={4}
|
55
|
+
text="Responsive as Default"
|
56
|
+
{...props}
|
57
|
+
/>
|
58
|
+
<AdvancedTable
|
59
|
+
columnDefinitions={columnDefinitions}
|
60
|
+
tableData={MOCK_DATA}
|
61
|
+
{...props}
|
62
|
+
/>
|
63
|
+
</div>
|
64
|
+
)
|
65
|
+
}
|
66
|
+
|
67
|
+
export default AdvancedTableResponsive
|
@@ -0,0 +1 @@
|
|
1
|
+
The `responsive` prop can be set to "scroll" or "none", and is set to "scroll" by default to make Advanced Tables responsive. To disable, set `responsive="none"`.
|
@@ -7,4 +7,5 @@ export { default as AdvancedTableSubrowHeaders } from './_advanced_table_subrow_
|
|
7
7
|
export { default as AdvancedTableCollapsibleTrail } from './_advanced_table_collapsible_trail.jsx'
|
8
8
|
export { default as AdvancedTableTableOptions } from './_advanced_table_table_options.jsx'
|
9
9
|
export { default as AdvancedTableTableProps } from './_advanced_table_table_props.jsx'
|
10
|
-
export { default as AdvancedTableInlineRowLoading } from './_advanced_table_inline_row_loading.jsx'
|
10
|
+
export { default as AdvancedTableInlineRowLoading } from './_advanced_table_inline_row_loading.jsx'
|
11
|
+
export { default as AdvancedTableResponsive } from './_advanced_table_responsive.jsx'
|
@@ -78,36 +78,6 @@ $avatar-sizes: (
|
|
78
78
|
display: block;
|
79
79
|
}
|
80
80
|
}
|
81
|
-
[class^=pb_online_status] {
|
82
|
-
position: absolute;
|
83
|
-
right: 0;
|
84
|
-
top: 0;
|
85
|
-
bottom: auto;
|
86
|
-
left: auto;
|
87
|
-
|
88
|
-
&.size_xxs {
|
89
|
-
right: -5px;
|
90
|
-
}
|
91
|
-
|
92
|
-
&.size_xs {
|
93
|
-
right: -4px;
|
94
|
-
}
|
95
|
-
|
96
|
-
&.size_md {
|
97
|
-
top: auto;
|
98
|
-
bottom: 6px;
|
99
|
-
}
|
100
|
-
|
101
|
-
&.size_lg {
|
102
|
-
top: auto;
|
103
|
-
bottom: 14px;
|
104
|
-
}
|
105
|
-
|
106
|
-
&.size_xl {
|
107
|
-
top: auto;
|
108
|
-
bottom: 22px;
|
109
|
-
}
|
110
|
-
}
|
111
81
|
}
|
112
82
|
}
|
113
83
|
}
|
@@ -71,6 +71,22 @@ const Avatar = (props: AvatarProps): React.ReactElement => {
|
|
71
71
|
|
72
72
|
const canShowImage = imageUrl && !error
|
73
73
|
|
74
|
+
const onlineStatusSize =
|
75
|
+
['xxs', 'xs'].includes(size) ? 'sm' :
|
76
|
+
['sm', 'md'].includes(size) ? 'md' :
|
77
|
+
['lg', 'xl'].includes(size) ? 'lg' :
|
78
|
+
'sm';
|
79
|
+
|
80
|
+
const onlineStatusPositionProps = (["xxs", "xs", "sm"].includes(size)) ?
|
81
|
+
{
|
82
|
+
top: { inset: true, value: "0" },
|
83
|
+
right: { inset: false, value: "xxs" }
|
84
|
+
}
|
85
|
+
: {
|
86
|
+
bottom: { inset: true, value: "0" },
|
87
|
+
right: { inset: true, value: size === "xl" ? "sm" : size === "lg" ? "xs" : "xxs" }
|
88
|
+
};
|
89
|
+
|
74
90
|
return (
|
75
91
|
<div
|
76
92
|
{...ariaProps}
|
@@ -142,9 +158,11 @@ const Avatar = (props: AvatarProps): React.ReactElement => {
|
|
142
158
|
</div>
|
143
159
|
{status && (
|
144
160
|
<OnlineStatus
|
145
|
-
className={`size_${size}`}
|
146
161
|
dark={dark}
|
162
|
+
position="absolute"
|
163
|
+
size={onlineStatusSize}
|
147
164
|
status={status}
|
165
|
+
{...onlineStatusPositionProps}
|
148
166
|
/>
|
149
167
|
)}
|
150
168
|
</>
|
@@ -4,6 +4,8 @@ module Playbook
|
|
4
4
|
module PbAvatar
|
5
5
|
class Avatar < Playbook::KitBase
|
6
6
|
prop :component_overlay
|
7
|
+
prop :dark, type: Playbook::Props::Boolean,
|
8
|
+
default: false
|
7
9
|
prop :image_url, type: Playbook::Props::String
|
8
10
|
prop :image_alt, type: Playbook::Props::String,
|
9
11
|
default: ""
|
@@ -23,7 +25,22 @@ module Playbook
|
|
23
25
|
end
|
24
26
|
|
25
27
|
def online_status_props
|
26
|
-
|
28
|
+
props = {
|
29
|
+
dark: dark,
|
30
|
+
status: status,
|
31
|
+
size: online_status_size,
|
32
|
+
position: "absolute",
|
33
|
+
right: online_status_right_position,
|
34
|
+
}
|
35
|
+
|
36
|
+
case size
|
37
|
+
when "xxs", "xs", "sm"
|
38
|
+
props[:top] = { value: "0", inset: true }
|
39
|
+
else
|
40
|
+
props[:bottom] = { value: "0", inset: true }
|
41
|
+
end
|
42
|
+
|
43
|
+
props
|
27
44
|
end
|
28
45
|
|
29
46
|
def alt_text
|
@@ -57,6 +74,32 @@ module Playbook
|
|
57
74
|
}
|
58
75
|
end
|
59
76
|
|
77
|
+
def online_status_size
|
78
|
+
case size
|
79
|
+
when "xxs", "xs"
|
80
|
+
"sm"
|
81
|
+
when "sm", "md"
|
82
|
+
"md"
|
83
|
+
when "lg", "xl"
|
84
|
+
"lg"
|
85
|
+
else
|
86
|
+
"sm"
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def online_status_right_position
|
91
|
+
case size
|
92
|
+
when "xxs", "xs", "sm"
|
93
|
+
"xxs"
|
94
|
+
when "md"
|
95
|
+
{ value: "xxs", inset: true }
|
96
|
+
when "lg"
|
97
|
+
{ value: "xs", inset: true }
|
98
|
+
when "xl"
|
99
|
+
{ value: "sm", inset: true }
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
60
103
|
def placement_styles(offset)
|
61
104
|
top_bottom_offset = if offset == "xs"
|
62
105
|
"xs"
|
@@ -89,3 +89,20 @@ test('renders with iconCircle overlay', () => {
|
|
89
89
|
expect(iconCircleOverlay).toBeInTheDocument();
|
90
90
|
expect(iconCircleOverlay).toHaveClass('pb_avatar_kit_size_md');
|
91
91
|
});
|
92
|
+
|
93
|
+
|
94
|
+
test('renders with online status', () => {
|
95
|
+
render(
|
96
|
+
<Avatar
|
97
|
+
data={{ testid: testId }}
|
98
|
+
imageAlt={imageAlt}
|
99
|
+
imageUrl={imageUrl}
|
100
|
+
name={name}
|
101
|
+
status="online"
|
102
|
+
/>
|
103
|
+
);
|
104
|
+
|
105
|
+
const onlineStatusAvatar = screen.getByTestId(testId);
|
106
|
+
const onlineStatus = onlineStatusAvatar.querySelector('.pb_online_status_kit_online_size_md')
|
107
|
+
expect(onlineStatus).toBeInTheDocument();
|
108
|
+
});
|
@@ -25,7 +25,7 @@ type BadgeProps = {
|
|
25
25
|
removeOnClick?: React.MouseEventHandler<HTMLSpanElement>,
|
26
26
|
rounded?: boolean,
|
27
27
|
text?: string,
|
28
|
-
variant?: "error" | "info" | "neutral" | "notification" | "primary" | "success" | "warning",
|
28
|
+
variant?: "error" | "info" | "neutral" | "notification" | "notificationError" | "primary" | "success" | "warning",
|
29
29
|
} & GlobalProps
|
30
30
|
const Badge = (props: BadgeProps): React.ReactElement => {
|
31
31
|
const {
|
@@ -45,7 +45,9 @@ const Badge = (props: BadgeProps): React.ReactElement => {
|
|
45
45
|
const dataProps = buildDataProps(data)
|
46
46
|
const htmlProps = buildHtmlProps(htmlOptions)
|
47
47
|
const css = classnames(
|
48
|
-
buildCss('pb_badge_kit',
|
48
|
+
buildCss('pb_badge_kit',
|
49
|
+
variant === "success" ? "success_sm" : variant === "notificationError" ? "notification_error" : variant,
|
50
|
+
rounded ? 'rounded' : ''),
|
49
51
|
globalProps(props),
|
50
52
|
className
|
51
53
|
)
|
@@ -6,7 +6,7 @@ module Playbook
|
|
6
6
|
prop :rounded, type: Playbook::Props::Boolean, default: false
|
7
7
|
prop :text
|
8
8
|
prop :variant, type: Playbook::Props::Enum,
|
9
|
-
values: %w[success warning error info neutral notification primary],
|
9
|
+
values: %w[success warning error info neutral notification notification_error primary],
|
10
10
|
default: "neutral"
|
11
11
|
|
12
12
|
def classname
|
@@ -94,15 +94,21 @@ test('displays success variant', () => {
|
|
94
94
|
|
95
95
|
})
|
96
96
|
|
97
|
-
test('displays notification
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
97
|
+
test('displays notification variants', () => {
|
98
|
+
[
|
99
|
+
"notification",
|
100
|
+
"notificationError"
|
101
|
+
].forEach((colorVariant) => {
|
102
|
+
render(
|
103
|
+
<Badge
|
104
|
+
data={{ testid: testId }}
|
105
|
+
text={colorVariant}
|
106
|
+
variant={colorVariant}
|
107
|
+
/>
|
108
|
+
)
|
109
|
+
const kit = screen.getByTestId(testId)
|
110
|
+
expect(kit).toHaveClass(`pb_badge_kit_${colorVariant === "notificationError" ? "notification_error" : "notification"}`)
|
111
|
+
|
112
|
+
cleanup()
|
113
|
+
})
|
108
114
|
})
|