playbook_ui 16.1.0.pre.alpha.play264213818 → 16.1.0.pre.alpha.play277814027

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 (92) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/pb_advanced_table/Components/RegularTableView.tsx +12 -2
  3. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.test.jsx +33 -0
  4. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_background_custom.jsx +71 -0
  5. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_styling_background_custom.md +4 -0
  6. data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +1 -0
  7. data/app/pb_kits/playbook/pb_advanced_table/docs/index.js +2 -1
  8. data/app/pb_kits/playbook/pb_card/docs/_card_light.html.erb +3 -35
  9. data/app/pb_kits/playbook/pb_date_picker/_date_picker.tsx +14 -5
  10. data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_default.md +1 -0
  11. data/app/pb_kits/playbook/pb_dialog/_dialog.scss +8 -6
  12. data/app/pb_kits/playbook/pb_dropdown/_dropdown.scss +6 -0
  13. data/app/pb_kits/playbook/pb_dropdown/_dropdown.tsx +37 -2
  14. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_blank_selection_rails.md +3 -0
  15. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_blank_selection_react.md +3 -0
  16. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_clearable.html.erb +52 -0
  17. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_clearable.jsx +72 -0
  18. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_clearable.md +5 -0
  19. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_constrain_height.jsx +33 -0
  20. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_constrain_height_rails.html.erb +20 -0
  21. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_constrain_height_rails.md +8 -0
  22. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_constrain_height_react.md +8 -0
  23. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_placeholder.html.erb +9 -0
  24. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_placeholder.jsx +33 -0
  25. data/app/pb_kits/playbook/pb_dropdown/docs/_dropdown_with_placeholder.md +3 -0
  26. data/app/pb_kits/playbook/pb_dropdown/docs/example.yml +6 -0
  27. data/app/pb_kits/playbook/pb_dropdown/docs/index.js +4 -1
  28. data/app/pb_kits/playbook/pb_dropdown/dropdown.html.erb +2 -2
  29. data/app/pb_kits/playbook/pb_dropdown/dropdown.rb +6 -0
  30. data/app/pb_kits/playbook/pb_dropdown/dropdown.test.jsx +94 -0
  31. data/app/pb_kits/playbook/pb_dropdown/dropdown_container.rb +5 -1
  32. data/app/pb_kits/playbook/pb_dropdown/index.js +59 -4
  33. data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownContainer.tsx +3 -0
  34. data/app/pb_kits/playbook/pb_dropdown/subcomponents/DropdownTrigger.tsx +2 -1
  35. data/app/pb_kits/playbook/pb_filter/Filter/SortMenu.tsx +1 -1
  36. data/app/pb_kits/playbook/pb_filter/docs/_filter_default.html.erb +2 -2
  37. data/app/pb_kits/playbook/pb_filter/docs/_filter_default.jsx +16 -9
  38. data/app/pb_kits/playbook/pb_filter/filter.rb +2 -2
  39. data/app/pb_kits/playbook/pb_form/docs/_form_with_required_indicator.html.erb +2 -0
  40. data/app/pb_kits/playbook/pb_form/pb_form_validation.js +9 -2
  41. data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_truncated_text.html.erb +5 -5
  42. data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_truncated_text.jsx +4 -4
  43. data/app/pb_kits/playbook/pb_form_pill/form_pill.rb +4 -0
  44. data/app/pb_kits/playbook/pb_passphrase/_passphrase.tsx +20 -5
  45. data/app/pb_kits/playbook/pb_passphrase/docs/_passphrase_meter_settings.jsx +1 -0
  46. data/app/pb_kits/playbook/pb_passphrase/docs/_passphrase_required_indicator.html.erb +7 -0
  47. data/app/pb_kits/playbook/pb_passphrase/docs/_passphrase_required_indicator.jsx +24 -0
  48. data/app/pb_kits/playbook/pb_passphrase/docs/_passphrase_required_indicator.md +3 -0
  49. data/app/pb_kits/playbook/pb_passphrase/docs/example.yml +2 -0
  50. data/app/pb_kits/playbook/pb_passphrase/docs/index.js +1 -0
  51. data/app/pb_kits/playbook/pb_passphrase/passphrase.rb +2 -0
  52. data/app/pb_kits/playbook/pb_passphrase/passphrase.test.jsx +30 -1
  53. data/app/pb_kits/playbook/pb_phone_number_input/_phone_number_input.tsx +3 -0
  54. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_required_indicator.html.erb +5 -0
  55. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_required_indicator.jsx +14 -0
  56. data/app/pb_kits/playbook/pb_phone_number_input/docs/_phone_number_input_required_indicator.md +3 -0
  57. data/app/pb_kits/playbook/pb_phone_number_input/docs/example.yml +2 -0
  58. data/app/pb_kits/playbook/pb_phone_number_input/docs/index.js +1 -0
  59. data/app/pb_kits/playbook/pb_phone_number_input/phone_number_input.rb +3 -0
  60. data/app/pb_kits/playbook/pb_phone_number_input/phone_number_input.test.js +34 -3
  61. data/app/pb_kits/playbook/pb_textarea/_textarea.tsx +10 -0
  62. data/app/pb_kits/playbook/pb_textarea/docs/_textarea_default.html.erb +3 -3
  63. data/app/pb_kits/playbook/pb_textarea/docs/_textarea_default.jsx +3 -0
  64. data/app/pb_kits/playbook/pb_textarea/docs/_textarea_default.md +1 -0
  65. data/app/pb_kits/playbook/pb_textarea/textarea.html.erb +25 -9
  66. data/app/pb_kits/playbook/pb_textarea/textarea.rb +7 -1
  67. data/app/pb_kits/playbook/pb_time_picker/_time_picker.tsx +97 -11
  68. data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_on_handler.jsx +5 -2
  69. data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_required_indicator.html.erb +6 -0
  70. data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_required_indicator.jsx +16 -0
  71. data/app/pb_kits/playbook/pb_time_picker/docs/_time_picker_required_indicator.md +3 -0
  72. data/app/pb_kits/playbook/pb_time_picker/docs/example.yml +2 -0
  73. data/app/pb_kits/playbook/pb_time_picker/docs/index.js +1 -0
  74. data/app/pb_kits/playbook/pb_time_picker/time_picker.rb +3 -0
  75. data/app/pb_kits/playbook/pb_time_picker/time_picker.test.jsx +47 -1
  76. data/app/pb_kits/playbook/pb_typeahead/_typeahead.test.jsx +24 -1
  77. data/app/pb_kits/playbook/pb_typeahead/_typeahead.tsx +2 -1
  78. data/app/pb_kits/playbook/pb_typeahead/components/MultiValue.tsx +4 -1
  79. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_truncated_text.html.erb +1 -1
  80. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_truncated_text.jsx +1 -1
  81. data/app/pb_kits/playbook/pb_typeahead/typeahead.rb +4 -0
  82. data/dist/chunks/_typeahead-CWA5wlah.js +1 -0
  83. data/dist/chunks/vendor.js +3 -3
  84. data/dist/menu.yml +2 -2
  85. data/dist/playbook-rails-react-bindings.js +1 -1
  86. data/dist/playbook-rails.js +1 -1
  87. data/dist/playbook.css +1 -1
  88. data/lib/playbook/forms/builder/phone_number_field.rb +9 -0
  89. data/lib/playbook/truncate.rb +1 -1
  90. data/lib/playbook/version.rb +1 -1
  91. metadata +28 -3
  92. data/dist/chunks/_typeahead-B9a6ZsEP.js +0 -1
@@ -0,0 +1,16 @@
1
+ import React from 'react'
2
+ import TimePicker from '../_time_picker'
3
+
4
+ const TimePickerRequiredIndicator = (props) => (
5
+ <div>
6
+ <TimePicker
7
+ id="time-picker-required-indicator"
8
+ label="Select Time"
9
+ requiredIndicator
10
+ {...props}
11
+ />
12
+ </div>
13
+ )
14
+
15
+ export default TimePickerRequiredIndicator
16
+
@@ -0,0 +1,3 @@
1
+ The `requiredIndicator`/`required_indicator` prop displays a red asterisk (*) next to the label, visually indicating that the field is required. This is purely visual and does not enforce validation.
2
+
3
+ You can use `requiredIndicator`/`required_indicator` with any validation approach: HTML5 validation via the `required` prop, client-side validation, or backend validation. For this reason, it works independently and doesn't need to be paired with the `required` prop.
@@ -9,6 +9,7 @@ examples:
9
9
  - time_picker_min_max_time: Min & Max Time
10
10
  - time_picker_error: Error
11
11
  - time_picker_disabled: Disabled
12
+ - time_picker_required_indicator: Required Indicator
12
13
  - time_picker_input_options: Input Options
13
14
 
14
15
 
@@ -21,4 +22,5 @@ examples:
21
22
  - time_picker_min_max_time: Min & Max Time
22
23
  - time_picker_error: Error
23
24
  - time_picker_disabled: Disabled
25
+ - time_picker_required_indicator: Required Indicator
24
26
  - time_picker_on_handler: onChange & onClose Handlers
@@ -7,3 +7,4 @@ export { default as TimePickerOnHandler } from './_time_picker_on_handler.jsx'
7
7
  export { default as TimePickerMinMaxTime } from './_time_picker_min_max_time.jsx'
8
8
  export { default as TimePickerError } from './_time_picker_error.jsx'
9
9
  export { default as TimePickerDisabled } from './_time_picker_disabled.jsx'
10
+ export { default as TimePickerRequiredIndicator } from './_time_picker_required_indicator.jsx'
@@ -16,6 +16,8 @@ module Playbook
16
16
  prop :name, type: Playbook::Props::String
17
17
  prop :required, type: Playbook::Props::Boolean,
18
18
  default: false
19
+ prop :required_indicator, type: Playbook::Props::Boolean,
20
+ default: false
19
21
  prop :show_timezone, type: Playbook::Props::Boolean,
20
22
  default: false
21
23
  prop :time_format, type: Playbook::Props::Enum,
@@ -68,6 +70,7 @@ module Playbook
68
70
  minTime: min_time,
69
71
  name: name,
70
72
  required: required,
73
+ requiredIndicator: required_indicator,
71
74
  showTimezone: show_timezone,
72
75
  timeFormat: time_format,
73
76
  validationMessage: validation_message,
@@ -1,5 +1,5 @@
1
1
  import React from 'react'
2
- import { render, screen, fireEvent } from '../utilities/test-utils'
2
+ import { render, screen, fireEvent, within } from '../utilities/test-utils'
3
3
 
4
4
  import TimePicker from './_time_picker'
5
5
 
@@ -111,4 +111,50 @@ describe('TimePicker', () => {
111
111
  expect(screen.getByText('AM')).toBeInTheDocument()
112
112
  expect(screen.getByText('PM')).toBeInTheDocument()
113
113
  })
114
+
115
+ test('renders required indicator asterisk when requiredIndicator is true', () => {
116
+ render(
117
+ <TimePicker
118
+ data={{ testid: 'required-indicator-picker' }}
119
+ label="Select Time"
120
+ requiredIndicator
121
+ />
122
+ )
123
+ const kit = screen.getByTestId('required-indicator-picker')
124
+ const label = within(kit).getByText(/Select Time/)
125
+
126
+ expect(label).toBeInTheDocument()
127
+ expect(kit).toHaveTextContent('*')
128
+ })
129
+
130
+ test('requiredIndicator works independently of required prop', () => {
131
+ render(
132
+ <TimePicker
133
+ data={{ testid: 'indicator-without-required' }}
134
+ label="Select Time"
135
+ requiredIndicator
136
+ />
137
+ )
138
+ const kit = screen.getByTestId('indicator-without-required')
139
+
140
+ expect(kit).toHaveTextContent('*')
141
+ const input = screen.getByPlaceholderText('Select Time')
142
+ expect(input).not.toHaveAttribute('required')
143
+ })
144
+
145
+ test('requiredIndicator and required can be used together', () => {
146
+ render(
147
+ <TimePicker
148
+ data={{ testid: 'both-props-picker' }}
149
+ label="Select Time"
150
+ required
151
+ requiredIndicator
152
+ />
153
+ )
154
+ const kit = screen.getByTestId('both-props-picker')
155
+ const input = screen.getByPlaceholderText('Select Time')
156
+
157
+ expect(kit).toHaveTextContent('*')
158
+ expect(input).toHaveAttribute('required')
159
+ })
114
160
  })
@@ -290,4 +290,27 @@ test('input display none shows number of selected items', () => {
290
290
  const kit = screen.getByTestId('input-display-none-test')
291
291
  const inputDisplayDiv = kit.querySelector(".pb_typeahead_selection_count")
292
292
  expect(inputDisplayDiv).toHaveTextContent("2 items selected")
293
- })
293
+ })
294
+
295
+ test('typeahead with pills that use name instead of label', () => {
296
+ const customOptions = [
297
+ { name: 'Nihar', value: '1' },
298
+ { name: 'kylehgousel', value: '2' },
299
+ ]
300
+
301
+ render(
302
+ <Typeahead
303
+ data={{ testid: 'pills-custom-fields-test' }}
304
+ defaultValue={[{ name: 'Nihar', value: '1' }]}
305
+ getOptionLabel={(option) => option.name}
306
+ getOptionValue={(option) => option.value}
307
+ isMulti
308
+ options={customOptions}
309
+ />
310
+ )
311
+
312
+ const kit = screen.getByTestId('pills-custom-fields-test')
313
+ const pill = kit.querySelector(".pb_form_pill_kit.pb_form_pill_primary")
314
+ expect(pill).toBeInTheDocument()
315
+ expect(pill).toHaveTextContent("Nihar")
316
+ })
@@ -62,8 +62,9 @@ type TypeaheadProps = {
62
62
  } & GlobalProps
63
63
 
64
64
  export type SelectValueType = {
65
- label: string,
65
+ label?: string,
66
66
  value: string,
67
+ name?: string,
67
68
  imageUrl?: string,
68
69
  pillColor?: string,
69
70
  }
@@ -18,9 +18,12 @@ type Props = {
18
18
 
19
19
  const MultiValue = (props: Props) => {
20
20
  const { removeProps, isFocused } = props
21
- const { imageUrl, label } = props.data
21
+ const { imageUrl } = props.data
22
22
  const { dark, multiKit, pillColor, truncate, wrapped, inputDisplay } = props.selectProps
23
23
 
24
+ // Extract label - use data.label or data.name if available, otherwise use empty string
25
+ const label = props.data.label || props.data.name || ''
26
+
24
27
  // If inputDisplay is "none", don't render the pill/badge, just return null (the count handled in ValueContainer file)
25
28
  if (inputDisplay === 'none') {
26
29
  return null
@@ -15,5 +15,5 @@
15
15
  options: names,
16
16
  label: "Truncation Within Typeahead",
17
17
  pills: true,
18
- truncate: 1,
18
+ truncate: "1",
19
19
  }) %>
@@ -17,7 +17,7 @@ const TypeaheadTruncatedText = (props) => {
17
17
  isMulti
18
18
  label="Truncation Within Typeahead"
19
19
  options={names}
20
- truncate={1}
20
+ truncate={"1"}
21
21
  {...props}
22
22
  />
23
23
  </>
@@ -123,6 +123,10 @@ module Playbook
123
123
  end
124
124
  base_options
125
125
  end
126
+
127
+ def truncate_props
128
+ nil unless is_react?
129
+ end
126
130
  end
127
131
  end
128
132
  end