playbook_ui 15.6.0 → 15.7.0.pre.alpha.PLAY2678emojimask13284

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 (202) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/_playbook.scss +1 -1
  3. data/app/pb_kits/playbook/pb_advanced_table/Components/RegularTableView.tsx +3 -2
  4. data/app/pb_kits/playbook/pb_advanced_table/Components/TableHeaderCell.tsx +4 -0
  5. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.test.jsx +95 -0
  6. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_background_colors_rails.html.erb +43 -0
  7. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_background_colors_rails.md +1 -0
  8. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_background_control_rails.html.erb +11 -5
  9. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_background_control_rails.md +7 -1
  10. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_background.jsx +54 -0
  11. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_background.md +9 -0
  12. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_background_multi.jsx +80 -0
  13. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_background_multi.md +3 -0
  14. data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +4 -1
  15. data/app/pb_kits/playbook/pb_advanced_table/docs/index.js +3 -1
  16. data/app/pb_kits/playbook/pb_advanced_table/table_header.html.erb +2 -2
  17. data/app/pb_kits/playbook/pb_advanced_table/table_header.rb +57 -0
  18. data/app/pb_kits/playbook/pb_bar_graph/_bar_graph.tsx +6 -0
  19. data/app/pb_kits/playbook/pb_card/docs/_card_header.md +1 -1
  20. data/app/pb_kits/playbook/pb_card/docs/_card_highlight.md +1 -1
  21. data/app/pb_kits/playbook/pb_circle_chart/_circle_chart.tsx +6 -0
  22. data/app/pb_kits/playbook/pb_collapsible/__snapshots__/collapsible.test.js.snap +2 -2
  23. data/app/pb_kits/playbook/pb_collapsible/child_kits/CollapsibleIcon.tsx +10 -8
  24. data/app/pb_kits/playbook/pb_collapsible/docs/_collapsible_icons.jsx +0 -1
  25. data/app/pb_kits/playbook/pb_collapsible/docs/_collapsible_state.jsx +0 -3
  26. data/app/pb_kits/playbook/pb_contact/_contact.tsx +51 -24
  27. data/app/pb_kits/playbook/pb_contact/contact.html.erb +53 -19
  28. data/app/pb_kits/playbook/pb_contact/contact.rb +11 -1
  29. data/app/pb_kits/playbook/pb_contact/contact.test.js +76 -0
  30. data/app/pb_kits/playbook/pb_contact/docs/_contact_unstyled.html.erb +33 -0
  31. data/app/pb_kits/playbook/pb_contact/docs/_contact_unstyled.jsx +46 -0
  32. data/app/pb_kits/playbook/pb_contact/docs/_contact_unstyled_rails.md +2 -0
  33. data/app/pb_kits/playbook/pb_contact/docs/_contact_unstyled_react.md +2 -0
  34. data/app/pb_kits/playbook/pb_contact/docs/example.yml +2 -0
  35. data/app/pb_kits/playbook/pb_contact/docs/index.js +1 -0
  36. data/app/pb_kits/playbook/pb_date_picker/date_picker.test.js +24 -0
  37. data/app/pb_kits/playbook/pb_date_picker/date_picker_helper.ts +197 -7
  38. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_range_pattern_rails.html.erb +23 -14
  39. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_range_pattern_rails.md +1 -1
  40. data/app/pb_kits/playbook/pb_dialog/_dialog.tsx +2 -1
  41. data/app/pb_kits/playbook/pb_dialog/dialog.html.erb +1 -1
  42. data/app/pb_kits/playbook/pb_dialog/dialog.rb +1 -0
  43. data/app/pb_kits/playbook/pb_dialog/dialog.test.jsx +14 -0
  44. data/app/pb_kits/playbook/pb_dialog/dialog_header.html.erb +5 -4
  45. data/app/pb_kits/playbook/pb_dialog/dialog_header.rb +2 -0
  46. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_closeable.html.erb +24 -0
  47. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_closeable.jsx +60 -0
  48. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_closeable.md +3 -0
  49. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_overflow_visible.html.erb +71 -0
  50. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_overflow_visible.jsx +57 -0
  51. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_overflow_visible_rails.md +1 -0
  52. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_overflow_visible_react.md +1 -0
  53. data/app/pb_kits/playbook/pb_dialog/docs/example.yml +4 -0
  54. data/app/pb_kits/playbook/pb_dialog/docs/index.js +3 -1
  55. data/app/pb_kits/playbook/pb_distribution_bar/docs/_distribution_bar_custom_colors.md +1 -1
  56. data/app/pb_kits/playbook/pb_draggable/context/index.tsx +316 -15
  57. data/app/pb_kits/playbook/pb_draggable/context/types.ts +1 -1
  58. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_default_rails.html.erb +7 -5
  59. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_quickpick_default_dates.html.erb +19 -0
  60. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_quickpick_rails.html.erb +12 -0
  61. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_quickpick_rails.md +26 -0
  62. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_quickpick_range_end_rails.html.erb +19 -0
  63. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_quickpick_range_end_rails.md +1 -0
  64. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_quickpick_with_date_pickers_default_rails.html.erb +30 -0
  65. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_quickpick_with_date_pickers_default_rails.md +3 -0
  66. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_quickpick_with_date_pickers_rails.html.erb +29 -0
  67. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_quickpick_with_date_pickers_rails.md +13 -0
  68. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_display_rails.html.erb +3 -1
  69. data/app/pb_kits/playbook/pb_dropdown/docs/example.yml +5 -0
  70. data/app/pb_kits/playbook/pb_dropdown/dropdown.html.erb +4 -0
  71. data/app/pb_kits/playbook/pb_dropdown/dropdown.rb +39 -5
  72. data/app/pb_kits/playbook/pb_dropdown/index.js +171 -3
  73. data/app/pb_kits/playbook/pb_dropdown/quickpick_helper.rb +75 -0
  74. data/app/pb_kits/playbook/pb_filter/Filter/FilterBackground.tsx +3 -3
  75. data/app/pb_kits/playbook/pb_form/docs/_form_form_with.html.erb +3 -3
  76. data/app/pb_kits/playbook/pb_form/docs/_form_form_with_validate.html.erb +2 -1
  77. data/app/pb_kits/playbook/pb_form/docs/_form_with_required_indicator.html.erb +14 -0
  78. data/app/pb_kits/playbook/pb_form/docs/_form_with_required_indicator.md +3 -0
  79. data/app/pb_kits/playbook/pb_form/docs/example.yml +1 -0
  80. data/app/pb_kits/playbook/pb_gauge/_gauge.tsx +6 -0
  81. data/app/pb_kits/playbook/pb_line_graph/_line_graph.tsx +6 -0
  82. data/app/pb_kits/playbook/pb_popover/docs/_popover_append_to.html.erb +2 -2
  83. data/app/pb_kits/playbook/pb_popover/docs/_popover_append_to.jsx +3 -2
  84. data/app/pb_kits/playbook/pb_radio/docs/_radio_error.md +1 -1
  85. data/app/pb_kits/playbook/pb_select/_select.tsx +8 -3
  86. data/app/pb_kits/playbook/pb_select/docs/_select_error.md +1 -1
  87. data/app/pb_kits/playbook/pb_select/docs/_select_input_options.html.erb +16 -0
  88. data/app/pb_kits/playbook/pb_select/docs/_select_input_options.jsx +30 -0
  89. data/app/pb_kits/playbook/pb_select/docs/_select_input_options.md +1 -0
  90. data/app/pb_kits/playbook/pb_select/docs/example.yml +2 -0
  91. data/app/pb_kits/playbook/pb_select/docs/index.js +1 -0
  92. data/app/pb_kits/playbook/pb_select/select.html.erb +2 -2
  93. data/app/pb_kits/playbook/pb_select/select.rb +3 -1
  94. data/app/pb_kits/playbook/pb_select/select.test.js +23 -0
  95. data/app/pb_kits/playbook/pb_table/_table.tsx +187 -33
  96. data/app/pb_kits/playbook/pb_table/docs/_table_with_filter_variant.jsx +134 -0
  97. data/app/pb_kits/playbook/pb_table/docs/_table_with_filter_variant.md +34 -0
  98. data/app/pb_kits/playbook/pb_table/docs/_table_with_filter_variant_rails.html.erb +101 -0
  99. data/app/pb_kits/playbook/pb_table/docs/_table_with_filter_variant_rails.md +33 -0
  100. data/app/pb_kits/playbook/pb_table/docs/_table_with_filter_variant_with_pagination.jsx +180 -0
  101. data/app/pb_kits/playbook/pb_table/docs/_table_with_filter_variant_with_pagination.md +3 -0
  102. data/app/pb_kits/playbook/pb_table/docs/_table_with_filter_variant_with_pagination_rails.html.erb +122 -0
  103. data/app/pb_kits/playbook/pb_table/docs/_table_with_filter_variant_with_pagination_rails.md +3 -0
  104. data/app/pb_kits/playbook/pb_table/docs/example.yml +4 -0
  105. data/app/pb_kits/playbook/pb_table/docs/index.js +2 -0
  106. data/app/pb_kits/playbook/pb_table/table.html.erb +68 -12
  107. data/app/pb_kits/playbook/pb_table/table.rb +22 -3
  108. data/app/pb_kits/playbook/pb_table/table.test.js +143 -0
  109. data/app/pb_kits/playbook/pb_text_input/_text_input.tsx +56 -6
  110. data/app/pb_kits/playbook/pb_text_input/docs/_text_input_emoji_mask.html.erb +7 -0
  111. data/app/pb_kits/playbook/pb_text_input/docs/_text_input_emoji_mask.jsx +24 -0
  112. data/app/pb_kits/playbook/pb_text_input/docs/_text_input_emoji_mask.md +2 -0
  113. data/app/pb_kits/playbook/pb_text_input/docs/_text_input_error.md +1 -1
  114. data/app/pb_kits/playbook/pb_text_input/docs/_text_input_required_indicator.html.erb +6 -0
  115. data/app/pb_kits/playbook/pb_text_input/docs/_text_input_required_indicator.jsx +25 -0
  116. data/app/pb_kits/playbook/pb_text_input/docs/_text_input_required_indicator.md +3 -0
  117. data/app/pb_kits/playbook/pb_text_input/docs/example.yml +5 -0
  118. data/app/pb_kits/playbook/pb_text_input/docs/index.js +2 -0
  119. data/app/pb_kits/playbook/pb_text_input/index.js +49 -8
  120. data/app/pb_kits/playbook/pb_text_input/text_input.html.erb +6 -0
  121. data/app/pb_kits/playbook/pb_text_input/text_input.rb +7 -1
  122. data/app/pb_kits/playbook/pb_text_input/text_input.test.js +69 -0
  123. data/app/pb_kits/playbook/pb_textarea/_textarea.tsx +38 -2
  124. data/app/pb_kits/playbook/pb_textarea/docs/_textarea_emoji_mask.html.erb +5 -0
  125. data/app/pb_kits/playbook/pb_textarea/docs/_textarea_emoji_mask.jsx +24 -0
  126. data/app/pb_kits/playbook/pb_textarea/docs/_textarea_emoji_mask.md +1 -0
  127. data/app/pb_kits/playbook/pb_textarea/docs/_textarea_error.md +1 -1
  128. data/app/pb_kits/playbook/pb_textarea/docs/example.yml +2 -0
  129. data/app/pb_kits/playbook/pb_textarea/docs/index.js +1 -0
  130. data/app/pb_kits/playbook/pb_textarea/index.ts +62 -5
  131. data/app/pb_kits/playbook/pb_textarea/textarea.html.erb +1 -0
  132. data/app/pb_kits/playbook/pb_textarea/textarea.rb +8 -0
  133. data/app/pb_kits/playbook/pb_textarea/textarea.test.js +57 -2
  134. data/app/pb_kits/playbook/pb_time_picker/_time_picker.scss +296 -0
  135. data/app/pb_kits/playbook/pb_time_picker/_time_picker.tsx +822 -0
  136. data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_24_hour.html.erb +2 -0
  137. data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_24_hour.jsx +16 -0
  138. data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_24_hour.md +1 -0
  139. data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_default.html.erb +1 -0
  140. data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_default.jsx +13 -0
  141. data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_default.md +1 -0
  142. data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_default_time.html.erb +4 -0
  143. data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_default_time.jsx +29 -0
  144. data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_default_time.md +1 -0
  145. data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_disabled.html.erb +13 -0
  146. data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_disabled.jsx +23 -0
  147. data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_error.html.erb +5 -0
  148. data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_error.jsx +15 -0
  149. data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_input_options.html.erb +14 -0
  150. data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_label.html.erb +2 -0
  151. data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_label.jsx +15 -0
  152. data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_min_max_time.html.erb +42 -0
  153. data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_min_max_time.jsx +52 -0
  154. data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_min_max_time.md +1 -0
  155. data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_on_handler.jsx +45 -0
  156. data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_on_handler.md +1 -0
  157. data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_timezone.html.erb +3 -0
  158. data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_timezone.jsx +21 -0
  159. data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_timezone.md +1 -0
  160. data/app/pb_kits/playbook/pb_time_picker/docs/example.yml +24 -0
  161. data/app/pb_kits/playbook/pb_time_picker/docs/index.js +9 -0
  162. data/app/pb_kits/playbook/pb_time_picker/index.ts +40 -0
  163. data/app/pb_kits/playbook/pb_time_picker/time_picker.html.erb +1 -0
  164. data/app/pb_kits/playbook/pb_time_picker/time_picker.rb +80 -0
  165. data/app/pb_kits/playbook/pb_time_picker/time_picker.test.jsx +114 -0
  166. data/app/pb_kits/playbook/pb_time_picker/time_picker_helper.ts +662 -0
  167. data/app/pb_kits/playbook/pb_timeline/_item.tsx +3 -0
  168. data/app/pb_kits/playbook/pb_timeline/docs/_timeline_show_current_year.html.erb +60 -0
  169. data/app/pb_kits/playbook/pb_timeline/docs/_timeline_show_current_year.jsx +118 -0
  170. data/app/pb_kits/playbook/pb_timeline/docs/_timeline_show_current_year.md +1 -0
  171. data/app/pb_kits/playbook/pb_timeline/docs/_timeline_with_date.md +1 -1
  172. data/app/pb_kits/playbook/pb_timeline/docs/example.yml +2 -0
  173. data/app/pb_kits/playbook/pb_timeline/docs/index.js +1 -0
  174. data/app/pb_kits/playbook/pb_timeline/item.html.erb +1 -1
  175. data/app/pb_kits/playbook/pb_timeline/item.rb +2 -0
  176. data/app/pb_kits/playbook/pb_timeline/label.html.erb +2 -1
  177. data/app/pb_kits/playbook/pb_timeline/label.rb +2 -0
  178. data/app/pb_kits/playbook/pb_timeline/subcomponents/Label.tsx +3 -0
  179. data/app/pb_kits/playbook/pb_timeline/timeline.test.js +51 -0
  180. data/app/pb_kits/playbook/tokens/_colors.scss +2 -1
  181. data/app/pb_kits/playbook/utilities/deprecated.ts +73 -0
  182. data/app/pb_kits/playbook/utilities/emojiMask.ts +42 -0
  183. data/app/pb_kits/playbook/utilities/globalProps.ts +1 -0
  184. data/dist/chunks/_typeahead-CSCNg6cp.js +6 -0
  185. data/dist/chunks/lib-DxCgrqqG.js +29 -0
  186. data/dist/chunks/vendor.js +3 -3
  187. data/dist/menu.yml +16 -9
  188. data/dist/playbook-rails-react-bindings.js +1 -1
  189. data/dist/playbook-rails.js +1 -1
  190. data/dist/playbook.css +1 -1
  191. data/lib/playbook/forms/builder/collection_select_field.rb +9 -1
  192. data/lib/playbook/forms/builder/form_field_builder.rb +15 -2
  193. data/lib/playbook/forms/builder/select_field.rb +9 -1
  194. data/lib/playbook/forms/builder/time_picker_field.rb +24 -0
  195. data/lib/playbook/forms/builder/time_zone_select_field.rb +9 -1
  196. data/lib/playbook/forms/builder.rb +1 -0
  197. data/lib/playbook/pb_doc_helper.rb +3 -0
  198. data/lib/playbook/pb_kit_helper.rb +35 -0
  199. data/lib/playbook/version.rb +2 -2
  200. metadata +92 -4
  201. data/dist/chunks/_typeahead-DecTL7bt.js +0 -6
  202. data/dist/chunks/lib-Dk4GKPut.js +0 -29
@@ -0,0 +1,2 @@
1
+ <%= pb_rails("time_picker", props: { id: "time-picker-24-hour", label: "24-Hour Format", time_format: "24hour" }) %>
2
+
@@ -0,0 +1,16 @@
1
+ import React from 'react'
2
+ import TimePicker from '../../pb_time_picker/_time_picker'
3
+
4
+ const TimePicker24Hour = (props) => (
5
+ <div>
6
+ <TimePicker
7
+ id="time-picker-24-hour"
8
+ label="24-Hour Format"
9
+ timeFormat="24hour"
10
+ {...props}
11
+ />
12
+ </div>
13
+ )
14
+
15
+ export default TimePicker24Hour
16
+
@@ -0,0 +1 @@
1
+ Set `time_format` / `timeFormat` to 24hour to display the time selection dropdown in a 24-hour format.
@@ -0,0 +1 @@
1
+ <%= pb_rails("time_picker", props: { id: "time-picker-default" }) %>
@@ -0,0 +1,13 @@
1
+ import React from 'react'
2
+ import TimePicker from '../../pb_time_picker/_time_picker'
3
+
4
+ const TimePickerDefault = (props) => (
5
+ <div>
6
+ <TimePicker
7
+ id="time-picker-default"
8
+ {...props}
9
+ />
10
+ </div>
11
+ )
12
+
13
+ export default TimePickerDefault
@@ -0,0 +1 @@
1
+ Use the Time Picker for time-only selection. For date and time selection, use the [DatePicker with Time Selection Enabled](https://playbook.powerapp.cloud/kits/date_picker/react#time-selection) instead.
@@ -0,0 +1,4 @@
1
+ <%= pb_rails("time_picker", props: { id: "time-picker-default-time-12hr", default_time: "2:30 PM", label: "12-Hour Format (2:30 PM)" }) %>
2
+ <%= pb_rails("time_picker", props: { id: "time-picker-default-time-24hr", default_time: "14:30", label: "24-Hour Format (14:30)" }) %>
3
+ <%= pb_rails("time_picker", props: { id: "time-picker-default-time-24hr-format", default_time: "14:30", label: "24-Hour Format with timeFormat (14:30)", time_format: "24hour" }) %>
4
+
@@ -0,0 +1,29 @@
1
+ import React from 'react'
2
+ import TimePicker from '../../pb_time_picker/_time_picker'
3
+
4
+ const TimePickerDefaultTime = (props) => (
5
+ <div>
6
+ <TimePicker
7
+ defaultTime="2:30 PM"
8
+ id="time-picker-default-time-12hr"
9
+ label="12-Hour Format (2:30 PM)"
10
+ {...props}
11
+ />
12
+ <TimePicker
13
+ defaultTime="14:30"
14
+ id="time-picker-default-time-24hr"
15
+ label="24-Hour Format (14:30)"
16
+ {...props}
17
+ />
18
+ <TimePicker
19
+ defaultTime="14:30"
20
+ id="time-picker-default-time-24hr-format"
21
+ label="24-Hour Format with timeFormat (14:30)"
22
+ timeFormat="24hour"
23
+ {...props}
24
+ />
25
+ </div>
26
+ )
27
+
28
+ export default TimePickerDefaultTime
29
+
@@ -0,0 +1 @@
1
+ The `default_time` / `defaultTime` prop sets a default time value and accepts both 12-hour and 24-hour formats.
@@ -0,0 +1,13 @@
1
+ <%= pb_rails("time_picker", props: {
2
+ disabled: true,
3
+ id: "time-picker-disabled",
4
+ label: "Disabled Time Picker"
5
+ }) %>
6
+
7
+ <%= pb_rails("time_picker", props: {
8
+ default_time: "14:30",
9
+ disabled: true,
10
+ id: "time-picker-disabled-with-value",
11
+ label: "Disabled with Default Time"
12
+ }) %>
13
+
@@ -0,0 +1,23 @@
1
+ import React from 'react'
2
+ import TimePicker from '../../pb_time_picker/_time_picker'
3
+
4
+ const TimePickerDisabled = (props) => (
5
+ <div>
6
+ <TimePicker
7
+ disabled
8
+ id="time-picker-disabled"
9
+ label="Disabled Time Picker"
10
+ {...props}
11
+ />
12
+ <TimePicker
13
+ defaultTime="14:30"
14
+ disabled
15
+ id="time-picker-disabled-with-value"
16
+ label="Disabled with Default Time"
17
+ {...props}
18
+ />
19
+ </div>
20
+ )
21
+
22
+ export default TimePickerDisabled
23
+
@@ -0,0 +1,5 @@
1
+ <%= pb_rails("time_picker", props: {
2
+ error: "Please select a valid time",
3
+ id: "time-picker-error"
4
+ }) %>
5
+
@@ -0,0 +1,15 @@
1
+ import React from 'react'
2
+ import TimePicker from '../../pb_time_picker/_time_picker'
3
+
4
+ const TimePickerError = (props) => (
5
+ <div>
6
+ <TimePicker
7
+ error="Please select a valid time"
8
+ id="time-picker-error"
9
+ {...props}
10
+ />
11
+ </div>
12
+ )
13
+
14
+ export default TimePickerError
15
+
@@ -0,0 +1,14 @@
1
+ <%= pb_rails("time_picker", props: {
2
+ id: "time-picker-input-options",
3
+ label: "Appointment Time",
4
+ input_options: {
5
+ aria: {
6
+ describedby: "appointment-help-text",
7
+ label: "Select your preferred appointment time"
8
+ },
9
+ data: {
10
+ testid: "appointment-time-input"
11
+ },
12
+ placeholder: "Choose a time"
13
+ }
14
+ }) %>
@@ -0,0 +1,2 @@
1
+ <%= pb_rails("time_picker", props: { id: "time-picker-label", label: "Select Time" }) %>
2
+
@@ -0,0 +1,15 @@
1
+ import React from 'react'
2
+ import TimePicker from '../_time_picker'
3
+
4
+ const TimePickerLabel = (props) => (
5
+ <div>
6
+ <TimePicker
7
+ id="time-picker-label"
8
+ label="Select Time"
9
+ {...props}
10
+ />
11
+ </div>
12
+ )
13
+
14
+ export default TimePickerLabel
15
+
@@ -0,0 +1,42 @@
1
+ <%= pb_rails("time_picker", props: {
2
+ id: "time-picker-min-only",
3
+ label: "Minimum Time Only",
4
+ min_time: "09:00",
5
+ }) %>
6
+
7
+ <%= pb_rails("time_picker", props: {
8
+ id: "time-picker-max-only",
9
+ label: "Maximum Time Only",
10
+ max_time: "17:00",
11
+ time_format: "24hour",
12
+ }) %>
13
+
14
+ <%= pb_rails("time_picker", props: {
15
+ id: "time-picker-min-max-12hr",
16
+ label: "Min & Max Time Range (12-hour)",
17
+ min_time: "09:00",
18
+ max_time: "17:00",
19
+ }) %>
20
+
21
+ <%= pb_rails("time_picker", props: {
22
+ id: "time-picker-min-max-24hr",
23
+ label: "Min & Max Time Range (24-hour)",
24
+ min_time: "09:00",
25
+ max_time: "17:00",
26
+ time_format: "24hour",
27
+ }) %>
28
+
29
+ <%= pb_rails("time_picker", props: {
30
+ id: "time-picker-pm-only",
31
+ label: "PM Only Range (AM disabled)",
32
+ min_time: "13:00",
33
+ max_time: "17:00",
34
+ }) %>
35
+
36
+ <%= pb_rails("time_picker", props: {
37
+ id: "time-picker-am-only",
38
+ label: "AM Only Range (PM disabled)",
39
+ min_time: "06:00",
40
+ max_time: "11:30"
41
+ }) %>
42
+
@@ -0,0 +1,52 @@
1
+ import React from 'react'
2
+ import TimePicker from '../../pb_time_picker/_time_picker'
3
+
4
+ const TimePickerMinMaxTime = (props) => (
5
+ <div>
6
+ <TimePicker
7
+ id="time-picker-min-only"
8
+ label="Minimum Time Only"
9
+ minTime="09:00"
10
+ {...props}
11
+ />
12
+ <TimePicker
13
+ id="time-picker-max-only"
14
+ label="Maximum Time Only"
15
+ maxTime="17:00"
16
+ timeFormat="24hour"
17
+ {...props}
18
+ />
19
+ <TimePicker
20
+ id="time-picker-min-max-12hr"
21
+ label="Min & Max Time Range (12-hour)"
22
+ maxTime="17:00"
23
+ minTime="09:00"
24
+ {...props}
25
+ />
26
+ <TimePicker
27
+ id="time-picker-min-max-24hr"
28
+ label="Min & Max Time Range (24-hour)"
29
+ maxTime="17:00"
30
+ minTime="09:00"
31
+ timeFormat="24hour"
32
+ {...props}
33
+ />
34
+ <TimePicker
35
+ id="time-picker-pm-only"
36
+ label="PM Only Range (AM disabled)"
37
+ maxTime="17:00"
38
+ minTime="13:00"
39
+ {...props}
40
+ />
41
+ <TimePicker
42
+ id="time-picker-am-only"
43
+ label="AM Only Range (PM disabled)"
44
+ maxTime="11:30"
45
+ minTime="06:00"
46
+ {...props}
47
+ />
48
+ </div>
49
+ )
50
+
51
+ export default TimePickerMinMaxTime
52
+
@@ -0,0 +1 @@
1
+ Use the `min_time` / `minTime` and `max_time` / `maxTime` props to restrict the selectable time range. This example demonstrates minimum-only, maximum-only, and combined ranges in both 12-hour and 24-hour formats.
@@ -0,0 +1,45 @@
1
+ import React, { useState } from 'react'
2
+ import TimePicker from '../../pb_time_picker/_time_picker'
3
+ import Body from '../../pb_body/_body'
4
+
5
+ const TimePickerOnHandler = (props) => {
6
+ const [selectedTime, setSelectedTime] = useState('')
7
+ const [closedTime, setClosedTime] = useState('')
8
+
9
+ const handleTimeChange = (time) => {
10
+ setSelectedTime(time)
11
+ }
12
+
13
+ const handleTimeClose = (time) => {
14
+ setClosedTime(time)
15
+ }
16
+
17
+ return (
18
+ <div>
19
+ {(selectedTime || closedTime) && (
20
+ <div style={{ marginBottom: '16px' }}>
21
+ {selectedTime && (
22
+ <Body
23
+ text={`onChange: ${selectedTime}`}
24
+ />
25
+ )}
26
+ {closedTime && (
27
+ <Body
28
+ marginTop={selectedTime ? "xs" : "none"}
29
+ text={`onClose: ${closedTime}`}
30
+ />
31
+ )}
32
+ </div>
33
+ )}
34
+ <TimePicker
35
+ id="time-picker-on-handler"
36
+ onChange={handleTimeChange}
37
+ onClose={handleTimeClose}
38
+ {...props}
39
+ />
40
+ </div>
41
+ )
42
+ }
43
+
44
+ export default TimePickerOnHandler
45
+
@@ -0,0 +1 @@
1
+ Demonstrates the `onChange` and `onClose` event handlers for the Time Picker.
@@ -0,0 +1,3 @@
1
+ <%= pb_rails("time_picker", props: { id: "time-picker-timezone", show_timezone: true }) %>
2
+ <%= pb_rails("time_picker", props: { id: "time-picker-timezone-24hour", show_timezone: true, time_format: "24hour" }) %>
3
+
@@ -0,0 +1,21 @@
1
+ import React from 'react'
2
+ import TimePicker from '../../pb_time_picker/_time_picker'
3
+
4
+ const TimePickerTimezone = (props) => (
5
+ <div>
6
+ <TimePicker
7
+ id="time-picker-timezone"
8
+ showTimezone
9
+ {...props}
10
+ />
11
+ <TimePicker
12
+ id="time-picker-timezone-24hour"
13
+ showTimezone
14
+ timeFormat="24hour"
15
+ {...props}
16
+ />
17
+ </div>
18
+ )
19
+
20
+ export default TimePickerTimezone
21
+
@@ -0,0 +1 @@
1
+ Enable timezone display by passing `show_timezone` / `showTimezone`.
@@ -0,0 +1,24 @@
1
+ examples:
2
+
3
+ rails:
4
+ - time_picker_default: Default
5
+ - time_picker_24_hour: 24-Hour Format
6
+ - time_picker_default_time: Default Time
7
+ - time_picker_label: Custom Label
8
+ - time_picker_timezone: With Timezone
9
+ - time_picker_min_max_time: Min & Max Time
10
+ - time_picker_error: Error
11
+ - time_picker_disabled: Disabled
12
+ - time_picker_input_options: Input Options
13
+
14
+
15
+ react:
16
+ - time_picker_default: Default
17
+ - time_picker_24_hour: 24-Hour Format
18
+ - time_picker_default_time: Default Time
19
+ - time_picker_label: Custom Label
20
+ - time_picker_timezone: With Timezone
21
+ - time_picker_min_max_time: Min & Max Time
22
+ - time_picker_error: Error
23
+ - time_picker_disabled: Disabled
24
+ - time_picker_on_handler: onChange & onClose Handlers
@@ -0,0 +1,9 @@
1
+ export { default as TimePickerDefault } from './_time_picker_default.jsx'
2
+ export { default as TimePickerDefaultTime } from './_time_picker_default_time.jsx'
3
+ export { default as TimePicker24Hour } from './_time_picker_24_hour.jsx'
4
+ export { default as TimePickerLabel } from './_time_picker_label.jsx'
5
+ export { default as TimePickerTimezone } from './_time_picker_timezone.jsx'
6
+ export { default as TimePickerOnHandler } from './_time_picker_on_handler.jsx'
7
+ export { default as TimePickerMinMaxTime } from './_time_picker_min_max_time.jsx'
8
+ export { default as TimePickerError } from './_time_picker_error.jsx'
9
+ export { default as TimePickerDisabled } from './_time_picker_disabled.jsx'
@@ -0,0 +1,40 @@
1
+ import PbEnhancedElement from "../pb_enhanced_element";
2
+
3
+ const TIME_PICKER_SELECTOR = '[data-pb-time-picker]';
4
+ const VALIDATION_MESSAGE_CLASS = '.pb_body_kit_negative';
5
+
6
+ export default class PbTimePicker extends PbEnhancedElement {
7
+ static get selector(): string {
8
+ return TIME_PICKER_SELECTOR;
9
+ }
10
+
11
+ connect(): void {
12
+ this.setValidationMessage();
13
+ }
14
+
15
+ setValidationMessage(): void {
16
+ const element = this.element as HTMLElement;
17
+ const validationMessage = element.dataset?.validationMessage;
18
+ const inputElement = element.querySelector("input");
19
+
20
+ if (validationMessage) {
21
+ const setErrorTextContent = (text: string, timeout: number): void => {
22
+ setTimeout(() => {
23
+ const errorMessageElement = element.querySelector(VALIDATION_MESSAGE_CLASS);
24
+ if (errorMessageElement) {
25
+ errorMessageElement.textContent = text;
26
+ } else {
27
+ setErrorTextContent(text, 100);
28
+ }
29
+ }, timeout);
30
+ };
31
+
32
+ inputElement?.addEventListener("change", (e) => {
33
+ const target = e.target as HTMLInputElement;
34
+ if (!target.checkValidity()) {
35
+ setErrorTextContent(validationMessage, 300);
36
+ }
37
+ });
38
+ }
39
+ }
40
+ }
@@ -0,0 +1 @@
1
+ <%= react_component("TimePicker", object.time_picker_react_props, 'data-pb-time-picker': true, 'data-validation-message': object.validation_message) %>
@@ -0,0 +1,80 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Playbook
4
+ module PbTimePicker
5
+ class TimePicker < ::Playbook::KitBase
6
+ prop :default_time, type: Playbook::Props::String
7
+ prop :disabled, type: Playbook::Props::Boolean,
8
+ default: false
9
+ prop :error, type: Playbook::Props::String
10
+ prop :input_options, type: Playbook::Props::HashProp,
11
+ default: {}
12
+ prop :label, type: Playbook::Props::String,
13
+ default: "Time Picker"
14
+ prop :max_time, type: Playbook::Props::String
15
+ prop :min_time, type: Playbook::Props::String
16
+ prop :name, type: Playbook::Props::String
17
+ prop :required, type: Playbook::Props::Boolean,
18
+ default: false
19
+ prop :show_timezone, type: Playbook::Props::Boolean,
20
+ default: false
21
+ prop :time_format, type: Playbook::Props::Enum,
22
+ values: %w[AMPM 24hour],
23
+ default: "AMPM"
24
+ prop :validation_message, type: Playbook::Props::String,
25
+ default: ""
26
+ prop :value, type: Playbook::Props::String
27
+
28
+ def classname
29
+ generate_classname("pb_time_picker") + error_class + disabled_class
30
+ end
31
+
32
+ def error_class
33
+ error.present? ? " error" : ""
34
+ end
35
+
36
+ def disabled_class
37
+ disabled ? " disabled" : ""
38
+ end
39
+
40
+ # Flatten nested data/aria hashes for React compatibility
41
+ # Rails tag helpers do this automatically, but React needs flat attributes
42
+ def formatted_input_options
43
+ result = {}
44
+ input_options.each do |key, value|
45
+ if key.to_s == "data" && value.is_a?(Hash)
46
+ value.each { |k, v| result["data-#{k.to_s.dasherize}"] = v }
47
+ elsif key.to_s == "aria" && value.is_a?(Hash)
48
+ value.each { |k, v| result["aria-#{k.to_s.dasherize}"] = v }
49
+ else
50
+ result[key] = value
51
+ end
52
+ end
53
+ result
54
+ end
55
+
56
+ def time_picker_react_props
57
+ props = {
58
+ className: classname,
59
+ data: data,
60
+ defaultTime: default_time,
61
+ disabled: disabled,
62
+ error: error,
63
+ htmlOptions: html_options,
64
+ id: id,
65
+ inputOptions: formatted_input_options,
66
+ label: label,
67
+ maxTime: max_time,
68
+ minTime: min_time,
69
+ name: name,
70
+ required: required,
71
+ showTimezone: show_timezone,
72
+ timeFormat: time_format,
73
+ validationMessage: validation_message,
74
+ value: value,
75
+ }
76
+ props.compact
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,114 @@
1
+ import React from 'react'
2
+ import { render, screen, fireEvent } from '../utilities/test-utils'
3
+
4
+ import TimePicker from './_time_picker'
5
+
6
+ describe('TimePicker', () => {
7
+ test('renders with default props', () => {
8
+ render(<TimePicker data={{ testid: 'time-picker' }} />)
9
+ expect(screen.getByTestId('time-picker')).toBeInTheDocument()
10
+ })
11
+
12
+ test('renders with custom label', () => {
13
+ render(<TimePicker label="Appointment Time" />)
14
+ expect(screen.getByText('Appointment Time')).toBeInTheDocument()
15
+ })
16
+
17
+ test('renders label as accessible label element with htmlFor', () => {
18
+ render(
19
+ <TimePicker
20
+ id="test-picker"
21
+ label="Select Time"
22
+ />
23
+ )
24
+ const label = screen.getByText('Select Time').closest('label')
25
+ expect(label).toBeInTheDocument()
26
+ expect(label).toHaveAttribute('for', 'test-picker-input')
27
+ })
28
+
29
+ test('renders with error state', () => {
30
+ render(
31
+ <TimePicker
32
+ data={{ testid: 'error-picker' }}
33
+ error="Please select a valid time"
34
+ />
35
+ )
36
+ expect(screen.getByTestId('error-picker')).toHaveClass('error')
37
+ expect(screen.getByText('Please select a valid time')).toBeInTheDocument()
38
+ })
39
+
40
+ test('renders with disabled state', () => {
41
+ render(
42
+ <TimePicker
43
+ data={{ testid: 'disabled-picker' }}
44
+ disabled
45
+ label="Disabled Picker"
46
+ />
47
+ )
48
+ expect(screen.getByTestId('disabled-picker')).toHaveClass('disabled')
49
+ const input = screen.getByPlaceholderText('Select Time')
50
+ expect(input).toBeDisabled()
51
+ })
52
+
53
+ test('renders with default time value', () => {
54
+ render(<TimePicker defaultTime="14:30" />)
55
+ const input = screen.getByPlaceholderText('Select Time')
56
+ expect(input).toHaveValue('2:30 PM')
57
+ })
58
+
59
+ test('renders with default time in 24-hour format', () => {
60
+ render(
61
+ <TimePicker
62
+ defaultTime="14:30"
63
+ timeFormat="24hour"
64
+ />
65
+ )
66
+ const input = screen.getByPlaceholderText('Select Time')
67
+ expect(input).toHaveValue('14:30')
68
+ })
69
+
70
+ test('opens dropdown on input click when not disabled', () => {
71
+ render(<TimePicker data={{ testid: 'clickable-picker' }} />)
72
+ const input = screen.getByPlaceholderText('Select Time')
73
+ fireEvent.click(input)
74
+ expect(screen.getByText('Hour', { selector: '.pb_caption_kit_sm' })).toBeInTheDocument()
75
+ })
76
+
77
+ test('does not open dropdown on input click when disabled', () => {
78
+ render(<TimePicker disabled />)
79
+ const input = screen.getByPlaceholderText('Select Time')
80
+ fireEvent.click(input)
81
+ expect(screen.queryByText('Hour', { selector: '.pb_caption_kit_sm' })).not.toBeInTheDocument()
82
+ })
83
+
84
+ test('renders with required attribute', () => {
85
+ render(<TimePicker required />)
86
+ const input = screen.getByPlaceholderText('Select Time')
87
+ expect(input).toHaveAttribute('required')
88
+ })
89
+
90
+ test('renders timezone when showTimezone is true', () => {
91
+ render(<TimePicker showTimezone />)
92
+ const input = screen.getByPlaceholderText('Select Time')
93
+ fireEvent.click(input)
94
+ // Timezone text should contain parentheses like "EST (Eastern Standard Time)"
95
+ const timezoneElement = screen.getByText(/\(.*Time.*\)/)
96
+ expect(timezoneElement).toBeInTheDocument()
97
+ })
98
+
99
+ test('renders 24-hour format without AM/PM selectors', () => {
100
+ render(<TimePicker timeFormat="24hour" />)
101
+ const input = screen.getByPlaceholderText('Select Time')
102
+ fireEvent.click(input)
103
+ expect(screen.queryByText('AM')).not.toBeInTheDocument()
104
+ expect(screen.queryByText('PM')).not.toBeInTheDocument()
105
+ })
106
+
107
+ test('renders 12-hour format with AM/PM selectors', () => {
108
+ render(<TimePicker timeFormat="AMPM" />)
109
+ const input = screen.getByPlaceholderText('Select Time')
110
+ fireEvent.click(input)
111
+ expect(screen.getByText('AM')).toBeInTheDocument()
112
+ expect(screen.getByText('PM')).toBeInTheDocument()
113
+ })
114
+ })