playbook_ui 5.4.0 → 5.5.1.pre.alpha3
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.
- checksums.yaml +4 -4
- data/app/pb_kits/playbook/_playbook.scss +1 -0
- data/app/pb_kits/playbook/data/menu.yml +2 -0
- data/app/pb_kits/playbook/index.js +2 -0
- data/app/pb_kits/playbook/packs/examples.js +2 -0
- data/app/pb_kits/playbook/packs/samples.js +2 -0
- data/app/pb_kits/playbook/pb_body/_body.jsx +2 -2
- data/app/pb_kits/playbook/pb_button/_button.jsx +2 -0
- data/app/pb_kits/playbook/pb_caption/_caption.scss +2 -2
- data/app/pb_kits/playbook/pb_dashboard_value/_dashboard_value.html.erb +3 -2
- data/app/pb_kits/playbook/pb_dashboard_value/_dashboard_value.jsx +15 -12
- data/app/pb_kits/playbook/pb_date_picker/_date_picker.html.erb +36 -0
- data/app/pb_kits/playbook/pb_date_picker/_date_picker.jsx +98 -0
- data/app/pb_kits/playbook/pb_date_picker/_date_picker.scss +59 -0
- data/app/pb_kits/playbook/pb_date_picker/date_picker.rb +38 -0
- data/app/pb_kits/playbook/pb_date_picker/date_picker_helper.js +91 -0
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_default.html.erb +1 -0
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_default.jsx +12 -0
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_default_date.html.erb +24 -0
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_default_date.jsx +30 -0
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_disabled.html.erb +43 -0
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_disabled.jsx +48 -0
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_error.html.erb +4 -0
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_error.jsx +13 -0
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_format.html.erb +19 -0
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_format.jsx +25 -0
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_label.html.erb +4 -0
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_label.jsx +13 -0
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_min_max.html.erb +14 -0
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_min_max.jsx +22 -0
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_range.html.erb +4 -0
- data/app/pb_kits/playbook/pb_date_picker/docs/_date_picker_range.jsx +13 -0
- data/app/pb_kits/playbook/pb_date_picker/docs/example.yml +23 -0
- data/app/pb_kits/playbook/pb_date_picker/docs/index.js +8 -0
- data/app/pb_kits/playbook/pb_date_picker/index.js +11 -0
- data/app/pb_kits/playbook/pb_filter/docs/_filter_default.html.erb +1 -0
- data/app/pb_kits/playbook/pb_form/docs/_form_form_with.html.erb +1 -0
- data/app/pb_kits/playbook/pb_form/docs/_form_simple_form.html.erb +3 -1
- data/app/pb_kits/playbook/pb_form/form_builder.rb +1 -0
- data/app/pb_kits/playbook/pb_form/form_builder/date_picker_field.rb +15 -0
- data/app/pb_kits/playbook/pb_image/_image.jsx +1 -1
- data/app/pb_kits/playbook/pb_layout/_layout.scss +16 -0
- data/app/pb_kits/playbook/pb_legend/_legend.html.erb +1 -0
- data/app/pb_kits/playbook/pb_legend/_legend.jsx +25 -4
- data/app/pb_kits/playbook/pb_nav/_vertical_nav.scss +3 -0
- data/app/pb_kits/playbook/pb_popover/_popover.html.erb +1 -1
- data/app/pb_kits/playbook/pb_popover/_popover.jsx +3 -1
- data/app/pb_kits/playbook/pb_popover/_popover.scss +4 -0
- data/app/pb_kits/playbook/pb_popover/popover.rb +4 -0
- data/app/pb_kits/playbook/pb_time_range_inline/_time_range_inline.html.erb +2 -2
- data/app/pb_kits/playbook/pb_time_range_inline/_time_range_inline.jsx +24 -10
- data/app/pb_kits/playbook/pb_time_range_inline/_time_range_inline.scss +3 -1
- data/app/pb_kits/playbook/pb_time_range_inline/time_range_inline.rb +6 -0
- data/app/pb_kits/playbook/pb_title/_title.jsx +7 -4
- data/app/pb_kits/playbook/pb_title/_title.scss +7 -0
- data/app/pb_kits/playbook/pb_title/_title_mixin.scss +2 -0
- data/app/pb_kits/playbook/pb_title/title.rb +4 -1
- data/app/pb_kits/playbook/vendor.js +4 -0
- data/app/views/layouts/playbook/samples.html.erb +1 -0
- data/app/views/playbook/samples/collection_detail/index.html.erb +169 -0
- data/app/views/playbook/samples/collection_detail/index.jsx +372 -0
- data/lib/playbook/version.rb +1 -1
- metadata +31 -4
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 31dff4bfa638b81a994e4ceac1efcab5d6125f9978a00355de496dce4f0353e8
|
|
4
|
+
data.tar.gz: 3e600ee35141d5a5338b8944c76caf17e437556703348c29a45a156ca99848b3
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 1552e2015fb8dc9bfd47105e6e4fd8999cf7464b39b1cbfb03f799516a0e57431086343f666b8e2ab006805de9bbaa28c9e5dcab739e2e1bb9b3b9f5617cd058
|
|
7
|
+
data.tar.gz: c6fa49ddef9e87c9f59cc6e681337188ec22907dea394bdd4dc82edfed29f7a3505de4c71656df879d76c62875072955148ae1906f95e96b15cdf09792b1bb60
|
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
@import 'pb_currency/currency';
|
|
15
15
|
@import 'pb_dashboard_value/dashboard_value';
|
|
16
16
|
@import 'pb_date/date';
|
|
17
|
+
@import 'pb_date_picker/date_picker';
|
|
17
18
|
@import 'pb_date_range_inline/date_range_inline';
|
|
18
19
|
@import 'pb_date_range_stacked/date_range_stacked';
|
|
19
20
|
@import 'pb_date_stacked/date_stacked';
|
|
@@ -13,6 +13,7 @@ export Contact from './pb_contact/_contact.jsx'
|
|
|
13
13
|
export Currency from './pb_currency/_currency.jsx'
|
|
14
14
|
export DashboardValue from './pb_dashboard_value/_dashboard_value.jsx'
|
|
15
15
|
export Date from './pb_date/_date.jsx'
|
|
16
|
+
export DatePicker from './pb_date_picker/_date_picker.jsx'
|
|
16
17
|
export DateRangeInline from './pb_date_range_inline/_date_range_inline.jsx'
|
|
17
18
|
export DateRangeStacked from './pb_date_range_stacked/_date_range_stacked.jsx'
|
|
18
19
|
export DateStacked from './pb_date_stacked/_date_stacked.jsx'
|
|
@@ -90,6 +91,7 @@ export dashboardValueSettings from './pb_dashboard_value/dashboardValueSettings'
|
|
|
90
91
|
|
|
91
92
|
// Other JS/Plugins
|
|
92
93
|
export pbChart from './plugins/pb_chart.js'
|
|
94
|
+
export datePickerHelper from './pb_date_picker/date_picker_helper.js'
|
|
93
95
|
export PbTypeahead from './pb_typeahead'
|
|
94
96
|
export PbPopover from './pb_popover'
|
|
95
97
|
export PbTable from './pb_table'
|
|
@@ -27,6 +27,7 @@ import * as Contact from 'pb_contact/docs'
|
|
|
27
27
|
import * as Currency from 'pb_currency/docs'
|
|
28
28
|
import * as DashboardValue from 'pb_dashboard_value/docs'
|
|
29
29
|
import * as Date from 'pb_date/docs'
|
|
30
|
+
import * as DatePicker from 'pb_date_picker/docs'
|
|
30
31
|
import * as DateRangeInline from 'pb_date_range_inline/docs'
|
|
31
32
|
import * as DateRangeStacked from 'pb_date_range_stacked/docs'
|
|
32
33
|
import * as DateStacked from 'pb_date_stacked/docs'
|
|
@@ -107,6 +108,7 @@ WebpackerReact.setup({
|
|
|
107
108
|
...Currency,
|
|
108
109
|
...DashboardValue,
|
|
109
110
|
...Date,
|
|
111
|
+
...DatePicker,
|
|
110
112
|
...DateRangeInline,
|
|
111
113
|
...DateRangeStacked,
|
|
112
114
|
...DateStacked,
|
|
@@ -13,7 +13,9 @@ import WebpackerReact from 'webpacker-react'
|
|
|
13
13
|
import Dashboards from '../../../views/playbook/samples/dashboards/index.jsx'
|
|
14
14
|
import FilterTable from '../../../views/playbook/samples/filter_table/index.jsx'
|
|
15
15
|
import Registration from '../../../views/playbook/samples/registration/index.jsx'
|
|
16
|
+
import CollectionDetail from '../../../views/playbook/samples/collection_detail/index.jsx'
|
|
16
17
|
|
|
17
18
|
WebpackerReact.setup({ Dashboards })
|
|
18
19
|
WebpackerReact.setup({ FilterTable })
|
|
19
20
|
WebpackerReact.setup({ Registration })
|
|
21
|
+
WebpackerReact.setup({ CollectionDetail })
|
|
@@ -40,11 +40,11 @@ const Body = (props: BodyProps) => {
|
|
|
40
40
|
const ariaProps = buildAriaProps(aria)
|
|
41
41
|
const dataProps = buildDataProps(data)
|
|
42
42
|
const classes = classnames(
|
|
43
|
-
className,
|
|
44
43
|
buildCss('pb_body_kit', color, status, {
|
|
45
44
|
dark: dark,
|
|
46
45
|
}),
|
|
47
|
-
spacing(props)
|
|
46
|
+
spacing(props),
|
|
47
|
+
className
|
|
48
48
|
)
|
|
49
49
|
const Tag = `${tag}`
|
|
50
50
|
|
|
@@ -72,6 +72,7 @@ const Button = (props: ButtonPropTypes) => {
|
|
|
72
72
|
const {
|
|
73
73
|
children,
|
|
74
74
|
className,
|
|
75
|
+
disabled,
|
|
75
76
|
icon = null,
|
|
76
77
|
id,
|
|
77
78
|
loading = false,
|
|
@@ -120,6 +121,7 @@ const Button = (props: ButtonPropTypes) => {
|
|
|
120
121
|
<button
|
|
121
122
|
{...buttonAria}
|
|
122
123
|
className={css}
|
|
124
|
+
disabled={disabled}
|
|
123
125
|
id={id}
|
|
124
126
|
onClick={onClick}
|
|
125
127
|
type={htmlType}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
<%= content_tag(:div,
|
|
2
|
-
|
|
2
|
+
aria: object.aria,
|
|
3
|
+
class: object.classname,
|
|
3
4
|
data: object.data,
|
|
4
|
-
|
|
5
|
+
id: object.id) do %>
|
|
5
6
|
<% if object.stat_label.present? %>
|
|
6
7
|
<%= pb_rails("body", props: { color: "light", text: object.stat_label } ) %>
|
|
7
8
|
<% end %>
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
import React from 'react'
|
|
4
4
|
import classnames from 'classnames'
|
|
5
|
+
import { buildAriaProps, buildCss, buildDataProps } from '../utilities/props'
|
|
5
6
|
import { spacing } from '../utilities/spacing.js'
|
|
6
7
|
import {
|
|
7
8
|
Body,
|
|
@@ -11,7 +12,9 @@ import {
|
|
|
11
12
|
|
|
12
13
|
type DashboardValueProps = {
|
|
13
14
|
align?: 'left' | 'center' | 'right',
|
|
15
|
+
aria?: object,
|
|
14
16
|
className?: String,
|
|
17
|
+
data?: object,
|
|
15
18
|
id?: String,
|
|
16
19
|
statChange?: {
|
|
17
20
|
change?: String,
|
|
@@ -24,27 +27,27 @@ type DashboardValueProps = {
|
|
|
24
27
|
}
|
|
25
28
|
}
|
|
26
29
|
|
|
27
|
-
const dashboardValueCSS = ({
|
|
28
|
-
align = 'left',
|
|
29
|
-
|
|
30
|
-
}: DashboardValueProps) => {
|
|
31
|
-
const alignStyle = align !== '' ? `_${align}` : ''
|
|
32
|
-
|
|
33
|
-
return 'pb_dashboard_value_kit' + alignStyle
|
|
34
|
-
}
|
|
35
|
-
|
|
36
30
|
const DashboardValue = (props: DashboardValueProps) => {
|
|
37
31
|
const {
|
|
32
|
+
align = 'left',
|
|
33
|
+
aria = {},
|
|
38
34
|
className,
|
|
35
|
+
data = {},
|
|
39
36
|
id,
|
|
40
|
-
statChange,
|
|
37
|
+
statChange = {},
|
|
41
38
|
statLabel,
|
|
42
|
-
statValue,
|
|
39
|
+
statValue = {},
|
|
43
40
|
} = props
|
|
44
41
|
|
|
42
|
+
const ariaProps = buildAriaProps(aria)
|
|
43
|
+
const dataProps = buildDataProps(data)
|
|
44
|
+
const classes = classnames(buildCss('pb_dashboard_value_kit', align), className, spacing(props))
|
|
45
|
+
|
|
45
46
|
return (
|
|
46
47
|
<div
|
|
47
|
-
|
|
48
|
+
{...ariaProps}
|
|
49
|
+
{...dataProps}
|
|
50
|
+
className={classes}
|
|
48
51
|
id={id}
|
|
49
52
|
>
|
|
50
53
|
<If condition={statLabel}>
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
<%= content_tag(:div,
|
|
2
|
+
aria: object.aria,
|
|
3
|
+
class: object.classname + " " + object.error_class,
|
|
4
|
+
data: object.data,
|
|
5
|
+
id: object.id) do %>
|
|
6
|
+
<%= pb_rails("caption", props: { text: object.label }) %>
|
|
7
|
+
<div class="input_wrapper">
|
|
8
|
+
<input
|
|
9
|
+
autocomplete="off"
|
|
10
|
+
id="<%= object.picker_id %>"
|
|
11
|
+
/>
|
|
12
|
+
<% if object.error %>
|
|
13
|
+
<%= pb_rails("body", props: {
|
|
14
|
+
status: "negative",
|
|
15
|
+
text: object.error
|
|
16
|
+
}) %>
|
|
17
|
+
<% end %>
|
|
18
|
+
</div>
|
|
19
|
+
|
|
20
|
+
<%= javascript_tag do %>
|
|
21
|
+
document.addEventListener("DOMContentLoaded", () => {
|
|
22
|
+
datePickerHelper({
|
|
23
|
+
defaultDate: "<%= object.default_date %>",
|
|
24
|
+
disableDate: <%=raw object.disable_date %>,
|
|
25
|
+
disableRange: <%=raw object.disable_range.to_json %>,
|
|
26
|
+
disableWeekdays: <%=raw object.disable_weekdays %>,
|
|
27
|
+
format: "<%= object.format %>",
|
|
28
|
+
maxDate: "<%= object.max_date %>",
|
|
29
|
+
minDate: "<%= object.min_date %>",
|
|
30
|
+
mode: "<%= object.mode %>",
|
|
31
|
+
pickerId: "<%= object.picker_id %>",
|
|
32
|
+
propModel: "rails"
|
|
33
|
+
})
|
|
34
|
+
})
|
|
35
|
+
<% end %>
|
|
36
|
+
<% end %>
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/* @flow */
|
|
2
|
+
|
|
3
|
+
import React, { useEffect } from 'react'
|
|
4
|
+
import classnames from 'classnames'
|
|
5
|
+
import { buildAriaProps, buildCss, buildDataProps } from '../utilities/props'
|
|
6
|
+
import { spacing } from '../utilities/spacing.js'
|
|
7
|
+
import flatpickr from 'flatpickr'
|
|
8
|
+
import { Body, Caption } from '../'
|
|
9
|
+
import datePickerHelper from './date_picker_helper.js'
|
|
10
|
+
|
|
11
|
+
type DatePickerProps = {
|
|
12
|
+
aria?: object,
|
|
13
|
+
className?: String,
|
|
14
|
+
data?: object,
|
|
15
|
+
defaultDate?: String,
|
|
16
|
+
disableDate?: Array,
|
|
17
|
+
disableRange?: Array,
|
|
18
|
+
disableWeekdays?: Array,
|
|
19
|
+
error?: String,
|
|
20
|
+
format?: String,
|
|
21
|
+
id?: String,
|
|
22
|
+
label?: String,
|
|
23
|
+
maxDate: String,
|
|
24
|
+
minDate: String,
|
|
25
|
+
mode?: String,
|
|
26
|
+
pickerId?: String,
|
|
27
|
+
}
|
|
28
|
+
const DatePicker = (props: DatePickerProps) => {
|
|
29
|
+
const {
|
|
30
|
+
aria = {},
|
|
31
|
+
className,
|
|
32
|
+
data = {},
|
|
33
|
+
defaultDate = '',
|
|
34
|
+
disableDate = null,
|
|
35
|
+
disableRange = null,
|
|
36
|
+
disableWeekdays = null,
|
|
37
|
+
error,
|
|
38
|
+
format = 'm/d/Y',
|
|
39
|
+
id,
|
|
40
|
+
label = 'Date Picker',
|
|
41
|
+
maxDate,
|
|
42
|
+
minDate,
|
|
43
|
+
mode = 'single',
|
|
44
|
+
pickerId,
|
|
45
|
+
} = props
|
|
46
|
+
|
|
47
|
+
const ariaProps = buildAriaProps(aria)
|
|
48
|
+
const dataProps = buildDataProps(data)
|
|
49
|
+
const classes = classnames(
|
|
50
|
+
buildCss('pb_date_picker'),
|
|
51
|
+
className,
|
|
52
|
+
spacing(props),
|
|
53
|
+
error ? 'error' : null,
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
useEffect(() => {
|
|
57
|
+
datePickerHelper({
|
|
58
|
+
defaultDate: defaultDate,
|
|
59
|
+
disableDate: disableDate,
|
|
60
|
+
disableRange: disableRange,
|
|
61
|
+
disableWeekdays: disableWeekdays,
|
|
62
|
+
format: format,
|
|
63
|
+
maxDate: maxDate,
|
|
64
|
+
minDate: minDate,
|
|
65
|
+
mode: mode,
|
|
66
|
+
pickerId: pickerId,
|
|
67
|
+
propModel: 'React',
|
|
68
|
+
})
|
|
69
|
+
}, [])
|
|
70
|
+
|
|
71
|
+
return (
|
|
72
|
+
<div
|
|
73
|
+
{...ariaProps}
|
|
74
|
+
{...dataProps}
|
|
75
|
+
className={classes}
|
|
76
|
+
id={id}
|
|
77
|
+
>
|
|
78
|
+
{className}
|
|
79
|
+
<Caption
|
|
80
|
+
text={label}
|
|
81
|
+
/>
|
|
82
|
+
<div className="input_wrapper">
|
|
83
|
+
<input
|
|
84
|
+
autoComplete="off"
|
|
85
|
+
id={pickerId}
|
|
86
|
+
/>
|
|
87
|
+
<If condition={error}>
|
|
88
|
+
<Body
|
|
89
|
+
status="negative"
|
|
90
|
+
text={error}
|
|
91
|
+
/>
|
|
92
|
+
</If>
|
|
93
|
+
</div>
|
|
94
|
+
</div>
|
|
95
|
+
)
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
export default DatePicker
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
@import '~flatpickr/dist/flatpickr.css';
|
|
2
|
+
@import "../pb_textarea/textarea_mixin";
|
|
3
|
+
@import "../pb_title/title_mixin";
|
|
4
|
+
@import "../tokens/colors";
|
|
5
|
+
@import "../pb_caption/caption_mixin";
|
|
6
|
+
|
|
7
|
+
[class^=pb_date_picker] {
|
|
8
|
+
// input styles
|
|
9
|
+
[class^=pb_caption_kit] {
|
|
10
|
+
margin-bottom: $space_xs;
|
|
11
|
+
display: block;
|
|
12
|
+
}
|
|
13
|
+
.input_wrapper {
|
|
14
|
+
margin-bottom: $space_sm;
|
|
15
|
+
|
|
16
|
+
.flatpickr-wrapper {
|
|
17
|
+
display: block;
|
|
18
|
+
input::placeholder {
|
|
19
|
+
@include pb_body_light;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
> input:first-child {
|
|
23
|
+
@include pb_textarea_light;
|
|
24
|
+
@include pb_title_4;
|
|
25
|
+
overflow: hidden;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
input:focus, input:-webkit-autofill:focus {
|
|
29
|
+
@include pb_textarea_focus;
|
|
30
|
+
-webkit-box-shadow: 0 0 0px 1000px $focus_input_light inset;
|
|
31
|
+
transition: background-color 5000s ease-in-out 0s;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
&.error {
|
|
37
|
+
[class^=pb_body_kit] {
|
|
38
|
+
margin-top: $space_xs / 2;
|
|
39
|
+
}
|
|
40
|
+
.flatpickr-wrapper {
|
|
41
|
+
> input:first-child {
|
|
42
|
+
border-color: $error;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// date-picker styles
|
|
49
|
+
|
|
50
|
+
div.flatpickr-weekdays {
|
|
51
|
+
margin-top: 5px;
|
|
52
|
+
}
|
|
53
|
+
span.flatpickr-weekday {
|
|
54
|
+
@include caption;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.pb_popover_body {
|
|
58
|
+
overflow: visible !important;
|
|
59
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Playbook
|
|
4
|
+
module PbDatePicker
|
|
5
|
+
class DatePicker
|
|
6
|
+
include Playbook::Props
|
|
7
|
+
|
|
8
|
+
partial "pb_date_picker/date_picker"
|
|
9
|
+
|
|
10
|
+
prop :default_date, type: Playbook::Props::String,
|
|
11
|
+
default: ""
|
|
12
|
+
prop :disable_date, type: Playbook::Props::Array,
|
|
13
|
+
default: []
|
|
14
|
+
prop :disable_range, type: Playbook::Props::Array,
|
|
15
|
+
default: []
|
|
16
|
+
prop :disable_weekdays, type: Playbook::Props::Array,
|
|
17
|
+
default: []
|
|
18
|
+
prop :error, type: Playbook::Props::String
|
|
19
|
+
prop :format, type: Playbook::Props::String,
|
|
20
|
+
default: "m/d/Y"
|
|
21
|
+
prop :label, type: Playbook::Props::String,
|
|
22
|
+
default: "Date Picker"
|
|
23
|
+
prop :max_date, type: Playbook::Props::String
|
|
24
|
+
prop :min_date, type: Playbook::Props::String
|
|
25
|
+
prop :mode, type: Playbook::Props::String,
|
|
26
|
+
default: "single"
|
|
27
|
+
prop :picker_id, type: Playbook::Props::String
|
|
28
|
+
|
|
29
|
+
def classname
|
|
30
|
+
generate_classname("pb_date_picker")
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def error_class
|
|
34
|
+
error ? "error" : ""
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import flatpickr from 'flatpickr'
|
|
2
|
+
|
|
3
|
+
const datePickerHelper = (config) => {
|
|
4
|
+
const {
|
|
5
|
+
defaultDate,
|
|
6
|
+
disableDate,
|
|
7
|
+
disableRange,
|
|
8
|
+
disableWeekdays,
|
|
9
|
+
format,
|
|
10
|
+
maxDate,
|
|
11
|
+
minDate,
|
|
12
|
+
mode,
|
|
13
|
+
pickerId,
|
|
14
|
+
propModel,
|
|
15
|
+
} = config
|
|
16
|
+
|
|
17
|
+
const defaultDateGetter = () => {
|
|
18
|
+
if (defaultDate !== '') {
|
|
19
|
+
if (propModel === 'rails' && defaultDate.includes('[') == true) {
|
|
20
|
+
return JSON.parse(defaultDate.replace(/"/g, '"'))
|
|
21
|
+
} else if (defaultDate === 'blank') {
|
|
22
|
+
return ''
|
|
23
|
+
} else {
|
|
24
|
+
return defaultDate
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
if (mode === 'single' && defaultDate === '') {
|
|
28
|
+
return new Date()
|
|
29
|
+
} else if (mode === 'range' && defaultDate === '') {
|
|
30
|
+
const today = new Date()
|
|
31
|
+
const tomorrow = new Date(today)
|
|
32
|
+
tomorrow.setDate(tomorrow.getDate() + 1)
|
|
33
|
+
return [today, tomorrow]
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
const disabledParser = () => {
|
|
37
|
+
if (disableDate && disableDate.length > 0) {
|
|
38
|
+
return disableDate
|
|
39
|
+
} else if (disableRange && disableRange.length > 0) {
|
|
40
|
+
return disableRange
|
|
41
|
+
} else {
|
|
42
|
+
return []
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
flatpickr(`#${pickerId}`, {
|
|
47
|
+
allowInput: true,
|
|
48
|
+
dateFormat: format,
|
|
49
|
+
defaultDate: defaultDateGetter(),
|
|
50
|
+
disable: disableWeekdays && disableWeekdays.length > 0 ? [
|
|
51
|
+
(date) => {
|
|
52
|
+
const weekdayObj = {
|
|
53
|
+
Sunday: 0,
|
|
54
|
+
Monday: 1,
|
|
55
|
+
Tuesday: 2,
|
|
56
|
+
Wednesday: 3,
|
|
57
|
+
Thursday: 4,
|
|
58
|
+
Friday: 5,
|
|
59
|
+
Saturday: 6,
|
|
60
|
+
}
|
|
61
|
+
return (
|
|
62
|
+
// try to refactor with for loop
|
|
63
|
+
date.getDay() === weekdayObj[disableWeekdays[0]] ||
|
|
64
|
+
date.getDay() === weekdayObj[disableWeekdays[1]] ||
|
|
65
|
+
date.getDay() === weekdayObj[disableWeekdays[2]] ||
|
|
66
|
+
date.getDay() === weekdayObj[disableWeekdays[3]] ||
|
|
67
|
+
date.getDay() === weekdayObj[disableWeekdays[4]] ||
|
|
68
|
+
date.getDay() === weekdayObj[disableWeekdays[5]] ||
|
|
69
|
+
date.getDay() === weekdayObj[disableWeekdays[6]]
|
|
70
|
+
)
|
|
71
|
+
},
|
|
72
|
+
] : disabledParser(),
|
|
73
|
+
maxDate: maxDate,
|
|
74
|
+
minDate: minDate,
|
|
75
|
+
mode: mode,
|
|
76
|
+
static: true,
|
|
77
|
+
})
|
|
78
|
+
|
|
79
|
+
document.querySelector(`#${pickerId}`).addEventListener('input', (e) => {
|
|
80
|
+
const picker = document.querySelector(`#${pickerId}`)._flatpickr
|
|
81
|
+
picker.input.setAttribute('value', e.target.value)
|
|
82
|
+
const variant = picker.config.mode
|
|
83
|
+
if (variant === 'single' && e.target.value.split('').length === 10) {
|
|
84
|
+
picker.setDate(e.target.value)
|
|
85
|
+
} else if (variant === 'range' && e.target.value.split('').length === 24) {
|
|
86
|
+
picker.setDate(e.target.value)
|
|
87
|
+
}
|
|
88
|
+
})
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
export default datePickerHelper
|