playbook_ui 14.19.0.pre.rc.2 → 14.20.0.pre.alpha.revert4453PBNTR933reactdraggablebugdragbtwnexamples7854
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/_playbook.scss +0 -1
- data/app/pb_kits/playbook/pb_advanced_table/Components/RegularTableView.tsx +11 -1
- data/app/pb_kits/playbook/pb_advanced_table/Components/TableActionBar.tsx +175 -16
- data/app/pb_kits/playbook/pb_advanced_table/Components/TableHeaderCell.tsx +56 -25
- data/app/pb_kits/playbook/pb_advanced_table/Hooks/useTableState.ts +23 -13
- data/app/pb_kits/playbook/pb_advanced_table/Utilities/VisibilityTree.ts +47 -0
- data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +6 -10
- data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.tsx +7 -2
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_beta.md +0 -6
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility.jsx +57 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility.md +4 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_custom.jsx +62 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_custom.md +1 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_multi.jsx +82 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_multi.md +1 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_with_state.jsx +66 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_visibility_with_state.md +3 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_no_subrows_rails.md +5 -1
- data/app/pb_kits/playbook/pb_advanced_table/docs/{_advanced_table_selectable_rows_no_subrows.jsx → _advanced_table_selectable_rows_no_subrows_react.jsx} +2 -2
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_selectable_rows_rails.md +3 -2
- data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +7 -3
- data/app/pb_kits/playbook/pb_advanced_table/docs/index.js +6 -2
- data/app/pb_kits/playbook/pb_advanced_table/flat_advanced_table.js +106 -0
- data/app/pb_kits/playbook/pb_advanced_table/index.js +228 -11
- data/app/pb_kits/playbook/pb_advanced_table/scss_partials/advanced_table_sticky_mixin.scss +1 -0
- data/app/pb_kits/playbook/pb_advanced_table/table_body.rb +9 -1
- data/app/pb_kits/playbook/pb_advanced_table/table_header.rb +0 -3
- data/app/pb_kits/playbook/pb_advanced_table/table_row.rb +1 -2
- data/app/pb_kits/playbook/pb_avatar/_avatar.scss +4 -0
- data/app/pb_kits/playbook/pb_avatar/_avatar.tsx +3 -0
- data/app/pb_kits/playbook/pb_avatar/avatar.html.erb +3 -3
- data/app/pb_kits/playbook/pb_avatar/avatar.rb +2 -0
- data/app/pb_kits/playbook/pb_avatar/avatar.test.js +18 -0
- data/app/pb_kits/playbook/pb_avatar/docs/_avatar_grayscale.html.erb +5 -0
- data/app/pb_kits/playbook/pb_avatar/docs/_avatar_grayscale.jsx +16 -0
- data/app/pb_kits/playbook/pb_avatar/docs/example.yml +2 -0
- data/app/pb_kits/playbook/pb_avatar/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_card/card.html.erb +1 -1
- data/app/pb_kits/playbook/pb_card/card.rb +12 -0
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_error.html.erb +2 -2
- data/app/pb_kits/playbook/pb_draggable/context/index.tsx +17 -58
- data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones.html.erb +22 -1
- data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones_line.html.erb +55 -0
- data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones_line_rails.md +5 -0
- data/app/pb_kits/playbook/pb_draggable/docs/_draggable_drop_zones_rails.md +5 -0
- data/app/pb_kits/playbook/pb_draggable/docs/_draggable_event_listeners.jsx +59 -0
- data/app/pb_kits/playbook/pb_draggable/docs/_draggable_event_listeners_react.md +1 -0
- data/app/pb_kits/playbook/pb_draggable/docs/example.yml +2 -0
- data/app/pb_kits/playbook/pb_draggable/docs/index.js +2 -1
- data/app/pb_kits/playbook/pb_draggable/draggable_container.rb +11 -1
- data/app/pb_kits/playbook/pb_draggable/draggable_item.rb +11 -1
- data/app/pb_kits/playbook/pb_draggable/index.js +4 -2
- data/app/pb_kits/playbook/pb_draggable/subcomponents/DraggableItem.tsx +33 -5
- data/app/pb_kits/playbook/pb_dropdown/_dropdown.scss +6 -1
- data/app/pb_kits/playbook/pb_dropdown/_dropdown.tsx +82 -35
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_default_rails.html.erb +31 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_default_rails.md +5 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_error.html.erb +5 -2
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select.jsx +56 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select.md +3 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_display.jsx +58 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_display.md +3 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_display_rails.html.erb +20 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_display_rails.md +1 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_rails.html.erb +19 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_rails.md +3 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_autocomplete.html.erb +20 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_autocomplete.jsx +57 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_autocomplete.md +1 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_custom_options.html.erb +50 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_custom_options.jsx +105 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_default.html.erb +22 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_default.jsx +67 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete.html.erb +28 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete.jsx +17 -64
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete_with_subcomponents.html.erb +58 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/{_dropdown_with_autocomplete_and_custom_display.jsx → _dropdown_with_autocomplete_with_subcomponents.jsx} +11 -25
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete_with_subcomponents.md +1 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_display.jsx +11 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_display.md +1 -1
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_display_rails.html.erb +33 -2
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_display_rails.md +3 -1
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_external_control.md +1 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search.jsx +61 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search.md +2 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search_rails.html.erb +52 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_search_rails.md +2 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/example.yml +18 -5
- data/app/pb_kits/playbook/pb_dropdown/docs/index.js +7 -2
- data/app/pb_kits/playbook/pb_dropdown/dropdown.html.erb +3 -3
- data/app/pb_kits/playbook/pb_dropdown/dropdown.rb +20 -2
- data/app/pb_kits/playbook/pb_dropdown/dropdown.test.jsx +45 -1
- data/app/pb_kits/playbook/pb_dropdown/dropdown_container.html.erb +10 -0
- data/app/pb_kits/playbook/pb_dropdown/dropdown_container.rb +3 -0
- data/app/pb_kits/playbook/pb_dropdown/dropdown_trigger.html.erb +37 -6
- data/app/pb_kits/playbook/pb_dropdown/dropdown_trigger.rb +5 -1
- data/app/pb_kits/playbook/pb_dropdown/hooks/useHandleOnKeydown.tsx +0 -6
- data/app/pb_kits/playbook/pb_dropdown/index.js +380 -17
- data/app/pb_kits/playbook/pb_dropdown/keyboard_accessibility.js +64 -11
- data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownContainer.tsx +3 -4
- data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownOption.tsx +16 -12
- data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownTrigger.tsx +83 -17
- data/app/pb_kits/playbook/pb_dropdown/subcomponents/MultiSelectTriggerDisplay.tsx +58 -0
- data/app/pb_kits/playbook/pb_empty_state/_empty_state.scss +8 -1
- data/app/pb_kits/playbook/pb_empty_state/docs/_empty_state_alignment.html.erb +27 -0
- data/app/pb_kits/playbook/pb_empty_state/docs/_empty_state_default.html.erb +7 -0
- data/app/pb_kits/playbook/pb_empty_state/docs/_empty_state_orientation.html.erb +12 -0
- data/app/pb_kits/playbook/pb_empty_state/docs/_empty_state_size.html.erb +23 -0
- data/app/pb_kits/playbook/pb_empty_state/docs/example.yml +5 -1
- data/app/pb_kits/playbook/pb_empty_state/empty_state.html.erb +19 -0
- data/app/pb_kits/playbook/pb_empty_state/empty_state.rb +123 -0
- data/app/pb_kits/playbook/pb_file_upload/_file_upload.scss +13 -0
- data/app/pb_kits/playbook/pb_file_upload/_file_upload.tsx +11 -1
- data/app/pb_kits/playbook/pb_file_upload/docs/_file_upload_error.html.erb +1 -0
- data/app/pb_kits/playbook/pb_file_upload/docs/_file_upload_error.jsx +41 -0
- data/app/pb_kits/playbook/pb_file_upload/docs/example.yml +2 -0
- data/app/pb_kits/playbook/pb_file_upload/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_file_upload/file_upload.html.erb +1 -0
- data/app/pb_kits/playbook/pb_file_upload/file_upload.rb +7 -1
- data/app/pb_kits/playbook/pb_file_upload/fileupload.test.js +18 -0
- data/app/pb_kits/playbook/pb_form/docs/_form_form_with.html.erb +1 -0
- data/app/pb_kits/playbook/pb_form/docs/_form_form_with_validate.html.erb +1 -0
- data/app/pb_kits/playbook/pb_form_group/_error_state_mixin.scss +2 -2
- data/app/pb_kits/playbook/pb_form_pill/_form_pill.scss +19 -12
- data/app/pb_kits/playbook/pb_home_address_street/_home_address_street.tsx +13 -7
- data/app/pb_kits/playbook/pb_message/_message.tsx +3 -0
- data/app/pb_kits/playbook/pb_message/docs/_message_grayscale.html.erb +9 -0
- data/app/pb_kits/playbook/pb_message/docs/_message_grayscale.jsx +21 -0
- data/app/pb_kits/playbook/pb_message/docs/example.yml +2 -0
- data/app/pb_kits/playbook/pb_message/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_message/message.html.erb +2 -1
- data/app/pb_kits/playbook/pb_message/message.rb +1 -0
- data/app/pb_kits/playbook/pb_multi_level_select/_multi_level_select.tsx +2 -2
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_color.html.erb +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_color.jsx +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_default.html.erb +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_default.jsx +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled.html.erb +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled.jsx +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options.html.erb +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options.jsx +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_default.html.erb +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_default.jsx +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_parent.html.erb +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_parent.jsx +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_parent_default.html.erb +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_parent_default.jsx +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_error.html.erb +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_error.jsx +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_label.html.erb +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_label.jsx +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_react_hook.jsx +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_reset.html.erb +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_return_all_selected.html.erb +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_return_all_selected.jsx +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_selected_ids.html.erb +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_selected_ids.md +2 -0
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_selected_ids_react.jsx +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_selected_ids_react.md +3 -1
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_single.html.erb +22 -22
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_single.jsx +22 -22
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_single_children_only.html.erb +22 -22
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_single_children_only.jsx +22 -22
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_with_children.jsx +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_with_children_with_radios.jsx +11 -11
- data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_with_form.html.erb +11 -11
- data/app/pb_kits/playbook/pb_overlay/_overlay.scss +2 -1
- data/app/pb_kits/playbook/pb_overlay/docs/_overlay_vertical_dynamic_multi_directional.jsx +1 -1
- data/app/pb_kits/playbook/pb_overlay/subcomponents/_overlay_token.tsx +5 -4
- data/app/pb_kits/playbook/pb_person/_person.tsx +12 -2
- data/app/pb_kits/playbook/pb_phone_number_input/_phone_number_input.scss +9 -9
- data/app/pb_kits/playbook/pb_section_separator/_section_separator.tsx +2 -2
- data/app/pb_kits/playbook/pb_select/_select.scss +10 -0
- data/app/pb_kits/playbook/pb_select/docs/_select_error.html.erb +1 -1
- data/app/pb_kits/playbook/pb_table/docs/_table_with_collapsible_with_custom_click.jsx +7 -7
- data/app/pb_kits/playbook/pb_table/subcomponents/_table_row.tsx +5 -5
- data/app/pb_kits/playbook/pb_text_input/_text_input.scss +4 -2
- data/app/pb_kits/playbook/pb_text_input/docs/_text_input_error.html.erb +1 -1
- data/app/pb_kits/playbook/pb_textarea/docs/_textarea_error.html.erb +5 -1
- data/app/pb_kits/playbook/pb_typeahead/_typeahead.tsx +73 -3
- data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_error_state.html.erb +8 -1
- data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_preserve_input.jsx +23 -0
- data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_preserve_input.md +1 -0
- data/app/pb_kits/playbook/pb_typeahead/docs/example.yml +1 -0
- data/app/pb_kits/playbook/pb_typeahead/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_user/_user.tsx +3 -0
- data/app/pb_kits/playbook/pb_user/docs/_user_grayscale.html.erb +6 -0
- data/app/pb_kits/playbook/pb_user/docs/_user_grayscale.jsx +16 -0
- data/app/pb_kits/playbook/pb_user/docs/example.yml +2 -0
- data/app/pb_kits/playbook/pb_user/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_user/user.html.erb +2 -1
- data/app/pb_kits/playbook/pb_user/user.rb +1 -0
- data/dist/chunks/_typeahead-C-CI5Vgw.js +22 -0
- data/dist/chunks/_weekday_stacked-BCiM3zWM.js +45 -0
- data/dist/chunks/lib-D5R1BjUn.js +29 -0
- data/dist/chunks/{pb_form_validation-BWjy4bFn.js → pb_form_validation-BZ2AVAi_.js} +1 -1
- data/dist/chunks/vendor.js +1 -1
- data/dist/menu.yml +6 -14
- data/dist/playbook-doc.js +2 -2
- 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/kit_base.rb +3 -3
- data/lib/playbook/version.rb +2 -2
- metadata +70 -22
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_default.html.erb +0 -10
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete_and_custom_display.md +0 -1
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_hook.jsx +0 -79
- data/app/pb_kits/playbook/pb_gantt_chart/_gantt_chart.scss +0 -3
- data/app/pb_kits/playbook/pb_gantt_chart/_gantt_chart.tsx +0 -72
- data/app/pb_kits/playbook/pb_gantt_chart/docs/_gantt_chart_default.jsx +0 -53
- data/app/pb_kits/playbook/pb_gantt_chart/docs/example.yml +0 -7
- data/app/pb_kits/playbook/pb_gantt_chart/docs/index.js +0 -1
- data/app/pb_kits/playbook/pb_gantt_chart/gantt_chart.test.jsx +0 -19
- data/dist/chunks/_typeahead-D8CsVBZO.js +0 -22
- data/dist/chunks/_weekday_stacked-D3oLTSkH.js +0 -45
- data/dist/chunks/lib-BmTAc7Nc.js +0 -29
- /data/app/pb_kits/playbook/pb_advanced_table/docs/{_advanced_table_selectable_rows_react.md → _advanced_table_selectable_rows.md} +0 -0
- /data/app/pb_kits/playbook/pb_advanced_table/docs/{_advanced_table_selectable_rows_no_subrows.html.erb → _advanced_table_selectable_rows_no_subrows_rails.html.erb} +0 -0
- /data/app/pb_kits/playbook/pb_advanced_table/docs/{_advanced_table_selectable_rows.html.erb → _advanced_table_selectable_rows_rails.html.erb} +0 -0
- /data/app/pb_kits/playbook/pb_draggable/docs/{_draggable_drop_zones_line.md → _draggable_drop_zones_line_react.md} +0 -0
- /data/app/pb_kits/playbook/pb_draggable/docs/{_draggable_event_listeners.md → _draggable_event_listeners_rails.md} +0 -0
@@ -10,7 +10,13 @@
|
|
10
10
|
{ id: "63", text: "Task 3" }
|
11
11
|
] %>
|
12
12
|
|
13
|
-
|
13
|
+
<% data_line = [
|
14
|
+
{ id: "71", text: "Task 1" },
|
15
|
+
{ id: "72", text: "Task 2" },
|
16
|
+
{ id: "73", text: "Task 3" }
|
17
|
+
] %>
|
18
|
+
|
19
|
+
<%= pb_rails("flex", props: { justify: "between" }) do %>
|
14
20
|
<%= pb_rails("flex/flex_item", props: { margin_right: "xl" }) do %>
|
15
21
|
<%= pb_rails("draggable", props: { drop_zone_type: "shadow", initial_items: data_shadow }) do %>
|
16
22
|
<%= pb_rails("caption", props: { margin_bottom: "xs", text: "Shadow", text_align: "center" }) %>
|
@@ -40,4 +46,19 @@
|
|
40
46
|
<% end %>
|
41
47
|
<% end %>
|
42
48
|
<% end %>
|
49
|
+
|
50
|
+
<%= pb_rails("flex/flex_item", props: { margin_right: "xl" }) do %>
|
51
|
+
<%= pb_rails("draggable", props: { drop_zone_type: "line", initial_items: data_line }) do %>
|
52
|
+
<%= pb_rails("caption", props: { margin_bottom: "xs", text: "Line", text_align: "center" }) %>
|
53
|
+
<%= pb_rails("draggable/draggable_container", props: { drop_zone_direction: "vertical", html_options: { style: { width: "200px" } } }) do %>
|
54
|
+
<% data_line.each do |item| %>
|
55
|
+
<%= pb_rails("card", props: { drag_id: item[:id], draggable_item: true, margin_bottom: "xs", padding: "xs", padding_right: "xl", drop_zone_line_color: "primary" }) do %>
|
56
|
+
<%= pb_rails("flex", props: { align_items: "stretch", flex_direction: "column" }) do %>
|
57
|
+
<%= pb_rails("body", props: { text: item[:text] }) %>
|
58
|
+
<% end %>
|
59
|
+
<% end %>
|
60
|
+
<% end %>
|
61
|
+
<% end %>
|
62
|
+
<% end %>
|
63
|
+
<% end %>
|
43
64
|
<% end %>
|
@@ -0,0 +1,55 @@
|
|
1
|
+
<% initial_items = [
|
2
|
+
{
|
3
|
+
id: "211",
|
4
|
+
url: "https://unsplash.it/500/400/?image=633",
|
5
|
+
},
|
6
|
+
{
|
7
|
+
id: "212",
|
8
|
+
url: "https://unsplash.it/500/400/?image=634",
|
9
|
+
},
|
10
|
+
{
|
11
|
+
id: "213",
|
12
|
+
url: "https://unsplash.it/500/400/?image=637",
|
13
|
+
},
|
14
|
+
] %>
|
15
|
+
|
16
|
+
<% next_init_items = [
|
17
|
+
{
|
18
|
+
id: "2111",
|
19
|
+
url: "https://unsplash.it/500/400/?image=633",
|
20
|
+
},
|
21
|
+
{
|
22
|
+
id: "2112",
|
23
|
+
url: "https://unsplash.it/500/400/?image=634",
|
24
|
+
},
|
25
|
+
{
|
26
|
+
id: "2113",
|
27
|
+
url: "https://unsplash.it/500/400/?image=637",
|
28
|
+
},
|
29
|
+
] %>
|
30
|
+
|
31
|
+
<%= pb_rails("draggable", props: {initial_items: initial_items, drop_zone_type: "line"}) do %>
|
32
|
+
<%= pb_rails("draggable/draggable_container", props: { drop_zone_direction: "vertical" }) do %>
|
33
|
+
<%= pb_rails("flex", props: { gap: "sm", orientation: "column", height: "367px" }) do %>
|
34
|
+
<% initial_items.each do |item| %>
|
35
|
+
<%= pb_rails("draggable/draggable_item", props:{drag_id: item[:id], drop_zone_line_color: "purple"}) do %>
|
36
|
+
<%= pb_rails("image", props: { alt: item[:id], size: "md", url: item[:url] }) %>
|
37
|
+
<% end %>
|
38
|
+
<% end %>
|
39
|
+
<% end %>
|
40
|
+
<% end %>
|
41
|
+
<% end %>
|
42
|
+
|
43
|
+
<br/>
|
44
|
+
|
45
|
+
<%= pb_rails("draggable", props: {initial_items: next_init_items, drop_zone_type: "line"}) do %>
|
46
|
+
<%= pb_rails("draggable/draggable_container", props: { drop_zone_direction: "horizontal" }) do %>
|
47
|
+
<%= pb_rails("flex", props: { gap: "sm", html_options: { style: "width: 332px;" } }) do %>
|
48
|
+
<% initial_items.each do |item| %>
|
49
|
+
<%= pb_rails("draggable/draggable_item", props:{drag_id: item[:id], drop_zone_line_color: "primary"}) do %>
|
50
|
+
<%= pb_rails("image", props: { alt: item[:id], size: "md", url: item[:url] }) %>
|
51
|
+
<% end %>
|
52
|
+
<% end %>
|
53
|
+
<% end %>
|
54
|
+
<% end %>
|
55
|
+
<% end %>
|
@@ -0,0 +1,5 @@
|
|
1
|
+
When using the "line" style, make sure to set the appropriate `direction` attribute within the `drop_zone_direction` prop on the `draggable/draggable_container` component based on the orientation of your draggable view: "vertical" or "horizontal." Note that the direction attribute only applies to the "line" style and does not affect other drop zone styles. Also, set the `drop_zone_line_color` prop on the `draggable/draggable_item` component to "primary" or "purple".
|
2
|
+
|
3
|
+
The length of the line is calculated based off of the width (for "vertical") or height (for "horizontal") of the parent container holding the draggable items.
|
4
|
+
|
5
|
+
Additionally, if the parent container of the `draggable`/`draggable/draggable_container` (or a subcontainer within) does not have a set height (for "vertical") or width (for "horizontal"), like the [Draggable Drop Zones doc example](https://playbook.powerapp.cloud/kits/draggable/rails#draggable-drop-zones) does, elements on the page may jump up (for "vertical") or to the left (for "horizontal") when an item is actively being dragged. To prevent this, give a parent element a fixed height (for "vertical") or width (for "horizontal") as demonstrated in this doc example.
|
@@ -0,0 +1,5 @@
|
|
1
|
+
The Draggable kit lets you customize the style of drop zones that appear when dragging an item.
|
2
|
+
|
3
|
+
By default, drop zones are in the "ghost" style, but you can also choose from "shadow," "outline," and "line."
|
4
|
+
|
5
|
+
When using the "line" type, make sure to set the appropriate `direction` attribute on the `draggable/draggable_container` component based on the orientation of your draggable view: "vertical" or "horizontal." Note that the direction attribute only applies to the "line" type and does not affect other drop zone styles. For more on the "line" style in particular, check out the [Draggable Drop Zones Line doc example](https://playbook.powerapp.cloud/kits/draggable/rails#draggable-drop-zones-line).
|
@@ -0,0 +1,59 @@
|
|
1
|
+
import React, { useState } from "react";
|
2
|
+
|
3
|
+
import Flex from '../../pb_flex/_flex'
|
4
|
+
import Image from '../../pb_image/_image'
|
5
|
+
import Draggable from '../../pb_draggable/_draggable'
|
6
|
+
import { DraggableProvider } from '../../pb_draggable/context'
|
7
|
+
|
8
|
+
const data = [
|
9
|
+
{
|
10
|
+
id: "100",
|
11
|
+
url: "https://unsplash.it/500/400/?image=638",
|
12
|
+
},
|
13
|
+
{
|
14
|
+
id: "200",
|
15
|
+
url: "https://unsplash.it/500/400/?image=639",
|
16
|
+
},
|
17
|
+
{
|
18
|
+
id: "300",
|
19
|
+
url: "https://unsplash.it/500/400/?image=640",
|
20
|
+
},
|
21
|
+
];
|
22
|
+
|
23
|
+
const DraggableDefault = (props) => {
|
24
|
+
const [initialState, setInitialState] = useState(data);
|
25
|
+
|
26
|
+
return (
|
27
|
+
<>
|
28
|
+
<DraggableProvider initialItems={data}
|
29
|
+
onReorder={(items) => setInitialState(items)}
|
30
|
+
>
|
31
|
+
<Draggable.Container {...props}>
|
32
|
+
<Flex>
|
33
|
+
{initialState.map(({ id, url }) => (
|
34
|
+
<Draggable.Item dragId={id}
|
35
|
+
key={id}
|
36
|
+
onDrag={() => console.log(`${id} drag!`)}
|
37
|
+
onDragEnd={() => console.log(`${id} drag end!`)}
|
38
|
+
onDragEnter={() => console.log(`${id} drag enter!`)}
|
39
|
+
onDragLeave={() => console.log(`${id} drag leave!`)}
|
40
|
+
onDragOver={() => console.log(`${id} drag over!`)}
|
41
|
+
onDragStart={() => console.log(`${id} drag start!`)}
|
42
|
+
onDrop={() => console.log(`${id} drop!`)}
|
43
|
+
>
|
44
|
+
<Image alt={id}
|
45
|
+
margin="xs"
|
46
|
+
size="md"
|
47
|
+
url={url}
|
48
|
+
/>
|
49
|
+
</Draggable.Item>
|
50
|
+
))}
|
51
|
+
</Flex>
|
52
|
+
</Draggable.Container>
|
53
|
+
</DraggableProvider>
|
54
|
+
</>
|
55
|
+
|
56
|
+
);
|
57
|
+
};
|
58
|
+
|
59
|
+
export default DraggableDefault;
|
@@ -0,0 +1 @@
|
|
1
|
+
You can add drag event listeners for `onDrag`, `onDragEnd`, `onDragEnter`, `onDragLeave`, `onDragOver`, `onDragStart`, and `onDrop`.
|
@@ -9,6 +9,7 @@ examples:
|
|
9
9
|
- draggable_drop_zones: Draggable Drop Zones
|
10
10
|
- draggable_drop_zones_colors: Draggable Drop Zones Colors
|
11
11
|
- draggable_drop_zones_line: Draggable Drop Zones Line
|
12
|
+
- draggable_event_listeners: Draggable Event Listeners
|
12
13
|
|
13
14
|
rails:
|
14
15
|
- draggable_default: Default
|
@@ -19,4 +20,5 @@ examples:
|
|
19
20
|
- draggable_multiple_containers: Dragging Across Multiple Containers
|
20
21
|
- draggable_drop_zones: Draggable Drop Zones
|
21
22
|
- draggable_drop_zones_colors: Draggable Drop Zones Colors
|
23
|
+
- draggable_drop_zones_line: Draggable Drop Zones Line
|
22
24
|
- draggable_event_listeners: Draggable Event Listeners
|
@@ -6,4 +6,5 @@ export { default as DraggableMultipleContainers } from './_draggable_multiple_co
|
|
6
6
|
export { default as DraggableWithTable } from './_draggable_with_table.jsx'
|
7
7
|
export { default as DraggableDropZones } from './_draggable_drop_zones.jsx'
|
8
8
|
export { default as DraggableDropZonesColors } from './_draggable_drop_zones_colors.jsx'
|
9
|
-
export { default as DraggableDropZonesLine } from './_draggable_drop_zones_line.jsx'
|
9
|
+
export { default as DraggableDropZonesLine } from './_draggable_drop_zones_line.jsx'
|
10
|
+
export { default as DraggableEventListeners } from './_draggable_event_listeners.jsx'
|
@@ -7,13 +7,23 @@ module Playbook
|
|
7
7
|
default: "div"
|
8
8
|
prop :container, type: Playbook::Props::String,
|
9
9
|
default: ""
|
10
|
+
prop :drop_zone_direction, type: Playbook::Props::Enum,
|
11
|
+
values: ["horizontal", "vertical", nil],
|
12
|
+
default: nil
|
10
13
|
|
11
14
|
def data
|
12
15
|
Hash(prop(:data)).merge(pb_draggable_container: true)
|
13
16
|
end
|
14
17
|
|
15
18
|
def classname
|
16
|
-
|
19
|
+
direction_class = case drop_zone_direction
|
20
|
+
when "horizontal"
|
21
|
+
"line_horizontal"
|
22
|
+
when "vertical"
|
23
|
+
"line_vertical"
|
24
|
+
end
|
25
|
+
|
26
|
+
generate_classname("pb_draggable_container", direction_class, separator: " ")
|
17
27
|
end
|
18
28
|
end
|
19
29
|
end
|
@@ -9,13 +9,23 @@ module Playbook
|
|
9
9
|
default: "div"
|
10
10
|
prop :container, type: Playbook::Props::String,
|
11
11
|
default: ""
|
12
|
+
prop :drop_zone_line_color, type: Playbook::Props::Enum,
|
13
|
+
values: ["primary", "purple", nil],
|
14
|
+
default: nil
|
12
15
|
|
13
16
|
def data
|
14
17
|
Hash(prop(:data)).merge(pb_draggable_item: true)
|
15
18
|
end
|
16
19
|
|
17
20
|
def classname
|
18
|
-
|
21
|
+
line_color_class = case drop_zone_line_color
|
22
|
+
when "primary"
|
23
|
+
"drop_zone_color_primary"
|
24
|
+
when "purple"
|
25
|
+
"drop_zone_color_purple"
|
26
|
+
end
|
27
|
+
|
28
|
+
generate_classname("pb_draggable_item", line_color_class, separator: " ")
|
19
29
|
end
|
20
30
|
end
|
21
31
|
end
|
@@ -2,7 +2,7 @@ import PbEnhancedElement from "../pb_enhanced_element";
|
|
2
2
|
|
3
3
|
const DRAGGABLE_SELECTOR = "[data-pb-draggable]";
|
4
4
|
const DRAGGABLE_CONTAINER = ".pb_draggable_container";
|
5
|
-
const NEEDS_CLONE = ["shadow", "outline"]; // clone only for these types
|
5
|
+
const NEEDS_CLONE = ["shadow", "outline", "line"]; // clone only for these types
|
6
6
|
|
7
7
|
export default class PbDraggable extends PbEnhancedElement {
|
8
8
|
static get selector() { return DRAGGABLE_SELECTOR; }
|
@@ -116,7 +116,9 @@ export default class PbDraggable extends PbEnhancedElement {
|
|
116
116
|
/* ---------------------------------------------------------------- */
|
117
117
|
}
|
118
118
|
|
119
|
-
|
119
|
+
if (this.dragZoneType !== "line") {
|
120
|
+
requestAnimationFrame(() => (event.target.style.opacity = "0.5"));
|
121
|
+
}
|
120
122
|
}
|
121
123
|
|
122
124
|
/* ---------------- DRAG ENTER ---------------- */
|
@@ -8,6 +8,7 @@ import {
|
|
8
8
|
} from "../../utilities/props";
|
9
9
|
import { globalProps } from "../../utilities/globalProps";
|
10
10
|
import { DraggableContext } from "../context";
|
11
|
+
import { noop } from '../../utilities/object'
|
11
12
|
|
12
13
|
type DraggableItemProps = {
|
13
14
|
aria?: { [key: string]: string };
|
@@ -17,6 +18,13 @@ type DraggableItemProps = {
|
|
17
18
|
data?: { [key: string]: string };
|
18
19
|
htmlOptions?: {[key: string]: string | number | boolean | (() => void)},
|
19
20
|
id?: string;
|
21
|
+
onDrag?: () => void,
|
22
|
+
onDragEnd?: () => void,
|
23
|
+
onDragEnter?: () => void,
|
24
|
+
onDragLeave?: () => void,
|
25
|
+
onDragOver?: () => void,
|
26
|
+
onDragStart?: () => void,
|
27
|
+
onDrop?: () => void,
|
20
28
|
dragId?: string;
|
21
29
|
tag?: 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'p' | 'span' | 'div' | 'tr' | 'th' | 'td' | 'thead' | 'col' | 'tbody',
|
22
30
|
};
|
@@ -31,7 +39,14 @@ const DraggableItem = (props: DraggableItemProps) => {
|
|
31
39
|
htmlOptions = {},
|
32
40
|
id,
|
33
41
|
dragId,
|
34
|
-
tag="div"
|
42
|
+
tag="div",
|
43
|
+
onDrag = noop,
|
44
|
+
onDragEnd = noop,
|
45
|
+
onDragEnter = noop,
|
46
|
+
onDragLeave = noop,
|
47
|
+
onDragOver = noop,
|
48
|
+
onDragStart = noop,
|
49
|
+
onDrop = noop,
|
35
50
|
} = props;
|
36
51
|
|
37
52
|
const {
|
@@ -61,7 +76,7 @@ const DraggableItem = (props: DraggableItemProps) => {
|
|
61
76
|
);
|
62
77
|
|
63
78
|
// Enhanced drag start handler that preserves dimensions
|
64
|
-
const
|
79
|
+
const handleDragStartWithCustom = (e: React.DragEvent) => {
|
65
80
|
if (dropZone !== 'ghost' && itemRef.current) {
|
66
81
|
// Create a clone for the drag image
|
67
82
|
const clone = itemRef.current.cloneNode(true) as HTMLElement;
|
@@ -96,6 +111,9 @@ const DraggableItem = (props: DraggableItemProps) => {
|
|
96
111
|
|
97
112
|
// Call the original handler
|
98
113
|
handleDragStart(dragId, container);
|
114
|
+
|
115
|
+
// Custom event handler
|
116
|
+
onDragStart()
|
99
117
|
};
|
100
118
|
|
101
119
|
return (
|
@@ -107,9 +125,19 @@ const DraggableItem = (props: DraggableItemProps) => {
|
|
107
125
|
draggable
|
108
126
|
id={id}
|
109
127
|
key={dragId}
|
110
|
-
|
111
|
-
|
112
|
-
|
128
|
+
onDrag={onDrag}
|
129
|
+
onDragEnd={() => {
|
130
|
+
handleDragEnd()
|
131
|
+
onDragEnd()
|
132
|
+
}}
|
133
|
+
onDragEnter={() => {
|
134
|
+
handleDragEnter(dragId, container)
|
135
|
+
onDragEnter()
|
136
|
+
}}
|
137
|
+
onDragLeave={onDragLeave}
|
138
|
+
onDragOver={onDragOver}
|
139
|
+
onDragStart={handleDragStartWithCustom}
|
140
|
+
onDrop={onDrop}
|
113
141
|
ref={itemRef}
|
114
142
|
>
|
115
143
|
{children}
|
@@ -15,7 +15,7 @@
|
|
15
15
|
@include pb_body;
|
16
16
|
border: 1px solid $border_light;
|
17
17
|
background-color: $white;
|
18
|
-
height: 45px;
|
18
|
+
min-height: 45px;
|
19
19
|
@media (hover: hover) {
|
20
20
|
&:hover,
|
21
21
|
&:active,
|
@@ -41,6 +41,11 @@
|
|
41
41
|
outline: unset;
|
42
42
|
transition: box-shadow 0.15s ease-in-out;
|
43
43
|
}
|
44
|
+
&:focus-within {
|
45
|
+
box-shadow: 0px 0px 0 1px $primary !important;
|
46
|
+
outline: unset;
|
47
|
+
transition: box-shadow 0.15s ease-in-out;
|
48
|
+
}
|
44
49
|
|
45
50
|
&[class*="_select_only"] {
|
46
51
|
box-shadow: inset 0 -11px 20px rgba($primary, 0.05);
|
@@ -1,4 +1,4 @@
|
|
1
|
-
import React, { useState, useRef, useEffect, forwardRef, useImperativeHandle } from "react";
|
1
|
+
import React, { useState, useRef, useEffect, forwardRef, useImperativeHandle, useMemo } from "react";
|
2
2
|
import classnames from "classnames";
|
3
3
|
import { buildAriaProps, buildCss, buildDataProps, buildHtmlProps } from "../utilities/props";
|
4
4
|
import { globalProps } from "../utilities/globalProps";
|
@@ -25,6 +25,7 @@ type DropdownProps = {
|
|
25
25
|
blankSelection?: string;
|
26
26
|
children?: React.ReactChild[] | React.ReactChild | React.ReactElement[];
|
27
27
|
className?: string;
|
28
|
+
formPillProps?: GenericObject;
|
28
29
|
dark?: boolean;
|
29
30
|
data?: { [key: string]: string };
|
30
31
|
defaultValue?: GenericObject;
|
@@ -33,10 +34,10 @@ type DropdownProps = {
|
|
33
34
|
id?: string;
|
34
35
|
isClosed?: boolean;
|
35
36
|
label?: string;
|
37
|
+
multiSelect?: boolean;
|
36
38
|
onSelect?: (arg: GenericObject) => null;
|
37
39
|
options: GenericObject;
|
38
40
|
separators?: boolean;
|
39
|
-
triggerRef?: any;
|
40
41
|
variant?: "default" | "subtle";
|
41
42
|
};
|
42
43
|
|
@@ -62,10 +63,11 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
|
|
62
63
|
id,
|
63
64
|
isClosed = true,
|
64
65
|
label,
|
66
|
+
multiSelect = false,
|
67
|
+
formPillProps,
|
65
68
|
onSelect,
|
66
69
|
options,
|
67
70
|
separators = true,
|
68
|
-
triggerRef,
|
69
71
|
variant = "default",
|
70
72
|
} = props;
|
71
73
|
|
@@ -82,7 +84,20 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
|
|
82
84
|
const [isDropDownClosed, setIsDropDownClosed, toggleDropdown] = useDropdown(isClosed);
|
83
85
|
|
84
86
|
const [filterItem, setFilterItem] = useState("");
|
85
|
-
const
|
87
|
+
const initialSelected = useMemo(() => {
|
88
|
+
if (multiSelect) {
|
89
|
+
if (Array.isArray(defaultValue)) return defaultValue;
|
90
|
+
return defaultValue && Object.keys(defaultValue).length
|
91
|
+
? [defaultValue]
|
92
|
+
: [];
|
93
|
+
}
|
94
|
+
return defaultValue || {};
|
95
|
+
}, [multiSelect, defaultValue]);
|
96
|
+
|
97
|
+
const [selected, setSelected] = useState<GenericObject | GenericObject[]>(
|
98
|
+
initialSelected
|
99
|
+
);
|
100
|
+
|
86
101
|
const [isInputFocused, setIsInputFocused] = useState(false);
|
87
102
|
const [hasTriggerSubcomponent, setHasTriggerSubcomponent] = useState(true);
|
88
103
|
const [hasContainerSubcomponent, setHasContainerSubcomponent] =
|
@@ -91,23 +106,21 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
|
|
91
106
|
const [focusedOptionIndex, setFocusedOptionIndex] = useState(-1);
|
92
107
|
|
93
108
|
const dropdownRef = useRef(null);
|
94
|
-
const inputRef = useRef(null);
|
109
|
+
const inputRef = useRef<HTMLInputElement>(null);
|
95
110
|
const inputWrapperRef = useRef(null);
|
96
111
|
const dropdownContainerRef = useRef(null);
|
97
112
|
|
113
|
+
const selectedArray = Array.isArray(selected)
|
114
|
+
? selected
|
115
|
+
: selected && Object.keys(selected).length
|
116
|
+
? [selected]
|
117
|
+
: [];
|
118
|
+
|
98
119
|
const { trigger, container, otherChildren } =
|
99
120
|
separateChildComponents(children);
|
100
121
|
|
101
122
|
useEffect(() => {
|
102
|
-
|
103
|
-
//Only needed for when useDropdown hook used with external trigger
|
104
|
-
if (triggerRef?.current) {
|
105
|
-
const parentElement = triggerRef.current.parentNode;
|
106
|
-
if (parentElement) {
|
107
|
-
parentElement.style.position = 'relative';
|
108
|
-
}
|
109
|
-
}
|
110
|
-
// Handle clicks outside the dropdown
|
123
|
+
// Handle clicks outside the dropdown
|
111
124
|
const handleClick = handleClickOutside({
|
112
125
|
inputWrapperRef,
|
113
126
|
dropdownContainerRef,
|
@@ -134,16 +147,23 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
|
|
134
147
|
|
135
148
|
const blankSelectionOption: GenericObject = blankSelection ? [{ label: blankSelection, value: "" }] : [];
|
136
149
|
const optionsWithBlankSelection = blankSelectionOption.concat(options);
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
150
|
+
|
151
|
+
const availableOptions = useMemo(()=> {
|
152
|
+
if (!multiSelect) return optionsWithBlankSelection;
|
153
|
+
return optionsWithBlankSelection.filter((option: GenericObject) => !selectedArray.some((sel) => sel.label === option.label));
|
154
|
+
}, [optionsWithBlankSelection, selectedArray, multiSelect]);
|
155
|
+
|
156
|
+
const filteredOptions = useMemo(() => {
|
157
|
+
return availableOptions.filter((opt: GenericObject) =>
|
158
|
+
String(opt.label).toLowerCase().includes(filterItem.toLowerCase())
|
159
|
+
);
|
160
|
+
}, [availableOptions, filterItem]);
|
141
161
|
|
142
162
|
// For keyboard accessibility: Set focus within dropdown to selected item if it exists
|
143
163
|
useEffect(() => {
|
144
164
|
if (!isDropDownClosed) {
|
145
165
|
let newIndex = 0;
|
146
|
-
if (selected && selected
|
166
|
+
if (selected && !Array.isArray(selected) && selected.label) {
|
147
167
|
const selectedIndex = filteredOptions.findIndex((option: GenericObject) => option.label === selected.label);
|
148
168
|
if (selectedIndex >= 0) {
|
149
169
|
newIndex = selectedIndex;
|
@@ -159,22 +179,42 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
|
|
159
179
|
setIsDropDownClosed(false);
|
160
180
|
};
|
161
181
|
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
182
|
+
|
183
|
+
const handleOptionClick = (clickedItem: GenericObject) => {
|
184
|
+
if (multiSelect) {
|
185
|
+
setSelected((prev) => {
|
186
|
+
const list = prev as GenericObject[];
|
187
|
+
const exists = list.find((option) => option.value === clickedItem.value);
|
188
|
+
const next = exists
|
189
|
+
? list.filter((option) => option.value !== clickedItem.value)
|
190
|
+
: [...list, clickedItem];
|
191
|
+
onSelect && onSelect(next);
|
192
|
+
return next;
|
193
|
+
});
|
194
|
+
setFilterItem("");
|
195
|
+
setIsDropDownClosed(true);
|
196
|
+
} else {
|
197
|
+
setSelected(clickedItem);
|
198
|
+
setFilterItem("");
|
199
|
+
setIsDropDownClosed(true);
|
200
|
+
onSelect && onSelect(clickedItem);
|
201
|
+
}
|
202
|
+
};
|
168
203
|
|
169
204
|
const handleWrapperClick = () => {
|
170
|
-
autocomplete && inputRef
|
205
|
+
autocomplete && inputRef?.current?.focus();
|
171
206
|
toggleDropdown();
|
172
207
|
};
|
173
208
|
|
174
209
|
const handleBackspace = () => {
|
210
|
+
if (multiSelect) {
|
211
|
+
setSelected([]);
|
212
|
+
onSelect && onSelect([]);
|
213
|
+
} else {
|
175
214
|
setSelected({});
|
176
215
|
onSelect && onSelect(null);
|
177
216
|
setFocusedOptionIndex(-1);
|
217
|
+
}
|
178
218
|
};
|
179
219
|
|
180
220
|
const componentsToRender = prepareSubcomponents({
|
@@ -188,12 +228,17 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
|
|
188
228
|
});
|
189
229
|
|
190
230
|
useImperativeHandle(ref, () => ({
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
231
|
+
clearSelected: () => {
|
232
|
+
if (multiSelect) {
|
233
|
+
setSelected([]);
|
234
|
+
onSelect && onSelect([]);
|
235
|
+
} else {
|
236
|
+
setSelected({});
|
237
|
+
onSelect && onSelect(null);
|
238
|
+
}
|
239
|
+
setFilterItem("");
|
240
|
+
setIsDropDownClosed(true);
|
241
|
+
},
|
197
242
|
}));
|
198
243
|
|
199
244
|
return (
|
@@ -202,7 +247,7 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
|
|
202
247
|
{...htmlProps}
|
203
248
|
className={classes}
|
204
249
|
id={id}
|
205
|
-
style={
|
250
|
+
style={{position: "relative"}}
|
206
251
|
>
|
207
252
|
<DropdownContext.Provider
|
208
253
|
value={{
|
@@ -211,6 +256,7 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
|
|
211
256
|
filteredOptions,
|
212
257
|
filterItem,
|
213
258
|
focusedOptionIndex,
|
259
|
+
formPillProps,
|
214
260
|
handleBackspace,
|
215
261
|
handleChange,
|
216
262
|
handleOptionClick,
|
@@ -219,14 +265,15 @@ let Dropdown = (props: DropdownProps, ref: any): React.ReactElement | null => {
|
|
219
265
|
inputWrapperRef,
|
220
266
|
isDropDownClosed,
|
221
267
|
isInputFocused,
|
268
|
+
multiSelect,
|
269
|
+
onSelect,
|
222
270
|
optionsWithBlankSelection,
|
223
271
|
selected,
|
224
272
|
setFocusedOptionIndex,
|
225
273
|
setIsDropDownClosed,
|
226
274
|
setIsInputFocused,
|
227
275
|
setSelected,
|
228
|
-
toggleDropdown
|
229
|
-
triggerRef
|
276
|
+
toggleDropdown
|
230
277
|
}}
|
231
278
|
>
|
232
279
|
{label &&
|
@@ -0,0 +1,31 @@
|
|
1
|
+
<%
|
2
|
+
options = [
|
3
|
+
{ label: 'United States', value: 'United States', id: 'us' },
|
4
|
+
{ label: 'Canada', value: 'Canada', id: 'ca' },
|
5
|
+
{ label: 'Pakistan', value: 'Pakistan', id: 'pk' },
|
6
|
+
]
|
7
|
+
|
8
|
+
%>
|
9
|
+
|
10
|
+
<%
|
11
|
+
options2 = [
|
12
|
+
{ label: 'India', value: 'India', id: 'in' },
|
13
|
+
{ label: 'Mexico', value: 'Mexico', id: 'mx' },
|
14
|
+
{ label: 'Brazil', value: 'Brazil', id: 'br' },
|
15
|
+
{ label: 'Argentina', value: 'Argentina', id: 'ar' },
|
16
|
+
{ label: 'Colombia', value: 'Colombia', id: 'co' },
|
17
|
+
{ label: 'Chile', value: 'Chile', id: 'cl' },
|
18
|
+
{ label: 'Peru', value: 'Peru', id: 'pe' },
|
19
|
+
]
|
20
|
+
|
21
|
+
%>
|
22
|
+
|
23
|
+
<%= pb_rails("dropdown", props: {options: options}) %>
|
24
|
+
|
25
|
+
<script>
|
26
|
+
document.addEventListener("pb:dropdown:selected", (e) => {
|
27
|
+
const option = e.detail;
|
28
|
+
const dropdown = e.target;
|
29
|
+
console.log("Selected option:", option);
|
30
|
+
})
|
31
|
+
</script>
|
@@ -0,0 +1,5 @@
|
|
1
|
+
This kit's `options` prop requires an array of objects, each of which will be used as the selectable options within the dropdown. Each option object can support any number of key-value pairs, but each MUST contain `label`, `value` and `id`.
|
2
|
+
|
3
|
+
The kit also comes with a custom event called "pb:dropdown:selected" which updates dynamically with the selection as it changes. See code snippet to see this in action.
|
4
|
+
|
5
|
+
In addition, a data attribute called `data-option-selected` with the selection is also rendered on the parent dropdown div.
|
@@ -1,4 +1,4 @@
|
|
1
|
-
<%
|
1
|
+
<%
|
2
2
|
options = [
|
3
3
|
{ label: 'United States', value: 'United States', id: 'us' },
|
4
4
|
{ label: 'Canada', value: 'Canada', id: 'ca' },
|
@@ -6,4 +6,7 @@
|
|
6
6
|
]
|
7
7
|
%>
|
8
8
|
|
9
|
-
<%= pb_rails("dropdown", props: {
|
9
|
+
<%= pb_rails("dropdown", props: {
|
10
|
+
error: raw(pb_rails("icon", props: { icon: "warning" }) + " Please make a valid selection"),
|
11
|
+
options: options
|
12
|
+
}) %>
|