playbook_ui 11.0.0.pre.alpha.2 → 11.0.0
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/pb_background/_background.scss +8 -1
- data/app/pb_kits/playbook/pb_background/_background.tsx +9 -1
- data/app/pb_kits/playbook/pb_background/background.rb +76 -16
- data/app/pb_kits/playbook/pb_background/docs/_background_status.html.erb +14 -2
- data/app/pb_kits/playbook/pb_background/docs/_background_status.jsx +43 -2
- data/app/pb_kits/playbook/pb_background/docs/_background_status.md +1 -1
- data/app/pb_kits/playbook/pb_badge/_badge.tsx +1 -2
- data/app/pb_kits/playbook/pb_body/_body.scss +4 -4
- data/app/pb_kits/playbook/pb_body/_body.tsx +5 -4
- data/app/pb_kits/playbook/pb_body/_body_mixins.scss +7 -3
- data/app/pb_kits/playbook/pb_body/body.rb +4 -3
- data/app/pb_kits/playbook/pb_body/body.test.js +12 -9
- data/app/pb_kits/playbook/pb_body/docs/_body_light.html.erb +4 -4
- data/app/pb_kits/playbook/pb_body/docs/_body_light.jsx +4 -4
- data/app/pb_kits/playbook/pb_body/docs/_description.md +2 -2
- data/app/pb_kits/playbook/pb_body/docs/_footer.md +1 -1
- data/app/pb_kits/playbook/pb_button/button.rb +5 -5
- data/app/pb_kits/playbook/pb_caption/_caption.tsx +1 -1
- data/app/pb_kits/playbook/pb_caption/_caption_mixin.scss +3 -1
- data/app/pb_kits/playbook/pb_caption/docs/_caption_colors.html.erb +2 -1
- data/app/pb_kits/playbook/pb_caption/docs/_caption_colors.jsx +5 -0
- data/app/pb_kits/playbook/pb_card/_card.tsx +5 -5
- data/app/pb_kits/playbook/pb_checkbox/{_checkbox.jsx → _checkbox.tsx} +33 -29
- data/app/pb_kits/playbook/pb_date_picker/_date_picker.jsx +30 -18
- data/app/pb_kits/playbook/pb_date_picker/_date_picker.scss +3 -0
- data/app/pb_kits/playbook/pb_date_picker/date_picker.rb +12 -1
- data/app/pb_kits/playbook/pb_date_picker/date_picker.test.js +160 -0
- data/app/pb_kits/playbook/pb_date_picker/date_picker_helper.js +37 -11
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_default.html.erb +1 -1
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_month_and_year.html.erb +2 -2
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_month_and_year.jsx +1 -1
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_month_and_year.md +1 -1
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_time.html.erb +6 -0
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_time.jsx +21 -0
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_time.md +1 -0
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_week.html.erb +5 -0
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_week.jsx +18 -0
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_week.md +1 -0
- data/app/pb_kits/playbook/pb_date_picker/docs/example.yml +4 -0
- data/app/pb_kits/playbook/pb_date_picker/docs/index.js +2 -0
- data/app/pb_kits/playbook/pb_date_picker/plugins/timeSelect.js +137 -0
- data/app/pb_kits/playbook/pb_date_picker/sass_partials/_day_styles.scss +27 -2
- data/app/pb_kits/playbook/pb_date_picker/sass_partials/_flatpickr_styles.scss +1 -5
- data/app/pb_kits/playbook/pb_date_picker/sass_partials/_time_selection_styles.scss +63 -0
- data/app/pb_kits/playbook/pb_date_picker/sass_partials/_week_styles.scss +127 -0
- data/app/pb_kits/playbook/pb_dialog/_dialog.jsx +60 -14
- data/app/pb_kits/playbook/pb_dialog/docs/_dialog_default.jsx +1 -1
- data/app/pb_kits/playbook/pb_dialog/docs/_dialog_stacked_alert.jsx +153 -0
- data/app/pb_kits/playbook/pb_dialog/docs/_dialog_stacked_alert.md +1 -0
- data/app/pb_kits/playbook/pb_dialog/docs/_dialog_status.jsx +130 -0
- data/app/pb_kits/playbook/pb_dialog/docs/_dialog_status.md +1 -0
- data/app/pb_kits/playbook/pb_dialog/docs/example.yml +2 -0
- data/app/pb_kits/playbook/pb_dialog/docs/index.js +2 -0
- data/app/pb_kits/playbook/pb_form_pill/{_form_pill.jsx → _form_pill.tsx} +16 -12
- data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_example.jsx +1 -1
- data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_size.jsx +1 -1
- data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_tag.jsx +1 -1
- data/app/pb_kits/playbook/pb_form_pill/docs/_form_pill_user.jsx +1 -1
- data/app/pb_kits/playbook/pb_hashtag/{_hashtag.jsx → _hashtag.tsx} +3 -4
- data/app/pb_kits/playbook/pb_radio/_radio.tsx +86 -0
- data/app/pb_kits/playbook/pb_select/{_select.jsx → _select.tsx} +34 -38
- data/app/pb_kits/playbook/pb_text_input/{_text_input.jsx → _text_input.tsx} +42 -43
- data/app/pb_kits/playbook/tokens/_colors.scss +17 -1
- data/app/pb_kits/playbook/utilities/props.ts +2 -2
- data/lib/playbook/version.rb +1 -1
- metadata +24 -10
- data/app/pb_kits/playbook/pb_radio/_radio.jsx +0 -78
@@ -1,34 +1,32 @@
|
|
1
|
-
/* @flow */
|
2
|
-
|
3
1
|
import React, { useEffect, useRef } from 'react'
|
4
2
|
import Body from '../pb_body/_body'
|
5
3
|
import Icon from '../pb_icon/_icon'
|
6
4
|
import { buildAriaProps, buildCss, buildDataProps } from '../utilities/props'
|
7
5
|
import classnames from 'classnames'
|
8
|
-
import { globalProps } from '../utilities/globalProps'
|
6
|
+
import { globalProps, GlobalProps } from '../utilities/globalProps'
|
9
7
|
|
10
8
|
type CheckboxProps = {
|
11
|
-
aria?:
|
9
|
+
aria?: {[key: string]: string},
|
12
10
|
checked?: boolean,
|
13
11
|
children: Node,
|
14
12
|
className?: string,
|
15
13
|
dark?: boolean,
|
16
|
-
data?:
|
14
|
+
data?: {[key: string]: string},
|
17
15
|
error?: boolean,
|
18
16
|
id?: string,
|
19
17
|
indeterminate?: boolean,
|
20
18
|
name: string,
|
21
|
-
onChange: (
|
19
|
+
onChange: (event: React.FormEvent<HTMLInputElement>) => void,
|
22
20
|
tabIndex: number,
|
23
21
|
text: string,
|
24
22
|
value: string,
|
25
|
-
}
|
23
|
+
} & GlobalProps
|
26
24
|
|
27
|
-
const Checkbox = (props: CheckboxProps) => {
|
25
|
+
const Checkbox = (props: CheckboxProps): JSX.Element => {
|
28
26
|
const {
|
29
27
|
aria = {},
|
30
28
|
checked = false,
|
31
|
-
children
|
29
|
+
children,
|
32
30
|
className,
|
33
31
|
dark = false,
|
34
32
|
data = {},
|
@@ -42,12 +40,12 @@ const Checkbox = (props: CheckboxProps) => {
|
|
42
40
|
value = '',
|
43
41
|
} = props
|
44
42
|
|
45
|
-
const checkRef = useRef()
|
43
|
+
const checkRef = useRef(null)
|
46
44
|
const dataProps = buildDataProps(data)
|
47
45
|
const ariaProps = buildAriaProps(aria)
|
48
46
|
const classes = classnames(
|
49
|
-
buildCss('pb_checkbox_kit',
|
50
|
-
globalProps(props),
|
47
|
+
buildCss('pb_checkbox_kit', checked ? 'checked' : null, error ? 'error' : null, indeterminate? 'indeterminate' : null),
|
48
|
+
globalProps(props),
|
51
49
|
className
|
52
50
|
)
|
53
51
|
|
@@ -58,6 +56,22 @@ const Checkbox = (props: CheckboxProps) => {
|
|
58
56
|
}
|
59
57
|
}, [indeterminate, checked])
|
60
58
|
|
59
|
+
const checkboxChildren = () => {
|
60
|
+
if (children)
|
61
|
+
return (children)
|
62
|
+
else
|
63
|
+
return (
|
64
|
+
<input
|
65
|
+
defaultChecked={checked}
|
66
|
+
name={name}
|
67
|
+
onChange={onChange}
|
68
|
+
ref={checkRef}
|
69
|
+
tabIndex={tabIndex}
|
70
|
+
type="checkbox"
|
71
|
+
value={value}
|
72
|
+
/>)
|
73
|
+
}
|
74
|
+
|
61
75
|
return (
|
62
76
|
<label
|
63
77
|
{...ariaProps}
|
@@ -65,20 +79,9 @@ const Checkbox = (props: CheckboxProps) => {
|
|
65
79
|
className={classes}
|
66
80
|
id={id}
|
67
81
|
>
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
<input
|
72
|
-
defaultChecked={checked}
|
73
|
-
name={name}
|
74
|
-
onChange={onChange}
|
75
|
-
ref={checkRef}
|
76
|
-
tabIndex={tabIndex}
|
77
|
-
type="checkbox"
|
78
|
-
value={value}
|
79
|
-
/>
|
80
|
-
</If>
|
81
|
-
<If condition={!indeterminate}>
|
82
|
+
<>{checkboxChildren()}</>
|
83
|
+
|
84
|
+
{!indeterminate &&
|
82
85
|
<span className="pb_checkbox_checkmark">
|
83
86
|
<Icon
|
84
87
|
className="check_icon"
|
@@ -86,9 +89,9 @@ const Checkbox = (props: CheckboxProps) => {
|
|
86
89
|
icon="check"
|
87
90
|
/>
|
88
91
|
</span>
|
89
|
-
|
92
|
+
}
|
90
93
|
|
91
|
-
|
94
|
+
{indeterminate &&
|
92
95
|
<span className="pb_checkbox_indeterminate">
|
93
96
|
<Icon
|
94
97
|
className="indeterminate_icon"
|
@@ -96,12 +99,13 @@ const Checkbox = (props: CheckboxProps) => {
|
|
96
99
|
icon="minus"
|
97
100
|
/>
|
98
101
|
</span>
|
99
|
-
|
102
|
+
}
|
100
103
|
|
101
104
|
<Body
|
102
105
|
className="pb_checkbox_label"
|
103
106
|
dark={dark}
|
104
107
|
status={error ? 'negative' : null}
|
108
|
+
variant={null}
|
105
109
|
>
|
106
110
|
{text}
|
107
111
|
</Body>
|
@@ -4,7 +4,7 @@ import React, { useEffect } from 'react'
|
|
4
4
|
import classnames from 'classnames'
|
5
5
|
|
6
6
|
import { buildAriaProps, buildCss, buildDataProps } from '../utilities/props'
|
7
|
-
import { globalProps } from '../utilities/globalProps'
|
7
|
+
import { deprecatedProps, globalProps } from '../utilities/globalProps'
|
8
8
|
|
9
9
|
import datePickerHelper from './date_picker_helper'
|
10
10
|
|
@@ -22,6 +22,7 @@ type DatePickerProps = {
|
|
22
22
|
disableInput?: Boolean,
|
23
23
|
disableRange?: Array,
|
24
24
|
disableWeekdays?: Array,
|
25
|
+
enableTime?: Boolean,
|
25
26
|
error?: String,
|
26
27
|
format?: String,
|
27
28
|
hideIcon?: Boolean,
|
@@ -40,11 +41,16 @@ type DatePickerProps = {
|
|
40
41
|
onChange: (String) => void,
|
41
42
|
pickerId?: String,
|
42
43
|
placeholder?: String,
|
43
|
-
plugins
|
44
|
+
plugins: Boolean,
|
45
|
+
selectionType?: "month" | "week",
|
46
|
+
showTimezone?: Boolean,
|
47
|
+
timeFormat?: String,
|
44
48
|
type?: String,
|
45
49
|
yearRange?: Array,
|
46
50
|
}
|
47
51
|
const DatePicker = (props: DatePickerProps) => {
|
52
|
+
if (props.plugins) deprecatedProps('Date Picker', ['plugins'])
|
53
|
+
|
48
54
|
const {
|
49
55
|
allowInput = false,
|
50
56
|
aria = {},
|
@@ -56,6 +62,7 @@ const DatePicker = (props: DatePickerProps) => {
|
|
56
62
|
disableInput,
|
57
63
|
disableRange = null,
|
58
64
|
disableWeekdays = null,
|
65
|
+
enableTime = false,
|
59
66
|
error,
|
60
67
|
format = 'm/d/Y',
|
61
68
|
hideIcon = false,
|
@@ -75,6 +82,8 @@ const DatePicker = (props: DatePickerProps) => {
|
|
75
82
|
pickerId,
|
76
83
|
placeholder = 'Select Date',
|
77
84
|
plugins = false,
|
85
|
+
selectionType = '',
|
86
|
+
showTimezone = false,
|
78
87
|
yearRange = [ 1900, 2100 ],
|
79
88
|
} = props
|
80
89
|
|
@@ -89,23 +98,26 @@ const DatePicker = (props: DatePickerProps) => {
|
|
89
98
|
|
90
99
|
useEffect(() => {
|
91
100
|
datePickerHelper({
|
92
|
-
allowInput
|
93
|
-
defaultDate
|
94
|
-
disableDate
|
95
|
-
disableRange
|
96
|
-
disableWeekdays
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
101
|
+
allowInput,
|
102
|
+
defaultDate,
|
103
|
+
disableDate,
|
104
|
+
disableRange,
|
105
|
+
disableWeekdays,
|
106
|
+
enableTime,
|
107
|
+
format,
|
108
|
+
hideIcon,
|
109
|
+
inLine,
|
110
|
+
maxDate,
|
111
|
+
minDate,
|
112
|
+
mode,
|
113
|
+
onChange,
|
114
|
+
pickerId,
|
115
|
+
plugins,
|
116
|
+
selectionType,
|
117
|
+
showTimezone,
|
118
|
+
yearRange,
|
107
119
|
})
|
108
|
-
}
|
120
|
+
})
|
109
121
|
|
110
122
|
const iconWrapperClass = () => {
|
111
123
|
let base = 'cal_icon_wrapper'
|
@@ -17,6 +17,8 @@ module Playbook
|
|
17
17
|
default: []
|
18
18
|
prop :disable_weekdays, type: Playbook::Props::Array,
|
19
19
|
default: []
|
20
|
+
prop :enable_time, type: Playbook::Props::Boolean,
|
21
|
+
default: false
|
20
22
|
prop :error, type: Playbook::Props::String
|
21
23
|
prop :format, type: Playbook::Props::String,
|
22
24
|
default: "m/d/Y"
|
@@ -42,7 +44,13 @@ module Playbook
|
|
42
44
|
prop :placeholder, type: Playbook::Props::String,
|
43
45
|
default: "Select Date"
|
44
46
|
prop :plugins, type: Playbook::Props::Boolean,
|
45
|
-
default: false
|
47
|
+
default: false,
|
48
|
+
deprecated: true
|
49
|
+
prop :selection_type, type: Playbook::Props::Enum,
|
50
|
+
values: %w[week month none],
|
51
|
+
default: "none"
|
52
|
+
prop :show_timezone, type: Playbook::Props::Boolean,
|
53
|
+
default: false
|
46
54
|
prop :required, type: Playbook::Props::Boolean,
|
47
55
|
default: false
|
48
56
|
prop :year_range, type: Playbook::Props::Array,
|
@@ -59,6 +67,7 @@ module Playbook
|
|
59
67
|
disableDate: disable_date,
|
60
68
|
disableRange: disable_range,
|
61
69
|
disableWeekdays: disable_weekdays,
|
70
|
+
enableTime: enable_time,
|
62
71
|
format: format,
|
63
72
|
hideIcon: hide_icon,
|
64
73
|
inline: inline,
|
@@ -68,6 +77,8 @@ module Playbook
|
|
68
77
|
pickerId: picker_id,
|
69
78
|
plugins: plugins,
|
70
79
|
required: required,
|
80
|
+
selectionType: selection_type,
|
81
|
+
showTimezone: show_timezone,
|
71
82
|
yearRange: year_range,
|
72
83
|
}.to_json.html_safe
|
73
84
|
end
|
@@ -0,0 +1,160 @@
|
|
1
|
+
/* eslint-disable no-console */
|
2
|
+
import React from 'react'
|
3
|
+
import { fireEvent, render, screen, waitFor, within } from '../utilities/test-utils'
|
4
|
+
|
5
|
+
import DatePicker from './_date_picker'
|
6
|
+
import { getTimezoneText } from './plugins/timeSelect'
|
7
|
+
|
8
|
+
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)
|
14
|
+
|
15
|
+
describe('DatePicker Kit', () => {
|
16
|
+
beforeEach(() => {
|
17
|
+
jest.spyOn(console, 'error').mockImplementation(() => {});
|
18
|
+
});
|
19
|
+
|
20
|
+
test('renders DatePicker input field', () => {
|
21
|
+
const testId = 'datepicker-kit'
|
22
|
+
render(
|
23
|
+
<DatePicker
|
24
|
+
data={{ testid: testId }}
|
25
|
+
defaultDate={DEFAULT_DATE}
|
26
|
+
pickerId="date-picker"
|
27
|
+
/>
|
28
|
+
)
|
29
|
+
|
30
|
+
const kit = screen.getByTestId(testId)
|
31
|
+
expect(kit).toHaveClass('pb_date_picker_kit')
|
32
|
+
})
|
33
|
+
|
34
|
+
test('shows DatePicker date format m/d/Y', async () => {
|
35
|
+
const testId = 'datepicker-date'
|
36
|
+
render(
|
37
|
+
<DatePicker
|
38
|
+
data={{ testid: testId }}
|
39
|
+
defaultDate={DEFAULT_DATE}
|
40
|
+
format="m/d/Y"
|
41
|
+
pickerId="date-picker-date"
|
42
|
+
/>
|
43
|
+
)
|
44
|
+
|
45
|
+
const kit = screen.getByTestId(testId)
|
46
|
+
|
47
|
+
const input = within(kit).getByPlaceholderText('Select Date')
|
48
|
+
expect(input).toBeInTheDocument()
|
49
|
+
await waitFor(() => {
|
50
|
+
expect(input).toHaveValue('02/01/2022')
|
51
|
+
})
|
52
|
+
})
|
53
|
+
|
54
|
+
test('shows DatePicker time caption text', async () => {
|
55
|
+
const testId = 'datepicker-time-caption'
|
56
|
+
render(
|
57
|
+
<DatePicker
|
58
|
+
data={{ testid: testId }}
|
59
|
+
defaultDate={DEFAULT_DATE}
|
60
|
+
enableTime
|
61
|
+
pickerId="date-picker-time-caption"
|
62
|
+
/>
|
63
|
+
)
|
64
|
+
|
65
|
+
const kit = screen.getByTestId(testId)
|
66
|
+
const input = within(kit).getByPlaceholderText('Select Date')
|
67
|
+
|
68
|
+
fireEvent(
|
69
|
+
input,
|
70
|
+
new MouseEvent('click', {
|
71
|
+
bubbles: true,
|
72
|
+
cancelable: true,
|
73
|
+
}),
|
74
|
+
)
|
75
|
+
await waitFor(() => {
|
76
|
+
const caption = within(kit).getByText('Select Time')
|
77
|
+
expect(caption).toBeInTheDocument()
|
78
|
+
})
|
79
|
+
})
|
80
|
+
|
81
|
+
test('shows DatePicker timezone text', async () => {
|
82
|
+
const testId = 'datepicker-timezone'
|
83
|
+
render(
|
84
|
+
<DatePicker
|
85
|
+
data={{ testid: testId }}
|
86
|
+
defaultDate={DEFAULT_DATE}
|
87
|
+
enableTime
|
88
|
+
pickerId="date-picker-timezone"
|
89
|
+
showTimezone
|
90
|
+
/>
|
91
|
+
)
|
92
|
+
|
93
|
+
const kit = screen.getByTestId(testId)
|
94
|
+
const input = within(kit).getByPlaceholderText('Select Date')
|
95
|
+
const defaultTimezoneText = getTimezoneText(DEFAULT_DATE)
|
96
|
+
|
97
|
+
fireEvent(
|
98
|
+
input,
|
99
|
+
new MouseEvent('click', {
|
100
|
+
bubbles: true,
|
101
|
+
cancelable: true,
|
102
|
+
}),
|
103
|
+
)
|
104
|
+
await waitFor(() => {
|
105
|
+
const timezoneText = within(kit).getByText(defaultTimezoneText)
|
106
|
+
expect(timezoneText).toBeInTheDocument()
|
107
|
+
})
|
108
|
+
})
|
109
|
+
|
110
|
+
test('shows DatePicker meridiem toggle', async () => {
|
111
|
+
const testId = 'datepicker-meridiem'
|
112
|
+
render(
|
113
|
+
<DatePicker
|
114
|
+
data={{ testid: testId }}
|
115
|
+
defaultDate={DEFAULT_DATE}
|
116
|
+
enableTime
|
117
|
+
pickerId="date-picker-meridiem"
|
118
|
+
/>
|
119
|
+
)
|
120
|
+
|
121
|
+
const kit = screen.getByTestId(testId)
|
122
|
+
const input = within(kit).getByPlaceholderText('Select Date')
|
123
|
+
|
124
|
+
fireEvent(
|
125
|
+
input,
|
126
|
+
new MouseEvent('click', {
|
127
|
+
bubbles: true,
|
128
|
+
cancelable: true,
|
129
|
+
}),
|
130
|
+
)
|
131
|
+
const meridiemToggleAM = within(kit).getByLabelText('AM')
|
132
|
+
const meridiemTogglePM = within(kit).getByLabelText('PM')
|
133
|
+
await waitFor(() => {
|
134
|
+
expect(meridiemToggleAM).toBeInTheDocument()
|
135
|
+
expect(meridiemTogglePM).toBeInTheDocument()
|
136
|
+
})
|
137
|
+
|
138
|
+
fireEvent(
|
139
|
+
meridiemToggleAM,
|
140
|
+
new MouseEvent('click', {
|
141
|
+
bubbles: true,
|
142
|
+
cancelable: true,
|
143
|
+
}),
|
144
|
+
)
|
145
|
+
await waitFor(() => {
|
146
|
+
expect(input).toHaveValue('02/01/2022 at 12:00 AM')
|
147
|
+
})
|
148
|
+
|
149
|
+
fireEvent(
|
150
|
+
meridiemTogglePM,
|
151
|
+
new MouseEvent('click', {
|
152
|
+
bubbles: true,
|
153
|
+
cancelable: true,
|
154
|
+
}),
|
155
|
+
)
|
156
|
+
await waitFor(() => {
|
157
|
+
expect(input).toHaveValue('02/01/2022 at 12:00 PM')
|
158
|
+
})
|
159
|
+
})
|
160
|
+
})
|
@@ -1,5 +1,7 @@
|
|
1
1
|
import flatpickr from 'flatpickr'
|
2
2
|
import monthSelectPlugin from 'flatpickr/dist/plugins/monthSelect'
|
3
|
+
import weekSelect from "flatpickr/dist/plugins/weekSelect/weekSelect"
|
4
|
+
import timeSelectPlugin from './plugins/timeSelect'
|
3
5
|
|
4
6
|
const datePickerHelper = (config) => {
|
5
7
|
const {
|
@@ -8,6 +10,7 @@ const datePickerHelper = (config) => {
|
|
8
10
|
disableDate,
|
9
11
|
disableRange,
|
10
12
|
disableWeekdays,
|
13
|
+
enableTime,
|
11
14
|
format,
|
12
15
|
maxDate,
|
13
16
|
minDate,
|
@@ -16,6 +19,10 @@ const datePickerHelper = (config) => {
|
|
16
19
|
pickerId,
|
17
20
|
plugins,
|
18
21
|
required,
|
22
|
+
selectionType,
|
23
|
+
showTimezone,
|
24
|
+
timeCaption = 'Select Time',
|
25
|
+
timeFormat = 'at h:i K',
|
19
26
|
yearRange,
|
20
27
|
} = config
|
21
28
|
|
@@ -52,9 +59,25 @@ const datePickerHelper = (config) => {
|
|
52
59
|
}
|
53
60
|
}
|
54
61
|
|
55
|
-
const
|
56
|
-
|
57
|
-
|
62
|
+
const setPlugins = () => {
|
63
|
+
let pluginList = []
|
64
|
+
|
65
|
+
// month and week selection
|
66
|
+
if (selectionType === "month" || plugins === true) {
|
67
|
+
pluginList.push(monthSelectPlugin({ shorthand: true, dateFormat: 'F Y', altFormat: 'F Y' }))
|
68
|
+
} else if ( selectionType === "week") {
|
69
|
+
pluginList.push(weekSelect({}))
|
70
|
+
}
|
71
|
+
|
72
|
+
// time selection
|
73
|
+
if (enableTime) pluginList.push(timeSelectPlugin({ caption: timeCaption, showTimezone: showTimezone}))
|
74
|
+
|
75
|
+
return pluginList
|
76
|
+
}
|
77
|
+
|
78
|
+
const getDateFormat = () => {
|
79
|
+
return enableTime ? `${format} ${timeFormat}` : format
|
80
|
+
}
|
58
81
|
|
59
82
|
// ===========================================================
|
60
83
|
// | Flatpickr initializer w/ config |
|
@@ -62,7 +85,7 @@ const datePickerHelper = (config) => {
|
|
62
85
|
|
63
86
|
flatpickr(`#${pickerId}`, {
|
64
87
|
disableMobile: true,
|
65
|
-
dateFormat:
|
88
|
+
dateFormat: getDateFormat(),
|
66
89
|
defaultDate: defaultDateGetter(),
|
67
90
|
disable: disableWeekdays && disableWeekdays.length > 0 ? [
|
68
91
|
(date) => {
|
@@ -86,9 +109,10 @@ const datePickerHelper = (config) => {
|
|
86
109
|
)
|
87
110
|
},
|
88
111
|
] : disabledParser(),
|
89
|
-
|
90
|
-
|
91
|
-
|
112
|
+
enableTime,
|
113
|
+
maxDate,
|
114
|
+
minDate,
|
115
|
+
mode,
|
92
116
|
nextArrow: '<i class="far fa-angle-right"></i>',
|
93
117
|
onOpen: [() => {
|
94
118
|
calendarResizer()
|
@@ -98,12 +122,12 @@ const datePickerHelper = (config) => {
|
|
98
122
|
window.removeEventListener('resize', calendarResizer)
|
99
123
|
}],
|
100
124
|
onChange: [(selectedDates, dateStr) => {
|
101
|
-
onChange(dateStr, selectedDates)
|
125
|
+
onChange(dateStr, selectedDates)
|
102
126
|
}],
|
103
127
|
onYearChange: [() => {
|
104
128
|
yearChangeHook()
|
105
129
|
}],
|
106
|
-
plugins:
|
130
|
+
plugins: setPlugins(),
|
107
131
|
prevArrow: '<i class="far fa-angle-left"></i>',
|
108
132
|
static: true,
|
109
133
|
})
|
@@ -162,8 +186,10 @@ const datePickerHelper = (config) => {
|
|
162
186
|
// Adding dropdown icons to year and month selects
|
163
187
|
dropdown.insertAdjacentHTML('afterend', '<i class="far fa-angle-down year-dropdown-icon" id="test-id"></i>')
|
164
188
|
if (picker.monthElements[0].parentElement) {
|
165
|
-
return picker.monthElements[0].insertAdjacentHTML('afterend', '<i class="far fa-angle-down month-dropdown-icon"></i>')
|
166
|
-
|
189
|
+
return picker.monthElements[0].insertAdjacentHTML('afterend', '<i class="far fa-angle-down month-dropdown-icon"></i>')}
|
190
|
+
// if (picker.weekElements[0].parentElement){
|
191
|
+
// return picker.weekElements[0].insertAdjacentHTML('afterend', '<i class="far fa-angle-down year-dropdown-icon" id="test-id"></i>')
|
192
|
+
// }
|
167
193
|
|
168
194
|
// Remove readonly attribute for validation and or text input
|
169
195
|
if (allowInput){
|
@@ -1 +1 @@
|
|
1
|
-
<%= pb_rails("date_picker", props: { picker_id: "date-picker-default"
|
1
|
+
<%= pb_rails("date_picker", props: { picker_id: "date-picker-default"}) %>
|
@@ -1 +1 @@
|
|
1
|
-
By default
|
1
|
+
By default selectType prop is disabled. To activate it set `selectionType` prop in JSX/TSX to `month`. To activate it set `selection_type` prop in a rails file to `month`.
|
@@ -0,0 +1,21 @@
|
|
1
|
+
import React from 'react'
|
2
|
+
|
3
|
+
import DatePicker from '../_date_picker'
|
4
|
+
|
5
|
+
const DEFAULT_DATE = new Date()
|
6
|
+
DEFAULT_DATE.setHours(12)
|
7
|
+
DEFAULT_DATE.setMinutes(0)
|
8
|
+
|
9
|
+
const DatePickerTime = (props) => (
|
10
|
+
<div>
|
11
|
+
<DatePicker
|
12
|
+
defaultDate={DEFAULT_DATE}
|
13
|
+
enableTime
|
14
|
+
pickerId="date-picker-time"
|
15
|
+
showTimezone
|
16
|
+
{...props}
|
17
|
+
/>
|
18
|
+
</div>
|
19
|
+
)
|
20
|
+
|
21
|
+
export default DatePickerTime
|
@@ -0,0 +1 @@
|
|
1
|
+
To select time as well, you should pass the `enableTime` boolean prop. You can also enable timezone display by passing `showTimezone`.
|
@@ -0,0 +1,18 @@
|
|
1
|
+
import React from 'react'
|
2
|
+
|
3
|
+
import DatePicker from '../_date_picker'
|
4
|
+
|
5
|
+
const DatePickerWeek = (props) => {
|
6
|
+
return (
|
7
|
+
<div>
|
8
|
+
<DatePicker
|
9
|
+
label="Date Picker"
|
10
|
+
pickerId="week-date-picker"
|
11
|
+
selectionType="week"
|
12
|
+
{...props}
|
13
|
+
/>
|
14
|
+
</div>
|
15
|
+
)
|
16
|
+
}
|
17
|
+
|
18
|
+
export default DatePickerWeek
|
@@ -0,0 +1 @@
|
|
1
|
+
By default selectType prop is disabled. To activate it set `selectionType` prop in JSX/TSX to `week`. To activate it set `selection_type` prop in a rails file to `week`.
|
@@ -17,6 +17,8 @@ examples:
|
|
17
17
|
- date_picker_anti_patterns: Anti-Patterns
|
18
18
|
- date_picker_inline: Inline
|
19
19
|
- date_picker_month_and_year: Month & Year Only
|
20
|
+
- date_picker_week: Week
|
21
|
+
- date_picker_time: Time Selection
|
20
22
|
|
21
23
|
|
22
24
|
react:
|
@@ -36,3 +38,5 @@ examples:
|
|
36
38
|
- date_picker_year_range: Year Range
|
37
39
|
- date_picker_inline: Inline
|
38
40
|
- date_picker_month_and_year: Month & Year Only
|
41
|
+
- date_picker_week: Week
|
42
|
+
- date_picker_time: Time Selection
|
@@ -14,3 +14,5 @@ export { default as DatePickerFlatpickrMethods } from './_date_picker_flatpickr_
|
|
14
14
|
export { default as DatePickerYearRange } from './_date_picker_year_range.jsx'
|
15
15
|
export { default as DatePickerInline } from './_date_picker_inline.jsx'
|
16
16
|
export { default as DatePickerMonthAndYear } from './_date_picker_month_and_year.jsx'
|
17
|
+
export { default as DatePickerTime } from './_date_picker_time.jsx'
|
18
|
+
export { default as DatePickerWeek } from './_date_picker_week.jsx'
|