playbook_ui 12.28.0.pre.alpha.PLAY814removemomentjs871 → 12.28.0.pre.alpha.PLAY837MapCustomButton868
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/pb_kits/playbook/index.js +1 -0
- data/app/pb_kits/playbook/pb_date/_date.tsx +8 -7
- data/app/pb_kits/playbook/pb_date_range_inline/_date_range_inline.tsx +31 -45
- data/app/pb_kits/playbook/pb_date_range_stacked/_date_range_stacked.tsx +3 -5
- data/app/pb_kits/playbook/pb_date_stacked/_date_stacked.tsx +21 -24
- data/app/pb_kits/playbook/pb_date_time/_date_time.tsx +1 -1
- data/app/pb_kits/playbook/pb_date_time/dateTime.test.js +1 -1
- data/app/pb_kits/playbook/pb_date_time_stacked/_date_time_stacked.tsx +2 -2
- data/app/pb_kits/playbook/pb_date_time_stacked/date_time_stacked.test.js +1 -1
- data/app/pb_kits/playbook/pb_date_year_stacked/_date_year_stacked.tsx +8 -6
- data/app/pb_kits/playbook/pb_kit/dateTime.ts +67 -139
- data/app/pb_kits/playbook/pb_label_value/_label_value.tsx +31 -52
- data/app/pb_kits/playbook/pb_logistic/_logistic.jsx +120 -0
- data/app/pb_kits/playbook/pb_map/_map.scss +16 -1
- data/app/pb_kits/playbook/pb_map/_map.tsx +9 -26
- data/app/pb_kits/playbook/pb_map/_map_controls.tsx +47 -0
- data/app/pb_kits/playbook/pb_map/_map_custom_button.tsx +18 -0
- data/app/pb_kits/playbook/pb_map/docs/_map_with_custom_button.jsx +83 -0
- data/app/pb_kits/playbook/pb_map/docs/_map_with_custom_button.md +1 -0
- data/app/pb_kits/playbook/pb_map/docs/example.yml +1 -0
- data/app/pb_kits/playbook/pb_map/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_message/_message.tsx +25 -25
- data/app/pb_kits/playbook/pb_time/_time.tsx +11 -9
- data/app/pb_kits/playbook/pb_time_range_inline/_time_range_inline.tsx +49 -46
- data/app/pb_kits/playbook/pb_time_stacked/_time_stacked.tsx +6 -4
- data/app/pb_kits/playbook/pb_timestamp/_timestamp.tsx +10 -10
- data/app/pb_kits/playbook/pb_weekday_stacked/_weekday_stacked.tsx +11 -8
- data/dist/playbook-rails.js +6 -6
- data/lib/playbook/version.rb +1 -1
- metadata +7 -2
@@ -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:
|
30
|
-
const month =
|
31
|
-
const day =
|
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
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
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
|
-
|
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
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
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
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
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
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
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
|
@@ -5,6 +5,21 @@
|
|
5
5
|
@import "./_pb_map_button_mixin.scss";
|
6
6
|
|
7
7
|
[class*="pb_map"] {
|
8
|
+
.pb_map-custom-button {
|
9
|
+
@include pb_map_button;
|
10
|
+
position: relative;
|
11
|
+
margin-top: $space_xs;
|
12
|
+
box-shadow: $shadow_deep;
|
13
|
+
.pb_icon_kit {
|
14
|
+
width: $space_sm - 2;
|
15
|
+
height: $space_sm;
|
16
|
+
}
|
17
|
+
|
18
|
+
.pb_button_content {
|
19
|
+
height: $space_sm;
|
20
|
+
}
|
21
|
+
}
|
22
|
+
|
8
23
|
.mapboxgl-map,
|
9
24
|
.maplibregl-map {
|
10
25
|
font-family: $font_family_base !important;
|
@@ -185,7 +200,7 @@
|
|
185
200
|
}
|
186
201
|
.map-zoom-in-button,
|
187
202
|
.map-zoom-out-button,
|
188
|
-
.map-flyto-button {
|
203
|
+
.map-flyto-button, .pb_map-custom-button {
|
189
204
|
@include pb_map_button_dark;
|
190
205
|
}
|
191
206
|
|
@@ -3,9 +3,7 @@ import classnames from 'classnames'
|
|
3
3
|
import { buildAriaProps, buildCss, buildDataProps } from '../utilities/props'
|
4
4
|
import { globalProps, GlobalProps } from '../utilities/globalProps'
|
5
5
|
|
6
|
-
import
|
7
|
-
import Icon from '../pb_icon/_icon'
|
8
|
-
import Button from '../pb_button/_button'
|
6
|
+
import MapControls from './_map_controls';
|
9
7
|
|
10
8
|
type MapProps = {
|
11
9
|
aria?: { [key: string]: string },
|
@@ -47,29 +45,13 @@ const Map = (props: MapProps) => {
|
|
47
45
|
>
|
48
46
|
{
|
49
47
|
zoomBtns ? (
|
50
|
-
<
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
<Button className='map-zoom-out-button'
|
58
|
-
onClick={zoomOutClick}
|
59
|
-
>
|
60
|
-
<Icon icon="minus"/>
|
61
|
-
</Button>
|
62
|
-
</div>
|
63
|
-
{
|
64
|
-
flyTo ? (
|
65
|
-
<Button className='map-flyto-button'
|
66
|
-
onClick={flyToClick}
|
67
|
-
>
|
68
|
-
<Icon icon="eye"/>
|
69
|
-
</Button>
|
70
|
-
) : null
|
71
|
-
}
|
72
|
-
</Flex>
|
48
|
+
<Map.Controls
|
49
|
+
flyTo={flyTo}
|
50
|
+
flyToClick={flyToClick}
|
51
|
+
zoomBtns={zoomBtns}
|
52
|
+
zoomInClick={zoomInClick}
|
53
|
+
zoomOutClick={zoomOutClick}
|
54
|
+
/>
|
73
55
|
) : null
|
74
56
|
}
|
75
57
|
{children}
|
@@ -77,4 +59,5 @@ const Map = (props: MapProps) => {
|
|
77
59
|
)
|
78
60
|
}
|
79
61
|
|
62
|
+
Map.Controls = MapControls
|
80
63
|
export default Map
|
@@ -0,0 +1,47 @@
|
|
1
|
+
import React from "react";
|
2
|
+
import Button from "../pb_button/_button";
|
3
|
+
import Icon from "../pb_icon/_icon";
|
4
|
+
import Flex from "../pb_flex/_flex";
|
5
|
+
|
6
|
+
type MapControlTypes = {
|
7
|
+
zoomBtns?: boolean,
|
8
|
+
flyTo?: boolean,
|
9
|
+
zoomInClick?: () => {},
|
10
|
+
zoomOutClick?: () => {},
|
11
|
+
flyToClick?: () => {},
|
12
|
+
children?: React.ReactNode | React.ReactNode[]
|
13
|
+
}
|
14
|
+
|
15
|
+
const MapControls = ({
|
16
|
+
zoomBtns,
|
17
|
+
zoomInClick,
|
18
|
+
zoomOutClick,
|
19
|
+
flyTo,
|
20
|
+
flyToClick,
|
21
|
+
children,
|
22
|
+
}: MapControlTypes) => {
|
23
|
+
return (
|
24
|
+
<Flex className="custom-nav-control" orientation="column">
|
25
|
+
{zoomBtns ? (
|
26
|
+
<>
|
27
|
+
<div className="custom-nav-control-zoom">
|
28
|
+
<Button className="map-zoom-in-button" onClick={zoomInClick}>
|
29
|
+
<Icon icon="plus" />
|
30
|
+
</Button>
|
31
|
+
<Button className="map-zoom-out-button" onClick={zoomOutClick}>
|
32
|
+
<Icon icon="minus" />
|
33
|
+
</Button>
|
34
|
+
</div>
|
35
|
+
{flyTo ? (
|
36
|
+
<Button className="map-flyto-button" onClick={flyToClick}>
|
37
|
+
<Icon icon="eye" />
|
38
|
+
</Button>
|
39
|
+
) : null}
|
40
|
+
</>
|
41
|
+
) : null}
|
42
|
+
{children}
|
43
|
+
</Flex>
|
44
|
+
);
|
45
|
+
};
|
46
|
+
|
47
|
+
export default MapControls;
|
@@ -0,0 +1,18 @@
|
|
1
|
+
import React from "react";
|
2
|
+
import Button from "../pb_button/_button";
|
3
|
+
import Icon from "../pb_icon/_icon";
|
4
|
+
|
5
|
+
type MapCustomButtonTypes = {
|
6
|
+
onClick?: () => {};
|
7
|
+
icon?: string;
|
8
|
+
};
|
9
|
+
|
10
|
+
const MapCustomButton = ({ onClick, icon }: MapCustomButtonTypes) => {
|
11
|
+
return (
|
12
|
+
<Button className="pb_map-custom-button" onClick={onClick}>
|
13
|
+
<Icon icon={icon} />
|
14
|
+
</Button>
|
15
|
+
);
|
16
|
+
};
|
17
|
+
|
18
|
+
export default MapCustomButton;
|
@@ -0,0 +1,83 @@
|
|
1
|
+
import React, { useRef, useEffect, useState } from 'react'
|
2
|
+
import { Map, mapTheme, MapCustomButton } from '../..'
|
3
|
+
import maplibregl from 'maplibre-gl'
|
4
|
+
|
5
|
+
const MapWithCustomButton = (props) => {
|
6
|
+
|
7
|
+
//set Map instance to access from outside useEffect
|
8
|
+
const [mapInstance, setMapInstance] = useState(null)
|
9
|
+
const mapContainerRef = useRef(null)
|
10
|
+
|
11
|
+
//Set default position
|
12
|
+
const defaultPosition = [-75.379143, 39.831200]
|
13
|
+
|
14
|
+
// linking Maplibre methods to PB custom zoom in, zoom out, and fly to buttons
|
15
|
+
const handleZoomIn = (map) => {map.zoomIn({...mapTheme.zoomConfig})}
|
16
|
+
const handleZoomOut = (map) => {map.zoomOut({...mapTheme.zoomConfig})}
|
17
|
+
const handleFlyTo = (map) => {map.flyTo({
|
18
|
+
center: defaultPosition,
|
19
|
+
... mapTheme.flyToConfig
|
20
|
+
});}
|
21
|
+
|
22
|
+
//This function is called by the useEffect when map instance first loads
|
23
|
+
const loadMap = ( { target: map }) => {
|
24
|
+
//set marker/pin
|
25
|
+
new maplibregl.Marker({
|
26
|
+
color: mapTheme.marker,
|
27
|
+
}).setLngLat(defaultPosition)
|
28
|
+
.setPopup(new maplibregl.Popup({closeButton: false}).setHTML(`<h4 class="pb_title_kit_size_4">Hello World!</h4>`)) // add popup
|
29
|
+
.addTo(map);
|
30
|
+
|
31
|
+
// disable map zoom when using scroll
|
32
|
+
map.scrollZoom.disable();
|
33
|
+
|
34
|
+
//add attributioncontrols
|
35
|
+
map.addControl(new maplibregl.AttributionControl({
|
36
|
+
compact: true
|
37
|
+
}));
|
38
|
+
|
39
|
+
//set map instance
|
40
|
+
setMapInstance(map)
|
41
|
+
}
|
42
|
+
|
43
|
+
useEffect(() => {
|
44
|
+
new maplibregl.Map({
|
45
|
+
container: mapContainerRef.current,
|
46
|
+
center: defaultPosition,
|
47
|
+
...mapTheme.mapConfig
|
48
|
+
}).on('load', loadMap)
|
49
|
+
|
50
|
+
}, [])
|
51
|
+
|
52
|
+
return (
|
53
|
+
<Map
|
54
|
+
{...props}
|
55
|
+
>
|
56
|
+
<Map.Controls flyTo
|
57
|
+
flyToClick={()=> {handleFlyTo(mapInstance)}}
|
58
|
+
zoomBtns
|
59
|
+
zoomInClick={() => {handleZoomIn(mapInstance)}}
|
60
|
+
zoomOutClick={()=> {handleZoomOut(mapInstance)}}
|
61
|
+
>
|
62
|
+
<MapCustomButton icon="home"
|
63
|
+
onClick={() => alert("button clicked!")}
|
64
|
+
/>
|
65
|
+
<MapCustomButton icon="search"
|
66
|
+
onClick={() => alert("button clicked!")}
|
67
|
+
/>
|
68
|
+
</Map.Controls>
|
69
|
+
<div
|
70
|
+
ref={mapContainerRef}
|
71
|
+
style={{
|
72
|
+
position: 'absolute',
|
73
|
+
left: 0,
|
74
|
+
right: 0,
|
75
|
+
top: 0,
|
76
|
+
bottom: 0,
|
77
|
+
}}
|
78
|
+
/>
|
79
|
+
</Map>
|
80
|
+
)
|
81
|
+
}
|
82
|
+
|
83
|
+
export default MapWithCustomButton
|
@@ -0,0 +1 @@
|
|
1
|
+
If you want to add custom buttons to the Map, you can use the `MapCustomButton` component nested inside Map.Controls as shown in the code snippet below. Note that when Map.Controls is used in this way, the props for the rest of the buttons must also be passed to Map.Controls instead of the Map itself.
|
@@ -23,8 +23,8 @@ type MessageProps = {
|
|
23
23
|
id?: string,
|
24
24
|
label?: string,
|
25
25
|
message: string,
|
26
|
-
timestamp?:
|
27
|
-
timestampObject?:
|
26
|
+
timestamp?: string,
|
27
|
+
timestampObject?: string,
|
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
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
64
|
+
{...ariaProps}
|
65
|
+
{...dataProps}
|
66
|
+
className={classes}
|
67
|
+
id={id}
|
68
68
|
>
|
69
69
|
{shouldDisplayAvatar &&
|
70
70
|
<Avatar
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
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
|
-
|
80
|
-
|
79
|
+
justify={alignTimestamp === 'left' ? 'none' : 'between'}
|
80
|
+
orientation="row"
|
81
81
|
>
|
82
82
|
{label &&
|
83
83
|
<Title
|
84
|
-
|
85
|
-
|
86
|
-
|
84
|
+
className="message_title"
|
85
|
+
size={4}
|
86
|
+
text={label}
|
87
87
|
/>
|
88
88
|
}
|
89
89
|
<Timestamp
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
90
|
+
className={`pull-${alignTimestamp} ${timestampObject ? 'message_humanized_time' : null}`}
|
91
|
+
text={timestamp}
|
92
|
+
timestamp={''}
|
93
|
+
timezone={timezone}
|
94
94
|
/>
|
95
95
|
{timestampObject &&
|
96
96
|
<Timestamp
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
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
|
-
|
107
|
-
|
106
|
+
className="pb_message_body"
|
107
|
+
text={message}
|
108
108
|
/>
|
109
109
|
}
|
110
110
|
{children}
|
@@ -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 } from "../utilities/props";
|
5
6
|
import { globalProps, GlobalProps } from "../utilities/globalProps";
|
6
|
-
import DateTime from '../pb_kit/dateTime';
|
7
7
|
|
8
8
|
import Body from "../pb_body/_body";
|
9
9
|
import Caption from "../pb_caption/_caption";
|
@@ -13,7 +13,7 @@ type TimeProps = {
|
|
13
13
|
align?: "left" | "center" | "right";
|
14
14
|
className?: string | string[];
|
15
15
|
data?: string;
|
16
|
-
date:
|
16
|
+
date: string;
|
17
17
|
dark?: boolean;
|
18
18
|
id?: string;
|
19
19
|
showIcon?: boolean;
|
@@ -41,6 +41,8 @@ const Time = (props: TimeProps) => {
|
|
41
41
|
className
|
42
42
|
);
|
43
43
|
|
44
|
+
const dateTimestamp = new DateTime({ value: date, zone: timeZone });
|
45
|
+
|
44
46
|
return (
|
45
47
|
<div className={classes}>
|
46
48
|
{showIcon && (
|
@@ -68,18 +70,18 @@ const Time = (props: TimeProps) => {
|
|
68
70
|
)
|
69
71
|
)}
|
70
72
|
|
71
|
-
<time dateTime={date
|
73
|
+
<time dateTime={date}>
|
72
74
|
<span>
|
73
75
|
{unstyled
|
74
76
|
? (
|
75
77
|
<>
|
76
78
|
<span>
|
77
|
-
{
|
79
|
+
{dateTimestamp.toTimeWithMeridian()}
|
78
80
|
</span>
|
79
81
|
{" "}
|
80
82
|
{showTimezone && (
|
81
83
|
<span>
|
82
|
-
{
|
84
|
+
{dateTimestamp.toTimezone()}
|
83
85
|
</span>
|
84
86
|
)}
|
85
87
|
</>
|
@@ -90,13 +92,13 @@ const Time = (props: TimeProps) => {
|
|
90
92
|
<Body
|
91
93
|
className="pb_time"
|
92
94
|
tag="span"
|
93
|
-
text={
|
95
|
+
text={dateTimestamp.toTimeWithMeridian()}
|
94
96
|
/>{" "}
|
95
97
|
{showTimezone && (
|
96
98
|
<Body
|
97
99
|
color="light"
|
98
100
|
tag="span"
|
99
|
-
text={
|
101
|
+
text={dateTimestamp.toTimezone()}
|
100
102
|
/>
|
101
103
|
)}
|
102
104
|
</>
|
@@ -106,13 +108,13 @@ const Time = (props: TimeProps) => {
|
|
106
108
|
<Caption
|
107
109
|
color="light"
|
108
110
|
tag="span"
|
109
|
-
text={
|
111
|
+
text={dateTimestamp.toTimeWithMeridian()}
|
110
112
|
/>{" "}
|
111
113
|
{showTimezone && (
|
112
114
|
<Caption
|
113
115
|
color="light"
|
114
116
|
tag="span"
|
115
|
-
text={
|
117
|
+
text={dateTimestamp.toTimezone()}
|
116
118
|
/>
|
117
119
|
)}
|
118
120
|
</>
|