playbook_ui 12.37.0 → 12.38.0.pre.alpha.PBNTR78selectkitmultipleprop1094

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 (38) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/pb_date/_date.tsx +7 -8
  3. data/app/pb_kits/playbook/pb_date/docs/_date_alignment.jsx +2 -2
  4. data/app/pb_kits/playbook/pb_date/docs/_date_default.jsx +29 -5
  5. data/app/pb_kits/playbook/pb_date/docs/_date_unstyled.jsx +2 -2
  6. data/app/pb_kits/playbook/pb_date/docs/_date_variants.jsx +5 -5
  7. data/app/pb_kits/playbook/pb_date_range_inline/_date_range_inline.tsx +45 -31
  8. data/app/pb_kits/playbook/pb_date_range_stacked/_date_range_stacked.tsx +5 -3
  9. data/app/pb_kits/playbook/pb_date_stacked/_date_stacked.tsx +24 -21
  10. data/app/pb_kits/playbook/pb_date_time/_date_time.tsx +1 -1
  11. data/app/pb_kits/playbook/pb_date_time/dateTime.test.js +1 -1
  12. data/app/pb_kits/playbook/pb_date_time_stacked/_date_time_stacked.tsx +2 -2
  13. data/app/pb_kits/playbook/pb_date_time_stacked/date_time_stacked.test.js +1 -1
  14. data/app/pb_kits/playbook/pb_date_year_stacked/_date_year_stacked.tsx +6 -8
  15. data/app/pb_kits/playbook/pb_kit/dateTime.ts +146 -63
  16. data/app/pb_kits/playbook/pb_label_value/_label_value.tsx +52 -31
  17. data/app/pb_kits/playbook/pb_message/_message.tsx +24 -24
  18. data/app/pb_kits/playbook/pb_select/_select.scss +37 -0
  19. data/app/pb_kits/playbook/pb_select/_select.tsx +9 -5
  20. data/app/pb_kits/playbook/pb_select/docs/_select_attributes.html.erb +26 -0
  21. data/app/pb_kits/playbook/pb_select/docs/_select_attributes.md +1 -0
  22. data/app/pb_kits/playbook/pb_select/docs/_select_multiple.html.erb +36 -0
  23. data/app/pb_kits/playbook/pb_select/docs/_select_multiple.jsx +50 -0
  24. data/app/pb_kits/playbook/pb_select/docs/_select_multiple.md +1 -0
  25. data/app/pb_kits/playbook/pb_select/docs/example.yml +3 -0
  26. data/app/pb_kits/playbook/pb_select/docs/index.js +1 -0
  27. data/app/pb_kits/playbook/pb_select/select.html.erb +5 -9
  28. data/app/pb_kits/playbook/pb_select/select.rb +14 -0
  29. data/app/pb_kits/playbook/pb_select/select.test.js +17 -0
  30. data/app/pb_kits/playbook/pb_time/_time.tsx +9 -11
  31. data/app/pb_kits/playbook/pb_time_range_inline/_time_range_inline.tsx +46 -49
  32. data/app/pb_kits/playbook/pb_time_stacked/_time_stacked.tsx +4 -6
  33. data/app/pb_kits/playbook/pb_timestamp/_timestamp.tsx +11 -11
  34. data/app/pb_kits/playbook/pb_weekday_stacked/_weekday_stacked.tsx +8 -11
  35. data/dist/playbook-rails.js +7 -7
  36. data/lib/playbook/version.rb +2 -2
  37. metadata +12 -8
  38. data/app/pb_kits/playbook/pb_logistic/_logistic.jsx +0 -120
@@ -1,6 +1,6 @@
1
1
  <%= content_tag(:div,
2
- data: object.data,
3
2
  aria: object.aria,
3
+ data: object.data,
4
4
  class: object.classnames) do %>
5
5
  <% if object.label %>
6
6
  <label class="pb_select_kit_label" for="<%= object.name %>">
@@ -19,17 +19,13 @@
19
19
  selected: object.selected,
20
20
  disabled: object.disabled_options,
21
21
  ),
22
- id: object.id,
23
- prompt: object.blank_selection,
24
- disabled: object.disabled,
25
- required: object.required,
26
- multiple: object.multiple,
27
- onchange: object.onchange,
28
- include_blank: object.include_blank,
22
+ object.all_attributes
29
23
  )
30
24
  %>
31
25
  <%= pb_rails("body", props: { status: "negative", text: object.error }) %>
32
26
  <% end %>
33
- <%= pb_rails("icon", props: { icon: "angle-down", fixed_width: true, classname: "pb_select_kit_caret"}) %>
27
+ <% if object.multiple != true %>
28
+ <%= pb_rails("icon", props: { icon: "angle-down", fixed_width: true, classname: "pb_select_kit_caret"}) %>
29
+ <% end %>
34
30
  </label>
35
31
  <% end %>
@@ -6,6 +6,8 @@ require "action_view"
6
6
  module Playbook
7
7
  module PbSelect
8
8
  class Select < Playbook::KitBase
9
+ prop :attributes, type: Playbook::Props::Hash,
10
+ default: {}
9
11
  prop :blank_selection
10
12
  prop :compact, type: Playbook::Props::Boolean, default: false
11
13
  prop :disabled, type: Playbook::Props::Boolean, default: false
@@ -23,6 +25,18 @@ module Playbook
23
25
  classname + inline_class + compact_class
24
26
  end
25
27
 
28
+ def all_attributes
29
+ {
30
+ id: id,
31
+ prompt: blank_selection,
32
+ disabled: disabled,
33
+ required: required,
34
+ multiple: multiple,
35
+ onchange: onchange,
36
+ include_blank: include_blank,
37
+ }.merge(attributes)
38
+ end
39
+
26
40
  def classname
27
41
  generate_classname("pb_select", select_margin_bottom, separator: " ")
28
42
  end
@@ -49,3 +49,20 @@ test('returns dark class name', () => {
49
49
  const kit = screen.getByTestId(testId)
50
50
  expect(kit).toHaveClass(`${kitClass} dark`)
51
51
  })
52
+
53
+ test('returns multiple variant', () => {
54
+ render(
55
+ <Select
56
+ data={{ testid: "selectMultiple" }}
57
+ label="Favorite Food"
58
+ multiple
59
+ name="food"
60
+ options={options}
61
+ />
62
+ )
63
+
64
+ const kit = screen.getByTestId("selectMultiple");
65
+ const selectElement = kit.querySelector('select');
66
+
67
+ expect(selectElement).toHaveAttribute('multiple', '');
68
+ });
@@ -1,9 +1,9 @@
1
1
  import React from "react";
2
2
  import classnames from "classnames";
3
3
 
4
- import DateTime from "../pb_kit/dateTime";
5
4
  import { buildCss } from "../utilities/props";
6
5
  import { globalProps, GlobalProps } from "../utilities/globalProps";
6
+ import DateTime from '../pb_kit/dateTime';
7
7
 
8
8
  import Body from "../pb_body/_body";
9
9
  import Caption from "../pb_caption/_caption";
@@ -13,7 +13,7 @@ type TimeProps = {
13
13
  align?: "left" | "center" | "right";
14
14
  className?: string | string[];
15
15
  data?: string;
16
- date: string;
16
+ date: Date;
17
17
  dark?: boolean;
18
18
  id?: string;
19
19
  showIcon?: boolean;
@@ -41,8 +41,6 @@ const Time = (props: TimeProps) => {
41
41
  className
42
42
  );
43
43
 
44
- const dateTimestamp = new DateTime({ value: date, zone: timeZone });
45
-
46
44
  return (
47
45
  <div className={classes}>
48
46
  {showIcon && (
@@ -70,18 +68,18 @@ const Time = (props: TimeProps) => {
70
68
  )
71
69
  )}
72
70
 
73
- <time dateTime={date}>
71
+ <time dateTime={date.toString()}>
74
72
  <span>
75
73
  {unstyled
76
74
  ? (
77
75
  <>
78
76
  <span>
79
- {dateTimestamp.toTimeWithMeridian()}
77
+ {DateTime.toTimeWithMeridiem(date, timeZone)}
80
78
  </span>
81
79
  {" "}
82
80
  {showTimezone && (
83
81
  <span>
84
- {dateTimestamp.toTimezone()}
82
+ {DateTime.toTimeZone(date, timeZone)}
85
83
  </span>
86
84
  )}
87
85
  </>
@@ -92,13 +90,13 @@ const Time = (props: TimeProps) => {
92
90
  <Body
93
91
  className="pb_time"
94
92
  tag="span"
95
- text={dateTimestamp.toTimeWithMeridian()}
93
+ text={DateTime.toTimeWithMeridiem(date, timeZone)}
96
94
  />{" "}
97
95
  {showTimezone && (
98
96
  <Body
99
97
  color="light"
100
98
  tag="span"
101
- text={dateTimestamp.toTimezone()}
99
+ text={DateTime.toTimeZone(date, timeZone)}
102
100
  />
103
101
  )}
104
102
  </>
@@ -108,13 +106,13 @@ const Time = (props: TimeProps) => {
108
106
  <Caption
109
107
  color="light"
110
108
  tag="span"
111
- text={dateTimestamp.toTimeWithMeridian()}
109
+ text={DateTime.toTimeWithMeridiem(date, timeZone)}
112
110
  />{" "}
113
111
  {showTimezone && (
114
112
  <Caption
115
113
  color="light"
116
114
  tag="span"
117
- text={dateTimestamp.toTimezone()}
115
+ text={DateTime.toTimeZone(date, timeZone)}
118
116
  />
119
117
  )}
120
118
  </>
@@ -1,9 +1,9 @@
1
1
  import React from 'react'
2
2
  import classnames from 'classnames'
3
3
 
4
- import DateTime from '../pb_kit/dateTime'
5
4
  import { globalProps, GlobalProps } from '../utilities/globalProps'
6
5
  import { buildAriaProps, buildDataProps } from '../utilities/props'
6
+ import DateTime from '../pb_kit/dateTime';
7
7
 
8
8
  import Body from '../pb_body/_body'
9
9
  import Caption from '../pb_caption/_caption'
@@ -19,23 +19,20 @@ type TimeRangeInlineProps = {
19
19
  dark?: boolean,
20
20
  icon?: boolean,
21
21
  timezone?: boolean,
22
- startTime: string,
23
- endTime: string,
22
+ startTime: Date,
23
+ endTime: Date,
24
24
  } & GlobalProps
25
25
 
26
- const timezoneString = (dateValue: string) => {
27
- const date = new DateTime({ value: dateValue })
28
- return `${date.convertToTimezone()}`
26
+ const timezoneString = (dateValue: Date) => {
27
+ return `${DateTime.toTimeZone(dateValue)}`
29
28
  }
30
29
 
31
- const dateTimestamp = (dateValue: string) => {
32
- const date = new DateTime({ value: dateValue })
33
- return `${date.toHour()}:${date.toMinute()}${date.toMeridian()}`
30
+ const dateTimestamp = (dateValue: Date) => {
31
+ return `${DateTime.toHour(dateValue)}:${DateTime.toMinute(dateValue)}${DateTime.toMeridiem(dateValue)}`
34
32
  }
35
33
 
36
- const dateTimeIso = (dateValue: string) => {
37
- const date = new DateTime({ value: dateValue })
38
- return date.toIso()
34
+ const dateTimeIso = (dateValue: Date) => {
35
+ return DateTime.toIso(dateValue)
39
36
  }
40
37
 
41
38
  const TimeRangeInline = (props: TimeRangeInlineProps) => {
@@ -59,10 +56,10 @@ const TimeRangeInline = (props: TimeRangeInlineProps) => {
59
56
  const separator = (
60
57
  <Body color="light">
61
58
  <Icon
62
- className="pb_time_range_inline_arrow"
63
- dark={dark}
64
- fixedWidth
65
- icon="long-arrow-right"
59
+ className="pb_time_range_inline_arrow"
60
+ dark={dark}
61
+ fixedWidth
62
+ icon="long-arrow-right"
66
63
  />
67
64
  </Body>
68
65
  )
@@ -71,16 +68,16 @@ const TimeRangeInline = (props: TimeRangeInlineProps) => {
71
68
  return (
72
69
  icon &&
73
70
  <Body
74
- color="light"
75
- tag="span"
71
+ color="light"
72
+ tag="span"
76
73
  >
77
74
  <Icon
78
- className="pb_time_range_inline_icon"
79
- dark={dark}
80
- fixedWidth
81
- icon="clock"
82
- size={size}
83
- tag="span"
75
+ className="pb_time_range_inline_icon"
76
+ dark={dark}
77
+ fixedWidth
78
+ icon="clock"
79
+ size={size}
80
+ tag="span"
84
81
  />
85
82
  </Body>
86
83
  )
@@ -88,17 +85,17 @@ const TimeRangeInline = (props: TimeRangeInlineProps) => {
88
85
 
89
86
  return (
90
87
  <div
91
- {...ariaProps}
92
- {...dataProps}
93
- className={classnames('pb_time_range_inline_kit_' + alignment, globalProps(props), className)}
94
- id={id}
88
+ {...ariaProps}
89
+ {...dataProps}
90
+ className={classnames('pb_time_range_inline_kit_' + alignment, globalProps(props), className)}
91
+ id={id}
95
92
  >
96
93
  <div className="pb_time_range_inline_wrapper">
97
94
  {size == 'xs' &&
98
95
  <>
99
96
  <Caption
100
- dark={dark}
101
- tag="span"
97
+ dark={dark}
98
+ tag="span"
102
99
  >
103
100
  {iconContent()}
104
101
  <time dateTime={dateTimeIso(startTime)}>
@@ -108,15 +105,15 @@ const TimeRangeInline = (props: TimeRangeInlineProps) => {
108
105
  </time>
109
106
  </Caption>
110
107
  <Caption
111
- className="pb_time_range_inline_arrow"
112
- dark={dark}
113
- tag="span"
108
+ className="pb_time_range_inline_arrow"
109
+ dark={dark}
110
+ tag="span"
114
111
  >
115
112
  {separator}
116
113
  </Caption>
117
114
  <Caption
118
- dark={dark}
119
- tag="span"
115
+ dark={dark}
116
+ tag="span"
120
117
  >
121
118
  <time dateTime={dateTimeIso(endTime)}>
122
119
  {` ${dateTimestamp(
@@ -126,9 +123,9 @@ const TimeRangeInline = (props: TimeRangeInlineProps) => {
126
123
  </Caption>
127
124
  {timezone &&
128
125
  <Caption
129
- className="pb_time_range_inline_timezone"
130
- dark={dark}
131
- tag="span"
126
+ className="pb_time_range_inline_timezone"
127
+ dark={dark}
128
+ tag="span"
132
129
  >
133
130
  {timezoneString(endTime)}
134
131
  </Caption>
@@ -138,8 +135,8 @@ const TimeRangeInline = (props: TimeRangeInlineProps) => {
138
135
  {size == 'sm' &&
139
136
  <>
140
137
  <Body
141
- dark={dark}
142
- tag="span"
138
+ dark={dark}
139
+ tag="span"
143
140
  >
144
141
  {iconContent()}
145
142
  <time dateTime={dateTimeIso(startTime)}>
@@ -149,15 +146,15 @@ const TimeRangeInline = (props: TimeRangeInlineProps) => {
149
146
  </time>
150
147
  </Body>
151
148
  <Body
152
- className="pb_time_range_inline_arrow"
153
- dark={dark}
154
- tag="span"
149
+ className="pb_time_range_inline_arrow"
150
+ dark={dark}
151
+ tag="span"
155
152
  >
156
153
  {separator}
157
154
  </Body>
158
155
  <Body
159
- dark={dark}
160
- tag="span"
156
+ dark={dark}
157
+ tag="span"
161
158
  >
162
159
  <time dateTime={dateTimeIso(endTime)}>
163
160
  {` ${dateTimestamp(
@@ -167,10 +164,10 @@ const TimeRangeInline = (props: TimeRangeInlineProps) => {
167
164
  </Body>
168
165
  {timezone &&
169
166
  <Body
170
- className="pb_time_range_inline_timezone"
171
- color="light"
172
- dark={dark}
173
- tag="span"
167
+ className="pb_time_range_inline_timezone"
168
+ color="light"
169
+ dark={dark}
170
+ tag="span"
174
171
  >
175
172
  {timezoneString(endTime)}
176
173
  </Body>
@@ -1,9 +1,9 @@
1
1
  import React from 'react'
2
2
  import classnames from 'classnames'
3
3
 
4
- import DateTime from '../pb_kit/dateTime'
5
4
  import { buildCss, buildDataProps } from '../utilities/props'
6
5
  import { deprecatedProps, globalProps } from '../utilities/globalProps'
6
+ import DateTime from '../pb_kit/dateTime';
7
7
 
8
8
  import Body from '../pb_body/_body'
9
9
  import Caption from '../pb_caption/_caption'
@@ -13,7 +13,7 @@ type TimeStackedProps = {
13
13
  className?: string | string[],
14
14
  dark?: boolean,
15
15
  data?: { [key: string]: string },
16
- date?: string,
16
+ date?: Date,
17
17
  id?: string,
18
18
  time?: number | Date,
19
19
  timeZone?: string,
@@ -39,8 +39,6 @@ const TimeStackedDefault = (props: TimeStackedProps): React.ReactElement => {
39
39
  )
40
40
  const dataProps = buildDataProps(data)
41
41
 
42
- const dateTimestamp = new DateTime({ value: date ? date : new Date(time), zone: timeZone })
43
-
44
42
  return (
45
43
  <div
46
44
  className={classes}
@@ -52,13 +50,13 @@ const TimeStackedDefault = (props: TimeStackedProps): React.ReactElement => {
52
50
  dark={dark}
53
51
  >
54
52
  <time>
55
- {dateTimestamp.toTimeWithMeridian()}
53
+ {DateTime.toTimeWithMeridiem(date ? date : new Date(time), timeZone)}
56
54
  <Caption
57
55
  className="pb_time_stacked"
58
56
  color="light"
59
57
  dark={dark}
60
58
  tag="span"
61
- text={dateTimestamp.toTimezone()}
59
+ text={DateTime.toTimeZone(date ? date : new Date(time), timeZone)}
62
60
  />
63
61
  </time>
64
62
  </Body>
@@ -1,9 +1,10 @@
1
1
  import React from 'react'
2
2
  import classnames from 'classnames'
3
3
 
4
- import DateTime from '../pb_kit/dateTime'
5
4
  import { buildAriaProps, buildCss, buildDataProps } from '../utilities/props'
6
5
  import { globalProps } from '../utilities/globalProps'
6
+ import DateTime from '../pb_kit/dateTime';
7
+
7
8
 
8
9
  import Caption from '../pb_caption/_caption'
9
10
 
@@ -14,7 +15,7 @@ type TimestampProps = {
14
15
  dark?: boolean,
15
16
  data?: string,
16
17
  text: string,
17
- timestamp: string,
18
+ timestamp: Date | string,
18
19
  timezone: string,
19
20
  id?: string,
20
21
  showDate?: boolean,
@@ -32,8 +33,8 @@ const Timestamp = (props: TimestampProps): React.ReactElement => {
32
33
  dark = false,
33
34
  data = {},
34
35
  text,
35
- timestamp,
36
36
  timezone,
37
+ timestamp,
37
38
  showDate = true,
38
39
  showUser = false,
39
40
  hideUpdated = false,
@@ -53,26 +54,25 @@ const Timestamp = (props: TimestampProps): React.ReactElement => {
53
54
  )
54
55
 
55
56
  const currentYear = new Date().getFullYear().toString()
56
- const dateTimestamp = new DateTime({ value: timestamp, zone: timezone })
57
- const dateDisplay = `${dateTimestamp.toMonth()} ${dateTimestamp.toDay()}`
57
+ const dateDisplay = `${DateTime.toMonth(timestamp, timezone)} ${DateTime.toDay(timestamp, timezone)}`
58
58
  const shouldShowUser = showUser == true && text.length > 0
59
59
  const shouldShowTimezone = showTimezone == true && timezone.length > 0
60
60
  const updatedText = hideUpdated ? "" : "Last updated"
61
61
  const userDisplay = shouldShowUser ? ` by ${text}` : ''
62
62
 
63
- let timeDisplay = `${dateTimestamp.toHour()}:${dateTimestamp.toMinute()}${dateTimestamp.toMeridian()}`
63
+ let timeDisplay = `${DateTime.toHour(timestamp, timezone)}:${DateTime.toMinute(timestamp, timezone)}${DateTime.toMeridiem(timestamp, timezone)}`
64
64
 
65
65
  const fullTimeDisplay = () => {
66
66
  if (shouldShowTimezone) {
67
- timeDisplay = `${timeDisplay} ${dateTimestamp.toTimezone()}`
67
+ timeDisplay = `${timeDisplay} ${DateTime.toTimeZone(timestamp, timezone)}`
68
68
  }
69
69
  return timeDisplay
70
70
  }
71
71
 
72
72
  const fullDateDisplay = () => {
73
- let fullDisplay = `${dateTimestamp.toMonth()} ${dateTimestamp.toDay()}`
74
- if (dateTimestamp.toYear() !== currentYear) {
75
- fullDisplay = `${fullDisplay}, ${dateTimestamp.toYear()}`
73
+ let fullDisplay = `${DateTime.toMonth(timestamp, timezone)} ${DateTime.toDay(timestamp, timezone)}`
74
+ if (DateTime.toYear(timestamp, timezone).toString() !== currentYear) {
75
+ fullDisplay = `${fullDisplay}, ${DateTime.toYear(timestamp, timezone)}`
76
76
  }
77
77
  return `${fullDisplay} ${' \u00b7 '} ${fullTimeDisplay()}`
78
78
  }
@@ -82,7 +82,7 @@ const Timestamp = (props: TimestampProps): React.ReactElement => {
82
82
  }
83
83
 
84
84
  const formatElapsedString = () => {
85
- return `${updatedText} ${userDisplay} ${dateTimestamp.value.fromNow()}`
85
+ return `${updatedText} ${userDisplay} ${DateTime.fromNow(timestamp)}`
86
86
  }
87
87
 
88
88
  const captionText = () => {
@@ -7,8 +7,7 @@ import { buildAriaProps, buildCss, buildDataProps } from '../utilities/props'
7
7
 
8
8
  import Caption from '../pb_caption/_caption'
9
9
  import Title from '../pb_title/_title'
10
-
11
- import DateTime from '../pb_kit/dateTime'
10
+ import DateTime from '../pb_kit/dateTime';
12
11
 
13
12
  type WeekdayStackedProps = {
14
13
  align?: "left" | "center" | "right",
@@ -22,22 +21,20 @@ type WeekdayStackedProps = {
22
21
  compact?: boolean,
23
22
  }
24
23
 
25
- const getDayOfWeek = (value: Date | string, compact: boolean) => {
26
- const dateTime = new DateTime({ value })
24
+ const getDayOfWeek = (value: Date, compact: boolean) => {
27
25
  if (compact) {
28
- return dateTime.toDayAbbr()
26
+ return DateTime.toDayAbbr(value)
29
27
  } else {
30
- return dateTime.toWeekday()
28
+ return DateTime.toWeekday(value)
31
29
  }
32
30
  }
33
31
 
34
- const getFormattedDate = (value: Date | string, variant: "day_only" | "month_day" | "expanded") => {
35
- const dateTime = new DateTime({ value })
32
+ const getFormattedDate = (value: Date, variant: "day_only" | "month_day" | "expanded") => {
36
33
  if (variant === 'day_only') {
37
- return dateTime.toDay()
34
+ return DateTime.toDay(value).toString()
38
35
  } else {
39
- const format = variant === 'expanded' ? '%b %-d' : '%-m/%-d'
40
- return dateTime.toCustomFormat(format)
36
+ const format = variant === 'expanded' ? 'expanded' : 'month_day'
37
+ return DateTime.toCustomFormat(value, format)
41
38
  }
42
39
  }
43
40