playbook_ui 14.24.0 → 14.25.0.pre.alpha.PLAY2369textinputautocompleteprop9970

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 (81) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/pb_advanced_table/Components/RegularTableView.tsx +8 -2
  3. data/app/pb_kits/playbook/pb_advanced_table/Components/TableHeaderCell.tsx +1 -2
  4. data/app/pb_kits/playbook/pb_advanced_table/_advanced_table.scss +34 -0
  5. data/app/pb_kits/playbook/pb_advanced_table/advanced_table.test.jsx +56 -0
  6. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_headers_vertical_border.html.erb +43 -0
  7. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_column_headers_vertical_border.jsx +64 -0
  8. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_padding_control.jsx +60 -0
  9. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_padding_control.md +3 -0
  10. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_padding_control_per_row.jsx +57 -0
  11. data/app/pb_kits/playbook/pb_advanced_table/docs/_advanced_table_padding_control_per_row.md +1 -0
  12. data/app/pb_kits/playbook/pb_advanced_table/docs/example.yml +4 -0
  13. data/app/pb_kits/playbook/pb_advanced_table/docs/index.js +4 -1
  14. data/app/pb_kits/playbook/pb_advanced_table/table_row.rb +1 -1
  15. data/app/pb_kits/playbook/pb_advanced_table/table_subrow_header.rb +1 -1
  16. data/app/pb_kits/playbook/pb_circle_icon_button/circle_icon_button.html.erb +10 -1
  17. data/app/pb_kits/playbook/pb_circle_icon_button/circle_icon_button.rb +2 -0
  18. data/app/pb_kits/playbook/pb_circle_icon_button/docs/_circle_icon_button_input_options.html.erb +24 -0
  19. data/app/pb_kits/playbook/pb_circle_icon_button/docs/_circle_icon_button_input_options.md +3 -0
  20. data/app/pb_kits/playbook/pb_circle_icon_button/docs/example.yml +1 -0
  21. data/app/pb_kits/playbook/pb_date/_date.tsx +5 -3
  22. data/app/pb_kits/playbook/pb_date/date.html.erb +6 -6
  23. data/app/pb_kits/playbook/pb_date/date.rb +2 -0
  24. data/app/pb_kits/playbook/pb_date/date.test.js +506 -0
  25. data/app/pb_kits/playbook/pb_date/docs/_date_with_show_current_year.html.erb +4 -0
  26. data/app/pb_kits/playbook/pb_date/docs/_date_with_show_current_year.jsx +17 -0
  27. data/app/pb_kits/playbook/pb_date/docs/_date_with_show_current_year.md +1 -0
  28. data/app/pb_kits/playbook/pb_date/docs/example.yml +2 -0
  29. data/app/pb_kits/playbook/pb_date/docs/index.js +1 -0
  30. data/app/pb_kits/playbook/pb_date_picker/_date_picker.tsx +19 -0
  31. data/app/pb_kits/playbook/pb_date_picker/date_picker.html.erb +1 -0
  32. data/app/pb_kits/playbook/pb_dropdown/index.js +3 -0
  33. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/_fixed_confirmation_toast.tsx +2 -2
  34. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/docs/_fixed_confirmation_toast_no_icon.html.erb +22 -0
  35. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/docs/_fixed_confirmation_toast_no_icon.jsx +43 -0
  36. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/docs/_fixed_confirmation_toast_no_icon.md +1 -0
  37. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/docs/_fixed_confirmation_toast_props_swift.md +3 -2
  38. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/docs/example.yml +2 -0
  39. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/docs/index.js +1 -0
  40. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/fixed_confirmation_toast.html.erb +2 -1
  41. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/fixed_confirmation_toast.rb +1 -1
  42. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/fixed_confirmation_toast.test.js +6 -0
  43. data/app/pb_kits/playbook/pb_flex/_flex.tsx +9 -6
  44. data/app/pb_kits/playbook/pb_flex/docs/_flex_gap.html.erb +12 -1
  45. data/app/pb_kits/playbook/pb_flex/docs/_flex_gap.jsx +26 -1
  46. data/app/pb_kits/playbook/pb_flex/docs/_flex_gap_rails.md +11 -0
  47. data/app/pb_kits/playbook/pb_flex/docs/_flex_gap_react.md +11 -0
  48. data/app/pb_kits/playbook/pb_flex/flex.rb +6 -12
  49. data/app/pb_kits/playbook/pb_icon/_icon.scss +4 -0
  50. data/app/pb_kits/playbook/pb_pagination/_pagination.test.jsx +212 -0
  51. data/app/pb_kits/playbook/pb_pagination/_pagination.tsx +8 -1
  52. data/app/pb_kits/playbook/pb_pagination/docs/_pagination_external_control.jsx +112 -0
  53. data/app/pb_kits/playbook/pb_pagination/docs/_pagination_external_control_react.md +3 -0
  54. data/app/pb_kits/playbook/pb_pagination/docs/example.yml +1 -0
  55. data/app/pb_kits/playbook/pb_pagination/docs/index.js +1 -0
  56. data/app/pb_kits/playbook/pb_phone_number_input/_phone_number_input.tsx +11 -1
  57. data/app/pb_kits/playbook/pb_table/styles/_vertical_border.scss +49 -1
  58. data/app/pb_kits/playbook/pb_text_input/_text_input.tsx +3 -0
  59. data/app/pb_kits/playbook/pb_text_input/text_input.rb +17 -3
  60. data/app/pb_kits/playbook/pb_text_input/text_input.test.js +38 -0
  61. data/app/pb_kits/playbook/pb_user/docs/_user_props_table.md +14 -7
  62. data/app/pb_kits/playbook/utilities/_gap.scss +12 -24
  63. data/app/pb_kits/playbook/utilities/globalPropNames.mjs +2 -0
  64. data/app/pb_kits/playbook/utilities/globalProps.ts +28 -4
  65. data/dist/chunks/{_line_graph-BLS62QjW.js → _line_graph-QVm2TVXJ.js} +1 -1
  66. data/dist/chunks/_typeahead-DENY2KW9.js +6 -0
  67. data/dist/chunks/{_weekday_stacked-Cv8-Sf6X.js → _weekday_stacked-DOM5KkBF.js} +3 -3
  68. data/dist/chunks/{lib-DgtxnJqa.js → lib-CY5ZPzic.js} +2 -2
  69. data/dist/chunks/{pb_form_validation-_NsOWfBS.js → pb_form_validation-D3b0JKHH.js} +1 -1
  70. data/dist/chunks/vendor.js +1 -1
  71. data/dist/menu.yml +2 -2
  72. data/dist/playbook-doc.js +1 -1
  73. data/dist/playbook-rails-react-bindings.js +1 -1
  74. data/dist/playbook-rails.js +1 -1
  75. data/dist/playbook.css +1 -1
  76. data/lib/playbook/classnames.rb +2 -0
  77. data/lib/playbook/spacing.rb +53 -1
  78. data/lib/playbook/version.rb +2 -2
  79. metadata +27 -8
  80. data/app/pb_kits/playbook/pb_flex/docs/_flex_gap.md +0 -9
  81. data/dist/chunks/_typeahead-CZL6rvfn.js +0 -6
@@ -0,0 +1,506 @@
1
+ import React from 'react'
2
+ import { render, screen } from '../utilities/test-utils'
3
+ import PbDate from './_date'
4
+ import DateTime from '../pb_kit/dateTime'
5
+
6
+ // Mock DateTime utility functions
7
+ jest.mock('../pb_kit/dateTime', () => ({
8
+ toWeekday: jest.fn(),
9
+ toMonth: jest.fn(),
10
+ toDay: jest.fn(),
11
+ toYear: jest.fn(),
12
+ }))
13
+
14
+ // Set test date
15
+ const TEST_DATE = new Date('2025-08-19T10:30:00Z') // Monday, August 19, 2025
16
+ const CURRENT_YEAR = new Date().getFullYear()
17
+
18
+ describe('PbDate Kit', () => {
19
+ beforeEach(() => {
20
+ // Reset mocks before each test
21
+ jest.clearAllMocks()
22
+
23
+ // Set up default mock returns
24
+ DateTime.toWeekday.mockReturnValue('Monday')
25
+ DateTime.toMonth.mockReturnValue('August')
26
+ DateTime.toDay.mockReturnValue('19')
27
+ DateTime.toYear.mockReturnValue(2025)
28
+
29
+ // Mock console.error to avoid noise in tests
30
+ jest.spyOn(console, 'error').mockImplementation(() => {})
31
+ })
32
+
33
+ afterEach(() => {
34
+ console.error.mockRestore()
35
+ })
36
+
37
+ // Default Props
38
+ describe('Default Props', () => {
39
+ test('renders with minimal required props', () => {
40
+ const testId = 'pb-date-default'
41
+ render(
42
+ <PbDate
43
+ data={{ testid: testId }}
44
+ value={TEST_DATE}
45
+ />
46
+ )
47
+
48
+ const kit = screen.getByTestId(testId)
49
+ expect(kit).toBeInTheDocument()
50
+ expect(kit).toHaveClass('pb_date_kit_left')
51
+ })
52
+
53
+ test('displays date in default format without day of week', () => {
54
+ // Mock current year to test hiding logic
55
+ DateTime.toYear.mockReturnValue(CURRENT_YEAR)
56
+
57
+ const testId = 'pb-date-format'
58
+ render(
59
+ <PbDate
60
+ data={{ testid: testId }}
61
+ value={TEST_DATE}
62
+ />
63
+ )
64
+
65
+ const kit = screen.getByTestId(testId)
66
+ expect(kit).toHaveTextContent('August 19')
67
+ expect(kit).not.toHaveTextContent('Monday')
68
+ expect(kit).not.toHaveTextContent(`, ${CURRENT_YEAR}`)
69
+ })
70
+
71
+ test('applies default CSS classes', () => {
72
+ const testId = 'pb-date-css'
73
+ render(
74
+ <PbDate
75
+ data={{ testid: testId }}
76
+ value={TEST_DATE}
77
+ />
78
+ )
79
+
80
+ const kit = screen.getByTestId(testId)
81
+ expect(kit).toHaveClass('pb_date_kit_left')
82
+ })
83
+ })
84
+
85
+ // Prop Variations
86
+ describe('Prop Variations', () => {
87
+ test('renders with showDayOfWeek enabled', () => {
88
+ const testId = 'pb-date-weekday'
89
+ render(
90
+ <PbDate
91
+ data={{ testid: testId }}
92
+ showDayOfWeek
93
+ value={TEST_DATE}
94
+ />
95
+ )
96
+
97
+ const kit = screen.getByTestId(testId)
98
+ expect(kit).toHaveTextContent('Monday')
99
+ expect(kit).toHaveTextContent('•')
100
+ expect(kit).toHaveTextContent('August 19')
101
+ })
102
+
103
+ test('renders with showCurrentYear enabled', () => {
104
+ const testId = 'pb-date-current-year'
105
+ render(
106
+ <PbDate
107
+ data={{ testid: testId }}
108
+ showCurrentYear
109
+ value={TEST_DATE}
110
+ />
111
+ )
112
+
113
+ const kit = screen.getByTestId(testId)
114
+ expect(kit).toHaveTextContent(', 2025')
115
+ })
116
+
117
+ test('renders with showIcon enabled for medium size', () => {
118
+ const testId = 'pb-date-icon-md'
119
+ render(
120
+ <PbDate
121
+ data={{ testid: testId }}
122
+ showIcon
123
+ size="md"
124
+ value={TEST_DATE}
125
+ />
126
+ )
127
+
128
+ const kit = screen.getByTestId(testId)
129
+ const iconContainer = kit.querySelector('.pb_icon_kit_container')
130
+ expect(iconContainer).toBeInTheDocument()
131
+ })
132
+
133
+ test('renders with showIcon enabled for small size', () => {
134
+ const testId = 'pb-date-icon-sm'
135
+ render(
136
+ <PbDate
137
+ data={{ testid: testId }}
138
+ showIcon
139
+ size="sm"
140
+ value={TEST_DATE}
141
+ />
142
+ )
143
+
144
+ const kit = screen.getByTestId(testId)
145
+ const iconContainer = kit.querySelector('.pb_icon_kit_container')
146
+ expect(iconContainer).toBeInTheDocument()
147
+ })
148
+
149
+ test('renders different sizes correctly', () => {
150
+ const sizes = ['sm', 'md', 'lg']
151
+
152
+ sizes.forEach(size => {
153
+ const testId = `pb-date-size-${size}`
154
+ render(
155
+ <PbDate
156
+ data={{ testid: testId }}
157
+ size={size}
158
+ value={TEST_DATE}
159
+ />
160
+ )
161
+
162
+ const kit = screen.getByTestId(testId)
163
+ expect(kit).toBeInTheDocument()
164
+
165
+ expect(kit).toHaveTextContent('August 19')
166
+ })
167
+ })
168
+
169
+ test('renders different alignments correctly', () => {
170
+ const alignments = ['left', 'center', 'right']
171
+
172
+ alignments.forEach(alignment => {
173
+ const testId = `pb-date-align-${alignment}`
174
+ render(
175
+ <PbDate
176
+ alignment={alignment}
177
+ data={{ testid: testId }}
178
+ value={TEST_DATE}
179
+ />
180
+ )
181
+
182
+ const kit = screen.getByTestId(testId)
183
+ expect(kit).toHaveClass(`pb_date_kit_${alignment}`)
184
+ })
185
+ })
186
+
187
+ test('renders in dark mode', () => {
188
+ const testId = 'pb-date-dark'
189
+ render(
190
+ <PbDate
191
+ dark
192
+ data={{ testid: testId }}
193
+ value={TEST_DATE}
194
+ />
195
+ )
196
+
197
+ const kit = screen.getByTestId(testId)
198
+ expect(kit).toBeInTheDocument()
199
+ })
200
+
201
+ test('renders in unstyled mode', () => {
202
+ const testId = 'pb-date-unstyled'
203
+ render(
204
+ <PbDate
205
+ data={{ testid: testId }}
206
+ showDayOfWeek
207
+ showIcon
208
+ unstyled
209
+ value={TEST_DATE}
210
+ />
211
+ )
212
+
213
+ const kit = screen.getByTestId(testId)
214
+ expect(kit).toHaveTextContent('Monday')
215
+ expect(kit).toHaveTextContent('•')
216
+ expect(kit).toHaveTextContent('August 19')
217
+
218
+ expect(kit.querySelector('.pb_title_kit')).not.toBeInTheDocument()
219
+ expect(kit.querySelector('.pb_caption_kit')).not.toBeInTheDocument()
220
+ })
221
+
222
+ test('applies custom className', () => {
223
+ const testId = 'pb-date-custom-class'
224
+ const customClass = 'my-custom-date-class'
225
+
226
+ render(
227
+ <PbDate
228
+ className={customClass}
229
+ data={{ testid: testId }}
230
+ value={TEST_DATE}
231
+ />
232
+ )
233
+
234
+ const kit = screen.getByTestId(testId)
235
+ expect(kit).toHaveClass(customClass)
236
+ })
237
+
238
+ test('applies custom id', () => {
239
+ const customId = 'my-custom-date-id'
240
+
241
+ render(
242
+ <PbDate
243
+ id={customId}
244
+ value={TEST_DATE}
245
+ />
246
+ )
247
+
248
+ const kit = document.getElementById(customId)
249
+ expect(kit).toBeInTheDocument()
250
+ expect(kit).toHaveAttribute('id', customId)
251
+ })
252
+ })
253
+
254
+ // Year Display
255
+ describe('Year Display Logic', () => {
256
+ test('hides current year by default', () => {
257
+ DateTime.toYear.mockReturnValue(CURRENT_YEAR)
258
+
259
+ const testId = 'pb-date-current-year-hidden'
260
+ render(
261
+ <PbDate
262
+ data={{ testid: testId }}
263
+ value={TEST_DATE}
264
+ />
265
+ )
266
+
267
+ const kit = screen.getByTestId(testId)
268
+ expect(kit).not.toHaveTextContent(`, ${CURRENT_YEAR}`)
269
+ })
270
+
271
+ test('shows current year when showCurrentYear is true', () => {
272
+ DateTime.toYear.mockReturnValue(CURRENT_YEAR)
273
+
274
+ const testId = 'pb-date-force-current-year'
275
+ render(
276
+ <PbDate
277
+ data={{ testid: testId }}
278
+ showCurrentYear
279
+ value={TEST_DATE}
280
+ />
281
+ )
282
+
283
+ const kit = screen.getByTestId(testId)
284
+ expect(kit).toHaveTextContent(`, ${CURRENT_YEAR}`)
285
+ })
286
+
287
+ test('shows non-current year automatically', () => {
288
+ const pastYear = CURRENT_YEAR - 1
289
+ DateTime.toYear.mockReturnValue(pastYear)
290
+
291
+ const testId = 'pb-date-past-year'
292
+ render(
293
+ <PbDate
294
+ data={{ testid: testId }}
295
+ value={TEST_DATE}
296
+ />
297
+ )
298
+
299
+ const kit = screen.getByTestId(testId)
300
+ expect(kit).toHaveTextContent(`, ${pastYear}`)
301
+ })
302
+
303
+ test('shows future year automatically', () => {
304
+ const futureYear = CURRENT_YEAR + 1
305
+ DateTime.toYear.mockReturnValue(futureYear)
306
+
307
+ const testId = 'pb-date-future-year'
308
+ render(
309
+ <PbDate
310
+ data={{ testid: testId }}
311
+ value={TEST_DATE}
312
+ />
313
+ )
314
+
315
+ const kit = screen.getByTestId(testId)
316
+ expect(kit).toHaveTextContent(`, ${futureYear}`)
317
+ })
318
+ })
319
+
320
+ // Edge Cases
321
+ describe('Edge Cases', () => {
322
+ test('handles leap year date', () => {
323
+ const leapYearDate = new Date('2024-02-29T12:00:00Z')
324
+ DateTime.toMonth.mockReturnValue('February')
325
+ DateTime.toDay.mockReturnValue('29')
326
+ DateTime.toYear.mockReturnValue(2024)
327
+ DateTime.toWeekday.mockReturnValue('Thursday')
328
+
329
+ const testId = 'pb-date-leap-year'
330
+ render(
331
+ <PbDate
332
+ data={{ testid: testId }}
333
+ value={leapYearDate}
334
+ />
335
+ )
336
+
337
+ const kit = screen.getByTestId(testId)
338
+ expect(kit).toHaveTextContent('February 29')
339
+ })
340
+
341
+ test('handles beginning of year', () => {
342
+ const newYearDate = new Date('2023-01-01T00:00:00Z')
343
+ DateTime.toMonth.mockReturnValue('January')
344
+ DateTime.toDay.mockReturnValue('1')
345
+ DateTime.toYear.mockReturnValue(2023)
346
+ DateTime.toWeekday.mockReturnValue('Sunday')
347
+
348
+ const testId = 'pb-date-new-year'
349
+ render(
350
+ <PbDate
351
+ data={{ testid: testId }}
352
+ value={newYearDate}
353
+ />
354
+ )
355
+
356
+ const kit = screen.getByTestId(testId)
357
+ expect(kit).toHaveTextContent('January 1')
358
+ })
359
+
360
+ test('handles end of year', () => {
361
+ const endYearDate = new Date('2023-12-31T23:59:59Z')
362
+ DateTime.toMonth.mockReturnValue('December')
363
+ DateTime.toDay.mockReturnValue('31')
364
+ DateTime.toYear.mockReturnValue(2023)
365
+ DateTime.toWeekday.mockReturnValue('Sunday')
366
+
367
+ const testId = 'pb-date-end-year'
368
+ render(
369
+ <PbDate
370
+ data={{ testid: testId }}
371
+ value={endYearDate}
372
+ />
373
+ )
374
+
375
+ const kit = screen.getByTestId(testId)
376
+ expect(kit).toHaveTextContent('December 31')
377
+ })
378
+
379
+ test('handles very old date', () => {
380
+ const oldDate = new Date('1900-01-01T00:00:00Z')
381
+ DateTime.toMonth.mockReturnValue('January')
382
+ DateTime.toDay.mockReturnValue('1')
383
+ DateTime.toYear.mockReturnValue(1900)
384
+ DateTime.toWeekday.mockReturnValue('Monday')
385
+
386
+ const testId = 'pb-date-old'
387
+ render(
388
+ <PbDate
389
+ data={{ testid: testId }}
390
+ value={oldDate}
391
+ />
392
+ )
393
+
394
+ const kit = screen.getByTestId(testId)
395
+ expect(kit).toHaveTextContent('January 1')
396
+ expect(kit).toHaveTextContent(', 1900')
397
+ })
398
+
399
+ test('handles far future date', () => {
400
+ const futureDate = new Date('2099-12-31T23:59:59Z')
401
+ DateTime.toMonth.mockReturnValue('December')
402
+ DateTime.toDay.mockReturnValue('31')
403
+ DateTime.toYear.mockReturnValue(2099)
404
+ DateTime.toWeekday.mockReturnValue('Friday')
405
+
406
+ const testId = 'pb-date-future'
407
+ render(
408
+ <PbDate
409
+ data={{ testid: testId }}
410
+ value={futureDate}
411
+ />
412
+ )
413
+
414
+ const kit = screen.getByTestId(testId)
415
+ expect(kit).toHaveTextContent('December 31')
416
+ expect(kit).toHaveTextContent(', 2099')
417
+ })
418
+ })
419
+
420
+ // Accessibility and HTML
421
+ describe('Accessibility and HTML Attributes', () => {
422
+ test('applies aria attributes correctly', () => {
423
+ const testId = 'pb-date-aria'
424
+ const ariaLabel = 'Custom date label'
425
+
426
+ render(
427
+ <PbDate
428
+ aria={{ label: ariaLabel }}
429
+ data={{ testid: testId }}
430
+ value={TEST_DATE}
431
+ />
432
+ )
433
+
434
+ const kit = screen.getByTestId(testId)
435
+ expect(kit).toHaveAttribute('aria-label', ariaLabel)
436
+ })
437
+
438
+ test('applies data attributes correctly', () => {
439
+ const testId = 'pb-date-data'
440
+ const customData = 'custom-value'
441
+
442
+ render(
443
+ <PbDate
444
+ data={{ testid: testId, custom: customData }}
445
+ value={TEST_DATE}
446
+ />
447
+ )
448
+
449
+ const kit = screen.getByTestId(testId)
450
+ expect(kit).toHaveAttribute('data-custom', customData)
451
+ })
452
+
453
+ test('applies HTML options correctly', () => {
454
+ const testId = 'pb-date-html'
455
+ const title = 'Custom title'
456
+
457
+ render(
458
+ <PbDate
459
+ data={{ testid: testId }}
460
+ htmlOptions={{ title }}
461
+ value={TEST_DATE}
462
+ />
463
+ )
464
+
465
+ const kit = screen.getByTestId(testId)
466
+ expect(kit).toHaveAttribute('title', title)
467
+ })
468
+ })
469
+
470
+ // Componenet Integration
471
+ describe('Component Integration', () => {
472
+ test('calls DateTime utility functions correctly', () => {
473
+ render(
474
+ <PbDate value={TEST_DATE} />
475
+ )
476
+
477
+ expect(DateTime.toWeekday).toHaveBeenCalledWith(TEST_DATE)
478
+ expect(DateTime.toMonth).toHaveBeenCalledWith(TEST_DATE)
479
+ expect(DateTime.toDay).toHaveBeenCalledWith(TEST_DATE)
480
+ expect(DateTime.toYear).toHaveBeenCalledWith(TEST_DATE)
481
+ })
482
+
483
+ test('renders all components together correctly', () => {
484
+ const testId = 'pb-date-full-featured'
485
+ render(
486
+ <PbDate
487
+ alignment="center"
488
+ data={{ testid: testId }}
489
+ showDayOfWeek
490
+ showIcon
491
+ size="lg"
492
+ value={TEST_DATE}
493
+ />
494
+ )
495
+
496
+ const kit = screen.getByTestId(testId)
497
+ expect(kit).toHaveClass('pb_date_kit_center')
498
+ expect(kit).toHaveTextContent('Monday')
499
+ expect(kit).toHaveTextContent('•')
500
+ expect(kit).toHaveTextContent('August 19')
501
+
502
+ const iconContainer = kit.querySelector('.pb_icon_kit_container')
503
+ expect(iconContainer).toBeInTheDocument()
504
+ })
505
+ })
506
+ })
@@ -0,0 +1,4 @@
1
+ <%= pb_rails("date", props: {
2
+ date: Date.today,
3
+ show_current_year: true
4
+ }) %>
@@ -0,0 +1,17 @@
1
+ import React from 'react'
2
+
3
+ import FormattedDate from '../../pb_date/_date'
4
+
5
+ const DateWithShowCurrentYear = (props) => {
6
+ return (
7
+ <>
8
+ <FormattedDate
9
+ showCurrentYear
10
+ value={new Date()}
11
+ {...props}
12
+ />
13
+ </>
14
+ )
15
+ }
16
+
17
+ export default DateWithShowCurrentYear
@@ -0,0 +1 @@
1
+ By default, the Date kit does NOT display the year if it is the current year. If you want to display the current year you can do so by setting `showCurrentYear`/`show_current_year` to true as shown here.
@@ -5,12 +5,14 @@ examples:
5
5
  - date_variants: Variants
6
6
  - date_alignment: Alignment
7
7
  - date_timezone: Timezones
8
+ - date_with_show_current_year: Show Current Year
8
9
  - date_unstyled: Unstyled
9
10
 
10
11
  react:
11
12
  - date_default: Default
12
13
  - date_variants: Variants
13
14
  - date_alignment: Alignment
15
+ - date_with_show_current_year: Show Current Year
14
16
  - date_unstyled: Unstyled
15
17
 
16
18
  swift:
@@ -2,3 +2,4 @@ export { default as DateDefault } from './_date_default.jsx'
2
2
  export { default as DateVariants } from './_date_variants.jsx'
3
3
  export { default as DateAlignment } from './_date_alignment.jsx'
4
4
  export { default as DateUnstyled } from './_date_unstyled.jsx'
5
+ export { default as DateWithShowCurrentYear } from './_date_with_show_current_year.jsx'
@@ -4,6 +4,7 @@ import classnames from 'classnames'
4
4
  import { buildAriaProps, buildCss, buildDataProps, buildHtmlProps } from '../utilities/props'
5
5
  import { deprecatedProps, globalProps, GlobalProps } from '../utilities/globalProps'
6
6
  import { getAllIcons } from "../utilities/icons/allicons"
7
+ import { camelToSnakeCase } from '../utilities/text'
7
8
 
8
9
  import datePickerHelper from './date_picker_helper'
9
10
  import Icon from '../pb_icon/_icon'
@@ -114,6 +115,20 @@ const DatePicker = (props: DatePickerProps): React.ReactElement => {
114
115
  const inputAriaProps = buildAriaProps(inputAria)
115
116
  const inputDataProps = buildDataProps(inputData)
116
117
 
118
+ // Convert cursor prop to CSS-style format to apply to input tag below
119
+ const getCursorStyle = (cursor?: string): string => {
120
+ // If input is disabled, always use 'not-allowed'
121
+ if (disableInput) return 'not-allowed'
122
+
123
+ // If cursor prop is provided, convert it to styling format
124
+ if (cursor) {
125
+ return camelToSnakeCase(cursor).replace(/_/g, '-')
126
+ }
127
+
128
+ // Default to 'pointer'
129
+ return 'pointer'
130
+ }
131
+
117
132
  useEffect(() => {
118
133
  datePickerHelper({
119
134
  allowInput,
@@ -149,6 +164,7 @@ const DatePicker = (props: DatePickerProps): React.ReactElement => {
149
164
  required: false,
150
165
  }, scrollContainer)
151
166
  }, initializeOnce ? [] : undefined)
167
+
152
168
  const filteredProps = {...props}
153
169
  if (filteredProps.marginBottom === undefined) {
154
170
  filteredProps.marginBottom = "sm"
@@ -163,6 +179,7 @@ const DatePicker = (props: DatePickerProps): React.ReactElement => {
163
179
  error ? 'error' : null,
164
180
  className
165
181
  )
182
+
166
183
  const iconWrapperClass = () => {
167
184
  let base = 'cal_icon_wrapper'
168
185
  if (dark) {
@@ -176,6 +193,7 @@ const DatePicker = (props: DatePickerProps): React.ReactElement => {
176
193
  }
177
194
  return base
178
195
  }
196
+
179
197
  const angleDown = getAllIcons()["angleDown"].icon as unknown as { [key: string]: SVGElement }
180
198
 
181
199
  return (
@@ -206,6 +224,7 @@ const DatePicker = (props: DatePickerProps): React.ReactElement => {
206
224
  name={name}
207
225
  onChange={inputOnChange}
208
226
  placeholder={placeholder}
227
+ style={{ cursor: getCursorStyle(filteredProps.cursor) }}
209
228
  value={inputValue}
210
229
  />
211
230
 
@@ -10,6 +10,7 @@
10
10
  <%= pb_rails("text_input", props: {
11
11
  aria: object.input_aria,
12
12
  autocomplete: false,
13
+ cursor: object.cursor,
13
14
  dark: object.dark,
14
15
  data: object.input_data,
15
16
  disabled: object.disable_input,
@@ -284,6 +284,9 @@ export default class PbDropdown extends PbEnhancedElement {
284
284
  this.adjustDropdownHeight();
285
285
  }
286
286
  });
287
+ this.element.querySelector(DROPDOWN_INPUT).value = Array.from(this.selectedOptions)
288
+ .map((opt) => JSON.parse(opt).id)
289
+ .join(",");
287
290
  } else {
288
291
  options.forEach((option) => {
289
292
  option.classList.remove("pb_dropdown_option_selected");
@@ -52,7 +52,7 @@ const FixedConfirmationToast = (props: FixedConfirmationToastProps): React.React
52
52
  } = props;
53
53
 
54
54
  const returnedIcon = icon || iconMap[status]
55
- const iconClass = icon ? "custom_icon" : ""
55
+ const iconClass = icon && icon !== "none" ? "custom_icon" : ""
56
56
 
57
57
  const css = classnames(
58
58
  `pb_fixed_confirmation_toast_kit_${status}`,
@@ -92,7 +92,7 @@ const FixedConfirmationToast = (props: FixedConfirmationToastProps): React.React
92
92
  onClick={handleClick}
93
93
  {...htmlProps}
94
94
  >
95
- {returnedIcon && (
95
+ {returnedIcon && icon !== "none" && (
96
96
  <Icon
97
97
  className="pb_icon"
98
98
  fixedWidth
@@ -0,0 +1,22 @@
1
+ <%= pb_rails("fixed_confirmation_toast", props: {
2
+ text: "Error Message",
3
+ status: "error",
4
+ icon: "none",
5
+ closeable: true
6
+ })%>
7
+
8
+ <br><br>
9
+
10
+ <%= pb_rails("fixed_confirmation_toast", props: {
11
+ text: "Items Successfully Moved",
12
+ status: "success",
13
+ icon: "none"
14
+ })%>
15
+
16
+ <br><br>
17
+
18
+ <%= pb_rails("fixed_confirmation_toast", props: {
19
+ text: "Scan to Assign Selected Items",
20
+ status: "neutral",
21
+ icon: "none"
22
+ })%>