playbook_ui 15.6.0 → 15.7.0.pre.alpha.play263313229
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/app/pb_kits/playbook/_playbook.scss +1 -1
- data/app/pb_kits/playbook/pb_advanced_table/Components/RegularTableView.tsx +3 -2
- data/app/pb_kits/playbook/pb_advanced_table/Components/TableHeaderCell.tsx +4 -0
- data/app/pb_kits/playbook/pb_advanced_table/advanced_table.test.jsx +95 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_background_colors_rails.html.erb +43 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_background_colors_rails.md +1 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_background_control_rails.html.erb +11 -5
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_background_control_rails.md +7 -1
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_background.jsx +54 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_background.md +9 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_background_multi.jsx +80 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_background_multi.md +3 -0
- data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +4 -1
- data/app/pb_kits/playbook/pb_advanced_table/docs/index.js +3 -1
- data/app/pb_kits/playbook/pb_advanced_table/table_header.html.erb +2 -2
- data/app/pb_kits/playbook/pb_advanced_table/table_header.rb +57 -0
- data/app/pb_kits/playbook/pb_bar_graph/_bar_graph.tsx +6 -0
- data/app/pb_kits/playbook/pb_card/docs/_card_header.md +1 -1
- data/app/pb_kits/playbook/pb_card/docs/_card_highlight.md +1 -1
- data/app/pb_kits/playbook/pb_circle_chart/_circle_chart.tsx +6 -0
- data/app/pb_kits/playbook/pb_collapsible/__snapshots__/collapsible.test.js.snap +2 -2
- data/app/pb_kits/playbook/pb_collapsible/child_kits/CollapsibleIcon.tsx +10 -8
- data/app/pb_kits/playbook/pb_collapsible/docs/_collapsible_icons.jsx +0 -1
- data/app/pb_kits/playbook/pb_collapsible/docs/_collapsible_state.jsx +0 -3
- data/app/pb_kits/playbook/pb_contact/_contact.tsx +51 -24
- data/app/pb_kits/playbook/pb_contact/contact.html.erb +53 -19
- data/app/pb_kits/playbook/pb_contact/contact.rb +11 -1
- data/app/pb_kits/playbook/pb_contact/contact.test.js +76 -0
- data/app/pb_kits/playbook/pb_contact/docs/_contact_unstyled.html.erb +33 -0
- data/app/pb_kits/playbook/pb_contact/docs/_contact_unstyled.jsx +46 -0
- data/app/pb_kits/playbook/pb_contact/docs/_contact_unstyled_rails.md +2 -0
- data/app/pb_kits/playbook/pb_contact/docs/_contact_unstyled_react.md +2 -0
- data/app/pb_kits/playbook/pb_contact/docs/example.yml +2 -0
- data/app/pb_kits/playbook/pb_contact/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_date_picker/date_picker.test.js +24 -0
- data/app/pb_kits/playbook/pb_date_picker/date_picker_helper.ts +197 -7
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_range_pattern_rails.html.erb +23 -14
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_range_pattern_rails.md +1 -1
- data/app/pb_kits/playbook/pb_dialog/_dialog.tsx +2 -1
- data/app/pb_kits/playbook/pb_dialog/dialog.html.erb +1 -1
- data/app/pb_kits/playbook/pb_dialog/dialog.rb +1 -0
- data/app/pb_kits/playbook/pb_dialog/dialog.test.jsx +14 -0
- data/app/pb_kits/playbook/pb_dialog/dialog_header.html.erb +5 -4
- data/app/pb_kits/playbook/pb_dialog/dialog_header.rb +2 -0
- data/app/pb_kits/playbook/pb_dialog/docs/_dialog_closeable.html.erb +24 -0
- data/app/pb_kits/playbook/pb_dialog/docs/_dialog_closeable.jsx +60 -0
- data/app/pb_kits/playbook/pb_dialog/docs/_dialog_closeable.md +3 -0
- data/app/pb_kits/playbook/pb_dialog/docs/_dialog_overflow_visible.html.erb +71 -0
- data/app/pb_kits/playbook/pb_dialog/docs/_dialog_overflow_visible.jsx +57 -0
- data/app/pb_kits/playbook/pb_dialog/docs/_dialog_overflow_visible_rails.md +1 -0
- data/app/pb_kits/playbook/pb_dialog/docs/_dialog_overflow_visible_react.md +1 -0
- data/app/pb_kits/playbook/pb_dialog/docs/example.yml +4 -0
- data/app/pb_kits/playbook/pb_dialog/docs/index.js +3 -1
- data/app/pb_kits/playbook/pb_distribution_bar/docs/_distribution_bar_custom_colors.md +1 -1
- data/app/pb_kits/playbook/pb_draggable/context/index.tsx +316 -15
- data/app/pb_kits/playbook/pb_draggable/context/types.ts +1 -1
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_default_rails.html.erb +7 -5
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_quickpick_default_dates.html.erb +19 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_quickpick_rails.html.erb +12 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_quickpick_rails.md +26 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_quickpick_range_end_rails.html.erb +19 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_quickpick_range_end_rails.md +1 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_quickpick_with_date_pickers_default_rails.html.erb +30 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_quickpick_with_date_pickers_default_rails.md +3 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_quickpick_with_date_pickers_rails.html.erb +29 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_quickpick_with_date_pickers_rails.md +13 -0
- data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_custom_display_rails.html.erb +3 -1
- data/app/pb_kits/playbook/pb_dropdown/docs/example.yml +5 -0
- data/app/pb_kits/playbook/pb_dropdown/dropdown.html.erb +4 -0
- data/app/pb_kits/playbook/pb_dropdown/dropdown.rb +39 -5
- data/app/pb_kits/playbook/pb_dropdown/index.js +171 -3
- data/app/pb_kits/playbook/pb_dropdown/quickpick_helper.rb +75 -0
- data/app/pb_kits/playbook/pb_filter/Filter/FilterBackground.tsx +3 -3
- data/app/pb_kits/playbook/pb_form/docs/_form_form_with.html.erb +1 -1
- data/app/pb_kits/playbook/pb_form/docs/_form_form_with_validate.html.erb +2 -1
- data/app/pb_kits/playbook/pb_form/docs/_form_with_required_indicator.html.erb +14 -0
- data/app/pb_kits/playbook/pb_form/docs/_form_with_required_indicator.md +3 -0
- data/app/pb_kits/playbook/pb_form/docs/example.yml +1 -0
- data/app/pb_kits/playbook/pb_gauge/_gauge.tsx +6 -0
- data/app/pb_kits/playbook/pb_line_graph/_line_graph.tsx +6 -0
- data/app/pb_kits/playbook/pb_radio/docs/_radio_error.md +1 -1
- data/app/pb_kits/playbook/pb_select/_select.tsx +8 -3
- data/app/pb_kits/playbook/pb_select/docs/_select_error.md +1 -1
- data/app/pb_kits/playbook/pb_select/docs/_select_input_options.html.erb +16 -0
- data/app/pb_kits/playbook/pb_select/docs/_select_input_options.jsx +30 -0
- data/app/pb_kits/playbook/pb_select/docs/_select_input_options.md +1 -0
- data/app/pb_kits/playbook/pb_select/docs/example.yml +2 -0
- data/app/pb_kits/playbook/pb_select/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_select/select.html.erb +2 -2
- data/app/pb_kits/playbook/pb_select/select.rb +3 -1
- data/app/pb_kits/playbook/pb_select/select.test.js +23 -0
- data/app/pb_kits/playbook/pb_table/_table.tsx +187 -33
- data/app/pb_kits/playbook/pb_table/docs/_table_with_filter_variant.jsx +134 -0
- data/app/pb_kits/playbook/pb_table/docs/_table_with_filter_variant.md +34 -0
- data/app/pb_kits/playbook/pb_table/docs/_table_with_filter_variant_rails.html.erb +101 -0
- data/app/pb_kits/playbook/pb_table/docs/_table_with_filter_variant_rails.md +33 -0
- data/app/pb_kits/playbook/pb_table/docs/_table_with_filter_variant_with_pagination.jsx +180 -0
- data/app/pb_kits/playbook/pb_table/docs/_table_with_filter_variant_with_pagination.md +3 -0
- data/app/pb_kits/playbook/pb_table/docs/_table_with_filter_variant_with_pagination_rails.html.erb +122 -0
- data/app/pb_kits/playbook/pb_table/docs/_table_with_filter_variant_with_pagination_rails.md +3 -0
- data/app/pb_kits/playbook/pb_table/docs/example.yml +4 -0
- data/app/pb_kits/playbook/pb_table/docs/index.js +2 -0
- data/app/pb_kits/playbook/pb_table/table.html.erb +68 -12
- data/app/pb_kits/playbook/pb_table/table.rb +22 -3
- data/app/pb_kits/playbook/pb_table/table.test.js +143 -0
- data/app/pb_kits/playbook/pb_text_input/_text_input.tsx +15 -3
- data/app/pb_kits/playbook/pb_text_input/docs/_text_input_error.md +1 -1
- data/app/pb_kits/playbook/pb_text_input/docs/_text_input_required_indicator.html.erb +6 -0
- data/app/pb_kits/playbook/pb_text_input/docs/_text_input_required_indicator.jsx +25 -0
- data/app/pb_kits/playbook/pb_text_input/docs/_text_input_required_indicator.md +3 -0
- data/app/pb_kits/playbook/pb_text_input/docs/example.yml +3 -0
- data/app/pb_kits/playbook/pb_text_input/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_text_input/text_input.html.erb +6 -0
- data/app/pb_kits/playbook/pb_text_input/text_input.rb +2 -0
- data/app/pb_kits/playbook/pb_text_input/text_input.test.js +16 -0
- data/app/pb_kits/playbook/pb_textarea/docs/_textarea_error.md +1 -1
- data/app/pb_kits/playbook/pb_time_picker/_time_picker.scss +296 -0
- data/app/pb_kits/playbook/pb_time_picker/_time_picker.tsx +822 -0
- data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_24_hour.html.erb +2 -0
- data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_24_hour.jsx +16 -0
- data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_24_hour.md +1 -0
- data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_default.html.erb +1 -0
- data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_default.jsx +13 -0
- data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_default.md +1 -0
- data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_default_time.html.erb +4 -0
- data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_default_time.jsx +29 -0
- data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_default_time.md +1 -0
- data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_disabled.html.erb +13 -0
- data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_disabled.jsx +23 -0
- data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_error.html.erb +5 -0
- data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_error.jsx +15 -0
- data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_input_options.html.erb +14 -0
- data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_label.html.erb +2 -0
- data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_label.jsx +15 -0
- data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_min_max_time.html.erb +42 -0
- data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_min_max_time.jsx +52 -0
- data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_min_max_time.md +1 -0
- data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_on_handler.jsx +45 -0
- data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_on_handler.md +1 -0
- data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_timezone.html.erb +3 -0
- data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_timezone.jsx +21 -0
- data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_timezone.md +1 -0
- data/app/pb_kits/playbook/pb_time_picker/docs/example.yml +24 -0
- data/app/pb_kits/playbook/pb_time_picker/docs/index.js +9 -0
- data/app/pb_kits/playbook/pb_time_picker/index.ts +40 -0
- data/app/pb_kits/playbook/pb_time_picker/time_picker.html.erb +1 -0
- data/app/pb_kits/playbook/pb_time_picker/time_picker.rb +80 -0
- data/app/pb_kits/playbook/pb_time_picker/time_picker.test.jsx +114 -0
- data/app/pb_kits/playbook/pb_time_picker/time_picker_helper.ts +662 -0
- data/app/pb_kits/playbook/pb_timeline/_item.tsx +3 -0
- data/app/pb_kits/playbook/pb_timeline/docs/_timeline_show_current_year.html.erb +60 -0
- data/app/pb_kits/playbook/pb_timeline/docs/_timeline_show_current_year.jsx +118 -0
- data/app/pb_kits/playbook/pb_timeline/docs/_timeline_show_current_year.md +1 -0
- data/app/pb_kits/playbook/pb_timeline/docs/_timeline_with_date.md +1 -1
- data/app/pb_kits/playbook/pb_timeline/docs/example.yml +2 -0
- data/app/pb_kits/playbook/pb_timeline/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_timeline/item.html.erb +1 -1
- data/app/pb_kits/playbook/pb_timeline/item.rb +2 -0
- data/app/pb_kits/playbook/pb_timeline/label.html.erb +2 -1
- data/app/pb_kits/playbook/pb_timeline/label.rb +2 -0
- data/app/pb_kits/playbook/pb_timeline/subcomponents/Label.tsx +3 -0
- data/app/pb_kits/playbook/pb_timeline/timeline.test.js +51 -0
- data/app/pb_kits/playbook/tokens/_colors.scss +2 -1
- data/app/pb_kits/playbook/utilities/deprecated.ts +73 -0
- data/app/pb_kits/playbook/utilities/globalProps.ts +1 -0
- data/dist/chunks/_typeahead-Ckz1ce-2.js +6 -0
- data/dist/chunks/lib-DxDBrGZX.js +29 -0
- data/dist/chunks/vendor.js +3 -3
- data/dist/menu.yml +16 -9
- data/dist/playbook-rails-react-bindings.js +1 -1
- data/dist/playbook-rails.js +1 -1
- data/dist/playbook.css +1 -1
- data/lib/playbook/forms/builder/collection_select_field.rb +9 -1
- data/lib/playbook/forms/builder/form_field_builder.rb +13 -2
- data/lib/playbook/forms/builder/select_field.rb +9 -1
- data/lib/playbook/forms/builder/time_picker_field.rb +24 -0
- data/lib/playbook/forms/builder/time_zone_select_field.rb +9 -1
- data/lib/playbook/forms/builder.rb +1 -0
- data/lib/playbook/pb_doc_helper.rb +3 -0
- data/lib/playbook/pb_kit_helper.rb +35 -0
- data/lib/playbook/version.rb +2 -2
- metadata +85 -4
- data/dist/chunks/_typeahead-DecTL7bt.js +0 -6
- data/dist/chunks/lib-Dk4GKPut.js +0 -29
|
@@ -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 @@
|
|
|
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,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,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,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
|
+
})
|