playbook_ui 12.36.0.pre.alpha.PLAY936momentjs1058 → 12.36.0.pre.alpha.PLAY942collapsiblenav21035

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 (66) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/index.js +2 -1
  3. data/app/pb_kits/playbook/pb_badge/docs/example.yml +0 -7
  4. data/app/pb_kits/playbook/pb_collapsible/_collapsible.tsx +15 -13
  5. data/app/pb_kits/playbook/pb_collapsible/child_kits/CollapsibleMain.tsx +24 -8
  6. data/app/pb_kits/playbook/pb_collapsible/collapsible_main.html.erb +1 -1
  7. data/app/pb_kits/playbook/pb_collapsible/docs/_collapsible_icons.jsx +15 -4
  8. data/app/pb_kits/playbook/pb_collapsible/docs/example.yml +2 -2
  9. data/app/pb_kits/playbook/pb_collapsible/useCollapsible.tsx +14 -0
  10. data/app/pb_kits/playbook/pb_date/_date.tsx +8 -7
  11. data/app/pb_kits/playbook/pb_date/docs/_date_alignment.jsx +2 -2
  12. data/app/pb_kits/playbook/pb_date/docs/_date_default.jsx +5 -29
  13. data/app/pb_kits/playbook/pb_date/docs/_date_unstyled.jsx +2 -2
  14. data/app/pb_kits/playbook/pb_date/docs/_date_variants.jsx +5 -5
  15. data/app/pb_kits/playbook/pb_date_range_inline/_date_range_inline.tsx +31 -45
  16. data/app/pb_kits/playbook/pb_date_range_stacked/_date_range_stacked.tsx +3 -5
  17. data/app/pb_kits/playbook/pb_date_stacked/_date_stacked.tsx +21 -24
  18. data/app/pb_kits/playbook/pb_date_time/_date_time.tsx +1 -1
  19. data/app/pb_kits/playbook/pb_date_time/dateTime.test.js +1 -1
  20. data/app/pb_kits/playbook/pb_date_time_stacked/_date_time_stacked.tsx +2 -2
  21. data/app/pb_kits/playbook/pb_date_time_stacked/date_time_stacked.test.js +1 -1
  22. data/app/pb_kits/playbook/pb_date_year_stacked/_date_year_stacked.tsx +8 -6
  23. data/app/pb_kits/playbook/pb_kit/dateTime.ts +63 -146
  24. data/app/pb_kits/playbook/pb_label_value/_label_value.tsx +31 -52
  25. data/app/pb_kits/playbook/pb_logistic/_logistic.jsx +120 -0
  26. data/app/pb_kits/playbook/pb_message/_message.tsx +24 -24
  27. data/app/pb_kits/playbook/pb_nav/_collapsible_nav.scss +22 -1
  28. data/app/pb_kits/playbook/pb_nav/_item.tsx +26 -2
  29. data/app/pb_kits/playbook/pb_nav/docs/_collapsible_nav.jsx +59 -79
  30. data/app/pb_kits/playbook/pb_nav/docs/_collapsible_nav_custom_icons.jsx +4 -6
  31. data/app/pb_kits/playbook/pb_nav/docs/example.yml +2 -2
  32. data/app/pb_kits/playbook/pb_nav/item.rb +5 -1
  33. data/app/pb_kits/playbook/pb_pill/docs/example.yml +0 -5
  34. data/app/pb_kits/playbook/pb_radio/docs/example.yml +0 -11
  35. data/app/pb_kits/playbook/pb_time/_time.tsx +11 -9
  36. data/app/pb_kits/playbook/pb_time_range_inline/_time_range_inline.tsx +49 -46
  37. data/app/pb_kits/playbook/pb_time_stacked/_time_stacked.tsx +6 -4
  38. data/app/pb_kits/playbook/pb_timestamp/_timestamp.tsx +11 -11
  39. data/app/pb_kits/playbook/pb_timestamp/docs/example.yml +0 -8
  40. data/app/pb_kits/playbook/pb_weekday_stacked/_weekday_stacked.tsx +11 -8
  41. data/dist/playbook-rails.js +7 -7
  42. data/lib/playbook/version.rb +1 -1
  43. metadata +4 -25
  44. data/app/pb_kits/playbook/pb_badge/docs/_badge_colors_swift.md +0 -33
  45. data/app/pb_kits/playbook/pb_badge/docs/_badge_default_swift.md +0 -9
  46. data/app/pb_kits/playbook/pb_badge/docs/_badge_notification_swift.md +0 -9
  47. data/app/pb_kits/playbook/pb_badge/docs/_badge_props_swift.md +0 -6
  48. data/app/pb_kits/playbook/pb_badge/docs/_badge_rounded_swift.md +0 -9
  49. data/app/pb_kits/playbook/pb_pill/docs/_pill_default_swift.md +0 -5
  50. data/app/pb_kits/playbook/pb_pill/docs/_pill_props_swift.md +0 -5
  51. data/app/pb_kits/playbook/pb_pill/docs/_pill_variants_swift.md +0 -10
  52. data/app/pb_kits/playbook/pb_radio/docs/_radio_alignment_swift.md +0 -16
  53. data/app/pb_kits/playbook/pb_radio/docs/_radio_custom_swift.md +0 -18
  54. data/app/pb_kits/playbook/pb_radio/docs/_radio_default_swift.md +0 -15
  55. data/app/pb_kits/playbook/pb_radio/docs/_radio_error_swift.md +0 -14
  56. data/app/pb_kits/playbook/pb_radio/docs/_radio_orientation_swift.md +0 -15
  57. data/app/pb_kits/playbook/pb_radio/docs/_radio_padding_swift.md +0 -31
  58. data/app/pb_kits/playbook/pb_radio/docs/_radio_props_swift.md +0 -10
  59. data/app/pb_kits/playbook/pb_radio/docs/_radio_spacing_swift.md +0 -36
  60. data/app/pb_kits/playbook/pb_radio/docs/_radio_subtitle_swift.md +0 -13
  61. data/app/pb_kits/playbook/pb_timestamp/docs/_timestamp_align_swift.md +0 -45
  62. data/app/pb_kits/playbook/pb_timestamp/docs/_timestamp_default_swift.md +0 -26
  63. data/app/pb_kits/playbook/pb_timestamp/docs/_timestamp_elapsed_swift.md +0 -25
  64. data/app/pb_kits/playbook/pb_timestamp/docs/_timestamp_props_swift.md +0 -10
  65. data/app/pb_kits/playbook/pb_timestamp/docs/_timestamp_timezones_swift.md +0 -67
  66. data/app/pb_kits/playbook/pb_timestamp/docs/_timestamp_updated_swift.md +0 -19
@@ -1,9 +1,9 @@
1
1
  import React from "react";
2
2
 
3
3
  import classnames from "classnames";
4
+ import DateTime from "../pb_kit/dateTime";
4
5
  import { buildCss, buildDataProps } from "../utilities/props";
5
6
  import { globalProps } from "../utilities/globalProps";
6
- import DateTime from '../pb_kit/dateTime';
7
7
 
8
8
  import Caption from "../pb_caption/_caption";
9
9
  import Title from "../pb_title/_title";
@@ -14,7 +14,7 @@ type DateStackedProps = {
14
14
  className?: string | string[];
15
15
  dark?: boolean;
16
16
  data?: string;
17
- date: Date;
17
+ date: string | Date;
18
18
  size?: "sm" | "md";
19
19
  id?: string;
20
20
  reverse?: boolean;
@@ -45,42 +45,39 @@ const DateStacked = (props: DateStackedProps) => {
45
45
  className
46
46
  );
47
47
 
48
- const currentYear = new Date().getFullYear()
49
- const inputYear = DateTime.toYear(date);
48
+ const currentYear = new Date().getFullYear().toString();
49
+ const dateTimestamp = new DateTime({ value: date });
50
+ const inputYear = dateTimestamp.toYear().toString();
50
51
  const dataProps = buildDataProps(data)
51
52
 
52
53
  return (
53
54
  <>
54
55
  {bold == false ? (
55
- <div {...dataProps}
56
- className={classes}
57
- >
56
+ <div {...dataProps} className={classes}>
58
57
  <div className="pb_date_stacked_day_month">
59
- <Caption text={DateTime.toMonth(date).toUpperCase()} />
58
+ <Caption text={dateTimestamp.toMonth().toUpperCase()} />
60
59
  <Title
61
- dark={dark}
62
- size={sizes[size]}
63
- text={DateTime.toDay(date).toString()}
60
+ dark={dark}
61
+ size={sizes[size]}
62
+ text={dateTimestamp.toDay()}
64
63
  />
65
64
  </div>
66
65
  {currentYear != inputYear && <Caption size="xs">{inputYear}</Caption>}
67
66
  </div>
68
67
  ) : (
69
- <div {...dataProps}
70
- className={classes}
71
- >
68
+ <div {...dataProps} className={classes}>
72
69
  <div className="pb_date_stacked_day_month">
73
- <Title
74
- bold
75
- dark={dark}
76
- size="4"
77
- text={DateTime.toMonth(date)}
70
+ <Title
71
+ bold
72
+ dark={dark}
73
+ size="4"
74
+ text={dateTimestamp.toMonth()}
78
75
  />
79
- <Title
80
- bold
81
- dark={dark}
82
- size="4"
83
- text={DateTime.toDay(date).toString()}
76
+ <Title
77
+ bold
78
+ dark={dark}
79
+ size="4"
80
+ text={dateTimestamp.toDay()}
84
81
  />
85
82
  {currentYear != inputYear && <Title size="4">{inputYear}</Title>}
86
83
  </div>
@@ -13,7 +13,7 @@ type DateTimeProps = {
13
13
  aria?: { [key: string]: string; },
14
14
  className?: string,
15
15
  data?: { [key: string]: string; },
16
- datetime: Date,
16
+ datetime: string,
17
17
  id?: string,
18
18
  size?: "sm" | "md",
19
19
  showDayOfWeek: boolean,
@@ -89,7 +89,7 @@ describe('DateTime Kit', () => {
89
89
  const kit = screen.getByTestId(testId)
90
90
  const text = kit.querySelector('.pb_time_kit_md.ml_sm')
91
91
 
92
- expect(text.textContent).toEqual('2:00p GMT+9')
92
+ expect(text.textContent).toEqual('2:00p JST')
93
93
  })
94
94
  test('renders DatePicker size', () => {
95
95
  render(
@@ -12,8 +12,8 @@ import DateStacked from '../pb_date_stacked/_date_stacked'
12
12
 
13
13
  type DateTimeStackedProps = {
14
14
  id?: string,
15
- date: Date,
16
- datetime: Date,
15
+ date: string,
16
+ datetime: string,
17
17
  dark: boolean,
18
18
  timeZone?: string,
19
19
  }
@@ -34,7 +34,7 @@ test('renders time in default timezone', () => {
34
34
  test('renders time in timezone', () => {
35
35
  props.timeZone = 'Asia/Tokyo'
36
36
  const kit = renderKit(DateTimeStacked, props)
37
- expect(kit).toHaveTextContent(`${monthDayYear}2:00aGMT+9`)
37
+ expect(kit).toHaveTextContent(`${monthDayYear}2:00aJST`)
38
38
  })
39
39
 
40
40
  test('renders time in timezone', () => {
@@ -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'
4
5
  import { buildCss, buildDataProps } from '../utilities/props'
5
6
  import { globalProps } from '../utilities/globalProps'
6
- import DateTime from '../pb_kit/dateTime';
7
7
 
8
8
  import Body from '../pb_body/_body'
9
9
  import Title from '../pb_title/_title'
@@ -13,12 +13,13 @@ type DateYearStackedProps = {
13
13
  className?: string | string[],
14
14
  dark?: boolean,
15
15
  data?: string,
16
- date: Date,
16
+ date: string,
17
17
  id?: string,
18
18
  }
19
19
 
20
20
  const DateYearStacked = (props: DateYearStackedProps) => {
21
21
  const { align = 'left', className, dark = false, date, data={} } = props
22
+ const dateTimestamp = new DateTime({ value: date })
22
23
  const css = classnames(
23
24
  buildCss('pb_date_year_stacked', align),
24
25
  globalProps(props),
@@ -28,14 +29,15 @@ const DateYearStacked = (props: DateYearStackedProps) => {
28
29
 
29
30
  return (
30
31
  <div {...dataProps}
31
- className={css}
32
- >
32
+ className={css}>
33
33
  <Title
34
34
  dark={dark}
35
35
  size={4}
36
- text={`${DateTime.toDay(date)} ${DateTime.toMonth(date).toUpperCase()}`}
36
+ text={`${dateTimestamp.toDay()} ${dateTimestamp
37
+ .toMonth()
38
+ .toUpperCase()}`}
37
39
  />
38
- <Body color="light">{DateTime.toYear(date)}</Body>
40
+ <Body color="light">{dateTimestamp.toYear()}</Body>
39
41
  </div>
40
42
  )
41
43
  }
@@ -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