playbook_ui 7.8.3 → 7.11.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (142) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/playbook/application_controller.rb +5 -3
  3. data/app/helpers/playbook/application_helper.rb +13 -19
  4. data/app/helpers/playbook/pb_doc_helper.rb +41 -20
  5. data/app/helpers/playbook/pb_kit_helper.rb +1 -25
  6. data/app/helpers/playbook/pb_sample_helper.rb +24 -23
  7. data/app/pb_kits/playbook/_playbook.scss +0 -1
  8. data/app/pb_kits/playbook/config/_kit_example.html.erb +18 -4
  9. data/app/pb_kits/playbook/config/_kit_ui.html.erb +21 -21
  10. data/app/pb_kits/playbook/pb_currency/_currency.html.erb +1 -1
  11. data/app/pb_kits/playbook/pb_currency/_currency.jsx +16 -1
  12. data/app/pb_kits/playbook/pb_currency/_currency.scss +23 -1
  13. data/app/pb_kits/playbook/pb_currency/currency.rb +22 -0
  14. data/app/pb_kits/playbook/pb_currency/docs/{_currency_small.html.erb → _currency_alignment.html.erb} +3 -3
  15. data/app/pb_kits/playbook/pb_currency/docs/{_currency_small.jsx → _currency_alignment.jsx} +5 -5
  16. data/app/pb_kits/playbook/pb_currency/docs/_currency_no_symbol.html.erb +7 -0
  17. data/app/pb_kits/playbook/pb_currency/docs/_currency_no_symbol.jsx +17 -0
  18. data/app/pb_kits/playbook/pb_currency/docs/{_currency_large.html.erb → _currency_size.html.erb} +8 -7
  19. data/app/pb_kits/playbook/pb_currency/docs/{_currency_large.jsx → _currency_size.jsx} +9 -8
  20. data/app/pb_kits/playbook/pb_currency/docs/_currency_variants.html.erb +24 -0
  21. data/app/pb_kits/playbook/pb_currency/docs/{_currency_medium.jsx → _currency_variants.jsx} +13 -10
  22. data/app/pb_kits/playbook/pb_currency/docs/example.yml +8 -6
  23. data/app/pb_kits/playbook/pb_currency/docs/index.js +4 -3
  24. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_anti_patterns.html.erb +23 -0
  25. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_default_date.html.erb +4 -4
  26. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_default_date.jsx +2 -2
  27. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_default_date.md +3 -1
  28. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_disabled.html.erb +8 -8
  29. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_flatpickr_methods.html.erb +27 -0
  30. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_flatpickr_methods.jsx +44 -0
  31. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_format.html.erb +4 -4
  32. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_min_max.html.erb +2 -2
  33. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_range.html.erb +1 -1
  34. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_range.jsx +1 -1
  35. data/app/pb_kits/playbook/pb_date_picker/docs/_description.md +4 -2
  36. data/app/pb_kits/playbook/pb_date_picker/docs/example.yml +3 -1
  37. data/app/pb_kits/playbook/pb_date_picker/docs/index.js +1 -0
  38. data/app/pb_kits/playbook/pb_filter/Filter/FilterDouble.jsx +20 -3
  39. data/app/pb_kits/playbook/pb_filter/Filter/FilterSingle.jsx +51 -31
  40. data/app/pb_kits/playbook/pb_filter/Filter/FiltersPopover.jsx +3 -4
  41. data/app/pb_kits/playbook/pb_filter/Filter/SortMenu.jsx +2 -2
  42. data/app/pb_kits/playbook/pb_filter/Filter/index.jsx +17 -16
  43. data/app/pb_kits/playbook/pb_filter/_filter.html.erb +1 -1
  44. data/app/pb_kits/playbook/pb_filter/_filter.scss +0 -2
  45. data/app/pb_kits/playbook/pb_filter/docs/_filter_min_width.html.erb +41 -0
  46. data/app/pb_kits/playbook/pb_filter/docs/_filter_min_width.jsx +57 -0
  47. data/app/pb_kits/playbook/pb_filter/docs/_filter_no_background.jsx +0 -41
  48. data/app/pb_kits/playbook/pb_filter/docs/_filter_no_background.md +1 -0
  49. data/app/pb_kits/playbook/pb_filter/docs/_filter_no_sort.html.erb +35 -0
  50. data/app/pb_kits/playbook/pb_filter/docs/_filter_no_sort.jsx +47 -0
  51. data/app/pb_kits/playbook/pb_filter/docs/_filter_no_sort.md +1 -0
  52. data/app/pb_kits/playbook/pb_filter/docs/_filter_only.html.erb +1 -1
  53. data/app/pb_kits/playbook/pb_filter/docs/_filter_single.html.erb +1 -1
  54. data/app/pb_kits/playbook/pb_filter/docs/example.yml +4 -0
  55. data/app/pb_kits/playbook/pb_filter/docs/index.js +2 -0
  56. data/app/pb_kits/playbook/pb_filter/filter.rb +1 -0
  57. data/app/pb_kits/playbook/pb_filter/templates/_core.html.erb +9 -9
  58. data/app/pb_kits/playbook/pb_filter/templates/_default.html.erb +1 -1
  59. data/app/pb_kits/playbook/pb_nav/_horizontal_nav.scss +22 -0
  60. data/app/pb_kits/playbook/pb_nav/_item.jsx +3 -0
  61. data/app/pb_kits/playbook/pb_nav/_subtle_mixin.scss +47 -0
  62. data/app/pb_kits/playbook/pb_nav/_vertical_nav.scss +2 -46
  63. data/app/pb_kits/playbook/pb_nav/docs/_new_tab.html.erb +6 -0
  64. data/app/pb_kits/playbook/pb_nav/docs/_new_tab.jsx +34 -0
  65. data/app/pb_kits/playbook/pb_nav/docs/_subtle_horizontal_nav.html.erb +6 -0
  66. data/app/pb_kits/playbook/pb_nav/docs/_subtle_horizontal_nav.jsx +33 -0
  67. data/app/pb_kits/playbook/pb_nav/docs/example.yml +4 -1
  68. data/app/pb_kits/playbook/pb_nav/docs/index.js +2 -0
  69. data/app/pb_kits/playbook/pb_nav/item.rb +5 -2
  70. data/app/pb_kits/playbook/pb_radio/_radio.jsx +4 -3
  71. data/app/pb_kits/playbook/pb_radio/docs/_radio_default.jsx +3 -0
  72. data/app/pb_kits/playbook/pb_radio/docs/index.js +1 -0
  73. data/app/pb_kits/playbook/pb_radio/radio.test.js +71 -0
  74. data/app/pb_kits/playbook/pb_rich_text_editor/_rich_text_editor.scss +1 -0
  75. data/app/pb_kits/playbook/pb_rich_text_editor/_trix_styles.scss +375 -0
  76. data/app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_preview.html.erb +25 -0
  77. data/app/pb_kits/playbook/pb_rich_text_editor/docs/_rich_text_editor_preview.jsx +45 -0
  78. data/app/pb_kits/playbook/pb_rich_text_editor/docs/example.yml +3 -1
  79. data/app/pb_kits/playbook/pb_rich_text_editor/docs/index.js +1 -0
  80. data/app/pb_kits/playbook/pb_select/_select.jsx +4 -3
  81. data/app/pb_kits/playbook/pb_select/select.test.js +51 -0
  82. data/app/pb_kits/playbook/pb_stat_change/_stat_change.html.erb +1 -1
  83. data/app/pb_kits/playbook/pb_stat_change/_stat_change.jsx +8 -4
  84. data/app/pb_kits/playbook/pb_stat_change/docs/_stat_change_default.html.erb +1 -1
  85. data/app/pb_kits/playbook/pb_stat_change/docs/_stat_change_unit.html.erb +17 -0
  86. data/app/pb_kits/playbook/pb_stat_change/docs/_stat_change_unit.jsx +28 -0
  87. data/app/pb_kits/playbook/pb_stat_change/docs/_stat_change_unit_two.html.erb +20 -0
  88. data/app/pb_kits/playbook/pb_stat_change/docs/_stat_change_unit_two.jsx +31 -0
  89. data/app/pb_kits/playbook/pb_stat_change/docs/_stat_change_unit_two.md +1 -0
  90. data/app/pb_kits/playbook/pb_stat_change/docs/example.yml +6 -4
  91. data/app/pb_kits/playbook/pb_stat_change/docs/index.js +2 -0
  92. data/app/pb_kits/playbook/pb_stat_change/stat_change.rb +12 -7
  93. data/app/pb_kits/playbook/pb_table/_table.scss +1 -57
  94. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_shift_row.html.erb +1 -1
  95. data/app/pb_kits/playbook/pb_table/docs/_table_alignment_shift_row.jsx +1 -1
  96. data/app/pb_kits/playbook/pb_table/styles/_alignment.scss +32 -0
  97. data/app/pb_kits/playbook/pb_table/styles/_all.scss +4 -3
  98. data/app/pb_kits/playbook/pb_table/styles/_side_highlight.scss +24 -0
  99. data/app/pb_kits/playbook/pb_text_input/_text_input.jsx +8 -4
  100. data/app/pb_kits/playbook/pb_text_input/docs/_description.md +2 -1
  101. data/app/pb_kits/playbook/pb_text_input/docs/_text_input_custom.jsx +7 -1
  102. data/app/pb_kits/playbook/pb_text_input/docs/_text_input_default.jsx +78 -56
  103. data/app/pb_kits/playbook/pb_text_input/docs/_text_input_error.jsx +19 -11
  104. data/app/pb_kits/playbook/pb_text_input/text_input.test.js +77 -0
  105. data/app/pb_kits/playbook/pb_textarea/_textarea.jsx +5 -5
  106. data/app/pb_kits/playbook/pb_tooltip/_tooltip.scss +10 -7
  107. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_default.html.erb +4 -4
  108. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_selectors.html.erb +17 -0
  109. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_selectors.md +3 -0
  110. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_white.html.erb +1 -1
  111. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_with_icon_circle.html.erb +10 -0
  112. data/app/pb_kits/playbook/pb_tooltip/docs/example.yml +2 -0
  113. data/app/pb_kits/playbook/pb_tooltip/index.js +87 -37
  114. data/app/pb_kits/playbook/pb_tooltip/tooltip.rb +3 -1
  115. data/app/pb_kits/playbook/pb_typeahead/_typeahead.jsx +5 -1
  116. data/app/pb_kits/playbook/pb_typeahead/components/Option.jsx +2 -3
  117. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_pills_async.html.erb +19 -3
  118. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_pills_async.jsx +4 -2
  119. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_with_pills_async.md +10 -2
  120. data/app/pb_kits/playbook/pb_typeahead/typeahead.rb +5 -0
  121. data/app/pb_kits/playbook/react_rails_kits.js +1 -0
  122. data/lib/playbook.rb +6 -17
  123. data/lib/playbook/engine.rb +0 -3
  124. data/{app/pb_kits → lib}/playbook/props.rb +0 -0
  125. data/{app/pb_kits → lib}/playbook/props/array.rb +0 -0
  126. data/{app/pb_kits → lib}/playbook/props/base.rb +19 -3
  127. data/{app/pb_kits → lib}/playbook/props/boolean.rb +0 -0
  128. data/{app/pb_kits → lib}/playbook/props/date.rb +0 -0
  129. data/{app/pb_kits → lib}/playbook/props/enum.rb +0 -0
  130. data/{app/pb_kits → lib}/playbook/props/hash.rb +0 -0
  131. data/{app/pb_kits → lib}/playbook/props/hash_array.rb +0 -0
  132. data/{app/pb_kits → lib}/playbook/props/number.rb +0 -0
  133. data/{app/pb_kits → lib}/playbook/props/number_array.rb +0 -0
  134. data/{app/pb_kits → lib}/playbook/props/numeric.rb +0 -0
  135. data/{app/pb_kits → lib}/playbook/props/percentage.rb +0 -0
  136. data/{app/pb_kits → lib}/playbook/props/proc.rb +0 -0
  137. data/{app/pb_kits → lib}/playbook/props/string.rb +0 -0
  138. data/lib/playbook/version.rb +1 -1
  139. metadata +59 -28
  140. data/app/helpers/playbook/layout_helper.rb +0 -9
  141. data/app/pb_kits/playbook/pb_currency/docs/_currency_medium.html.erb +0 -21
  142. data/app/pb_kits/playbook/pb_table/styles/_mixins.scss +0 -0
@@ -24,9 +24,11 @@ $tooltip_shadow: rgba(60, 106, 172, 0.18);
24
24
 
25
25
  [class^="pb_tooltip_kit"] {
26
26
  .tooltip_tooltip {
27
- display: none;
27
+ display: block;
28
28
  opacity: 0;
29
- left: 0;
29
+ position: absolute;
30
+ left: -9999px;
31
+ top: 0;
30
32
  animation-name: fadeIn;
31
33
  animation-duration: 150ms;
32
34
  animation-timing-function: linear;
@@ -49,11 +51,9 @@ $tooltip_shadow: rgba(60, 106, 172, 0.18);
49
51
  border-style: solid;
50
52
  border-width: 10px;
51
53
  margin-bottom: 50px;
52
- margin-left: -10px;
53
54
  }
54
55
  &.show {
55
56
  opacity: 1;
56
- display: block;
57
57
  z-index: $z_9;
58
58
  margin-bottom: $space_sm;
59
59
  background-color: $white;
@@ -89,12 +89,14 @@ $tooltip_shadow: rgba(60, 106, 172, 0.18);
89
89
 
90
90
  // Right
91
91
  [class^="pb_tooltip_kit"] .tooltip_tooltip {
92
+ $arrow_vertical_offset: calc(50% - #{$space_xs * 1.2});
92
93
 
93
- &[x-placement="right"] {
94
+ &[data-popper-placement="right"] {
94
95
  box-shadow: -8px 0 28px 0 $tooltip_shadow;
95
96
  margin: 0 0 0 $space_sm;
96
97
  .arrow {
97
98
  left: -#{$space_xs};
99
+ top: $arrow_vertical_offset;
98
100
  margin-bottom: 0;
99
101
  transform: rotate(90deg);
100
102
  }
@@ -103,7 +105,7 @@ $tooltip_shadow: rgba(60, 106, 172, 0.18);
103
105
  }
104
106
  }
105
107
 
106
- &[x-placement="bottom"] {
108
+ &[data-popper-placement="bottom"] {
107
109
  box-shadow: 0 -12px 28px 0 $tooltip_shadow;
108
110
  margin: $space_sm 0 0 0;
109
111
  .arrow {
@@ -116,13 +118,14 @@ $tooltip_shadow: rgba(60, 106, 172, 0.18);
116
118
  }
117
119
  }
118
120
 
119
- &[x-placement="left"] {
121
+ &[data-popper-placement="left"] {
120
122
  box-shadow: 8px 0 28px 0 $tooltip_shadow;
121
123
  margin: 0 $space_sm 0 0;
122
124
  .arrow {
123
125
  margin-bottom: 0;
124
126
  right: -18px;
125
127
  left: auto;
128
+ top: $arrow_vertical_offset;
126
129
  transform: rotate(270deg);
127
130
  }
128
131
  &.flipped .arrow {
@@ -3,7 +3,7 @@
3
3
  <span id='regular-tooltip-1'>Hover here (Top)</span>
4
4
 
5
5
  <%= pb_rails("tooltip", props: {
6
- trigger_element_id: "regular-tooltip-1",
6
+ trigger_element_selector: "#regular-tooltip-1",
7
7
  tooltip_id: "tooltip-1",
8
8
  position: 'top'
9
9
  }) do %>
@@ -14,7 +14,7 @@
14
14
  <%= pb_rails("flex/flex_item", props: {margin_top: "md"}) do %>
15
15
  <span id='regular-tooltip-2'>Hover here (Bottom)</span>
16
16
  <%= pb_rails("tooltip", props: {
17
- trigger_element_id: "regular-tooltip-2",
17
+ trigger_element_selector: "#regular-tooltip-2",
18
18
  tooltip_id: "tooltip-2",
19
19
  position: 'bottom'
20
20
  }) do %>
@@ -25,7 +25,7 @@
25
25
  <%= pb_rails("flex/flex_item", props: {margin_top: "md"}) do %>
26
26
  <span id='regular-tooltip-3'>Hover here (Right)</span>
27
27
  <%= pb_rails("tooltip", props: {
28
- trigger_element_id: "regular-tooltip-3",
28
+ trigger_element_selector: "#regular-tooltip-3",
29
29
  tooltip_id: "tooltip-3",
30
30
  position: 'right'
31
31
  }) do %>
@@ -36,7 +36,7 @@
36
36
  <%= pb_rails("flex/flex_item", props: {margin_top: "md"}) do %>
37
37
  <span id='regular-tooltip-4'>Hover here (Left)</span>
38
38
  <%= pb_rails("tooltip", props: {
39
- trigger_element_id: "regular-tooltip-4",
39
+ trigger_element_selector: "#regular-tooltip-4",
40
40
  tooltip_id: "tooltip-4",
41
41
  position: 'left'
42
42
  }) do %>
@@ -0,0 +1,17 @@
1
+ <%= pb_rails("flex", props: { horizontal: "center", orientation: "column" }) do %>
2
+ <%= pb_rails("flex/flex_item", props: {margin_top: "md"}) do %>
3
+ <%= pb_rails("button", props: {classname: "tooltip-example-trigger", text: "Example 1"}) %>
4
+ <% end %>
5
+
6
+ <%= pb_rails("flex/flex_item", props: {margin_top: "md"}) do %>
7
+ <%= pb_rails("button", props: {classname: "tooltip-example-trigger", text: "Example 1"}) %>
8
+ <% end %>
9
+
10
+ <%= pb_rails("tooltip", props: {
11
+ trigger_element_selector: ".tooltip-example-trigger",
12
+ tooltip_id: "example-tooltip",
13
+ position: 'top'
14
+ }) do %>
15
+ Whoa. I'm a re-useable tooltip.
16
+ <% end %>
17
+ <% end %>
@@ -0,0 +1,3 @@
1
+ ## Re-using Tooltip Instances
2
+
3
+ You can re-use Tooltip by sending `trigger_element_selector` as a HTML `class=` attribute.
@@ -6,4 +6,4 @@
6
6
  position: 'top'
7
7
  }) do %>
8
8
  Whoa. I'm a white tooltip.
9
- <% end %>
9
+ <% end %>
@@ -0,0 +1,10 @@
1
+ <%= pb_rails("icon_circle", props: { icon: "paper-plane", id: "result-1-sample-email-link" }) %>
2
+
3
+ <%= pb_rails("tooltip", props: {
4
+ trigger_element_id: "result-1-sample-email-link",
5
+ tooltip_id: "sample-email-tooltip-result-1",
6
+ position: "top",
7
+ dark: true
8
+ }) do %>
9
+ Send Email
10
+ <% end %>
@@ -2,4 +2,6 @@ examples:
2
2
 
3
3
  rails:
4
4
  - tooltip_default: Default
5
+ - tooltip_selectors: Using Common Selectors
5
6
  - tooltip_white: White
7
+ - tooltip_with_icon_circle: Icon Circle Tooptip
@@ -1,7 +1,13 @@
1
1
  import PbEnhancedElement from '../pb_enhanced_element'
2
- import Popper from 'popper.js'
3
2
 
4
- const TOOLTIP_OFFSET = '0,0'
3
+ import {
4
+ createPopperLite as createPopper,
5
+ flip,
6
+ offset,
7
+ preventOverflow,
8
+ } from '@popperjs/core'
9
+
10
+ const TOOLTIP_OFFSET = [0, 20]
5
11
  const TOOLTIP_TIMEOUT = 250
6
12
 
7
13
  export default class PbTooltip extends PbEnhancedElement {
@@ -10,56 +16,96 @@ export default class PbTooltip extends PbEnhancedElement {
10
16
  }
11
17
 
12
18
  connect() {
13
- this.popper = new Popper(this.triggerElement, this.tooltip, {
14
- placement: this.position,
15
- modifiers: {
16
- offset: {
17
- offset: TOOLTIP_OFFSET,
18
- },
19
- arrow: {
20
- element: `#${this.tooltipId}-arrow`,
21
- },
22
- },
23
- onUpdate: (p) => {
24
- p.instance.popper.classList.toggle('flipped', p.flipped)
25
- },
26
- })
19
+ this.triggerElements.forEach((trigger) => {
20
+ trigger.addEventListener('mouseenter', () => {
21
+ this.mouseenterTimeout = setTimeout(() => {
22
+ this.showTooltip(trigger)
23
+ this.checkCloseTooltip(trigger)
24
+ }, TOOLTIP_TIMEOUT)
27
25
 
28
- this.tooltip.addEventListener('mouseleave', () => {
29
- this.hideTooltip()
30
- })
31
-
32
- this.triggerElement.addEventListener('mouseenter', () => {
33
- this.mouseenterTimeout = setTimeout(() => {
34
- this.popper.scheduleUpdate()
35
- this.showTooltip()
36
- }, TOOLTIP_TIMEOUT)
26
+ trigger.addEventListener('mouseleave', () => {
27
+ clearTimeout(this.mouseenterTimeout)
37
28
 
38
- this.triggerElement.addEventListener('mouseleave', (event) => {
39
- clearTimeout(this.mouseenterTimeout)
40
- if (event.target.closest(`#${this.tooltipId}`) !== this.tooltip) {
41
29
  setTimeout(() => {
42
30
  this.hideTooltip()
43
31
  }, 0)
44
- }
45
- }, { once: true })
32
+ }, { once: true })
33
+ })
34
+ })
35
+
36
+ this.tooltip.addEventListener('mouseenter', () => {
37
+ clearTimeout(this.mouseenterTimeout)
46
38
  })
39
+ this.tooltip.addEventListener('mouseleave', () => {
40
+ this.hideTooltip()
41
+ })
42
+ }
43
+
44
+ checkCloseTooltip(trigger) {
45
+ document.querySelector('body').addEventListener('click', ({ target }) => {
46
+ const isTooltip = target.closest(`#${this.tooltipId}`) === this.tooltip
47
+ const isTrigger = target.closest(this.triggerElementSelector) === trigger
48
+ if (isTrigger || isTooltip) {
49
+ this.checkCloseTooltip(trigger)
50
+ } else {
51
+ this.hideTooltip()
52
+ }
53
+ }, { once: true })
47
54
  }
48
55
 
49
- showTooltip() {
56
+ showTooltip(trigger) {
57
+ this.popper = createPopper(trigger, this.tooltip, {
58
+ placement: this.position,
59
+ modifiers: [
60
+ {
61
+ name: 'offset',
62
+ options: {
63
+ offset: TOOLTIP_OFFSET,
64
+ },
65
+ },
66
+ {
67
+ name: 'arrow',
68
+ options: {
69
+ element: document.querySelector(`#${this.tooltipId}-arrow`),
70
+ },
71
+ },
72
+ offset,
73
+ preventOverflow,
74
+ flip,
75
+ ],
76
+ })
50
77
  this.tooltip.classList.add('show')
51
78
  }
52
79
 
53
80
  hideTooltip() {
54
- this.tooltip.classList.remove('show')
81
+ this.tooltip.classList.add('fade_out')
82
+ setTimeout(() => {
83
+ if (!this.popper) return
84
+ this.popper.destroy()
85
+ this.tooltip.classList.remove('show')
86
+ this.tooltip.classList.remove('fade_out')
87
+ }, TOOLTIP_TIMEOUT)
55
88
  }
56
89
 
57
- toggleTooltip() {
58
- this.tooltip.classList.toggle('show')
59
- }
90
+ get triggerElements() {
91
+ let triggerEl
92
+
93
+ if (this.triggerElementId) {
94
+ triggerEl = document.querySelector(`#${this.triggerElementId}`) //deprecated
95
+ } else {
96
+ const selectorIsId = this.triggerElementSelector.indexOf('#') > -1
97
+ triggerEl = selectorIsId ? document.querySelector(`${this.triggerElementSelector}`) :
98
+ document.querySelectorAll(`${this.triggerElementSelector}`)
99
+ }
60
100
 
61
- get triggerElement() {
62
- return this._triggerElement = (this._triggerElement || document.querySelector(`#${this.triggerElementId}`))
101
+ if (!triggerEl) {
102
+ /* eslint no-console: ["error", { allow: ["warn", "error"] }] */
103
+ console.error('Tooltip Kit: an invalid or unavailable DOM reference was provided!')
104
+ return []
105
+ }
106
+
107
+ if (!triggerEl.length) triggerEl = [triggerEl]
108
+ return this._triggerElements = (this._triggerElements || triggerEl)
63
109
  }
64
110
 
65
111
  get tooltip() {
@@ -77,4 +123,8 @@ export default class PbTooltip extends PbEnhancedElement {
77
123
  get tooltipId() {
78
124
  return this.element.dataset.pbTooltipTooltipId
79
125
  }
126
+
127
+ get triggerElementSelector() {
128
+ return this.element.dataset.pbTooltipTriggerElementSelector
129
+ }
80
130
  }
@@ -7,7 +7,8 @@ module Playbook
7
7
  partial "pb_tooltip/tooltip"
8
8
 
9
9
  prop :position
10
- prop :trigger_element_id
10
+ prop :trigger_element_selector
11
+ prop :trigger_element_id, deprecated: true
11
12
  prop :tooltip_id
12
13
  prop :dark, type: Playbook::Props::Boolean,
13
14
  default: false
@@ -20,6 +21,7 @@ module Playbook
20
21
  Hash(values[:data]).merge(
21
22
  pb_tooltip_kit: true,
22
23
  pb_tooltip_position: position,
24
+ pb_tooltip_trigger_element_selector: trigger_element_selector,
23
25
  pb_tooltip_trigger_element_id: trigger_element_id,
24
26
  pb_tooltip_tooltip_id: tooltip_id,
25
27
  )
@@ -27,6 +27,8 @@ type Props = {
27
27
  async?: boolean,
28
28
  label?: string,
29
29
  loadOptions?: noop | string,
30
+ getOptionLabel?: () => any,
31
+ getOptionValue?: () => any,
30
32
  name?: string,
31
33
  }
32
34
 
@@ -38,7 +40,6 @@ type Props = {
38
40
  const Typeahead = (props: Props) => {
39
41
  const selectProps = {
40
42
  cacheOptions: true,
41
- defaultOptions: true,
42
43
  components: {
43
44
  Control,
44
45
  ClearIndicator,
@@ -50,6 +51,7 @@ const Typeahead = (props: Props) => {
50
51
  Placeholder,
51
52
  ValueContainer,
52
53
  },
54
+ defaultOptions: true,
53
55
  id: 'react-select-input',
54
56
  isClearable: true,
55
57
  isSearchable: true,
@@ -58,6 +60,8 @@ const Typeahead = (props: Props) => {
58
60
  }
59
61
 
60
62
  if (typeof(props.loadOptions) === 'string') selectProps.loadOptions = get(window, props.loadOptions)
63
+ if (typeof(props.getOptionLabel) === 'string') selectProps.getOptionLabel = get(window, props.getOptionLabel)
64
+ if (typeof(props.getOptionValue) === 'string') selectProps.getOptionValue = get(window, props.getOptionValue)
61
65
 
62
66
  const Tag = props.async ? AsyncSelect : Select
63
67
 
@@ -10,7 +10,6 @@ import {
10
10
  const Option = (props: any) => {
11
11
  const {
12
12
  imageUrl,
13
- label,
14
13
  } = props.data
15
14
 
16
15
  return (
@@ -21,12 +20,12 @@ const Option = (props: any) => {
21
20
  <User
22
21
  align="left"
23
22
  avatarUrl={imageUrl}
24
- name={label}
23
+ name={props.label}
25
24
  orientation="horizontal"
26
25
  />
27
26
  </When>
28
27
  <When condition={!imageUrl}>
29
- {label}
28
+ {props.label}
30
29
  </When>
31
30
  </Choose>
32
31
  </div>
@@ -1,4 +1,13 @@
1
- <%= pb_rails("typeahead", props: { async: true, load_options: 'asyncPillsPromiseOptions', label: "Github Users", name: :foo, pills: true, placeholder: "type the name of a Github user" }) %>
1
+ <%= pb_rails("typeahead", props: {
2
+ async: true,
3
+ get_option_label: 'getOptionLabel',
4
+ get_option_value: 'getOptionValue',
5
+ load_options: 'asyncPillsPromiseOptions',
6
+ label: "Github Users",
7
+ name: :foo,
8
+ pills: true,
9
+ placeholder: "type the name of a Github user"
10
+ }) %>
2
11
 
3
12
  <!-- This section is an example of how to provide load_options prop for using dynamic options -->
4
13
  <%= javascript_tag defer: "defer" do %>
@@ -7,8 +16,8 @@
7
16
  const filterResults = function(results) {
8
17
  return results.items.map(function(result) {
9
18
  return {
10
- label: result.login,
11
- value: result.id,
19
+ name: result.login,
20
+ id: result.id,
12
21
  }
13
22
  })
14
23
  }
@@ -27,4 +36,11 @@
27
36
  }
28
37
  })
29
38
  }
39
+
40
+ window.getOptionLabel = function(option) {
41
+ return option.name;
42
+ }
43
+ window.getOptionValue = function(option) {
44
+ return option.id;
45
+ }
30
46
  <% end %>
@@ -20,8 +20,8 @@ import {
20
20
  const filterResults = (results) =>
21
21
  results.items.map((result) => {
22
22
  return {
23
- label: result.login,
24
- value: result.id,
23
+ name: result.login,
24
+ id: result.id,
25
25
  }
26
26
  })
27
27
 
@@ -71,6 +71,8 @@ const TypeaheadWithPillsAsync = () => {
71
71
  </If>
72
72
  <Typeahead
73
73
  async
74
+ getOptionLabel={(option) => option.name}
75
+ getOptionValue={(option) => option.id}
74
76
  isMulti
75
77
  label="Github Users"
76
78
  loadOptions={promiseOptions}
@@ -4,8 +4,16 @@
4
4
 
5
5
  The prop `load_options`, when used in conjunction with `async: true` and `pills: true`, points to a JavaScript function located within the global window namespace. This function should return a `Promise` which resolves with the list of formatted options as described in prior examples above. This function is identical to the function provided to the React version of this kit. See the code example for more details.
6
6
 
7
- #### React: `loadOptions`
7
+ #### React
8
+
9
+ ##### `loadOptions`
8
10
 
9
11
  **Additional required props: ** `async: true`
10
12
 
11
- [As outlined in the react-select Async docs](https://react-select.com/async), `loadOptions` expects to return a Promise that resolves resolves with the list of formatted options as described in prior examples above. See the code example for more details.
13
+ [As outlined in the react-select Async docs](https://react-select.com/async), `loadOptions` expects to return a Promise that resolves resolves with the list of formatted options as described in prior examples above. See the code example for more details.
14
+
15
+ ##### `getOptionLabel` + `getOptionValue`
16
+
17
+ If your server returns data that requires differing field names other than `label` and `value`
18
+
19
+ See `react-select` docs for more information: https://react-select.com/advanced#replacing-builtins