playbook_ui 16.4.0 → 16.5.0.pre.alpha.AVNGR110715795
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/Context/AdvancedTableContext.tsx +5 -2
- data/app/pb_kits/playbook/pb_advanced_table/SubKits/TableHeader.tsx +9 -11
- data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +65 -1
- data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.tsx +3 -0
- data/app/pb_kits/playbook/pb_advanced_table/advanced_table.html.erb +2 -2
- data/app/pb_kits/playbook/pb_advanced_table/advanced_table.rb +9 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_grouped_headers_composition.jsx +235 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_grouped_headers_composition.md +17 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_pinned_rows_rails.html.erb +57 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_pinned_rows_rails.md +7 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/advanced_table_grouped_headers_composition_mock_data.json +98 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +2 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_advanced_table/index.js +82 -0
- data/app/pb_kits/playbook/pb_advanced_table/kit.schema.json +278 -0
- data/app/pb_kits/playbook/pb_advanced_table/scss_partials/advanced_table_sticky_mixin.scss +6 -2
- data/app/pb_kits/playbook/pb_advanced_table/table_body.html.erb +21 -4
- data/app/pb_kits/playbook/pb_advanced_table/table_body.rb +115 -9
- 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 +33 -0
- data/app/pb_kits/playbook/pb_advanced_table/table_row.html.erb +3 -1
- data/app/pb_kits/playbook/pb_advanced_table/table_row.rb +12 -1
- data/app/pb_kits/playbook/pb_advanced_table/table_subrow_header.html.erb +4 -1
- data/app/pb_kits/playbook/pb_advanced_table/table_subrow_header.rb +9 -1
- data/app/pb_kits/playbook/pb_avatar/kit.schema.json +86 -0
- data/app/pb_kits/playbook/pb_background/kit.schema.json +208 -0
- data/app/pb_kits/playbook/pb_badge/kit.schema.json +73 -0
- data/app/pb_kits/playbook/pb_body/kit.schema.json +101 -0
- data/app/pb_kits/playbook/pb_bread_crumbs/kit.schema.json +28 -0
- data/app/pb_kits/playbook/pb_button/docs/_button_full_width_rails.md +19 -0
- data/app/pb_kits/playbook/pb_button/docs/_button_full_width_react.md +23 -0
- data/app/pb_kits/playbook/pb_button/docs/{_button_loading.html.erb → _button_loading_rails.html.erb} +5 -5
- data/app/pb_kits/playbook/pb_button/docs/_button_loading_rails.md +3 -0
- data/app/pb_kits/playbook/pb_button/docs/example.yml +1 -1
- data/app/pb_kits/playbook/pb_button/kit.schema.json +207 -0
- data/app/pb_kits/playbook/pb_button_toolbar/kit.schema.json +67 -0
- data/app/pb_kits/playbook/pb_caption/kit.schema.json +91 -0
- data/app/pb_kits/playbook/pb_card/kit.schema.json +168 -0
- data/app/pb_kits/playbook/pb_checkbox/kit.schema.json +143 -0
- data/app/pb_kits/playbook/pb_circle_icon_button/_circle_icon_button.scss +5 -0
- data/app/pb_kits/playbook/pb_circle_icon_button/kit.schema.json +117 -0
- data/app/pb_kits/playbook/pb_collapsible/kit.schema.json +90 -0
- data/app/pb_kits/playbook/pb_contact/kit.schema.json +59 -0
- data/app/pb_kits/playbook/pb_copy_button/kit.schema.json +94 -0
- data/app/pb_kits/playbook/pb_currency/kit.schema.json +142 -0
- data/app/pb_kits/playbook/pb_dashboard_value/kit.schema.json +54 -0
- data/app/pb_kits/playbook/pb_date/kit.schema.json +98 -0
- data/app/pb_kits/playbook/pb_date_picker/date_picker.html.erb +1 -0
- data/app/pb_kits/playbook/pb_date_picker/date_picker.test.js +30 -0
- data/app/pb_kits/playbook/pb_date_picker/date_picker_helper.ts +35 -0
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_dialog_submission.jsx +62 -0
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_dialog_submission.md +1 -0
- data/app/pb_kits/playbook/pb_date_picker/docs/example.yml +1 -0
- data/app/pb_kits/playbook/pb_date_picker/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_date_picker/kit.schema.json +375 -0
- data/app/pb_kits/playbook/pb_date_range_inline/kit.schema.json +76 -0
- data/app/pb_kits/playbook/pb_date_range_stacked/kit.schema.json +36 -0
- data/app/pb_kits/playbook/pb_date_stacked/kit.schema.json +78 -0
- data/app/pb_kits/playbook/pb_date_time/kit.schema.json +96 -0
- data/app/pb_kits/playbook/pb_date_time_stacked/kit.schema.json +62 -0
- data/app/pb_kits/playbook/pb_date_year_stacked/kit.schema.json +42 -0
- data/app/pb_kits/playbook/pb_detail/kit.schema.json +72 -0
- data/app/pb_kits/playbook/pb_dialog/docs/_dialog_default.html.erb +9 -18
- data/app/pb_kits/playbook/pb_dialog/docs/_dialog_default.jsx +5 -24
- data/app/pb_kits/playbook/pb_dialog/kit.schema.json +186 -0
- data/app/pb_kits/playbook/pb_distribution_bar/kit.schema.json +48 -0
- data/app/pb_kits/playbook/pb_draggable/kit.schema.json +60 -0
- data/app/pb_kits/playbook/pb_dropdown/dropdown.test.jsx +51 -1
- data/app/pb_kits/playbook/pb_dropdown/kit.schema.json +244 -0
- data/app/pb_kits/playbook/pb_empty_state/kit.schema.json +117 -0
- data/app/pb_kits/playbook/pb_file_upload/kit.schema.json +124 -0
- data/app/pb_kits/playbook/pb_filter/Filter/ResultsCount.tsx +3 -1
- data/app/pb_kits/playbook/pb_filter/filter.rb +1 -1
- data/app/pb_kits/playbook/pb_filter/kit.schema.json +87 -0
- data/app/pb_kits/playbook/pb_fixed_confirmation_toast/kit.schema.json +118 -0
- data/app/pb_kits/playbook/pb_flex/kit.schema.json +151 -0
- data/app/pb_kits/playbook/pb_form/docs/_form_form_with_validate.html.erb +5 -5
- data/app/pb_kits/playbook/pb_form/docs/_form_form_with_validation_msg.html.erb +90 -0
- data/app/pb_kits/playbook/pb_form/docs/_form_form_with_validation_msg.md +13 -0
- data/app/pb_kits/playbook/pb_form/docs/example.yml +1 -0
- data/app/pb_kits/playbook/pb_form/kit.schema.json +53 -0
- data/app/pb_kits/playbook/pb_form/pb_form_validation.js +3 -1
- data/app/pb_kits/playbook/pb_form_group/kit.schema.json +30 -0
- data/app/pb_kits/playbook/pb_form_pill/kit.schema.json +132 -0
- data/app/pb_kits/playbook/pb_hashtag/kit.schema.json +71 -0
- data/app/pb_kits/playbook/pb_highlight/kit.schema.json +35 -0
- data/app/pb_kits/playbook/pb_home_address_street/kit.schema.json +121 -0
- data/app/pb_kits/playbook/pb_icon/icon.rb +7 -1
- data/app/pb_kits/playbook/pb_icon/kit.schema.json +180 -0
- data/app/pb_kits/playbook/pb_icon_button/kit.schema.json +116 -0
- data/app/pb_kits/playbook/pb_icon_circle/kit.schema.json +65 -0
- data/app/pb_kits/playbook/pb_icon_stat_value/kit.schema.json +96 -0
- data/app/pb_kits/playbook/pb_icon_value/kit.schema.json +49 -0
- data/app/pb_kits/playbook/pb_image/kit.schema.json +74 -0
- data/app/pb_kits/playbook/pb_kit/dateTime.ts +4 -22
- data/app/pb_kits/playbook/pb_label_pill/kit.schema.json +52 -0
- data/app/pb_kits/playbook/pb_label_value/kit.schema.json +84 -0
- data/app/pb_kits/playbook/pb_layout/kit.schema.json +107 -0
- data/app/pb_kits/playbook/pb_legend/kit.schema.json +44 -0
- data/app/pb_kits/playbook/pb_link/kit.schema.json +118 -0
- data/app/pb_kits/playbook/pb_list/_list_mixin.scss +4 -4
- data/app/pb_kits/playbook/pb_list/kit.schema.json +110 -0
- data/app/pb_kits/playbook/pb_loading_inline/kit.schema.json +55 -0
- data/app/pb_kits/playbook/pb_map/kit.schema.json +51 -0
- data/app/pb_kits/playbook/pb_message/kit.schema.json +104 -0
- data/app/pb_kits/playbook/pb_multi_level_select/_multi_level_select.tsx +3 -1
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_placeholder.html.erb +109 -0
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_placeholder.jsx +127 -0
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_placeholder.md +1 -0
- data/app/pb_kits/playbook/pb_multi_level_select/docs/example.yml +2 -0
- data/app/pb_kits/playbook/pb_multi_level_select/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_multi_level_select/kit.schema.json +190 -0
- data/app/pb_kits/playbook/pb_multi_level_select/multi_level_select.rb +3 -0
- data/app/pb_kits/playbook/pb_multi_level_select/multi_level_select.test.jsx +27 -0
- data/app/pb_kits/playbook/pb_multiple_users/kit.schema.json +67 -0
- data/app/pb_kits/playbook/pb_multiple_users_stacked/kit.schema.json +55 -0
- data/app/pb_kits/playbook/pb_nav/kit.schema.json +104 -0
- data/app/pb_kits/playbook/pb_online_status/kit.schema.json +62 -0
- data/app/pb_kits/playbook/pb_overlay/kit.schema.json +99 -0
- data/app/pb_kits/playbook/pb_pagination/kit.schema.json +56 -0
- data/app/pb_kits/playbook/pb_passphrase/kit.schema.json +94 -0
- data/app/pb_kits/playbook/pb_pb_bar_graph/kit.schema.json +29 -0
- data/app/pb_kits/playbook/pb_pb_circle_chart/kit.schema.json +29 -0
- data/app/pb_kits/playbook/pb_pb_gauge_chart/kit.schema.json +29 -0
- data/app/pb_kits/playbook/pb_pb_line_graph/kit.schema.json +29 -0
- data/app/pb_kits/playbook/pb_person/kit.schema.json +36 -0
- data/app/pb_kits/playbook/pb_person_contact/kit.schema.json +43 -0
- data/app/pb_kits/playbook/pb_phone_number_input/kit.schema.json +157 -0
- data/app/pb_kits/playbook/pb_pill/kit.schema.json +57 -0
- data/app/pb_kits/playbook/pb_popover/kit.schema.json +82 -0
- data/app/pb_kits/playbook/pb_progress_pills/kit.schema.json +60 -0
- data/app/pb_kits/playbook/pb_progress_simple/kit.schema.json +78 -0
- data/app/pb_kits/playbook/pb_progress_step/kit.schema.json +74 -0
- data/app/pb_kits/playbook/pb_radio/kit.schema.json +104 -0
- data/app/pb_kits/playbook/pb_rich_text_editor/kit.schema.json +151 -0
- data/app/pb_kits/playbook/pb_section_separator/kit.schema.json +77 -0
- data/app/pb_kits/playbook/pb_select/docs/_select_attributes.html.erb +1 -0
- data/app/pb_kits/playbook/pb_select/docs/_select_blank.html.erb +1 -0
- data/app/pb_kits/playbook/pb_select/docs/_select_custom_select.html.erb +1 -1
- data/app/pb_kits/playbook/pb_select/docs/_select_custom_select_subheaders.html.erb +1 -1
- data/app/pb_kits/playbook/pb_select/docs/_select_default.html.erb +1 -0
- data/app/pb_kits/playbook/pb_select/docs/_select_disabled.html.erb +1 -0
- data/app/pb_kits/playbook/pb_select/docs/_select_disabled_options.html.erb +1 -0
- data/app/pb_kits/playbook/pb_select/docs/_select_error.html.erb +1 -0
- data/app/pb_kits/playbook/pb_select/docs/_select_inline.html.erb +1 -0
- data/app/pb_kits/playbook/pb_select/docs/_select_inline_compact.html.erb +1 -0
- data/app/pb_kits/playbook/pb_select/docs/_select_inline_show_arrow.html.erb +1 -0
- data/app/pb_kits/playbook/pb_select/docs/_select_multiple.html.erb +1 -0
- data/app/pb_kits/playbook/pb_select/docs/_select_required.html.erb +1 -0
- data/app/pb_kits/playbook/pb_select/docs/_select_required_indicator.html.erb +1 -0
- data/app/pb_kits/playbook/pb_select/docs/_select_value_text_same.html.erb +1 -0
- data/app/pb_kits/playbook/pb_select/kit.schema.json +157 -0
- data/app/pb_kits/playbook/pb_select/select.html.erb +5 -5
- data/app/pb_kits/playbook/pb_select/select.rb +12 -0
- data/app/pb_kits/playbook/pb_selectable_card/_selectable_card.scss +39 -0
- data/app/pb_kits/playbook/pb_selectable_card/kit.schema.json +116 -0
- data/app/pb_kits/playbook/pb_selectable_card_icon/kit.schema.json +116 -0
- data/app/pb_kits/playbook/pb_selectable_icon/kit.schema.json +103 -0
- data/app/pb_kits/playbook/pb_selectable_list/_selectable_list.scss +19 -1
- data/app/pb_kits/playbook/pb_selectable_list/kit.schema.json +54 -0
- data/app/pb_kits/playbook/pb_skeleton_loading/kit.schema.json +42 -0
- data/app/pb_kits/playbook/pb_source/kit.schema.json +61 -0
- data/app/pb_kits/playbook/pb_star_rating/kit.schema.json +152 -0
- data/app/pb_kits/playbook/pb_stat_change/kit.schema.json +49 -0
- data/app/pb_kits/playbook/pb_stat_value/kit.schema.json +42 -0
- data/app/pb_kits/playbook/pb_table/docs/_sections.yml +1 -0
- data/app/pb_kits/playbook/pb_table/docs/_table_with_filter_variant_external_filter_rails.html.erb +45 -0
- data/app/pb_kits/playbook/pb_table/docs/_table_with_filter_variant_external_filter_rails.md +39 -0
- data/app/pb_kits/playbook/pb_table/docs/_table_with_filter_variant_rails.md +2 -1
- data/app/pb_kits/playbook/pb_table/docs/example.yml +1 -0
- data/app/pb_kits/playbook/pb_table/kit.schema.json +238 -0
- data/app/pb_kits/playbook/pb_table/table.html.erb +5 -2
- data/app/pb_kits/playbook/pb_table/table.rb +4 -0
- data/app/pb_kits/playbook/pb_text_input/kit.schema.json +155 -0
- data/app/pb_kits/playbook/pb_textarea/kit.schema.json +163 -0
- data/app/pb_kits/playbook/pb_time/kit.schema.json +96 -0
- data/app/pb_kits/playbook/pb_time_picker/kit.schema.json +143 -0
- data/app/pb_kits/playbook/pb_time_range_inline/kit.schema.json +77 -0
- data/app/pb_kits/playbook/pb_time_stacked/kit.schema.json +60 -0
- data/app/pb_kits/playbook/pb_timeline/kit.schema.json +57 -0
- data/app/pb_kits/playbook/pb_timestamp/kit.schema.json +126 -0
- data/app/pb_kits/playbook/pb_title/kit.schema.json +106 -0
- data/app/pb_kits/playbook/pb_title_count/kit.schema.json +61 -0
- data/app/pb_kits/playbook/pb_title_detail/kit.schema.json +49 -0
- data/app/pb_kits/playbook/pb_toggle/kit.schema.json +76 -0
- data/app/pb_kits/playbook/pb_tooltip/kit.schema.json +110 -0
- data/app/pb_kits/playbook/pb_typeahead/_typeahead.tsx +4 -4
- data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_createable.html.erb +29 -0
- data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_createable.md +1 -0
- data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_highlight.jsx +20 -8
- data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_highlight.md +3 -0
- data/app/pb_kits/playbook/pb_typeahead/docs/example.yml +1 -0
- data/app/pb_kits/playbook/pb_typeahead/kit.schema.json +281 -0
- data/app/pb_kits/playbook/pb_typeahead/typeahead.rb +4 -1
- data/app/pb_kits/playbook/pb_user/kit.schema.json +147 -0
- data/app/pb_kits/playbook/pb_user_badge/kit.schema.json +47 -0
- data/app/pb_kits/playbook/pb_weekday_stacked/kit.schema.json +63 -0
- data/app/pb_kits/playbook/utilities/_hover.scss +6 -3
- data/app/pb_kits/playbook/utilities/global-props.schema.json +759 -0
- data/dist/chunks/{_pb_line_graph-DHY2Tea7.js → _pb_line_graph-D7f-RfJJ.js} +1 -1
- data/dist/chunks/_typeahead-DO5eU-VL.js +1 -0
- data/dist/chunks/{globalProps-C893Xh66.js → globalProps-BwwZkfTI.js} +1 -1
- data/dist/chunks/lib-Ch18RlJa.js +29 -0
- data/dist/chunks/vendor.js +4 -4
- data/dist/menu.yml +77 -39
- 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/align_content.rb +17 -28
- data/lib/playbook/align_items.rb +17 -28
- data/lib/playbook/align_self.rb +17 -28
- data/lib/playbook/border_radius.rb +7 -10
- data/lib/playbook/bottom.rb +8 -12
- data/lib/playbook/classnames.rb +65 -49
- data/lib/playbook/cursor.rb +7 -10
- data/lib/playbook/display.rb +16 -22
- data/lib/playbook/flex.rb +17 -28
- data/lib/playbook/flex_direction.rb +17 -28
- data/lib/playbook/flex_grow.rb +17 -28
- data/lib/playbook/flex_shrink.rb +17 -28
- data/lib/playbook/flex_wrap.rb +17 -28
- data/lib/playbook/forms/builder/collection_select_field.rb +1 -0
- data/lib/playbook/forms/builder/date_picker_field.rb +1 -0
- data/lib/playbook/forms/builder/select_field.rb +1 -0
- data/lib/playbook/forms/builder/time_zone_select_field.rb +1 -0
- data/lib/playbook/height.rb +7 -10
- data/lib/playbook/hover.rb +31 -27
- data/lib/playbook/justify_content.rb +17 -28
- data/lib/playbook/justify_self.rb +17 -28
- data/lib/playbook/kit_base.rb +33 -16
- data/lib/playbook/left.rb +8 -12
- data/lib/playbook/line_height.rb +7 -10
- data/lib/playbook/max_height.rb +7 -10
- data/lib/playbook/min_height.rb +7 -10
- data/lib/playbook/number_spacing.rb +7 -10
- data/lib/playbook/order.rb +17 -28
- data/lib/playbook/overflow.rb +13 -12
- data/lib/playbook/pb_forms_helper.rb +17 -2
- data/lib/playbook/position.rb +7 -12
- data/lib/playbook/props.rb +24 -5
- data/lib/playbook/right.rb +8 -12
- data/lib/playbook/shadow.rb +7 -10
- data/lib/playbook/spacing.rb +100 -128
- data/lib/playbook/text_align.rb +17 -28
- data/lib/playbook/top.rb +8 -12
- data/lib/playbook/truncate.rb +7 -10
- data/lib/playbook/version.rb +2 -2
- data/lib/playbook/vertical_align.rb +17 -28
- data/lib/playbook/z_index.rb +17 -26
- metadata +135 -9
- data/app/pb_kits/playbook/pb_button/docs/_button_full_width.md +0 -1
- data/app/pb_kits/playbook/utilities/globalPropNames.mjs +0 -58
- data/dist/chunks/_typeahead-CpQ_F870.js +0 -1
- data/dist/chunks/lib-9kTaI6nm.js +0 -29
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 020a93f89c099ec899d7d2fff17521fa6bf88974f7db82daf7856f3279037ca4
|
|
4
|
+
data.tar.gz: 5358edd4c8d27cd5bef021ec3ab2b58e6267e62ed8108c63a040c125e2318901
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 2d2df0c132670c39ed3fbadbdb094d9025898feb06ec70e6bfe52543cf4af9cb2252d6c1b08e8f644b0a2c601a4e16d72ed76b2d65959a1fba1e116738ef0d18
|
|
7
|
+
data.tar.gz: 0c618f6b2afbe7fbb521d8413fa171925791690ecaf5121f1566c953ca075710f3e3e03a3e7ed122a8ac29b48db11fe2c281fb9d2036d1bd3e91f7b74e745836
|
|
@@ -33,7 +33,8 @@ export const AdvancedTableProvider = ({ children, ...props }: {
|
|
|
33
33
|
|
|
34
34
|
const measureHeights = useCallback(() => {
|
|
35
35
|
if (headerRef.current) {
|
|
36
|
-
const
|
|
36
|
+
const headerElement = headerRef.current as HTMLElement;
|
|
37
|
+
const headerRect = headerElement.getBoundingClientRect();
|
|
37
38
|
if (headerRect.height > 0) {
|
|
38
39
|
setHeaderHeight(headerRect.height);
|
|
39
40
|
}
|
|
@@ -67,9 +68,11 @@ export const AdvancedTableProvider = ({ children, ...props }: {
|
|
|
67
68
|
};
|
|
68
69
|
}, [measureHeights]);
|
|
69
70
|
|
|
71
|
+
const headerGroupCount = table?.getHeaderGroups()?.length ?? 0;
|
|
72
|
+
|
|
70
73
|
useEffect(() => {
|
|
71
74
|
measureHeights();
|
|
72
|
-
}, [table?.getRowModel().rows.length, measureHeights]);
|
|
75
|
+
}, [table?.getRowModel().rows.length, headerGroupCount, measureHeights]);
|
|
73
76
|
|
|
74
77
|
|
|
75
78
|
// Create a flattened data array that includes ALL components for virtualization
|
|
@@ -64,14 +64,12 @@ export const TableHeader = ({
|
|
|
64
64
|
);
|
|
65
65
|
|
|
66
66
|
const renderRegularTableHeader = () => (
|
|
67
|
-
<thead className={classes}
|
|
67
|
+
<thead className={classes}
|
|
68
68
|
id={id}
|
|
69
|
+
ref={headerRef}
|
|
69
70
|
>
|
|
70
|
-
{table.getHeaderGroups().map((headerGroup: HeaderGroup<GenericObject
|
|
71
|
-
<tr
|
|
72
|
-
key={`${headerGroup.id}-headerGroup`}
|
|
73
|
-
ref={index === 0 ? headerRef : null}
|
|
74
|
-
>
|
|
71
|
+
{table.getHeaderGroups().map((headerGroup: HeaderGroup<GenericObject>) => (
|
|
72
|
+
<tr key={`${headerGroup.id}-headerGroup`}>
|
|
75
73
|
{!hasAnySubRows && selectableRows && (
|
|
76
74
|
<th className={customCellClassnames}>
|
|
77
75
|
<Checkbox
|
|
@@ -105,16 +103,16 @@ export const TableHeader = ({
|
|
|
105
103
|
);
|
|
106
104
|
|
|
107
105
|
const renderVirtualizedTableHeader = () => (
|
|
108
|
-
<thead
|
|
109
|
-
className={classes}
|
|
106
|
+
<thead
|
|
107
|
+
className={classes}
|
|
110
108
|
data-virtualized="true"
|
|
111
109
|
id={id}
|
|
110
|
+
ref={headerRef}
|
|
112
111
|
>
|
|
113
|
-
{table.getHeaderGroups().map((headerGroup: HeaderGroup<GenericObject
|
|
114
|
-
<tr
|
|
112
|
+
{table.getHeaderGroups().map((headerGroup: HeaderGroup<GenericObject>) => (
|
|
113
|
+
<tr
|
|
115
114
|
className="virtualized-header-row-header"
|
|
116
115
|
key={`${headerGroup.id}-headerGroup-virtualized`}
|
|
117
|
-
ref={index === 0 ? headerRef : null}
|
|
118
116
|
>
|
|
119
117
|
{!hasAnySubRows && selectableRows && (
|
|
120
118
|
<th className={classnames(customCellClassnames, "virtualized-header-cell")}>
|
|
@@ -63,6 +63,51 @@
|
|
|
63
63
|
width: 100%;
|
|
64
64
|
}
|
|
65
65
|
|
|
66
|
+
// Override pb_table endcap: first and last column use same padding as rest of row
|
|
67
|
+
// First column
|
|
68
|
+
.pb_table.table-sm tbody tr td:first-child,
|
|
69
|
+
.pb_table.table-sm tbody tr .pb_table_td:first-child,
|
|
70
|
+
.pb_table.table-sm tbody .pb_table_tr td:first-child,
|
|
71
|
+
.pb_table.table-sm tbody .pb_table_tr .pb_table_td:first-child,
|
|
72
|
+
.pb_table.table-sm .pb_table_tbody tr td:first-child,
|
|
73
|
+
.pb_table.table-sm .pb_table_tbody tr .pb_table_td:first-child,
|
|
74
|
+
.pb_table.table-sm .pb_table_tbody .pb_table_tr td:first-child,
|
|
75
|
+
.pb_table.table-sm .pb_table_tbody .pb_table_tr .pb_table_td:first-child {
|
|
76
|
+
padding-left: $space-xs;
|
|
77
|
+
}
|
|
78
|
+
.pb_table.table-md tbody tr td:first-child,
|
|
79
|
+
.pb_table.table-md tbody tr .pb_table_td:first-child,
|
|
80
|
+
.pb_table.table-md tbody .pb_table_tr td:first-child,
|
|
81
|
+
.pb_table.table-md tbody .pb_table_tr .pb_table_td:first-child,
|
|
82
|
+
.pb_table.table-md .pb_table_tbody tr td:first-child,
|
|
83
|
+
.pb_table.table-md .pb_table_tbody tr .pb_table_td:first-child,
|
|
84
|
+
.pb_table.table-md .pb_table_tbody .pb_table_tr td:first-child,
|
|
85
|
+
.pb_table.table-md .pb_table_tbody .pb_table_tr .pb_table_td:first-child {
|
|
86
|
+
padding-left: $space-sm;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Last column
|
|
90
|
+
.pb_table.table-sm tbody tr td:last-child,
|
|
91
|
+
.pb_table.table-sm tbody tr .pb_table_td:last-child,
|
|
92
|
+
.pb_table.table-sm tbody .pb_table_tr td:last-child,
|
|
93
|
+
.pb_table.table-sm tbody .pb_table_tr .pb_table_td:last-child,
|
|
94
|
+
.pb_table.table-sm .pb_table_tbody tr td:last-child,
|
|
95
|
+
.pb_table.table-sm .pb_table_tbody tr .pb_table_td:last-child,
|
|
96
|
+
.pb_table.table-sm .pb_table_tbody .pb_table_tr td:last-child,
|
|
97
|
+
.pb_table.table-sm .pb_table_tbody .pb_table_tr .pb_table_td:last-child {
|
|
98
|
+
padding-right: $space-xs;
|
|
99
|
+
}
|
|
100
|
+
.pb_table.table-md tbody tr td:last-child,
|
|
101
|
+
.pb_table.table-md tbody tr .pb_table_td:last-child,
|
|
102
|
+
.pb_table.table-md tbody .pb_table_tr td:last-child,
|
|
103
|
+
.pb_table.table-md tbody .pb_table_tr .pb_table_td:last-child,
|
|
104
|
+
.pb_table.table-md .pb_table_tbody tr td:last-child,
|
|
105
|
+
.pb_table.table-md .pb_table_tbody tr .pb_table_td:last-child,
|
|
106
|
+
.pb_table.table-md .pb_table_tbody .pb_table_tr td:last-child,
|
|
107
|
+
.pb_table.table-md .pb_table_tbody .pb_table_tr .pb_table_td:last-child {
|
|
108
|
+
padding-right: $space-sm;
|
|
109
|
+
}
|
|
110
|
+
|
|
66
111
|
// Virtualized Table and Rows for Infinite Scroll
|
|
67
112
|
scrollbar-gutter: stable right-edges;
|
|
68
113
|
.virtualized-header-row-header {
|
|
@@ -629,12 +674,18 @@
|
|
|
629
674
|
@each $color_name, $color_value in $border_color_options {
|
|
630
675
|
&.column-group-border-#{$color_name} {
|
|
631
676
|
@if $theme == "light" {
|
|
677
|
+
&:not(.advanced-table-no-table-container) {
|
|
678
|
+
@include advanced-table-sticky-wrapper-frame($color_value);
|
|
679
|
+
}
|
|
632
680
|
@include advanced-table-sticky-mixin(
|
|
633
681
|
$color_value,
|
|
634
682
|
$white,
|
|
635
683
|
lighten($silver, $opacity_7)
|
|
636
684
|
);
|
|
637
685
|
} @else if $theme == "dark" {
|
|
686
|
+
&:not(.advanced-table-no-table-container) {
|
|
687
|
+
@include advanced-table-sticky-wrapper-frame($color_value);
|
|
688
|
+
}
|
|
638
689
|
@include advanced-table-sticky-mixin(
|
|
639
690
|
$color_value,
|
|
640
691
|
$bg_dark_card,
|
|
@@ -670,6 +721,10 @@
|
|
|
670
721
|
width: 100%;
|
|
671
722
|
@include scrollbar-styling;
|
|
672
723
|
|
|
724
|
+
&:not(.advanced-table-no-table-container) {
|
|
725
|
+
@include advanced-table-sticky-wrapper-frame($border_light);
|
|
726
|
+
}
|
|
727
|
+
|
|
673
728
|
// These are the responsive borders that should NOT inherit the custom color
|
|
674
729
|
@include advanced-table-sticky-mixin(
|
|
675
730
|
$border_light,
|
|
@@ -720,7 +775,7 @@
|
|
|
720
775
|
}
|
|
721
776
|
}
|
|
722
777
|
|
|
723
|
-
// Row Pinning -
|
|
778
|
+
// Row Pinning - React uses inline style; Rails passes same style via html_options from table_body
|
|
724
779
|
.pinned-row {
|
|
725
780
|
box-shadow: 0 4px 10px 0 rgba($shadow, 0.16) !important;
|
|
726
781
|
}
|
|
@@ -963,6 +1018,11 @@
|
|
|
963
1018
|
.sticky-left {
|
|
964
1019
|
background-color: $bg_dark;
|
|
965
1020
|
}
|
|
1021
|
+
|
|
1022
|
+
&:not(.advanced-table-no-table-container) {
|
|
1023
|
+
@include advanced-table-sticky-wrapper-frame($border_dark);
|
|
1024
|
+
}
|
|
1025
|
+
|
|
966
1026
|
@include advanced-table-sticky-mixin(
|
|
967
1027
|
$border_dark,
|
|
968
1028
|
$bg_dark_card,
|
|
@@ -981,6 +1041,10 @@
|
|
|
981
1041
|
}
|
|
982
1042
|
}
|
|
983
1043
|
|
|
1044
|
+
&:not(.advanced-table-no-table-container) {
|
|
1045
|
+
@include advanced-table-sticky-wrapper-frame($border_dark);
|
|
1046
|
+
}
|
|
1047
|
+
|
|
984
1048
|
// These are the responsive borders that should NOT inherit the custom color
|
|
985
1049
|
@include advanced-table-sticky-mixin(
|
|
986
1050
|
$border_dark,
|
|
@@ -127,6 +127,8 @@ const AdvancedTable = (props: AdvancedTableProps) => {
|
|
|
127
127
|
fullScreenControl,
|
|
128
128
|
} = props;
|
|
129
129
|
|
|
130
|
+
const noTableCardContainer = tableProps?.container === false;
|
|
131
|
+
|
|
130
132
|
// Component refs
|
|
131
133
|
const tableWrapperRef = useRef<HTMLDivElement>(null);
|
|
132
134
|
|
|
@@ -281,6 +283,7 @@ const AdvancedTable = (props: AdvancedTableProps) => {
|
|
|
281
283
|
'hidden-action-bar': (selectableRows || columnVisibilityControl) && !isActionBarVisible,
|
|
282
284
|
},
|
|
283
285
|
{'advanced-table-sticky-left-columns': stickyLeftColumn && stickyLeftColumn.length > 0},
|
|
286
|
+
{ 'advanced-table-no-table-container': noTableCardContainer },
|
|
284
287
|
columnGroupBorderColor ? `column-group-border-${columnGroupBorderColor}` : '',
|
|
285
288
|
scrollBarNone ? 'advanced-table-hide-scrollbar' : '',
|
|
286
289
|
globalProps(props),
|
|
@@ -7,12 +7,12 @@
|
|
|
7
7
|
}) %>
|
|
8
8
|
<% end %>
|
|
9
9
|
|
|
10
|
-
<%= pb_rails("table", props: { size: "sm", data_table: true, number_spacing:"tabular", responsive:"none", dark: dark, classname: object.loading ? "content-loading" : "" }.merge(object.table_props)) do %>
|
|
10
|
+
<%= pb_rails("table", props: { size: "sm", data_table: true, number_spacing:"tabular", responsive:"none", dark: dark, classname: object.loading ? "content-loading" : "" }.merge(object.table_props || {})) do %>
|
|
11
11
|
<% if content.present? %>
|
|
12
12
|
<% content.presence %>
|
|
13
13
|
<% else %>
|
|
14
14
|
<%= pb_rails("advanced_table/table_header", props: { table_id: object.id, column_definitions: object.column_definitions, enable_toggle_expansion: object.enable_toggle_expansion, responsive: object.responsive, loading: object.loading, selectable_rows: object.selectable_rows, show_actions_bar: object.show_actions_bar, inline_row_loading: object.inline_row_loading, persist_toggle_expansion_button: object.persist_toggle_expansion_button, table_data: object.table_data }) %>
|
|
15
|
-
<%= pb_rails("advanced_table/table_body", props: { table_id: object.id, table_data: object.table_data, column_definitions: object.column_definitions, responsive: object.responsive, loading: object.loading, selectable_rows: object.selectable_rows, enable_toggle_expansion: object.enable_toggle_expansion, row_styling: object.row_styling, inline_row_loading: object.inline_row_loading }) %>
|
|
15
|
+
<%= pb_rails("advanced_table/table_body", props: { table_id: object.id, table_data: object.table_data, column_definitions: object.column_definitions, responsive: object.responsive, loading: object.loading, selectable_rows: object.selectable_rows, enable_toggle_expansion: object.enable_toggle_expansion, row_styling: object.row_styling, inline_row_loading: object.inline_row_loading, pinned_rows: object.pinned_rows }) %>
|
|
16
16
|
<% end %>
|
|
17
17
|
<% end %>
|
|
18
18
|
<% end %>
|
|
@@ -37,6 +37,8 @@ module Playbook
|
|
|
37
37
|
default: false
|
|
38
38
|
prop :persist_toggle_expansion_button, type: Playbook::Props::Boolean,
|
|
39
39
|
default: false
|
|
40
|
+
prop :pinned_rows, type: Playbook::Props::HashProp,
|
|
41
|
+
default: {}
|
|
40
42
|
|
|
41
43
|
def classname
|
|
42
44
|
additional_classes = [
|
|
@@ -46,9 +48,16 @@ module Playbook
|
|
|
46
48
|
hidden_action_bar_class,
|
|
47
49
|
]
|
|
48
50
|
additional_classes << "column-group-border-#{column_group_border_color}" if column_group_border_color != "none"
|
|
51
|
+
additional_classes << "advanced-table-no-table-container" if no_table_card_container?
|
|
49
52
|
generate_classname("pb_advanced_table", *additional_classes, separator: " ")
|
|
50
53
|
end
|
|
51
54
|
|
|
55
|
+
def no_table_card_container?
|
|
56
|
+
return false unless table_props.is_a?(Hash)
|
|
57
|
+
|
|
58
|
+
table_props[:container] == false || table_props["container"] == false
|
|
59
|
+
end
|
|
60
|
+
|
|
52
61
|
def responsive_classname
|
|
53
62
|
responsive == "scroll" ? "advanced-table-responsive-scroll" : "advanced-table-responsive-none"
|
|
54
63
|
end
|
data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_grouped_headers_composition.jsx
ADDED
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
/* eslint-disable react/no-multi-comp, react/prop-types */
|
|
2
|
+
import React, { useCallback, useState } from "react"
|
|
3
|
+
|
|
4
|
+
import AdvancedTable from "../_advanced_table"
|
|
5
|
+
import Flex from "../../pb_flex/_flex"
|
|
6
|
+
import Icon from "../../pb_icon/_icon"
|
|
7
|
+
import List from "../../pb_list/_list"
|
|
8
|
+
import ListItem from "../../pb_list/_list_item"
|
|
9
|
+
import PbReactPopover from "../../pb_popover/_popover"
|
|
10
|
+
import SectionSeparator from "../../pb_section_separator/_section_separator"
|
|
11
|
+
import StarRating from "../../pb_star_rating/_star_rating"
|
|
12
|
+
import COMPOSITION_MOCK_DATA from "./advanced_table_grouped_headers_composition_mock_data.json"
|
|
13
|
+
|
|
14
|
+
const LEAF_COUNT = "newEnrollments"
|
|
15
|
+
const LEAF_SCHEDULED = "scheduledMeetings"
|
|
16
|
+
|
|
17
|
+
const ICON_UNSORTED = "arrow-up-arrow-down"
|
|
18
|
+
const iconSorted = (desc) => (desc ? "arrow-up-wide-short" : "arrow-down-short-wide")
|
|
19
|
+
|
|
20
|
+
const STAR_MENU = [
|
|
21
|
+
{ id: LEAF_COUNT, label: "Count" },
|
|
22
|
+
{ id: LEAF_SCHEDULED, label: "Scheduled" },
|
|
23
|
+
]
|
|
24
|
+
|
|
25
|
+
const MENU_BTN = {
|
|
26
|
+
alignItems: "center",
|
|
27
|
+
background: "transparent",
|
|
28
|
+
border: "none",
|
|
29
|
+
cursor: "pointer",
|
|
30
|
+
display: "flex",
|
|
31
|
+
font: "inherit",
|
|
32
|
+
gap: 12,
|
|
33
|
+
justifyContent: "space-between",
|
|
34
|
+
padding: "8px 14px",
|
|
35
|
+
textAlign: "left",
|
|
36
|
+
width: "100%",
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const labelStyle = (active) => ({
|
|
40
|
+
color: active ? "#0056cf" : "#242930",
|
|
41
|
+
flex: 1,
|
|
42
|
+
fontSize: 14,
|
|
43
|
+
fontWeight: active ? 600 : 400,
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
/** Hooks + popover; `header` callback cannot use hooks directly. */
|
|
47
|
+
const StarMetricGroupHeader = ({ table }) => {
|
|
48
|
+
const [open, setOpen] = useState(false)
|
|
49
|
+
const menuId = "playbook-star-metric-sort-menu"
|
|
50
|
+
|
|
51
|
+
const sort0 = table.getState().sorting[0]
|
|
52
|
+
const groupActive =
|
|
53
|
+
sort0?.id === LEAF_COUNT || sort0?.id === LEAF_SCHEDULED
|
|
54
|
+
|
|
55
|
+
const close = useCallback((shouldClose) => setOpen(!shouldClose), [])
|
|
56
|
+
const toggle = useCallback((e) => {
|
|
57
|
+
e.stopPropagation()
|
|
58
|
+
setOpen((v) => !v)
|
|
59
|
+
}, [])
|
|
60
|
+
|
|
61
|
+
const applySort = useCallback(
|
|
62
|
+
(columnId, e) => {
|
|
63
|
+
e.stopPropagation()
|
|
64
|
+
const cur = table.getState().sorting[0]
|
|
65
|
+
const nextDesc = cur?.id === columnId ? !cur.desc : true
|
|
66
|
+
table.setSorting([{ desc: nextDesc, id: columnId }])
|
|
67
|
+
setOpen(false)
|
|
68
|
+
},
|
|
69
|
+
[table]
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
return (
|
|
73
|
+
<PbReactPopover
|
|
74
|
+
closeOnClick="outside"
|
|
75
|
+
offset
|
|
76
|
+
padding="none"
|
|
77
|
+
placement="bottom-start"
|
|
78
|
+
reference={
|
|
79
|
+
<button
|
|
80
|
+
aria-controls={menuId}
|
|
81
|
+
aria-expanded={open}
|
|
82
|
+
aria-haspopup="menu"
|
|
83
|
+
aria-label="Sort by Count or Scheduled"
|
|
84
|
+
onClick={toggle}
|
|
85
|
+
style={{
|
|
86
|
+
background: open ? "rgba(115, 134, 169, 0.14)" : "transparent",
|
|
87
|
+
border: "none",
|
|
88
|
+
borderRadius: 6,
|
|
89
|
+
cursor: "pointer",
|
|
90
|
+
font: "inherit",
|
|
91
|
+
margin: 0,
|
|
92
|
+
padding: "2px 4px",
|
|
93
|
+
}}
|
|
94
|
+
title="Open menu to sort by Count or Scheduled"
|
|
95
|
+
type="button"
|
|
96
|
+
>
|
|
97
|
+
<Flex alignItems="center"
|
|
98
|
+
gap="xs"
|
|
99
|
+
justifyContent="center"
|
|
100
|
+
>
|
|
101
|
+
<StarRating
|
|
102
|
+
backgroundType="outline"
|
|
103
|
+
colorOption="primary"
|
|
104
|
+
justifyContent="center"
|
|
105
|
+
maxWidth="102px"
|
|
106
|
+
rating={5}
|
|
107
|
+
/>
|
|
108
|
+
<Icon
|
|
109
|
+
color={groupActive ? "primary" : "default"}
|
|
110
|
+
fixedWidth
|
|
111
|
+
icon={
|
|
112
|
+
groupActive
|
|
113
|
+
? iconSorted(Boolean(sort0?.desc))
|
|
114
|
+
: ICON_UNSORTED
|
|
115
|
+
}
|
|
116
|
+
size="md"
|
|
117
|
+
/>
|
|
118
|
+
</Flex>
|
|
119
|
+
</button>
|
|
120
|
+
}
|
|
121
|
+
shouldClosePopover={close}
|
|
122
|
+
show={open}
|
|
123
|
+
zIndex={1200}
|
|
124
|
+
>
|
|
125
|
+
<Flex id={menuId}
|
|
126
|
+
minWidth="220px"
|
|
127
|
+
orientation="column"
|
|
128
|
+
>
|
|
129
|
+
<List borderless
|
|
130
|
+
padding="none"
|
|
131
|
+
>
|
|
132
|
+
{STAR_MENU.map(({ id, label }, i) => {
|
|
133
|
+
const active = sort0?.id === id
|
|
134
|
+
return (
|
|
135
|
+
<React.Fragment key={id}>
|
|
136
|
+
{i > 0 ? <SectionSeparator margin="none" /> : null}
|
|
137
|
+
<ListItem padding="none">
|
|
138
|
+
<button
|
|
139
|
+
onClick={(e) => applySort(id, e)}
|
|
140
|
+
style={MENU_BTN}
|
|
141
|
+
type="button"
|
|
142
|
+
>
|
|
143
|
+
<span style={labelStyle(active)}>{label}</span>
|
|
144
|
+
<Icon
|
|
145
|
+
color={active ? "primary" : "default"}
|
|
146
|
+
fixedWidth
|
|
147
|
+
icon={
|
|
148
|
+
active
|
|
149
|
+
? iconSorted(Boolean(sort0?.desc))
|
|
150
|
+
: ICON_UNSORTED
|
|
151
|
+
}
|
|
152
|
+
size="md"
|
|
153
|
+
/>
|
|
154
|
+
</button>
|
|
155
|
+
</ListItem>
|
|
156
|
+
</React.Fragment>
|
|
157
|
+
)
|
|
158
|
+
})}
|
|
159
|
+
</List>
|
|
160
|
+
</Flex>
|
|
161
|
+
</PbReactPopover>
|
|
162
|
+
)
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
const AdvancedTableGroupedHeadersComposition = (props) => {
|
|
166
|
+
const [pinnedRows, setPinnedRows] = useState({ top: ["12"] })
|
|
167
|
+
|
|
168
|
+
const columnDefinitions = [
|
|
169
|
+
{
|
|
170
|
+
accessor: "year",
|
|
171
|
+
cellAccessors: ["quarter", "month", "day"],
|
|
172
|
+
label: "Year",
|
|
173
|
+
},
|
|
174
|
+
{
|
|
175
|
+
columns: [
|
|
176
|
+
{
|
|
177
|
+
columns: [
|
|
178
|
+
{
|
|
179
|
+
accessor: "newEnrollments",
|
|
180
|
+
enableSort: true,
|
|
181
|
+
id: LEAF_COUNT,
|
|
182
|
+
label: "Count",
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
accessor: "scheduledMeetings",
|
|
186
|
+
enableSort: true,
|
|
187
|
+
id: LEAF_SCHEDULED,
|
|
188
|
+
label: "Scheduled",
|
|
189
|
+
},
|
|
190
|
+
],
|
|
191
|
+
id: "starLeafPair",
|
|
192
|
+
label: "Metrics",
|
|
193
|
+
},
|
|
194
|
+
],
|
|
195
|
+
header: ({ table }) => (
|
|
196
|
+
<Flex justify="center">
|
|
197
|
+
<StarMetricGroupHeader table={table} />
|
|
198
|
+
</Flex>
|
|
199
|
+
),
|
|
200
|
+
id: "starMetricGroup",
|
|
201
|
+
label: "Rating group (custom header)",
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
columns: [
|
|
205
|
+
{ accessor: "attendanceRate", label: "Attendance" },
|
|
206
|
+
{
|
|
207
|
+
accessor: "classCompletionRate",
|
|
208
|
+
enableSort: true,
|
|
209
|
+
id: "classCompletionRate",
|
|
210
|
+
label: "Completion %",
|
|
211
|
+
},
|
|
212
|
+
],
|
|
213
|
+
label: "Performance",
|
|
214
|
+
},
|
|
215
|
+
]
|
|
216
|
+
|
|
217
|
+
return (
|
|
218
|
+
<div>
|
|
219
|
+
<AdvancedTable
|
|
220
|
+
columnDefinitions={columnDefinitions}
|
|
221
|
+
enableSortingRemoval
|
|
222
|
+
maxHeight="md"
|
|
223
|
+
pinnedRows={{ onChange: setPinnedRows, value: pinnedRows }}
|
|
224
|
+
tableData={COMPOSITION_MOCK_DATA}
|
|
225
|
+
tableProps={{ sticky: true }}
|
|
226
|
+
{...props}
|
|
227
|
+
>
|
|
228
|
+
<AdvancedTable.Header enableSorting />
|
|
229
|
+
<AdvancedTable.Body />
|
|
230
|
+
</AdvancedTable>
|
|
231
|
+
</div>
|
|
232
|
+
)
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
export default AdvancedTableGroupedHeadersComposition
|
data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_grouped_headers_composition.md
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
### Grouped headers, custom UI, sort, and pinned rows
|
|
2
|
+
|
|
3
|
+
This example combines patterns that often show up together in product tables:
|
|
4
|
+
|
|
5
|
+
1. **Multi-level headers** — nested `columns` in `columnDefinitions`.
|
|
6
|
+
2. **Custom group header** — a `header` function returning React (here: `StarRating`, sort icon, `PbReactPopover` menu). Parent groups are not sort targets; **only leaf columns** use `enableSort: true` (see **Enable Sort By Column (Multi-Column)**).
|
|
7
|
+
3. **Programmatic sort** — the group `header` receives TanStack’s **`table`**. Call **`table.setSorting([{ id: "<leafColumnId>", desc: boolean }])`** using the same **`id`** values as your leaf columns. Match **direction icons** to the built-in kit (`arrow-up-arrow-down` unsorted; `arrow-up-wide-short` / `arrow-down-short-wide` when sorted).
|
|
8
|
+
4. **Pinned row + sticky header** — `pinnedRows` with row **`id`**s and `tableProps={{ sticky: true }}` (see **Pinned Rows**).
|
|
9
|
+
|
|
10
|
+
**Implementation notes**
|
|
11
|
+
|
|
12
|
+
- **`header` must be a child component** if you need hooks (e.g. popover open state). Render it from `header: ({ table }) => <YourHeader table={table} />`.
|
|
13
|
+
- **Avoid wrapping the primary control in `Tooltip`** — it can steal the first tap/click. Use a **`title`** on the button or copy in the doc instead.
|
|
14
|
+
- **Popover rows:** use a plain **`<button>`** as `reference`, `closeOnClick="outside"`. Picking the **same** metric again should **toggle** `desc`; switching to another leaf column often defaults to **`desc: true`** to align with **`sortDescFirst`**.
|
|
15
|
+
- **Data:** **`advanced_table_grouped_headers_composition_mock_data.json`** — twelve flat rows (2015–2026) with **varied** Count / Scheduled / % values so sorting is obvious; **`id` `"12"`** is **2026** and is pinned by default.
|
|
16
|
+
|
|
17
|
+
Other building blocks on this kit: **Custom Header with Multiple Headers**, **Sticky Header**.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
<%# Example sort method for demonstration purposes %>
|
|
2
|
+
<% if params["sort"] %>
|
|
3
|
+
<% sort_param = params["sort"].gsub(/_(asc|desc)\z/, "") %>
|
|
4
|
+
<% sort_direction = params["sort"].end_with?("_asc") ? 1 : -1 %>
|
|
5
|
+
<% @table_data_with_id.sort! do |a, b|
|
|
6
|
+
value_a = a[sort_param] || a[sort_param.to_sym]
|
|
7
|
+
value_b = b[sort_param] || b[sort_param.to_sym]
|
|
8
|
+
|
|
9
|
+
value_a = value_a.to_i if value_a.is_a?(String) && value_a.match?(/^\d+$/)
|
|
10
|
+
value_b = value_b.to_i if value_b.is_a?(String) && value_b.match?(/^\d+$/)
|
|
11
|
+
|
|
12
|
+
sort_direction * (value_a <=> value_b)
|
|
13
|
+
end %>
|
|
14
|
+
<% end %>
|
|
15
|
+
|
|
16
|
+
<% column_definitions = [
|
|
17
|
+
{
|
|
18
|
+
accessor: "year",
|
|
19
|
+
label: "Year",
|
|
20
|
+
cellAccessors: ["quarter", "month", "day"],
|
|
21
|
+
sort_menu: [
|
|
22
|
+
{ item: "Year", link: "?sort=year_asc#pinned_rows_table", active: params["sort"] == "year_asc", direction: "asc" },
|
|
23
|
+
{ item: "Year", link: "?sort=year_desc#pinned_rows_table", active: params["sort"] == "year_desc", direction: "desc" }
|
|
24
|
+
],
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
accessor: "newEnrollments",
|
|
28
|
+
label: "New Enrollments",
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
accessor: "scheduledMeetings",
|
|
32
|
+
label: "Scheduled Meetings",
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
accessor: "attendanceRate",
|
|
36
|
+
label: "Attendance Rate",
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
accessor: "completedClasses",
|
|
40
|
+
label: "Completed Classes",
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
accessor: "classCompletionRate",
|
|
44
|
+
label: "Class Completion Rate",
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
accessor: "graduatedStudents",
|
|
48
|
+
label: "Graduated Students",
|
|
49
|
+
}
|
|
50
|
+
] %>
|
|
51
|
+
|
|
52
|
+
<% pinned_rows = { top: ["8"] } %>
|
|
53
|
+
|
|
54
|
+
<%= pb_rails("advanced_table", props: { id: "pinned_rows_table", table_data: @table_data_with_id, column_definitions: column_definitions, max_height: "xs", pinned_rows: pinned_rows, responsive: "none", table_props: { sticky: true }}) do %>
|
|
55
|
+
<%= pb_rails("advanced_table/table_header", props: { table_id: "pinned_rows_table", column_definitions: column_definitions }) %>
|
|
56
|
+
<%= pb_rails("advanced_table/table_body", props: { table_id: "pinned_rows_table", table_data: @table_data_with_id, column_definitions: column_definitions, pinned_rows: pinned_rows }) %>
|
|
57
|
+
<% end %>
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
Use the `pinned_rows` prop to pin specific rows to the top of an Advanced Table. Pinned rows will remain at the top when scrolling through table data and will not change position if sorting is used.
|
|
2
|
+
|
|
3
|
+
**NOTE:**
|
|
4
|
+
- Sticky header required: Pinned rows must be used with `sticky: true` via `table_props` (works with both responsive and non-responsive tables)
|
|
5
|
+
- Row ids required: Each object within the `table_data` array must contain a unique `id` in order to attach an id to all Rows for this to function.
|
|
6
|
+
- `pinned_rows` takes a hash with a `top` key containing an array of row ids, as shown in the code snippet below.
|
|
7
|
+
- For expandable rows, use the parent id in `pinned_rows[:top]`; all its children will automatically be pinned with it. If a child id is passed without the parent being pinned, nothing will be pinned.
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
[
|
|
2
|
+
{
|
|
3
|
+
"id": "1",
|
|
4
|
+
"year": "2015",
|
|
5
|
+
"newEnrollments": "12",
|
|
6
|
+
"scheduledMeetings": "40",
|
|
7
|
+
"attendanceRate": "62%",
|
|
8
|
+
"classCompletionRate": "28%"
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"id": "2",
|
|
12
|
+
"year": "2016",
|
|
13
|
+
"newEnrollments": "88",
|
|
14
|
+
"scheduledMeetings": "12",
|
|
15
|
+
"attendanceRate": "71%",
|
|
16
|
+
"classCompletionRate": "55%"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"id": "3",
|
|
20
|
+
"year": "2017",
|
|
21
|
+
"newEnrollments": "34",
|
|
22
|
+
"scheduledMeetings": "67",
|
|
23
|
+
"attendanceRate": "58%",
|
|
24
|
+
"classCompletionRate": "41%"
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"id": "4",
|
|
28
|
+
"year": "2018",
|
|
29
|
+
"newEnrollments": "05",
|
|
30
|
+
"scheduledMeetings": "91",
|
|
31
|
+
"attendanceRate": "44%",
|
|
32
|
+
"classCompletionRate": "73%"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"id": "5",
|
|
36
|
+
"year": "2019",
|
|
37
|
+
"newEnrollments": "61",
|
|
38
|
+
"scheduledMeetings": "19",
|
|
39
|
+
"attendanceRate": "83%",
|
|
40
|
+
"classCompletionRate": "36%"
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"id": "6",
|
|
44
|
+
"year": "2020",
|
|
45
|
+
"newEnrollments": "19",
|
|
46
|
+
"scheduledMeetings": "54",
|
|
47
|
+
"attendanceRate": "67%",
|
|
48
|
+
"classCompletionRate": "62%"
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
"id": "7",
|
|
52
|
+
"year": "2021",
|
|
53
|
+
"newEnrollments": "73",
|
|
54
|
+
"scheduledMeetings": "08",
|
|
55
|
+
"attendanceRate": "52%",
|
|
56
|
+
"classCompletionRate": "49%"
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"id": "8",
|
|
60
|
+
"year": "2022",
|
|
61
|
+
"newEnrollments": "50",
|
|
62
|
+
"scheduledMeetings": "50",
|
|
63
|
+
"attendanceRate": "75%",
|
|
64
|
+
"classCompletionRate": "45%"
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
"id": "9",
|
|
68
|
+
"year": "2023",
|
|
69
|
+
"newEnrollments": "95",
|
|
70
|
+
"scheduledMeetings": "03",
|
|
71
|
+
"attendanceRate": "69%",
|
|
72
|
+
"classCompletionRate": "81%"
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"id": "10",
|
|
76
|
+
"year": "2024",
|
|
77
|
+
"newEnrollments": "27",
|
|
78
|
+
"scheduledMeetings": "76",
|
|
79
|
+
"attendanceRate": "91%",
|
|
80
|
+
"classCompletionRate": "22%"
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
"id": "11",
|
|
84
|
+
"year": "2025",
|
|
85
|
+
"newEnrollments": "41",
|
|
86
|
+
"scheduledMeetings": "33",
|
|
87
|
+
"attendanceRate": "48%",
|
|
88
|
+
"classCompletionRate": "94%"
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
"id": "12",
|
|
92
|
+
"year": "2026",
|
|
93
|
+
"newEnrollments": "66",
|
|
94
|
+
"scheduledMeetings": "66",
|
|
95
|
+
"attendanceRate": "55%",
|
|
96
|
+
"classCompletionRate": "58%"
|
|
97
|
+
}
|
|
98
|
+
]
|