playbook_ui 11.3.0 → 11.4.0.pre.alpha.rubytheme1

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 (86) hide show
  1. checksums.yaml +4 -4
  2. data/app/pb_kits/playbook/index.js +1 -0
  3. data/app/pb_kits/playbook/pb_button/_button.tsx +6 -6
  4. data/app/pb_kits/playbook/pb_circle_icon_button/{_circle_icon_button.jsx → _circle_icon_button.tsx} +6 -10
  5. data/app/pb_kits/playbook/pb_contact/contact.test.js +45 -1
  6. data/app/pb_kits/playbook/pb_currency/{_currency.jsx → _currency.tsx} +17 -12
  7. data/app/pb_kits/playbook/pb_date/_date.tsx +101 -0
  8. data/app/pb_kits/playbook/pb_date_picker/date_picker.test.js +10 -9
  9. data/app/pb_kits/playbook/pb_date_time/{_date_time.jsx → _date_time.tsx} +2 -5
  10. data/app/pb_kits/playbook/pb_date_time/dateTime.test.js +110 -0
  11. data/app/pb_kits/playbook/pb_date_time/docs/_date_time_align.jsx +1 -1
  12. data/app/pb_kits/playbook/pb_date_time/docs/_date_time_default.jsx +1 -1
  13. data/app/pb_kits/playbook/pb_date_time/docs/_date_time_size.jsx +1 -1
  14. data/app/pb_kits/playbook/pb_dialog/_dialog.jsx +32 -14
  15. data/app/pb_kits/playbook/pb_dialog/_dialog.scss +5 -0
  16. data/app/pb_kits/playbook/pb_dialog/child_kits/_dialog_body.jsx +2 -2
  17. data/app/pb_kits/playbook/pb_dialog/child_kits/_dialog_footer.jsx +22 -4
  18. data/app/pb_kits/playbook/pb_dialog/child_kits/_dialog_header.jsx +3 -3
  19. data/app/pb_kits/playbook/pb_dialog/dialog.test.jsx +79 -17
  20. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_stacked_alert.jsx +55 -93
  21. data/app/pb_kits/playbook/pb_dialog/docs/_dialog_status.jsx +79 -42
  22. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/_fixed_confirmation_toast.tsx +80 -0
  23. data/app/pb_kits/playbook/pb_hashtag/_hashtag.tsx +10 -1
  24. data/app/pb_kits/playbook/pb_hashtag/docs/_hashtag_link.html.erb +5 -0
  25. data/app/pb_kits/playbook/pb_hashtag/docs/_hashtag_link.jsx +26 -0
  26. data/app/pb_kits/playbook/pb_hashtag/docs/_hashtag_link.md +1 -0
  27. data/app/pb_kits/playbook/pb_hashtag/docs/example.yml +2 -0
  28. data/app/pb_kits/playbook/pb_hashtag/docs/index.js +1 -0
  29. data/app/pb_kits/playbook/pb_hashtag/hashtag.html.erb +1 -1
  30. data/app/pb_kits/playbook/pb_hashtag/hashtag.rb +6 -0
  31. data/app/pb_kits/playbook/pb_hashtag/hashtag.test.js +54 -0
  32. data/app/pb_kits/playbook/pb_home_address_street/_home_address_street.jsx +3 -0
  33. data/app/pb_kits/playbook/pb_home_address_street/city_emphasis.html.erb +2 -1
  34. data/app/pb_kits/playbook/pb_home_address_street/city_emphasis.rb +2 -0
  35. data/app/pb_kits/playbook/pb_home_address_street/docs/_home_address_street_link.html.erb +12 -0
  36. data/app/pb_kits/playbook/pb_home_address_street/docs/_home_address_street_link.jsx +23 -0
  37. data/app/pb_kits/playbook/pb_home_address_street/docs/_home_address_street_link.md +1 -0
  38. data/app/pb_kits/playbook/pb_home_address_street/docs/example.yml +3 -0
  39. data/app/pb_kits/playbook/pb_home_address_street/docs/index.js +1 -0
  40. data/app/pb_kits/playbook/pb_home_address_street/home_address_street.rb +4 -0
  41. data/app/pb_kits/playbook/pb_home_address_street/street_emphasis.html.erb +2 -1
  42. data/app/pb_kits/playbook/pb_home_address_street/street_emphasis.rb +4 -1
  43. data/app/pb_kits/playbook/pb_icon/_icon.tsx +1 -0
  44. data/app/pb_kits/playbook/pb_icon_circle/{_icon_circle.jsx → _icon_circle.tsx} +2 -4
  45. data/app/pb_kits/playbook/pb_kit/{dateTime.js → dateTime.ts} +5 -6
  46. data/app/pb_kits/playbook/pb_label_pill/{_label_pill.jsx → _label_pill.tsx} +2 -4
  47. data/app/pb_kits/playbook/pb_label_value/_label_value.jsx +1 -1
  48. data/app/pb_kits/playbook/pb_logistic/_logistic.jsx +1 -1
  49. data/app/pb_kits/playbook/pb_pill/_pill.tsx +1 -1
  50. data/app/pb_kits/playbook/pb_section_separator/{_section_separator.jsx → _section_separator.tsx} +7 -8
  51. data/app/pb_kits/playbook/pb_time/_time.tsx +92 -0
  52. data/app/pb_kits/playbook/pb_time/docs/_time_align.jsx +1 -1
  53. data/app/pb_kits/playbook/pb_time/docs/_time_default.jsx +1 -1
  54. data/app/pb_kits/playbook/pb_time/docs/_time_sizes.jsx +1 -1
  55. data/app/pb_kits/playbook/pb_time/docs/_time_timestamp.jsx +1 -1
  56. data/app/pb_kits/playbook/pb_time/docs/_time_timezone.jsx +1 -1
  57. data/app/pb_kits/playbook/pb_time_stacked/_time_stacked.jsx +1 -1
  58. data/app/pb_kits/playbook/pb_title/_title.tsx +1 -1
  59. data/app/pb_kits/playbook/pb_tooltip/_tooltip.scss +49 -6
  60. data/app/pb_kits/playbook/pb_tooltip/_tooltip.tsx +144 -0
  61. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_default_react.jsx +59 -0
  62. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_default_react.md +5 -0
  63. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_icon.erb +10 -0
  64. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_icon.jsx +52 -0
  65. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_icon.md +1 -0
  66. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_interaction.jsx +40 -0
  67. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_interaction.md +1 -0
  68. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_margin.jsx +39 -0
  69. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_margin.md +3 -0
  70. data/app/pb_kits/playbook/pb_tooltip/docs/_tooltip_with_icon_circle.html.erb +1 -1
  71. data/app/pb_kits/playbook/pb_tooltip/docs/example.yml +7 -1
  72. data/app/pb_kits/playbook/pb_tooltip/docs/index.js +4 -0
  73. data/app/pb_kits/playbook/pb_tooltip/tooltip.test.jsx +50 -0
  74. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_without_pills.html.erb +37 -0
  75. data/app/pb_kits/playbook/pb_typeahead/docs/_typeahead_without_pills.md +1 -0
  76. data/app/pb_kits/playbook/pb_typeahead/docs/example.yml +1 -0
  77. data/app/pb_kits/playbook/pb_typeahead/typeahead.html.erb +2 -2
  78. data/app/pb_kits/playbook/pb_typeahead/typeahead.rb +10 -2
  79. data/app/pb_kits/playbook/pb_weekday_stacked/_weekday_stacked.jsx +1 -1
  80. data/app/pb_kits/playbook/playbook-doc.js +2 -0
  81. data/app/pb_kits/playbook/tokens/_colors.scss +74 -74
  82. data/lib/playbook/version.rb +2 -2
  83. metadata +37 -15
  84. data/app/pb_kits/playbook/pb_date/_date.jsx +0 -138
  85. data/app/pb_kits/playbook/pb_fixed_confirmation_toast/_fixed_confirmation_toast.jsx +0 -93
  86. data/app/pb_kits/playbook/pb_time/_time.jsx +0 -90
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 829ab73754749eeb3476c40cfaba3fb74e62e92744f725772b851b3c084a81ce
4
- data.tar.gz: e42dc4f35cb80676454745307afba58a5d33e7deae5f68ff36074a28e78e3299
3
+ metadata.gz: b08242bc3ecb4b0a6d39f6f744c7992373163acf8ee6cda73d248e60957a55ea
4
+ data.tar.gz: 7a75bbb2b67ae251acd04e3b6b165016a93dd0d88af1e33aa0bfa6e330922a8b
5
5
  SHA512:
6
- metadata.gz: 6c74669ef536138bc842fb3b2867d68716e10b15af93ea73233593bad06c7c0f01494d30e29cba67c7a2526401a854bf6ad00b259829a2adcfe4795969dbbcb5
7
- data.tar.gz: 169d399c99f5fddd984fedb81e3701b85e918da087546259e84989bbf5f17a0227a9787494a8f524c2a50d38eccfc4badab2e9810e3e0b5cecd5585bb85883ac
6
+ metadata.gz: ad154483627c3617903bb1971c11d13ef07e30f5590933b2a5eb24a36f4d275090989ce6be4052c607f5bdd893833b5b619b9f4ae9c583fbacd7a889165e831c
7
+ data.tar.gz: 15afb381f181102c1b11b2731c16ede43d0f030ec910e967f15c5ae13c41e328008436cc6dba7ce2adfc93f1a085f0a5724365b0865834e72267f4ea8d33381a
@@ -98,6 +98,7 @@ export { default as Title } from './pb_title/_title'
98
98
  export { default as TitleCount } from './pb_title_count/_title_count'
99
99
  export { default as TitleDetail } from './pb_title_detail/_title_detail'
100
100
  export { default as Toggle } from './pb_toggle/_toggle'
101
+ export { default as Tooltip } from './pb_tooltip/_tooltip'
101
102
  export { default as TreemapChart } from './pb_treemap_chart/_treemap_chart'
102
103
  export { default as Typeahead } from './pb_typeahead/_typeahead'
103
104
  export { default as User } from './pb_user/_user'
@@ -8,10 +8,10 @@ import Icon from '../pb_icon/_icon'
8
8
  type EventHandler = (React.MouseEventHandler<HTMLElement>)
9
9
 
10
10
  type ButtonPropTypes = {
11
- aria?: {[key: string]: string},
11
+ aria?: { [key: string]: string },
12
12
  children?: React.ReactChild[] | React.ReactChild,
13
13
  className?: string | string[],
14
- data?: {[key: string]: string},
14
+ data?: { [key: string]: string },
15
15
  disabled?: boolean,
16
16
  fixedWidth?: boolean,
17
17
  form?: string,
@@ -24,11 +24,11 @@ type ButtonPropTypes = {
24
24
  onClick?: EventHandler,
25
25
  size?: 'sm' | 'md' | 'lg',
26
26
  text?: string,
27
- type: 'inline' | null,
27
+ type?: 'inline' | null,
28
28
  htmlType: 'submit' | 'reset' | 'button' | undefined,
29
29
  value?: string | null,
30
30
  variant: 'primary' | 'secondary' | 'link',
31
- wrapperClass: string,
31
+ wrapperClass?: string,
32
32
  } & GlobalProps
33
33
 
34
34
  const buttonClassName = (props: ButtonPropTypes) => {
@@ -99,8 +99,8 @@ const Button = (props: ButtonPropTypes) => {
99
99
  )
100
100
 
101
101
  const ifLoading = () => {
102
- if (loading){
103
- return(
102
+ if (loading) {
103
+ return (
104
104
  <>
105
105
  {loadingIcon}
106
106
  </>
@@ -1,11 +1,7 @@
1
- /* @flow */
2
-
3
1
  import React from 'react'
4
2
  import classnames from 'classnames'
5
3
  import { buildAriaProps, buildCss, buildDataProps } from '../utilities/props'
6
4
 
7
- import type { Callback } from '../types'
8
-
9
5
  import { noop } from '../utilities/props'
10
6
  import { globalProps } from '../utilities/globalProps'
11
7
 
@@ -13,21 +9,21 @@ import Button from '../pb_button/_button'
13
9
  import Icon from '../pb_icon/_icon'
14
10
 
15
11
  type CircleIconButtonProps = {
16
- aria?: object,
12
+ aria?: { [key: string]: string },
17
13
  className?: string,
18
14
  dark?: boolean,
19
- data?: object,
15
+ data?: { [key: string]: string },
20
16
  disabled?: boolean,
21
17
  icon: string,
22
18
  id?: string,
23
19
  link?: string,
24
- onClick?: Callback,
20
+ onClick?: React.MouseEventHandler<HTMLElement>,
25
21
  newWindow?: boolean,
26
- type?: 'button' | 'submit' | 'reset',
22
+ type?: 'button' | 'submit' | 'reset' | undefined,
27
23
  variant?: 'primary' | 'secondary' | 'link',
28
24
  }
29
25
 
30
- const CircleIconButton = (props: CircleIconButtonProps) => {
26
+ const CircleIconButton = (props: CircleIconButtonProps): React.ReactElement => {
31
27
  const {
32
28
  aria = {},
33
29
  className,
@@ -61,11 +57,11 @@ const CircleIconButton = (props: CircleIconButtonProps) => {
61
57
  <Button
62
58
  dark={dark}
63
59
  disabled={disabled}
60
+ htmlType={type}
64
61
  link={link}
65
62
  newWindow={newWindow}
66
63
  onClick={onClick}
67
64
  text={null}
68
- type={type}
69
65
  variant={variant}
70
66
  >
71
67
  <Icon
@@ -17,7 +17,7 @@ test('returns namespaced class name', () => {
17
17
  })
18
18
 
19
19
  test('returns correct icon', () => {
20
- render(
20
+ render(
21
21
  <>
22
22
  <Contact
23
23
  contactDetail="Cell"
@@ -85,3 +85,47 @@ test('returns correct icon', () => {
85
85
  expect(screen.getByTestId('test-extension').querySelector('.pb_icon_kit')).toHaveClass('fa-phone-plus')
86
86
  expect(screen.getByTestId('test-empty').querySelector('.pb_icon_kit')).toHaveClass('fa-phone')
87
87
  })
88
+
89
+ test("not compliant values return null in phone related contact types", () => {
90
+ const notCompliantValues = [
91
+ "349-185-998223",
92
+ "349-1858",
93
+ "",
94
+ "2",
95
+ "string",
96
+ ]
97
+ const contactTypes = [
98
+ "cell",
99
+ "work",
100
+ "work-cell",
101
+ "wrong-number",
102
+ "wrong-phone",
103
+ "wrong-type",
104
+ "extension",
105
+ ]
106
+
107
+ const buildData = contactTypes.reduce((response, type) => {
108
+ notCompliantValues.forEach((value) => response.push({ type, value }))
109
+ return response
110
+ }, [])
111
+
112
+ const { rerender } = render(
113
+ <Contact
114
+ contactType=""
115
+ contactValue=""
116
+ data={{ testid: `contact-kit-null-test` }}
117
+ />
118
+ )
119
+ buildData.map(({ type, value }) => {
120
+ rerender(
121
+ <Contact
122
+ contactType={type}
123
+ contactValue={value}
124
+ data={{ testid: `contact-kit-null-test` }}
125
+ />
126
+ )
127
+ expect(screen.getByTestId("contact-kit-null-test")).toHaveTextContent(
128
+ "null"
129
+ )
130
+ })
131
+ })
@@ -1,5 +1,3 @@
1
- /* @flow */
2
-
3
1
  import React from 'react'
4
2
  import classnames from 'classnames'
5
3
 
@@ -14,10 +12,10 @@ type CurrencyProps = {
14
12
  abbreviate?: boolean,
15
13
  align?: 'center' | 'left' | 'right',
16
14
  amount: string,
17
- aria?: object,
15
+ aria?: {[key:string]:string},
18
16
  className?: string,
19
17
  dark?: boolean,
20
- data?: object,
18
+ data?: {[key:string]:string},
21
19
  decimals?: 'default' | 'matching',
22
20
  emphasized?: boolean,
23
21
  id?: string,
@@ -28,7 +26,7 @@ type CurrencyProps = {
28
26
  unit?: string,
29
27
  }
30
28
 
31
- const sizes = {
29
+ const sizes: {lg: 1, md: 3, sm: 4} = {
32
30
  lg: 1,
33
31
  md: 3,
34
32
  sm: 4,
@@ -68,12 +66,12 @@ const Currency = (props: CurrencyProps) => {
68
66
  const ariaProps = buildAriaProps(aria)
69
67
  const dataProps = buildDataProps(data)
70
68
  const classes = classnames(
71
- buildCss('pb_currency_kit', align, size, { dark }),
69
+ buildCss('pb_currency_kit', align, size),
72
70
  globalProps(props),
73
71
  className
74
72
  )
75
73
 
76
- const getFormattedNumber = (input) => new Intl.NumberFormat('en-US', {
74
+ const getFormattedNumber = (input: number | any ) => new Intl.NumberFormat('en-US', {
77
75
  notation: 'compact',
78
76
  maximumFractionDigits: 1,
79
77
  }).format(input)
@@ -126,11 +124,18 @@ const Currency = (props: CurrencyProps) => {
126
124
  dark={dark}
127
125
  >
128
126
  {getAbbreviation}
129
- <If condition={unit}>
130
- {unit}
131
- <Else />
132
- {getDecimalValue}
133
- </If>
127
+ {
128
+ unit ? (
129
+ <>
130
+ {unit}
131
+ </>
132
+ ) : (
133
+ <>
134
+ {getDecimalValue}
135
+ </>
136
+ )
137
+ }
138
+
134
139
  </Body>
135
140
  </div>
136
141
  </div>
@@ -0,0 +1,101 @@
1
+ import React from "react";
2
+ import classnames from "classnames";
3
+
4
+ import DateTime from "../pb_kit/dateTime";
5
+ import { buildAriaProps, buildCss, buildDataProps } from "../utilities/props";
6
+ import { globalProps } from "../utilities/globalProps";
7
+
8
+ import Body from "../pb_body/_body";
9
+ import Caption from "../pb_caption/_caption";
10
+ import Icon from "../pb_icon/_icon";
11
+ import Title from "../pb_title/_title";
12
+
13
+ type PbDateProps = {
14
+ alignment?: "left" | "center" | "right";
15
+ aria?: { [key: string]: string };
16
+ className?: string;
17
+ data?: { [key: string]: string };
18
+ id?: string;
19
+ showDayOfWeek?: boolean;
20
+ showIcon?: boolean;
21
+ size?: "sm" | "md" | "lg";
22
+ value: string | Date;
23
+ };
24
+
25
+ const PbDate = (props: PbDateProps) => {
26
+ const {
27
+ aria = {},
28
+ alignment = "left",
29
+ className,
30
+ data = {},
31
+ id,
32
+ showDayOfWeek = false,
33
+ showIcon = false,
34
+ size = "md",
35
+ value,
36
+ } = props;
37
+
38
+ const dateTimestamp = new DateTime({ value: value });
39
+ const weekday = dateTimestamp.toWeekday();
40
+ const month = dateTimestamp.toMonth();
41
+ const day = dateTimestamp.toDay();
42
+ const year = dateTimestamp.toYear();
43
+ const currentYear = new Date().getFullYear().toString();
44
+
45
+ const ariaProps = buildAriaProps(aria);
46
+ const dataProps = buildDataProps(data);
47
+
48
+ const classes = classnames(
49
+ buildCss("pb_date_kit", alignment),
50
+ globalProps(props),
51
+ className
52
+ );
53
+
54
+ return (
55
+ <div {...ariaProps} {...dataProps} className={classes} id={id}>
56
+ {size == "md" || size == "lg" ? (
57
+ <Title size={4} tag="h4">
58
+ {showIcon && (
59
+ <Body className="pb_icon_kit_container" color="light" tag="span">
60
+ <Icon fixedWidth icon="calendar-alt" />
61
+ </Body>
62
+ )}
63
+
64
+ {showDayOfWeek && (
65
+ <>
66
+ {weekday}
67
+ <Body color="light" tag="span" text=" • " />
68
+ </>
69
+ )}
70
+
71
+ <span>
72
+ {month} {day}
73
+ </span>
74
+ {currentYear != year && <span>{`, ${year}`}</span>}
75
+ </Title>
76
+ ) : (
77
+ <>
78
+ {showIcon && (
79
+ <Caption className="pb_icon_kit_container" tag="span">
80
+ <Icon fixedWidth icon="calendar-alt" size="sm" />
81
+ </Caption>
82
+ )}
83
+
84
+ {showDayOfWeek && (
85
+ <>
86
+ <Caption tag="div">{weekday}</Caption>
87
+ <Caption color="light" tag="div" text=" • " />
88
+ </>
89
+ )}
90
+
91
+ <Caption tag="span">
92
+ {month} {day}
93
+ {currentYear != year && <>{`, ${year}`}</>}
94
+ </Caption>
95
+ </>
96
+ )}
97
+ </div>
98
+ );
99
+ };
100
+
101
+ export default PbDate;
@@ -5,16 +5,15 @@ import { fireEvent, render, screen, waitFor, within } from '../utilities/test-ut
5
5
  import DatePicker from './_date_picker'
6
6
  import { getTimezoneText } from './plugins/timeSelect'
7
7
 
8
+
9
+
10
+ jest.setSystemTime(new Date('01/01/2020'));
8
11
  const DEFAULT_DATE = new Date()
9
- DEFAULT_DATE.setFullYear(2022)
10
- DEFAULT_DATE.setMonth(1)
11
- DEFAULT_DATE.setDate(1)
12
- DEFAULT_DATE.setHours(12)
13
- DEFAULT_DATE.setMinutes(0)
12
+
14
13
 
15
14
  describe('DatePicker Kit', () => {
16
15
  beforeEach(() => {
17
- jest.spyOn(console, 'error').mockImplementation(() => {});
16
+ jest.spyOn(console, 'error').mockImplementation(() => { });
18
17
  });
19
18
 
20
19
  test('renders DatePicker input field', () => {
@@ -44,10 +43,12 @@ describe('DatePicker Kit', () => {
44
43
 
45
44
  const kit = screen.getByTestId(testId)
46
45
 
46
+
47
47
  const input = within(kit).getByPlaceholderText('Select Date')
48
48
  expect(input).toBeInTheDocument()
49
+
49
50
  await waitFor(() => {
50
- expect(input).toHaveValue('02/01/2022')
51
+ expect(input).toHaveValue('01/01/2020')
51
52
  })
52
53
  })
53
54
 
@@ -143,7 +144,7 @@ describe('DatePicker Kit', () => {
143
144
  }),
144
145
  )
145
146
  await waitFor(() => {
146
- expect(input).toHaveValue('02/01/2022 at 12:00 AM')
147
+ expect(input).toHaveValue('01/01/2020 at 12:00 AM')
147
148
  })
148
149
 
149
150
  fireEvent(
@@ -154,7 +155,7 @@ describe('DatePicker Kit', () => {
154
155
  }),
155
156
  )
156
157
  await waitFor(() => {
157
- expect(input).toHaveValue('02/01/2022 at 12:00 PM')
158
+ expect(input).toHaveValue('01/01/2020 at 12:00 PM')
158
159
  })
159
160
  })
160
161
  })
@@ -1,5 +1,3 @@
1
- /* @flow */
2
-
3
1
  import React from 'react'
4
2
  import classnames from 'classnames'
5
3
 
@@ -12,9 +10,9 @@ import FormattedDate from '../pb_date/_date'
12
10
 
13
11
  type DateTimeProps = {
14
12
  align?: "left" | "center" | "right",
15
- aria?: object,
13
+ aria?: { [key: string]: string; },
16
14
  className?: string,
17
- data?: object,
15
+ data?: { [key: string]: string; },
18
16
  datetime: string,
19
17
  id?: string,
20
18
  size?: "sm" | "md",
@@ -59,7 +57,6 @@ const DateTime = (props: DateTimeProps) => {
59
57
  <FormattedDate
60
58
  showDayOfWeek={showDayOfWeek}
61
59
  size={size}
62
- timeZone={timeZone}
63
60
  value={datetime}
64
61
  />
65
62
  <Time
@@ -0,0 +1,110 @@
1
+ import React from 'react'
2
+ import { render, screen } from '../utilities/test-utils'
3
+
4
+ import DateTime from './_date_time'
5
+
6
+ const TEST_DATE = '01/01/2020 00:00:000 GMT-0500'
7
+ jest.setSystemTime(new Date(TEST_DATE));
8
+ const testId = 'datetime-kit'
9
+
10
+ const realDate = Date
11
+
12
+ beforeEach(() => {
13
+ global.Date.now = jest.fn(() => new Date(TEST_DATE).getTime());
14
+ })
15
+
16
+ afterEach(() => {
17
+ global.Date = realDate;
18
+ })
19
+
20
+ describe('DateTime Kit', () => {
21
+ test('renders DatePicker className', () => {
22
+ render(
23
+ <DateTime
24
+ data={{ testid: testId }}
25
+ datetime={new Date(Date.now())}
26
+ showDayOfWeek
27
+ showIcon
28
+ />
29
+ )
30
+
31
+ const kit = screen.getByTestId(testId)
32
+ expect(kit).toHaveClass('pb_date_time_md')
33
+ })
34
+ test('renders DatePicker text left', () => {
35
+ render(
36
+ <DateTime
37
+ data={{ testid: testId }}
38
+ datetime={new Date(Date.now())}
39
+ showDayOfWeek
40
+ showIcon
41
+ />
42
+ )
43
+
44
+ const kit = screen.getByTestId(testId)
45
+ const text = kit.querySelector('.pb_date_kit_left')
46
+ expect(text.textContent).toEqual('Wed • Jan 1')
47
+ })
48
+ test('renders DatePicker text right', () => {
49
+ render(
50
+ <DateTime
51
+ data={{ testid: testId }}
52
+ datetime={new Date(Date.now())}
53
+ showDayOfWeek
54
+ showIcon
55
+ />
56
+ )
57
+
58
+ const kit = screen.getByTestId(testId)
59
+ const text = kit.querySelector('.pb_time_kit_md.ml_sm')
60
+ const clock = kit.querySelector('.pb_icon_kit.far.fa-fw.fa-clock')
61
+
62
+ expect(clock).toBeInTheDocument()
63
+ expect(text.textContent).toEqual(' 12:00a EST')
64
+ })
65
+ test('renders DatePicker text right no icon', () => {
66
+ render(
67
+ <DateTime
68
+ data={{ testid: testId }}
69
+ datetime={new Date(Date.now())}
70
+ showDayOfWeek
71
+ />
72
+ )
73
+
74
+ const kit = screen.getByTestId(testId)
75
+ const clock = kit.querySelector('.pb_icon_kit.far.fa-fw.fa-clock')
76
+
77
+ expect(clock).toBeNull()
78
+ })
79
+ test('renders DatePicker text right timezone', () => {
80
+ render(
81
+ <DateTime
82
+ data={{ testid: testId }}
83
+ datetime={new Date(Date.now())}
84
+ showDayOfWeek
85
+ timeZone="Asia/Tokyo"
86
+ />
87
+ )
88
+
89
+ const kit = screen.getByTestId(testId)
90
+ const text = kit.querySelector('.pb_time_kit_md.ml_sm')
91
+
92
+ expect(text.textContent).toEqual('2:00p JST')
93
+ })
94
+ test('renders DatePicker size', () => {
95
+ render(
96
+ <DateTime
97
+ data={{ testid: testId }}
98
+ datetime={new Date(Date.now())}
99
+ showDayOfWeek
100
+ size="sm"
101
+ />
102
+ )
103
+
104
+ const kit = screen.getByTestId(testId)
105
+ const rightSide = kit.querySelector('.pb_time_kit_sm.ml_sm')
106
+
107
+ expect(kit).toHaveClass('pb_date_time_sm')
108
+ expect(rightSide).toBeInTheDocument()
109
+ })
110
+ })
@@ -1,5 +1,5 @@
1
1
  import React from 'react'
2
- import DateTime from '../_date_time.jsx'
2
+ import DateTime from '../_date_time'
3
3
 
4
4
  const DateTimeAlign = (props) => (
5
5
  <div>
@@ -1,5 +1,5 @@
1
1
  import React from 'react'
2
- import DateTime from '../_date_time.jsx'
2
+ import DateTime from '../_date_time'
3
3
 
4
4
  const DateTimeDefault = (props) => (
5
5
  <div>
@@ -1,5 +1,5 @@
1
1
  import React from 'react'
2
- import DateTime from '../_date_time.jsx'
2
+ import DateTime from '../_date_time'
3
3
 
4
4
  const DateTimeDefault = (props) => (
5
5
  <div>
@@ -37,7 +37,7 @@ type DialogProps = {
37
37
  opened: boolean,
38
38
  portalClassName?: string,
39
39
  shouldCloseOnOverlayClick: boolean,
40
- size?: "sm" | "md" | "lg" | "content",
40
+ size?: "sm" | "md" | "lg" | "status_size" | "content",
41
41
  status?: "info" | "caution" | "delete" | "error" | "success",
42
42
  text?: string,
43
43
  title?: string,
@@ -53,7 +53,7 @@ const Dialog = (props: DialogProps) => {
53
53
  className,
54
54
  data = {},
55
55
  id,
56
- size = 'md',
56
+ size = "md",
57
57
  children,
58
58
  loading = false,
59
59
  opened,
@@ -107,25 +107,35 @@ const Dialog = (props: DialogProps) => {
107
107
  }
108
108
 
109
109
  const sweetAlertStatus = {
110
- info: {
110
+ default: {
111
111
  icon: "exclamation-circle",
112
112
  variant: "default",
113
+ size: "lg"
114
+ },
115
+ info: {
116
+ icon: "info-circle",
117
+ variant: "default",
118
+ size: "lg"
113
119
  },
114
120
  caution: {
115
- icon: "triangle-warning",
121
+ icon: "exclamation-triangle",
116
122
  variant: "yellow",
123
+ size: "lg"
117
124
  },
118
125
  delete: {
119
- icon: "trash",
126
+ icon: "trash-alt",
120
127
  variant: "red",
128
+ size: "lg"
121
129
  },
122
130
  error: {
123
131
  icon: "times-circle",
124
132
  variant: "red",
133
+ size: "lg"
125
134
  },
126
135
  success: {
127
136
  icon: "check-circle",
128
137
  variant: "green",
138
+ size: "lg"
129
139
  },
130
140
  }
131
141
 
@@ -150,27 +160,35 @@ const Dialog = (props: DialogProps) => {
150
160
  shouldCloseOnOverlayClick={shouldCloseOnOverlayClick}
151
161
  status={status}
152
162
  >
153
- <If condition={title}>
163
+ <If condition={title && !status}>
154
164
  <Dialog.Header>{title}</Dialog.Header>
155
165
  </If>
156
166
  <If condition={!status && text}>
157
- <Dialog.Body>{text}</Dialog.Body>
167
+ <Dialog.Body>
168
+ {text}
169
+ </Dialog.Body>
158
170
  </If>
159
171
  <If condition={status}>
160
- <Dialog.Body>
161
- <Flex align='center'
162
- orientation='column'
172
+ <Dialog.Body
173
+ padding="md"
174
+ >
175
+ <Flex
176
+ align="center"
177
+ orientation="column"
163
178
  >
164
179
  <IconCircle
165
180
  icon={sweetAlertStatus[status].icon}
181
+ size={sweetAlertStatus[status].size}
166
182
  variant={sweetAlertStatus[status].variant}
167
183
  />
168
- <Title marginY='sm'
184
+ <Title
185
+ marginTop="sm"
169
186
  size={3}
170
187
  >
171
188
  {title}
172
189
  </Title>
173
- <Body marginY='xs'
190
+ <Body
191
+ marginTop="xs"
174
192
  text={text}
175
193
  />
176
194
  </Flex>
@@ -184,9 +202,9 @@ const Dialog = (props: DialogProps) => {
184
202
  >
185
203
  {confirmButton}
186
204
  </Button>
187
- <Button id='cancel-button'
205
+ <Button id="cancel-button"
188
206
  onClick={onCancel}
189
- variant='link'
207
+ variant="link"
190
208
  >
191
209
  {cancelButton}
192
210
  </Button>
@@ -59,6 +59,7 @@
59
59
  // Local Variables
60
60
  $gutter: $space_lg;
61
61
  $small: 300px;
62
+ $status_size: 375px;
62
63
  $medium: 500px;
63
64
  $large: 800px;
64
65
  $animation-duration: 0.2s;
@@ -78,6 +79,10 @@
78
79
  outline: none;
79
80
  animation-timing-function: $easeInOutQuint;
80
81
 
82
+ &[class*="_status_size"] {
83
+ width: $status_size;
84
+ }
85
+
81
86
  &[class*="_sm"] {
82
87
  width: $small;
83
88
  }