playbook_ui 11.6.1.pre.alpha.rubocop.pre.performance1 → 11.7.0.pre.alpha.table1
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/data/menu.yml +0 -13
- data/app/pb_kits/playbook/index.js +1 -1
- data/app/pb_kits/playbook/pb_badge/badge.test.js +80 -0
- data/app/pb_kits/playbook/pb_button/_button.tsx +7 -2
- data/app/pb_kits/playbook/pb_button/_button_mixins.scss +7 -0
- data/app/pb_kits/playbook/pb_button/button.html.erb +11 -0
- data/app/pb_kits/playbook/pb_button/button.rb +3 -0
- data/app/pb_kits/playbook/pb_button/docs/_button_block_content.html.erb +1 -1
- data/app/pb_kits/playbook/pb_button/docs/_button_block_content.jsx +12 -9
- data/app/pb_kits/playbook/pb_button/docs/_button_block_content.md +1 -0
- data/app/pb_kits/playbook/pb_button/docs/_button_icon_options.html.erb +2 -0
- data/app/pb_kits/playbook/pb_button/docs/_button_icon_options.jsx +23 -0
- data/app/pb_kits/playbook/pb_button/docs/_button_icon_options.md +1 -0
- data/app/pb_kits/playbook/pb_button/docs/example.yml +2 -0
- data/app/pb_kits/playbook/pb_button/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_date_picker/{_date_picker.jsx → _date_picker.tsx} +58 -66
- data/app/pb_kits/playbook/pb_date_picker/date_picker.rb +2 -1
- data/app/pb_kits/playbook/pb_date_picker/{date_picker_helper.js → date_picker_helper.ts} +37 -16
- data/app/pb_kits/playbook/pb_date_picker/plugins/timeSelect.ts +171 -0
- data/app/pb_kits/playbook/pb_date_picker/sass_partials/_flatpickr_styles.scss +0 -3
- data/app/pb_kits/playbook/pb_date_range_stacked/{_date_range_stacked.jsx → _date_range_stacked.tsx} +5 -6
- data/app/pb_kits/playbook/pb_date_range_stacked/date_range_stacked.test.js +127 -0
- data/app/pb_kits/playbook/pb_date_stacked/_date_stacked.tsx +90 -0
- data/app/pb_kits/playbook/pb_date_stacked/date_stacked.test.js +151 -0
- data/app/pb_kits/playbook/pb_date_stacked/docs/_date_stacked_align.jsx +1 -1
- data/app/pb_kits/playbook/pb_date_stacked/docs/_date_stacked_bold.jsx +1 -1
- data/app/pb_kits/playbook/pb_date_stacked/docs/_date_stacked_default.jsx +1 -1
- data/app/pb_kits/playbook/pb_date_stacked/docs/_date_stacked_not_current_year.jsx +1 -1
- data/app/pb_kits/playbook/pb_date_stacked/docs/_date_stacked_reverse.jsx +1 -1
- data/app/pb_kits/playbook/pb_date_stacked/docs/_date_stacked_sizes.jsx +1 -1
- data/app/pb_kits/playbook/pb_dialog/{_close_icon.jsx → _close_icon.tsx} +1 -3
- data/app/pb_kits/playbook/pb_dialog/_dialog.tsx +217 -0
- data/app/pb_kits/playbook/pb_dialog/_dialog_context.tsx +3 -0
- data/app/pb_kits/playbook/pb_dialog/child_kits/{_dialog_body.jsx → _dialog_body.tsx} +6 -2
- data/app/pb_kits/playbook/pb_dialog/child_kits/{_dialog_footer.jsx → _dialog_footer.tsx} +8 -11
- data/app/pb_kits/playbook/pb_dialog/child_kits/{_dialog_header.jsx → _dialog_header.tsx} +12 -15
- data/app/pb_kits/playbook/pb_filter/Filter/FilterDouble.jsx +2 -0
- data/app/pb_kits/playbook/pb_filter/Filter/FilterSingle.jsx +2 -0
- data/app/pb_kits/playbook/pb_filter/Filter/FiltersPopover.jsx +2 -2
- data/app/pb_kits/playbook/pb_filter/docs/_filter_min_width.html.erb +1 -0
- data/app/pb_kits/playbook/pb_filter/docs/_filter_placement.html.erb +34 -0
- data/app/pb_kits/playbook/pb_filter/docs/_filter_placement.jsx +66 -0
- data/app/pb_kits/playbook/pb_filter/docs/_filter_placement.md +4 -0
- data/app/pb_kits/playbook/pb_filter/docs/example.yml +2 -0
- data/app/pb_kits/playbook/pb_filter/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_filter/filter.html.erb +2 -2
- data/app/pb_kits/playbook/pb_filter/filter.rb +3 -0
- data/app/pb_kits/playbook/pb_filter/filter.test.js +76 -0
- data/app/pb_kits/playbook/pb_gauge/docs/_gauge_complex.html.erb +32 -0
- data/app/pb_kits/playbook/pb_gauge/docs/_gauge_complex.jsx +101 -0
- data/app/pb_kits/playbook/pb_gauge/docs/_gauge_complex.md +1 -0
- data/app/pb_kits/playbook/pb_gauge/docs/_gauge_sizing.html.erb +2 -1
- data/app/pb_kits/playbook/pb_gauge/docs/_gauge_sizing.jsx +2 -0
- data/app/pb_kits/playbook/pb_gauge/docs/example.yml +2 -0
- data/app/pb_kits/playbook/pb_gauge/docs/index.js +1 -0
- data/app/pb_kits/playbook/pb_home_address_street/_home_address_street.tsx +129 -0
- data/app/pb_kits/playbook/pb_home_address_street/docs/_home_address_street_default.jsx +1 -1
- data/app/pb_kits/playbook/pb_home_address_street/docs/_home_address_street_emphasis.jsx +2 -2
- data/app/pb_kits/playbook/pb_home_address_street/home_adress_street.test.js +60 -0
- data/app/pb_kits/playbook/pb_icon_stat_value/{_icon_stat_value.jsx → _icon_stat_value.tsx} +2 -4
- data/app/pb_kits/playbook/pb_icon_stat_value/icon_stat_value.test.js +154 -0
- data/app/pb_kits/playbook/pb_icon_value/{_icon_value.jsx → _icon_value.tsx} +2 -4
- data/app/pb_kits/playbook/pb_icon_value/icon_value.test.js +77 -0
- data/app/pb_kits/playbook/pb_label_value/_label_value.tsx +123 -0
- data/app/pb_kits/playbook/pb_label_value/label_value.test.js +109 -0
- data/app/pb_kits/playbook/pb_layout/layout.test.js +1 -2
- data/app/pb_kits/playbook/pb_lightbox/Carousel/Slides.tsx +33 -0
- data/app/pb_kits/playbook/pb_lightbox/Carousel/Thumbnails.tsx +1 -3
- data/app/pb_kits/playbook/pb_lightbox/Carousel/index.tsx +3 -1
- data/app/pb_kits/playbook/pb_lightbox/{_lightbox_header.tsx → Header/_lightbox_header.tsx} +8 -8
- data/app/pb_kits/playbook/pb_lightbox/{_lightbox_header_icon.tsx → Header/_lightbox_header_icon.tsx} +2 -2
- data/app/pb_kits/playbook/pb_lightbox/_lightbox.tsx +2 -1
- data/app/pb_kits/playbook/pb_lightbox/lightbox.scss +8 -60
- data/app/pb_kits/playbook/pb_popover/popover.rb +1 -1
- data/app/pb_kits/playbook/pb_section_separator/_section_separator.tsx +5 -5
- data/app/pb_kits/playbook/pb_table/_table.jsx +5 -3
- data/app/pb_kits/playbook/pb_text_input/_text_input.tsx +0 -1
- data/app/pb_kits/playbook/pb_title/_title.tsx +1 -1
- data/app/pb_kits/playbook/playbook-rails.js +1 -1
- data/app/pb_kits/playbook/plugins/pb_chart.js +5 -0
- data/app/pb_kits/playbook/tokens/_spacing.scss +2 -0
- data/app/pb_kits/playbook/utilities/_spacing.scss +1 -0
- data/app/pb_kits/playbook/utilities/text.ts +1 -1
- data/lib/playbook/spacing.rb +1 -1
- data/lib/playbook/version.rb +2 -2
- metadata +37 -19
- data/app/pb_kits/playbook/pb_date_picker/plugins/timeSelect.js +0 -137
- data/app/pb_kits/playbook/pb_date_stacked/_date_stacked.jsx +0 -103
- data/app/pb_kits/playbook/pb_dialog/_dialog.jsx +0 -223
- data/app/pb_kits/playbook/pb_dialog/_dialog_context.jsx +0 -3
- data/app/pb_kits/playbook/pb_home_address_street/_home_address_street.jsx +0 -127
- data/app/pb_kits/playbook/pb_label_value/_label_value.jsx +0 -155
@@ -0,0 +1,171 @@
|
|
1
|
+
type FpTypes = {
|
2
|
+
amPM?: { style: { display: string } };
|
3
|
+
selectedDates: string | any[];
|
4
|
+
setDate: (arg0: any, arg1: boolean) => void;
|
5
|
+
input: { id: any };
|
6
|
+
timeContainer?: {
|
7
|
+
classList: { add: (arg0: string) => void };
|
8
|
+
prepend: (arg0: HTMLDivElement) => void;
|
9
|
+
append: (arg0: HTMLDivElement) => void;
|
10
|
+
};
|
11
|
+
minuteElement?: { step: string };
|
12
|
+
_initialDate: {
|
13
|
+
toLocaleDateString: (
|
14
|
+
arg0: string,
|
15
|
+
arg1: { day: string; timeZoneName: string }
|
16
|
+
) => string | any[];
|
17
|
+
};
|
18
|
+
loadedPlugins: string[];
|
19
|
+
};
|
20
|
+
|
21
|
+
export const getTimezoneText = (inputDate: {
|
22
|
+
toLocaleDateString: (
|
23
|
+
arg0: string,
|
24
|
+
arg1: { day: string; timeZoneName: string }
|
25
|
+
) => string | any[];
|
26
|
+
}) => {
|
27
|
+
const tzAbbr = inputDate
|
28
|
+
.toLocaleDateString("en-US", {
|
29
|
+
day: "2-digit",
|
30
|
+
timeZoneName: "short",
|
31
|
+
})
|
32
|
+
.slice(4);
|
33
|
+
const tzText = inputDate
|
34
|
+
.toLocaleDateString("en-US", {
|
35
|
+
day: "2-digit",
|
36
|
+
timeZoneName: "long",
|
37
|
+
})
|
38
|
+
.slice(4);
|
39
|
+
return `${tzAbbr} (${tzText})`;
|
40
|
+
};
|
41
|
+
|
42
|
+
function timeSelectPlugin(props: { caption: string; showTimezone: boolean }) {
|
43
|
+
return function (fp: FpTypes) {
|
44
|
+
const generateMeridiemCard = (text: string) => {
|
45
|
+
const selectableCard = document.createElement("div");
|
46
|
+
selectableCard.className = "pb_selectable_card_kit_enabled";
|
47
|
+
|
48
|
+
const cardInput = document.createElement("input"),
|
49
|
+
cardInputId = `datePicker${text}`;
|
50
|
+
|
51
|
+
cardInput.id = cardInputId;
|
52
|
+
cardInput.name = "datepicker-ampm";
|
53
|
+
cardInput.type = "radio";
|
54
|
+
cardInput.value = text;
|
55
|
+
|
56
|
+
const cardLabel = document.createElement("label"),
|
57
|
+
cardLabelBuffer = document.createElement("div");
|
58
|
+
cardLabel.className = `label-${text.toLowerCase()}`;
|
59
|
+
cardLabel.setAttribute("for", cardInputId);
|
60
|
+
cardLabelBuffer.className = "buffer";
|
61
|
+
cardLabelBuffer.innerHTML = text;
|
62
|
+
|
63
|
+
cardLabel.append(cardLabelBuffer);
|
64
|
+
selectableCard.prepend(cardInput);
|
65
|
+
selectableCard.append(cardLabel);
|
66
|
+
|
67
|
+
return selectableCard;
|
68
|
+
};
|
69
|
+
|
70
|
+
const generateMeridiemToggle = () => {
|
71
|
+
fp.amPM.style.display = "none";
|
72
|
+
const formGroupKit = document.createElement("div");
|
73
|
+
formGroupKit.className = "pb_form_group_kit";
|
74
|
+
|
75
|
+
const amCard = generateMeridiemCard("AM");
|
76
|
+
amCard.addEventListener("click", () => {
|
77
|
+
fp.selectedDates[0].setHours(
|
78
|
+
(fp.selectedDates[0].getHours() % 12) + 12 * 0
|
79
|
+
);
|
80
|
+
fp.setDate(fp.selectedDates[0], true);
|
81
|
+
});
|
82
|
+
|
83
|
+
const pmCard = generateMeridiemCard("PM");
|
84
|
+
pmCard.addEventListener("click", () => {
|
85
|
+
fp.selectedDates[0].setHours(
|
86
|
+
(fp.selectedDates[0].getHours() % 12) + 12 * 1
|
87
|
+
);
|
88
|
+
fp.setDate(fp.selectedDates[0], true);
|
89
|
+
});
|
90
|
+
|
91
|
+
formGroupKit.prepend(amCard);
|
92
|
+
formGroupKit.append(pmCard);
|
93
|
+
|
94
|
+
const meridiemContainer = document.createElement("div");
|
95
|
+
meridiemContainer.className = "meridiem";
|
96
|
+
meridiemContainer.append(formGroupKit);
|
97
|
+
document.querySelector(".pb_time_selection").append(meridiemContainer);
|
98
|
+
};
|
99
|
+
|
100
|
+
const getMeridiem = (dateObj: string | any[]) => {
|
101
|
+
return dateObj[0].getHours() < 12 ? "AM" : "PM";
|
102
|
+
};
|
103
|
+
|
104
|
+
const updateMeridiemToggle = (forceClick: boolean) => {
|
105
|
+
if (!fp.selectedDates.length) return;
|
106
|
+
|
107
|
+
const uncheckedClass = "pb_selectable_card_kit_enabled",
|
108
|
+
checkedClass = "pb_selectable_card_kit_checked_enabled",
|
109
|
+
pickerAM: HTMLElement & { [x: string]: any } =
|
110
|
+
document.getElementById("datePickerAM"),
|
111
|
+
pickerPM: HTMLElement & { [x: string]: any } =
|
112
|
+
document.getElementById("datePickerPM"),
|
113
|
+
meridiem = getMeridiem(fp.selectedDates);
|
114
|
+
|
115
|
+
if (forceClick) {
|
116
|
+
pickerAM.checked = false;
|
117
|
+
pickerPM.checked = false;
|
118
|
+
pickerPM.checked = meridiem === "PM";
|
119
|
+
pickerAM.checked = meridiem === "AM";
|
120
|
+
}
|
121
|
+
|
122
|
+
if (meridiem === "PM") {
|
123
|
+
pickerPM.parentElement.className = checkedClass;
|
124
|
+
pickerAM.parentElement.className = uncheckedClass;
|
125
|
+
} else if (meridiem === "AM") {
|
126
|
+
pickerAM.parentElement.className = checkedClass;
|
127
|
+
pickerPM.parentElement.className = uncheckedClass;
|
128
|
+
}
|
129
|
+
};
|
130
|
+
|
131
|
+
return {
|
132
|
+
onValueUpdate() {
|
133
|
+
updateMeridiemToggle(true);
|
134
|
+
},
|
135
|
+
onReady() {
|
136
|
+
const id = fp.input.id;
|
137
|
+
|
138
|
+
if (!id || !fp?.timeContainer) return;
|
139
|
+
|
140
|
+
fp.timeContainer.classList.add("pb_time_selection");
|
141
|
+
|
142
|
+
// allow single minutes
|
143
|
+
fp.minuteElement.step = "1";
|
144
|
+
|
145
|
+
// add caption text
|
146
|
+
if (props.caption) {
|
147
|
+
const captionContainer = document.createElement("div");
|
148
|
+
captionContainer.className = "pb_caption_kit_md";
|
149
|
+
captionContainer.innerHTML = props?.caption;
|
150
|
+
fp.timeContainer.prepend(captionContainer);
|
151
|
+
}
|
152
|
+
|
153
|
+
// add meridiem toggle
|
154
|
+
generateMeridiemToggle();
|
155
|
+
updateMeridiemToggle(true);
|
156
|
+
|
157
|
+
// add timezone text
|
158
|
+
if (props.showTimezone) {
|
159
|
+
const subcaptionContainer = document.createElement("div");
|
160
|
+
subcaptionContainer.className = "pb_caption_kit_xs";
|
161
|
+
subcaptionContainer.innerHTML = getTimezoneText(fp._initialDate);
|
162
|
+
fp.timeContainer.append(subcaptionContainer);
|
163
|
+
}
|
164
|
+
|
165
|
+
fp.loadedPlugins.push("timeSelectPlugin");
|
166
|
+
},
|
167
|
+
};
|
168
|
+
};
|
169
|
+
}
|
170
|
+
|
171
|
+
export default timeSelectPlugin;
|
data/app/pb_kits/playbook/pb_date_range_stacked/{_date_range_stacked.jsx → _date_range_stacked.tsx}
RENAMED
@@ -1,9 +1,7 @@
|
|
1
|
-
/* @flow */
|
2
|
-
|
3
1
|
import React from 'react'
|
4
2
|
import classnames from 'classnames'
|
5
3
|
|
6
|
-
import { buildCss } from '../utilities/props'
|
4
|
+
import { buildCss, buildDataProps } from '../utilities/props'
|
7
5
|
import { globalProps } from '../utilities/globalProps'
|
8
6
|
|
9
7
|
import Body from '../pb_body/_body'
|
@@ -13,7 +11,7 @@ import DateYearStacked from '../pb_date_year_stacked/_date_year_stacked'
|
|
13
11
|
import Icon from '../pb_icon/_icon'
|
14
12
|
|
15
13
|
type DateRangeStackedProps = {
|
16
|
-
className?: string |
|
14
|
+
className?: string | string[],
|
17
15
|
data?: string,
|
18
16
|
dark?: boolean,
|
19
17
|
endDate: string,
|
@@ -22,15 +20,16 @@ type DateRangeStackedProps = {
|
|
22
20
|
}
|
23
21
|
|
24
22
|
const DateRangeStacked = (props: DateRangeStackedProps) => {
|
25
|
-
const { className, dark = false, endDate, startDate } = props
|
23
|
+
const { className, dark = false, endDate, startDate, data={} } = props
|
26
24
|
const css = classnames(
|
27
25
|
buildCss('pb_date_range_stacked'),
|
28
26
|
globalProps(props),
|
29
27
|
className
|
30
28
|
)
|
29
|
+
const dataProps = buildDataProps(data)
|
31
30
|
|
32
31
|
return (
|
33
|
-
<div className={css}>
|
32
|
+
<div {...dataProps} className={css}>
|
34
33
|
<Flex vertical="center">
|
35
34
|
<FlexItem>
|
36
35
|
<DateYearStacked
|
@@ -0,0 +1,127 @@
|
|
1
|
+
import React from 'react'
|
2
|
+
import { render, screen } from '../utilities/test-utils'
|
3
|
+
|
4
|
+
import DateRangeStacked from './_date_range_stacked'
|
5
|
+
|
6
|
+
jest.useFakeTimers()
|
7
|
+
const testId = "daterangestacked-kit";
|
8
|
+
|
9
|
+
describe("DateRangeStacked Kit", () => {
|
10
|
+
test("renders DateRangeStacked className", () => {
|
11
|
+
render(
|
12
|
+
<DateRangeStacked
|
13
|
+
data={{ testid: testId }}
|
14
|
+
endDate={new Date('20 Mar 2020')}
|
15
|
+
startDate={new Date('18 Jun 2019')}
|
16
|
+
/>
|
17
|
+
)
|
18
|
+
|
19
|
+
const kit = screen.getByTestId(testId)
|
20
|
+
expect(kit).toHaveClass("pb_date_range_stacked")
|
21
|
+
})
|
22
|
+
|
23
|
+
test("renders DateRangeStacked start date container", () => {
|
24
|
+
render(
|
25
|
+
<DateRangeStacked
|
26
|
+
data={{ testid: testId }}
|
27
|
+
endDate={new Date('20 Mar 2020')}
|
28
|
+
startDate={new Date('18 Jun 2019')}
|
29
|
+
/>
|
30
|
+
)
|
31
|
+
|
32
|
+
const kit = screen.getByTestId(testId)
|
33
|
+
const text = kit.querySelector('.pb_date_year_stacked_right')
|
34
|
+
expect(text).toBeInTheDocument()
|
35
|
+
})
|
36
|
+
|
37
|
+
test("renders DateRangeStacked end date container", () => {
|
38
|
+
render(
|
39
|
+
<DateRangeStacked
|
40
|
+
data={{ testid: testId }}
|
41
|
+
endDate={new Date('20 Mar 2020')}
|
42
|
+
startDate={new Date('18 Jun 2019')}
|
43
|
+
/>
|
44
|
+
)
|
45
|
+
|
46
|
+
const kit = screen.getByTestId(testId)
|
47
|
+
const text = kit.querySelector('.pb_date_year_stacked_left')
|
48
|
+
expect(text).toBeInTheDocument()
|
49
|
+
})
|
50
|
+
|
51
|
+
test("renders arrow icon", () => {
|
52
|
+
render(
|
53
|
+
<DateRangeStacked
|
54
|
+
data={{ testid: testId }}
|
55
|
+
endDate={new Date('20 Mar 2020')}
|
56
|
+
startDate={new Date('18 Jun 2019')}
|
57
|
+
/>
|
58
|
+
)
|
59
|
+
|
60
|
+
const kit = screen.getByTestId(testId)
|
61
|
+
const arrowicon = kit.querySelector('.pb_icon_kit.fa-fw.pb_date_range_stacked_arrow')
|
62
|
+
expect(arrowicon).toBeInTheDocument()
|
63
|
+
})
|
64
|
+
|
65
|
+
|
66
|
+
test("renders DateRangeInline start date", () => {
|
67
|
+
render(
|
68
|
+
<DateRangeStacked
|
69
|
+
data={{ testid: testId }}
|
70
|
+
endDate={new Date('20 Mar 2020')}
|
71
|
+
startDate={new Date('18 Jun 2019')}
|
72
|
+
/>
|
73
|
+
|
74
|
+
)
|
75
|
+
|
76
|
+
const kit = screen.getByTestId(testId)
|
77
|
+
const text = kit.querySelector('.pb_date_year_stacked_right>.pb_title_kit_size_4')
|
78
|
+
expect(text.textContent).toEqual("18 JUN")
|
79
|
+
})
|
80
|
+
|
81
|
+
test("renders DateRangeInline start date year", () => {
|
82
|
+
render(
|
83
|
+
<DateRangeStacked
|
84
|
+
data={{ testid: testId }}
|
85
|
+
endDate={new Date('20 Mar 2020')}
|
86
|
+
startDate={new Date('18 Jun 2019')}
|
87
|
+
/>
|
88
|
+
|
89
|
+
)
|
90
|
+
|
91
|
+
const kit = screen.getByTestId(testId)
|
92
|
+
const text = kit.querySelector(".pb_date_year_stacked_right>.pb_body_kit_light")
|
93
|
+
expect(text.textContent).toEqual("2019")
|
94
|
+
})
|
95
|
+
|
96
|
+
test("renders DateRangeInline end date", () => {
|
97
|
+
render(
|
98
|
+
<DateRangeStacked
|
99
|
+
data={{ testid: testId }}
|
100
|
+
endDate={new Date('20 Mar 2020')}
|
101
|
+
startDate={new Date('18 Jun 2019')}
|
102
|
+
/>
|
103
|
+
|
104
|
+
)
|
105
|
+
|
106
|
+
const kit = screen.getByTestId(testId)
|
107
|
+
const text = kit.querySelector('.pb_date_year_stacked_left>.pb_title_kit_size_4')
|
108
|
+
expect(text.textContent).toEqual("20 MAR")
|
109
|
+
})
|
110
|
+
|
111
|
+
test("renders DateRangeInline end date year", () => {
|
112
|
+
render(
|
113
|
+
<DateRangeStacked
|
114
|
+
data={{ testid: testId }}
|
115
|
+
endDate={new Date('20 Mar 2020')}
|
116
|
+
startDate={new Date('18 Jun 2019')}
|
117
|
+
/>
|
118
|
+
|
119
|
+
)
|
120
|
+
|
121
|
+
const kit = screen.getByTestId(testId)
|
122
|
+
const text = kit.querySelector(".pb_date_year_stacked_left>.pb_body_kit_light")
|
123
|
+
expect(text.textContent).toEqual("2020")
|
124
|
+
})
|
125
|
+
|
126
|
+
|
127
|
+
})
|
@@ -0,0 +1,90 @@
|
|
1
|
+
import React from "react";
|
2
|
+
|
3
|
+
import classnames from "classnames";
|
4
|
+
import DateTime from "../pb_kit/dateTime";
|
5
|
+
import { buildCss, buildDataProps } from "../utilities/props";
|
6
|
+
import { globalProps } from "../utilities/globalProps";
|
7
|
+
|
8
|
+
import Caption from "../pb_caption/_caption";
|
9
|
+
import Title from "../pb_title/_title";
|
10
|
+
|
11
|
+
type DateStackedProps = {
|
12
|
+
align?: "left" | "center" | "right";
|
13
|
+
bold?: boolean;
|
14
|
+
className?: string | string[];
|
15
|
+
dark?: boolean;
|
16
|
+
data?: string;
|
17
|
+
date: string;
|
18
|
+
size?: "sm" | "md";
|
19
|
+
id?: string;
|
20
|
+
reverse?: boolean;
|
21
|
+
};
|
22
|
+
|
23
|
+
const sizes: {sm: 4, md: 3} = {
|
24
|
+
sm: 4,
|
25
|
+
md: 3,
|
26
|
+
};
|
27
|
+
|
28
|
+
const DateStacked = (props: DateStackedProps) => {
|
29
|
+
const {
|
30
|
+
align = "left",
|
31
|
+
bold = false,
|
32
|
+
reverse = false,
|
33
|
+
className,
|
34
|
+
dark = false,
|
35
|
+
date,
|
36
|
+
data={},
|
37
|
+
size = "sm",
|
38
|
+
} = props;
|
39
|
+
const classes = classnames(
|
40
|
+
buildCss("pb_date_stacked_kit", align, size, {
|
41
|
+
dark: dark,
|
42
|
+
reverse: reverse,
|
43
|
+
}),
|
44
|
+
globalProps(props),
|
45
|
+
className
|
46
|
+
);
|
47
|
+
|
48
|
+
const currentYear = new Date().getFullYear().toString();
|
49
|
+
const dateTimestamp = new DateTime({ value: date });
|
50
|
+
const inputYear = dateTimestamp.toYear().toString();
|
51
|
+
const dataProps = buildDataProps(data)
|
52
|
+
|
53
|
+
return (
|
54
|
+
<>
|
55
|
+
{bold == false ? (
|
56
|
+
<div {...dataProps} className={classes}>
|
57
|
+
<div className="pb_date_stacked_day_month">
|
58
|
+
<Caption text={dateTimestamp.toMonth().toUpperCase()} />
|
59
|
+
<Title
|
60
|
+
dark={dark}
|
61
|
+
size={sizes[size]}
|
62
|
+
text={dateTimestamp.toDay()}
|
63
|
+
/>
|
64
|
+
</div>
|
65
|
+
{currentYear != inputYear && <Caption size="xs">{inputYear}</Caption>}
|
66
|
+
</div>
|
67
|
+
) : (
|
68
|
+
<div {...dataProps} className={classes}>
|
69
|
+
<div className="pb_date_stacked_day_month">
|
70
|
+
<Title
|
71
|
+
bold
|
72
|
+
dark={dark}
|
73
|
+
size="4"
|
74
|
+
text={dateTimestamp.toMonth()}
|
75
|
+
/>
|
76
|
+
<Title
|
77
|
+
bold
|
78
|
+
dark={dark}
|
79
|
+
size="4"
|
80
|
+
text={dateTimestamp.toDay()}
|
81
|
+
/>
|
82
|
+
{currentYear != inputYear && <Title size="4">{inputYear}</Title>}
|
83
|
+
</div>
|
84
|
+
</div>
|
85
|
+
)}
|
86
|
+
</>
|
87
|
+
);
|
88
|
+
};
|
89
|
+
|
90
|
+
export default DateStacked;
|
@@ -0,0 +1,151 @@
|
|
1
|
+
import React from 'react'
|
2
|
+
import { render, screen } from '../utilities/test-utils'
|
3
|
+
|
4
|
+
import DateStacked from './_date_stacked'
|
5
|
+
|
6
|
+
const TEST_DATE = "01/01/2020 00:00:000 GMT-0500";
|
7
|
+
jest.setSystemTime(new Date(TEST_DATE));
|
8
|
+
const futureDate = new Date(
|
9
|
+
new Date().getFullYear() - 4,
|
10
|
+
new Date().getMonth(),
|
11
|
+
new Date().getDate(),
|
12
|
+
new Date().getHours(),
|
13
|
+
new Date().getMinutes()
|
14
|
+
);
|
15
|
+
|
16
|
+
const testId = "datestacked-kit";
|
17
|
+
|
18
|
+
describe("DateStacked Kit", () => {
|
19
|
+
test("renders DateStacked className", () => {
|
20
|
+
render(
|
21
|
+
<DateStacked
|
22
|
+
align="left"
|
23
|
+
data={{ testid: testId }}
|
24
|
+
date={new Date()}
|
25
|
+
size="sm"
|
26
|
+
/>
|
27
|
+
)
|
28
|
+
|
29
|
+
const kit = screen.getByTestId(testId)
|
30
|
+
expect(kit).toHaveClass("pb_date_stacked_kit_left_sm")
|
31
|
+
})
|
32
|
+
|
33
|
+
test("renders top text", () => {
|
34
|
+
render(
|
35
|
+
<DateStacked
|
36
|
+
align="left"
|
37
|
+
data={{ testid: testId }}
|
38
|
+
date={new Date()}
|
39
|
+
size="sm"
|
40
|
+
/>
|
41
|
+
)
|
42
|
+
|
43
|
+
const kit = screen.getByTestId(testId)
|
44
|
+
const text = kit.querySelector(".pb_caption_kit_md")
|
45
|
+
expect(text.textContent).toEqual("JAN")
|
46
|
+
})
|
47
|
+
|
48
|
+
test("renders bottom text", () => {
|
49
|
+
render(
|
50
|
+
<DateStacked
|
51
|
+
align="left"
|
52
|
+
data={{ testid: testId }}
|
53
|
+
date={new Date()}
|
54
|
+
size="sm"
|
55
|
+
/>
|
56
|
+
)
|
57
|
+
|
58
|
+
const kit = screen.getByTestId(testId)
|
59
|
+
const text = kit.querySelector(".pb_title_kit_size_4")
|
60
|
+
expect(text.textContent).toEqual("1")
|
61
|
+
})
|
62
|
+
|
63
|
+
test("renders correct size", () => {
|
64
|
+
render(
|
65
|
+
<DateStacked
|
66
|
+
align="left"
|
67
|
+
data={{ testid: testId }}
|
68
|
+
date={new Date()}
|
69
|
+
size="md"
|
70
|
+
/>
|
71
|
+
)
|
72
|
+
|
73
|
+
const kit = screen.getByTestId(testId)
|
74
|
+
expect(kit).toHaveClass("pb_date_stacked_kit_left_md")
|
75
|
+
})
|
76
|
+
|
77
|
+
test("renders year when non-current year", () => {
|
78
|
+
render(
|
79
|
+
<DateStacked
|
80
|
+
align="left"
|
81
|
+
data={{ testid: testId }}
|
82
|
+
date={futureDate}
|
83
|
+
size="sm"
|
84
|
+
/>
|
85
|
+
)
|
86
|
+
|
87
|
+
const kit = screen.getByTestId(testId)
|
88
|
+
const text = kit.querySelector(".pb_caption_kit_xs")
|
89
|
+
expect(text.textContent).toEqual("2016")
|
90
|
+
})
|
91
|
+
|
92
|
+
test("renders correct className when order reversed", () => {
|
93
|
+
render(
|
94
|
+
<DateStacked
|
95
|
+
align="left"
|
96
|
+
data={{ testid: testId }}
|
97
|
+
date={futureDate}
|
98
|
+
reverse
|
99
|
+
size="sm"
|
100
|
+
/>
|
101
|
+
)
|
102
|
+
const kit = screen.getByTestId(testId)
|
103
|
+
expect(kit).toHaveClass("pb_date_stacked_kit_left_sm_reverse")
|
104
|
+
})
|
105
|
+
|
106
|
+
test("renders bold prop", () => {
|
107
|
+
render(
|
108
|
+
<DateStacked
|
109
|
+
align="left"
|
110
|
+
bold
|
111
|
+
data={{ testid: testId }}
|
112
|
+
date={futureDate}
|
113
|
+
size="md"
|
114
|
+
/>
|
115
|
+
)
|
116
|
+
|
117
|
+
const kit = screen.getByTestId(testId)
|
118
|
+
const text = kit.querySelector(".pb_title_kit_size_4")
|
119
|
+
expect(text).toBeInTheDocument()
|
120
|
+
})
|
121
|
+
|
122
|
+
test("renders center alignment prop", () => {
|
123
|
+
render(
|
124
|
+
<DateStacked
|
125
|
+
align="center"
|
126
|
+
data={{ testid: testId }}
|
127
|
+
date={futureDate}
|
128
|
+
size="md"
|
129
|
+
/>
|
130
|
+
)
|
131
|
+
|
132
|
+
const kit = screen.getByTestId(testId)
|
133
|
+
expect(kit).toHaveClass("pb_date_stacked_kit_center_md")
|
134
|
+
})
|
135
|
+
|
136
|
+
test("renders right alignment prop", () => {
|
137
|
+
render(
|
138
|
+
<DateStacked
|
139
|
+
align="right"
|
140
|
+
data={{ testid: testId }}
|
141
|
+
date={futureDate}
|
142
|
+
size="md"
|
143
|
+
/>
|
144
|
+
)
|
145
|
+
|
146
|
+
const kit = screen.getByTestId(testId)
|
147
|
+
expect(kit).toHaveClass("pb_date_stacked_kit_right_md")
|
148
|
+
})
|
149
|
+
|
150
|
+
|
151
|
+
})
|