playbook_ui 14.19.0.pre.alpha.PLAY21297675 → 14.19.0.pre.alpha.PLAY21377811

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/pb_dropdown/_dropdown.scss +1 -1
  3. data/app/pb_kits/playbook/pb_dropdown/_dropdown.tsx +77 -19
  4. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_default_rails.html.erb +31 -0
  5. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_default_rails.md +5 -0
  6. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select.jsx +56 -0
  7. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select.md +3 -0
  8. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_display.jsx +58 -0
  9. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_display.md +3 -0
  10. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_display_rails.html.erb +20 -0
  11. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_display_rails.md +1 -0
  12. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_rails.html.erb +19 -0
  13. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_rails.md +3 -0
  14. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_autocomplete.html.erb +20 -0
  15. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_autocomplete.jsx +57 -0
  16. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_autocomplete.md +1 -0
  17. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_custom_options.html.erb +50 -0
  18. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_custom_options.jsx +105 -0
  19. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_default.html.erb +22 -0
  20. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_multi_select_with_default.jsx +67 -0
  21. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_display.jsx +11 -0
  22. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_display.md +1 -1
  23. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_display_rails.html.erb +33 -2
  24. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_display_rails.md +3 -1
  25. data/app/pb_kits/playbook/pb_dropdown/docs/example.yml +11 -1
  26. data/app/pb_kits/playbook/pb_dropdown/docs/index.js +5 -0
  27. data/app/pb_kits/playbook/pb_dropdown/dropdown.html.erb +3 -3
  28. data/app/pb_kits/playbook/pb_dropdown/dropdown.rb +16 -2
  29. data/app/pb_kits/playbook/pb_dropdown/dropdown_trigger.html.erb +34 -13
  30. data/app/pb_kits/playbook/pb_dropdown/dropdown_trigger.rb +3 -1
  31. data/app/pb_kits/playbook/pb_dropdown/hooks/useHandleOnKeydown.tsx +0 -6
  32. data/app/pb_kits/playbook/pb_dropdown/index.js +336 -30
  33. data/app/pb_kits/playbook/pb_dropdown/keyboard_accessibility.js +39 -12
  34. data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownOption.tsx +16 -12
  35. data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownTrigger.tsx +79 -13
  36. data/app/pb_kits/playbook/pb_dropdown/subcomponents/MultiSelectTriggerDisplay.tsx +58 -0
  37. data/app/pb_kits/playbook/pb_file_upload/_file_upload.scss +13 -0
  38. data/app/pb_kits/playbook/pb_file_upload/_file_upload.tsx +11 -1
  39. data/app/pb_kits/playbook/pb_file_upload/docs/_file_upload_error.html.erb +1 -0
  40. data/app/pb_kits/playbook/pb_file_upload/docs/_file_upload_error.jsx +41 -0
  41. data/app/pb_kits/playbook/pb_file_upload/docs/example.yml +2 -0
  42. data/app/pb_kits/playbook/pb_file_upload/docs/index.js +1 -0
  43. data/app/pb_kits/playbook/pb_file_upload/file_upload.html.erb +1 -0
  44. data/app/pb_kits/playbook/pb_file_upload/file_upload.rb +7 -1
  45. data/app/pb_kits/playbook/pb_file_upload/fileupload.test.js +18 -0
  46. data/app/pb_kits/playbook/pb_form/docs/_form_form_with.html.erb +1 -0
  47. data/app/pb_kits/playbook/pb_form/docs/_form_form_with_validate.html.erb +1 -0
  48. data/app/pb_kits/playbook/pb_form_group/_error_state_mixin.scss +2 -2
  49. data/app/pb_kits/playbook/pb_form_pill/_form_pill.scss +19 -12
  50. data/app/pb_kits/playbook/pb_home_address_street/_home_address_street.tsx +13 -7
  51. data/app/pb_kits/playbook/pb_multi_level_select/_multi_level_select.tsx +2 -2
  52. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_color.html.erb +11 -11
  53. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_color.jsx +11 -11
  54. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_default.html.erb +11 -11
  55. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_default.jsx +11 -11
  56. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled.html.erb +11 -11
  57. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled.jsx +11 -11
  58. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options.html.erb +11 -11
  59. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options.jsx +11 -11
  60. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_default.html.erb +11 -11
  61. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_default.jsx +11 -11
  62. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_parent.html.erb +11 -11
  63. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_parent.jsx +11 -11
  64. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_parent_default.html.erb +11 -11
  65. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_disabled_options_parent_default.jsx +11 -11
  66. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_error.html.erb +11 -11
  67. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_error.jsx +11 -11
  68. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_label.html.erb +11 -11
  69. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_label.jsx +11 -11
  70. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_react_hook.jsx +11 -11
  71. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_reset.html.erb +11 -11
  72. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_return_all_selected.html.erb +11 -11
  73. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_return_all_selected.jsx +11 -11
  74. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_selected_ids.html.erb +11 -11
  75. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_selected_ids.md +2 -0
  76. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_selected_ids_react.jsx +11 -11
  77. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_selected_ids_react.md +3 -1
  78. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_single.html.erb +22 -22
  79. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_single.jsx +22 -22
  80. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_single_children_only.html.erb +22 -22
  81. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_single_children_only.jsx +22 -22
  82. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_with_children.jsx +11 -11
  83. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_with_children_with_radios.jsx +11 -11
  84. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_with_form.html.erb +11 -11
  85. data/app/pb_kits/playbook/pb_person/_person.tsx +12 -2
  86. data/app/pb_kits/playbook/pb_phone_number_input/_phone_number_input.scss +9 -9
  87. data/app/pb_kits/playbook/pb_text_input/_text_input.scss +4 -2
  88. data/dist/chunks/_typeahead-CLGxsWj4.js +22 -0
  89. data/dist/chunks/_weekday_stacked-BrJMDrKs.js +45 -0
  90. data/dist/chunks/{lib-B20MXZcW.js → lib-BB_ZEriO.js} +2 -2
  91. data/dist/chunks/{pb_form_validation-WWvUXPKD.js → pb_form_validation-C0la9CZR.js} +1 -1
  92. data/dist/chunks/vendor.js +1 -1
  93. data/dist/playbook-doc.js +1 -1
  94. data/dist/playbook-rails-react-bindings.js +1 -1
  95. data/dist/playbook-rails.js +1 -1
  96. data/dist/playbook.css +1 -1
  97. data/lib/playbook/version.rb +1 -1
  98. metadata +26 -7
  99. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_default.html.erb +0 -10
  100. data/dist/chunks/_typeahead-BPSIWtFT.js +0 -22
  101. data/dist/chunks/_weekday_stacked-BeuPAmxG.js +0 -45
@@ -0,0 +1,22 @@
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
+ { label: 'India', value: 'India', id: 'in' },
7
+ { label: 'United Kingdom', value: 'United Kingdom', id: 'uk' },
8
+ { label: 'Australia', value: 'Australia', id: 'au' },
9
+ { label: 'New Zealand', value: 'New Zealand', id: 'nz' },
10
+ { label: 'Germany', value: 'Germany', id: 'de' },
11
+ { label: 'France', value: 'France', id: 'fr' },
12
+ { label: 'Italy', value: 'Italy', id: 'it' },
13
+ ]
14
+ %>
15
+
16
+ <%
17
+ default_value = [
18
+ { label: 'United States', value: 'United States', id: 'us' },
19
+ { label: 'Canada', value: 'Canada', id: 'ca' },
20
+ ]
21
+ %>
22
+ <%= pb_rails("dropdown", props: {options: options, multi_select: true, default_value: default_value}) %>
@@ -0,0 +1,67 @@
1
+ import React from "react";
2
+ import Dropdown from "../../pb_dropdown/_dropdown";
3
+
4
+ const DropdownMultiSelectWithDefault = (props) => {
5
+ const options = [
6
+ {
7
+ label: "United States",
8
+ value: "United States",
9
+ },
10
+ {
11
+ label: "United Kingdom",
12
+ value: "United Kingdom",
13
+ },
14
+ {
15
+ label: "Canada",
16
+ value: "Canada",
17
+ },
18
+ {
19
+ label: "Pakistan",
20
+ value: "Pakistan",
21
+ },
22
+ {
23
+ label: "India",
24
+ value: "India",
25
+ },
26
+ {
27
+ label: "Australia",
28
+ value: "Australia",
29
+ },
30
+ {
31
+ label: "New Zealand",
32
+ value: "New Zealand",
33
+ },
34
+ {
35
+ label: "Italy",
36
+ value: "Italy",
37
+ },
38
+ {
39
+ label: "Spain",
40
+ value: "Spain",
41
+ },
42
+ ];
43
+
44
+ const defaultSelectedOptions = [
45
+ {
46
+ label: "United States",
47
+ value: "United States",
48
+ },
49
+ {
50
+ label: "Italy",
51
+ value: "Italy",
52
+ },
53
+ ];
54
+
55
+ return (
56
+ <div>
57
+ <Dropdown
58
+ defaultValue={defaultSelectedOptions}
59
+ multiSelect
60
+ options={options}
61
+ {...props}
62
+ />
63
+ </div>
64
+ );
65
+ };
66
+
67
+ export default DropdownMultiSelectWithDefault;
@@ -6,6 +6,7 @@ import Flex from '../../pb_flex/_flex'
6
6
  import FlexItem from '../../pb_flex/_flex_item'
7
7
  import Avatar from '../../pb_avatar/_avatar'
8
8
  import User from '../../pb_user/_user'
9
+ import Body from '../../pb_body/_body'
9
10
 
10
11
  const DropdownWithCustomDisplay = (props) => {
11
12
  const [selectedOption, setSelectedOption] = useState();
@@ -50,10 +51,20 @@ const DropdownWithCustomDisplay = (props) => {
50
51
  <>
51
52
  {
52
53
  selectedOption && (
54
+ <Flex align="center">
53
55
  <Avatar
54
56
  name={selectedOption.label}
55
57
  size="xs"
56
58
  />
59
+ <Body
60
+ marginX="xs"
61
+ text={selectedOption.label}
62
+ />
63
+ <Badge
64
+ text={selectedOption.status}
65
+ variant={selectedOption.status == "Offline" ? "neutral" : selectedOption.status == "Online" ? "success" : "warning"}
66
+ />
67
+ </Flex>
57
68
  )
58
69
  }
59
70
  </>
@@ -1,4 +1,4 @@
1
- Optionally utilize `customDisplay` on the `Dropdown.Trigger` subcomponent to customize its content after an option is selected. The component passed to customDisplay will be rendered to the left of the default text-based display. In this example the Avatar kit is being used.
1
+ Optionally utilize `customDisplay` on the `Dropdown.Trigger` subcomponent to customize its content after an option is selected. Pass in any combination of kits to create a custom display. When a user clicks on an option, the kits passed into `customDisplay` will display as the selected option.
2
2
 
3
3
  The `placeholder` prop can also be used to customize the placeholder text for the default `Dropdown.Trigger`.
4
4
 
@@ -38,7 +38,11 @@
38
38
 
39
39
  <%
40
40
  custom_display = capture do
41
- pb_rails("avatar", props: { name: "Courtney Long", size: "xs" })
41
+ pb_rails("flex", props: { align: "center" }) do
42
+ concat(pb_rails("avatar", props: { name: "", size: "xs", id: "dropdown-avatar" }))
43
+ concat(pb_rails("body", props: { text: "", size: "xs", margin_x: "xs", id: "dropdown-avatar-name" }))
44
+ concat(pb_rails("badge", props: { text: "", id: "dropdown-avatar-status" }))
45
+ end
42
46
  end
43
47
  %>
44
48
 
@@ -62,4 +66,31 @@
62
66
  <% end %>
63
67
  <% end %>
64
68
  <% end %>
65
- <% end %>
69
+ <% end %>
70
+
71
+
72
+ <script>
73
+ document.addEventListener("pb:dropdown:selected", (e) => {
74
+ const option = e.detail;
75
+ const dropdown = e.target;
76
+
77
+ const display = dropdown.querySelector("#dropdown_trigger_custom_display");
78
+ if (!display) return;
79
+
80
+ const nameEl = display.querySelector("#dropdown-avatar-name");
81
+ if (nameEl) nameEl.textContent = option.label;
82
+
83
+ const avatarEl = display.querySelector("#dropdown-avatar").querySelector(".avatar_wrapper");
84
+ const initials = (option.label[0] + option.label.split(" ").pop()[0]).toUpperCase();
85
+ if (avatarEl) {
86
+ avatarEl.dataset.name = option.label;
87
+ avatarEl.setAttribute("data-initials", initials);
88
+ }
89
+ const badgeEl = display.querySelector("#dropdown-avatar-status");
90
+ const variant = option.status === "Online" ? "success" : option.status === "Offline" ? "neutral" : "warning";
91
+ if (badgeEl) {
92
+ badgeEl.querySelector("span").textContent = option.status;
93
+ badgeEl.className = 'pb_badge_kit_' + variant;
94
+ }
95
+ });
96
+ </script>
@@ -1,4 +1,6 @@
1
- Optionally utilize `custom_display` on the `dropdown/dropdown_trigger` subcomponent to customize its content after an option is selected. The component passed to custom_display will be rendered to the left of the default text-based display. In this example the Avatar kit is being used.
1
+ Optionally utilize `custom_display` on the `dropdown/dropdown_trigger` subcomponent to customize its content after an option is selected. Pass in any combination of kits to create a custom display. When a user clicks on an option, the kits passed into `custom_display` will display as the selected option.
2
+
3
+ Make use of a script to help set the custom_display with the correct value. By using the pb:dropdown:selected event listener, you can target the kits with a querySelector and update them dynamically with the values needed to match the selected option. Make sure to add an ID to the kits being passed in.
2
4
 
3
5
  The `placeholder` prop can also be used to customize the placeholder text for the default `dropdown/dropdown_trigger`.
4
6
 
@@ -1,35 +1,45 @@
1
1
  examples:
2
2
  rails:
3
- - dropdown_default: Default
3
+ - dropdown_default_rails: Default
4
4
  - dropdown_with_autocomplete: Autocomplete
5
+ - dropdown_multi_select_rails: Multi Select
6
+ - dropdown_multi_select_with_autocomplete: Multi Select with Autocomplete
7
+ - dropdown_multi_select_display_rails: Multi Select with Form Pill Props
5
8
  - dropdown_subtle_variant: Subtle Variant
6
9
  - dropdown_subcomponent_structure_rails: Subcomponent Structure
7
10
  - dropdown_with_autocomplete_with_subcomponents: Autocomplete with Subcomponent Structure
8
11
  - dropdown_with_label: With Label
9
12
  - dropdown_with_custom_options_rails: Custom Options
13
+ - dropdown_multi_select_with_custom_options: Multi Select with Custom Options
10
14
  - dropdown_with_custom_display_rails: Custom Display
11
15
  - dropdown_with_custom_trigger_rails: Custom Trigger
12
16
  - dropdown_with_search_rails: Custom Trigger Dropdown with Search
13
17
  - dropdown_with_custom_padding: Custom Option Padding
14
18
  - dropdown_error: Dropdown with Error
15
19
  - dropdown_default_value: Default Value
20
+ - dropdown_multi_select_with_default: Multi Select Default Value
16
21
  - dropdown_blank_selection: Blank Selection
17
22
  - dropdown_separators_hidden: Separators Hidden
18
23
 
19
24
  react:
20
25
  - dropdown_default: Default
21
26
  - dropdown_with_autocomplete: Autocomplete
27
+ - dropdown_multi_select: Multi Select
28
+ - dropdown_multi_select_with_autocomplete: Multi Select with Autocomplete
29
+ - dropdown_multi_select_display: Multi Select with Form Pill Props
22
30
  - dropdown_subtle_variant: Subtle Variant
23
31
  - dropdown_subcomponent_structure: Subcomponent Structure
24
32
  - dropdown_with_autocomplete_with_subcomponents: Autocomplete with Subcomponent Structure
25
33
  - dropdown_with_label: With Label
26
34
  - dropdown_with_custom_options: Custom Options
35
+ - dropdown_multi_select_with_custom_options: Multi Select with Custom Options
27
36
  - dropdown_with_custom_display: Custom Display
28
37
  - dropdown_with_custom_trigger: Custom Trigger
29
38
  - dropdown_with_search: Custom Trigger Dropdown with Search
30
39
  - dropdown_with_custom_padding: Custom Option Padding
31
40
  - dropdown_error: Dropdown with Error
32
41
  - dropdown_default_value: Default Value
42
+ - dropdown_multi_select_with_default: Multi Select Default Value
33
43
  - dropdown_blank_selection: Blank Selection
34
44
  - dropdown_clear_selection: Clear Selection
35
45
  - dropdown_separators_hidden: Separators Hidden
@@ -15,3 +15,8 @@ export { default as DropdownClearSelection } from './_dropdown_clear_selection.j
15
15
  export { default as DropdownSubtleVariant } from './_dropdown_subtle_variant.jsx'
16
16
  export { default as DropdownSeparatorsHidden } from './_dropdown_separators_hidden.jsx'
17
17
  export {default as DropdownWithSearch} from './_dropdown_with_search.jsx'
18
+ export { default as DropdownMultiSelect } from './_dropdown_multi_select.jsx'
19
+ export { default as DropdownMultiSelectDisplay } from './_dropdown_multi_select_display.jsx'
20
+ export { default as DropdownMultiSelectWithAutocomplete } from './_dropdown_multi_select_with_autocomplete.jsx'
21
+ export { default as DropdownMultiSelectWithDefault } from './_dropdown_multi_select_with_default.jsx'
22
+ export { default as DropdownMultiSelectWithCustomOptions } from './_dropdown_multi_select_with_custom_options.jsx'
@@ -6,7 +6,7 @@
6
6
  <input
7
7
  data-default-value="<%= input_default_value %>"
8
8
  id="dropdown-selected-option"
9
- name="<%= object.name %>"
9
+ name="<%= object.name %><%= '[]' if object.multi_select %>"
10
10
  style="display: none"
11
11
  <%= object.required ? "required" : ""%>
12
12
  />
@@ -14,8 +14,8 @@
14
14
  <%= content.presence %>
15
15
  <%= pb_rails("body", props: { status: "negative", text: object.error }) %>
16
16
  <% else %>
17
- <%= pb_rails("dropdown/dropdown_trigger", props:{autocomplete: object.autocomplete}) %>
18
- <%= pb_rails("dropdown/dropdown_container", props: {searchbar: object.searchbar}) do %>
17
+ <%= pb_rails("dropdown/dropdown_trigger", props:{ autocomplete: object.autocomplete, multi_select:object.multi_select }) %>
18
+ <%= pb_rails("dropdown/dropdown_container", props: { searchbar: object.searchbar }) do %>
19
19
  <% if options_with_blank.present? %>
20
20
  <% options_with_blank.each do |option| %>
21
21
  <%= pb_rails("dropdown/dropdown_option", props: {option: option}) %>
@@ -22,9 +22,17 @@ module Playbook
22
22
  default: false
23
23
  prop :searchbar, type: Playbook::Props::Boolean,
24
24
  default: false
25
+ prop :multi_select, type: Playbook::Props::Boolean,
26
+ default: false
27
+ prop :form_pill_props, type: Playbook::Props::HashProp,
28
+ default: {}
25
29
 
26
30
  def data
27
- Hash(prop(:data)).merge(pb_dropdown: true)
31
+ Hash(prop(:data)).merge(
32
+ pb_dropdown: true,
33
+ pb_dropdown_multi_select: multi_select,
34
+ form_pill_props: form_pill_props.to_json
35
+ )
28
36
  end
29
37
 
30
38
  def classname
@@ -38,7 +46,13 @@ module Playbook
38
46
  end
39
47
 
40
48
  def input_default_value
41
- default_value.present? ? default_value.transform_keys(&:to_s)["id"] : ""
49
+ return "" unless default_value.present?
50
+
51
+ if multi_select
52
+ default_value.map { |v| v.transform_keys(&:to_s)["id"] }.join(",")
53
+ else
54
+ default_value.transform_keys(&:to_s)["id"]
55
+ end
42
56
  end
43
57
 
44
58
  def separators_class
@@ -14,7 +14,7 @@
14
14
  padding_y:"xs",
15
15
  html_options: {tabindex:"0"}
16
16
  }) do %>
17
- <%= pb_rails("flex/flex_item") do %>
17
+ <%= pb_rails("flex/flex_item", props: { fixed_size: object.multi_select ? "85%" : "" }) do %>
18
18
  <%= pb_rails("flex", props: {align: "center"}) do %>
19
19
  <% if object.custom_display.present? %>
20
20
  <%= pb_rails("flex", props: {align: "center"}) do %>
@@ -24,23 +24,44 @@
24
24
  <%= pb_rails("body", props: {text: object.default_display_placeholder, id: "dropdown_trigger_display"}) %>
25
25
  <% end %>
26
26
  <% else %>
27
- <% if object.autocomplete %>
28
- <input
29
- data-dropdown-autocomplete
30
- class="dropdown_input"
31
- type="text"
32
- placeholder="<%= object.placeholder || 'Select…' %>"
33
- autocomplete="off"
34
- />
27
+ <% if object.multi_select %>
28
+ <%= pb_rails("flex", props: { align: "center", wrap: true }) do %>
29
+ <%= pb_rails("flex", props: { id:"dropdown_pills_wrapper", wrap: true }) do %>
30
+ <% end %>
31
+ <% if object.autocomplete %>
32
+ <input
33
+ data-dropdown-autocomplete
34
+ class="dropdown_input"
35
+ type="text"
36
+ placeholder="<%= object.placeholder || 'Select…' %>"
37
+ autocomplete="off"
38
+ />
39
+ <% else %>
40
+ <%= pb_rails("body", props: {text: object.default_display_placeholder, id: "dropdown_trigger_display_multi_select"}) %>
41
+ <% end %>
42
+ <% end %>
35
43
  <% else %>
36
- <%= pb_rails("body", props: {text: object.default_display_placeholder, id: "dropdown_trigger_display"}) %>
44
+ <% if object.autocomplete %>
45
+ <input
46
+ data-dropdown-autocomplete
47
+ class="dropdown_input"
48
+ type="text"
49
+ placeholder="<%= object.placeholder || 'Select…' %>"
50
+ autocomplete="off"
51
+ />
52
+ <% else %>
53
+ <%= pb_rails("body", props: {text: object.default_display_placeholder, id: "dropdown_trigger_display"}) %>
54
+ <% end %>
37
55
  <% end %>
38
56
  <% end %>
39
57
  <% end %>
40
58
  <% end %>
41
- <%= pb_rails("body", props: {display: "flex"}) do %>
42
- <%= pb_rails("icon", props: {icon: "chevron-down", cursor: "pointer", size:"sm", id: "dropdown_open_icon"}) %>
43
- <%= pb_rails("icon", props: {icon: "chevron-up", cursor: "pointer", size:"sm", id: "dropdown_close_icon"}) %>
59
+ <%= pb_rails("flex/flex_item") do %>
60
+ <%= pb_rails("body", props: {display: "flex", align_items:"center" }) do %>
61
+ <%= pb_rails("icon", props: {icon: "times", cursor: "pointer", size:"sm", id: "dropdown_clear_icon", padding_right:"xs" }) %>
62
+ <%= pb_rails("icon", props: {icon: "chevron-down", cursor: "pointer", size:"sm", id: "dropdown_open_icon"}) %>
63
+ <%= pb_rails("icon", props: {icon: "chevron-up", cursor: "pointer", size:"sm", id: "dropdown_close_icon"}) %>
64
+ <% end %>
44
65
  <% end %>
45
66
  <% end %>
46
67
  <% end %>
@@ -11,6 +11,8 @@ module Playbook
11
11
  prop :custom_display
12
12
  prop :autocomplete, type: Playbook::Props::Boolean,
13
13
  default: false
14
+ prop :multi_select, type: Playbook::Props::Boolean,
15
+ default: false
14
16
 
15
17
  def data
16
18
  Hash(prop(:data)).merge(dropdown_trigger: true, dropdown_placeholder: default_display_placeholder)
@@ -25,7 +27,7 @@ module Playbook
25
27
  end
26
28
 
27
29
  def trigger_wrapper_classes
28
- generate_classname("dropdown_trigger_wrapper", ("select_only" unless autocomplete))
30
+ generate_classname("dropdown_trigger_wrapper", ("select_only" unless autocomplete || multi_select))
29
31
  end
30
32
  end
31
33
  end
@@ -22,12 +22,6 @@ const {
22
22
  }
23
23
 
24
24
  switch (e.key) {
25
- case "Backspace":
26
- case "Delete":
27
- if (autocomplete) {
28
- handleBackspace();
29
- }
30
- break;
31
25
  case "ArrowDown": {
32
26
  e.preventDefault();
33
27
  setIsDropDownClosed(false);