playbook_ui 12.37.0.pre.alpha.PLAYaddingdatapropselectkit1071 → 12.37.0.pre.alpha.svgiconmethods1064

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 (36) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/pb_date/_date.tsx +8 -7
  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 +5 -29
  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 +31 -45
  8. data/app/pb_kits/playbook/pb_date_range_stacked/_date_range_stacked.tsx +3 -5
  9. data/app/pb_kits/playbook/pb_date_stacked/_date_stacked.tsx +21 -24
  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 +8 -6
  15. data/app/pb_kits/playbook/pb_icon/docs/_icon_animate.html.erb +1 -0
  16. data/app/pb_kits/playbook/pb_icon/docs/_icon_custom.html.erb +2 -0
  17. data/app/pb_kits/playbook/pb_icon/docs/_icon_svg.html.erb +5 -0
  18. data/app/pb_kits/playbook/pb_icon/docs/example.yml +10 -9
  19. data/app/pb_kits/playbook/pb_icon/icon.html.erb +3 -3
  20. data/app/pb_kits/playbook/pb_icon/icon.rb +19 -0
  21. data/app/pb_kits/playbook/pb_kit/dateTime.ts +63 -146
  22. data/app/pb_kits/playbook/pb_label_value/_label_value.tsx +31 -52
  23. data/app/pb_kits/playbook/pb_logistic/_logistic.jsx +120 -0
  24. data/app/pb_kits/playbook/pb_message/_message.tsx +24 -24
  25. data/app/pb_kits/playbook/pb_select/docs/example.yml +0 -1
  26. data/app/pb_kits/playbook/pb_select/select.html.erb +1 -1
  27. data/app/pb_kits/playbook/pb_time/_time.tsx +11 -9
  28. data/app/pb_kits/playbook/pb_time_range_inline/_time_range_inline.tsx +49 -46
  29. data/app/pb_kits/playbook/pb_time_stacked/_time_stacked.tsx +6 -4
  30. data/app/pb_kits/playbook/pb_timestamp/_timestamp.tsx +11 -11
  31. data/app/pb_kits/playbook/pb_weekday_stacked/_weekday_stacked.tsx +11 -8
  32. data/dist/playbook-rails.js +7 -7
  33. data/lib/playbook/version.rb +1 -1
  34. metadata +4 -4
  35. data/app/pb_kits/playbook/pb_select/docs/_select_data_attributes.html.erb +0 -24
  36. data/app/pb_kits/playbook/pb_select/docs/_select_data_attributes.md +0 -1
@@ -1,173 +1,90 @@
1
- const ABBR_DAYS = ['SU', 'M', 'T', 'W', 'TH', 'F', 'S']
2
1
 
3
- const days = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
2
+ import moment, { Moment } from 'moment'
3
+ import 'moment-strftime'
4
+ import 'moment-timezone'
4
5
 
5
- const months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
6
+ type DateTimeType = {
7
+ value: string | Date,
8
+ zone?: string,
9
+ }
6
10
 
7
- const formatDate = (newDate: Date | string) => {
8
- const isTimelessStringDate = typeof newDate === "string" && !newDate.includes("T")
11
+ const ABBR_DAYS = ['SU', 'M', 'T', 'W', 'TH', 'F', 'S']
9
12
 
10
- if (isTimelessStringDate) {
11
- const unhyphenatedDate = new Date((newDate as string).replace(/-/g, "/"))
12
- return unhyphenatedDate
13
+ export default class DateTime {
14
+ value: Moment & any
15
+ constructor({ value, zone = 'America/New_York' }: DateTimeType) {
16
+ this.value = this.convertToTimestampZone(value, zone)
13
17
  }
14
18
 
15
- return new Date(newDate)
16
- }
19
+ convertToTimestampZone(value: string | Date, zone: string) {
20
+ return moment(value).tz(zone)
21
+ }
17
22
 
18
- export const toMinute = (newDate: Date | string, timeZone?: string): string => {
19
- const date = formatDate(newDate)
20
- if (timeZone) {
21
- return date.toLocaleTimeString(undefined, { timeZone, hour: "2-digit", minute: "2-digit" }).slice(3, 5);
22
- } else {
23
- return date.toLocaleTimeString(undefined, { hour: "2-digit", minute: "2-digit" }).slice(3, 5);
23
+ convertToTimezone() {
24
+ return this.value.strftime('%Z')
24
25
  }
25
- }
26
26
 
27
- export const toHour = (newDate: Date | string, timeZone?: string): string => {
28
- const date = formatDate(newDate)
29
- if (timeZone) {
30
- return date.toLocaleTimeString(undefined, { timeZone, hour: "numeric" }).split(' ')[0];
31
- } else {
32
- return date.toLocaleTimeString(undefined, { hour: "numeric" }).split(' ')[0];
27
+ toCustomFormat(format = '%-m/%-d') {
28
+ return this.value.strftime(format)
33
29
  }
34
- }
35
30
 
36
- export const toDay = (newDate: Date | string, timeZone?: string): number => {
37
- if (timeZone) {
38
- const date = new Date(formatDate(newDate).toLocaleString(undefined, { timeZone }));
39
- return date.getDate()
40
- } else {
41
- const date = formatDate(newDate)
42
- return date.getDate()
43
- }
44
- }
31
+ toYear() {
32
+ return this.value.strftime('%Y')
33
+ }
45
34
 
46
- export const toDayAbbr = (newDate: Date | string): string => {
47
- const date = formatDate(newDate)
48
- return ABBR_DAYS[date.getUTCDay()]
49
- }
35
+ toMonth() {
36
+ return this.value.strftime('%b')
37
+ }
50
38
 
51
- export const toWeekday = (newDate: Date | string): string => {
52
- const date = formatDate(newDate)
53
- return days[date.getUTCDay()]
54
- }
39
+ toMonthNum() {
40
+ return this.value.strftime('%-m')
41
+ }
55
42
 
56
- export const toMonth = (newDate: Date | string, timeZone?: string): string => {
57
- if (timeZone) {
58
- const date = new Date(formatDate(newDate).toLocaleString(undefined, { timeZone }));
59
- return months[date.getUTCMonth()]
60
- } else {
61
- const date = formatDate(newDate)
62
- return months[date.getUTCMonth()]
63
- }
64
- }
43
+ toMonthFull() {
44
+ return this.value.strftime('%B')
45
+ }
65
46
 
66
- export const toMonthNum = (newDate: Date | string): number => {
67
- const date = formatDate(newDate)
68
- return date.getUTCMonth() +1
69
- }
47
+ toDay() {
48
+ return this.value.strftime('%e')
49
+ }
70
50
 
71
- export const toYear = (newDate: Date | string, timeZone?: string): number => {
72
- if (timeZone) {
73
- const date = new Date(newDate.toLocaleString(undefined, { timeZone }));
74
- return date.getUTCFullYear()
75
- } else {
76
- const date = new Date(newDate)
77
- return date.getUTCFullYear()
78
- }
79
- }
51
+ toDayAbbr() {
52
+ return ABBR_DAYS[this.value.day()]
53
+ }
80
54
 
81
- export const toTime = (newDate: Date | string, timeZone?: string): string => {
82
- const date = formatDate(newDate)
83
- if (timeZone) {
84
- return date.toLocaleTimeString(undefined, { timeZone, timeStyle: "short" }).split(' ')[0];
85
- } else {
86
- return date.toLocaleTimeString(undefined, { timeStyle: "short" }).split(' ')[0];
55
+ toWeekday() {
56
+ return this.value.strftime('%a')
87
57
  }
88
- }
89
58
 
90
- export const toMeridiem = (newDate: Date | string, timeZone?: string): string => {
91
- const date = formatDate(newDate)
92
- if (timeZone) {
93
- return date.toLocaleString(undefined, { timeZone, hour12: true }).slice(-2).charAt(0).toLocaleLowerCase();
94
- } else {
95
- return date.toLocaleString(undefined, { hour12: true }).slice(-2).charAt(0).toLocaleLowerCase();
96
- }
97
- }
59
+ toHour() {
60
+ return this.value.strftime('%l')
61
+ }
98
62
 
99
- export const toTimeZone = (newDate: Date | string, timeZone?: string): string => {
100
- const date = formatDate(newDate)
101
- if (timeZone) {
102
- return date.toLocaleString(undefined, { timeZone, timeZoneName: "short" }).split(' ')[3];
103
- } else {
104
- return date.toLocaleString(undefined, { timeZoneName: "short" }).split(' ')[3];
105
- }
106
- }
63
+ toMinute() {
64
+ return this.value.strftime('%M')
65
+ }
107
66
 
108
- export const toTimeWithMeridiem = (newDate: Date | string, timeZone: string): string => {
109
- const date = formatDate(newDate)
110
- return `${toTime(date, timeZone)}${toMeridiem(date, timeZone)}`;
111
- }
67
+ toMeridian() {
68
+ return this.value.strftime('%P')[0]
69
+ }
112
70
 
113
- export const toIso = (newDate: Date | string): string => {
114
- const date = formatDate(newDate)
115
- return date.toISOString()
116
- }
71
+ toIso() {
72
+ return this.value.toISOString()
73
+ }
117
74
 
118
- export const fromNow = (newDate: Date | string): string => {
119
-
120
- const startDate = formatDate(newDate).getTime()
121
- const endDate = new Date().getTime()
122
- const elapsedTime = endDate - startDate
123
- let elapsedTimeString = `${Math.round(elapsedTime / (365.25 * 24 * 60 * 60 * 1000))} years ago.`; // 730+ days
124
-
125
- const elapsedTimeData = [
126
- { min: 0, max: 44999, value: "a few seconds ago" }, // 0-44 seconds
127
- { min: 45000, max: 89999, value: "a minute ago" }, // 45-89 seconds
128
- { min: 90000, max: 2649999, value: `${Math.round(elapsedTime / 60000)} minutes ago`}, // 90s-44 minutes
129
- { min: 2650000, max: 7299999, value: "an hour ago" }, // 45-120 minutes
130
- { min: 7300000, max: 75699999, value: `${Math.round(elapsedTime / 3600000)} hours ago`}, // 2-21 hours
131
- { min: 75700000, max: 172899999, value: "a day ago" }, // 22-48 hours
132
- { min: 172900000, max: 2169999999, value: `${Math.round(elapsedTime / 86400000)} days ago`}, // 2-25 days
133
- { min: 2170000000, max: 5184999999, value: "a month ago"}, // 26-60 days
134
- { min: 5185000000, max: 27561699999, value: `${Math.round(elapsedTime / 30.44 * 24 * 60 * 60 * 1000)} months ago`}, // 60-319 days
135
- { min: 27561700000, max: 63072999999, value: "a year ago"}, // 320-730 days
136
- ];
137
-
138
- for (const timeDate of elapsedTimeData) {
139
- if (elapsedTime >= timeDate.min && elapsedTime <= timeDate.max) {
140
- elapsedTimeString = timeDate.value;
141
- break;
142
- }
143
- }
144
-
145
- return elapsedTimeString
146
- }
75
+ toTime() {
76
+ const time = this.value.strftime('%I:%M')
147
77
 
148
- export const toCustomFormat = (newDate: Date | string, format = 'month_day'): string => {
149
- const date = formatDate(newDate)
150
- if (format == "month_day") {
151
- return `${toMonthNum(date)}/${toDay(date)}`
152
- } else {
153
- return `${date.toLocaleString(undefined, { month: "short" })} ${toDay(date)}`
78
+ // strftime adds a leading 0 on single hour times. ie 08:31.
79
+ // this removes that 0 to match the rails kit.
80
+ return time.charAt() === '0' ? time.slice(1) : time
81
+ }
82
+
83
+ toTimezone() {
84
+ return this.value.strftime('%Z')
154
85
  }
155
- }
156
86
 
157
- export default {
158
- toMinute,
159
- toHour,
160
- toDay,
161
- toDayAbbr,
162
- toWeekday,
163
- toMonth,
164
- toMonthNum,
165
- toYear,
166
- toTime,
167
- toMeridiem,
168
- toTimeZone,
169
- toTimeWithMeridiem,
170
- toIso,
171
- fromNow,
172
- toCustomFormat,
87
+ toTimeWithMeridian() {
88
+ return this.toTime() + this.toMeridian()
89
+ }
173
90
  }
@@ -1,8 +1,8 @@
1
1
  import React from "react";
2
2
  import classnames from "classnames";
3
+ import DateTime from "../pb_kit/dateTime";
3
4
  import { buildAriaProps, buildCss, buildDataProps } from "../utilities/props";
4
5
  import { globalProps } from "../utilities/globalProps";
5
- import DateTime from '../pb_kit/dateTime';
6
6
 
7
7
  import Body from "../pb_body/_body";
8
8
  import Caption from "../pb_caption/_caption";
@@ -26,9 +26,9 @@ type LabelValueProps = {
26
26
  title?: string;
27
27
  };
28
28
 
29
- const dateString = (value: Date) => {
30
- const month = DateTime.toMonthNum(value);
31
- const day = DateTime.toDay(value);
29
+ const dateString = (value: DateTime) => {
30
+ const month = value.toMonthNum();
31
+ const day = value.toDay();
32
32
 
33
33
  return ` · ${month}/${day}`;
34
34
  };
@@ -52,6 +52,7 @@ const LabelValue = (props: LabelValueProps) => {
52
52
 
53
53
  const ariaProps = buildAriaProps(aria);
54
54
  const dataProps = buildDataProps(data);
55
+ const formattedDate = new DateTime({ value: date });
55
56
  const variantClass = variant === "details" ? "details" : "";
56
57
  const classes = classnames(
57
58
  buildCss("pb_label_value_kit", variantClass),
@@ -61,81 +62,59 @@ const LabelValue = (props: LabelValueProps) => {
61
62
 
62
63
  return (
63
64
  <div
64
- {...ariaProps}
65
- {...dataProps}
66
- className={classes}
67
- id={id}
68
- title={title}
65
+ {...ariaProps}
66
+ {...dataProps}
67
+ className={classes}
68
+ id={id}
69
+ title={title}
69
70
  >
70
- <Caption dark={dark}
71
- text={label}
72
- />
71
+ <Caption dark={dark} text={label} />
73
72
  {variant === "details" ? (
74
- <Flex inline
75
- vertical="center"
76
- >
73
+ <Flex inline vertical="center">
77
74
  {icon && (
78
- <Body color="light"
79
- dark={dark}
80
- marginRight="xs"
81
- >
82
- <Icon dark={dark}
83
- fixedWidth
84
- icon={icon}
85
- />
75
+ <Body color="light" dark={dark} marginRight="xs">
76
+ <Icon dark={dark} fixedWidth icon={icon} />
86
77
  </Body>
87
78
  )}
88
79
  {description && (
89
80
  <Body
90
- color="light"
91
- dark={dark}
92
- marginRight="xs"
93
- text={description}
81
+ color="light"
82
+ dark={dark}
83
+ marginRight="xs"
84
+ text={description}
94
85
  />
95
86
  )}
96
87
  {active === true ? (
97
- <Flex inline
98
- vertical="center"
99
- >
88
+ <Flex inline vertical="center">
100
89
  {title && (
101
- <Title dark={dark}
102
- size={4}
103
- text={title}
104
- variant="link"
105
- />
90
+ <Title dark={dark} size={4} text={title} variant="link" />
106
91
  )}
107
92
  {date && (
108
93
  <Title
109
- dark={dark}
110
- marginLeft="xs"
111
- size={4}
112
- text={" " + dateString(date)}
113
- variant="link"
94
+ dark={dark}
95
+ marginLeft="xs"
96
+ size={4}
97
+ text={" " + dateString(formattedDate)}
98
+ variant="link"
114
99
  />
115
100
  )}
116
101
  </Flex>
117
102
  ) : (
118
103
  <>
119
- {title && <Title dark={dark}
120
- size={4}
121
- text={title}
122
- />
123
- }
104
+ {title && <Title dark={dark} size={4} text={title} />}
124
105
  {date && (
125
106
  <Title
126
- dark={dark}
127
- marginLeft="xs"
128
- size={4}
129
- text={" " + dateString(date)}
107
+ dark={dark}
108
+ marginLeft="xs"
109
+ size={4}
110
+ text={" " + dateString(formattedDate)}
130
111
  />
131
112
  )}
132
113
  </>
133
114
  )}
134
115
  </Flex>
135
116
  ) : (
136
- <Body dark={dark}
137
- text={value}
138
- />
117
+ <Body dark={dark} text={value} />
139
118
  )}
140
119
  </div>
141
120
  );
@@ -0,0 +1,120 @@
1
+ /* @flow */
2
+
3
+ import React from 'react'
4
+ import classnames from 'classnames'
5
+
6
+ import DateTime from '../pb_kit/dateTime'
7
+ import { buildAriaProps, buildCss, buildDataProps } from '../utilities/props'
8
+ import { globalProps } from '../utilities/globalProps'
9
+
10
+ import Body from '../pb_body/_body'
11
+ import Caption from '../pb_caption/_caption'
12
+ import Icon from '../pb_icon/_icon'
13
+ import Title from '../pb_title/_title'
14
+
15
+ const dateString = (value: DateTime) => {
16
+ const month = value.toMonthNum()
17
+ const day = value.toDay()
18
+
19
+ return ` · ${month}/${day}`
20
+ }
21
+
22
+ type LogisticProps = {
23
+ aria?: object,
24
+ className?: string,
25
+ dark?: boolean,
26
+ data?: object,
27
+ date: string,
28
+ id?: string,
29
+ link?: string,
30
+ projectName?: string,
31
+ projectNumber?: number,
32
+ }
33
+
34
+ const Logistic = (props: LogisticProps) => {
35
+ const { aria = {},
36
+ className,
37
+ dark = false,
38
+ data = {},
39
+ date,
40
+ id,
41
+ link,
42
+ projectName,
43
+ projectNumber } = props
44
+
45
+ const ariaProps = buildAriaProps(aria)
46
+ const dataProps = buildDataProps(data)
47
+ const formattedDate = new DateTime({ value: date })
48
+ const classes = classnames(
49
+ buildCss('pb_logistic_kit', { dark }),
50
+ globalProps(props),
51
+ className
52
+ )
53
+
54
+ return (
55
+ <div
56
+ {...ariaProps}
57
+ {...dataProps}
58
+ className={classes}
59
+ id={id}
60
+ >
61
+ <Body color="light">
62
+ <Caption text="Project" />
63
+ <Icon
64
+ fixedWidth
65
+ icon="home"
66
+ />
67
+
68
+ {` ${projectNumber}`}
69
+
70
+ <Choose>
71
+ <When condition={link}>
72
+ <a
73
+ className="pb_logistic_kit_links"
74
+ href={link}
75
+ >
76
+ <Choose>
77
+ <When condition={date}>
78
+ <Title
79
+ size={4}
80
+ tag="span"
81
+ text={' ' + projectName + dateString(formattedDate)}
82
+ />
83
+ </When>
84
+ <Otherwise>
85
+ <Title
86
+ size={4}
87
+ tag="span"
88
+ text={' ' + projectName}
89
+ />
90
+ </Otherwise>
91
+ </Choose>
92
+ </a>
93
+ </When>
94
+ <Otherwise>
95
+ <Choose>
96
+ <When condition={date}>
97
+ <Title
98
+ dark={dark}
99
+ size={4}
100
+ tag="span"
101
+ text={' ' + projectName + dateString(formattedDate)}
102
+ />
103
+ </When>
104
+ <Otherwise>
105
+ <Title
106
+ dark={dark}
107
+ size={4}
108
+ tag="span"
109
+ text={' ' + projectName}
110
+ />
111
+ </Otherwise>
112
+ </Choose>
113
+ </Otherwise>
114
+ </Choose>
115
+ </Body>
116
+ </div>
117
+ )
118
+ }
119
+
120
+ export default Logistic
@@ -25,7 +25,7 @@ type MessageProps = {
25
25
  label?: string,
26
26
  message: string,
27
27
  timestamp?: string,
28
- timestampObject?: Date,
28
+ timestampObject?: string,
29
29
  timezone?: string,
30
30
  alignTimestamp?: string,
31
31
  }
@@ -62,50 +62,50 @@ const Message = (props: MessageProps) => {
62
62
 
63
63
  return (
64
64
  <div
65
- {...ariaProps}
66
- {...dataProps}
67
- className={classes}
68
- id={id}
65
+ {...ariaProps}
66
+ {...dataProps}
67
+ className={classes}
68
+ id={id}
69
69
  >
70
70
  {shouldDisplayAvatar &&
71
71
  <Avatar
72
- imageUrl={avatarUrl}
73
- name={avatarName}
74
- size="xs"
75
- status={avatarStatus}
72
+ imageUrl={avatarUrl}
73
+ name={avatarName}
74
+ size="xs"
75
+ status={avatarStatus}
76
76
  />
77
77
  }
78
78
  <div className="content_wrapper">
79
79
  <Flex
80
- justify={alignTimestamp === 'left' ? 'none' : 'between'}
81
- orientation="row"
80
+ justify={alignTimestamp === 'left' ? 'none' : 'between'}
81
+ orientation="row"
82
82
  >
83
83
  {label &&
84
84
  <Title
85
- className="message_title"
86
- size={4}
87
- text={label}
85
+ className="message_title"
86
+ size={4}
87
+ text={label}
88
88
  />
89
89
  }
90
90
  <Timestamp
91
- className={`pull-${alignTimestamp} ${timestampObject ? 'message_humanized_time' : null}`}
92
- text={timestamp}
93
- timestamp={''}
94
- timezone={timezone}
91
+ className={`pull-${alignTimestamp} ${timestampObject ? 'message_humanized_time' : null}`}
92
+ text={timestamp}
93
+ timestamp={''}
94
+ timezone={timezone}
95
95
  />
96
96
  {timestampObject &&
97
97
  <Timestamp
98
- className={`pull-${alignTimestamp} message_timestamp`}
99
- text={''}
100
- timestamp={timestampObject}
101
- timezone={timezone}
98
+ className={`pull-${alignTimestamp} message_timestamp`}
99
+ text={''}
100
+ timestamp={timestampObject}
101
+ timezone={timezone}
102
102
  />
103
103
  }
104
104
  </Flex>
105
105
  {message &&
106
106
  <Body
107
- className="pb_message_body"
108
- text={message}
107
+ className="pb_message_body"
108
+ text={message}
109
109
  />
110
110
  }
111
111
  {children}
@@ -11,7 +11,6 @@ examples:
11
11
  - select_error: Select w/ Error
12
12
  - select_inline: Select Inline
13
13
  - select_inline_compact: Select Inline Compact
14
- - select_data_attributes: Select W/ Data Attributes
15
14
 
16
15
 
17
16
 
@@ -1,4 +1,5 @@
1
1
  <%= content_tag(:div,
2
+ data: object.data,
2
3
  aria: object.aria,
3
4
  class: object.classnames) do %>
4
5
  <% if object.label %>
@@ -23,7 +24,6 @@
23
24
  disabled: object.disabled,
24
25
  required: object.required,
25
26
  multiple: object.multiple,
26
- data: object.data,
27
27
  onchange: object.onchange,
28
28
  include_blank: object.include_blank,
29
29
  )