playbook_ui 12.30.1 → 12.31.0.pre.alpha.PLAY814removemomentjs933

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 (74) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/_playbook.scss +2 -0
  3. data/app/pb_kits/playbook/pb_badge/_badge.scss +5 -0
  4. data/app/pb_kits/playbook/pb_badge/_badge.tsx +1 -1
  5. data/app/pb_kits/playbook/pb_badge/badge.rb +1 -1
  6. data/app/pb_kits/playbook/pb_badge/badge.test.js +13 -0
  7. data/app/pb_kits/playbook/pb_badge/docs/_badge_notification.html.erb +12 -0
  8. data/app/pb_kits/playbook/pb_badge/docs/_badge_notification.jsx +25 -0
  9. data/app/pb_kits/playbook/pb_badge/docs/example.yml +2 -1
  10. data/app/pb_kits/playbook/pb_badge/docs/index.js +1 -0
  11. data/app/pb_kits/playbook/pb_button/docs/_button_hover.jsx +40 -0
  12. data/app/pb_kits/playbook/pb_button/docs/example.yml +1 -0
  13. data/app/pb_kits/playbook/pb_button/docs/index.js +1 -0
  14. data/app/pb_kits/playbook/pb_date/_date.tsx +7 -8
  15. data/app/pb_kits/playbook/pb_date_range_inline/_date_range_inline.tsx +45 -31
  16. data/app/pb_kits/playbook/pb_date_range_stacked/_date_range_stacked.tsx +5 -3
  17. data/app/pb_kits/playbook/pb_date_stacked/_date_stacked.tsx +24 -21
  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 +6 -8
  23. data/app/pb_kits/playbook/pb_kit/dateTime.ts +139 -67
  24. data/app/pb_kits/playbook/pb_label_value/_label_value.tsx +52 -31
  25. data/app/pb_kits/playbook/pb_message/_message.tsx +25 -25
  26. data/app/pb_kits/playbook/pb_message/docs/_message_default.jsx +33 -45
  27. data/app/pb_kits/playbook/pb_message/docs/_message_hover.jsx +41 -0
  28. data/app/pb_kits/playbook/pb_message/docs/example.yml +1 -0
  29. data/app/pb_kits/playbook/pb_message/docs/index.js +2 -0
  30. data/app/pb_kits/playbook/pb_multi_level_select/_helper_functions.tsx +4 -1
  31. data/app/pb_kits/playbook/pb_multi_level_select/_multi_level_select.tsx +8 -3
  32. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_selected_ids.html.erb +76 -0
  33. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_selected_ids.jsx +88 -0
  34. data/app/pb_kits/playbook/pb_multi_level_select/docs/_multi_level_select_selected_ids.md +5 -0
  35. data/app/pb_kits/playbook/pb_multi_level_select/docs/example.yml +2 -0
  36. data/app/pb_kits/playbook/pb_multi_level_select/docs/index.js +2 -1
  37. data/app/pb_kits/playbook/pb_multi_level_select/multi_level_select.rb +3 -0
  38. data/app/pb_kits/playbook/pb_section_separator/_section_separator.scss +7 -0
  39. data/app/pb_kits/playbook/pb_section_separator/_section_separator.tsx +12 -7
  40. data/app/pb_kits/playbook/pb_section_separator/docs/_section_separator_children.html.erb +14 -0
  41. data/app/pb_kits/playbook/pb_section_separator/docs/_section_separator_children.jsx +30 -0
  42. data/app/pb_kits/playbook/pb_section_separator/docs/_section_separator_children.md +3 -0
  43. data/app/pb_kits/playbook/pb_section_separator/docs/_section_separator_dashed.html.erb +1 -0
  44. data/app/pb_kits/playbook/pb_section_separator/docs/_section_separator_dashed.jsx +13 -0
  45. data/app/pb_kits/playbook/pb_section_separator/docs/_section_separator_text.html.erb +1 -1
  46. data/app/pb_kits/playbook/pb_section_separator/docs/_section_separator_text.jsx +1 -1
  47. data/app/pb_kits/playbook/pb_section_separator/docs/example.yml +6 -3
  48. data/app/pb_kits/playbook/pb_section_separator/docs/index.js +2 -0
  49. data/app/pb_kits/playbook/pb_section_separator/section_separator.html.erb +4 -2
  50. data/app/pb_kits/playbook/pb_section_separator/section_separator.rb +4 -1
  51. data/app/pb_kits/playbook/pb_time/_time.tsx +9 -11
  52. data/app/pb_kits/playbook/pb_time_range_inline/_time_range_inline.tsx +46 -49
  53. data/app/pb_kits/playbook/pb_time_stacked/_time_stacked.tsx +4 -6
  54. data/app/pb_kits/playbook/pb_timestamp/_timestamp.tsx +13 -12
  55. data/app/pb_kits/playbook/pb_title/_title.scss +18 -0
  56. data/app/pb_kits/playbook/pb_title/_title.tsx +20 -2
  57. data/app/pb_kits/playbook/pb_title/docs/_title_responsive.html.erb +1 -0
  58. data/app/pb_kits/playbook/pb_title/docs/_title_responsive.jsx +16 -0
  59. data/app/pb_kits/playbook/pb_title/docs/_title_responsive.md +1 -0
  60. data/app/pb_kits/playbook/pb_title/docs/example.yml +2 -0
  61. data/app/pb_kits/playbook/pb_title/docs/index.js +1 -0
  62. data/app/pb_kits/playbook/pb_title/title.rb +21 -4
  63. data/app/pb_kits/playbook/pb_title/title.test.js +42 -29
  64. data/app/pb_kits/playbook/pb_weekday_stacked/_weekday_stacked.tsx +8 -11
  65. data/app/pb_kits/playbook/tokens/_scale.scss +9 -0
  66. data/app/pb_kits/playbook/tokens/exports/_scale.scss +13 -0
  67. data/app/pb_kits/playbook/utilities/_border_radius.scss +31 -0
  68. data/app/pb_kits/playbook/utilities/_colors.scss +3 -0
  69. data/app/pb_kits/playbook/utilities/_hover.scss +47 -0
  70. data/app/pb_kits/playbook/utilities/globalProps.ts +22 -2
  71. data/dist/playbook-rails.js +7 -7
  72. data/lib/playbook/version.rb +2 -2
  73. metadata +26 -8
  74. data/app/pb_kits/playbook/pb_logistic/_logistic.jsx +0 -120
@@ -1,90 +1,162 @@
1
-
2
- import moment, { Moment } from 'moment'
3
- import 'moment-strftime'
4
- import 'moment-timezone'
5
-
6
- type DateTimeType = {
7
- value: string | Date,
8
- zone?: string,
9
- }
10
-
11
1
  const ABBR_DAYS = ['SU', 'M', 'T', 'W', 'TH', 'F', 'S']
12
2
 
13
- export default class DateTime {
14
- value: Moment & any
15
- constructor({ value, zone = 'America/New_York' }: DateTimeType) {
16
- this.value = this.convertToTimestampZone(value, zone)
17
- }
18
-
19
- convertToTimestampZone(value: string | Date, zone: string) {
20
- return moment(value).tz(zone)
21
- }
22
-
23
- convertToTimezone() {
24
- return this.value.strftime('%Z')
25
- }
3
+ const days = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
26
4
 
27
- toCustomFormat(format = '%-m/%-d') {
28
- return this.value.strftime(format)
29
- }
5
+ const months = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
30
6
 
31
- toYear() {
32
- return this.value.strftime('%Y')
7
+ export const toMinute = (newDate: Date, timeZone?: string): string => {
8
+ const date = new Date(newDate)
9
+ if (timeZone) {
10
+ return date.toLocaleTimeString(undefined, {timeZone, hour: "2-digit", minute: "2-digit"}).slice(3, 5);
11
+ } else {
12
+ return date.toLocaleTimeString(undefined, {hour: "2-digit", minute: "2-digit"}).slice(3, 5);
33
13
  }
14
+ }
34
15
 
35
- toMonth() {
36
- return this.value.strftime('%b')
16
+ export const toHour = (newDate: Date, timeZone?: string): string => {
17
+ const date = new Date(newDate)
18
+ if (timeZone) {
19
+ return date.toLocaleTimeString(undefined, {timeZone, hour: "numeric"}).split(' ')[0];
20
+ } else {
21
+ return date.toLocaleTimeString(undefined, {hour: "numeric"}).split(' ')[0];
37
22
  }
23
+ }
38
24
 
39
- toMonthNum() {
40
- return this.value.strftime('%-m')
41
- }
25
+ export const toDay = (newDate: Date, timeZone?: string): number => {
26
+ if (timeZone) {
27
+ const date = new Date(newDate.toLocaleString(undefined, { timeZone }));
28
+ return date.getUTCDate()
29
+ } else {
30
+ const date = new Date(newDate)
31
+ return date.getUTCDate()
32
+ }
33
+ }
42
34
 
43
- toMonthFull() {
44
- return this.value.strftime('%B')
45
- }
35
+ export const toDayAbbr = (newDate: Date): string => {
36
+ const date = new Date(newDate)
37
+ return ABBR_DAYS[date.getUTCDay()]
38
+ }
46
39
 
47
- toDay() {
48
- return this.value.strftime('%e')
49
- }
40
+ export const toWeekday = (newDate: Date): string => {
41
+ const date = new Date(newDate)
42
+ return days[date.getUTCDay()]
43
+ }
50
44
 
51
- toDayAbbr() {
52
- return ABBR_DAYS[this.value.day()]
53
- }
45
+ export const toMonth = (newDate: Date, timeZone?: string): string => {
46
+ if (timeZone) {
47
+ const date = new Date(newDate.toLocaleString(undefined, { timeZone }));
48
+ return months[date.getUTCMonth()]
49
+ } else {
50
+ const date = new Date(newDate)
51
+ return months[date.getUTCMonth()]
52
+ }
53
+ }
54
54
 
55
- toWeekday() {
56
- return this.value.strftime('%a')
57
- }
55
+ export const toMonthNum = (newDate: Date): number => {
56
+ const date = new Date(newDate)
57
+ return date.getUTCMonth() +1
58
+ }
58
59
 
59
- toHour() {
60
- return this.value.strftime('%l')
61
- }
60
+ export const toYear = (newDate: Date, timeZone?: string): number => {
61
+ if (timeZone) {
62
+ const date = new Date(newDate.toLocaleString(undefined, { timeZone }));
63
+ return date.getUTCFullYear()
64
+ } else {
65
+ const date = new Date(newDate)
66
+ return date.getUTCFullYear()
67
+ }
68
+ }
62
69
 
63
- toMinute() {
64
- return this.value.strftime('%M')
70
+ export const toTime = (newDate: Date, timeZone?: string): string => {
71
+ const date = new Date(newDate)
72
+ if (timeZone) {
73
+ return date.toLocaleTimeString(undefined, {timeZone, timeStyle: "short"}).split(' ')[0];
74
+ } else {
75
+ return date.toLocaleTimeString(undefined, {timeStyle: "short"}).split(' ')[0];
65
76
  }
77
+ }
66
78
 
67
- toMeridian() {
68
- return this.value.strftime('%P')[0]
69
- }
79
+ export const toMeridiem = (newDate: Date, timeZone?: string): string => {
80
+ const date = new Date(newDate)
81
+ if (timeZone) {
82
+ return date.toLocaleString(undefined, {timeZone, hour12: true }).slice(-2).charAt(0).toLocaleLowerCase();
83
+ } else {
84
+ return date.toLocaleString(undefined, {hour12: true }).slice(-2).charAt(0).toLocaleLowerCase();
85
+ }
86
+ }
70
87
 
71
- toIso() {
72
- return this.value.toISOString()
73
- }
88
+ export const toTimeZone = (newDate: Date, timeZone?: string): string => {
89
+ const date = new Date(newDate)
90
+ if (timeZone) {
91
+ return date.toLocaleString(undefined, {timeZone, timeZoneName: "short"}).split(' ')[3];
92
+ } else {
93
+ return date.toLocaleString(undefined, {timeZoneName: "short"}).split(' ')[3];
94
+ }
95
+ }
74
96
 
75
- toTime() {
76
- const time = this.value.strftime('%I:%M')
97
+ export const toTimeWithMeridiem = (newDate: Date, timeZone: string): string => {
98
+ const date = new Date(newDate)
99
+ return `${toTime(date, timeZone)}${toMeridiem(date, timeZone)}`;
100
+ }
77
101
 
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
- }
102
+ export const toIso = (newDate: Date): string => {
103
+ const date = new Date(newDate)
104
+ return date.toISOString()
105
+ }
82
106
 
83
- toTimezone() {
84
- return this.value.strftime('%Z')
85
- }
107
+ export const fromNow = (newDate: Date): string => {
108
+
109
+ const startDate = new Date(newDate).getTime()
110
+ const endDate = new Date().getTime()
111
+ const elapsedTime = endDate - startDate
112
+ let elapsedTimeString = `${Math.round(elapsedTime / (365.25 * 24 * 60 * 60 * 1000))} years ago.`; // 730+ days
113
+
114
+ const elapsedTimeData = [
115
+ { min: 0, max: 44999, value: "a few seconds ago" }, // 0-44 seconds
116
+ { min: 45000, max: 89999, value: "a minute ago" }, // 45-89 seconds
117
+ { min: 90000, max: 2649999, value: `${Math.round(elapsedTime / 60000)} minutes ago`}, // 90s-44 minutes
118
+ { min: 2650000, max: 7299999, value: "an hour ago" }, // 45-120 minutes
119
+ { min: 7300000, max: 75699999, value: `${Math.round(elapsedTime / 3600000)} hours ago`}, // 2-21 hours
120
+ { min: 75700000, max: 172899999, value: "a day ago" }, // 22-48 hours
121
+ { min: 172900000, max: 2169999999, value: `${Math.round(elapsedTime / 86400000)} days ago`}, // 2-25 days
122
+ { min: 2170000000, max: 5184999999, value: "a month ago"}, // 26-60 days
123
+ { min: 5185000000, max: 27561699999, value: `${Math.round(elapsedTime / 30.44 * 24 * 60 * 60 * 1000)} months ago`}, // 60-319 days
124
+ { min: 27561700000, max: 63072999999, value: "a year ago"}, // 320-730 days
125
+ ];
126
+
127
+ for (const timeDate of elapsedTimeData) {
128
+ if (elapsedTime >= timeDate.min && elapsedTime <= timeDate.max) {
129
+ elapsedTimeString = timeDate.value;
130
+ break;
131
+ }
132
+ }
133
+
134
+ return elapsedTimeString
135
+ }
86
136
 
87
- toTimeWithMeridian() {
88
- return this.toTime() + this.toMeridian()
137
+ export const toCustomFormat = (newDate: Date, format = 'month_day'): string => {
138
+ const date = new Date(newDate)
139
+ if (format == "month_day") {
140
+ return `${toMonthNum(date)}/${toDay(date)}`
141
+ } else {
142
+ return `${date.toLocaleString(undefined, {month: "short"})} ${toDay(date)}`
89
143
  }
90
144
  }
145
+
146
+ export default {
147
+ toMinute,
148
+ toHour,
149
+ toDay,
150
+ toDayAbbr,
151
+ toWeekday,
152
+ toMonth,
153
+ toMonthNum,
154
+ toYear,
155
+ toTime,
156
+ toMeridiem,
157
+ toTimeZone,
158
+ toTimeWithMeridiem,
159
+ toIso,
160
+ fromNow,
161
+ toCustomFormat,
162
+ }
@@ -1,8 +1,8 @@
1
1
  import React from "react";
2
2
  import classnames from "classnames";
3
- import DateTime from "../pb_kit/dateTime";
4
3
  import { buildAriaProps, buildCss, buildDataProps } from "../utilities/props";
5
4
  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: DateTime) => {
30
- const month = value.toMonthNum();
31
- const day = value.toDay();
29
+ const dateString = (value: Date) => {
30
+ const month = DateTime.toMonthNum(value);
31
+ const day = DateTime.toDay(value);
32
32
 
33
33
  return ` · ${month}/${day}`;
34
34
  };
@@ -52,7 +52,6 @@ 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 });
56
55
  const variantClass = variant === "details" ? "details" : "";
57
56
  const classes = classnames(
58
57
  buildCss("pb_label_value_kit", variantClass),
@@ -62,59 +61,81 @@ const LabelValue = (props: LabelValueProps) => {
62
61
 
63
62
  return (
64
63
  <div
65
- {...ariaProps}
66
- {...dataProps}
67
- className={classes}
68
- id={id}
69
- title={title}
64
+ {...ariaProps}
65
+ {...dataProps}
66
+ className={classes}
67
+ id={id}
68
+ title={title}
70
69
  >
71
- <Caption dark={dark} text={label} />
70
+ <Caption dark={dark}
71
+ text={label}
72
+ />
72
73
  {variant === "details" ? (
73
- <Flex inline vertical="center">
74
+ <Flex inline
75
+ vertical="center"
76
+ >
74
77
  {icon && (
75
- <Body color="light" dark={dark} marginRight="xs">
76
- <Icon dark={dark} fixedWidth icon={icon} />
78
+ <Body color="light"
79
+ dark={dark}
80
+ marginRight="xs"
81
+ >
82
+ <Icon dark={dark}
83
+ fixedWidth
84
+ icon={icon}
85
+ />
77
86
  </Body>
78
87
  )}
79
88
  {description && (
80
89
  <Body
81
- color="light"
82
- dark={dark}
83
- marginRight="xs"
84
- text={description}
90
+ color="light"
91
+ dark={dark}
92
+ marginRight="xs"
93
+ text={description}
85
94
  />
86
95
  )}
87
96
  {active === true ? (
88
- <Flex inline vertical="center">
97
+ <Flex inline
98
+ vertical="center"
99
+ >
89
100
  {title && (
90
- <Title dark={dark} size={4} text={title} variant="link" />
101
+ <Title dark={dark}
102
+ size={4}
103
+ text={title}
104
+ variant="link"
105
+ />
91
106
  )}
92
107
  {date && (
93
108
  <Title
94
- dark={dark}
95
- marginLeft="xs"
96
- size={4}
97
- text={" " + dateString(formattedDate)}
98
- variant="link"
109
+ dark={dark}
110
+ marginLeft="xs"
111
+ size={4}
112
+ text={" " + dateString(date)}
113
+ variant="link"
99
114
  />
100
115
  )}
101
116
  </Flex>
102
117
  ) : (
103
118
  <>
104
- {title && <Title dark={dark} size={4} text={title} />}
119
+ {title && <Title dark={dark}
120
+ size={4}
121
+ text={title}
122
+ />
123
+ }
105
124
  {date && (
106
125
  <Title
107
- dark={dark}
108
- marginLeft="xs"
109
- size={4}
110
- text={" " + dateString(formattedDate)}
126
+ dark={dark}
127
+ marginLeft="xs"
128
+ size={4}
129
+ text={" " + dateString(date)}
111
130
  />
112
131
  )}
113
132
  </>
114
133
  )}
115
134
  </Flex>
116
135
  ) : (
117
- <Body dark={dark} text={value} />
136
+ <Body dark={dark}
137
+ text={value}
138
+ />
118
139
  )}
119
140
  </div>
120
141
  );
@@ -23,8 +23,8 @@ type MessageProps = {
23
23
  id?: string,
24
24
  label?: string,
25
25
  message: string,
26
- timestamp?: string,
27
- timestampObject?: string,
26
+ timestamp?: Date,
27
+ timestampObject?: Date,
28
28
  timezone?: string,
29
29
  alignTimestamp?: string,
30
30
  }
@@ -61,50 +61,50 @@ const Message = (props: MessageProps) => {
61
61
 
62
62
  return (
63
63
  <div
64
- {...ariaProps}
65
- {...dataProps}
66
- className={classes}
67
- id={id}
64
+ {...ariaProps}
65
+ {...dataProps}
66
+ className={classes}
67
+ id={id}
68
68
  >
69
69
  {shouldDisplayAvatar &&
70
70
  <Avatar
71
- imageUrl={avatarUrl}
72
- name={avatarName}
73
- size="xs"
74
- status={avatarStatus}
71
+ imageUrl={avatarUrl}
72
+ name={avatarName}
73
+ size="xs"
74
+ status={avatarStatus}
75
75
  />
76
76
  }
77
77
  <div className="content_wrapper">
78
78
  <Flex
79
- justify={alignTimestamp === 'left' ? 'none' : 'between'}
80
- orientation="row"
79
+ justify={alignTimestamp === 'left' ? 'none' : 'between'}
80
+ orientation="row"
81
81
  >
82
82
  {label &&
83
83
  <Title
84
- className="message_title"
85
- size={4}
86
- text={label}
84
+ className="message_title"
85
+ size={4}
86
+ text={label}
87
87
  />
88
88
  }
89
89
  <Timestamp
90
- className={`pull-${alignTimestamp} ${timestampObject ? 'message_humanized_time' : null}`}
91
- text={timestamp}
92
- timestamp={''}
93
- timezone={timezone}
90
+ className={`pull-${alignTimestamp} ${timestampObject ? 'message_humanized_time' : null}`}
91
+ text={timestamp.toString()}
92
+ timestamp={null}
93
+ timezone={timezone}
94
94
  />
95
95
  {timestampObject &&
96
96
  <Timestamp
97
- className={`pull-${alignTimestamp} message_timestamp`}
98
- text={''}
99
- timestamp={timestampObject}
100
- timezone={timezone}
97
+ className={`pull-${alignTimestamp} message_timestamp`}
98
+ text={''}
99
+ timestamp={timestampObject}
100
+ timezone={timezone}
101
101
  />
102
102
  }
103
103
  </Flex>
104
104
  {message &&
105
105
  <Body
106
- className="pb_message_body"
107
- text={message}
106
+ className="pb_message_body"
107
+ text={message}
108
108
  />
109
109
  }
110
110
  {children}
@@ -1,43 +1,33 @@
1
- import React from 'react'
1
+ import React from "react"
2
2
 
3
- import Message from '../_message'
4
- import Image from '../../pb_image/_image'
3
+ import Message from "../_message"
4
+ import Image from "../../pb_image/_image"
5
5
 
6
6
  const MessageDefault = (props) => {
7
7
  return (
8
8
  <div>
9
9
  <Message
10
- avatarName="Mike Bishop"
11
- avatarStatus="online"
12
- avatarUrl="https://randomuser.me/api/portraits/men/50.jpg"
13
- label="Anna Black"
14
- message="How can we assist you today?"
15
- timestamp="20 seconds ago"
10
+ avatarName='Mike Bishop'
11
+ avatarStatus='online'
12
+ avatarUrl='https://randomuser.me/api/portraits/men/50.jpg'
13
+ borderRadius='rounded'
14
+ label='Anna Black'
15
+ message='How can we assist you today?'
16
+ timestamp='20 seconds ago'
16
17
  {...props}
17
18
  />
18
19
 
19
20
  <br />
20
21
  <br />
21
-
22
- <Message
23
- alignTimestamp="left"
24
- avatarName="Wade Winningham"
25
- avatarUrl="https://randomuser.me/api/portraits/men/14.jpg"
26
- label="Patrick Welch"
27
- message="We will escalate this issue to a Senior Support agent."
28
- timestamp="9 minutes ago"
29
- {...props}
30
- />
31
-
32
22
  <br />
33
23
  <br />
34
24
 
35
25
  <Message
36
- avatarName="Becca Jacobs"
37
- avatarUrl="https://randomuser.me/api/portraits/women/50.jpg"
38
- label="Lucille Sanchez"
39
- message="Application for Kate Smith is waiting for your approval"
40
- timestamp="2 days ago"
26
+ avatarName='Becca Jacobs'
27
+ avatarUrl='https://randomuser.me/api/portraits/women/50.jpg'
28
+ label='Lucille Sanchez'
29
+ message='Application for Kate Smith is waiting for your approval'
30
+ timestamp='2 days ago'
41
31
  {...props}
42
32
  />
43
33
 
@@ -45,10 +35,10 @@ const MessageDefault = (props) => {
45
35
  <br />
46
36
 
47
37
  <Message
48
- avatarName="Timothy Wenhold"
49
- label="Beverly Reyes"
50
- message="We are so sorry you had a bad experience!"
51
- timestamp="2 days ago"
38
+ avatarName='Timothy Wenhold'
39
+ label='Beverly Reyes'
40
+ message='We are so sorry you had a bad experience!'
41
+ timestamp='2 days ago'
52
42
  {...props}
53
43
  />
54
44
 
@@ -56,24 +46,23 @@ const MessageDefault = (props) => {
56
46
  <br />
57
47
 
58
48
  <Message
59
- label="Keith Craig"
60
- message="Please hold for one moment, I will check with my manager."
61
- timestamp="2 days ago"
49
+ label='Keith Craig'
50
+ message='Please hold for one moment, I will check with my manager.'
51
+ timestamp='2 days ago'
62
52
  {...props}
63
53
  />
64
54
 
65
55
  <br />
66
56
  <br />
67
57
 
68
- <Message
69
- label="Keith Craig"
70
- timestamp="2 days ago"
58
+ <Message label='Keith Craig'
59
+ timestamp='2 days ago'
71
60
  {...props}
72
61
  >
73
62
  <Image
74
- alt="picture of a misty forest"
75
- size="md"
76
- url="https://unsplash.it/500/400/?image=634"
63
+ alt='picture of a misty forest'
64
+ size='md'
65
+ url='https://unsplash.it/500/400/?image=634'
77
66
  />
78
67
  </Message>
79
68
 
@@ -81,18 +70,17 @@ const MessageDefault = (props) => {
81
70
  <br />
82
71
 
83
72
  <Message
84
- label="Keith Craig"
85
- message="Please hold for one moment, I will check with my manager."
86
- timestamp="2 days ago"
73
+ label='Keith Craig'
74
+ message='Please hold for one moment, I will check with my manager.'
75
+ timestamp='2 days ago'
87
76
  {...props}
88
77
  >
89
78
  <Image
90
- alt="picture of a misty forest"
91
- size="md"
92
- url="https://unsplash.it/500/400/?image=634"
79
+ alt='picture of a misty forest'
80
+ size='md'
81
+ url='https://unsplash.it/500/400/?image=634'
93
82
  />
94
83
  </Message>
95
-
96
84
  </div>
97
85
  )
98
86
  }
@@ -0,0 +1,41 @@
1
+ import React from "react"
2
+
3
+ import Message from "../_message"
4
+
5
+ const MessageHover = (props) => {
6
+ return (
7
+ <div>
8
+ <Message
9
+ avatarName='Mike Bishop'
10
+ avatarStatus='online'
11
+ avatarUrl='https://randomuser.me/api/portraits/men/50.jpg'
12
+ borderRadius='rounded'
13
+ hover={{ background: "success_subtle" }}
14
+ label='Anna Black'
15
+ message='How can we assist you today?'
16
+ padding="xs"
17
+ {...props}
18
+ />
19
+
20
+ <br />
21
+ <br />
22
+ <br />
23
+
24
+ <Message
25
+ avatarName='Becca Jacobs'
26
+ avatarUrl='https://randomuser.me/api/portraits/women/50.jpg'
27
+ borderRadius='rounded'
28
+ hover={{ shadow: "deepest" }}
29
+ label='Lucille Sanchez'
30
+ message='Application for Kate Smith is waiting for your approval'
31
+ padding="xs"
32
+ {...props}
33
+ />
34
+
35
+ <br />
36
+
37
+ </div>
38
+ )
39
+ }
40
+
41
+ export default MessageHover
@@ -8,4 +8,5 @@ examples:
8
8
  react:
9
9
  - message_default: Default
10
10
  - message_timestamp: With Timestamp Hover
11
+ - message_hover: Hover
11
12
 
@@ -1,2 +1,4 @@
1
1
  export { default as MessageDefault } from './_message_default.jsx'
2
2
  export { default as MessageTimestamp } from './_message_timestamp.jsx'
3
+ export { default as MessageHover } from './_message_hover.jsx'
4
+
@@ -135,7 +135,7 @@ export const recursiveCheckParent = (
135
135
  return data;
136
136
  };
137
137
 
138
- export const getExpandedItems = (treeData: { [key: string]: string }[]) => {
138
+ export const getExpandedItems = (treeData: { [key: string]: string }[], selectedIds: string[]) => {
139
139
  let expandedItems: any[] = [];
140
140
 
141
141
  const traverse = (items: string | any[], ancestors: any[] = []) => {
@@ -146,6 +146,9 @@ export const getExpandedItems = (treeData: { [key: string]: string }[]) => {
146
146
  if (item.expanded) {
147
147
  expandedItems.push(item.id);
148
148
  }
149
+ if (selectedIds && selectedIds.length && selectedIds.includes(item.id)) {
150
+ expandedItems.push(...itemAncestors.map((ancestor) => ancestor.id));
151
+ }
149
152
  if (Array.isArray(item.children)) {
150
153
  const hasCheckedChildren = item.children.some(
151
154
  (child: { [key: string]: string }) => child.checked