playbook_ui 13.25.0.pre.alpha.PBNTR272Dropdownkitv42769 → 13.25.0.pre.alpha.PBNTR291Dropdownrailsv22812

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/pb_bar_graph/_bar_graph.tsx +1 -1
  3. data/app/pb_kits/playbook/pb_checkbox/_checkbox.scss +49 -0
  4. data/app/pb_kits/playbook/pb_checkbox/_checkbox.tsx +3 -0
  5. data/app/pb_kits/playbook/pb_checkbox/checkbox.rb +2 -1
  6. data/app/pb_kits/playbook/pb_checkbox/checkbox.test.js +14 -0
  7. data/app/pb_kits/playbook/pb_checkbox/docs/_checkbox_disabled.html.erb +23 -0
  8. data/app/pb_kits/playbook/pb_checkbox/docs/_checkbox_disabled.jsx +29 -0
  9. data/app/pb_kits/playbook/pb_checkbox/docs/example.yml +2 -0
  10. data/app/pb_kits/playbook/pb_checkbox/docs/index.js +1 -0
  11. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_on_change.md +3 -1
  12. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_on_close.md +3 -1
  13. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_quick_pick_range_limit.md +1 -1
  14. data/app/pb_kits/playbook/pb_dropdown/_dropdown.scss +41 -58
  15. data/app/pb_kits/playbook/pb_dropdown/_dropdown.tsx +15 -28
  16. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_default.html.erb +10 -0
  17. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_default.jsx +1 -7
  18. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_default.md +1 -1
  19. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_subcomponent_structure.html.erb +17 -0
  20. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_subcomponent_structure.jsx +42 -0
  21. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_subcomponent_structure.md +7 -0
  22. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete.jsx +2 -5
  23. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_autocomplete_and_custom_display.jsx +1 -2
  24. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_display.html.erb +60 -0
  25. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_display.jsx +1 -1
  26. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_display.md +1 -1
  27. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_options.html.erb +45 -0
  28. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_options.md +1 -1
  29. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_padding.html.erb +17 -0
  30. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_trigger.html.erb +47 -0
  31. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_external_control.jsx +1 -4
  32. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_hook.jsx +1 -4
  33. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_label.html.erb +10 -0
  34. data/app/pb_kits/playbook/pb_dropdown/docs/example.yml +10 -2
  35. data/app/pb_kits/playbook/pb_dropdown/docs/index.js +1 -0
  36. data/app/pb_kits/playbook/pb_dropdown/dropdown.html.erb +21 -0
  37. data/app/pb_kits/playbook/pb_dropdown/dropdown.rb +20 -0
  38. data/app/pb_kits/playbook/pb_dropdown/dropdown.test.jsx +3 -3
  39. data/app/pb_kits/playbook/pb_dropdown/dropdown_container.html.erb +15 -0
  40. data/app/pb_kits/playbook/pb_dropdown/dropdown_container.rb +19 -0
  41. data/app/pb_kits/playbook/pb_dropdown/dropdown_option.html.erb +22 -0
  42. data/app/pb_kits/playbook/pb_dropdown/dropdown_option.rb +22 -0
  43. data/app/pb_kits/playbook/pb_dropdown/dropdown_trigger.html.erb +38 -0
  44. data/app/pb_kits/playbook/pb_dropdown/dropdown_trigger.rb +30 -0
  45. data/app/pb_kits/playbook/pb_dropdown/index.js +154 -0
  46. data/app/pb_kits/playbook/pb_dropdown/keyboard_accessibility.js +77 -0
  47. data/app/pb_kits/playbook/pb_dropdown/scss_partials/_dropdown_animation.scss +18 -0
  48. data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownOption.tsx +9 -7
  49. data/app/pb_kits/playbook/pb_dropdown/utilities/clickOutsideHelper.tsx +41 -0
  50. data/app/pb_kits/playbook/pb_dropdown/utilities/index.ts +2 -0
  51. data/app/pb_kits/playbook/pb_progress_simple/docs/_progress_simple_flex.html.erb +3 -0
  52. data/app/pb_kits/playbook/pb_progress_simple/docs/_progress_simple_flex.jsx +16 -0
  53. data/app/pb_kits/playbook/pb_progress_simple/docs/_progress_simple_flex.md +1 -0
  54. data/app/pb_kits/playbook/pb_progress_simple/docs/example.yml +2 -0
  55. data/app/pb_kits/playbook/pb_progress_simple/docs/index.js +1 -0
  56. data/app/pb_kits/playbook/pb_progress_simple/progress_simple.rb +1 -1
  57. data/app/pb_kits/playbook/pb_radio/_radio.scss +35 -0
  58. data/app/pb_kits/playbook/pb_radio/_radio.tsx +3 -0
  59. data/app/pb_kits/playbook/pb_radio/docs/_radio_alignment.jsx +4 -1
  60. data/app/pb_kits/playbook/pb_radio/docs/_radio_default.jsx +4 -1
  61. data/app/pb_kits/playbook/pb_radio/docs/_radio_disabled.html.erb +26 -0
  62. data/app/pb_kits/playbook/pb_radio/docs/_radio_disabled.jsx +31 -0
  63. data/app/pb_kits/playbook/pb_radio/docs/_radio_error.jsx +2 -1
  64. data/app/pb_kits/playbook/pb_radio/docs/example.yml +2 -0
  65. data/app/pb_kits/playbook/pb_radio/docs/index.js +1 -0
  66. data/app/pb_kits/playbook/pb_radio/radio.rb +5 -0
  67. data/app/pb_kits/playbook/pb_radio/radio.test.js +17 -0
  68. data/app/pb_kits/playbook/playbook-rails.js +3 -0
  69. data/dist/playbook-rails.js +5 -5
  70. data/lib/playbook/version.rb +1 -1
  71. metadata +31 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 71177d67df222d53293af018a05b5a4aa6e8c2320e2666e4a0fa306f9c7fa6b6
4
- data.tar.gz: 4020bc3572296e4c84a58b117cd6b194d2875429baf2bcf606f5a9e2f3772b25
3
+ metadata.gz: 76d5446d59ffafe0e3da366fc35ae5a85ce4965c57204e395724cd9bd4fbd4e2
4
+ data.tar.gz: b1b7f18e82863f99ff0a7d7d22dd9f0e6b55d78b709f739bf28f6a12a8dc0514
5
5
  SHA512:
6
- metadata.gz: b628362eb09ed93b1084e3452766c4753edda243367d3217379e4ad4b83738567931f26af432583a7d38e34dcf8085c6ae05bb6415460a8cbf5b438a25ffd603
7
- data.tar.gz: 1aed46186c6455ad3e8adb45e63fe1a55358237eec9c2fd72db3b12a4a9cdbc7031099be20d38e2e79a9bedf89b74cb97a96ed4cc67b05649e5d682064bfade0
6
+ metadata.gz: e64335a9b6dea16cd26759da7db490f4058f962c2f86c2d0ef381fa02be563c684a02774f9797a874bb13694626313277c4089a536c902f8e10f723e5ff07bd0
7
+ data.tar.gz: a1191a5963dd004a8601ce004476d65d8eaccb94234f4d8289cc46bf21a5a93bd8aa044f80d203904f958bbcc4c1d2c09a861ad3acaa91e7d8375912bb57f2ed
@@ -102,7 +102,7 @@ const BarGraph = ({
102
102
  max: yAxisMax,
103
103
  opposite: false,
104
104
  title: {
105
- text: typeof axisTitle === 'string' ? axisTitle : axisTitle[0].name,
105
+ text: Array.isArray(axisTitle) ? (axisTitle.length > 0 ? axisTitle[0].name : null) : axisTitle,
106
106
  },
107
107
  plotLines: typeof yAxisMin !== 'undefined' && yAxisMin !== null ? [] : [{
108
108
  value: 0,
@@ -74,6 +74,31 @@ $transition: $transition_cubic;
74
74
  opacity: $opacity_10;
75
75
  }
76
76
  }
77
+
78
+ &:disabled ~ .pb_checkbox_checkmark {
79
+ cursor: not-allowed;
80
+ background-color: mix($charcoal, $white, 5%);
81
+ border-color: $border_light;
82
+
83
+ & ~ .pb_checkbox_label {
84
+ cursor: not-allowed;
85
+ color: $text_lt_light;
86
+ }
87
+ & ~ .pb_checkbox_label .pb_body_kit {
88
+ cursor: not-allowed;
89
+ color: $text_lt_light;
90
+ }
91
+ }
92
+
93
+ &:disabled:checked ~ .pb_checkbox_checkmark {
94
+ background-color: $neutral;
95
+ border-color: $neutral;
96
+ }
97
+
98
+ &:disabled:checked:hover ~ .pb_checkbox_checkmark {
99
+ background-color: $neutral;
100
+ border-color: $neutral;
101
+ }
77
102
  }
78
103
 
79
104
  &.dark {
@@ -81,6 +106,30 @@ $transition: $transition_cubic;
81
106
  &:focus ~ .pb_checkbox_checkmark {
82
107
  box-shadow: 0px 0px 0px 2px $bg_dark_card, 0px 0px 0px 4px $primary;
83
108
  }
109
+
110
+ &:disabled ~ .pb_checkbox_checkmark {
111
+ cursor: not-allowed;
112
+ background-color: mix($charcoal, $white, 80%);
113
+ border: 2px solid $border_dark;
114
+
115
+ & ~ .pb_checkbox_label {
116
+ cursor: not-allowed;
117
+ color: $text_dk_light;
118
+ }
119
+ & ~ .pb_checkbox_label .pb_body_kit {
120
+ cursor: not-allowed;
121
+ color: $text_dk_light;
122
+ }
123
+ }
124
+
125
+ &:disabled:checked ~ .pb_checkbox_checkmark {
126
+ background-color: $border_dark;
127
+ }
128
+
129
+ &:disabled:checked:hover ~ .pb_checkbox_checkmark {
130
+ background-color: $border_dark;
131
+ border-color: $border_dark;
132
+ }
84
133
  }
85
134
 
86
135
  @media (hover:hover) {
@@ -12,6 +12,7 @@ type CheckboxProps = {
12
12
  className?: string,
13
13
  dark?: boolean,
14
14
  data?: {[key: string]: string},
15
+ disabled?: boolean,
15
16
  error?: boolean,
16
17
  htmlOptions?: {[key: string]: string | number | boolean | (() => void)},
17
18
  id?: string,
@@ -31,6 +32,7 @@ const Checkbox = (props: CheckboxProps): React.ReactElement => {
31
32
  className,
32
33
  dark = false,
33
34
  data = {},
35
+ disabled = false,
34
36
  error = false,
35
37
  htmlOptions = {},
36
38
  id,
@@ -67,6 +69,7 @@ const Checkbox = (props: CheckboxProps): React.ReactElement => {
67
69
  return (
68
70
  <input
69
71
  defaultChecked={checked}
72
+ disabled={disabled}
70
73
  name={name}
71
74
  onChange={onChange}
72
75
  ref={checkRef}
@@ -9,6 +9,7 @@ module Playbook
9
9
  prop :text
10
10
  prop :value
11
11
  prop :name
12
+ prop :disabled, type: Playbook::Props::Boolean, default: false
12
13
 
13
14
  prop :input_options, type: Playbook::Props::HashProp,
14
15
  default: {}
@@ -26,7 +27,7 @@ module Playbook
26
27
  end
27
28
 
28
29
  def input
29
- check_box_tag(name, value, checked, input_options)
30
+ check_box_tag(name, value, checked, input_options.merge(disabled: disabled))
30
31
  end
31
32
 
32
33
  def checkbox_label_status
@@ -92,3 +92,17 @@ test('has checked attribute', () => {
92
92
  const kit = screen.getByTestId(testId)
93
93
  expect(kit.getElementsByTagName('input')[0]).toHaveAttribute('checked')
94
94
  })
95
+
96
+ test('has disabled attribute', () => {
97
+ render(
98
+ <Checkbox
99
+ data={{ testid: testId }}
100
+ disabled
101
+ name="checkbox-name"
102
+ text="Checkbox"
103
+ value="check-box value"
104
+ />)
105
+ const kit = screen.getByTestId(testId)
106
+ const input = kit.querySelector('input')
107
+ expect(input).toHaveAttribute('disabled')
108
+ })
@@ -0,0 +1,23 @@
1
+ <%= pb_rails("flex", props: {orientation: "column"}) do %>
2
+ <%= pb_rails("flex/flex_item") do %>
3
+ <%= pb_rails("checkbox" , props: {
4
+ input_options: { tabindex: 0 },
5
+ margin_bottom: "xs",
6
+ text: "Disabled unchecked",
7
+ value: "checkbox-value",
8
+ disabled: true,
9
+ name: "checkbox-name"
10
+ }) %>
11
+ <% end %>
12
+ <%= pb_rails("flex/flex_item") do %>
13
+ <%= pb_rails("checkbox" , props: {
14
+ input_options: { tabindex: 0 },
15
+ text: "Disabled checked",
16
+ value: "checkbox-value",
17
+ disabled: true,
18
+ checked: true,
19
+ name: "checkbox-name"
20
+ }) %>
21
+ <% end %>
22
+ <% end %>
23
+
@@ -0,0 +1,29 @@
1
+ import React from 'react'
2
+
3
+ import Checkbox from '../_checkbox'
4
+
5
+ const CheckboxDisabled = (props) => {
6
+ return (
7
+ <div style={{ display: "flex", flexDirection: "column" }}>
8
+ <Checkbox
9
+ disabled
10
+ marginBottom="xs"
11
+ name="default name"
12
+ tabIndex={0}
13
+ text="Disabled unchecked"
14
+ value="default value"
15
+ {...props}
16
+ />
17
+ <Checkbox
18
+ checked
19
+ disabled
20
+ name="checkbox-name"
21
+ text="Disabled checked"
22
+ value="check-box value"
23
+ {...props}
24
+ />
25
+ </div>
26
+ )
27
+ }
28
+
29
+ export default CheckboxDisabled
@@ -6,6 +6,7 @@ examples:
6
6
  - checkbox_error: Default w/ Error
7
7
  - checkbox_options: Checkbox w/ Options
8
8
  - checkbox_indeterminate: Indeterminate Checkbox
9
+ - checkbox_disabled: Disabled Checkbox
9
10
 
10
11
  react:
11
12
  - checkbox_default: Default
@@ -13,6 +14,7 @@ examples:
13
14
  - checkbox_custom: Custom Checkbox
14
15
  - checkbox_error: Default w/ Error
15
16
  - checkbox_indeterminate: Indeterminate Checkbox
17
+ - checkbox_disabled: Disabled Checkbox
16
18
 
17
19
  swift:
18
20
  - checkbox_default_swift: Default
@@ -3,3 +3,4 @@ export { default as CheckboxCustom } from './_checkbox_custom.jsx'
3
3
  export { default as CheckboxError } from './_checkbox_error.jsx'
4
4
  export { default as CheckboxChecked } from './_checkbox_checked.jsx'
5
5
  export { default as CheckboxIndeterminate } from './_checkbox_indeterminate.jsx'
6
+ export { default as CheckboxDisabled } from './_checkbox_disabled.jsx'
@@ -1,3 +1,5 @@
1
1
  Your change handler function has access to two arguments: `dateStr` and `selectedDates`.
2
2
 
3
- The first, `dateStr`, is a string of the chosen date. The second, `selectedDates`, is an array of selected date objects. In many use cases `selectedDates` will have only one value but you'll still need to access it from index 0.
3
+ The first, `dateStr`, is a string of the chosen date. The second, `selectedDates`, is an array of selected date objects. In many use cases `selectedDates` will have only one value but you'll still need to access it from index 0.
4
+
5
+ NOTE: On Change does not account for manual input by users, so if your date picker sets `allowInput`, you should use the `onClose` method instead.
@@ -1,3 +1,5 @@
1
1
  The `onClose` handler function has access to two arguments: `dateStr` and `selectedDates`.
2
2
 
3
- The first, `dateStr`, is a string of the chosen date. The second, `selectedDates`, is an array of selected date objects. In many use cases `selectedDates` will have only one value but you'll still need to access it from index 0.
3
+ The first, `dateStr`, is a string of the chosen date. The second, `selectedDates`, is an array of selected date objects. In many use cases `selectedDates` will have only one value but you'll still need to access it from index 0.
4
+
5
+ NOTE: `onClose` is the ideal handler function to use when `allowInput` is enabled.
@@ -1 +1 @@
1
- Applying `this_ranges_end_today` (Rails) or `thisRangesEndToday` (React) causes all “This” preset ranges (i.e., this week, this month, this quarter, this year) to use an endDate of today, instead of their natural end date in the future.
1
+ Because the Quick Pick variant has `allowInput` set to `true` by default, use the `onClose` handler function to access the startDate and endDate values. See the `onClose` example for details.
@@ -7,28 +7,11 @@
7
7
  @import "../pb_body/body_mixins";
8
8
  @import "../pb_textarea/textarea_mixin";
9
9
 
10
- @keyframes fadeIn {
11
- from {
12
- opacity: 0;
13
- }
14
-
15
- to {
16
- opacity: 1;
17
- }
18
- }
19
- @keyframes fadeOut {
20
- from {
21
- opacity: 1;
22
- }
23
-
24
- to {
25
- opacity: 0;
26
- }
27
- }
10
+ @import "./scss_partials/dropdown_animation";
28
11
 
29
12
  .pb_dropdown {
30
13
  .dropdown_wrapper {
31
- [class*=dropdown_trigger_wrapper] {
14
+ [class*="dropdown_trigger_wrapper"] {
32
15
  @include pb_body;
33
16
  border: 1px solid $border_light;
34
17
  background-color: $white;
@@ -47,7 +30,6 @@
47
30
  .dropdown_input {
48
31
  @include pb_body;
49
32
  border: unset;
50
- border-radius: $border_rad_heavier;
51
33
  padding: 0;
52
34
  background-color: $white;
53
35
  &:focus-visible {
@@ -55,17 +37,17 @@
55
37
  }
56
38
  }
57
39
  &:focus {
58
- box-shadow: 0px 0px 0 1px $primary;
40
+ box-shadow: 0px 0px 0 1px $primary !important;
59
41
  outline: unset;
60
42
  transition: box-shadow 0.15s ease-in-out;
61
43
  }
62
-
63
- &[class*=_select_only] {
44
+
45
+ &[class*="_select_only"] {
64
46
  box-shadow: inset 0 -11px 20px rgba($primary, 0.05);
65
47
  }
66
48
 
67
- &[class*=_focus] {
68
- box-shadow: 0px 0px 0 1px $primary;
49
+ &[class*="_focus"] {
50
+ box-shadow: 0px 0px 0 1px $primary !important;
69
51
  transition: box-shadow 0.1s ease-in-out;
70
52
  }
71
53
  }
@@ -80,34 +62,34 @@
80
62
  z-index: $z_1;
81
63
  width: 100%;
82
64
 
83
- .pb_dropdown_option {
65
+ [class*="pb_dropdown_option"] {
84
66
  cursor: pointer;
85
67
  &:hover {
86
68
  background-color: $border_light;
87
69
  }
88
- }
89
-
90
- .dropdown_option_focused {
91
- background-color: $border_light;
92
- }
93
70
 
94
- .dropdown_option {
95
- width: 100%;
96
- }
71
+ &[class*="_focused"] {
72
+ background-color: $border_light;
73
+ }
97
74
 
98
- .dropdown_option_list {
99
- border-bottom: 1px solid $border_light;
100
- }
101
- .dropdown_option_selected {
102
- background-color: $primary;
103
- [class^="pb_body"],
104
- [class^="pb_title_kit"] {
105
- color: $white !important;
75
+ &[class*="_list"] {
76
+ border-bottom: 1px solid $border_light;
106
77
  }
107
- &:hover {
108
- background-color: $primary !important;
78
+ &[class*="selected"] {
79
+ background-color: $primary;
80
+ [class^="pb_body"],
81
+ [class^="pb_title_kit"] {
82
+ color: $white !important;
83
+ }
84
+ &:hover {
85
+ background-color: $primary !important;
86
+ }
109
87
  }
110
88
  }
89
+
90
+ .dropdown_option_wrapper {
91
+ width: 100%;
92
+ }
111
93
  }
112
94
  .close {
113
95
  display: none;
@@ -128,7 +110,7 @@
128
110
 
129
111
  &.dark {
130
112
  .dropdown_wrapper {
131
- [class*=dropdown_trigger_wrapper] {
113
+ [class*="dropdown_trigger_wrapper"] {
132
114
  @include pb_body_light_dark;
133
115
  background-color: rgba($white, 0.1) !important;
134
116
  background: none;
@@ -143,10 +125,9 @@
143
125
  [class^="pb_body"] {
144
126
  color: $white;
145
127
  }
146
- &[class*=_select_only] {
147
- box-shadow: inset 0 -11px 20px rgba($white, 0.05) !important;
128
+ &[class*="_select_only"] {
129
+ box-shadow: inset 0 -11px 20px rgba($white, 0.05);
148
130
  }
149
-
150
131
  .dropdown_input {
151
132
  background-color: unset;
152
133
  color: $white;
@@ -157,24 +138,26 @@
157
138
  background-color: $bg_dark !important;
158
139
  border-color: rgba($white, 0.15);
159
140
  color: $white;
160
- .dropdown_option_list {
161
- border-color: rgba($white, 0.15);
162
- }
163
141
  [class^="pb_body"],
164
142
  [class^="pb_title_kit"] {
165
143
  color: $white !important;
166
144
  }
167
145
 
168
- .pb_dropdown_option {
146
+ [class*="pb_dropdown_option"] {
169
147
  &:hover {
170
148
  background-color: $hover_dark;
171
149
  }
172
- }
173
- .dropdown_option_focused {
174
- background-color: $hover_dark;
175
- }
176
- .dropdown_option_selected {
177
- background-color: $primary;
150
+
151
+ &[class*="_focused"] {
152
+ background-color: $hover_dark;
153
+ }
154
+
155
+ &[class*="_list"] {
156
+ border-color: rgba($white, 0.15);
157
+ }
158
+ &[class*="selected"] {
159
+ background-color: $primary;
160
+ }
178
161
  }
179
162
  }
180
163
  }
@@ -1,27 +1,28 @@
1
- import React, { useState, useRef, useEffect, ReactElement } from "react";
1
+ import React, { useState, useRef, useEffect } 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";
5
+ import { GenericObject } from "../types";
5
6
 
6
7
  import Body from "../pb_body/_body";
7
8
  import Caption from "../pb_caption/_caption";
8
9
 
9
10
  import DropdownContainer from "./subcomponents/DropdownContainer";
11
+ import DropdownContext from "./context";
10
12
  import DropdownOption from "./subcomponents/DropdownOption";
11
13
  import DropdownTrigger from "./subcomponents/DropdownTrigger";
12
- import DropdownContext from "./context";
13
14
  import useDropdown from "./hooks/useDropdown";
14
15
 
15
16
  import {
16
17
  separateChildComponents,
17
18
  prepareSubcomponents,
18
- } from "./utilities/subComponentHelper";
19
- import { GenericObject } from "../types";
19
+ handleClickOutside,
20
+ } from "./utilities";
20
21
 
21
22
  type DropdownProps = {
22
23
  aria?: { [key: string]: string };
23
24
  autocomplete?: boolean;
24
- children?: React.ReactChild[] | React.ReactChild | ReactElement[];
25
+ children?: React.ReactChild[] | React.ReactChild | React.ReactElement[];
25
26
  className?: string;
26
27
  dark?: boolean;
27
28
  data?: { [key: string]: string };
@@ -89,31 +90,17 @@ const Dropdown = (props: DropdownProps) => {
89
90
  }
90
91
  }
91
92
  // Handle clicks outside the dropdown
92
- const handleClickOutside = (e: MouseEvent) => {
93
- let targetElement = e.target as HTMLElement;
94
- let shouldClose = true;
95
-
96
- while (targetElement && shouldClose) {
97
- //Only needed for when useDropdown hook used with external trigger
98
- if (targetElement.getAttribute('data-dropdown') === 'pb-dropdown-trigger') {
99
- shouldClose = false;
100
- }
101
- targetElement = targetElement.parentElement as HTMLElement;
102
- }
103
- if (
104
- inputWrapperRef.current && !inputWrapperRef.current.contains(e.target) &&
105
- (dropdownContainerRef.current && !dropdownContainerRef.current.contains(e.target)) &&
106
- shouldClose
107
- ) {
108
- setIsDropDownClosed(true);
109
- setFocusedOptionIndex(-1);
110
- setIsInputFocused(false);
111
- }
112
- };
93
+ const handleClick = handleClickOutside({
94
+ inputWrapperRef,
95
+ dropdownContainerRef,
96
+ setIsDropDownClosed,
97
+ setFocusedOptionIndex,
98
+ setIsInputFocused,
99
+ });
113
100
 
114
- window.addEventListener("click", handleClickOutside);
101
+ window.addEventListener("click", handleClick);
115
102
  return () => {
116
- window.removeEventListener("click", handleClickOutside);
103
+ window.removeEventListener("click", handleClick);
117
104
  };
118
105
  }, []);
119
106
 
@@ -0,0 +1,10 @@
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
+ <%= pb_rails("dropdown", props: {options: options}) %>
@@ -24,13 +24,7 @@ const DropdownDefault = (props) => {
24
24
  <Dropdown
25
25
  options={options}
26
26
  {...props}
27
- >
28
- {options.map((option) => (
29
- <Dropdown.Option key={option.id}
30
- option={option}
31
- />
32
- ))}
33
- </Dropdown>
27
+ />
34
28
  </div>
35
29
  )
36
30
  }
@@ -1 +1 @@
1
- `options` for the Dropdown and `option` for the Dropdown.Option are the only required props for this kit. `options` must be an array of objects. Each object can contain any key/value pairs needed but 'label' and 'value' are required.
1
+ The Dropdown kit accepts an `options` array and renders each object from that array as a selectable option within a dropdown container. `options` is a required prop and must be an array of objects. Each object can contain as many key/value pairs as needed but MUST contain 'label' and 'value' as the only required items within each object.
@@ -0,0 +1,17 @@
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
+ <%= pb_rails("dropdown", props: {options: options}) do %>
11
+ <%= pb_rails("dropdown/dropdown_trigger") %>
12
+ <%= pb_rails("dropdown/dropdown_container") do %>
13
+ <% options.each do |option| %>
14
+ <%= pb_rails("dropdown/dropdown_option", props: {option: option}) %>
15
+ <% end %>
16
+ <% end %>
17
+ <% end %>
@@ -0,0 +1,42 @@
1
+ import React from 'react'
2
+ import { Dropdown } from '../..'
3
+
4
+ const DropdownSubcomponentStructure = (props) => {
5
+
6
+
7
+ const options = [
8
+ {
9
+ label: "United States",
10
+ value: "United States",
11
+ },
12
+ {
13
+ label: "Canada",
14
+ value: "Canada",
15
+ },
16
+ {
17
+ label: "Pakistan",
18
+ value: "Pakistan",
19
+ }
20
+ ];
21
+
22
+
23
+ return (
24
+ <div>
25
+ <Dropdown
26
+ options={options}
27
+ {...props}
28
+ >
29
+ <Dropdown.Trigger/>
30
+ <Dropdown.Container>
31
+ {options.map((option) => (
32
+ <Dropdown.Option key={option.id}
33
+ option={option}
34
+ />
35
+ ))}
36
+ </Dropdown.Container>
37
+ </Dropdown>
38
+ </div>
39
+ )
40
+ }
41
+
42
+ export default DropdownSubcomponentStructure
@@ -0,0 +1,7 @@
1
+ The dropdown comes with the following subcomponents that can be used to achieve various levels of customization:
2
+
3
+ `Dropdown. Trigger` / `dropdown/dropdown_trigger`
4
+ `Dropdown.Container`/ `dropdown/dropdown_container`
5
+ `Dropdown.Option` / `dropdown/dropdown_option`
6
+
7
+ See the code snippet below for a visual on how to use the kit with subcomponents. Each subcomponent allows for GlobalProps in addition to any subcomponent specfic props.
@@ -1,9 +1,7 @@
1
- import React, { useState } from 'react'
1
+ import React from 'react'
2
2
  import { Dropdown, User, Badge, FlexItem } from '../..'
3
3
 
4
4
  const DropdownWithAutocomplete = (props) => {
5
- // eslint-disable-next-line no-unused-vars
6
- const [selectedOption, setSelectedOption] = useState();
7
5
 
8
6
  const options = [
9
7
  {
@@ -18,7 +16,7 @@ const DropdownWithAutocomplete = (props) => {
18
16
  label: "Ramon Ruiz",
19
17
  value: "Ramon Ruiz",
20
18
  territory: "PHL",
21
- title: "Senior UX Desinger",
19
+ title: "Senior UX Designer",
22
20
  id: "ramon-ruiz",
23
21
  status: "Away"
24
22
  },
@@ -44,7 +42,6 @@ const DropdownWithAutocomplete = (props) => {
44
42
  return (
45
43
  <div>
46
44
  <Dropdown autocomplete
47
- onSelect={(selectedItem) => setSelectedOption(selectedItem)}
48
45
  options={options}
49
46
  {...props}
50
47
  >
@@ -2,7 +2,6 @@ import React, { useState } from 'react'
2
2
  import { Dropdown, User, Badge, FlexItem, Avatar } from '../..'
3
3
 
4
4
  const DropdownWithAutocompleteAndCustomDisplay = (props) => {
5
- // eslint-disable-next-line no-unused-vars
6
5
  const [selectedOption, setSelectedOption] = useState();
7
6
 
8
7
  const options = [
@@ -18,7 +17,7 @@ const DropdownWithAutocompleteAndCustomDisplay = (props) => {
18
17
  label: "Ramon Ruiz",
19
18
  value: "Ramon Ruiz",
20
19
  territory: "PHL",
21
- title: "Senior UX Desinger",
20
+ title: "Senior UX Designer",
22
21
  id: "ramon-ruiz",
23
22
  status: "Away"
24
23
  },